Sycn to trunk.

This commit is contained in:
John Schember 2009-08-10 21:21:53 -04:00
commit 6ecb62a1be
8 changed files with 127 additions and 138 deletions

View File

@ -2,7 +2,7 @@ __license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en' __docformat__ = 'restructuredtext en'
__appname__ = 'calibre' __appname__ = 'calibre'
__version__ = '0.6.5' __version__ = '0.6.6'
__author__ = "Kovid Goyal <kovid@kovidgoyal.net>" __author__ = "Kovid Goyal <kovid@kovidgoyal.net>"
import re import re

View File

@ -29,7 +29,7 @@ class CLI(object):
def get_file(self, path, outfile, end_session=True): def get_file(self, path, outfile, end_session=True):
path = self.munge_path(path) path = self.munge_path(path)
with open(path, 'rb') as src: with open(path, 'rb') as src:
shutil.copyfileobj(src, outfile, 10*1024*1024) shutil.copyfileobj(src, outfile)
def put_file(self, infile, path, replace_file=False, end_session=True): def put_file(self, infile, path, replace_file=False, end_session=True):
path = self.munge_path(path) path = self.munge_path(path)
@ -44,10 +44,8 @@ class CLI(object):
d = os.path.dirname(path) d = os.path.dirname(path)
if not os.path.exists(d): if not os.path.exists(d):
os.makedirs(d) os.makedirs(d)
dest = open(path, 'wb') with open(path, 'wb') as dest:
shutil.copyfileobj(infile, dest, 10*1024*1024) shutil.copyfileobj(infile, dest)
dest.flush()
dest.close()
if close: if close:
infile.close() infile.close()

View File

@ -4,12 +4,13 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
Interface to isbndb.com. My key HLLXQX2A. Interface to isbndb.com. My key HLLXQX2A.
''' '''
import sys, re, socket import sys, re
from urllib import urlopen, quote from urllib import quote
from calibre.utils.config import OptionParser from calibre.utils.config import OptionParser
from calibre.ebooks.metadata import MetaInformation from calibre.ebooks.metadata import MetaInformation
from calibre.ebooks.BeautifulSoup import BeautifulStoneSoup from calibre.ebooks.BeautifulSoup import BeautifulStoneSoup
from calibre import browser
BASE_URL = 'http://isbndb.com/api/books.xml?access_key=%(key)s&page_number=1&results=subjects,authors,texts&' BASE_URL = 'http://isbndb.com/api/books.xml?access_key=%(key)s&page_number=1&results=subjects,authors,texts&'
@ -20,12 +21,10 @@ def fetch_metadata(url, max=100, timeout=5.):
books = [] books = []
page_number = 1 page_number = 1
total_results = sys.maxint total_results = sys.maxint
timeout = socket.getdefaulttimeout() br = browser()
socket.setdefaulttimeout(timeout)
try:
while len(books) < total_results and max > 0: while len(books) < total_results and max > 0:
try: try:
raw = urlopen(url).read() raw = br.open(url, timeout=timeout).read()
except Exception, err: except Exception, err:
raise ISBNDBError('Could not fetch ISBNDB metadata. Error: '+str(err)) raise ISBNDBError('Could not fetch ISBNDB metadata. Error: '+str(err))
soup = BeautifulStoneSoup(raw, soup = BeautifulStoneSoup(raw,
@ -40,8 +39,6 @@ def fetch_metadata(url, max=100, timeout=5.):
books.extend(book_list.findAll('bookdata')) books.extend(book_list.findAll('bookdata'))
max -= 1 max -= 1
return books return books
finally:
socket.setdefaulttimeout(timeout)
class ISBNDBMetadata(MetaInformation): class ISBNDBMetadata(MetaInformation):

View File

@ -38,17 +38,16 @@ def cover_from_isbn(isbn, timeout=5., username=None, password=None):
global browser global browser
if browser is None: if browser is None:
browser = _browser() browser = _browser()
_timeout = socket.getdefaulttimeout()
socket.setdefaulttimeout(timeout)
src = None src = None
try: try:
return browser.open(OPENLIBRARY%isbn).read(), 'jpg' return browser.open(OPENLIBRARY%isbn, timeout=timeout).read(), 'jpg'
except: except:
pass # Cover not found pass # Cover not found
if username and password: if username and password:
login(username, password, force=False) login(username, password, force=False)
try: try:
src = browser.open('http://www.librarything.com/isbn/'+isbn).read().decode('utf-8', 'replace') src = browser.open('http://www.librarything.com/isbn/'+isbn,
timeout=timeout).read().decode('utf-8', 'replace')
except Exception, err: except Exception, err:
if isinstance(getattr(err, 'args', [None])[0], socket.timeout): if isinstance(getattr(err, 'args', [None])[0], socket.timeout):
err = LibraryThingError(_('LibraryThing.com timed out. Try again later.')) err = LibraryThingError(_('LibraryThing.com timed out. Try again later.'))
@ -66,8 +65,6 @@ def cover_from_isbn(isbn, timeout=5., username=None, password=None):
url = re.sub(r'_S[XY]\d+', '', url['src']) url = re.sub(r'_S[XY]\d+', '', url['src'])
cover_data = browser.open(url).read() cover_data = browser.open(url).read()
return cover_data, url.rpartition('.')[-1] return cover_data, url.rpartition('.')[-1]
finally:
socket.setdefaulttimeout(_timeout)
def option_parser(): def option_parser():
parser = OptionParser(usage=\ parser = OptionParser(usage=\

View File

@ -84,5 +84,5 @@ class MainWindow(QMainWindow):
msg = '<b>%s</b>:'%type.__name__ + unicode(str(value), 'utf8', 'replace') msg = '<b>%s</b>:'%type.__name__ + unicode(str(value), 'utf8', 'replace')
error_dialog(self, _('ERROR: Unhandled exception'), msg, det_msg=fe, error_dialog(self, _('ERROR: Unhandled exception'), msg, det_msg=fe,
show=True) show=True)
except: except BaseException:
pass pass

View File

@ -4,9 +4,9 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: calibre 0.6.5\n" "Project-Id-Version: calibre 0.6.6\n"
"POT-Creation-Date: 2009-08-10 11:28+MDT\n" "POT-Creation-Date: 2009-08-10 19:10+MDT\n"
"PO-Revision-Date: 2009-08-10 11:28+MDT\n" "PO-Revision-Date: 2009-08-10 19:10+MDT\n"
"Last-Translator: Automatically generated\n" "Last-Translator: Automatically generated\n"
"Language-Team: LANGUAGE\n" "Language-Team: LANGUAGE\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -93,8 +93,8 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:29 #: /home/kovid/work/calibre/src/calibre/ebooks/pdf/writer.py:29
#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:139 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:139
#: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:141 #: /home/kovid/work/calibre/src/calibre/ebooks/rtf/input.py:141
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:248 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:251
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:255 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:258
#: /home/kovid/work/calibre/src/calibre/gui2/add.py:91 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:91
#: /home/kovid/work/calibre/src/calibre/gui2/add.py:98 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:98
#: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:19 #: /home/kovid/work/calibre/src/calibre/gui2/convert/__init__.py:19
@ -1087,7 +1087,7 @@ msgid "Path to output file"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:290 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/lrs/convert_from.py:290
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:116 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:113
msgid "Verbose processing" msgid "Verbose processing"
msgstr "" msgstr ""
@ -1164,51 +1164,51 @@ msgstr ""
msgid "Set book ID" msgid "Set book ID"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:87 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:90
msgid "Enable autorotation of images that are wider than the screen width." msgid "Enable autorotation of images that are wider than the screen width."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:91 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:94
msgid "Set the space between words in pts. Default is %default" msgid "Set the space between words in pts. Default is %default"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:94 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:97
msgid "Add a header to all the pages with title and author." msgid "Add a header to all the pages with title and author."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:100
msgid "Set the format of the header. %a is replaced by the author and %t by the title. Default is %default" msgid "Set the format of the header. %a is replaced by the author and %t by the title. Default is %default"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:101 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:104
msgid "Add extra spacing below the header. Default is %default pt." msgid "Add extra spacing below the header. Default is %default pt."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:104 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:107
msgid "Minimum paragraph indent (the indent of the first line of a paragraph) in pts. Default: %default" msgid "Minimum paragraph indent (the indent of the first line of a paragraph) in pts. Default: %default"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:109 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:112
msgid "Render tables in the HTML as images (useful if the document has large or complex tables)" msgid "Render tables in the HTML as images (useful if the document has large or complex tables)"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:114 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:117
msgid "Multiply the size of text in rendered tables by this factor. Default is %default" msgid "Multiply the size of text in rendered tables by this factor. Default is %default"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:118 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:121
msgid "The serif family of fonts to embed" msgid "The serif family of fonts to embed"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:121 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:124
msgid "The sans-serif family of fonts to embed" msgid "The sans-serif family of fonts to embed"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:124 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:127
msgid "The monospace family of fonts to embed" msgid "The monospace family of fonts to embed"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:149 #: /home/kovid/work/calibre/src/calibre/ebooks/lrf/output.py:152
msgid "Comic" msgid "Comic"
msgstr "" msgstr ""
@ -1363,7 +1363,7 @@ msgstr ""
msgid "No cover found" msgid "No cover found"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:94
msgid "" msgid ""
"\n" "\n"
"%prog [options] key\n" "%prog [options] key\n"
@ -1376,39 +1376,39 @@ msgid ""
"\n" "\n"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:108 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:105
msgid "The ISBN ID of the book you want metadata for." msgid "The ISBN ID of the book you want metadata for."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:110 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:107
msgid "The author whose book to search for." msgid "The author whose book to search for."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:112 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:109
msgid "The title of the book to search for." msgid "The title of the book to search for."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:114 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:111
msgid "The publisher of the book to search for." msgid "The publisher of the book to search for."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:54 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:53
msgid "LibraryThing.com timed out. Try again later." msgid "LibraryThing.com timed out. Try again later."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:61 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:60
msgid "Could not fetch cover as server is experiencing high load. Please try again later." msgid "Could not fetch cover as server is experiencing high load. Please try again later."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:62 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:61
msgid " not found." msgid " not found."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:65 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:64
msgid "LibraryThing.com server error. Try again later." msgid "LibraryThing.com server error. Try again later."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:74 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/library_thing.py:71
msgid "" msgid ""
"\n" "\n"
"%prog [options] ISBN\n" "%prog [options] ISBN\n"
@ -1890,7 +1890,12 @@ msgid "Default action to perform when send to device button is clicked"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:113 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:113
msgid "Copied to clipboard" #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:396
msgid "Copied"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:142
msgid "Copy"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:142 #: /home/kovid/work/calibre/src/calibre/gui2/__init__.py:142
@ -2828,7 +2833,7 @@ msgid "Attached, you will find the e-book"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/device.py:550 #: /home/kovid/work/calibre/src/calibre/gui2/device.py:550
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:175 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:176
msgid "by" msgid "by"
msgstr "" msgstr ""
@ -2928,7 +2933,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:88 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:88
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:89 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:89
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:92 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:92
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:214 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:215
#: /home/kovid/work/calibre/src/calibre/gui2/library.py:344 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:344
#: /home/kovid/work/calibre/src/calibre/gui2/status.py:57 #: /home/kovid/work/calibre/src/calibre/gui2/status.py:57
#: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:83 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:83
@ -2968,157 +2973,161 @@ msgid "&Profile:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:169 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:169
msgid " plugins" msgid "%(plugin_type)s %(plugins)s"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:194 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:170
msgid "Conversion" msgid "plugins"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:194
msgid "General"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:194
msgid "Interface"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:195 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:195
msgid "Conversion"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:195
msgid "General"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:195
msgid "Interface"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:196
msgid "" msgid ""
"Email\n" "Email\n"
"Delivery" "Delivery"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:196 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:197
msgid "Advanced" msgid "Advanced"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:196 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:197
msgid "" msgid ""
"Content\n" "Content\n"
"Server" "Server"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:196 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:197
msgid "Plugins" msgid "Plugins"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:214 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:215
msgid "Auto send" msgid "Auto send"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:214 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:215
msgid "Email" msgid "Email"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:219 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:220
msgid "Formats to email. The first matching format will be sent." msgid "Formats to email. The first matching format will be sent."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:220 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:221
msgid "If checked, downloaded news will be automatically mailed <br>to this email address (provided it is in one of the listed formats)." msgid "If checked, downloaded news will be automatically mailed <br>to this email address (provided it is in one of the listed formats)."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:294 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:295
msgid "new email address" msgid "new email address"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:510 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:511
msgid "No valid plugin path" msgid "No valid plugin path"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:511 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:512
msgid "%s is not a valid plugin path" msgid "%s is not a valid plugin path"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:514 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:515
msgid "Choose plugin" msgid "Choose plugin"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:526 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:527
msgid "Plugin cannot be disabled" msgid "Plugin cannot be disabled"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:527 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:528
msgid "The plugin: %s cannot be disabled" msgid "The plugin: %s cannot be disabled"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:536 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:537
msgid "Plugin not customizable" msgid "Plugin not customizable"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:537 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:538
msgid "Plugin: %s does not need customization" msgid "Plugin: %s does not need customization"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:561 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:562
msgid "Customize %s" msgid "Customize %s"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:571 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:572
msgid "Cannot remove builtin plugin" msgid "Cannot remove builtin plugin"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:572 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:573
msgid " cannot be removed. It is a builtin plugin. Try disabling it instead." msgid " cannot be removed. It is a builtin plugin. Try disabling it instead."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:605 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:606
msgid "Error log:" msgid "Error log:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:612 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:613
msgid "Access log:" msgid "Access log:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:637 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:638
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:562 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:562
msgid "Failed to start content server" msgid "Failed to start content server"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:661 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:662
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:468 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:468
msgid "Select location for books" msgid "Select location for books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:678 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:679
msgid "Invalid size" msgid "Invalid size"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:679 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:680
msgid "The size %s is invalid. must be of the form widthxheight" msgid "The size %s is invalid. must be of the form widthxheight"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:724 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:725
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:729 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:730
msgid "Invalid database location" msgid "Invalid database location"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:725 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:726
msgid "Invalid database location " msgid "Invalid database location "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:726 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:727
msgid "<br>Must be a directory." msgid "<br>Must be a directory."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:730 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:731
msgid "Invalid database location.<br>Cannot write to " msgid "Invalid database location.<br>Cannot write to "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:755 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:756
msgid "Checking..." msgid "Checking..."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:756 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:757
msgid "Checking database integrity. This may take a while." msgid "Checking database integrity. This may take a while."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:769 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:770
msgid "Some inconsistencies found" msgid "Some inconsistencies found"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:770 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:771
msgid "The following books had formats listed in the database that are not actually available. The entries for the formats have been removed. You should check them manually. This can happen if you manipulate the files in the library folder directly." msgid "The following books had formats listed in the database that are not actually available. The entries for the formats have been removed. You should check them manually. This can happen if you manipulate the files in the library folder directly."
msgstr "" msgstr ""
@ -5427,10 +5436,6 @@ msgstr ""
msgid "Failed to move library" msgid "Failed to move library"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:396
msgid "Copied"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:440 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:440
msgid "Invalid database" msgid "Invalid database"
msgstr "" msgstr ""
@ -6354,50 +6359,50 @@ msgstr ""
msgid "Chinese" msgid "Chinese"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:458 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:452
msgid "" msgid ""
"%prog URL\n" "%prog URL\n"
"\n" "\n"
"Where URL is for example http://google.com" "Where URL is for example http://google.com"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:461 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:455
msgid "Base directory into which URL is saved. Default is %default" msgid "Base directory into which URL is saved. Default is %default"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:464 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:458
msgid "Timeout in seconds to wait for a response from the server. Default: %default s" msgid "Timeout in seconds to wait for a response from the server. Default: %default s"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:467 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:461
msgid "Maximum number of levels to recurse i.e. depth of links to follow. Default %default" msgid "Maximum number of levels to recurse i.e. depth of links to follow. Default %default"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:470 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:464
msgid "The maximum number of files to download. This only applies to files from <a href> tags. Default is %default" msgid "The maximum number of files to download. This only applies to files from <a href> tags. Default is %default"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:472 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:466
msgid "Minimum interval in seconds between consecutive fetches. Default is %default s" msgid "Minimum interval in seconds between consecutive fetches. Default is %default s"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:474 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:468
msgid "The character encoding for the websites you are trying to download. The default is to try and guess the encoding." msgid "The character encoding for the websites you are trying to download. The default is to try and guess the encoding."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:476 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:470
msgid "Only links that match this regular expression will be followed. This option can be specified multiple times, in which case as long as a link matches any one regexp, it will be followed. By default all links are followed." msgid "Only links that match this regular expression will be followed. This option can be specified multiple times, in which case as long as a link matches any one regexp, it will be followed. By default all links are followed."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:478 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:472
msgid "Any link that matches this regular expression will be ignored. This option can be specified multiple times, in which case as long as any regexp matches a link, it will be ignored.By default, no links are ignored. If both --filter-regexp and --match-regexp are specified, then --filter-regexp is applied first." msgid "Any link that matches this regular expression will be ignored. This option can be specified multiple times, in which case as long as any regexp matches a link, it will be ignored.By default, no links are ignored. If both --filter-regexp and --match-regexp are specified, then --filter-regexp is applied first."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:480 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:474
msgid "Do not download CSS stylesheets." msgid "Do not download CSS stylesheets."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:481 #: /home/kovid/work/calibre/src/calibre/web/fetch/simple.py:475
msgid "Show detailed output information. Useful for debugging" msgid "Show detailed output information. Useful for debugging"
msgstr "" msgstr ""

View File

@ -192,8 +192,6 @@ class Server(Thread):
if len(self.pool) + len(self.workers) < self.pool_size: if len(self.pool) + len(self.workers) < self.pool_size:
try: try:
self.pool.append(self.launch_worker()) self.pool.append(self.launch_worker())
except CriticalError:
raise
except Exception: except Exception:
pass pass

View File

@ -105,9 +105,8 @@ class RecursiveFetcher(object):
if not os.path.exists(self.base_dir): if not os.path.exists(self.base_dir):
os.makedirs(self.base_dir) os.makedirs(self.base_dir)
self.log = log self.log = log
self.default_timeout = socket.getdefaulttimeout()
socket.setdefaulttimeout(options.timeout)
self.verbose = options.verbose self.verbose = options.verbose
self.timeout = options.timeout
self.encoding = options.encoding self.encoding = options.encoding
self.browser = options.browser if hasattr(options, 'browser') else browser() self.browser = options.browser if hasattr(options, 'browser') else browser()
self.max_recursions = options.max_recursions self.max_recursions = options.max_recursions
@ -194,7 +193,7 @@ class RecursiveFetcher(object):
url = urlparse.urlunparse(purl) url = urlparse.urlunparse(purl)
with self.browser_lock: with self.browser_lock:
try: try:
with closing(self.browser.open(url)) as f: with closing(self.browser.open(url, timeout=self.timeout)) as f:
data = response(f.read()+f.read()) data = response(f.read()+f.read())
data.newurl = f.geturl() data.newurl = f.geturl()
except urllib2.URLError, err: except urllib2.URLError, err:
@ -204,7 +203,7 @@ class RecursiveFetcher(object):
getattr(getattr(err, 'args', [None])[0], 'errno', None) == -2: # Connection reset by peer or Name or service not know getattr(getattr(err, 'args', [None])[0], 'errno', None) == -2: # Connection reset by peer or Name or service not know
self.log.debug('Temporary error, retrying in 1 second') self.log.debug('Temporary error, retrying in 1 second')
time.sleep(1) time.sleep(1)
with closing(self.browser.open(url)) as f: with closing(self.browser.open(url, timeout=self.timeout)) as f:
data = response(f.read()+f.read()) data = response(f.read()+f.read())
data.newurl = f.geturl() data.newurl = f.geturl()
else: else:
@ -450,11 +449,6 @@ class RecursiveFetcher(object):
print print
return res return res
def __del__(self):
dt = getattr(self, 'default_timeout', None)
if dt is not None:
socket.setdefaulttimeout(dt)
def option_parser(usage=_('%prog URL\n\nWhere URL is for example http://google.com')): def option_parser(usage=_('%prog URL\n\nWhere URL is for example http://google.com')):
parser = OptionParser(usage=usage) parser = OptionParser(usage=usage)
parser.add_option('-d', '--base-dir', parser.add_option('-d', '--base-dir',