diff --git a/calibre-plugin/__init__.py b/calibre-plugin/__init__.py index 9642220..2ff271e 100644 --- a/calibre-plugin/__init__.py +++ b/calibre-plugin/__init__.py @@ -27,7 +27,7 @@ class FanFictionDownLoaderBase(InterfaceActionBase): description = 'UI plugin to download FanFiction stories from various sites.' supported_platforms = ['windows', 'osx', 'linux'] author = 'Jim Miller' - version = (1, 5, 5) + version = (1, 5, 6) minimum_calibre_version = (0, 8, 30) #: This field defines the GUI plugin class that contains all the code diff --git a/calibre-plugin/config.py b/calibre-plugin/config.py index 51ac66b..cf46574 100644 --- a/calibre-plugin/config.py +++ b/calibre-plugin/config.py @@ -35,6 +35,7 @@ all_prefs = JSONConfig('plugins/fanfictiondownloader_plugin') # Set defaults used by all. Library specific settings continue to # take from here. all_prefs.defaults['personal.ini'] = get_resources('plugin-example.ini') + all_prefs.defaults['updatemeta'] = True all_prefs.defaults['updatecover'] = False all_prefs.defaults['keeptags'] = False @@ -43,12 +44,15 @@ all_prefs.defaults['updatedefault'] = True all_prefs.defaults['fileform'] = 'epub' all_prefs.defaults['collision'] = OVERWRITE all_prefs.defaults['deleteotherforms'] = False -all_prefs.defaults['adddialogstatsontop'] = False +all_prefs.defaults['adddialogstaysontop'] = False +all_prefs.defaults['includeimages'] = False + all_prefs.defaults['send_lists'] = '' all_prefs.defaults['read_lists'] = '' all_prefs.defaults['addtolists'] = False all_prefs.defaults['addtoreadlists'] = False all_prefs.defaults['addtolistsonread'] = False + all_prefs.defaults['custom_cols'] = {} # The list of settings to copy from all_prefs or the previous library @@ -62,7 +66,8 @@ copylist = ['personal.ini', 'fileform', 'collision', 'deleteotherforms', - 'adddialogstatsontop'] + 'adddialogstaysontop', + 'includeimages'] # fake out so I don't have to change the prefs calls anywhere. The # Java programmer in me is offended by op-overloading, but it's very @@ -153,7 +158,8 @@ class ConfigWidget(QWidget): prefs['urlsfromclip'] = self.basic_tab.urlsfromclip.isChecked() prefs['updatedefault'] = self.basic_tab.updatedefault.isChecked() prefs['deleteotherforms'] = self.basic_tab.deleteotherforms.isChecked() - prefs['adddialogstatsontop'] = self.basic_tab.adddialogstatsontop.isChecked() + prefs['adddialogstaysontop'] = self.basic_tab.adddialogstaysontop.isChecked() + prefs['includeimages'] = self.basic_tab.includeimages.isChecked() if self.list_tab: # lists @@ -266,10 +272,16 @@ class BasicTab(QWidget): self.deleteotherforms.setChecked(prefs['deleteotherforms']) self.l.addWidget(self.deleteotherforms) - self.adddialogstatsontop = QCheckBox("Keep 'Add New from URL(s)' dialog on top?",self) - self.adddialogstatsontop.setToolTip("Instructs the OS and Window Manager to keep the 'Add New from URL(s)'\ndialog on top of all other windows. Useful for dragging URLs onto it.") - self.adddialogstatsontop.setChecked(prefs['adddialogstatsontop']) - self.l.addWidget(self.adddialogstatsontop) + self.adddialogstaysontop = QCheckBox("Keep 'Add New from URL(s)' dialog on top?",self) + self.adddialogstaysontop.setToolTip("Instructs the OS and Window Manager to keep the 'Add New from URL(s)'\ndialog on top of all other windows. Useful for dragging URLs onto it.") + self.adddialogstaysontop.setChecked(prefs['adddialogstaysontop']) + self.l.addWidget(self.adddialogstaysontop) + + # this is a cheat to make it easier for users to realize there's a new include_images features. + self.includeimages = QCheckBox("Include images in EPUBs?",self) + self.includeimages.setToolTip("Download and include images in EPUB stories. This is equivalent to adding:\n\n[defaults]\ninclude_images:true\nkeep_summary_html:true\nmake_firstimage_cover:true\n\n ...to the top of personal.ini. Your settings in personal.ini will override this.") + self.includeimages.setChecked(prefs['includeimages']) + self.l.addWidget(self.includeimages) self.l.insertStretch(-1) diff --git a/calibre-plugin/dialogs.py b/calibre-plugin/dialogs.py index c1ac9b1..87c8e41 100644 --- a/calibre-plugin/dialogs.py +++ b/calibre-plugin/dialogs.py @@ -71,7 +71,7 @@ class AddNewDialog(SizePersistedDialog): SizePersistedDialog.__init__(self, gui, 'FanFictionDownLoader plugin:add new dialog') self.gui = gui - if prefs['adddialogstatsontop']: + if prefs['adddialogstaysontop']: QDialog.setWindowFlags ( self, Qt.Dialog|Qt.WindowStaysOnTopHint ) self.setMinimumWidth(300) diff --git a/calibre-plugin/ffdl_plugin.py b/calibre-plugin/ffdl_plugin.py index 6e70c6a..93f8320 100644 --- a/calibre-plugin/ffdl_plugin.py +++ b/calibre-plugin/ffdl_plugin.py @@ -220,7 +220,7 @@ class FanFictionDownLoaderPlugin(InterfaceAction): text = get_resources('about.txt') AboutDialog(self.gui,self.qaction.icon(),self.version + text).exec_() - + def create_menu_item_ex(self, parent_menu, menu_text, image=None, tooltip=None, shortcut=None, triggered=None, is_checked=None, shortcut_name=None, unique_name=None): @@ -413,6 +413,13 @@ class FanFictionDownLoaderPlugin(InterfaceAction): adapter = adapters.getAdapter(ffdlconfig,url,fileform) options['personal.ini'] = prefs['personal.ini'] + if prefs['includeimages']: + # this is a cheat to make it easier for users. + options['personal.ini'] = '''[defaults] +include_images:true +keep_summary_html:true +make_firstimage_cover:true +''' + options['personal.ini'] ## three tries, that's enough if both user/pass & is_adult needed, ## or a couple tries of one or the other @@ -441,7 +448,7 @@ class FanFictionDownLoaderPlugin(InterfaceAction): book['title'] = story.getMetadata("title", removeallentities=True) book['author_sort'] = book['author'] = story.getMetadata("author", removeallentities=True) book['publisher'] = story.getMetadata("site") - book['tags'] = writer.getTags() + book['tags'] = writer.getTags() # getTags could be moved up into adapter now. Adapter didn't used to know the fileform book['comments'] = stripHTML(story.getMetadata("description")) #, removeallentities=True) comments handles entities better. book['series'] = story.getMetadata("series") diff --git a/plugin-defaults.ini b/plugin-defaults.ini index 16b9a1a..340ee1e 100644 --- a/plugin-defaults.ini +++ b/plugin-defaults.ini @@ -350,6 +350,11 @@ collect_series: false ## this should go in your personal.ini, not defaults.ini. #is_adult:true +## fimfiction.net stories can be locked requiring individual +## passwords. If fail_on_password is set, the downloader will fail +## when a password is required rather than prompting every time. +#fail_on_password: false + [www.tthfanfic.org] ## Some sites do not require a login, but do require the user to ## confirm they are adult for adult content. In commandline version, diff --git a/plugin-example.ini b/plugin-example.ini index 6911dc8..18df002 100644 --- a/plugin-example.ini +++ b/plugin-example.ini @@ -7,6 +7,28 @@ ## personal.ini, not defaults.ini. #is_adult:true +## include images from img tags in the body and summary of +## stories. Images will be converted to jpg for size if possible. +#include_images:true + +## If not set, the summary will have all html stripped for safety. +## Both this and include_images must be true to get images in the +## summary. +#keep_summary_html:true + +## If set, the first image found will be made the cover image. If +## keep_summary_html is true, any images in summary will be before any +## in chapters. +#make_firstimage_cover:true + +## Resize images down to width, height, preserving aspect ratio. +## Nook size, with margin. +#image_max_size: 580, 725 + +## Change image to grayscale, if graphics library allows, to save +## space. +#grayscale_images: false + ## Try to collect series name and number of this story in series. ## Some sites (ab)use 'series' for reading lists and personal ## collections. This lets us turn it on and off by site without @@ -55,6 +77,7 @@ [www.fimfiction.net] #is_adult:true +#fail_on_password: false [www.tthfanfic.org] #is_adult:true