From 20e90a5cd5e25dabd2938374c40daff87cc799b6 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Fri, 11 Mar 2016 12:31:03 -0600 Subject: [PATCH] Hide user/pass in debug log, add 'View Safe personal.ini' option that also hides user/pass. --- calibre-plugin/config.py | 125 +++-- calibre-plugin/translations/messages.pot | 644 ++++++++++++----------- fanficfare/adapters/base_adapter.py | 19 +- 3 files changed, 435 insertions(+), 353 deletions(-) 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)