mirror of
https://github.com/wassname/FanFicFare.git
synced 2026-10-29 12:40:54 +08:00
Re-org file structure, make PI work with it, CLI & web service currently broken.
This commit is contained in:
1 parent
3ded55208f
commit
cd2c58a38a
267 files changed
+2891
-7510
No files matched your search
@@ -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')))
|
||||
|
||||
+23
-23
@@ -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 |
Binary file not shown.
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
|
||||
File renamed without changes.
@@ -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 ""
|
||||
|
||||
File renamed without changes.
@@ -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')
|
||||
|
||||
File renamed without changes.
@@ -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))
|
||||
|
||||
@@ -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.
|
||||
''')
|
||||
File renamed without changes.
File renamed without changes.
@@ -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)
|
||||
File renamed without changes.
+3
-3
@@ -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)
|
||||
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+1
-1
@@ -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):
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+1
-1
@@ -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'])
|
||||
File renamed without changes.
File renamed without changes.
+2
-2
@@ -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)
|
||||
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+1
-1
@@ -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.
|
||||
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Loaded 100 of 267 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user