From 6bbe59c76be83a7899076e8aa02896c99b8d620a Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Wed, 21 Dec 2011 23:46:12 -0600 Subject: [PATCH] Prefill URLbox from selected books. Filter that and clipboard for good URL. Save icon gimp file, python script to create calibre-plugin zip. --- calibre-plugin/dialogs.py | 22 ++--------- calibre-plugin/ffdl_plugin.py | 70 ++++++++++++++++++++++++++++----- calibre-plugin/images/icon.xcf | Bin 0 -> 61221 bytes makeplugin.py | 38 ++++++++++++++++++ 4 files changed, 102 insertions(+), 28 deletions(-) create mode 100644 calibre-plugin/images/icon.xcf create mode 100644 makeplugin.py diff --git a/calibre-plugin/dialogs.py b/calibre-plugin/dialogs.py index a58ee25..a646105 100644 --- a/calibre-plugin/dialogs.py +++ b/calibre-plugin/dialogs.py @@ -10,7 +10,7 @@ __docformat__ = 'restructuredtext en' from PyQt4.Qt import (QDialog, QMessageBox, QVBoxLayout, QHBoxLayout, QGridLayout, QPushButton, QProgressDialog, QString, QLabel, QCheckBox, QTextEdit, QLineEdit, QInputDialog, QComboBox, QClipboard, - QProgressDialog, QTimer, QApplication ) + QProgressDialog, QTimer ) from calibre.gui2 import error_dialog, warning_dialog, question_dialog, info_dialog @@ -22,7 +22,7 @@ SKIP='Skip' class DownloadDialog(QDialog): - def __init__(self, gui, prefs, icon, do_user_config, start_downloads): + def __init__(self, gui, prefs, icon, url_list_text, do_user_config, start_downloads): QDialog.__init__(self, gui) self.gui = gui self.do_user_config = do_user_config @@ -39,25 +39,9 @@ class DownloadDialog(QDialog): self.url = QTextEdit(self) self.url.setToolTip('URLs for stories, one per line.') self.url.setLineWrapMode(QTextEdit.NoWrap) - clipboard = QApplication.instance().clipboard() - self.url.setText(clipboard.text()) - #'''http://test1.com?sid=6 -#''') -# http://test1.com?sid=6701 -# http://test1.com?sid=6702 -# http://test1.com?sid=6703 -# http://test1.com?sid=6704 -# http://test1.com?sid=6705 -# http://test1.com?sid=6706 -# http://test1.com?sid=6707 -# http://test1.com?sid=6708 -# http://test1.com?sid=6709 + self.url.setText(url_list_text) self.l.addWidget(self.url) - # self.url = QLineEdit(self) - # self.url.setText('http://test1.com?sid=12345') - # self.l.addWidget(self.url) - self.ffdl_button = QPushButton( 'Download Stories', self) self.ffdl_button.setToolTip('Start download(s).') diff --git a/calibre-plugin/ffdl_plugin.py b/calibre-plugin/ffdl_plugin.py index 00a7a2c..23a3b46 100644 --- a/calibre-plugin/ffdl_plugin.py +++ b/calibre-plugin/ffdl_plugin.py @@ -11,9 +11,12 @@ from StringIO import StringIO import ConfigParser from functools import partial +from PyQt4.Qt import (QApplication) + # The class that all interface action plugins must inherit from from calibre.ptempfile import PersistentTemporaryFile from calibre.ebooks.metadata import MetaInformation +from calibre.ebooks.metadata.meta import get_metadata from calibre.gui2 import error_dialog, warning_dialog, question_dialog, info_dialog from calibre.gui2.actions import InterfaceAction from calibre.gui2.threaded_jobs import ThreadedJob @@ -84,15 +87,63 @@ class FanFictionDownLoaderPlugin(InterfaceAction): # things. self.db = self.gui.current_db + ## if there's rows selected, try to find a source URL from + ## either identifier in the metadata, or from the epub + ## metadata. + url_list = [] rows = self.gui.library_view.selectionModel().selectedRows() if rows: book_ids = self.gui.library_view.get_selected_ids() print("book_ids: %s"%book_ids) + for book_id in book_ids: + identifiers = self.db.get_identifiers(book_id,index_is_id=True) + if 'url' in identifiers: + # identifiers have :->| in url. + #print("url from book:"+identifiers['url'].replace('|',':')) + url_list.append(identifiers['url'].replace('|',':')) + else: + ## only epub has that in it. + if self.db.has_format(book_id,'EPUB',index_is_id=True): + stream = self.db.format(book_id,'EPUB',index_is_id=True, as_file=True) + mi = get_metadata(stream,'EPUB') + #print("mi:%s"%mi) + identifiers = mi.get_identifiers() + if 'url' in identifiers: + #print("url from epub:"+identifiers['url'].replace('|',':')) + url_list.append(identifiers['url'].replace('|',':')) + else: + # no rows selected, check for valid URLs in the clipboard. + cliptext = unicode(QApplication.instance().clipboard().text()) + url_list.extend(cliptext.split()) + + url_list_text = "" + # Check and make sure the URLs are valid ffdl URLs. + if url_list: + dummyconfig = ConfigParser.SafeConfigParser() + for url in url_list: + # pulling up an adapter is pretty low over-head. If + # it fails, it's a bad url. + try: + adapters.getAdapter(dummyconfig,url) + except: + pass + else: + if url_list_text: + url_list_text += "\n" + url_list_text += url + + #'''http://test1.com?sid=6 +#''') +# http://test1.com?sid=6701 +# http://test1.com?sid=6702 +# http://test1.com?sid=6703 +# http://test1.com?sid=6704 +# http://test1.com?sid=6705 +# http://test1.com?sid=6706 +# http://test1.com?sid=6707 +# http://test1.com?sid=6708 +# http://test1.com?sid=6709 - row = self.gui.library_view.currentIndex() - if row.isValid(): - print("current id:%d"%self.gui.library_view.model().id(row)) - #self.db.get_identifiers()['url'] # self.gui is the main calibre GUI. It acts as the gateway to access # all the elements of the calibre user interface, it should also be the @@ -101,6 +152,7 @@ class FanFictionDownLoaderPlugin(InterfaceAction): d = DownloadDialog(self.gui, prefs, self.qaction.icon(), + url_list_text, do_user_config, # method for config button self.start_downloads, # method to start downloads ) @@ -120,11 +172,11 @@ class FanFictionDownLoaderPlugin(InterfaceAction): self.fetchmeta_qpd = \ MetadataProgressDialog(self.gui, - url_list, - fileform, - partial(self.get_adapter_for_story, collision=collision), - partial(self.download_list,collision=collision,updatemeta=updatemeta), - self.db) + url_list, + fileform, + partial(self.get_adapter_for_story, collision=collision), + partial(self.download_list,collision=collision,updatemeta=updatemeta), + self.db) def get_adapter_for_story(self,url,fileform,collision=SKIP): ''' diff --git a/calibre-plugin/images/icon.xcf b/calibre-plugin/images/icon.xcf new file mode 100644 index 0000000000000000000000000000000000000000..36c63a53671fcd9e14ec5efa9f04eba9d09a2e0d GIT binary patch literal 61221 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 BseS+e literal 0 HcmV?d00001 diff --git a/makeplugin.py b/makeplugin.py new file mode 100644 index 0000000..4d2c336 --- /dev/null +++ b/makeplugin.py @@ -0,0 +1,38 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# epubmerge.py 1.0 + +# Copyright 2011, Jim Miller + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +from glob import glob + +from makezip import createZipFile + +if __name__=="__main__": + filename="FanFictionDownLoaderPlugin.zip" + exclude=['*.pyc','*~','*.xcf'] + # from top dir. 'w' for overwrite + createZipFile(filename,"w", + ['defaults.ini','example.ini','fanficdownloader'], + exclude=exclude) + #from calibre-plugin dir. 'a' for append + os.chdir('calibre-plugin') + files=['about.txt','images',] + files.extend(glob('*.py')) + files.extend(glob('plugin-import-name-*.txt')) + createZipFile("../"+filename,"a", + files,exclude=exclude)