From 615228a2acfe21e9dd24e3d51641d32dfe5f5b51 Mon Sep 17 00:00:00 2001 From: sigizmund Date: Fri, 18 Dec 2009 11:23:37 +0000 Subject: [PATCH] changed slightly to make it work with AppEngine --- __init__.py | 0 downaloder.py | 12 +++++++++--- ffnet.py | 21 ++++++++++++++++++--- output.py | 23 +++++++++++++++++------ 4 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 __init__.py diff --git a/__init__.py b/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/downaloder.py b/downaloder.py index 10dde292..8c520ce6 100644 --- a/downaloder.py +++ b/downaloder.py @@ -21,22 +21,28 @@ class FanficLoader: '''A controller class which handles the interaction between various specific downloaders and writers''' booksDirectory = "books" - def __init__(self, adapter, writerClass): + def __init__(self, adapter, writerClass, quiet = False, inmemory = False): self.adapter = adapter self.writerClass = writerClass + self.quiet = quiet + self.inmemory = inmemory def download(self): urls = self.adapter.extractIndividualUrls() - self.writer = self.writerClass(self.booksDirectory, self.adapter.getStoryName(), self.adapter.getAuthorName()) + self.writer = self.writerClass(self.booksDirectory, self.adapter.getStoryName(), self.adapter.getAuthorName(), inmemory=self.inmemory) i = 0 for u,n in urls: - print('Downloading chapter %d/%d' % (i, len(urls))) + if not self.quiet: + print('Downloading chapter %d/%d' % (i, len(urls))) i = i+1 text = self.adapter.getText(u) self.writer.writeChapter(n, text) self.writer.finalise() + + if self.inmemory: + return self.writer.output.getvalue() if __name__ == '__main__': diff --git a/ffnet.py b/ffnet.py index 5b252543..4af36792 100644 --- a/ffnet.py +++ b/ffnet.py @@ -26,6 +26,12 @@ except: # tough luck pass +try: + from google.appengine.api.urlfetch import fetch as googlefetch + appEngine = True +except: + appEngine = False + class FFNet(FanfictionSiteAdapter): def __init__(self, url): self.url = url @@ -47,7 +53,10 @@ class FFNet(FanfictionSiteAdapter): logging.debug('self.storyId=%s, chapter=%s' % (self.storyId, chapter)) - self.opener = u2.build_opener(u2.HTTPCookieProcessor()) + if not appEngine: + self.opener = u2.build_opener(u2.HTTPCookieProcessor()) + else: + self.opener = None logging.debug("Created FF.Net: url=%s" % (self.url)) @@ -60,8 +69,14 @@ class FFNet(FanfictionSiteAdapter): def performLogin(self, url = None): return True + def _fetchUrl(self, url): + if not appEngine: + return self.opener.open(url).read().decode('utf-8') + else: + return googlefetch(url).content + def extractIndividualUrls(self): - data = self.opener.open(self.url).read().decode('utf-8') + data = self._fetchUrl(self.url) urls = [] lines = data.split('\n') @@ -88,7 +103,7 @@ class FFNet(FanfictionSiteAdapter): return urls def getText(self, url): - data = self.opener.open(url).read().decode('utf-8') + data = self._fetchUrl(url) lines = data.split('\n') for l in lines: if l.find('') != -1: diff --git a/output.py b/output.py index 222618c9..039451f4 100644 --- a/output.py +++ b/output.py @@ -11,6 +11,7 @@ import string import base64 import os.path import zipfile +import StringIO import urllib as u import pprint as pp import urllib2 as u2 @@ -37,16 +38,22 @@ class FanficWriter: class HTMLWriter(FanficWriter): body = '' - def __init__(self, base, name, author): + def __init__(self, base, name, author, inmemory=False): self.basePath = base self.name = name.replace(" ", "_") self.storyTitle = name self.fileName = self.basePath + '/' + self.name + '.html' self.authorName = author - if os.path.exists(self.fileName): + self.inmemory = inmemory + + if not self.inmemory and os.path.exists(self.fileName): os.remove(self.fileName) + if self.inmemory: + self.output = StringIO.StringIO() + else: + self.output = open(self.fileName, 'w') self.xhtmlTemplate = string.Template(html_constants.XHTML_START) self.chapterStartTemplate = string.Template(html_constants.XHTML_CHAPTER_START) @@ -62,14 +69,18 @@ class HTMLWriter(FanficWriter): soup = bs.BeautifulSoup(html) result = soup.prettify() - f = open(self.fileName, 'w') - f.write(result) - f.close() +# f = open(self.fileName, 'w') +# f.write(result) +# f.close() + + self.output.write(result) + if not self.inmemory: + self.output.close() class EPubFanficWriter(FanficWriter): chapters = [] - def __init__(self, base, name, author): + def __init__(self, base, name, author, inmemory=False): self.basePath = base self.name = name.replace(" ", "_") self.storyTitle = name