Compare commits

..
Author SHA1 Message Date
Jim Miller 04eea97678 Change 'Help Test Version' to 'Use New Version'. 2011-12-14 13:34:49 -06:00
Jim Miller a643d9a87b Save 'Help Test New Version' version. 2011-11-15 17:33:55 -06:00
10 changed files with 102 additions and 78 deletions
+8 -17
View File
@@ -1,22 +1,20 @@
# ffd-retief-hrd fanfictiondownloader
application: fanfictiondownloader
version: 4-1-0
runtime: python27
# fanfictionloader ffd-retief
application: fanfictionloader
version: 4-0-7
runtime: python
api_version: 1
threadsafe: true
handlers:
- url: /r3m0v3r.*
script: utils.remover.app
script: utils/remover.py
login: admin
- url: /tally.*
script: utils.tally.app
script: utils/tally.py
login: admin
- url: /fdownloadtask
script: main.app
script: main.py
login: admin
- url: /css
@@ -33,14 +31,7 @@ handlers:
upload: static/favicon\.ico
- url: /.*
script: main.app
script: main.py
builtins:
- datastore_admin: on
libraries:
- name: django
version: "1.2"
- name: PIL
version: "1.1.7"
+3 -5
View File
@@ -3,8 +3,6 @@ cron:
url: /r3m0v3r
schedule: every 2 hours
# There's a bug in the Python 2.7 runtime that prevents this from
# working properly. In theory, there should never be orphans anyway.
#- description: orphan cleanup job
# url: /r3m0v3rOrphans
# schedule: every 4 hours
- description: orphan cleanup job
url: /r3m0v3rOrphans
schedule: every 4 hours
+1 -1
View File
@@ -216,7 +216,7 @@ def doMerge(outputio,files,authoropts=[],titleopt=None,descopt=None,
try:
outputepub.writestr(href,
epub.read(relpath+item.getAttribute("href")))
if re.match(r'.*/(file|chapter)\d+\.x?html',href):
if re.match(r'.*/(file|chapter)\d+\.xhtml',href):
filecount+=1
items.append((id,href,item.getAttribute("media-type")))
filelist.append(href)
+1 -1
View File
@@ -25,7 +25,7 @@ class Story:
try:
self.metadata = {'version':os.environ['CURRENT_VERSION_ID']}
except:
self.metadata = {'version':'4.1'}
self.metadata = {'version':'4.0'}
self.chapters = [] # chapters will be tuples of (title,html)
self.listables = {} # some items (extratags, category, warnings & genres) are also kept as lists.
+16 -12
View File
@@ -54,29 +54,33 @@
much easier. </p>
</div>
<!-- put announcements here, h3 is a good title size. -->
<h3>This is the Official Multithreading Version</h3>
<h3>Please Switch to <a href="http://fanfictiondownloader.appspot.com/">New Version</a></h3>
<p>
We have a new, more efficient, version of the system up now. Please start using the
<a href="http://fanfictiondownloader.appspot.com/">New
Version here</a>. If for some reason, the new version
doesn't work for you, please let us know on
the <a href="http://groups.google.com/group/fanfic-downloader">Fanfiction
Downloader Google Group</a>.
</p>
<h3>New Google Quotas</h3>
<p>
Google has changed their quota limits for free
applications using their AppEngine system, like this one.
We expect that there will be times when the
system exceeds it's permitted processing quota.
</p>
<p>
This version of the application uses Python 2.7 and
multithreading to try and reduce our usage. Google
considers Python 2.7 Experimental still, so there may be issues.
</p>
<p>
One issue that has already cropped up is an AppEngine/Python 2.7 bug with
fetching large results from datastore. For very large
stories (~>270k words), you'll need to use
the <a href="http://4-0-7.fanfictiondownloader.appspot.com">Previous
Version</a> until this bug is fixed.
You also have the option of running the downloader on your
own computer if you have Python available.
<a href="http://code.google.com/p/fanficdownloader/downloads/list">Download here.</a>
</p>
<p>
If you have any problems with this application, please
report them in
the <a href="http://groups.google.com/group/fanfic-downloader">Fanfiction
Downloader Google Group</a>. The
<a href="http://4-0-7.fanfictiondownloader.appspot.com">Previous
<a href="http://4-0-6.fanfictionloader.appspot.com">Previous
Version</a> is also available for you to use if necessary.
</p>
<div id='error'>
+28 -23
View File
@@ -41,24 +41,23 @@ import ConfigParser
## Console page first, you will get a django version mismatch error when you
## to go hit one of the application pages. Just change a file again, and
## make sure to hit an app page before the SDK page to clear it.
#os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
#from google.appengine.dist import use_library
#use_library('django', '1.2')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from google.appengine.dist import use_library
use_library('django', '1.2')
from google.appengine.ext import db
from google.appengine.api import taskqueue
from google.appengine.api import users
#from google.appengine.ext import webapp
import webapp2
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
#from google.appengine.ext.webapp2 import util
from google.appengine.ext.webapp import util
from google.appengine.runtime import DeadlineExceededError
from ffstorage import *
from fanficdownloader import adapters, writers, exceptions
class UserConfigServer(webapp2.RequestHandler):
class UserConfigServer(webapp.RequestHandler):
def getUserConfig(self,user):
config = ConfigParser.SafeConfigParser()
@@ -74,7 +73,7 @@ class UserConfigServer(webapp2.RequestHandler):
return config
class MainHandler(webapp2.RequestHandler):
class MainHandler(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
if user:
@@ -161,7 +160,7 @@ class EditConfigServer(UserConfigServer):
self.response.out.write(template.render(path, template_values))
class FileServer(webapp2.RequestHandler):
class FileServer(webapp.RequestHandler):
def get(self):
fileId = self.request.get('id')
@@ -222,7 +221,7 @@ class FileServer(webapp2.RequestHandler):
path = os.path.join(os.path.dirname(__file__), 'status.html')
self.response.out.write(template.render(path, template_values))
class FileStatusServer(webapp2.RequestHandler):
class FileStatusServer(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
if not user:
@@ -258,7 +257,7 @@ class FileStatusServer(webapp2.RequestHandler):
path = os.path.join(os.path.dirname(__file__), 'status.html')
self.response.out.write(template.render(path, template_values))
class ClearRecentServer(webapp2.RequestHandler):
class ClearRecentServer(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
if not user:
@@ -283,7 +282,7 @@ class ClearRecentServer(webapp2.RequestHandler):
logging.info('Deleted %d instances download.' % num)
self.redirect("/?error=recentcleared")
class RecentFilesServer(webapp2.RequestHandler):
class RecentFilesServer(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
if not user:
@@ -557,14 +556,20 @@ def urlEscape(data):
p = re.compile(r'([^\w])')
return p.sub(toPercentDecimal, data.encode("utf-8"))
logging.getLogger().setLevel(logging.DEBUG)
app = webapp2.WSGIApplication([('/', MainHandler),
('/fdowntask', FanfictionDownloaderTask),
('/fdown', FanfictionDownloader),
(r'/file.*', FileServer),
('/status', FileStatusServer),
('/recent', RecentFilesServer),
('/editconfig', EditConfigServer),
('/clearrecent', ClearRecentServer),
],
debug=False)
def main():
application = webapp.WSGIApplication([('/', MainHandler),
('/fdowntask', FanfictionDownloaderTask),
('/fdown', FanfictionDownloader),
(r'/file.*', FileServer),
('/status', FileStatusServer),
('/recent', RecentFilesServer),
('/editconfig', EditConfigServer),
('/clearrecent', ClearRecentServer),
],
debug=False)
util.run_wsgi_app(application)
if __name__ == '__main__':
logging.getLogger().setLevel(logging.DEBUG)
main()
+9
View File
@@ -43,6 +43,15 @@
<div id='greeting'>
<p>Hi, {{ nickname }}! These are the fanfics you've recently requested.</p>
<p><a href="/clearrecent">Clear your Recent Downloads List</a></p>
<h3>Please Switch to <a href="http://fanfictiondownloader.appspot.com/">New Version</a></h3>
<p>
We have a new, more efficient, version of the system up now. Please start using the
<a href="http://fanfictiondownloader.appspot.com/">New
Version here</a>. If for some reason, the new version
doesn't work for you, please let us know on
the <a href="http://groups.google.com/group/fanfic-downloader">Fanfiction
Downloader Google Group</a>.
</p>
</div>
</div>
+9
View File
@@ -66,6 +66,15 @@
</div>
{% endif %}
<p>See your personal list of <a href="/recent">previously downloaded fanfics</a>.</p>
<h3>Please Switch to <a href="http://fanfictiondownloader.appspot.com/">New Version</a></h3>
<p>
We have a new, more efficient, version of the system up now. Please start using the
<a href="http://fanfictiondownloader.appspot.com/">New
Version here</a>. If for some reason, the new version
doesn't work for you, please let us know on
the <a href="http://groups.google.com/group/fanfic-downloader">Fanfiction
Downloader Google Group</a>.
</p>
</div>
<div style='text-align: center'>
<img src="http://code.google.com/appengine/images/appengine-silver-120x30.gif"
+14 -11
View File
@@ -25,16 +25,15 @@ Copyright 2011 Fanficdownloader team
import datetime
import logging
#from google.appengine.ext.webapp import util
import webapp2
#from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext import webapp
from google.appengine.api import users
from google.appengine.api import taskqueue
from google.appengine.api import memcache
from ffstorage import *
class Remover(webapp2.RequestHandler):
class Remover(webapp.RequestHandler):
def get(self):
logging.debug("Starting r3m0v3r")
user = users.get_current_user()
@@ -57,10 +56,9 @@ class Remover(webapp2.RequestHandler):
logging.debug('Delete '+d.url)
logging.info('Deleted instances: %d' % num)
self.response.headers['Content-Type'] = 'text/html'
self.response.out.write('Deleted instances: %d<br>' % num)
class RemoveOrphanDataChunks(webapp2.RequestHandler):
class RemoveOrphanDataChunks(webapp.RequestHandler):
def get(self):
logging.debug("Starting RemoveOrphanDataChunks")
@@ -100,10 +98,15 @@ class RemoveOrphanDataChunks(webapp2.RequestHandler):
memcache.set('orphan_search_cursor',chunks.cursor())
logging.info('Deleted %d orphan chunks from %d total.' % (deleted,num))
self.response.headers['Content-Type'] = 'text/html'
self.response.out.write('Deleted %d orphan chunks from %d total.' % (deleted,num))
logging.getLogger().setLevel(logging.DEBUG)
app = webapp2.WSGIApplication([('/r3m0v3r', Remover),
('/r3m0v3rOrphans', RemoveOrphanDataChunks)],
debug=False)
def main():
application = webapp.WSGIApplication([('/r3m0v3r', Remover),
('/r3m0v3rOrphans', RemoveOrphanDataChunks)],
debug=False)
util.run_wsgi_app(application)
if __name__ == '__main__':
logging.getLogger().setLevel(logging.DEBUG)
main()
+13 -8
View File
@@ -18,16 +18,15 @@
import datetime
import logging
#from google.appengine.ext.webapp import util
import webapp2
#from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext import webapp
from google.appengine.api import users
from google.appengine.api import taskqueue
from google.appengine.api import memcache
from ffstorage import *
class Tally(webapp2.RequestHandler):
class Tally(webapp.RequestHandler):
def get(self):
logging.debug("Starting Tally")
user = users.get_current_user()
@@ -58,7 +57,13 @@ class Tally(webapp2.RequestHandler):
logging.info('Tallied %d fics.' % num)
self.response.out.write('<br/>Tallied %d fics.<br/>' % num)
logging.getLogger().setLevel(logging.DEBUG)
app = webapp2.WSGIApplication([('/tally', Tally),
],
debug=False)
def main():
application = webapp.WSGIApplication([('/tally', Tally),
],
debug=False)
util.run_wsgi_app(application)
if __name__ == '__main__':
logging.getLogger().setLevel(logging.DEBUG)
main()