diff --git a/calibre-plugin/config.py b/calibre-plugin/config.py index fa692d87..0ef49b58 100644 --- a/calibre-plugin/config.py +++ b/calibre-plugin/config.py @@ -348,6 +348,7 @@ class ConfigWidget(QWidget): prefs['imapfolder'] = unicode(self.imap_tab.imapfolder.text()) prefs['imapmarkread'] = self.imap_tab.imapmarkread.isChecked() prefs['imapsessionpass'] = self.imap_tab.imapsessionpass.isChecked() + prefs['auto_reject_from_email'] = self.imap_tab.auto_reject_from_email.isChecked() prefs.save_to_db() @@ -1374,6 +1375,12 @@ class ImapTab(QWidget): self.l.addWidget(self.imapmarkread,row,0,1,-1) row+=1 + self.auto_reject_from_email = QCheckBox(_('Discard URLs on Reject List'),self) + self.auto_reject_from_email.setToolTip(_('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.')) + self.auto_reject_from_email.setChecked(prefs['auto_reject_from_email']) + self.l.addWidget(self.auto_reject_from_email,row,0,1,-1) + row+=1 + label = QLabel(_("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. " diff --git a/calibre-plugin/fff_plugin.py b/calibre-plugin/fff_plugin.py index 38763373..0e9c9e31 100644 --- a/calibre-plugin/fff_plugin.py +++ b/calibre-plugin/fff_plugin.py @@ -20,10 +20,10 @@ import email import traceback try: - from PyQt5.Qt import (QApplication, QMenu, QTimer) + from PyQt5.Qt import (QApplication, QMenu, QTimer, QCursor, Qt) from PyQt5.QtCore import QBuffer except ImportError as e: - from PyQt4.Qt import (QApplication, QMenu, QTimer) + from PyQt4.Qt import (QApplication, QMenu, QTimer, QCursor, Qt) from PyQt4.QtCore import QBuffer from calibre.constants import numeric_version as calibre_version @@ -438,17 +438,30 @@ class FanFicFarePlugin(InterfaceAction): if prefs['imapsessionpass']: self.imap_pass = imap_pass + QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) + self.gui.status_bar.show_message(_('Fetching Story URLs from Email...')) url_list = get_urls_from_imap(prefs['imapserver'], prefs['imapuser'], imap_pass, prefs['imapfolder'], prefs['imapmarkread'],) + reject_list=[] + if prefs['auto_reject_from_email']: + reject_list = set([x for x in url_list if rejecturllist.check(x)]) + url_list = url_list - reject_list + self.gui.status_bar.show_message(_('Finished Fetching Story URLs from Email.'),3000) + QApplication.restoreOverrideCursor() + if url_list: self.add_dialog("\n".join(url_list),merge=False) else: + + msg = _('No Valid Story URLs Found in Unread Emails.') + if reject_list: + msg = msg + '

'+(_('(%d Story URLs Skipped, on Rejected URL List)')%len(reject_list))+'

' info_dialog(self.gui, _('Get Story URLs from Email'), - _('No Valid Story URLs Found in Unread Emails.'), + msg, show=True, show_copy_button=False) diff --git a/calibre-plugin/prefs.py b/calibre-plugin/prefs.py index f751577f..0609674d 100644 --- a/calibre-plugin/prefs.py +++ b/calibre-plugin/prefs.py @@ -111,6 +111,7 @@ default_prefs['imappass'] = '' default_prefs['imapsessionpass'] = False default_prefs['imapfolder'] = 'INBOX' default_prefs['imapmarkread'] = True +default_prefs['auto_reject_from_email'] = False def set_library_config(library_config,db): db.prefs.set_namespaced(PREFS_NAMESPACE, diff --git a/calibre-plugin/translations/messages.pot b/calibre-plugin/translations/messages.pot index 86908d7a..6bbf9605 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: 2015-04-27 11:35+Central Daylight Time\n" +"POT-Creation-Date: 2015-05-14 22:14+Central Daylight Time\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -103,65 +103,65 @@ msgstr "" msgid "Other" msgstr "" -#: config.py:366 +#: config.py:367 msgid "These settings control the basic features of the plugin--downloading FanFiction." msgstr "" -#: config.py:370 +#: config.py:371 msgid "Defaults Options on Download" msgstr "" -#: config.py:374 +#: config.py:375 msgid "On each download, FanFicFare offers an option to select the output format.
This sets what that option will default to." msgstr "" -#: config.py:376 +#: config.py:377 msgid "Default Output &Format:" msgstr "" -#: config.py:391 +#: config.py:392 msgid "On each download, FanFicFare offers an option of what happens if that story already exists.
This sets what that option will default to." msgstr "" -#: config.py:393 +#: config.py:394 msgid "Default If Story Already Exists?" msgstr "" -#: config.py:408 +#: config.py:409 msgid "Default Update Calibre &Metadata?" msgstr "" -#: config.py:409 +#: config.py:410 msgid "On each download, FanFicFare offers an option to update Calibre's metadata (title, author, URL, tags, custom columns, etc) from the web site.
This sets whether that will default to on or off.
Columns set to 'New Only' in the column tabs will only be set for new books." msgstr "" -#: config.py:413 +#: config.py:414 msgid "Default Update EPUB Cover when Updating EPUB?" msgstr "" -#: config.py:414 +#: config.py:415 msgid "On each download, FanFicFare offers an option to update the book cover image inside the EPUB from the web site when the EPUB is updated.
This sets whether that will default to on or off." msgstr "" -#: config.py:419 +#: config.py:420 msgid "Updating Calibre Options" msgstr "" -#: config.py:423 +#: config.py:424 msgid "Delete other existing formats?" msgstr "" -#: config.py:424 +#: config.py:425 msgid "" "Check this to automatically delete all other ebook formats when updating an existing book.\n" "Handy if you have both a Nook(epub) and Kindle(mobi), for example." msgstr "" -#: config.py:428 +#: config.py:429 msgid "Keep Existing Tags when Updating Metadata?" msgstr "" -#: config.py:429 +#: config.py:430 msgid "" "Existing tags will be kept and any new tags added.\n" "%(cmplt)s and %(inprog)s tags will be still be updated, if known.\n" @@ -169,304 +169,304 @@ msgid "" "(If Tags is set to 'New Only' in the Standard Columns tab, this has no effect.)" msgstr "" -#: config.py:433 +#: config.py:434 msgid "Force Author into Author Sort?" msgstr "" -#: config.py:434 +#: config.py:435 msgid "" "If checked, the author(s) as given will be used for the Author Sort, too.\n" "If not checked, calibre will apply it's built in algorithm which makes 'Bob Smith' sort as 'Smith, Bob', etc." msgstr "" -#: config.py:438 +#: config.py:439 msgid "Force Title into Title Sort?" msgstr "" -#: config.py:439 +#: config.py:440 msgid "" "If checked, the title as given will be used for the Title Sort, too.\n" "If not checked, calibre will apply it's built in algorithm which makes 'The Title' sort as 'Title, The', etc." msgstr "" -#: config.py:443 +#: config.py:444 msgid "Check for existing Series Anthology books?" msgstr "" -#: config.py:444 +#: config.py:445 msgid "" "Check for existings Series Anthology books using each new story's series URL before downloading.\n" "Offer to skip downloading if a Series Anthology is found." msgstr "" -#: config.py:448 +#: config.py:449 msgid "Check for changed Story URL?" msgstr "" -#: config.py:449 +#: config.py:450 msgid "" "Warn you if an update will change the URL of an existing book.\n" "fanfiction.net URLs will change from http to https silently." msgstr "" -#: config.py:453 +#: config.py:454 msgid "Search EPUB text for Story URL?" msgstr "" -#: config.py:454 +#: config.py:455 msgid "" "Look for first valid story URL inside EPUB text if not found in metadata.\n" "Somewhat risky, could find wrong URL depending on EPUB content.\n" "Also finds and corrects bad ffnet URLs from ficsaver.com files." msgstr "" -#: config.py:458 +#: config.py:459 msgid "Mark added/updated books when finished?" msgstr "" -#: config.py:459 +#: config.py:460 msgid "" "Mark added/updated books when finished. Use with option below.\n" "You can also manually search for 'marked:fff_success'.\n" "'marked:fff_failed' is also available, or search 'marked:fff' for both." msgstr "" -#: config.py:463 +#: config.py:464 msgid "Show Marked books when finished?" msgstr "" -#: config.py:464 +#: config.py:465 msgid "" "Show Marked added/updated books only when finished.\n" "You can also manually search for 'marked:fff_success'.\n" "'marked:fff_failed' is also available, or search 'marked:fff' for both." msgstr "" -#: config.py:468 +#: config.py:469 msgid "Smarten Punctuation (EPUB only)" msgstr "" -#: config.py:469 +#: config.py:470 msgid "Run Smarten Punctuation from Calibre's Polish Book feature on each EPUB download and update." msgstr "" -#: config.py:473 +#: config.py:474 msgid "Automatically Convert new/update books?" msgstr "" -#: config.py:474 +#: config.py:475 msgid "" "Automatically call calibre's Convert for new/update books.\n" "Converts to the current output format as chosen in calibre's\n" "Preferences->Behavior settings." msgstr "" -#: config.py:478 +#: config.py:479 msgid "GUI Options" msgstr "" -#: config.py:482 +#: config.py:483 msgid "Take URLs from Clipboard?" msgstr "" -#: config.py:483 +#: config.py:484 msgid "Prefill URLs from valid URLs in Clipboard when Adding New." msgstr "" -#: config.py:487 +#: config.py:488 msgid "Default to Update when books selected?" msgstr "" -#: config.py:488 +#: config.py:489 msgid "" "The top FanFicFare plugin button will start Update if\n" "books are selected. If unchecked, it will always bring up 'Add New'." msgstr "" -#: config.py:492 +#: config.py:493 msgid "Keep 'Add New from URL(s)' dialog on top?" msgstr "" -#: config.py:493 +#: config.py:494 msgid "" "Instructs the OS and Window Manager to keep the 'Add New from URL(s)'\n" "dialog on top of all other windows. Useful for dragging URLs onto it." msgstr "" -#: config.py:497 +#: config.py:498 msgid "Show estimated time left?" msgstr "" -#: config.py:498 +#: config.py:499 msgid "When a Progress Bar is shown, show a rough estimate of the time left." msgstr "" -#: config.py:502 +#: config.py:503 msgid "Misc Options" msgstr "" -#: config.py:506 +#: config.py:507 msgid "Inject calibre Series when none found?" msgstr "" -#: config.py:507 +#: config.py:508 msgid "" "If no series is found, inject the calibre series (if there is one) so \n" "it appears on the FanFicFare title page(not cover)." msgstr "" -#: config.py:511 +#: config.py:512 msgid "Reject List" msgstr "" -#: config.py:515 +#: config.py:516 msgid "Edit Reject URL List" msgstr "" -#: config.py:516 +#: config.py:517 msgid "Edit list of URLs FanFicFare will automatically Reject." msgstr "" -#: config.py:520 config.py:591 +#: config.py:521 config.py:592 msgid "Add Reject URLs" msgstr "" -#: config.py:521 +#: config.py:522 msgid "Add additional URLs to Reject as text." msgstr "" -#: config.py:525 +#: config.py:526 msgid "Edit Reject Reasons List" msgstr "" -#: config.py:526 config.py:581 +#: config.py:527 config.py:582 msgid "Customize the Reasons presented when Rejecting URLs" msgstr "" -#: config.py:530 +#: config.py:531 msgid "Reject Without Confirmation?" msgstr "" -#: config.py:531 +#: config.py:532 msgid "Always reject URLs on the Reject List without stopping and asking." msgstr "" -#: config.py:565 +#: config.py:566 msgid "Edit Reject URLs List" msgstr "" -#: config.py:579 +#: config.py:580 msgid "Reject Reasons" msgstr "" -#: config.py:580 +#: config.py:581 msgid "Customize Reject List Reasons" msgstr "" -#: config.py:589 +#: config.py:590 msgid "Reason why I rejected it" msgstr "" -#: config.py:589 +#: config.py:590 msgid "Title by Author" msgstr "" -#: config.py:592 +#: config.py:593 msgid "Add Reject URLs. Use: http://...,note or http://...,title by author - note
Invalid story URLs will be ignored." msgstr "" -#: config.py:593 +#: config.py:594 msgid "" "One URL per line:\n" "http://...,note\n" "http://...,title by author - note" msgstr "" -#: config.py:595 dialogs.py:1072 +#: config.py:596 dialogs.py:1072 msgid "Add this reason to all URLs added:" msgstr "" -#: config.py:611 +#: config.py:612 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:616 +#: config.py:617 msgid "FanFicFare now includes find, color coding, and error checking for personal.ini editing. Red generally indicates errors." msgstr "" -#: config.py:635 config.py:666 config.py:667 +#: config.py:636 config.py:667 config.py:668 msgid "Edit personal.ini" msgstr "" -#: config.py:640 +#: config.py:641 msgid "View Defaults" msgstr "" -#: config.py:641 +#: config.py:642 msgid "" "View all of the plugin's configurable settings\n" "and their default settings." msgstr "" -#: config.py:645 +#: config.py:646 msgid "Changes will only be saved if you click 'OK' to leave Customize FanFicFare." msgstr "" -#: config.py:656 +#: config.py:657 msgid "Plugin Defaults" msgstr "" -#: config.py:657 +#: config.py:658 msgid "Plugin Defaults (%s) (Read-Only)" msgstr "" -#: config.py:690 +#: config.py:691 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:695 +#: config.py:696 msgid "Add new/updated stories to \"Send to Device\" Reading List(s)." msgstr "" -#: config.py:696 +#: config.py:697 msgid "Automatically add new/updated stories to these lists in the %(rl)s plugin." msgstr "" -#: config.py:701 +#: config.py:702 msgid "\"Send to Device\" Reading Lists" msgstr "" -#: config.py:702 config.py:705 config.py:719 config.py:722 +#: config.py:703 config.py:706 config.py:720 config.py:723 msgid "When enabled, new/updated stories will be automatically added to these lists." msgstr "" -#: config.py:712 +#: config.py:713 msgid "Add new/updated stories to \"To Read\" Reading List(s)." msgstr "" -#: config.py:713 +#: config.py:714 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:718 +#: config.py:719 msgid "\"To Read\" Reading Lists" msgstr "" -#: config.py:729 +#: config.py:730 msgid "Add stories back to \"Send to Device\" Reading List(s) when marked \"Read\"." msgstr "" -#: config.py:730 +#: config.py:731 msgid "Menu option to remove from \"To Read\" lists will also add stories back to \"Send to Device\" Reading List(s)" msgstr "" -#: config.py:758 +#: config.py:759 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:766 +#: config.py:767 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" @@ -474,397 +474,405 @@ msgid "" "This comes before Generate Cover so %(gc)s(Plugin) use the image if configured to." msgstr "" -#: config.py:771 +#: config.py:772 msgid "Update Calibre Cover (from EPUB):" msgstr "" -#: config.py:789 +#: config.py:790 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:793 +#: config.py:794 msgid "Generate Calibre Cover:" msgstr "" -#: config.py:820 +#: config.py:821 msgid "Plugin %(gc)s" msgstr "" -#: config.py:821 +#: config.py:822 msgid "Use plugin to create covers. Additional settings are below." msgstr "" -#: config.py:828 +#: config.py:829 msgid "Calibre Generate Cover" msgstr "" -#: config.py:829 +#: config.py:830 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:843 +#: config.py:844 msgid "Generate Covers Only for New Books" msgstr "" -#: config.py:844 +#: config.py:845 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:850 +#: config.py:851 msgid "Inject/update the cover inside EPUB" msgstr "" -#: config.py:851 +#: config.py:852 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:857 +#: config.py:858 msgid "%(gc)s(Plugin) Settings" msgstr "" -#: config.py:865 +#: config.py:866 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:883 config.py:887 config.py:900 +#: config.py:884 config.py:888 config.py:901 msgid "Default" msgstr "" -#: config.py:888 +#: config.py:889 msgid "On Metadata update, run %(gc)s with this setting, if there isn't a more specific setting below." msgstr "" -#: config.py:891 +#: config.py:892 msgid "On Metadata update, run %(gc)s with this setting for %(site)s stories." msgstr "" -#: config.py:914 +#: config.py:915 msgid "Allow %(gcset)s from %(pini)s to override" msgstr "" -#: config.py:915 +#: config.py:916 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:953 +#: config.py:954 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:958 +#: config.py:959 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:964 +#: config.py:965 msgid "Which column and algorithm to use are configured in %(cp)s." msgstr "" -#: config.py:974 +#: config.py:975 msgid "Will overwrite word count from FanFicFare metadata if set to update the same custom column." msgstr "" -#: config.py:979 +#: config.py:980 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:1015 +#: config.py:1016 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:1020 +#: config.py:1021 msgid "Keyboard shortcuts..." msgstr "" -#: config.py:1021 +#: config.py:1022 msgid "Edit the keyboard shortcuts associated with this plugin" msgstr "" -#: config.py:1025 +#: config.py:1026 msgid "Reset disabled &confirmation dialogs" msgstr "" -#: config.py:1026 +#: config.py:1027 msgid "Reset all show me again dialogs for the FanFicFare plugin" msgstr "" -#: config.py:1030 +#: config.py:1031 msgid "&View library preferences..." msgstr "" -#: config.py:1031 +#: config.py:1032 msgid "View data stored in the library database for this plugin" msgstr "" -#: config.py:1042 +#: config.py:1043 msgid "Done" msgstr "" -#: config.py:1043 +#: config.py:1044 msgid "Confirmation dialogs have all been reset" msgstr "" -#: config.py:1091 +#: config.py:1092 msgid "Category" msgstr "" -#: config.py:1092 +#: config.py:1093 msgid "Genre" msgstr "" -#: config.py:1093 +#: config.py:1094 msgid "Language" msgstr "" -#: config.py:1094 fff_plugin.py:1204 fff_plugin.py:1402 fff_plugin.py:1432 +#: config.py:1095 fff_plugin.py:1217 fff_plugin.py:1415 fff_plugin.py:1445 msgid "Status" msgstr "" -#: config.py:1095 +#: config.py:1096 msgid "Status:%(cmplt)s" msgstr "" -#: config.py:1096 +#: config.py:1097 msgid "Status:%(inprog)s" msgstr "" -#: config.py:1097 config.py:1231 +#: config.py:1098 config.py:1232 msgid "Series" msgstr "" -#: config.py:1098 +#: config.py:1099 msgid "Characters" msgstr "" -#: config.py:1099 +#: config.py:1100 msgid "Relationships" msgstr "" -#: config.py:1100 +#: config.py:1101 msgid "Published" msgstr "" -#: config.py:1101 fff_plugin.py:1515 fff_plugin.py:1534 +#: config.py:1102 fff_plugin.py:1528 fff_plugin.py:1547 msgid "Updated" msgstr "" -#: config.py:1102 +#: config.py:1103 msgid "Created" msgstr "" -#: config.py:1103 +#: config.py:1104 msgid "Rating" msgstr "" -#: config.py:1104 +#: config.py:1105 msgid "Warnings" msgstr "" -#: config.py:1105 +#: config.py:1106 msgid "Chapters" msgstr "" -#: config.py:1106 +#: config.py:1107 msgid "Words" msgstr "" -#: config.py:1107 +#: config.py:1108 msgid "Site" msgstr "" -#: config.py:1108 +#: config.py:1109 msgid "Story ID" msgstr "" -#: config.py:1109 +#: config.py:1110 msgid "Author ID" msgstr "" -#: config.py:1110 +#: config.py:1111 msgid "Extra Tags" msgstr "" -#: config.py:1111 config.py:1223 dialogs.py:863 dialogs.py:959 -#: fff_plugin.py:1204 fff_plugin.py:1402 fff_plugin.py:1432 +#: config.py:1112 config.py:1224 dialogs.py:863 dialogs.py:959 +#: fff_plugin.py:1217 fff_plugin.py:1415 fff_plugin.py:1445 msgid "Title" msgstr "" -#: config.py:1112 +#: config.py:1113 msgid "Story URL" msgstr "" -#: config.py:1113 +#: config.py:1114 msgid "Description" msgstr "" -#: config.py:1114 dialogs.py:863 dialogs.py:959 fff_plugin.py:1204 -#: fff_plugin.py:1402 fff_plugin.py:1432 +#: config.py:1115 dialogs.py:863 dialogs.py:959 fff_plugin.py:1217 +#: fff_plugin.py:1415 fff_plugin.py:1445 msgid "Author" msgstr "" -#: config.py:1115 +#: config.py:1116 msgid "Author URL" msgstr "" -#: config.py:1116 +#: config.py:1117 msgid "File Format" msgstr "" -#: config.py:1117 +#: config.py:1118 msgid "File Extension" msgstr "" -#: config.py:1118 +#: config.py:1119 msgid "Site Abbrev" msgstr "" -#: config.py:1119 +#: config.py:1120 msgid "FanFicFare Version" msgstr "" -#: config.py:1134 +#: config.py:1135 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:1159 +#: config.py:1160 msgid "Update this %s column(%s) with..." msgstr "" -#: config.py:1169 +#: config.py:1170 msgid "Values that aren't valid for this enumeration column will be ignored." msgstr "" -#: config.py:1169 config.py:1171 +#: config.py:1170 config.py:1172 msgid "Metadata values valid for this type of column." msgstr "" -#: config.py:1174 config.py:1250 +#: config.py:1175 config.py:1251 msgid "New Only" msgstr "" -#: config.py:1175 +#: config.py:1176 msgid "" "Write to %s(%s) only for new\n" "books, not updates to existing books." msgstr "" -#: config.py:1186 +#: config.py:1187 msgid "Allow %(ccset)s from %(pini)s to override" msgstr "" -#: config.py:1187 +#: config.py:1188 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:1192 +#: config.py:1193 msgid "Special column:" msgstr "" -#: config.py:1197 +#: config.py:1198 msgid "Update/Overwrite Error Column:" msgstr "" -#: config.py:1198 +#: config.py:1199 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:1224 +#: config.py:1225 msgid "Author(s)" msgstr "" -#: config.py:1225 +#: config.py:1226 msgid "Publisher" msgstr "" -#: config.py:1226 +#: config.py:1227 msgid "Tags" msgstr "" -#: config.py:1227 +#: config.py:1228 msgid "Languages" msgstr "" -#: config.py:1228 +#: config.py:1229 msgid "Published Date" msgstr "" -#: config.py:1229 +#: config.py:1230 msgid "Date" msgstr "" -#: config.py:1230 +#: config.py:1231 msgid "Comments" msgstr "" -#: config.py:1232 +#: config.py:1233 msgid "Ids(url id only)" msgstr "" -#: config.py:1237 +#: config.py:1238 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:1251 +#: config.py:1252 msgid "" "Write to %s only for new\n" "books, not updates to existing books." msgstr "" -#: config.py:1272 +#: config.py:1273 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:1277 +#: config.py:1278 msgid "IMAP Server Name" msgstr "" -#: config.py:1278 +#: config.py:1279 msgid "Name of IMAP server--must allow IMAP4 with SSL. Eg: imap.gmail.com" msgstr "" -#: config.py:1287 +#: config.py:1288 msgid "IMAP User Name" msgstr "" -#: config.py:1288 +#: config.py:1289 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:1297 +#: config.py:1298 msgid "IMAP User Password" msgstr "" -#: config.py:1298 +#: config.py:1299 msgid "IMAP password. If left empty, FanFicFare will ask you for your password when you use the feature." msgstr "" -#: config.py:1308 +#: config.py:1309 msgid "Remember Password for Session (when not saved above)" msgstr "" -#: config.py:1309 +#: config.py:1310 msgid "If checked, and no password is entered above, FanFicFare will remember your password until you close calibre or change Libraries." msgstr "" -#: config.py:1314 +#: config.py:1315 msgid "IMAP Folder Name" msgstr "" -#: config.py:1315 +#: config.py:1316 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:1324 +#: config.py:1325 msgid "Mark Emails Read" msgstr "" -#: config.py:1325 +#: config.py:1326 msgid "If checked, emails will be marked as having been read if they contain any story URLs." msgstr "" -#: config.py:1330 +#: config.py:1331 +msgid "Discard URLs on Reject List" +msgstr "" + +#: config.py:1332 +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:1337 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 "" @@ -1081,7 +1089,7 @@ msgstr "" msgid "What sort of update to perform. May set default from plugin configuration." msgstr "" -#: dialogs.py:863 fff_plugin.py:1204 fff_plugin.py:1402 fff_plugin.py:1432 +#: dialogs.py:863 fff_plugin.py:1217 fff_plugin.py:1415 fff_plugin.py:1445 msgid "Comment" msgstr "" @@ -1201,7 +1209,7 @@ msgstr "" msgid "Get Story URLs from &Email" msgstr "" -#: fff_plugin.py:273 fff_plugin.py:447 +#: fff_plugin.py:273 fff_plugin.py:460 msgid "Get Story URLs from Web Page" msgstr "" @@ -1277,475 +1285,487 @@ msgstr "" msgid "FanFicFare Email Settings are not configured." msgstr "" -#: fff_plugin.py:433 -msgid "Get Story URLs from Email" +#: fff_plugin.py:425 +msgid "Fetching Story URLs from Email..." msgstr "" -#: fff_plugin.py:434 +#: fff_plugin.py:436 +msgid "Finished Fetching Story URLs from Email." +msgstr "" + +#: fff_plugin.py:443 msgid "No Valid Story URLs Found in Unread Emails." msgstr "" -#: fff_plugin.py:460 fff_plugin.py:512 +#: fff_plugin.py:445 +msgid "(%d Story URLs Skipped, on Rejected URL List)" +msgstr "" + +#: fff_plugin.py:446 +msgid "Get Story URLs from Email" +msgstr "" + +#: fff_plugin.py:473 fff_plugin.py:525 msgid "List of Story URLs" msgstr "" -#: fff_plugin.py:461 +#: fff_plugin.py:474 msgid "No Valid Story URLs found on given page." msgstr "" -#: fff_plugin.py:476 +#: fff_plugin.py:489 msgid "No Selected Books to Get URLs From" msgstr "" -#: fff_plugin.py:494 +#: fff_plugin.py:507 msgid "Collecting URLs for stories..." msgstr "" -#: fff_plugin.py:495 +#: fff_plugin.py:508 msgid "Get URLs for stories" msgstr "" -#: fff_plugin.py:496 fff_plugin.py:543 fff_plugin.py:730 +#: fff_plugin.py:509 fff_plugin.py:556 fff_plugin.py:743 msgid "URL retrieved" msgstr "" -#: fff_plugin.py:516 +#: fff_plugin.py:529 msgid "List of URLs" msgstr "" -#: fff_plugin.py:517 +#: fff_plugin.py:530 msgid "No Story URLs found in selected books." msgstr "" -#: fff_plugin.py:533 +#: fff_plugin.py:546 msgid "No Selected Books have URLs to Reject" msgstr "" -#: fff_plugin.py:541 +#: fff_plugin.py:554 msgid "Collecting URLs for Reject List..." msgstr "" -#: fff_plugin.py:542 +#: fff_plugin.py:555 msgid "Get URLs for Reject List" msgstr "" -#: fff_plugin.py:577 +#: fff_plugin.py:590 msgid "Proceed to Remove?" msgstr "" -#: fff_plugin.py:577 +#: fff_plugin.py:590 msgid "Rejecting FanFicFare URLs: None of the books selected have FanFiction URLs." msgstr "" -#: fff_plugin.py:599 +#: fff_plugin.py:612 msgid "Cannot Make Anthologys without %s" msgstr "" -#: fff_plugin.py:603 fff_plugin.py:707 +#: fff_plugin.py:616 fff_plugin.py:720 msgid "Cannot Update Books from Device View" msgstr "" -#: fff_plugin.py:607 +#: fff_plugin.py:620 msgid "Can only update 1 anthology at a time" msgstr "" -#: fff_plugin.py:616 +#: fff_plugin.py:629 msgid "Can only Update Epub Anthologies" msgstr "" -#: fff_plugin.py:634 fff_plugin.py:635 +#: fff_plugin.py:647 fff_plugin.py:648 msgid "Cannot Update Anthology" msgstr "" -#: fff_plugin.py:635 +#: fff_plugin.py:648 msgid "Book isn't an FanFicFare Anthology or contains book(s) without valid Story URLs." msgstr "" -#: fff_plugin.py:693 +#: fff_plugin.py:706 msgid "There are %d stories in the current anthology that are not going to be kept if you go ahead." msgstr "" -#: fff_plugin.py:694 +#: fff_plugin.py:707 msgid "Story URLs that will be removed:" msgstr "" -#: fff_plugin.py:696 +#: fff_plugin.py:709 msgid "Update anyway?" msgstr "" -#: fff_plugin.py:697 +#: fff_plugin.py:710 msgid "Stories Removed" msgstr "" -#: fff_plugin.py:714 +#: fff_plugin.py:727 msgid "No Selected Books to Update" msgstr "" -#: fff_plugin.py:728 +#: fff_plugin.py:741 msgid "Collecting stories for update..." msgstr "" -#: fff_plugin.py:729 +#: fff_plugin.py:742 msgid "Get stories for updates" msgstr "" -#: fff_plugin.py:739 +#: fff_plugin.py:752 msgid "Update Existing List" msgstr "" -#: fff_plugin.py:797 +#: fff_plugin.py:810 msgid "Started fetching metadata for %s stories." msgstr "" -#: fff_plugin.py:803 +#: fff_plugin.py:816 msgid "No valid story URLs entered." msgstr "" -#: fff_plugin.py:828 fff_plugin.py:834 +#: fff_plugin.py:841 fff_plugin.py:847 msgid "Reject URL?" msgstr "" -#: fff_plugin.py:835 fff_plugin.py:853 +#: fff_plugin.py:848 fff_plugin.py:866 msgid "%s is on your Reject URL list:" msgstr "" -#: fff_plugin.py:837 +#: fff_plugin.py:850 msgid "Click 'Yes' to Reject." msgstr "" -#: fff_plugin.py:838 fff_plugin.py:942 +#: fff_plugin.py:851 fff_plugin.py:955 msgid "Click 'No' to download anyway." msgstr "" -#: fff_plugin.py:840 +#: fff_plugin.py:853 msgid "Story on Reject URLs list (%s)." msgstr "" -#: fff_plugin.py:843 +#: fff_plugin.py:856 msgid "Rejected" msgstr "" -#: fff_plugin.py:846 +#: fff_plugin.py:859 msgid "Remove Reject URL?" msgstr "" -#: fff_plugin.py:852 +#: fff_plugin.py:865 msgid "Remove URL from Reject List?" msgstr "" -#: fff_plugin.py:855 +#: fff_plugin.py:868 msgid "Click 'Yes' to remove it from the list," msgstr "" -#: fff_plugin.py:856 +#: fff_plugin.py:869 msgid "Click 'No' to leave it on the list." msgstr "" -#: fff_plugin.py:873 +#: fff_plugin.py:886 msgid "Cannot update non-epub format." msgstr "" -#: fff_plugin.py:918 +#: fff_plugin.py:931 msgid "Are You an Adult?" msgstr "" -#: fff_plugin.py:919 +#: fff_plugin.py:932 msgid "%s requires that you be an adult. Please confirm you are an adult in your locale:" msgstr "" -#: fff_plugin.py:933 +#: fff_plugin.py:946 msgid "Skip Story?" msgstr "" -#: fff_plugin.py:939 +#: fff_plugin.py:952 msgid "Skip Anthology Story?" msgstr "" -#: fff_plugin.py:940 +#: fff_plugin.py:953 msgid "\"%s\" is in series \"%s\" that you have an anthology book for." msgstr "" -#: fff_plugin.py:941 +#: fff_plugin.py:954 msgid "Click 'Yes' to Skip." msgstr "" -#: fff_plugin.py:944 +#: fff_plugin.py:957 msgid "Story in Series Anthology(%s)." msgstr "" -#: fff_plugin.py:949 +#: fff_plugin.py:962 msgid "Skipped" msgstr "" -#: fff_plugin.py:977 +#: fff_plugin.py:990 msgid "Add" msgstr "" -#: fff_plugin.py:990 +#: fff_plugin.py:1003 msgid "Meta" msgstr "" -#: fff_plugin.py:1023 +#: fff_plugin.py:1036 msgid "Skipping duplicate story." msgstr "" -#: fff_plugin.py:1026 +#: fff_plugin.py:1039 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:1037 +#: fff_plugin.py:1050 msgid "Update" msgstr "" -#: fff_plugin.py:1045 fff_plugin.py:1052 +#: fff_plugin.py:1058 fff_plugin.py:1065 msgid "Change Story URL?" msgstr "" -#: fff_plugin.py:1053 +#: fff_plugin.py:1066 msgid "%s by %s is already in your library with a different source URL:" msgstr "" -#: fff_plugin.py:1054 +#: fff_plugin.py:1067 msgid "In library: %(liburl)s" msgstr "" -#: fff_plugin.py:1055 fff_plugin.py:1069 +#: fff_plugin.py:1068 fff_plugin.py:1082 msgid "New URL: %(newurl)s" msgstr "" -#: fff_plugin.py:1056 +#: fff_plugin.py:1069 msgid "Click 'Yes' to update/overwrite book with new URL." msgstr "" -#: fff_plugin.py:1057 +#: fff_plugin.py:1070 msgid "Click 'No' to skip updating/overwriting this book." msgstr "" -#: fff_plugin.py:1059 fff_plugin.py:1066 +#: fff_plugin.py:1072 fff_plugin.py:1079 msgid "Download as New Book?" msgstr "" -#: fff_plugin.py:1067 +#: fff_plugin.py:1080 msgid "%s by %s is already in your library with a different source URL." msgstr "" -#: fff_plugin.py:1068 +#: fff_plugin.py:1081 msgid "You chose not to update the existing book. Do you want to add a new book for this URL?" msgstr "" -#: fff_plugin.py:1070 +#: fff_plugin.py:1083 msgid "Click 'Yes' to a new book with new URL." msgstr "" -#: fff_plugin.py:1071 +#: fff_plugin.py:1084 msgid "Click 'No' to skip URL." msgstr "" -#: fff_plugin.py:1077 +#: fff_plugin.py:1090 msgid "Update declined by user due to differing story URL(%s)" msgstr "" -#: fff_plugin.py:1080 +#: fff_plugin.py:1093 msgid "Different URL" msgstr "" -#: fff_plugin.py:1085 +#: fff_plugin.py:1098 msgid "Metadata collected." msgstr "" -#: fff_plugin.py:1101 +#: fff_plugin.py:1114 msgid "Already contains %d chapters." msgstr "" -#: fff_plugin.py:1106 jobs.py:208 +#: fff_plugin.py:1119 jobs.py:208 msgid "Existing epub contains %d chapters, web site only has %d. Use Overwrite to force update." msgstr "" -#: fff_plugin.py:1108 +#: fff_plugin.py:1121 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:1120 +#: fff_plugin.py:1133 msgid "Not Overwriting, web site is not newer." msgstr "" -#: fff_plugin.py:1200 +#: fff_plugin.py:1213 msgid "None of the %d URLs/stories given can be/need to be downloaded." msgstr "" -#: fff_plugin.py:1201 fff_plugin.py:1398 fff_plugin.py:1428 +#: fff_plugin.py:1214 fff_plugin.py:1411 fff_plugin.py:1441 msgid "See log for details." msgstr "" -#: fff_plugin.py:1202 +#: fff_plugin.py:1215 msgid "Proceed with updating your library(Error Column, if configured)?" msgstr "" -#: fff_plugin.py:1209 fff_plugin.py:1410 +#: fff_plugin.py:1222 fff_plugin.py:1423 msgid "Bad" msgstr "" -#: fff_plugin.py:1217 +#: fff_plugin.py:1230 msgid "FanFicFare download ended" msgstr "" -#: fff_plugin.py:1217 fff_plugin.py:1453 +#: fff_plugin.py:1230 fff_plugin.py:1466 msgid "FanFicFare log" msgstr "" -#: fff_plugin.py:1237 +#: fff_plugin.py:1250 msgid "Download FanFiction Book" msgstr "" -#: fff_plugin.py:1244 +#: fff_plugin.py:1257 msgid "Starting %d FanFicFare Downloads" msgstr "" -#: fff_plugin.py:1274 +#: fff_plugin.py:1287 msgid "Story Details:" msgstr "" -#: fff_plugin.py:1277 +#: fff_plugin.py:1290 msgid "Error Updating Metadata" msgstr "" -#: fff_plugin.py:1278 +#: fff_plugin.py:1291 msgid "An error has occurred while FanFicFare was updating calibre's metadata for %s." msgstr "" -#: fff_plugin.py:1279 +#: fff_plugin.py:1292 msgid "The ebook has been updated, but the metadata has not." msgstr "" -#: fff_plugin.py:1331 +#: fff_plugin.py:1344 msgid "Finished Adding/Updating %d books." msgstr "" -#: fff_plugin.py:1361 +#: fff_plugin.py:1374 msgid "Starting auto conversion of %d books." msgstr "" -#: fff_plugin.py:1382 +#: fff_plugin.py:1395 msgid "No Good Stories for Anthology" msgstr "" -#: fff_plugin.py:1383 +#: fff_plugin.py:1396 msgid "No good stories/updates where downloaded, Anthology creation/update aborted." msgstr "" -#: fff_plugin.py:1388 fff_plugin.py:1427 +#: fff_plugin.py:1401 fff_plugin.py:1440 msgid "FanFicFare found %s good and %s bad updates." msgstr "" -#: fff_plugin.py:1395 +#: fff_plugin.py:1408 msgid "Are you sure you want to continue with creating/updating this Anthology?" msgstr "" -#: fff_plugin.py:1396 +#: fff_plugin.py:1409 msgid "Any updates that failed will not be included in the Anthology." msgstr "" -#: fff_plugin.py:1397 +#: fff_plugin.py:1410 msgid "However, if there's an older version, it will still be included." msgstr "" -#: fff_plugin.py:1400 +#: fff_plugin.py:1413 msgid "Proceed with updating this anthology and your library?" msgstr "" -#: fff_plugin.py:1408 +#: fff_plugin.py:1421 msgid "Good" msgstr "" -#: fff_plugin.py:1429 +#: fff_plugin.py:1442 msgid "Proceed with updating your library?" msgstr "" -#: fff_plugin.py:1453 +#: fff_plugin.py:1466 msgid "FanFicFare download complete" msgstr "" -#: fff_plugin.py:1466 +#: fff_plugin.py:1479 msgid "Merging %s books." msgstr "" -#: fff_plugin.py:1506 +#: fff_plugin.py:1519 msgid "FanFicFare Adding/Updating books." msgstr "" -#: fff_plugin.py:1513 +#: fff_plugin.py:1526 msgid "Updating calibre for FanFiction stories..." msgstr "" -#: fff_plugin.py:1514 +#: fff_plugin.py:1527 msgid "Update calibre for FanFiction stories" msgstr "" -#: fff_plugin.py:1523 +#: fff_plugin.py:1536 msgid "Adding/Updating %s BAD books." msgstr "" -#: fff_plugin.py:1532 +#: fff_plugin.py:1545 msgid "Updating calibre for BAD FanFiction stories..." msgstr "" -#: fff_plugin.py:1533 +#: fff_plugin.py:1546 msgid "Update calibre for BAD FanFiction stories" msgstr "" -#: fff_plugin.py:1559 +#: fff_plugin.py:1572 msgid "Adding format to book failed for some reason..." msgstr "" -#: fff_plugin.py:1562 +#: fff_plugin.py:1575 msgid "Error" msgstr "" -#: fff_plugin.py:1870 +#: fff_plugin.py:1883 msgid "You configured FanFicFare to automatically update Reading Lists, but you don't have the %s plugin installed anymore?" msgstr "" -#: fff_plugin.py:1882 +#: fff_plugin.py:1895 msgid "You configured FanFicFare to automatically update \"To Read\" Reading Lists, but you don't have any lists set?" msgstr "" -#: fff_plugin.py:1892 fff_plugin.py:1910 +#: fff_plugin.py:1905 fff_plugin.py:1923 msgid "You configured FanFicFare to automatically update Reading List '%s', but you don't have a list of that name?" msgstr "" -#: fff_plugin.py:1898 +#: fff_plugin.py:1911 msgid "You configured FanFicFare to automatically update \"Send to Device\" Reading Lists, but you don't have any lists set?" msgstr "" -#: fff_plugin.py:2019 +#: fff_plugin.py:2032 msgid "No story URL found." msgstr "" -#: fff_plugin.py:2022 +#: fff_plugin.py:2035 msgid "Not Found" msgstr "" -#: fff_plugin.py:2028 +#: fff_plugin.py:2041 msgid "URL is not a valid story URL." msgstr "" -#: fff_plugin.py:2031 +#: fff_plugin.py:2044 msgid "Bad URL" msgstr "" -#: fff_plugin.py:2170 fff_plugin.py:2173 +#: fff_plugin.py:2183 fff_plugin.py:2186 msgid "Anthology containing:" msgstr "" -#: fff_plugin.py:2171 +#: fff_plugin.py:2184 msgid "%s by %s" msgstr "" -#: fff_plugin.py:2193 +#: fff_plugin.py:2206 msgid " Anthology" msgstr "" -#: fff_plugin.py:2230 +#: fff_plugin.py:2243 msgid "(was set, removed for security)" msgstr "" diff --git a/fanficfare/geturls.py b/fanficfare/geturls.py index 9f30d6ec..ae0e047f 100644 --- a/fanficfare/geturls.py +++ b/fanficfare/geturls.py @@ -216,9 +216,9 @@ def get_urls_from_imap(srv,user,passwd,folder,markread=True): try: #print("part mime:%s"%part.get_content_type()) if part.get_content_type() == 'text/plain': - urllist.extend(get_urls_from_text(part.get_payload(decode=True))) + urllist.extend(get_urls_from_text(part.get_payload(decode=True),normalize=True)) if part.get_content_type() == 'text/html': - urllist.extend(get_urls_from_html(part.get_payload(decode=True))) + urllist.extend(get_urls_from_html(part.get_payload(decode=True),normalize=True)) except Exception as e: print("Failed to read email content: %s"%e) #print "urls:%s"%get_urls_from_text(get_first_text_block(email_message))