diff --git a/calibre-plugin/config.py b/calibre-plugin/config.py
index 5f5f4ca..9f91df4 100644
--- a/calibre-plugin/config.py
+++ b/calibre-plugin/config.py
@@ -10,7 +10,7 @@ __docformat__ = 'restructuredtext en'
import logging
logger = logging.getLogger(__name__)
-import traceback, copy, threading
+import traceback, copy, threading, re
from collections import OrderedDict
try:
@@ -665,53 +665,94 @@ class PersonalIniTab(QWidget):
label = QLabel(_('These settings provide more detailed control over what metadata will be displayed inside the ebook as well as let you set %(isa)s and %(u)s/%(p)s for different sites.')%no_trans)
label.setWordWrap(True)
self.l.addWidget(label)
-# self.l.addSpacing(5)
-
- label = QLabel(_("FanFicFare now includes find, color coding, and error checking for personal.ini editing. Red generally indicates errors."))
- label.setWordWrap(True)
- self.l.addWidget(label)
-
- # self.label = QLabel('personal.ini:')
- # self.l.addWidget(self.label)
-
- # self.ini = QTextEdit(self)
- # try:
- # self.ini.setFont(QFont("Courier",
- # self.plugin_action.gui.font().pointSize()+1))
- # except Exception as e:
- # logger.error("Couldn't get font: %s"%e)
- # self.ini.setLineWrapMode(QTextEdit.NoWrap)
- # self.ini.setText(prefs['personal.ini'])
- # self.l.addWidget(self.ini)
+ self.l.addSpacing(5)
self.personalini = prefs['personal.ini']
+ groupbox = QGroupBox(_("personal.ini"))
+ vert = QVBoxLayout()
+ groupbox.setLayout(vert)
+ self.l.addWidget(groupbox)
+
+ horz = QHBoxLayout()
+ vert.addLayout(horz)
self.ini_button = QPushButton(_('Edit personal.ini'), self)
#self.ini_button.setToolTip(_("Edit personal.ini file."))
self.ini_button.clicked.connect(self.add_ini_button)
- self.l.addWidget(self.ini_button)
+ horz.addWidget(self.ini_button)
+ label = QLabel(_("FanFicFare now includes find, color coding, and error checking for personal.ini editing. Red generally indicates errors."))
+ label.setWordWrap(True)
+ horz.addWidget(label)
+
+ vert.addSpacing(5)
+
+ horz = QHBoxLayout()
+ vert.addLayout(horz)
+ self.ini_button = QPushButton(_('View "Safe" personal.ini'), self)
+ #self.ini_button.setToolTip(_("Edit personal.ini file."))
+ self.ini_button.clicked.connect(self.safe_ini_button)
+ horz.addWidget(self.ini_button)
+
+ label = QLabel(_("View your personal.ini with usernames and passwords removed. For safely sharing your personal.ini settings with others."))
+ label.setWordWrap(True)
+ horz.addWidget(label)
+
+ self.l.addSpacing(5)
+
+ groupbox = QGroupBox(_("defaults.ini"))
+ horz = QHBoxLayout()
+ groupbox.setLayout(horz)
+ self.l.addWidget(groupbox)
+
+ view_label = _("View all of the plugin's configurable settings\nand their default settings.")
+ self.defaults = QPushButton(_('View Defaults')+' (plugin-defaults.ini)', self)
+ self.defaults.setToolTip(view_label)
+ self.defaults.clicked.connect(self.show_defaults)
+ horz.addWidget(self.defaults)
+
+ label = QLabel(view_label)
+ label.setWordWrap(True)
+ horz.addWidget(label)
+
+ self.l.addSpacing(5)
+
+ groupbox = QGroupBox(_("Calibre Columns"))
+ vert = QVBoxLayout()
+ groupbox.setLayout(vert)
+ self.l.addWidget(groupbox)
+
+ horz = QHBoxLayout()
+ vert.addLayout(horz)
+ pass_label = _("If checked, when updating/overwriting an existing book, FanFicFare will have the Calibre Columns available to use in replace_metadata, title_page, etc.
Click the button below to see the Calibre Column namess.")%no_trans
+ self.cal_cols_pass_in = QCheckBox(_('Pass Calibre Columns into FanFicFare on Update/Overwrite')%no_trans,self)
+ self.cal_cols_pass_in.setToolTip(pass_label)
+ self.cal_cols_pass_in.setChecked(prefs['cal_cols_pass_in'])
+ horz.addWidget(self.cal_cols_pass_in)
+
+ label = QLabel(pass_label)
+ label.setWordWrap(True)
+ horz.addWidget(label)
+
+ vert.addSpacing(5)
+
+ horz = QHBoxLayout()
+ vert.addLayout(horz)
+ col_label = _("FanFicFare can pass the Calibre Columns into the download/update process.
This will show you the columns available by name.")
+ self.showcalcols = QPushButton(_('Show Calibre Column Names'), self)
+ self.showcalcols.setToolTip(col_label)
+ self.showcalcols.clicked.connect(self.show_showcalcols)
+ horz.addWidget(self.showcalcols)
+
+ label = QLabel(col_label)
+ label.setWordWrap(True)
+ horz.addWidget(label)
+
label = QLabel(_("Changes will only be saved if you click 'OK' to leave Customize FanFicFare."))
label.setWordWrap(True)
self.l.addWidget(label)
-
- self.defaults = QPushButton(_('View Defaults')+' (plugin-defaults.ini)', self)
- self.defaults.setToolTip(_("View all of the plugin's configurable settings\nand their default settings."))
- self.defaults.clicked.connect(self.show_defaults)
- self.l.addWidget(self.defaults)
-
- self.cal_cols_pass_in = QCheckBox(_('Pass Calibre Columns into FanFicFare on Update/Overwrite')%no_trans,self)
- self.cal_cols_pass_in.setToolTip(_("If checked, when updating/overwriting an existing book, FanFicFare will have the Calibre Columns available to use in replace_metadata, title_page, etc.
Click the button below to see the Calibre Column namess.")%no_trans)
- self.cal_cols_pass_in.setChecked(prefs['cal_cols_pass_in'])
- self.l.addWidget(self.cal_cols_pass_in)
-
- self.showcalcols = QPushButton(_('Show Calibre Column Names'), self)
- self.showcalcols.setToolTip(_("FanFicFare can pass the Calibre Columns into the download/update process.
This will show you the columns available by name."))
- self.showcalcols.clicked.connect(self.show_showcalcols)
- self.l.addWidget(self.showcalcols)
self.l.insertStretch(-1)
- # let edit box fill the space.
def show_defaults(self):
IniTextDialog(self,
@@ -723,6 +764,18 @@ class PersonalIniTab(QWidget):
read_only=True,
save_size_name='fff:defaults.ini').exec_()
+ def safe_ini_button(self):
+ personalini = re.sub(r'((username|password) *[=:]).*$',r'\1XXXXXXXX',self.personalini,flags=re.MULTILINE)
+
+ d = EditTextDialog(self,
+ personalini,
+ icon=self.windowIcon(),
+ title=_("View 'Safe' personal.ini"),
+ label=_("View your personal.ini with usernames and passwords removed. For safely sharing your personal.ini settings with others."),
+ save_size_name='fff:safe personal.ini',
+ read_only=True)
+ d.exec_()
+
def add_ini_button(self):
d = IniTextDialog(self,
self.personalini,
diff --git a/calibre-plugin/translations/messages.pot b/calibre-plugin/translations/messages.pot
index 71cf64d..4a3353e 100644
--- a/calibre-plugin/translations/messages.pot
+++ b/calibre-plugin/translations/messages.pot
@@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2016-02-14 10:17+Central Standard Time\n"
+"POT-Creation-Date: 2016-03-11 11:48+Central Standard Time\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -422,115 +422,139 @@ msgstr ""
msgid "These settings provide more detailed control over what metadata will be displayed inside the ebook as well as let you set %(isa)s and %(u)s/%(p)s for different sites."
msgstr ""
-#: config.py:670
-msgid "FanFicFare now includes find, color coding, and error checking for personal.ini editing. Red generally indicates errors."
+#: config.py:672
+msgid "personal.ini"
msgstr ""
-#: config.py:689 config.py:730 config.py:731
+#: config.py:679 config.py:783 config.py:784
msgid "Edit personal.ini"
msgstr ""
-#: config.py:694
-msgid "Changes will only be saved if you click 'OK' to leave Customize FanFicFare."
+#: config.py:684
+msgid "FanFicFare now includes find, color coding, and error checking for personal.ini editing. Red generally indicates errors."
msgstr ""
-#: config.py:698
-msgid "View Defaults"
+#: config.py:692
+msgid "View \"Safe\" personal.ini"
msgstr ""
-#: config.py:699
+#: config.py:697 config.py:774
+msgid "View your personal.ini with usernames and passwords removed. For safely sharing your personal.ini settings with others."
+msgstr ""
+
+#: config.py:703
+msgid "defaults.ini"
+msgstr ""
+
+#: config.py:708
msgid ""
"View all of the plugin's configurable settings\n"
"and their default settings."
msgstr ""
-#: config.py:703
-msgid "Pass Calibre Columns into FanFicFare on Update/Overwrite"
-msgstr ""
-
-#: config.py:704
-msgid "If checked, when updating/overwriting an existing book, FanFicFare will have the Calibre Columns available to use in replace_metadata, title_page, etc.
Click the button below to see the Calibre Column namess."
-msgstr ""
-
-#: config.py:708
-msgid "Show Calibre Column Names"
-msgstr ""
-
#: config.py:709
-msgid "FanFicFare can pass the Calibre Columns into the download/update process.
This will show you the columns available by name."
+msgid "View Defaults"
msgstr ""
#: config.py:720
+msgid "Calibre Columns"
+msgstr ""
+
+#: config.py:727
+msgid "If checked, when updating/overwriting an existing book, FanFicFare will have the Calibre Columns available to use in replace_metadata, title_page, etc.
Click the button below to see the Calibre Column namess."
+msgstr ""
+
+#: config.py:728
+msgid "Pass Calibre Columns into FanFicFare on Update/Overwrite"
+msgstr ""
+
+#: config.py:741
+msgid "FanFicFare can pass the Calibre Columns into the download/update process.
This will show you the columns available by name."
+msgstr ""
+
+#: config.py:742
+msgid "Show Calibre Column Names"
+msgstr ""
+
+#: config.py:751
+msgid "Changes will only be saved if you click 'OK' to leave Customize FanFicFare."
+msgstr ""
+
+#: config.py:761
msgid "Plugin Defaults"
msgstr ""
-#: config.py:721
+#: config.py:762
msgid "Plugin Defaults (%s) (Read-Only)"
msgstr ""
-#: config.py:754
+#: config.py:773
+msgid "View 'Safe' personal.ini"
+msgstr ""
+
+#: config.py:807
msgid "Calibre Column Entry Names"
msgstr ""
-#: config.py:755
+#: config.py:808
msgid "Label (entry_name)"
msgstr ""
-#: config.py:775
+#: config.py:828
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:780
+#: config.py:833
msgid "Add new/updated stories to \"Send to Device\" Reading List(s)."
msgstr ""
-#: config.py:781
+#: config.py:834
msgid "Automatically add new/updated stories to these lists in the %(rl)s plugin."
msgstr ""
-#: config.py:786
+#: config.py:839
msgid "\"Send to Device\" Reading Lists"
msgstr ""
-#: config.py:787 config.py:790 config.py:804 config.py:807
+#: config.py:840 config.py:843 config.py:857 config.py:860
msgid "When enabled, new/updated stories will be automatically added to these lists."
msgstr ""
-#: config.py:797
+#: config.py:850
msgid "Add new/updated stories to \"To Read\" Reading List(s)."
msgstr ""
-#: config.py:798
+#: config.py:851
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:803
+#: config.py:856
msgid "\"To Read\" Reading Lists"
msgstr ""
-#: config.py:814
+#: config.py:867
msgid "Add stories back to \"Send to Device\" Reading List(s) when marked \"Read\"."
msgstr ""
-#: config.py:815
+#: config.py:868
msgid "Menu option to remove from \"To Read\" lists will also add stories back to \"Send to Device\" Reading List(s)"
msgstr ""
-#: config.py:819
+#: config.py:872
msgid "Automatically run Remove \"New\" Chapter Marks when marking books \"Read\"."
msgstr ""
-#: config.py:820
+#: config.py:873
msgid "Menu option to remove from \"To Read\" lists will also remove \"(new)\" chapter marks created by personal.ini mark_new_chapters setting."
msgstr ""
-#: config.py:848
+#: config.py:901
msgid "The Calibre cover image for a downloaded book can come from the story site(if EPUB and images are enabled), or from either Calibre's built-in random cover generator or the %(gc)s plugin."
msgstr ""
-#: config.py:856
+#: config.py:909
msgid ""
"Update Calibre book cover image from EPUB when Calibre metadata is updated.\n"
"Doesn't go looking for new images on 'Update Calibre Metadata Only'.\n"
@@ -538,433 +562,433 @@ msgid ""
"This comes before Generate Cover so %(gc)s(Plugin) use the image if configured to."
msgstr ""
-#: config.py:861
+#: config.py:914
msgid "Update Calibre Cover (from EPUB):"
msgstr ""
-#: config.py:879
+#: config.py:932
msgid "Generate a Calibre book cover image when Calibre metadata is updated.
Defaults to 'Yes, Always' for backward compatibility and because %(gc)s(Plugin) will only run if configured for Default or site."
msgstr ""
-#: config.py:883
+#: config.py:936
msgid "Generate Calibre Cover:"
msgstr ""
-#: config.py:910
+#: config.py:963
msgid "Plugin %(gc)s"
msgstr ""
-#: config.py:911
+#: config.py:964
msgid "Use plugin to create covers. Additional settings are below."
msgstr ""
-#: config.py:918
+#: config.py:971
msgid "Calibre Generate Cover"
msgstr ""
-#: config.py:919
+#: config.py:972
msgid "Call Calibre's Edit Metadata Generate cover feature to create a random cover each time a story is downloaded or updated.
Right click or long click the 'Generate cover' button in Calibre's Edit Metadata to customize."
msgstr ""
-#: config.py:933
+#: config.py:986
msgid "Generate Covers Only for New Books"
msgstr ""
-#: config.py:934
+#: config.py:987
msgid "Default is to generate a cover any time the calibre metadata is updated.
Used for both Calibre and Plugin generated covers."
msgstr ""
-#: config.py:940
+#: config.py:993
msgid "Inject/update the cover inside EPUB"
msgstr ""
-#: config.py:941
+#: config.py:994
msgid "Calibre's Polish feature will be used to inject or update the generated cover into the EPUB ebook file.
Used for both Calibre and Plugin generated covers."
msgstr ""
-#: config.py:947
+#: config.py:1000
msgid "%(gc)s(Plugin) Settings"
msgstr ""
-#: config.py:955
+#: config.py:1008
msgid "The %(gc)s plugin can create cover images for books using various metadata (including existing cover image). If you have %(gc)s installed, FanFicFare can run %(gc)s on new downloads and metadata updates. Pick a %(gc)s setting by site and/or one to use by Default."
msgstr ""
-#: config.py:973 config.py:977 config.py:990
+#: config.py:1026 config.py:1030 config.py:1043
msgid "Default"
msgstr ""
-#: config.py:978
+#: config.py:1031
msgid "On Metadata update, run %(gc)s with this setting, if there isn't a more specific setting below."
msgstr ""
-#: config.py:981
+#: config.py:1034
msgid "On Metadata update, run %(gc)s with this setting for %(site)s stories."
msgstr ""
-#: config.py:1004
+#: config.py:1057
msgid "Allow %(gcset)s from %(pini)s to override"
msgstr ""
-#: config.py:1005
+#: config.py:1058
msgid "The %(pini)s parameter %(gcset)s allows you to choose a %(gc)s setting based on metadata rather than site, but it's much more complex.
%(gcset)s is ignored when this is off."
msgstr ""
-#: config.py:1043
+#: config.py:1096
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:1048
+#: config.py:1101
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:1054
+#: config.py:1107
msgid "Which column and algorithm to use are configured in %(cp)s."
msgstr ""
-#: config.py:1064
+#: config.py:1117
msgid "Will overwrite word count from FanFicFare metadata if set to update the same custom column."
msgstr ""
-#: config.py:1069
+#: config.py:1122
msgid "Only run Count Page's Word Count if checked and FanFicFare 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:1105
+#: config.py:1158
msgid "These controls aren't plugin settings as such, but convenience buttons for setting Keyboard shortcuts and getting all the FanFicFare confirmation dialogs back again."
msgstr ""
-#: config.py:1110
+#: config.py:1163
msgid "Keyboard shortcuts..."
msgstr ""
-#: config.py:1111
+#: config.py:1164
msgid "Edit the keyboard shortcuts associated with this plugin"
msgstr ""
-#: config.py:1115
+#: config.py:1168
msgid "Reset disabled &confirmation dialogs"
msgstr ""
-#: config.py:1116
+#: config.py:1169
msgid "Reset all show me again dialogs for the FanFicFare plugin"
msgstr ""
-#: config.py:1120
+#: config.py:1173
msgid "&View library preferences..."
msgstr ""
-#: config.py:1121
+#: config.py:1174
msgid "View data stored in the library database for this plugin"
msgstr ""
-#: config.py:1132
+#: config.py:1185
msgid "Done"
msgstr ""
-#: config.py:1133
+#: config.py:1186
msgid "Confirmation dialogs have all been reset"
msgstr ""
-#: config.py:1181
+#: config.py:1234
msgid "Category"
msgstr ""
-#: config.py:1182
+#: config.py:1235
msgid "Genre"
msgstr ""
-#: config.py:1183
+#: config.py:1236
msgid "Language"
msgstr ""
-#: config.py:1184 fff_plugin.py:1446 fff_plugin.py:1645 fff_plugin.py:1675
+#: config.py:1237 fff_plugin.py:1464 fff_plugin.py:1663 fff_plugin.py:1693
msgid "Status"
msgstr ""
-#: config.py:1185
+#: config.py:1238
msgid "Status:%(cmplt)s"
msgstr ""
-#: config.py:1186
+#: config.py:1239
msgid "Status:%(inprog)s"
msgstr ""
-#: config.py:1187 config.py:1335
+#: config.py:1240 config.py:1388
msgid "Series"
msgstr ""
-#: config.py:1188
+#: config.py:1241
msgid "Characters"
msgstr ""
-#: config.py:1189
+#: config.py:1242
msgid "Relationships"
msgstr ""
-#: config.py:1190
+#: config.py:1243
msgid "Published"
msgstr ""
-#: config.py:1191 fff_plugin.py:1758 fff_plugin.py:1777
+#: config.py:1244 fff_plugin.py:1776 fff_plugin.py:1795
msgid "Updated"
msgstr ""
-#: config.py:1192
+#: config.py:1245
msgid "Created"
msgstr ""
-#: config.py:1193
+#: config.py:1246
msgid "Rating"
msgstr ""
-#: config.py:1194
+#: config.py:1247
msgid "Warnings"
msgstr ""
-#: config.py:1195
+#: config.py:1248
msgid "Chapters"
msgstr ""
-#: config.py:1196
+#: config.py:1249
msgid "Words"
msgstr ""
-#: config.py:1197
+#: config.py:1250
msgid "Site"
msgstr ""
-#: config.py:1198
+#: config.py:1251
msgid "Story ID"
msgstr ""
-#: config.py:1199
+#: config.py:1252
msgid "Author ID"
msgstr ""
-#: config.py:1200
+#: config.py:1253
msgid "Extra Tags"
msgstr ""
-#: config.py:1201 config.py:1327 dialogs.py:891 dialogs.py:987
-#: fff_plugin.py:1446 fff_plugin.py:1645 fff_plugin.py:1675
+#: config.py:1254 config.py:1380 dialogs.py:891 dialogs.py:987
+#: fff_plugin.py:1464 fff_plugin.py:1663 fff_plugin.py:1693
msgid "Title"
msgstr ""
-#: config.py:1202
+#: config.py:1255
msgid "Story URL"
msgstr ""
-#: config.py:1203
+#: config.py:1256
msgid "Description"
msgstr ""
-#: config.py:1204 dialogs.py:891 dialogs.py:987 fff_plugin.py:1446
-#: fff_plugin.py:1645 fff_plugin.py:1675
+#: config.py:1257 dialogs.py:891 dialogs.py:987 fff_plugin.py:1464
+#: fff_plugin.py:1663 fff_plugin.py:1693
msgid "Author"
msgstr ""
-#: config.py:1205
+#: config.py:1258
msgid "Author URL"
msgstr ""
-#: config.py:1206
+#: config.py:1259
msgid "File Format"
msgstr ""
-#: config.py:1207
+#: config.py:1260
msgid "File Extension"
msgstr ""
-#: config.py:1208
+#: config.py:1261
msgid "Site Abbrev"
msgstr ""
-#: config.py:1209
+#: config.py:1262
msgid "FanFicFare Version"
msgstr ""
-#: config.py:1224
+#: config.py:1277
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:1249
+#: config.py:1302
msgid "Update this %s column(%s) with..."
msgstr ""
-#: config.py:1259
+#: config.py:1312
msgid "Values that aren't valid for this enumeration column will be ignored."
msgstr ""
-#: config.py:1259 config.py:1261
+#: config.py:1312 config.py:1314
msgid "Metadata values valid for this type of column."
msgstr ""
-#: config.py:1264 config.py:1354
+#: config.py:1317 config.py:1407
msgid "New Only"
msgstr ""
-#: config.py:1265
+#: config.py:1318
msgid ""
"Write to %s(%s) only for new\n"
"books, not updates to existing books."
msgstr ""
-#: config.py:1276
+#: config.py:1329
msgid "Allow %(ccset)s from %(pini)s to override"
msgstr ""
-#: config.py:1277
+#: config.py:1330
msgid "The %(pini)s parameter %(ccset)s allows you to set custom columns to site specific values that aren't common to all sites.
%(ccset)s is ignored when this is off."
msgstr ""
-#: config.py:1281
+#: config.py:1334
msgid "Special column:"
msgstr ""
-#: config.py:1286
+#: config.py:1339
msgid "Update/Overwrite Error Column:"
msgstr ""
-#: config.py:1287
+#: config.py:1340
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:1301
+#: config.py:1354
msgid "Saved Metadata Column:"
msgstr ""
-#: config.py:1302
+#: config.py:1355
msgid "If set, FanFicFare will save a copy of all its metadata in this column when the book is downloaded or updated.
The metadata from this column can later be used to update custom columns without having to request the metadata from the server again.
(Long Text columns only.)"
msgstr ""
-#: config.py:1328
+#: config.py:1381
msgid "Author(s)"
msgstr ""
-#: config.py:1329
+#: config.py:1382
msgid "Publisher"
msgstr ""
-#: config.py:1330
+#: config.py:1383
msgid "Tags"
msgstr ""
-#: config.py:1331
+#: config.py:1384
msgid "Languages"
msgstr ""
-#: config.py:1332
+#: config.py:1385
msgid "Published Date"
msgstr ""
-#: config.py:1333
+#: config.py:1386
msgid "Date"
msgstr ""
-#: config.py:1334
+#: config.py:1387
msgid "Comments"
msgstr ""
-#: config.py:1336
+#: config.py:1389
msgid "Ids(url id only)"
msgstr ""
-#: config.py:1341
+#: config.py:1394
msgid "The standard calibre metadata columns are listed below. You may choose whether FanFicFare will fill each column automatically on updates or only for new books."
msgstr ""
-#: config.py:1355
+#: config.py:1408
msgid ""
"Write to %s only for new\n"
"books, not updates to existing books."
msgstr ""
-#: config.py:1364
+#: config.py:1417
msgid "Other Standard Column Options"
msgstr ""
-#: config.py:1369
+#: config.py:1422
msgid "Set Calibre Author URL"
msgstr ""
-#: config.py:1370
+#: config.py:1423
msgid "Set Calibre Author URL to Author's URL on story site."
msgstr ""
-#: config.py:1387
+#: config.py:1440
msgid "These settings will allow FanFicFare 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:1392
+#: config.py:1445
msgid "IMAP Server Name"
msgstr ""
-#: config.py:1393
+#: config.py:1446
msgid "Name of IMAP server--must allow IMAP4 with SSL. Eg: imap.gmail.com"
msgstr ""
-#: config.py:1402
+#: config.py:1455
msgid "IMAP User Name"
msgstr ""
-#: config.py:1403
+#: config.py:1456
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:1412
+#: config.py:1465
msgid "IMAP User Password"
msgstr ""
-#: config.py:1413
+#: config.py:1466
msgid "IMAP password. If left empty, FanFicFare will ask you for your password when you use the feature."
msgstr ""
-#: config.py:1423
+#: config.py:1476
msgid "Remember Password for Session (when not saved above)"
msgstr ""
-#: config.py:1424
+#: config.py:1477
msgid "If checked, and no password is entered above, FanFicFare will remember your password until you close calibre or change Libraries."
msgstr ""
-#: config.py:1429
+#: config.py:1482
msgid "IMAP Folder Name"
msgstr ""
-#: config.py:1430
+#: config.py:1483
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:1439
+#: config.py:1492
msgid "Mark Emails Read"
msgstr ""
-#: config.py:1440
+#: config.py:1493
msgid "If checked, emails will be marked as having been read if they contain any story URLs."
msgstr ""
-#: config.py:1445
+#: config.py:1498
msgid "Discard URLs on Reject List"
msgstr ""
-#: config.py:1446
+#: config.py:1499
msgid "If checked, FanFicFare will silently discard story URLs from emails that are on your Reject URL List.
Otherwise they will appear and you will see the normal Reject URL dialog.
The Emails will still be marked Read if configured to."
msgstr ""
-#: config.py:1451
+#: config.py:1504
msgid "Download from Email Immediately"
msgstr ""
-#: config.py:1452
+#: config.py:1505
msgid "If checked, FanFicFare will start downloading story URLs from emails immediately.
Otherwise the usual Download from URLs dialog will appear."
msgstr ""
-#: config.py:1457
+#: config.py:1510
msgid "It's safest if you create a separate email account that you use only for your story update notices. FanFicFare and calibre cannot guarantee that malicious code cannot get your email password once you've entered it.
Use this feature at your own risk. "
msgstr ""
@@ -1085,15 +1109,15 @@ msgstr ""
msgid "OK"
msgstr ""
-#: dialogs.py:591 fff_plugin.py:942
+#: dialogs.py:591 fff_plugin.py:958
msgid "Fetching metadata for stories..."
msgstr ""
-#: dialogs.py:592 fff_plugin.py:943
+#: dialogs.py:592 fff_plugin.py:959
msgid "Downloading metadata for stories"
msgstr ""
-#: dialogs.py:593 fff_plugin.py:944
+#: dialogs.py:593 fff_plugin.py:960
msgid "Fetched metadata for"
msgstr ""
@@ -1137,7 +1161,7 @@ msgstr ""
msgid "less than 1 second"
msgstr ""
-#: dialogs.py:708 fff_plugin.py:365 fff_plugin.py:368
+#: dialogs.py:708 fff_plugin.py:381 fff_plugin.py:384
msgid "About FanFicFare"
msgstr ""
@@ -1161,7 +1185,7 @@ msgstr ""
msgid "Collect Metadata from sites in a Background process.
This returns control to you quicker while updating, but you won't be asked for username/passwords or if you are an adult--stories that need those will just fail."
msgstr ""
-#: dialogs.py:891 fff_plugin.py:1446 fff_plugin.py:1645 fff_plugin.py:1675
+#: dialogs.py:891 fff_plugin.py:1464 fff_plugin.py:1663 fff_plugin.py:1693
msgid "Comment"
msgstr ""
@@ -1257,639 +1281,639 @@ msgstr ""
msgid "Enter Email Password for %s:"
msgstr ""
-#: fff_plugin.py:115 fff_plugin.py:146
+#: fff_plugin.py:131 fff_plugin.py:162
msgid "FanFicFare"
msgstr ""
-#: fff_plugin.py:116
+#: fff_plugin.py:132
msgid "Download FanFiction stories from various web sites"
msgstr ""
-#: fff_plugin.py:277
+#: fff_plugin.py:293
msgid "&Download from URLs"
msgstr ""
-#: fff_plugin.py:279
+#: fff_plugin.py:295
msgid "Download FanFiction Books from URLs"
msgstr ""
-#: fff_plugin.py:282
+#: fff_plugin.py:298
msgid "&Update Existing FanFiction Books"
msgstr ""
-#: fff_plugin.py:287
+#: fff_plugin.py:303
msgid "Get Story URLs from &Email"
msgstr ""
-#: fff_plugin.py:291 fff_plugin.py:506
+#: fff_plugin.py:307 fff_plugin.py:522
msgid "Get Story URLs from Web Page"
msgstr ""
-#: fff_plugin.py:297
+#: fff_plugin.py:313
msgid "&Make Anthology Epub from URLs"
msgstr ""
-#: fff_plugin.py:299
+#: fff_plugin.py:315
msgid "Make FanFiction Anthology Epub from URLs"
msgstr ""
-#: fff_plugin.py:302
+#: fff_plugin.py:318
msgid "Make Anthology Epub from Web Page"
msgstr ""
-#: fff_plugin.py:304
+#: fff_plugin.py:320
msgid "Make FanFiction Anthology Epub from Web Page"
msgstr ""
-#: fff_plugin.py:307
+#: fff_plugin.py:323
msgid "Update Anthology Epub"
msgstr ""
-#: fff_plugin.py:309
+#: fff_plugin.py:325
msgid "Update FanFiction Anthology Epub"
msgstr ""
-#: fff_plugin.py:316
+#: fff_plugin.py:332
msgid "Mark Unread: Add to \"To Read\" and \"Send to Device\" Lists"
msgstr ""
-#: fff_plugin.py:318
+#: fff_plugin.py:334
msgid "Mark Read: Remove from \"To Read\" and add to \"Send to Device\" Lists"
msgstr ""
-#: fff_plugin.py:320 fff_plugin.py:325
+#: fff_plugin.py:336 fff_plugin.py:341
msgid "Mark Read: Remove from \"To Read\" Lists"
msgstr ""
-#: fff_plugin.py:322
+#: fff_plugin.py:338
msgid "Add to \"Send to Device\" Lists"
msgstr ""
-#: fff_plugin.py:324
+#: fff_plugin.py:340
msgid "Mark Unread: Add to \"To Read\" Lists"
msgstr ""
-#: fff_plugin.py:340
+#: fff_plugin.py:356
msgid "Remove \"New\" Chapter Marks from Selected books"
msgstr ""
-#: fff_plugin.py:346
+#: fff_plugin.py:362
msgid "Get Story URLs from Selected Books"
msgstr ""
-#: fff_plugin.py:351
+#: fff_plugin.py:367
msgid "Reject Selected Books"
msgstr ""
-#: fff_plugin.py:359
+#: fff_plugin.py:375
msgid "&Configure FanFicFare"
msgstr ""
-#: fff_plugin.py:362
+#: fff_plugin.py:378
msgid "Configure FanFicFare"
msgstr ""
-#: fff_plugin.py:417
+#: fff_plugin.py:433
msgid "Cannot Update Reading Lists from Device View"
msgstr ""
-#: fff_plugin.py:421
+#: fff_plugin.py:437
msgid "No Selected Books to Update Reading Lists"
msgstr ""
-#: fff_plugin.py:431
+#: fff_plugin.py:447
msgid "FanFicFare Email Settings are not configured."
msgstr ""
-#: fff_plugin.py:451
+#: fff_plugin.py:467
msgid "Fetching Story URLs from Email..."
msgstr ""
-#: fff_plugin.py:467 fff_plugin.py:489
+#: fff_plugin.py:483 fff_plugin.py:505
msgid "No Valid Story URLs Found in Unread Emails."
msgstr ""
-#: fff_plugin.py:483
+#: fff_plugin.py:499
msgid "Finished Fetching Story URLs from Email."
msgstr ""
-#: fff_plugin.py:491
+#: fff_plugin.py:507
msgid "(%d Story URLs Skipped, on Rejected URL List)"
msgstr ""
-#: fff_plugin.py:492
+#: fff_plugin.py:508
msgid "Get Story URLs from Email"
msgstr ""
-#: fff_plugin.py:515
+#: fff_plugin.py:531
msgid "Fetching Story URLs from Page..."
msgstr ""
-#: fff_plugin.py:519
+#: fff_plugin.py:535
msgid "Finished Fetching Story URLs from Page."
msgstr ""
-#: fff_plugin.py:525 fff_plugin.py:578
+#: fff_plugin.py:541 fff_plugin.py:594
msgid "List of Story URLs"
msgstr ""
-#: fff_plugin.py:526
+#: fff_plugin.py:542
msgid "No Valid Story URLs found on given page."
msgstr ""
-#: fff_plugin.py:542 fff_plugin.py:595
+#: fff_plugin.py:558 fff_plugin.py:611
msgid "No Selected Books to Get URLs From"
msgstr ""
-#: fff_plugin.py:560
+#: fff_plugin.py:576
msgid "Collecting URLs for stories..."
msgstr ""
-#: fff_plugin.py:561
+#: fff_plugin.py:577
msgid "Get URLs for stories"
msgstr ""
-#: fff_plugin.py:562 fff_plugin.py:674 fff_plugin.py:867
+#: fff_plugin.py:578 fff_plugin.py:690 fff_plugin.py:883
msgid "URL retrieved"
msgstr ""
-#: fff_plugin.py:582
+#: fff_plugin.py:598
msgid "List of URLs"
msgstr ""
-#: fff_plugin.py:583
+#: fff_plugin.py:599
msgid "No Story URLs found in selected books."
msgstr ""
-#: fff_plugin.py:590
+#: fff_plugin.py:606
msgid "Can only UnNew books in library"
msgstr ""
-#: fff_plugin.py:607
+#: fff_plugin.py:623
msgid "UnNewing books..."
msgstr ""
-#: fff_plugin.py:608
+#: fff_plugin.py:624
msgid "UnNew Books"
msgstr ""
-#: fff_plugin.py:609
+#: fff_plugin.py:625
msgid "Books UnNewed"
msgstr ""
-#: fff_plugin.py:649 fff_plugin.py:1604
+#: fff_plugin.py:665 fff_plugin.py:1622
msgid "Starting auto conversion of %d books."
msgstr ""
-#: fff_plugin.py:664
+#: fff_plugin.py:680
msgid "No Selected Books have URLs to Reject"
msgstr ""
-#: fff_plugin.py:672
+#: fff_plugin.py:688
msgid "Collecting URLs for Reject List..."
msgstr ""
-#: fff_plugin.py:673
+#: fff_plugin.py:689
msgid "Get URLs for Reject List"
msgstr ""
-#: fff_plugin.py:708
+#: fff_plugin.py:724
msgid "Proceed to Remove?"
msgstr ""
-#: fff_plugin.py:708
+#: fff_plugin.py:724
msgid "Rejecting FanFicFare URLs: None of the books selected have FanFiction URLs."
msgstr ""
-#: fff_plugin.py:730
+#: fff_plugin.py:746
msgid "Cannot Make Anthologys without %s"
msgstr ""
-#: fff_plugin.py:734 fff_plugin.py:844
+#: fff_plugin.py:750 fff_plugin.py:860
msgid "Cannot Update Books from Device View"
msgstr ""
-#: fff_plugin.py:738
+#: fff_plugin.py:754
msgid "Can only update 1 anthology at a time"
msgstr ""
-#: fff_plugin.py:747
+#: fff_plugin.py:763
msgid "Can only Update Epub Anthologies"
msgstr ""
-#: fff_plugin.py:765 fff_plugin.py:766
+#: fff_plugin.py:781 fff_plugin.py:782
msgid "Cannot Update Anthology"
msgstr ""
-#: fff_plugin.py:766
+#: fff_plugin.py:782
msgid "Book isn't an FanFicFare Anthology or contains book(s) without valid Story URLs."
msgstr ""
-#: fff_plugin.py:773
+#: fff_plugin.py:789
msgid "Fetching Story URLs for Series..."
msgstr ""
-#: fff_plugin.py:783
+#: fff_plugin.py:799
msgid "Finished Fetching Story URLs for Series."
msgstr ""
-#: fff_plugin.py:830
+#: fff_plugin.py:846
msgid "There are %d stories in the current anthology that are not going to be kept if you go ahead."
msgstr ""
-#: fff_plugin.py:831
+#: fff_plugin.py:847
msgid "Story URLs that will be removed:"
msgstr ""
-#: fff_plugin.py:833
+#: fff_plugin.py:849
msgid "Update anyway?"
msgstr ""
-#: fff_plugin.py:834
+#: fff_plugin.py:850
msgid "Stories Removed"
msgstr ""
-#: fff_plugin.py:851
+#: fff_plugin.py:867
msgid "No Selected Books to Update"
msgstr ""
-#: fff_plugin.py:865
+#: fff_plugin.py:881
msgid "Collecting stories for update..."
msgstr ""
-#: fff_plugin.py:866
+#: fff_plugin.py:882
msgid "Get stories for updates"
msgstr ""
-#: fff_plugin.py:876
+#: fff_plugin.py:892
msgid "Update Existing List"
msgstr ""
-#: fff_plugin.py:936
+#: fff_plugin.py:952
msgid "Start queuing downloading for %s stories."
msgstr ""
-#: fff_plugin.py:937
+#: fff_plugin.py:953
msgid "Queuing download for stories..."
msgstr ""
-#: fff_plugin.py:938
+#: fff_plugin.py:954
msgid "Queuing download for stories"
msgstr ""
-#: fff_plugin.py:939
+#: fff_plugin.py:955
msgid "Queued download for"
msgstr ""
-#: fff_plugin.py:941
+#: fff_plugin.py:957
msgid "Started fetching metadata for %s stories."
msgstr ""
-#: fff_plugin.py:955
+#: fff_plugin.py:971
msgid "No valid story URLs entered."
msgstr ""
-#: fff_plugin.py:965 fff_plugin.py:971
+#: fff_plugin.py:981 fff_plugin.py:987
msgid "Reject URL?"
msgstr ""
-#: fff_plugin.py:972 fff_plugin.py:990
+#: fff_plugin.py:988 fff_plugin.py:1006
msgid "%s is on your Reject URL list:"
msgstr ""
-#: fff_plugin.py:974
+#: fff_plugin.py:990
msgid "Click 'Yes' to Reject."
msgstr ""
-#: fff_plugin.py:975 fff_plugin.py:1142
+#: fff_plugin.py:991 fff_plugin.py:1160
msgid "Click 'No' to download anyway."
msgstr ""
-#: fff_plugin.py:977
+#: fff_plugin.py:993
msgid "Story on Reject URLs list (%s)."
msgstr ""
-#: fff_plugin.py:980
+#: fff_plugin.py:996
msgid "Rejected"
msgstr ""
-#: fff_plugin.py:983
+#: fff_plugin.py:999
msgid "Remove Reject URL?"
msgstr ""
-#: fff_plugin.py:989
+#: fff_plugin.py:1005
msgid "Remove URL from Reject List?"
msgstr ""
-#: fff_plugin.py:992
+#: fff_plugin.py:1008
msgid "Click 'Yes' to remove it from the list,"
msgstr ""
-#: fff_plugin.py:993
+#: fff_plugin.py:1009
msgid "Click 'No' to leave it on the list."
msgstr ""
-#: fff_plugin.py:1035
+#: fff_plugin.py:1053
msgid "Cannot update non-epub format."
msgstr ""
-#: fff_plugin.py:1110
+#: fff_plugin.py:1128
msgid "Are You an Adult?"
msgstr ""
-#: fff_plugin.py:1111
+#: fff_plugin.py:1129
msgid "%s requires that you be an adult. Please confirm you are an adult in your locale:"
msgstr ""
-#: fff_plugin.py:1133
+#: fff_plugin.py:1151
msgid "Skip Story?"
msgstr ""
-#: fff_plugin.py:1139
+#: fff_plugin.py:1157
msgid "Skip Anthology Story?"
msgstr ""
-#: fff_plugin.py:1140
+#: fff_plugin.py:1158
msgid "\"%s\" is in series \"%s\" that you have an anthology book for."
msgstr ""
-#: fff_plugin.py:1141
+#: fff_plugin.py:1159
msgid "Click 'Yes' to Skip."
msgstr ""
-#: fff_plugin.py:1144
+#: fff_plugin.py:1162
msgid "Story in Series Anthology(%s)."
msgstr ""
-#: fff_plugin.py:1150
+#: fff_plugin.py:1168
msgid "Skipped"
msgstr ""
-#: fff_plugin.py:1160
+#: fff_plugin.py:1178
msgid "Add"
msgstr ""
-#: fff_plugin.py:1196
+#: fff_plugin.py:1214
msgid "Meta"
msgstr ""
-#: fff_plugin.py:1225
+#: fff_plugin.py:1243
msgid "Skipping duplicate story."
msgstr ""
-#: fff_plugin.py:1228
+#: fff_plugin.py:1246
msgid "More than one identical book by Identifer URL or title/author(s)--can't tell which book to update/overwrite."
msgstr ""
-#: fff_plugin.py:1239
+#: fff_plugin.py:1257
msgid "Update"
msgstr ""
-#: fff_plugin.py:1247 fff_plugin.py:1254
+#: fff_plugin.py:1265 fff_plugin.py:1272
msgid "Change Story URL?"
msgstr ""
-#: fff_plugin.py:1255
+#: fff_plugin.py:1273
msgid "%s by %s is already in your library with a different source URL:"
msgstr ""
-#: fff_plugin.py:1256
+#: fff_plugin.py:1274
msgid "In library: %(liburl)s"
msgstr ""
-#: fff_plugin.py:1257 fff_plugin.py:1271
+#: fff_plugin.py:1275 fff_plugin.py:1289
msgid "New URL: %(newurl)s"
msgstr ""
-#: fff_plugin.py:1258
+#: fff_plugin.py:1276
msgid "Click 'Yes' to update/overwrite book with new URL."
msgstr ""
-#: fff_plugin.py:1259
+#: fff_plugin.py:1277
msgid "Click 'No' to skip updating/overwriting this book."
msgstr ""
-#: fff_plugin.py:1261 fff_plugin.py:1268
+#: fff_plugin.py:1279 fff_plugin.py:1286
msgid "Download as New Book?"
msgstr ""
-#: fff_plugin.py:1269
+#: fff_plugin.py:1287
msgid "%s by %s is already in your library with a different source URL."
msgstr ""
-#: fff_plugin.py:1270
+#: fff_plugin.py:1288
msgid "You chose not to update the existing book. Do you want to add a new book for this URL?"
msgstr ""
-#: fff_plugin.py:1272
+#: fff_plugin.py:1290
msgid "Click 'Yes' to a new book with new URL."
msgstr ""
-#: fff_plugin.py:1273
+#: fff_plugin.py:1291
msgid "Click 'No' to skip URL."
msgstr ""
-#: fff_plugin.py:1279
+#: fff_plugin.py:1297
msgid "Update declined by user due to differing story URL(%s)"
msgstr ""
-#: fff_plugin.py:1282
+#: fff_plugin.py:1300
msgid "Different URL"
msgstr ""
-#: fff_plugin.py:1287
+#: fff_plugin.py:1305
msgid "Metadata collected."
msgstr ""
-#: fff_plugin.py:1303 jobs.py:256
+#: fff_plugin.py:1321 jobs.py:256
msgid "Already contains %d chapters."
msgstr ""
-#: fff_plugin.py:1305 jobs.py:258
+#: fff_plugin.py:1323 jobs.py:258
msgid "Existing epub contains %d chapters, web site only has %d. Use Overwrite to force update."
msgstr ""
-#: fff_plugin.py:1307 jobs.py:260
+#: fff_plugin.py:1325 jobs.py:260
msgid "FanFicFare doesn't recognize chapters in existing epub, epub is probably from a different source. Use Overwrite to force update."
msgstr ""
-#: fff_plugin.py:1324 jobs.py:217
+#: fff_plugin.py:1342 jobs.py:217
msgid "Not Overwriting, web site is not newer."
msgstr ""
-#: fff_plugin.py:1442
+#: fff_plugin.py:1460
msgid "None of the %d URLs/stories given can be/need to be downloaded."
msgstr ""
-#: fff_plugin.py:1443 fff_plugin.py:1641 fff_plugin.py:1671
+#: fff_plugin.py:1461 fff_plugin.py:1659 fff_plugin.py:1689
msgid "See log for details."
msgstr ""
-#: fff_plugin.py:1444
+#: fff_plugin.py:1462
msgid "Proceed with updating your library(Error Column, if configured)?"
msgstr ""
-#: fff_plugin.py:1451 fff_plugin.py:1653
+#: fff_plugin.py:1469 fff_plugin.py:1671
msgid "Bad"
msgstr ""
-#: fff_plugin.py:1459
+#: fff_plugin.py:1477
msgid "FanFicFare download ended"
msgstr ""
-#: fff_plugin.py:1459 fff_plugin.py:1696
+#: fff_plugin.py:1477 fff_plugin.py:1714
msgid "FanFicFare log"
msgstr ""
-#: fff_plugin.py:1479
+#: fff_plugin.py:1497
msgid "Download %s FanFiction Book(s)"
msgstr ""
-#: fff_plugin.py:1486
+#: fff_plugin.py:1504
msgid "Starting %d FanFicFare Downloads"
msgstr ""
-#: fff_plugin.py:1517
+#: fff_plugin.py:1535
msgid "Story Details:"
msgstr ""
-#: fff_plugin.py:1520
+#: fff_plugin.py:1538
msgid "Error Updating Metadata"
msgstr ""
-#: fff_plugin.py:1521
+#: fff_plugin.py:1539
msgid "An error has occurred while FanFicFare was updating calibre's metadata for %s."
msgstr ""
-#: fff_plugin.py:1522
+#: fff_plugin.py:1540
msgid "The ebook has been updated, but the metadata has not."
msgstr ""
-#: fff_plugin.py:1574
+#: fff_plugin.py:1592
msgid "Finished Adding/Updating %d books."
msgstr ""
-#: fff_plugin.py:1625
+#: fff_plugin.py:1643
msgid "No Good Stories for Anthology"
msgstr ""
-#: fff_plugin.py:1626
+#: fff_plugin.py:1644
msgid "No good stories/updates where downloaded, Anthology creation/update aborted."
msgstr ""
-#: fff_plugin.py:1631 fff_plugin.py:1670
+#: fff_plugin.py:1649 fff_plugin.py:1688
msgid "FanFicFare found %s good and %s bad updates."
msgstr ""
-#: fff_plugin.py:1638
+#: fff_plugin.py:1656
msgid "Are you sure you want to continue with creating/updating this Anthology?"
msgstr ""
-#: fff_plugin.py:1639
+#: fff_plugin.py:1657
msgid "Any updates that failed will not be included in the Anthology."
msgstr ""
-#: fff_plugin.py:1640
+#: fff_plugin.py:1658
msgid "However, if there's an older version, it will still be included."
msgstr ""
-#: fff_plugin.py:1643
+#: fff_plugin.py:1661
msgid "Proceed with updating this anthology and your library?"
msgstr ""
-#: fff_plugin.py:1651
+#: fff_plugin.py:1669
msgid "Good"
msgstr ""
-#: fff_plugin.py:1672
+#: fff_plugin.py:1690
msgid "Proceed with updating your library?"
msgstr ""
-#: fff_plugin.py:1696
+#: fff_plugin.py:1714
msgid "FanFicFare download complete"
msgstr ""
-#: fff_plugin.py:1709
+#: fff_plugin.py:1727
msgid "Merging %s books."
msgstr ""
-#: fff_plugin.py:1749
+#: fff_plugin.py:1767
msgid "FanFicFare Adding/Updating books."
msgstr ""
-#: fff_plugin.py:1756
+#: fff_plugin.py:1774
msgid "Updating calibre for FanFiction stories..."
msgstr ""
-#: fff_plugin.py:1757
+#: fff_plugin.py:1775
msgid "Update calibre for FanFiction stories"
msgstr ""
-#: fff_plugin.py:1766
+#: fff_plugin.py:1784
msgid "Adding/Updating %s BAD books."
msgstr ""
-#: fff_plugin.py:1775
+#: fff_plugin.py:1793
msgid "Updating calibre for BAD FanFiction stories..."
msgstr ""
-#: fff_plugin.py:1776
+#: fff_plugin.py:1794
msgid "Update calibre for BAD FanFiction stories"
msgstr ""
-#: fff_plugin.py:1802
+#: fff_plugin.py:1820
msgid "Adding format to book failed for some reason..."
msgstr ""
-#: fff_plugin.py:1805
+#: fff_plugin.py:1823
msgid "Error"
msgstr ""
-#: fff_plugin.py:2125
+#: fff_plugin.py:2143
msgid "You configured FanFicFare to automatically update Reading Lists, but you don't have the %s plugin installed anymore?"
msgstr ""
-#: fff_plugin.py:2137
+#: fff_plugin.py:2155
msgid "You configured FanFicFare to automatically update \"To Read\" Reading Lists, but you don't have any lists set?"
msgstr ""
-#: fff_plugin.py:2147 fff_plugin.py:2165
+#: fff_plugin.py:2165 fff_plugin.py:2183
msgid "You configured FanFicFare to automatically update Reading List '%s', but you don't have a list of that name?"
msgstr ""
-#: fff_plugin.py:2153
+#: fff_plugin.py:2171
msgid "You configured FanFicFare to automatically update \"Send to Device\" Reading Lists, but you don't have any lists set?"
msgstr ""
-#: fff_plugin.py:2276
+#: fff_plugin.py:2294
msgid "No story URL found."
msgstr ""
-#: fff_plugin.py:2279
+#: fff_plugin.py:2297
msgid "Not Found"
msgstr ""
-#: fff_plugin.py:2285
+#: fff_plugin.py:2303
msgid "URL is not a valid story URL."
msgstr ""
-#: fff_plugin.py:2288
+#: fff_plugin.py:2306
msgid "Bad URL"
msgstr ""
-#: fff_plugin.py:2427 fff_plugin.py:2430
+#: fff_plugin.py:2445 fff_plugin.py:2448
msgid "Anthology containing:"
msgstr ""
-#: fff_plugin.py:2428
+#: fff_plugin.py:2446
msgid "%s by %s"
msgstr ""
-#: fff_plugin.py:2450
+#: fff_plugin.py:2468
msgid " Anthology"
msgstr ""
-#: fff_plugin.py:2493
+#: fff_plugin.py:2511
msgid "(was set, removed for security)"
msgstr ""
diff --git a/fanficfare/adapters/base_adapter.py b/fanficfare/adapters/base_adapter.py
index eb68628..5c78e2d 100644
--- a/fanficfare/adapters/base_adapter.py
+++ b/fanficfare/adapters/base_adapter.py
@@ -236,11 +236,11 @@ class BaseSiteAdapter(Configurable):
'''
cachekey=self._get_cachekey(url, parameters, headers)
if usecache and self._has_cachekey(cachekey):
- logger.debug("#####################################\npagecache HIT: %s"%cachekey)
+ logger.debug("#####################################\npagecache HIT: %s"%safe_url(cachekey))
data,redirecturl = self._get_from_pagecache(cachekey)
return data
- logger.debug("#####################################\npagecache MISS: %s"%cachekey)
+ logger.debug("#####################################\npagecache MISS: %s"%safe_url(cachekey))
self.do_sleep(extrasleep)
## u2.Request assumes POST when data!=None. Also assumes data
@@ -279,7 +279,7 @@ class BaseSiteAdapter(Configurable):
'''
cachekey=self._get_cachekey(url, parameters)
if usecache and self._has_cachekey(cachekey):
- logger.debug("#####################################\npagecache HIT: %s"%cachekey)
+ logger.debug("#####################################\npagecache HIT: %s"%safe_url(cachekey))
data,redirecturl = self._get_from_pagecache(cachekey)
class FakeOpened:
def __init__(self,data,url):
@@ -289,7 +289,7 @@ class BaseSiteAdapter(Configurable):
def read(self): return self.data
return (data,FakeOpened(data,redirecturl))
- logger.debug("#####################################\npagecache MISS: %s"%cachekey)
+ logger.debug("#####################################\npagecache MISS: %s"%safe_url(cachekey))
self.do_sleep(extrasleep)
if parameters != None:
opened = self.opener.open(url.replace(' ','%20'),urllib.urlencode(parameters),float(self.getConfig('connect_timeout',30.0)))
@@ -339,13 +339,13 @@ class BaseSiteAdapter(Configurable):
except u2.HTTPError, he:
excpt=he
if he.code in (403,404,410):
- logger.warn("Caught an exception reading URL: %s Exception %s."%(unicode(url),unicode(he)))
+ logger.warn("Caught an exception reading URL: %s Exception %s."%(unicode(safe_url(url)),unicode(he)))
break # break out on 404
except Exception, e:
excpt=e
- logger.warn("Caught an exception reading URL: %s sleeptime(%s) Exception %s."%(unicode(url),sleeptime,unicode(e)))
+ logger.warn("Caught an exception reading URL: %s sleeptime(%s) Exception %s."%(unicode(safe_url(url)),sleeptime,unicode(e)))
- logger.error("Giving up on %s" %url)
+ logger.error("Giving up on %s" %safe_url(url))
logger.debug(excpt, exc_info=True)
raise(excpt)
@@ -688,3 +688,8 @@ def makeDate(string,dateform):
return datetime.datetime.strptime(string.encode('utf-8'),dateform.encode('utf-8'))
+# .? for AO3's ']' in param names.
+safe_url_re = re.compile(r'(?P(password|name|login).?=)[^&]*(?P&|$)',flags=re.MULTILINE)
+def safe_url(url):
+ # return url with password attr (if present) obscured.
+ return re.sub(safe_url_re,r'\gXXXXXXXX\g',url)