Re-org file structure, make PI work with it, CLI & web service currently broken.

This commit is contained in:
Jim Miller 2015-04-05 17:10:31 -05:00
parent 3ded55208f
commit cd2c58a38a
267 changed files with 2891 additions and 7510 deletions

2
.gitignore vendored
View file

@ -17,3 +17,5 @@ cleanup.sh
FanFictionDownLoader.zip
*.epub
*Thumbs.db
FanFicFare.zip
output

View file

@ -12,7 +12,7 @@ if sys.version_info >= (2, 7):
import logging
logger = logging.getLogger(__name__)
loghandler=logging.StreamHandler()
loghandler.setFormatter(logging.Formatter("FFDL:%(levelname)s:%(filename)s(%(lineno)d):%(message)s"))
loghandler.setFormatter(logging.Formatter("FFF:%(levelname)s:%(filename)s(%(lineno)d):%(message)s"))
logger.addHandler(loghandler)
loghandler.setLevel(logging.DEBUG)
logger.setLevel(logging.DEBUG)
@ -28,7 +28,7 @@ from calibre.customize import InterfaceActionBase
## Apparently the name for this class doesn't matter--it was still
## 'demo' for the first few versions.
class FanFictionDownLoaderBase(InterfaceActionBase):
class FanFicFareBase(InterfaceActionBase):
'''
This class is a simple wrapper that provides information about the
actual plugin class. The actual interface plugin class is called
@ -38,7 +38,7 @@ class FanFictionDownLoaderBase(InterfaceActionBase):
The reason for having two classes is that it allows the command line
calibre utilities to run without needing to load the GUI libraries.
'''
name = 'FanFictionDownLoader'
name = 'FanFicFare'
description = _('UI plugin to download FanFiction stories from various sites.')
supported_platforms = ['windows', 'osx', 'linux']
author = 'Jim Miller'
@ -48,7 +48,7 @@ class FanFictionDownLoaderBase(InterfaceActionBase):
#: This field defines the GUI plugin class that contains all the code
#: that actually does something. Its format is module_path:class_name
#: The specified class must be defined in the specified module.
actual_plugin = 'calibre_plugins.fanfictiondownloader_plugin.ffdl_plugin:FanFictionDownLoaderPlugin'
actual_plugin = 'calibre_plugins.fanficfare_plugin.ffdl_plugin:FanFicFarePlugin'
def is_customizable(self):
'''
@ -79,7 +79,7 @@ class FanFictionDownLoaderBase(InterfaceActionBase):
# top of the module as importing the config class will also cause the
# GUI libraries to be loaded, which we do not want when using calibre
# from the command line
from calibre_plugins.fanfictiondownloader_plugin.config import ConfigWidget
from calibre_plugins.fanficfare_plugin.config import ConfigWidget
return ConfigWidget(self.actual_plugin_)
def save_settings(self, config_widget):
@ -107,8 +107,8 @@ class FanFictionDownLoaderBase(InterfaceActionBase):
# CLI--it would load everytime anyway.
from StringIO import StringIO
from calibre.library import db
from calibre_plugins.fanfictiondownloader_plugin.downloader import main as ffdl_main
from calibre_plugins.fanfictiondownloader_plugin.prefs import PrefsFacade
from calibre_plugins.fanficfare_plugin.downloader import main as ffdl_main
from calibre_plugins.fanficfare_plugin.prefs import PrefsFacade
from calibre.utils.config import prefs as calibre_prefs
from optparse import OptionParser

View file

@ -118,7 +118,7 @@ def create_menu_item(ia, parent_menu, menu_text, image=None, tooltip=None,
if len(shortcut) == 0:
shortcut = ()
else:
shortcut = _(shortcut)
shortcut = shortcut
ac = ia.create_action(spec=(menu_text, None, tooltip, shortcut),
attr=menu_text)
if image:
@ -155,7 +155,7 @@ def create_menu_action_unique(ia, parent_menu, menu_text, image=None, tooltip=No
if len(shortcut) == 0:
shortcut = None
else:
shortcut = _(shortcut)
shortcut = shortcut
if shortcut_name is None:
shortcut_name = menu_text.replace('&','')
@ -393,9 +393,9 @@ class KeyboardConfigDialog(SizePersistedDialog):
This dialog is used to allow editing of keyboard shortcuts.
'''
def __init__(self, gui, group_name):
SizePersistedDialog.__init__(self, gui, 'Keyboard shortcut dialog')
SizePersistedDialog.__init__(self, gui, 'FanFicFare plugin:Keyboard shortcut dialog')
self.gui = gui
self.setWindowTitle('Keyboard shortcuts')
self.setWindowTitle(_('Keyboard shortcuts'))
layout = QVBoxLayout(self)
self.setLayout(layout)
@ -461,8 +461,8 @@ class DateDelegate(QStyledItemDelegate):
class PrefsViewerDialog(SizePersistedDialog):
def __init__(self, gui, namespace):
SizePersistedDialog.__init__(self, gui, 'Prefs Viewer dialog')
self.setWindowTitle('Preferences for: '+namespace)
SizePersistedDialog.__init__(self, gui, _('Prefs Viewer dialog'))
self.setWindowTitle(_('Preferences for: ')+namespace)
self.gui = gui
self.db = gui.current_db
@ -494,9 +494,9 @@ class PrefsViewerDialog(SizePersistedDialog):
button_box = QDialogButtonBox(QDialogButtonBox.Ok)
button_box.accepted.connect(self.accept)
self.clear_button = button_box.addButton('Clear', QDialogButtonBox.ResetRole)
self.clear_button = button_box.addButton(_('Clear'), QDialogButtonBox.ResetRole)
self.clear_button.setIcon(get_icon('trash.png'))
self.clear_button.setToolTip('Clear all settings for this plugin')
self.clear_button.setToolTip(_('Clear all settings for this plugin'))
self.clear_button.clicked.connect(self._clear_settings)
layout.addWidget(button_box)
@ -523,10 +523,9 @@ class PrefsViewerDialog(SizePersistedDialog):
def _clear_settings(self):
from calibre.gui2.dialogs.confirm_delete import confirm
message = '<p>Are you sure you want to clear your settings in this library for this plugin?</p>' \
'<p>Any settings in other libraries or stored in a JSON file in your calibre plugins ' \
'folder will not be touched.</p>' \
'<p>You must restart calibre afterwards.</p>'
message = '<p>' + _('Are you sure you want to clear your settings in this library for this plugin?') + '</p>' \
+ '<p>' + _('Any settings in other libraries or stored in a JSON file in your calibre plugins folder will not be touched.') + '</p>' \
+ '<p>' + _('You must restart calibre afterwards.') + '</p>'
if not confirm(message, self.namespace+'_clear_settings', self):
return
ns_prefix = self._get_ns_prefix()
@ -535,8 +534,8 @@ class PrefsViewerDialog(SizePersistedDialog):
del self.db.prefs[k]
self._populate_settings()
d = info_dialog(self, 'Settings deleted',
'<p>All settings for this plugin in this library have been cleared.</p>'
'<p>Please restart calibre now.</p>',
'<p>' + _('All settings for this plugin in this library have been cleared.') + '</p>' \
+ '<p>' + _('Please restart calibre now.') + '</p>',
show_copy_button=False)
b = d.bb.addButton(_('Restart calibre now'), d.bb.AcceptRole)
b.setIcon(QIcon(I('lt.png')))

View file

@ -70,18 +70,18 @@ no_trans = { 'pini':'personal.ini',
'p':'password',
}
from calibre_plugins.fanfictiondownloader_plugin.prefs import prefs, PREFS_NAMESPACE
from calibre_plugins.fanfictiondownloader_plugin.dialogs \
from calibre_plugins.fanficfare_plugin.prefs import prefs, PREFS_NAMESPACE
from calibre_plugins.fanficfare_plugin.dialogs \
import (UPDATE, UPDATEALWAYS, collision_order, save_collisions, RejectListDialog,
EditTextDialog, IniTextDialog, RejectUrlEntry)
from calibre_plugins.fanfictiondownloader_plugin.fanficdownloader.adapters \
from calibre_plugins.fanficfare_plugin.fff_internals.adapters \
import getConfigSections
from calibre_plugins.fanfictiondownloader_plugin.common_utils \
from calibre_plugins.fanficfare_plugin.common_utils \
import ( KeyboardConfigDialog, PrefsViewerDialog )
from calibre_plugins.fanfictiondownloader_plugin.ffdl_util \
from calibre_plugins.fanficfare_plugin.ffdl_util \
import (test_config)
from calibre.gui2.complete2 import EditWithComplete #MultiCompleteLineEdit
@ -358,7 +358,7 @@ class BasicTab(QWidget):
self.l = QVBoxLayout()
groupbox.setLayout(self.l)
tooltip = _("On each download, FFDL offers an option to select the output format. <br />This sets what that option will default to.")
tooltip = _("On each download, FFF offers an option to select the output format. <br />This sets what that option will default to.")
horz = QHBoxLayout()
label = QLabel(_('Default Output &Format:'))
label.setToolTip(tooltip)
@ -375,7 +375,7 @@ class BasicTab(QWidget):
horz.addWidget(self.fileform)
self.l.addLayout(horz)
tooltip = _("On each download, FFDL offers an option of what happens if that story already exists. <br />This sets what that option will default to.")
tooltip = _("On each download, FFF offers an option of what happens if that story already exists. <br />This sets what that option will default to.")
horz = QHBoxLayout()
label = QLabel(_('Default If Story Already Exists?'))
label.setToolTip(tooltip)
@ -392,12 +392,12 @@ class BasicTab(QWidget):
self.l.addLayout(horz)
self.updatemeta = QCheckBox(_('Default Update Calibre &Metadata?'),self)
self.updatemeta.setToolTip(_("On each download, FFDL offers an option to update Calibre's metadata (title, author, URL, tags, custom columns, etc) from the web site. <br />This sets whether that will default to on or off. <br />Columns set to 'New Only' in the column tabs will only be set for new books."))
self.updatemeta.setToolTip(_("On each download, FFF offers an option to update Calibre's metadata (title, author, URL, tags, custom columns, etc) from the web site. <br />This sets whether that will default to on or off. <br />Columns set to 'New Only' in the column tabs will only be set for new books."))
self.updatemeta.setChecked(prefs['updatemeta'])
self.l.addWidget(self.updatemeta)
self.updateepubcover = QCheckBox(_('Default Update EPUB Cover when Updating EPUB?'),self)
self.updateepubcover.setToolTip(_("On each download, FFDL offers an option to update the book cover image <i>inside</i> the EPUB from the web site when the EPUB is updated.<br />This sets whether that will default to on or off."))
self.updateepubcover.setToolTip(_("On each download, FFF offers an option to update the book cover image <i>inside</i> the EPUB from the web site when the EPUB is updated.<br />This sets whether that will default to on or off."))
self.updateepubcover.setChecked(prefs['updateepubcover'])
self.l.addWidget(self.updateepubcover)
@ -501,7 +501,7 @@ class BasicTab(QWidget):
self.l.addWidget(self.includeimages)
self.injectseries = QCheckBox(_("Inject calibre Series when none found?"),self)
self.injectseries.setToolTip(_("If no series is found, inject the calibre series (if there is one) so it appears on the FFDL title page(not cover)."))
self.injectseries.setToolTip(_("If no series is found, inject the calibre series (if there is one) so it appears on the FFF title page(not cover)."))
self.injectseries.setChecked(prefs['injectseries'])
self.l.addWidget(self.injectseries)
@ -510,7 +510,7 @@ class BasicTab(QWidget):
groupbox.setLayout(self.l)
self.rejectlist = QPushButton(_('Edit Reject URL List'), self)
self.rejectlist.setToolTip(_("Edit list of URLs FFDL will automatically Reject."))
self.rejectlist.setToolTip(_("Edit list of URLs FFF will automatically Reject."))
self.rejectlist.clicked.connect(self.show_rejectlist)
self.l.addWidget(self.rejectlist)
@ -610,7 +610,7 @@ class PersonalIniTab(QWidget):
self.l.addWidget(label)
# self.l.addSpacing(5)
label = QLabel(_("<b>New:</b>")+" "+_("FFDL now includes find, color coding, and error checking for personal.ini editing. Red generally indicates errors."))
label = QLabel(_("<b>New:</b>")+" "+_("FFF now includes find, color coding, and error checking for personal.ini editing. Red generally indicates errors."))
label.setWordWrap(True)
self.l.addWidget(label)
@ -639,7 +639,7 @@ class PersonalIniTab(QWidget):
self.defaults.clicked.connect(self.show_defaults)
self.l.addWidget(self.defaults)
label = QLabel(_("Changes will only be saved if you click 'OK' to leave Customize FFDL."))
label = QLabel(_("Changes will only be saved if you click 'OK' to leave Customize FFF."))
label.setWordWrap(True)
self.l.addWidget(label)
@ -744,7 +744,7 @@ class GenerateCoverTab(QWidget):
except KeyError:
gc_settings= []
label = QLabel(_('The %(gc)s plugin can create cover images for books using various metadata and configurations. If you have GC installed, FFDL can run GC on new downloads and metadata updates. Pick a GC setting by site or Default.')%no_trans)
label = QLabel(_('The %(gc)s plugin can create cover images for books using various metadata and configurations. If you have GC installed, FFF can run GC on new downloads and metadata updates. Pick a GC setting by site or Default.')%no_trans)
label.setWordWrap(True)
self.l.addWidget(label)
self.l.addSpacing(5)
@ -839,12 +839,12 @@ class CountPagesTab(QWidget):
horz = QHBoxLayout()
self.wordcount = QCheckBox('Word Count',self)
self.wordcount.setToolTip(tooltip+"\n"+_('Will overwrite word count from FFDL metadata if set to update the same custom column.'))
self.wordcount.setToolTip(tooltip+"\n"+_('Will overwrite word count from FFF metadata if set to update the same custom column.'))
self.wordcount.setChecked('WordCount' in prefs['countpagesstats'])
horz.addWidget(self.wordcount)
self.wordcountmissing = QCheckBox('Only if Word Count is Missing in FFDL Metadata',self)
self.wordcountmissing.setToolTip(_("Only run Count Page's Word Count if checked <i>and</i> FFDL metadata doesn't already have a word count. If this is used with one of the other Page Counts, the Page Count plugin will be called twice."))
self.wordcountmissing = QCheckBox('Only if Word Count is Missing in FFF Metadata',self)
self.wordcountmissing.setToolTip(_("Only run Count Page's Word Count if checked <i>and</i> FFF metadata doesn't already have a word count. If this is used with one of the other Page Counts, the Page Count plugin will be called twice."))
self.wordcountmissing.setChecked(prefs['wordcountmissing'])
self.wordcountmissing.setEnabled(self.wordcount.isChecked())
horz.addWidget(self.wordcountmissing)
@ -984,7 +984,7 @@ titleLabels = {
'formatname':_('File Format'),
'formatext':_('File Extension'),
'siteabbrev':_('Site Abbrev'),
'version':_('FFDL Version')
'version':_('FFF Version')
}
class CustomColumnsTab(QWidget):
@ -1102,7 +1102,7 @@ class StandardColumnsTab(QWidget):
self.l = QVBoxLayout()
self.setLayout(self.l)
label = QLabel(_("The standard calibre metadata columns are listed below. You may choose whether FFDL will fill each column automatically on updates or only for new books."))
label = QLabel(_("The standard calibre metadata columns are listed below. You may choose whether FFF will fill each column automatically on updates or only for new books."))
label.setWordWrap(True)
self.l.addWidget(label)
self.l.addSpacing(5)
@ -1137,7 +1137,7 @@ class ImapTab(QWidget):
self.setLayout(self.l)
row=0
label = QLabel(_('These settings will allow FFDL to fetch story URLs from your email account. It will only look for story URLs in unread emails in the folder specified below.'))
label = QLabel(_('These settings will allow FFF to fetch story URLs from your email account. It will only look for story URLs in unread emails in the folder specified below.'))
label.setWordWrap(True)
self.l.addWidget(label,row,0,1,-1)
row+=1
@ -1163,7 +1163,7 @@ class ImapTab(QWidget):
row+=1
label = QLabel(_('IMAP User Password'))
tooltip = _("IMAP password. If left empty, FFDL will ask you for your password when you use the feature.")
tooltip = _("IMAP password. If left empty, FFF will ask you for your password when you use the feature.")
label.setToolTip(tooltip)
self.l.addWidget(label,row,0)
self.imappass = QLineEdit(self)
@ -1174,7 +1174,7 @@ class ImapTab(QWidget):
row+=1
self.imapsessionpass = QCheckBox(_('Remember Password for Session (when not saved above)'),self)
self.imapsessionpass.setToolTip(_('If checked, and no password is entered above, FFDL will remember your password until you close calibre or change Libraries.'))
self.imapsessionpass.setToolTip(_('If checked, and no password is entered above, FFF will remember your password until you close calibre or change Libraries.'))
self.imapsessionpass.setChecked(prefs['imapsessionpass'])
self.l.addWidget(self.imapsessionpass,row,0,1,-1)
row+=1
@ -1196,7 +1196,7 @@ class ImapTab(QWidget):
row+=1
label = QLabel(_("<b>It's safest if you create a separate email account that you use only "
"for your story update notices. FFDL and calibre cannot guarantee that "
"for your story update notices. FFF and calibre cannot guarantee that "
"malicious code cannot get your email password once you've entered it. "
"<br>Use this feature at your own risk. </b>"))
label.setWordWrap(True)

View file

@ -60,14 +60,14 @@ try:
except NameError:
pass # load_translations() added in calibre 1.9
from calibre_plugins.fanfictiondownloader_plugin.common_utils \
from calibre_plugins.fanficfare_plugin.common_utils \
import (ReadOnlyTableWidgetItem, ReadOnlyTextIconWidgetItem, SizePersistedDialog,
ImageTitleLayout, get_icon)
from calibre_plugins.fanfictiondownloader_plugin.fanficdownloader.geturls import get_urls_from_html, get_urls_from_text
from calibre_plugins.fanfictiondownloader_plugin.fanficdownloader.adapters import getNormalStoryURL
from calibre_plugins.fanficfare_plugin.fff_internals.geturls import get_urls_from_html, get_urls_from_text
from calibre_plugins.fanficfare_plugin.fff_internals.adapters import getNormalStoryURL
from calibre_plugins.fanfictiondownloader_plugin.fanficdownloader.configurable \
from calibre_plugins.fanficfare_plugin.fff_internals.configurable \
import (get_valid_sections, get_valid_entries,
get_valid_keywords, get_valid_entry_keywords)
@ -243,7 +243,7 @@ class AddNewDialog(SizePersistedDialog):
self.l = QVBoxLayout()
self.setLayout(self.l)
self.setWindowTitle(_('FanFictionDownLoader'))
self.setWindowTitle('FanFicFare')
self.setWindowIcon(icon)
self.toplabel=QLabel("Toplabel")
@ -588,7 +588,7 @@ class LoopProgressDialog(QProgressDialog):
self.start_time = datetime.now()
# can't import at file load.
from calibre_plugins.fanfictiondownloader_plugin.prefs import prefs
from calibre_plugins.fanficfare_plugin.prefs import prefs
self.show_est_time = prefs['show_est_time']
## self.do_loop does QTimer.singleShot on self.do_loop also.
@ -686,7 +686,7 @@ class AboutDialog(QDialog):
self.label = QLabel(text)
self.label.setOpenExternalLinks(True)
self.label.setWordWrap(True)
self.setWindowTitle(_('About FanFictionDownLoader'))
self.setWindowTitle(_('About FanFicFare'))
self.setWindowIcon(icon)
self.l.addWidget(self.logo, 0, 0)
self.l.addWidget(self.label, 0, 1)
@ -1026,7 +1026,7 @@ class RejectListDialog(SizePersistedDialog):
layout = QVBoxLayout(self)
self.setLayout(layout)
title_layout = ImageTitleLayout(self, icon, header,
'<i></i>'+_('FFDL will remember these URLs and display the note and offer to reject them if you try to download them again later.'))
'<i></i>'+_('FFF will remember these URLs and display the note and offer to reject them if you try to download them again later.'))
layout.addLayout(title_layout)
rejects_layout = QHBoxLayout()
layout.addLayout(rejects_layout)

View file

@ -48,17 +48,17 @@ try:
except NameError:
pass # load_translations() added in calibre 1.9
from calibre_plugins.fanfictiondownloader_plugin.common_utils import (set_plugin_icon_resources, get_icon,
create_menu_action_unique, get_library_uuid)
from calibre_plugins.fanficfare_plugin.common_utils import (set_plugin_icon_resources, get_icon,
create_menu_action_unique, get_library_uuid)
from calibre_plugins.fanfictiondownloader_plugin.fanficdownloader import adapters, exceptions
from calibre_plugins.fanfictiondownloader_plugin.fanficdownloader.epubutils import get_dcsource, get_dcsource_chaptercount, get_story_url_from_html
from calibre_plugins.fanfictiondownloader_plugin.fanficdownloader.geturls import get_urls_from_page, get_urls_from_html, get_urls_from_text, get_urls_from_imap
from calibre_plugins.fanficfare_plugin.fff_internals import adapters, exceptions
from calibre_plugins.fanficfare_plugin.fff_internals.epubutils import get_dcsource, get_dcsource_chaptercount, get_story_url_from_html
from calibre_plugins.fanficfare_plugin.fff_internals.geturls import get_urls_from_page, get_urls_from_html, get_urls_from_text, get_urls_from_imap
from calibre_plugins.fanfictiondownloader_plugin.ffdl_util import (get_ffdl_adapter, get_ffdl_config, get_ffdl_personalini)
from calibre_plugins.fanfictiondownloader_plugin.config import (permitted_values, rejecturllist)
from calibre_plugins.fanfictiondownloader_plugin.prefs import prefs
from calibre_plugins.fanfictiondownloader_plugin.dialogs import (
from calibre_plugins.fanficfare_plugin.ffdl_util import (get_ffdl_adapter, get_ffdl_config, get_ffdl_personalini)
from calibre_plugins.fanficfare_plugin.config import (permitted_values, rejecturllist)
from calibre_plugins.fanficfare_plugin.prefs import prefs
from calibre_plugins.fanficfare_plugin.dialogs import (
AddNewDialog, UpdateExistingDialog,
LoopProgressDialog, UserPassDialog, AboutDialog, CollectURLDialog, RejectListDialog, EmailPassDialog,
OVERWRITE, OVERWRITEALWAYS, UPDATE, UPDATEALWAYS, ADDNEW, SKIP, CALIBREONLY,
@ -76,9 +76,9 @@ formmapping = {
PLUGIN_ICONS = ['images/icon.png']
class FanFictionDownLoaderPlugin(InterfaceAction):
class FanFicFarePlugin(InterfaceAction):
name = 'FanFictionDownLoader'
name = 'FanFicFare'
# Declare the main action associated with this plugin
# The keyboard shortcut can be None if you dont want to use a keyboard
@ -86,7 +86,7 @@ class FanFictionDownLoaderPlugin(InterfaceAction):
# keyboard shortcuts, so try to use an unusual/unused shortcut.
# (text, icon_path, tooltip, keyboard shortcut)
# icon_path isn't in the zip--icon loaded below.
action_spec = (_('FanFictionDownLoader'), None,
action_spec = (_('FanFicFare'), None,
_('Download FanFiction stories from various web sites'), ())
# None for keyboard shortcut doesn't allow shortcut. () does, there just isn't one yet
@ -117,7 +117,7 @@ class FanFictionDownLoaderPlugin(InterfaceAction):
# are not found in the zip file will result in null QIcons.
icon = get_icon('images/icon.png')
self.qaction.setText(_('FanFictionDL'))
self.qaction.setText(_('FanFicFare'))
# The qaction is automatically created from the action_spec defined
# above
@ -237,7 +237,7 @@ class FanFictionDownLoaderPlugin(InterfaceAction):
def rebuild_menus(self):
with self.menus_lock:
#self.qaction.setText("FFDL")
#self.qaction.setText("FFF")
do_user_config = self.interface_action_base_plugin.do_user_config
self.menu.clear()
@ -332,17 +332,18 @@ class FanFictionDownLoaderPlugin(InterfaceAction):
self.menu.addSeparator()
self.config_action = self.create_menu_item_ex(self.menu, _('&Configure Plugin'),
image= 'config.png',
unique_name='Configure FanFictionDownLoader',
shortcut_name=_('Configure FanFictionDownLoader'),
unique_name='Configure FanFicFare',
shortcut_name=_('Configure FanFicFare'),
triggered=partial(do_user_config,parent=self.gui))
self.about_action = self.create_menu_item_ex(self.menu, _('About Plugin'),
image= 'images/icon.png',
unique_name='About FanFictionDownLoader',
shortcut_name=_('About FanFictionDownLoader'),
unique_name='About FanFicFare',
shortcut_name=_('About FanFicFare'),
triggered=self.about)
self.gui.keyboard.finalize()
def about(self):
# Get the about text from a file inside the plugin zip file
@ -399,7 +400,7 @@ class FanFictionDownLoaderPlugin(InterfaceAction):
def get_urls_from_imap_menu(self):
if not prefs['imapserver'] or not prefs['imapuser'] or not prefs['imapfolder']:
s=_('FFDL Email Settings are not configured.')
s=_('FFF Email Settings are not configured.')
info_dialog(self.gui, s, s, show=True, show_copy_button=False)
return
@ -569,7 +570,7 @@ class FanFictionDownLoaderPlugin(InterfaceAction):
self.gui.iactions['Remove Books'].do_library_delete(d.get_reject_list_ids())
else:
message="<p>"+_("Rejecting FFDL URLs: None of the books selected have FanFiction URLs.")+"</p><p>"+_("Proceed to Remove?")+"</p>"
message="<p>"+_("Rejecting FFF URLs: None of the books selected have FanFiction URLs.")+"</p><p>"+_("Proceed to Remove?")+"</p>"
if confirm(message,'fanfictiondownloader_reject_non_fanfiction', self.gui):
self.gui.iactions['Remove Books'].delete_books()
@ -627,7 +628,7 @@ class FanFictionDownLoaderPlugin(InterfaceAction):
if not filenames or len(filenames) != len (url_list):
info_dialog(self.gui, _("Cannot Update Anthology"),
"<p>"+_("Cannot Update Anthology")+"</p><p>"+_("Book isn't an FFDL Anthology or contains book(s) without valid FFDL URLs."),
"<p>"+_("Cannot Update Anthology")+"</p><p>"+_("Book isn't an FFF Anthology or contains book(s) without valid FFF URLs."),
show=True,
show_copy_button=False)
remove_dir(tdir)
@ -1100,7 +1101,7 @@ class FanFictionDownLoaderPlugin(InterfaceAction):
elif chaptercount > urlchaptercount:
raise NotGoingToDownload(_("Existing epub contains %d chapters, web site only has %d. Use Overwrite to force update.") % (chaptercount,urlchaptercount),'dialog_error.png')
elif chaptercount == 0:
raise NotGoingToDownload(_("FFDL doesn't recognize chapters in existing epub, epub is probably from a different source. Use Overwrite to force update."),'dialog_error.png')
raise NotGoingToDownload(_("FFF doesn't recognize chapters in existing epub, epub is probably from a different source. Use Overwrite to force update."),'dialog_error.png')
if collision == OVERWRITE and \
db.has_format(book_id,formmapping[fileform],index_is_id=True):
@ -1209,7 +1210,7 @@ class FanFictionDownLoaderPlugin(InterfaceAction):
payload = ([], book_list, options)
self.gui.proceed_question(self.update_error_column,
payload, htmllog,
_('FFDL log'), _('FFDL download ended'), msg,
_('FFF log'), _('FFF download ended'), msg,
show_copy_button=False)
return
@ -1227,7 +1228,7 @@ class FanFictionDownLoaderPlugin(InterfaceAction):
func = 'arbitrary_n'
cpus = self.gui.job_manager.server.pool_size
args = ['calibre_plugins.fanfictiondownloader_plugin.jobs', 'do_download_worker',
args = ['calibre_plugins.fanficfare_plugin.jobs', 'do_download_worker',
(book_list, options, cpus)]
desc = _('Download FanFiction Book')
job = self.gui.job_manager.run_job(
@ -1270,7 +1271,7 @@ class FanFictionDownLoaderPlugin(InterfaceAction):
logger.error("Error Updating Metadata:\n%s"%det_msg)
error_dialog(self.gui,
_("Error Updating Metadata"),
"<p>"+_("An error has occurred while FFDL was updating calibre's metadata for <a href='%s'>%s</a>.")%(book['url'],book['title'])+"</p>"+
"<p>"+_("An error has occurred while FFF was updating calibre's metadata for <a href='%s'>%s</a>.")%(book['url'],book['title'])+"</p>"+
_("The ebook has been updated, but the metadata has not."),
det_msg=det_msg,
show=True)
@ -1380,7 +1381,7 @@ class FanFictionDownLoaderPlugin(InterfaceAction):
show_copy_button=False)
return
msg = '<p>'+_('FFDL found <b>%s</b> good and <b>%s</b> bad updates.')%(len(good_list),len(bad_list))+'</p>'
msg = '<p>'+_('FFF found <b>%s</b> good and <b>%s</b> bad updates.')%(len(good_list),len(bad_list))+'</p>'
if len(bad_list) > 0:
msg = msg + '''
<p>%s</p>
@ -1419,7 +1420,7 @@ class FanFictionDownLoaderPlugin(InterfaceAction):
<p>%s</p>
<p>%s</p>
<p>%s</p>'''%(
_('FFDL found <b>%s</b> good and <b>%s</b> bad updates.')%(len(good_list),len(bad_list)),
_('FFF found <b>%s</b> good and <b>%s</b> bad updates.')%(len(good_list),len(bad_list)),
_('See log for details.'),
_('Proceed with updating your library?')
)
@ -1445,7 +1446,7 @@ class FanFictionDownLoaderPlugin(InterfaceAction):
self.gui.proceed_question(do_update_func,
payload, htmllog,
_('FFDL log'), _('FFDL download complete'), msg,
_('FFF log'), _('FFF download complete'), msg,
show_copy_button=False)
def do_download_merge_update(self, payload):
@ -1498,7 +1499,7 @@ class FanFictionDownLoaderPlugin(InterfaceAction):
good_list = sorted(good_list,key=lambda x : x['listorder'])
bad_list = sorted(bad_list,key=lambda x : x['listorder'])
self.gui.status_bar.show_message(_('FFDL Adding/Updating books.'))
self.gui.status_bar.show_message(_('FFF Adding/Updating books.'))
if good_list or prefs['mark'] or (bad_list and prefs['errorcol'] != '' and prefs['errorcol'] in self.gui.library_view.model().custom_columns):
LoopProgressDialog(self.gui,
@ -1839,7 +1840,7 @@ class FanFictionDownLoaderPlugin(InterfaceAction):
rl_plugin = self.gui.iactions['Reading List']
except:
if prefs['addtolists'] or prefs['addtoreadlists']:
message="<p>"+_("You configured FanFictionDownLoader to automatically update Reading Lists, but you don't have the %s plugin installed anymore?")%'Reading List'+"</p>"
message="<p>"+_("You configured FanFicFare to automatically update Reading Lists, but you don't have the %s plugin installed anymore?")%'Reading List'+"</p>"
confirm(message,'fanfictiondownloader_no_reading_list_plugin', self.gui)
return
@ -1851,7 +1852,7 @@ class FanFictionDownLoaderPlugin(InterfaceAction):
lists = self.get_clean_reading_lists(prefs['read_lists'])
if len(lists) < 1 :
message="<p>"+_("You configured FanFictionDownLoader to automatically update \"To Read\" Reading Lists, but you don't have any lists set?")+"</p>"
message="<p>"+_("You configured FanFicFare to automatically update \"To Read\" Reading Lists, but you don't have any lists set?")+"</p>"
confirm(message,'fanfictiondownloader_no_read_lists', self.gui)
for l in lists:
if l in rl_plugin.get_list_names():
@ -1861,13 +1862,13 @@ class FanFictionDownLoaderPlugin(InterfaceAction):
display_warnings=False)
else:
if l != '':
message="<p>"+_("You configured FanFictionDownLoader to automatically update Reading List '%s', but you don't have a list of that name?")%l+"</p>"
message="<p>"+_("You configured FanFicFare to automatically update Reading List '%s', but you don't have a list of that name?")%l+"</p>"
confirm(message,'fanfictiondownloader_no_reading_list_%s'%l, self.gui)
if prefs['addtolists'] and (add or (prefs['addtolistsonread'] and prefs['addtoreadlists']) ):
lists = self.get_clean_reading_lists(prefs['send_lists'])
if len(lists) < 1 :
message="<p>"+_("You configured FanFictionDownLoader to automatically update \"Send to Device\" Reading Lists, but you don't have any lists set?")+"</p>"
message="<p>"+_("You configured FanFicFare to automatically update \"Send to Device\" Reading Lists, but you don't have any lists set?")+"</p>"
confirm(message,'fanfictiondownloader_no_send_lists', self.gui)
for l in lists:
@ -1879,7 +1880,7 @@ class FanFictionDownLoaderPlugin(InterfaceAction):
display_warnings=False)
else:
if l != '':
message="<p>"+_("You configured FanFictionDownLoader to automatically update Reading List '%s', but you don't have a list of that name?")%l+"</p>"
message="<p>"+_("You configured FanFicFare to automatically update Reading List '%s', but you don't have a list of that name?")%l+"</p>"
confirm(message,'fanfictiondownloader_no_reading_list_%s'%l, self.gui)
def make_mi_from_book(self,book):

View file

@ -13,9 +13,9 @@ from ConfigParser import ParsingError
import logging
logger = logging.getLogger(__name__)
from calibre_plugins.fanfictiondownloader_plugin.fanficdownloader import adapters, exceptions
from calibre_plugins.fanfictiondownloader_plugin.fanficdownloader.configurable import Configuration
from calibre_plugins.fanfictiondownloader_plugin.prefs import prefs
from calibre_plugins.fanficfare_plugin.fff_internals import adapters, exceptions
from calibre_plugins.fanficfare_plugin.fff_internals.configurable import Configuration
from calibre_plugins.fanficfare_plugin.prefs import prefs
def get_ffdl_personalini():
if prefs['includeimages']:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View file

@ -42,7 +42,7 @@ def do_download_worker(book_list, options,
logger.info("%s"%book['url'])
if book['good']:
total += 1
args = ['calibre_plugins.fanfictiondownloader_plugin.jobs',
args = ['calibre_plugins.fanficfare_plugin.jobs',
'do_download_for_worker',
(book,options)]
job = ParallelJob('arbitrary_n',
@ -95,16 +95,16 @@ def do_download_for_worker(book,options,notification=lambda x,y:x):
Child job, to download story when run as a worker job
'''
from calibre_plugins.fanfictiondownloader_plugin import FanFictionDownLoaderBase
ffdlbase = FanFictionDownLoaderBase(options['plugin_path'])
from calibre_plugins.fanficfare_plugin import FanFicFareBase
ffdlbase = FanFicFareBase(options['plugin_path'])
with ffdlbase:
from calibre_plugins.fanfictiondownloader_plugin.dialogs import (NotGoingToDownload,
from calibre_plugins.fanficfare_plugin.dialogs import (NotGoingToDownload,
OVERWRITE, OVERWRITEALWAYS, UPDATE, UPDATEALWAYS, ADDNEW, SKIP, CALIBREONLY)
from calibre_plugins.fanfictiondownloader_plugin.fanficdownloader import adapters, writers, exceptions
from calibre_plugins.fanfictiondownloader_plugin.fanficdownloader.epubutils import get_update_data
from calibre_plugins.fanficfare_plugin.fff_internals import adapters, writers, exceptions
from calibre_plugins.fanficfare_plugin.fff_internals.epubutils import get_update_data
from calibre_plugins.fanfictiondownloader_plugin.ffdl_util import (get_ffdl_adapter, get_ffdl_config)
from calibre_plugins.fanficfare_plugin.ffdl_util import (get_ffdl_adapter, get_ffdl_config)
try:
book['comment'] = _('Download started...')

File diff suppressed because it is too large Load diff

View file

@ -1,122 +1,122 @@
## This is an example of what your personal configuration might look
## like. Uncomment options by removing the '#' in front of them.
[defaults]
## [defaults] section applies to all formats and sites but may be
## overridden at several levels. Example:
## [defaults]
## titlepage_entries: category,genre, status
## [www.whofic.com]
## # overrides defaults.
## titlepage_entries: category,genre, status,dateUpdated,rating
## [epub]
## # overrides defaults & site section
## titlepage_entries: category,genre, status,datePublished,dateUpdated,dateCreated
## [www.whofic.com:epub]
## # overrides defaults, site section & format section
## titlepage_entries: category,genre, status,datePublished
## [overrides]
## # overrides all other sections
## titlepage_entries: category
## Some sites also require the user to confirm they are adult for
## adult content. Uncomment by removing '#' in front of is_adult.
#is_adult:true
## Don't like the numbers at the start of chapter titles on some
## sites? You can use strip_chapter_numbers to strip them off. Just
## want to make them all look the same? Strip them off, then add them
## back on with add_chapter_numbers. Don't like the way it strips
## numbers or adds them back? See chapter_title_strip_pattern and
## chapter_title_add_pattern.
#strip_chapter_numbers:true
#add_chapter_numbers:true
## Add this to genre if there's more than one category.
#add_genre_when_multi_category: Crossover
[epub]
## include images from img tags in the body and summary of stories.
## Images will be converted to jpg for size if possible. Images work
## in epub format only. To get mobi or other format with images,
## download as epub and use Calibre to convert.
#include_images:true
## If not set, the summary will have all html stripped for safety.
## Both this and include_images must be true to get images in the
## summary.
#keep_summary_html:true
## If set, the first image found will be made the cover image. If
## keep_summary_html is true, any images in summary will be before any
## in chapters.
#make_firstimage_cover:true
## Resize images down to width, height, preserving aspect ratio.
## Nook size, with margin.
#image_max_size: 580, 725
## Change image to grayscale, if graphics library allows, to save
## space.
#grayscale_images: false
## Most common, I expect will be using this to save username/passwords
## for different sites. Here are a few examples. See defaults.ini
## for the full list.
[www.twilighted.net]
#username:YourPenname
#password:YourPassword
## default is false
#collect_series: true
[ficwad.com]
#username:YourUsername
#password:YourPassword
[www.twiwrite.net]
#username:YourName
#password:yourpassword
## default is false
#collect_series: true
[www.adastrafanfic.com]
## Some sites do not require a login, but do require the user to
## confirm they are adult for adult content.
#is_adult:true
[www.twcslibrary.net]
#username:YourName
#password:yourpassword
#is_adult:true
## default is false
#collect_series: true
[www.fictionalley.org]
#is_adult:true
[www.harrypotterfanfiction.com]
#is_adult:true
[www.fimfiction.net]
#is_adult:true
#fail_on_password: false
[www.tthfanfic.org]
#is_adult:true
## tth is a little unusual--it doesn't require user/pass, but the site
## keeps track of which chapters you've read and won't send another
## update until it thinks you're up to date. This way, on download,
## it thinks you're up to date.
#username:YourName
#password:yourpassword
## This section will override anything in the system defaults or other
## sections here.
[overrides]
## default varies by site. Set true here to force all sites to
## collect series.
#collect_series: true
## This is an example of what your personal configuration might look
## like. Uncomment options by removing the '#' in front of them.
[defaults]
## [defaults] section applies to all formats and sites but may be
## overridden at several levels. Example:
## [defaults]
## titlepage_entries: category,genre, status
## [www.whofic.com]
## # overrides defaults.
## titlepage_entries: category,genre, status,dateUpdated,rating
## [epub]
## # overrides defaults & site section
## titlepage_entries: category,genre, status,datePublished,dateUpdated,dateCreated
## [www.whofic.com:epub]
## # overrides defaults, site section & format section
## titlepage_entries: category,genre, status,datePublished
## [overrides]
## # overrides all other sections
## titlepage_entries: category
## Some sites also require the user to confirm they are adult for
## adult content. Uncomment by removing '#' in front of is_adult.
#is_adult:true
## Don't like the numbers at the start of chapter titles on some
## sites? You can use strip_chapter_numbers to strip them off. Just
## want to make them all look the same? Strip them off, then add them
## back on with add_chapter_numbers. Don't like the way it strips
## numbers or adds them back? See chapter_title_strip_pattern and
## chapter_title_add_pattern.
#strip_chapter_numbers:true
#add_chapter_numbers:true
## Add this to genre if there's more than one category.
#add_genre_when_multi_category: Crossover
[epub]
## include images from img tags in the body and summary of stories.
## Images will be converted to jpg for size if possible. Images work
## in epub format only. To get mobi or other format with images,
## download as epub and use Calibre to convert.
#include_images:true
## If not set, the summary will have all html stripped for safety.
## Both this and include_images must be true to get images in the
## summary.
#keep_summary_html:true
## If set, the first image found will be made the cover image. If
## keep_summary_html is true, any images in summary will be before any
## in chapters.
#make_firstimage_cover:true
## Resize images down to width, height, preserving aspect ratio.
## Nook size, with margin.
#image_max_size: 580, 725
## Change image to grayscale, if graphics library allows, to save
## space.
#grayscale_images: false
## Most common, I expect will be using this to save username/passwords
## for different sites. Here are a few examples. See defaults.ini
## for the full list.
[www.twilighted.net]
#username:YourPenname
#password:YourPassword
## default is false
#collect_series: true
[ficwad.com]
#username:YourUsername
#password:YourPassword
[www.twiwrite.net]
#username:YourName
#password:yourpassword
## default is false
#collect_series: true
[www.adastrafanfic.com]
## Some sites do not require a login, but do require the user to
## confirm they are adult for adult content.
#is_adult:true
[www.twcslibrary.net]
#username:YourName
#password:yourpassword
#is_adult:true
## default is false
#collect_series: true
[www.fictionalley.org]
#is_adult:true
[www.harrypotterfanfiction.com]
#is_adult:true
[www.fimfiction.net]
#is_adult:true
#fail_on_password: false
[www.tthfanfic.org]
#is_adult:true
## tth is a little unusual--it doesn't require user/pass, but the site
## keeps track of which chapters you've read and won't send another
## update until it thinks you're up to date. This way, on download,
## it thinks you're up to date.
#username:YourName
#password:yourpassword
## This section will override anything in the system defaults or other
## sections here.
[overrides]
## default varies by site. Set true here to force all sites to
## collect series.
#collect_series: true

View file

@ -12,8 +12,8 @@ import copy
from calibre.utils.config import JSONConfig
from calibre.gui2.ui import get_gui
from calibre_plugins.fanfictiondownloader_plugin.dialogs import OVERWRITE
from calibre_plugins.fanfictiondownloader_plugin.common_utils import get_library_uuid
from calibre_plugins.fanficfare_plugin.dialogs import OVERWRITE
from calibre_plugins.fanficfare_plugin.common_utils import get_library_uuid
PREFS_NAMESPACE = 'FanFictionDownLoaderPlugin'
PREFS_KEY_SETTINGS = 'settings'

View file

@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2015-02-15 09:23+Central Standard Time\n"
"POT-Creation-Date: 2015-04-05 14:57+Central Daylight Time\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -23,6 +23,54 @@ msgstr ""
msgid "Path to the calibre library. Default is to use the path stored in the settings."
msgstr ""
#: common_utils.py:398
msgid "Keyboard shortcuts"
msgstr ""
#: common_utils.py:444
msgid "Undefined"
msgstr ""
#: common_utils.py:464
msgid "Prefs Viewer dialog"
msgstr ""
#: common_utils.py:465
msgid "Preferences for: "
msgstr ""
#: common_utils.py:497
msgid "Clear"
msgstr ""
#: common_utils.py:499
msgid "Clear all settings for this plugin"
msgstr ""
#: common_utils.py:526
msgid "Are you sure you want to clear your settings in this library for this plugin?"
msgstr ""
#: common_utils.py:527
msgid "Any settings in other libraries or stored in a JSON file in your calibre plugins folder will not be touched."
msgstr ""
#: common_utils.py:528
msgid "You must restart calibre afterwards."
msgstr ""
#: common_utils.py:537
msgid "All settings for this plugin in this library have been cleared."
msgstr ""
#: common_utils.py:538
msgid "Please restart calibre now."
msgstr ""
#: common_utils.py:540
msgid "Restart calibre now"
msgstr ""
#: config.py:179
msgid "FAQs"
msgstr ""
@ -362,7 +410,7 @@ msgstr ""
msgid "FFDL now includes find, color coding, and error checking for personal.ini editing. Red generally indicates errors."
msgstr ""
#: config.py:632 config.py:664 config.py:665 config.py:666
#: config.py:632 config.py:663 config.py:664
msgid "Edit personal.ini"
msgstr ""
@ -388,413 +436,407 @@ msgstr ""
msgid "Plugin Defaults (%s) (Read-Only)"
msgstr ""
#: config.py:655
msgid ""
"These are all of the plugin's configurable options\n"
"and their default settings."
msgstr ""
#: config.py:689
#: config.py:687
msgid "These settings provide integration with the %(rl)s Plugin. %(rl)s can automatically send to devices and change custom columns. You have to create and configure the lists in %(rl)s to be useful."
msgstr ""
#: config.py:694
#: config.py:692
msgid "Add new/updated stories to \"Send to Device\" Reading List(s)."
msgstr ""
#: config.py:695
#: config.py:693
msgid "Automatically add new/updated stories to these lists in the %(rl)s plugin."
msgstr ""
#: config.py:700
#: config.py:698
msgid "\"Send to Device\" Reading Lists"
msgstr ""
#: config.py:701 config.py:704 config.py:717 config.py:720
#: config.py:699 config.py:702 config.py:715 config.py:718
msgid "When enabled, new/updated stories will be automatically added to these lists."
msgstr ""
#: config.py:710
#: config.py:708
msgid "Add new/updated stories to \"To Read\" Reading List(s)."
msgstr ""
#: config.py:711
#: config.py:709
msgid ""
"Automatically add new/updated stories to these lists in the %(rl)s plugin.\n"
"Also offers menu option to remove stories from the \"To Read\" lists."
msgstr ""
#: config.py:716
#: config.py:714
msgid "\"To Read\" Reading Lists"
msgstr ""
#: config.py:726
#: config.py:724
msgid "Add stories back to \"Send to Device\" Reading List(s) when marked \"Read\"."
msgstr ""
#: config.py:727
#: config.py:725
msgid "Menu option to remove from \"To Read\" lists will also add stories back to \"Send to Device\" Reading List(s)"
msgstr ""
#: config.py:749
#: config.py:747
msgid "The %(gc)s plugin can create cover images for books using various metadata and configurations. If you have GC installed, FFDL can run GC on new downloads and metadata updates. Pick a GC setting by site or Default."
msgstr ""
#: config.py:767 config.py:771 config.py:784
#: config.py:765 config.py:769 config.py:782
msgid "Default"
msgstr ""
#: config.py:772
#: config.py:770
msgid "On Metadata update, run %(gc)s with this setting, if not selected for specific site."
msgstr ""
#: config.py:775
#: config.py:773
msgid "On Metadata update, run %(gc)s with this setting for %(site)s stories."
msgstr ""
#: config.py:798
#: config.py:796
msgid "Run %(gc)s Only on New Books"
msgstr ""
#: config.py:799
#: config.py:797
msgid "Default is to run GC any time the calibre metadata is updated."
msgstr ""
#: config.py:803
#: config.py:801
msgid "Allow %(gcset)s from %(pini)s to override"
msgstr ""
#: config.py:804
#: config.py:802
msgid "The %(pini)s parameter %(gcset)s allows you to choose a GC setting based on metadata rather than site, but it's much more complex.<br \\>%(gcset)s is ignored when this is off."
msgstr ""
#: config.py:808
#: config.py:806
msgid "Use calibre's Polish feature to inject/update the cover"
msgstr ""
#: config.py:809
#: config.py:807
msgid "Calibre's Polish feature will be used to inject or update the generated cover into the ebook, EPUB only."
msgstr ""
#: config.py:823
#: config.py:821
msgid "These settings provide integration with the %(cp)s Plugin. %(cp)s can automatically update custom columns with page, word and reading level statistics. You have to create and configure the columns in %(cp)s first."
msgstr ""
#: config.py:828
#: config.py:826
msgid "If any of the settings below are checked, when stories are added or updated, the %(cp)s Plugin will be called to update the checked statistics."
msgstr ""
#: config.py:834
#: config.py:832
msgid "Which column and algorithm to use are configured in %(cp)s."
msgstr ""
#: config.py:844
#: config.py:842
msgid "Will overwrite word count from FFDL metadata if set to update the same custom column."
msgstr ""
#: config.py:849
#: config.py:847
msgid "Only run Count Page's Word Count if checked <i>and</i> FFDL metadata doesn't already have a word count. If this is used with one of the other Page Counts, the Page Count plugin will be called twice."
msgstr ""
#: config.py:885
#: config.py:883
msgid "These controls aren't plugin settings as such, but convenience buttons for setting Keyboard shortcuts and getting all the FanFictionDownLoader confirmation dialogs back again."
msgstr ""
#: config.py:890
#: config.py:888
msgid "Keyboard shortcuts..."
msgstr ""
#: config.py:891
#: config.py:889
msgid "Edit the keyboard shortcuts associated with this plugin"
msgstr ""
#: config.py:895
#: config.py:893
msgid "Reset disabled &confirmation dialogs"
msgstr ""
#: config.py:896
#: config.py:894
msgid "Reset all show me again dialogs for the FanFictionDownLoader plugin"
msgstr ""
#: config.py:900
#: config.py:898
msgid "&View library preferences..."
msgstr ""
#: config.py:901
#: config.py:899
msgid "View data stored in the library database for this plugin"
msgstr ""
#: config.py:912
#: config.py:910
msgid "Done"
msgstr ""
#: config.py:913
#: config.py:911
msgid "Confirmation dialogs have all been reset"
msgstr ""
#: config.py:961
#: config.py:959
msgid "Category"
msgstr ""
#: config.py:962
#: config.py:960
msgid "Genre"
msgstr ""
#: config.py:963
#: config.py:961
msgid "Language"
msgstr ""
#: config.py:964 ffdl_plugin.py:1199 ffdl_plugin.py:1397 ffdl_plugin.py:1427
#: config.py:962 ffdl_plugin.py:1199 ffdl_plugin.py:1397 ffdl_plugin.py:1427
msgid "Status"
msgstr ""
#: config.py:965
#: config.py:963
msgid "Status:%(cmplt)s"
msgstr ""
#: config.py:966
#: config.py:964
msgid "Status:%(inprog)s"
msgstr ""
#: config.py:967 config.py:1101
#: config.py:965 config.py:1099
msgid "Series"
msgstr ""
#: config.py:968
#: config.py:966
msgid "Characters"
msgstr ""
#: config.py:969
#: config.py:967
msgid "Relationships"
msgstr ""
#: config.py:970
#: config.py:968
msgid "Published"
msgstr ""
#: config.py:971 ffdl_plugin.py:1510 ffdl_plugin.py:1529
#: config.py:969 ffdl_plugin.py:1510 ffdl_plugin.py:1529
msgid "Updated"
msgstr ""
#: config.py:972
#: config.py:970
msgid "Created"
msgstr ""
#: config.py:973
#: config.py:971
msgid "Rating"
msgstr ""
#: config.py:974
#: config.py:972
msgid "Warnings"
msgstr ""
#: config.py:975
#: config.py:973
msgid "Chapters"
msgstr ""
#: config.py:976
#: config.py:974
msgid "Words"
msgstr ""
#: config.py:977
#: config.py:975
msgid "Site"
msgstr ""
#: config.py:978
#: config.py:976
msgid "Story ID"
msgstr ""
#: config.py:979
#: config.py:977
msgid "Author ID"
msgstr ""
#: config.py:980
#: config.py:978
msgid "Extra Tags"
msgstr ""
#: config.py:981 config.py:1093 dialogs.py:853 dialogs.py:949
#: config.py:979 config.py:1091 dialogs.py:853 dialogs.py:949
#: ffdl_plugin.py:1199 ffdl_plugin.py:1397 ffdl_plugin.py:1427
msgid "Title"
msgstr ""
#: config.py:982
#: config.py:980
msgid "Story URL"
msgstr ""
#: config.py:983
#: config.py:981
msgid "Description"
msgstr ""
#: config.py:984 dialogs.py:853 dialogs.py:949 ffdl_plugin.py:1199
#: config.py:982 dialogs.py:853 dialogs.py:949 ffdl_plugin.py:1199
#: ffdl_plugin.py:1397 ffdl_plugin.py:1427
msgid "Author"
msgstr ""
#: config.py:985
#: config.py:983
msgid "Author URL"
msgstr ""
#: config.py:986
#: config.py:984
msgid "File Format"
msgstr ""
#: config.py:987
#: config.py:985
msgid "File Extension"
msgstr ""
#: config.py:988
#: config.py:986
msgid "Site Abbrev"
msgstr ""
#: config.py:989
#: config.py:987
msgid "FFDL Version"
msgstr ""
#: config.py:1004
#: config.py:1002
msgid "If you have custom columns defined, they will be listed below. Choose a metadata value type to fill your columns automatically."
msgstr ""
#: config.py:1029
#: config.py:1027
msgid "Update this %s column(%s) with..."
msgstr ""
#: config.py:1039
#: config.py:1037
msgid "Values that aren't valid for this enumeration column will be ignored."
msgstr ""
#: config.py:1039 config.py:1041
#: config.py:1037 config.py:1039
msgid "Metadata values valid for this type of column."
msgstr ""
#: config.py:1044 config.py:1120
#: config.py:1042 config.py:1118
msgid "New Only"
msgstr ""
#: config.py:1045
#: config.py:1043
msgid ""
"Write to %s(%s) only for new\n"
"books, not updates to existing books."
msgstr ""
#: config.py:1056
#: config.py:1054
msgid "Allow %(ccset)s from %(pini)s to override"
msgstr ""
#: config.py:1057
#: config.py:1055
msgid "The %(pini)s parameter %(ccset)s allows you to set custom columns to site specific values that aren't common to all sites.<br />%(ccset)s is ignored when this is off."
msgstr ""
#: config.py:1062
#: config.py:1060
msgid "Special column:"
msgstr ""
#: config.py:1067
#: config.py:1065
msgid "Update/Overwrite Error Column:"
msgstr ""
#: config.py:1068
#: config.py:1066
msgid ""
"When an update or overwrite of an existing story fails, record the reason in this column.\n"
"(Text and Long Text columns only.)"
msgstr ""
#: config.py:1094
#: config.py:1092
msgid "Author(s)"
msgstr ""
#: config.py:1095
#: config.py:1093
msgid "Publisher"
msgstr ""
#: config.py:1096
#: config.py:1094
msgid "Tags"
msgstr ""
#: config.py:1097
#: config.py:1095
msgid "Languages"
msgstr ""
#: config.py:1098
#: config.py:1096
msgid "Published Date"
msgstr ""
#: config.py:1099
#: config.py:1097
msgid "Date"
msgstr ""
#: config.py:1100
#: config.py:1098
msgid "Comments"
msgstr ""
#: config.py:1102
#: config.py:1100
msgid "Ids(url id only)"
msgstr ""
#: config.py:1107
#: config.py:1105
msgid "The standard calibre metadata columns are listed below. You may choose whether FFDL will fill each column automatically on updates or only for new books."
msgstr ""
#: config.py:1121
#: config.py:1119
msgid ""
"Write to %s only for new\n"
"books, not updates to existing books."
msgstr ""
#: config.py:1142
#: config.py:1140
msgid "These settings will allow FFDL to fetch story URLs from your email account. It will only look for story URLs in unread emails in the folder specified below."
msgstr ""
#: config.py:1147
#: config.py:1145
msgid "IMAP Server Name"
msgstr ""
#: config.py:1148
#: config.py:1146
msgid "Name of IMAP server--must allow IMAP4 with SSL. Eg: imap.gmail.com"
msgstr ""
#: config.py:1157
#: config.py:1155
msgid "IMAP User Name"
msgstr ""
#: config.py:1158
#: config.py:1156
msgid ""
"Name of IMAP user. Eg: yourname@gmail.com\n"
"Note that Gmail accounts need to have IMAP enabled in Gmail Settings first."
msgstr ""
#: config.py:1167
#: config.py:1165
msgid "IMAP User Password"
msgstr ""
#: config.py:1168
#: config.py:1166
msgid "IMAP password. If left empty, FFDL will ask you for your password when you use the feature."
msgstr ""
#: config.py:1178
#: config.py:1176
msgid "Remember Password for Session (when not saved above)"
msgstr ""
#: config.py:1179
#: config.py:1177
msgid "If checked, and no password is entered above, FFDL will remember your password until you close calibre or change Libraries."
msgstr ""
#: config.py:1184
#: config.py:1182
msgid "IMAP Folder Name"
msgstr ""
#: config.py:1185
#: config.py:1183
msgid "Name of IMAP folder to search for new emails. The folder (or label) has to already exist. Use INBOX for your default inbox."
msgstr ""
#: config.py:1194
#: config.py:1192
msgid "Mark Emails Read"
msgstr ""
#: config.py:1195
#: config.py:1193
msgid "If checked, emails will be marked as having been read if they contain any story URLs."
msgstr ""
#: config.py:1200
#: config.py:1198
msgid "<b>It's safest if you create a separate email account that you use only for your story update notices. FFDL and calibre cannot guarantee that malicious code cannot get your email password once you've entered it. <br>Use this feature at your own risk. </b>"
msgstr ""
@ -826,10 +868,6 @@ msgstr ""
msgid "Update Calibre Metadata Only"
msgstr ""
#: dialogs.py:246 ffdl_plugin.py:89
msgid "FanFictionDownLoader"
msgstr ""
#: dialogs.py:263 dialogs.py:752
msgid "Show Download Options"
msgstr ""
@ -915,11 +953,11 @@ msgid ""
"Requires %s plugin."
msgstr ""
#: dialogs.py:499 dialogs.py:553 dialogs.py:580 dialogs.py:1461
#: dialogs.py:499 dialogs.py:553 dialogs.py:580 dialogs.py:1457
msgid "Cancel"
msgstr ""
#: dialogs.py:531 dialogs.py:1449
#: dialogs.py:531 dialogs.py:1445
msgid "Password"
msgstr ""
@ -943,7 +981,7 @@ msgstr ""
msgid "Password:"
msgstr ""
#: dialogs.py:549 dialogs.py:694 dialogs.py:1457
#: dialogs.py:549 dialogs.py:694 dialogs.py:1453
msgid "OK"
msgstr ""
@ -1000,7 +1038,7 @@ msgid "less than 1 second"
msgstr ""
#: dialogs.py:689 ffdl_plugin.py:342
msgid "About FanFictionDownLoader"
msgid "About FanFicFare"
msgstr ""
#: dialogs.py:743
@ -1087,38 +1125,38 @@ msgstr ""
msgid "Search for case sensitive string; don't treat Harry, HARRY and harry all the same."
msgstr ""
#: dialogs.py:1277
#: dialogs.py:1273
msgid "Go back to fix errors?"
msgstr ""
#: dialogs.py:1389
#: dialogs.py:1385
msgid "Click an error below to return to Editing directly on that line:"
msgstr ""
#: dialogs.py:1401
#: dialogs.py:1397
msgid "Click to go to line %s"
msgstr ""
#: dialogs.py:1417
#: dialogs.py:1413
msgid "Return to Editing"
msgstr ""
#: dialogs.py:1421
#: dialogs.py:1417
msgid "Save Anyway"
msgstr ""
#: dialogs.py:1450
#: dialogs.py:1446
msgid "Enter Email Password for %s:"
msgstr ""
#: ffdl_plugin.py:89 ffdl_plugin.py:120
msgid "FanFicFare"
msgstr ""
#: ffdl_plugin.py:90
msgid "Download FanFiction stories from various web sites"
msgstr ""
#: ffdl_plugin.py:120
msgid "FanFictionDL"
msgstr ""
#: ffdl_plugin.py:252
msgid "&Add New from URL(s)"
msgstr ""
@ -1192,7 +1230,7 @@ msgid "&Configure Plugin"
msgstr ""
#: ffdl_plugin.py:336
msgid "Configure FanFictionDownLoader"
msgid "Configure FanFicFare"
msgstr ""
#: ffdl_plugin.py:339
@ -1491,7 +1529,7 @@ msgstr ""
msgid "Already contains %d chapters."
msgstr ""
#: ffdl_plugin.py:1101 jobs.py:198
#: ffdl_plugin.py:1101 jobs.py:206
msgid "Existing epub contains %d chapters, web site only has %d. Use Overwrite to force update."
msgstr ""
@ -1635,51 +1673,51 @@ msgstr ""
msgid "Error"
msgstr ""
#: ffdl_plugin.py:1841
msgid "You configured FanFictionDownLoader to automatically update Reading Lists, but you don't have the %s plugin installed anymore?"
#: ffdl_plugin.py:1842
msgid "You configured FanFicFare to automatically update Reading Lists, but you don't have the %s plugin installed anymore?"
msgstr ""
#: ffdl_plugin.py:1853
msgid "You configured FanFictionDownLoader to automatically update \"To Read\" Reading Lists, but you don't have any lists set?"
#: ffdl_plugin.py:1854
msgid "You configured FanFicFare to automatically update \"To Read\" Reading Lists, but you don't have any lists set?"
msgstr ""
#: ffdl_plugin.py:1863 ffdl_plugin.py:1881
msgid "You configured FanFictionDownLoader to automatically update Reading List '%s', but you don't have a list of that name?"
#: ffdl_plugin.py:1864 ffdl_plugin.py:1882
msgid "You configured FanFicFare to automatically update Reading List '%s', but you don't have a list of that name?"
msgstr ""
#: ffdl_plugin.py:1869
msgid "You configured FanFictionDownLoader to automatically update \"Send to Device\" Reading Lists, but you don't have any lists set?"
#: ffdl_plugin.py:1870
msgid "You configured FanFicFare to automatically update \"Send to Device\" Reading Lists, but you don't have any lists set?"
msgstr ""
#: ffdl_plugin.py:1990
#: ffdl_plugin.py:1991
msgid "No story URL found."
msgstr ""
#: ffdl_plugin.py:1993
#: ffdl_plugin.py:1994
msgid "Not Found"
msgstr ""
#: ffdl_plugin.py:1999
#: ffdl_plugin.py:2000
msgid "URL is not a valid story URL."
msgstr ""
#: ffdl_plugin.py:2002
#: ffdl_plugin.py:2003
msgid "Bad URL"
msgstr ""
#: ffdl_plugin.py:2138 ffdl_plugin.py:2141
#: ffdl_plugin.py:2142 ffdl_plugin.py:2145
msgid "Anthology containing:"
msgstr ""
#: ffdl_plugin.py:2139
#: ffdl_plugin.py:2143
msgid "%s by %s"
msgstr ""
#: ffdl_plugin.py:2161
#: ffdl_plugin.py:2165
msgid " Anthology"
msgstr ""
#: ffdl_plugin.py:2198
#: ffdl_plugin.py:2202
msgid "(was set, removed for security)"
msgstr ""
@ -1699,11 +1737,11 @@ msgstr ""
msgid "Download started..."
msgstr ""
#: jobs.py:192
#: jobs.py:200
msgid "Already contains %d chapters. Reuse as is."
msgstr ""
#: jobs.py:209
#: jobs.py:217
msgid "Update %s completed, added %s chapters for %s total."
msgstr ""

View file

@ -39,15 +39,15 @@ if sys.version_info >= (2, 7):
try:
# running under calibre
from calibre_plugins.fanfictiondownloader_plugin.fanficdownloader import adapters, writers, exceptions
from calibre_plugins.fanfictiondownloader_plugin.fanficdownloader.configurable import Configuration
from calibre_plugins.fanfictiondownloader_plugin.fanficdownloader.epubutils import get_dcsource_chaptercount, get_update_data
from calibre_plugins.fanfictiondownloader_plugin.fanficdownloader.geturls import get_urls_from_page
from calibre_plugins.fanfictiondownloader_plugin.fff_internals import adapters, writers, exceptions
from calibre_plugins.fanfictiondownloader_plugin.fff_internals.configurable import Configuration
from calibre_plugins.fanfictiondownloader_plugin.fff_internals.epubutils import get_dcsource_chaptercount, get_update_data
from calibre_plugins.fanfictiondownloader_plugin.fff_internals.geturls import get_urls_from_page
except ImportError:
from fanficdownloader import adapters, writers, exceptions
from fanficdownloader.configurable import Configuration
from fanficdownloader.epubutils import get_dcsource_chaptercount, get_update_data
from fanficdownloader.geturls import get_urls_from_page
from fff_internals import adapters, writers, exceptions
from fff_internals.configurable import Configuration
from fff_internals.epubutils import get_dcsource_chaptercount, get_update_data
from fff_internals.geturls import get_urls_from_page
def write_story(config, adapter, writeformat, metaonly=False, outstream=None):
@ -66,9 +66,9 @@ def main(argv, parser=None, passed_defaultsini=None, passed_personalini=None):
help='write story as FORMAT, epub(default), mobi, text or html', metavar='FORMAT')
if passed_defaultsini:
config_help = 'read config from specified file(s) in addition to calibre plugin personal.ini, ~/.fanficdownloader/personal.ini, and ./personal.ini'
config_help = 'read config from specified file(s) in addition to calibre plugin personal.ini, ~/.fanficfare/personal.ini, and ./personal.ini'
else:
config_help = 'read config from specified file(s) in addition to ~/.fanficdownloader/defaults.ini, ~/.fanficdownloader/personal.ini, ./defaults.ini, and ./personal.ini'
config_help = 'read config from specified file(s) in addition to ~/.fanficfare/defaults.ini, ~/.fanficfare/personal.ini, ./defaults.ini, and ./personal.ini'
parser.add_option('-c', '--config',
action='append', dest='configfile', default=None,
help=config_help, metavar='CONFIG')
@ -107,7 +107,7 @@ def main(argv, parser=None, passed_defaultsini=None, passed_personalini=None):
options, args = parser.parse_args(argv)
if not options.debug:
logger = logging.getLogger('fanficdownloader')
logger = logging.getLogger('fff_internals')
logger.setLevel(logging.INFO)
if not options.siteslist and len(args) != 1:
@ -152,12 +152,16 @@ def main(argv, parser=None, passed_defaultsini=None, passed_personalini=None):
conflist = []
homepath = join(expanduser('~'), '.fanficdownloader')
## also look for .fanficfare now, give higher priority than old dir.
homepath2 = join(expanduser('~'), '.fanficfare')
if passed_defaultsini:
configuration.readfp(passed_defaultsini)
if isfile(join(homepath, 'defaults.ini')):
conflist.append(join(homepath, 'defaults.ini'))
if isfile(join(homepath2, 'defaults.ini')):
conflist.append(join(homepath2, 'defaults.ini'))
if isfile('defaults.ini'):
conflist.append('defaults.ini')
@ -166,6 +170,8 @@ def main(argv, parser=None, passed_defaultsini=None, passed_personalini=None):
if isfile(join(homepath, 'personal.ini')):
conflist.append(join(homepath, 'personal.ini'))
if isfile(join(homepath2, 'personal.ini')):
conflist.append(join(homepath2, 'personal.ini'))
if isfile('personal.ini'):
conflist.append('personal.ini')

View file

@ -1,59 +0,0 @@
import os
import cgi
import sys
import logging
import traceback
import StringIO
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from fanficdownloader.downaloder import *
from fanficdownloader.ffnet import *
from fanficdownloader.output import *
from google.appengine.ext import db
from fanficdownloader.zipdir import *
from ffstorage import *
def create_mac(user, fic_id, fic_url):
return str(abs(hash(user)+hash(fic_id)))+str(abs(hash(fic_url)))
def check_mac(user, fic_id, fic_url, mac):
return (create_mac(user, fic_id, fic_url) == mac)
def create_mac_for_fic(user, fic_id):
key = db.Key(fic_id)
fanfic = db.get(key)
if fanfic.user != user:
return None
else:
return create_mac(user, key, fanfic.url)
class DeleteFicHandler(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
if not user:
self.redirect('/login')
fic_id = self.request.get('fic_id')
fic_mac = self.request.get('key_id')
actual_mac = create_mac_for_fic(user, fic_id)
if actual_mac != fic_mac:
self.response.out.write("Ooops")
else:
key = db.Key(fic_id)
fanfic = db.get(key)
fanfic.delete()
self.redirect('/recent')
fics = db.GqlQuery("Select * From DownloadedFanfic WHERE user = :1", user)
template_values = dict(fics = fics, nickname = user.nickname())
path = os.path.join(os.path.dirname(__file__), 'recent.html')
self.response.out.write(template.render(path, template_values))

View file

@ -1,25 +0,0 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# epubmerge.py 1.0
# Copyright 2011, Jim Miller
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
if __name__ == "__main__":
print('''
The this utility has been split out into it's own project.
See: http://code.google.com/p/epubmerge/
...for a CLI epubmerge.py program and calibre plugin.
''')

View file

@ -12,7 +12,7 @@ except:
import logging
logger = logging.getLogger(__name__)
loghandler=logging.StreamHandler()
loghandler.setFormatter(logging.Formatter("FFDL:%(levelname)s:%(filename)s(%(lineno)d):%(message)s"))
loghandler.setFormatter(logging.Formatter("FFF:%(levelname)s:%(filename)s(%(lineno)d):%(message)s"))
logger.addHandler(loghandler)
loghandler.setLevel(logging.DEBUG)
logger.setLevel(logging.DEBUG)

View file

@ -156,7 +156,7 @@ def imports():
yield val.__name__
for x in imports():
if "fanficdownloader.adapters.adapter_" in x:
if "fff_internals.adapters.adapter_" in x:
#print x
cls = sys.modules[x].getClass()
__class_list.append(cls)

View file

@ -105,11 +105,11 @@ class ArchiveOfOurOwnOrgAdapter(BaseSiteAdapter):
params['user_session[remember_me]'] = '1'
params['commit'] = 'Log in'
#params['utf8'] = u'✓'#u'\x2713' # gets along with out it, and it confuses the encoder.
params['authenticity_token'] = data.split('input name="authenticity_token" type="hidden" value="')[1].split('" /></div>')[0]
params['authenticity_token'] = data.split('input name="authenticity_token" type="hidden" value="')[1].split('"')[0]
loginUrl = 'http://' + self.getSiteDomain() + '/user_sessions'
logger.info("Will now login to URL (%s) as (%s)" % (loginUrl,
params['user_session[login]']))
params['user_session[login]']))
d = self._postUrl(loginUrl, params)
#logger.info(d)
@ -327,7 +327,7 @@ class ArchiveOfOurOwnOrgAdapter(BaseSiteAdapter):
def hookForUpdates(self,chaptercount):
if self.oldchapters and len(self.oldchapters) > self.newestChapterNum:
print("Existing epub has %s chapters\nNewest chapter is %s. Discarding old chapters from there on."%(len(self.oldchapters), self.newestChapterNum+1))
logger.info("Existing epub has %s chapters\nNewest chapter is %s. Discarding old chapters from there on."%(len(self.oldchapters), self.newestChapterNum+1))
self.oldchapters = self.oldchapters[:self.newestChapterNum]
return len(self.oldchapters)

View file

@ -319,7 +319,7 @@ class DarkSolaceOrgAdapter(BaseSiteAdapter):
break
except Exception, e:
print("Series parsing failed: %s"%e)
logger.debug("Series parsing failed: %s"%e)
# grab the text for an individual chapter.
def getChapterText(self, url):

View file

@ -133,7 +133,7 @@ class FictionPadSiteAdapter(BaseSiteAdapter):
author = tables['users'][0]
story = tables['stories'][0]
story_ver = tables['story_versions'][0]
print("story:%s"%story)
logger.debug("story:%s"%story)
self.story.setMetadata('authorId',author['id'])
self.story.setMetadata('author',author['display_name'])

View file

@ -321,7 +321,7 @@ class FimFictionNetSiteAdapter(BaseSiteAdapter):
def hookForUpdates(self,chaptercount):
if self.oldchapters and len(self.oldchapters) > self.newestChapterNum:
print("Existing epub has %s chapters\nNewest chapter is %s. Discarding old chapters from there on."%(len(self.oldchapters), self.newestChapterNum+1))
logger.info("Existing epub has %s chapters\nNewest chapter is %s. Discarding old chapters from there on."%(len(self.oldchapters), self.newestChapterNum+1))
self.oldchapters = self.oldchapters[:self.newestChapterNum]
return len(self.oldchapters)
@ -346,7 +346,7 @@ class FimFictionNetSiteAdapter(BaseSiteAdapter):
params['password'] = self.password
data = self._postUrl(url, params)
else:
print("Chapter %s needed password but no password was present" % url)
logger.error("Chapter %s needed password but no password was present" % url)
data = self.do_fix_blockquotes(data)

View file

@ -264,7 +264,7 @@ class PortkeyOrgAdapter(BaseSiteAdapter): # XXX
#print("soup:%s"%soup)
tag = soup.find('td', {'class' : 'story'})
if tag == None and "<center><b>Chapter does not exist!</b></center>" in data:
print("Chapter is missing at: %s"%url)
logger.error("Chapter is missing at: %s"%url)
return self.utf8FromSoup(url,bs.BeautifulStoneSoup("<div><p><center><b>Chapter does not exist!</b></center></p><p>Chapter is missing at: <a href='%s'>%s</a></p></div>"%(url,url)))
tag.name='div' # force to be a div to avoid problems with nook.

Some files were not shown because too many files have changed in this diff Show more