mirror of
https://github.com/JimmXinu/FanFicFare.git
synced 2026-01-30 12:12:39 +01:00
Re-org file structure, make PI work with it, CLI & web service currently broken.
This commit is contained in:
parent
3ded55208f
commit
cd2c58a38a
267 changed files with 2891 additions and 7510 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -17,3 +17,5 @@ cleanup.sh
|
|||
FanFictionDownLoader.zip
|
||||
*.epub
|
||||
*Thumbs.db
|
||||
FanFicFare.zip
|
||||
output
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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')))
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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 |
BIN
calibre-plugin/images/icon2.xcf
Normal file
BIN
calibre-plugin/images/icon2.xcf
Normal file
Binary file not shown.
BIN
calibre-plugin/images/old icon.png
Normal file
BIN
calibre-plugin/images/old icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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'
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ""
|
||||
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
||||
|
|
@ -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))
|
||||
|
||||
25
epubmerge.py
25
epubmerge.py
|
|
@ -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.
|
||||
''')
|
||||
|
|
@ -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)
|
||||
|
|
@ -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)
|
||||
|
|
@ -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)
|
||||
|
||||
|
|
@ -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):
|
||||
|
|
@ -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'])
|
||||
|
|
@ -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)
|
||||
|
||||
|
|
@ -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
Loading…
Reference in a new issue