Sync to trunk.

This commit is contained in:
John Schember 2009-07-29 18:50:39 -04:00
commit 1286a5e600
51 changed files with 10963 additions and 9484 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.2' __version__ = '0.6.3'
__author__ = "Kovid Goyal <kovid@kovidgoyal.net>" __author__ = "Kovid Goyal <kovid@kovidgoyal.net>"
import re import re

View File

@ -27,8 +27,11 @@ every time you add an HTML file to the library.\
from calibre.ebooks.epub import initialize_container from calibre.ebooks.epub import initialize_container
with TemporaryDirectory('_plugin_html2zip') as tdir: with TemporaryDirectory('_plugin_html2zip') as tdir:
gui_convert(htmlfile, tdir, [('debug_input', tdir, recs =[('debug_input', tdir, OptionRecommendation.HIGH)]
OptionRecommendation.HIGH)]) if self.site_customization and self.site_customization.strip():
recs.append(['input_encoding', self.site_customization.strip(),
OptionRecommendation.HIGH])
gui_convert(htmlfile, tdir, recs)
of = self.temporary_file('_plugin_html2zip.zip') of = self.temporary_file('_plugin_html2zip.zip')
opf = glob.glob(os.path.join(tdir, '*.opf'))[0] opf = glob.glob(os.path.join(tdir, '*.opf'))[0]
ncx = glob.glob(os.path.join(tdir, '*.ncx')) ncx = glob.glob(os.path.join(tdir, '*.ncx'))
@ -40,6 +43,10 @@ every time you add an HTML file to the library.\
return of.name return of.name
def customization_help(self, gui=False):
return _('Character encoding for the input HTML files. Common choices '
'include: cp1252, latin1, iso-8859-1 and utf-8.')
class ComicMetadataReader(MetadataReaderPlugin): class ComicMetadataReader(MetadataReaderPlugin):

View File

@ -37,6 +37,9 @@ class CLI(object):
path = os.path.join(path, infile.name) path = os.path.join(path, infile.name)
if not replace_file and os.path.exists(path): if not replace_file and os.path.exists(path):
raise PathError('File already exists: ' + path) raise PathError('File already exists: ' + path)
d = os.path.dirname(path)
if not os.path.exists(d):
os.makedirs(d)
dest = open(path, 'wb') dest = open(path, 'wb')
shutil.copyfileobj(infile, dest, 10*1024*1024) shutil.copyfileobj(infile, dest, 10*1024*1024)
dest.flush() dest.flush()

View File

@ -14,7 +14,7 @@ from calibre.utils.config import OptionParser
from calibre.utils.logging import Log from calibre.utils.logging import Log
from calibre.constants import preferred_encoding from calibre.constants import preferred_encoding
from calibre.customize.conversion import OptionRecommendation from calibre.customize.conversion import OptionRecommendation
from calibre import patheq
USAGE = '%prog ' + _('''\ USAGE = '%prog ' + _('''\
input_file output_file [options] input_file output_file [options]
@ -220,6 +220,9 @@ def create_option_parser(args, log):
from calibre.ebooks.conversion.plumber import Plumber from calibre.ebooks.conversion.plumber import Plumber
reporter = ProgressBar(log) reporter = ProgressBar(log)
if patheq(input, output):
raise ValueError('Input file is the same as the output file')
plumber = Plumber(input, output, log, reporter) plumber = Plumber(input, output, log, reporter)
add_input_output_options(parser, plumber) add_input_output_options(parser, plumber)
add_pipeline_options(parser, plumber) add_pipeline_options(parser, plumber)

View File

@ -351,7 +351,7 @@ OptionRecommendation(name='read_metadata_from_opf',
OptionRecommendation(name='asciiize', OptionRecommendation(name='asciiize',
recommended_value=False, level=OptionRecommendation.LOW, recommended_value=False, level=OptionRecommendation.LOW,
help=(_('Transliterate unicode characters to an ASCII ' help=(_('Transliterate unicode characters to an ASCII '
'representation. Use with care because this will remove replace ' 'representation. Use with care because this will replace '
'unicode characters with ASCII. For instance it will replace "%s" ' 'unicode characters with ASCII. For instance it will replace "%s" '
'with "Mikhail Gorbachiov". Also, note that in ' 'with "Mikhail Gorbachiov". Also, note that in '
'cases where there are multiple representations of a character ' 'cases where there are multiple representations of a character '

View File

@ -21,6 +21,7 @@ from calibre.utils.podofo import get_metadata as podofo_get_metadata, \
set_metadata as podofo_set_metadata, Unavailable, get_metadata_quick set_metadata as podofo_set_metadata, Unavailable, get_metadata_quick
def get_quick_metadata(stream): def get_quick_metadata(stream):
return get_metadata_pypdf(stream)
raw = stream.read() raw = stream.read()
mi = get_metadata_quick(raw) mi = get_metadata_quick(raw)
if mi.title == '_': if mi.title == '_':

View File

@ -411,6 +411,8 @@ class Style(object):
result = size result = size
else: else:
result = self._unit_convert(value, base=base, font=base) result = self._unit_convert(value, base=base, font=base)
if not isinstance(result, (int, float, long)):
return base
if result < 0: if result < 0:
result = normalize_fontsize("smaller", base) result = normalize_fontsize("smaller", base)
if factor: if factor:

View File

@ -275,7 +275,7 @@ class CSSFlattener(object):
items = cssdict.items() items = cssdict.items()
items.sort() items.sort()
css = u';\n'.join(u'%s: %s' % (key, val) for key, val in items) css = u';\n'.join(u'%s: %s' % (key, val) for key, val in items)
classes = node.get('class', None) or 'calibre' classes = node.get('class', '').strip() or 'calibre'
klass = STRIPNUM.sub('', classes.split()[0].replace('_', '')) klass = STRIPNUM.sub('', classes.split()[0].replace('_', ''))
if css in styles: if css in styles:
match = styles[css] match = styles[css]

View File

@ -1,7 +1,7 @@
''' '''
UI for adding books to the database and saving books to disk UI for adding books to the database and saving books to disk
''' '''
import os import os, shutil
from Queue import Queue, Empty from Queue import Queue, Empty
from PyQt4.Qt import QThread, SIGNAL, QObject, QTimer, Qt from PyQt4.Qt import QThread, SIGNAL, QObject, QTimer, Qt
@ -167,6 +167,15 @@ class Adder(QObject):
self.add_formats(id, formats) self.add_formats(id, formats)
self.number_of_books_added += 1 self.number_of_books_added += 1
def cleanup(self):
if hasattr(self, 'worker') and hasattr(self.worker, 'tdir') and \
self.worker.tdir is not None:
if os.path.exists(self.worker.tdir):
try:
shutil.rmtree(self.worker.tdir)
except:
pass
class Saver(QObject): class Saver(QObject):
def __init__(self, parent, db, callback, rows, path, def __init__(self, parent, db, callback, rows, path,

View File

@ -7,7 +7,7 @@ from PyQt4.Qt import QDialog, QMessageBox, QListWidgetItem, QIcon, \
QStringListModel, QAbstractItemModel, QFont, \ QStringListModel, QAbstractItemModel, QFont, \
SIGNAL, QTimer, Qt, QSize, QVariant, QUrl, \ SIGNAL, QTimer, Qt, QSize, QVariant, QUrl, \
QModelIndex, QInputDialog, QAbstractTableModel, \ QModelIndex, QInputDialog, QAbstractTableModel, \
QDialogButtonBox, QTabWidget, QBrush QDialogButtonBox, QTabWidget, QBrush, QLineEdit
from calibre.constants import islinux, iswindows from calibre.constants import islinux, iswindows
from calibre.gui2.dialogs.config_ui import Ui_Dialog from calibre.gui2.dialogs.config_ui import Ui_Dialog
@ -553,10 +553,14 @@ class ConfigDialog(QDialog, Ui_Dialog):
self._plugin_model.refresh_plugin(plugin) self._plugin_model.refresh_plugin(plugin)
else: else:
help = plugin.customization_help() help = plugin.customization_help()
sc = plugin_customization(plugin)
if not sc:
sc = ''
sc = sc.strip()
text, ok = QInputDialog.getText(self, _('Customize %s')%plugin.name, text, ok = QInputDialog.getText(self, _('Customize %s')%plugin.name,
help) help, QLineEdit.Normal, sc)
if ok: if ok:
customize_plugin(plugin, unicode(text)) customize_plugin(plugin, unicode(text).strip())
self._plugin_model.refresh_plugin(plugin) self._plugin_model.refresh_plugin(plugin)
if op == 'remove': if op == 'remove':
if remove_plugin(plugin): if remove_plugin(plugin):

View File

@ -418,13 +418,16 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
try: try:
db = LibraryDatabase2(self.library_path) db = LibraryDatabase2(self.library_path)
except Exception, err: except Exception, err:
import traceback
error_dialog(self, _('Bad database location'), error_dialog(self, _('Bad database location'),
unicode(err)).exec_() _('Bad database location')+':'+self.library_path,
det_msg=traceback.format_exc()).exec_()
dir = unicode(QFileDialog.getExistingDirectory(self, dir = unicode(QFileDialog.getExistingDirectory(self,
_('Choose a location for your ebook library.'), _('Choose a location for your ebook library.'),
os.path.expanduser('~'))) os.path.expanduser('~')))
if not dir: if not dir:
QCoreApplication.exit(1) QCoreApplication.exit(1)
raise SystemExit(1)
else: else:
self.library_path = dir self.library_path = dir
db = LibraryDatabase2(self.library_path) db = LibraryDatabase2(self.library_path)
@ -520,6 +523,11 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
@property @property
def spare_server(self): def spare_server(self):
# Because of the use of the property decorator, we're called one
# extra time. Ignore.
if not hasattr(self, '__spare_server_property_limiter'):
self.__spare_server_property_limiter = True
return None
try: try:
QTimer.singleShot(1000, self.add_spare_server) QTimer.singleShot(1000, self.add_spare_server)
return self.spare_servers.pop() return self.spare_servers.pop()
@ -870,6 +878,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
_('Failed to read metadata from the following')+':', _('Failed to read metadata from the following')+':',
det_msg='\n\n'.join(det_msg), show=True) det_msg='\n\n'.join(det_msg), show=True)
self._adder.cleanup()
self._adder = None self._adder = None

View File

@ -287,6 +287,7 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
self.set_max_width() self.set_max_width()
ca = self.view.copy_action ca = self.view.copy_action
ca.setShortcut(QKeySequence.Copy) ca.setShortcut(QKeySequence.Copy)
self.addAction(ca)
def set_max_width(self): def set_max_width(self):

View File

@ -219,7 +219,7 @@ class KindlePage(QWizardPage, KindleUI):
if self.send_email_widget.set_email_settings(True): if self.send_email_widget.set_email_settings(True):
conf = smtp_prefs() conf = smtp_prefs()
accounts = conf.get('accounts', {}) accounts = conf.parse().accounts
if not accounts: accounts = {} if not accounts: accounts = {}
for y in accounts.values(): for y in accounts.values():
y[2] = False y[2] = False
@ -494,6 +494,9 @@ class FinishPage(QWizardPage, FinishUI):
def nextId(self): def nextId(self):
return -1 return -1
def commit(self):
pass
class Wizard(QWizard): class Wizard(QWizard):
@ -536,7 +539,11 @@ class Wizard(QWizard):
def accept(self): def accept(self):
self.device_page.commit() pages = map(self.page, self.visitedPages())
for page in pages:
if page is not self.library_page:
page.commit()
if not self.library_page.commit(self.completed): if not self.library_page.commit(self.completed):
self.completed(None) self.completed(None)

View File

@ -147,10 +147,10 @@ def setup_completion(fatal_errors):
from calibre.utils.smtp import option_parser as smtp_op from calibre.utils.smtp import option_parser as smtp_op
any_formats = ['epub', 'htm', 'html', 'xhtml', 'xhtm', 'rar', 'zip', any_formats = ['epub', 'htm', 'html', 'xhtml', 'xhtm', 'rar', 'zip',
'txt', 'lit', 'rtf', 'pdf', 'prc', 'mobi', 'fb2', 'odt'] 'txt', 'lit', 'rtf', 'pdf', 'prc', 'mobi', 'fb2', 'odt']
f = open_file('/etc/bash_completion.d/libprs500') if os.path.exists('/usr/share/bash-completion'):
f.close() f = open_file('/usr/share/bash-completion/calibre')
os.remove(f.name) else:
f = open_file('/etc/bash_completion.d/calibre') f = open_file('/etc/bash_completion.d/calibre')
manifest.append(f.name) manifest.append(f.name)
f.write('# calibre Bash Shell Completion\n') f.write('# calibre Bash Shell Completion\n')

View File

@ -57,8 +57,9 @@ Then just add this HTML file to the GUI and use the convert button to create you
How do I convert my file containing non-English characters? How do I convert my file containing non-English characters?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
There are two aspects to this problem: There are two aspects to this problem:
1. Knowing the encoding of the source file: |app| tries to guess what character encoding your source files use, but often, this is impossible, so you need to tell it what encoding to use. This can be done in the GUI via the :guilabel:`Source encoding` field in the :guilabel:`Look & Feel` section. The command-line tools all have an :option:`--encoding` option. 1. Knowing the encoding of the source file: |app| tries to guess what character encoding your source files use, but often, this is impossible, so you need to tell it what encoding to use. This can be done in the GUI via the :guilabel:`Input character encoding` field in the :guilabel:`Look & Feel` section. The command-line tools all have an :option:`--input-encoding` option.
2. Embedding fonts: If you are generating an LRF file to read on your SONY Reader, you are limited by the fact that the Reader only supports a few non-English characters in the fonts it comes pre-loaded with. You can work around this problem by embedding a unicode-aware font that supports the character set your file uses into the LRF file. You should embed atleast a serif and a sans-serif font. Be aware that embedding fonts significantly slows down page-turn speed on the reader. 2. When adding HTML files to |app|, you may need to tell |app| what encoding the files are in. To do this go to Preferences->Plugins->File Type plugins and customize the HTML2Zip plugin, telling it what encoding your HTML files are in. |app| will then automatically convert the HTML files into the UTF-8 encoding when adding them.
3. Embedding fonts: If you are generating an LRF file to read on your SONY Reader, you are limited by the fact that the Reader only supports a few non-English characters in the fonts it comes pre-loaded with. You can work around this problem by embedding a unicode-aware font that supports the character set your file uses into the LRF file. You should embed atleast a serif and a sans-serif font. Be aware that embedding fonts significantly slows down page-turn speed on the reader.
How do I use some of the advanced features of the conversion tools? How do I use some of the advanced features of the conversion tools?

View File

@ -91,6 +91,10 @@ sudo python -c "import urllib2; exec urllib2.urlopen('http://calibre.kovidgoyal.
You must have xdg-utils installed You must have xdg-utils installed
on your system before running the installer. on your system before running the installer.
</li> </li>
<li>
For device automounting to work, you must have the pmount
package installed on your system.
</li>
<li> <li>
On a 64bit machine, you must have 32-bit versions On a 64bit machine, you must have 32-bit versions
of common libraries like X11, freetype, fontconfig, of common libraries like X11, freetype, fontconfig,

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -4,9 +4,9 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: calibre 0.6.2\n" "Project-Id-Version: calibre 0.6.3\n"
"POT-Creation-Date: 2009-07-27 15:35+MDT\n" "POT-Creation-Date: 2009-07-29 16:21+MDT\n"
"PO-Revision-Date: 2009-07-27 15:35+MDT\n" "PO-Revision-Date: 2009-07-29 16:21+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"
@ -52,8 +52,8 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:444 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:444
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:870 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:870
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:27 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:28
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:65 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:66
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/topaz.py:29 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/topaz.py:29
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txt.py:14 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/txt.py:14
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:44 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:44
@ -159,46 +159,50 @@ msgstr ""
msgid "Follow all local links in an HTML file and create a ZIP file containing all linked files. This plugin is run every time you add an HTML file to the library." msgid "Follow all local links in an HTML file and create a ZIP file containing all linked files. This plugin is run every time you add an HTML file to the library."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:48 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:47
msgid "Character encoding for the input HTML files. Common choices include: cp1252, latin1, iso-8859-1 and utf-8."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:55
msgid "Extract cover from comic files" msgid "Extract cover from comic files"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:69 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:76
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:79 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:86
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:89 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:96
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:99 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:106
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:110 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:117
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:120 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:127
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:130 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:137
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:140 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:147
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:150 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:157
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:160 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:167
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:171 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:178
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:182 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:189
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:204 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:211
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:215 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:222
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:225 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:232
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:235 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:242
msgid "Read metadata from %s files" msgid "Read metadata from %s files"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:194 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:201
msgid "Read metadata from ebooks in RAR archives" msgid "Read metadata from ebooks in RAR archives"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:246 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:253
msgid "Read metadata from ebooks in ZIP archives" msgid "Read metadata from ebooks in ZIP archives"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:257 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:264
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:267 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:274
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:277 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:284
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:299 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:306
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:310 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:317
msgid "Set metadata in %s files" msgid "Set metadata in %s files"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:288 #: /home/kovid/work/calibre/src/calibre/customize/builtins.py:295
msgid "Set metadata from %s files" msgid "Set metadata from %s files"
msgstr "" msgstr ""
@ -688,7 +692,7 @@ msgstr ""
msgid "List builtin recipes" msgid "List builtin recipes"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:246 #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:249
msgid "Output saved to" msgid "Output saved to"
msgstr "" msgstr ""
@ -837,7 +841,7 @@ msgid "Read metadata from the specified OPF file. Metadata read from this file w
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:353 #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:353
msgid "Transliterate unicode characters to an ASCII representation. Use with care because this will remove replace unicode characters with ASCII. For instance it will replace \"%s\" with \"Mikhail Gorbachiov\". Also, note that in cases where there are multiple representations of a character (characters shared by Chinese and Japanese for instance) the representation used by the largest number of people will be used (Chinese in the previous example)." msgid "Transliterate unicode characters to an ASCII representation. Use with care because this will replace unicode characters with ASCII. For instance it will replace \"%s\" with \"Mikhail Gorbachiov\". Also, note that in cases where there are multiple representations of a character (characters shared by Chinese and Japanese for instance) the representation used by the largest number of people will be used (Chinese in the previous example)."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:368 #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/plumber.py:368
@ -1904,11 +1908,11 @@ msgstr ""
msgid "Books with the same title as the following already exist in the database. Add them anyway?" msgid "Books with the same title as the following already exist in the database. Add them anyway?"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/add.py:176 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:185
msgid "Saving..." msgid "Saving..."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/add.py:228 #: /home/kovid/work/calibre/src/calibre/gui2/add.py:237
msgid "Saved" msgid "Saved"
msgstr "" msgstr ""
@ -3030,66 +3034,66 @@ msgstr ""
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:556 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:560
msgid "Customize %s" msgid "Customize %s"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:566 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:570
msgid "Cannot remove builtin plugin" msgid "Cannot remove builtin plugin"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:567 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:571
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:600 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:604
msgid "Error log:" msgid "Error log:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:607 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:611
msgid "Access log:" msgid "Access log:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:632 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:636
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:554 #: /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:656 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:660
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:460 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:460
msgid "Select location for books" msgid "Select location for books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:673 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:677
msgid "Invalid size" msgid "Invalid size"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:674 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:678
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:719 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:723
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:724 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:728
msgid "Invalid database location" msgid "Invalid database location"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:720 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:724
msgid "Invalid database location " msgid "Invalid database location "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:721 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:725
msgid "<br>Must be a directory." msgid "<br>Must be a directory."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:725 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:729
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:739 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:743
msgid "Compacting..." msgid "Compacting..."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:740 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:744
msgid "Compacting database. This may take a while." msgid "Compacting database. This may take a while."
msgstr "" msgstr ""
@ -4442,7 +4446,7 @@ msgid "<b>No matches</b> for the search phrase <i>%s</i> were found."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:157 #: /home/kovid/work/calibre/src/calibre/gui2/lrf_renderer/main.py:157
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:416 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:417
msgid "No matches found" msgid "No matches found"
msgstr "" msgstr ""
@ -4494,7 +4498,7 @@ msgid "Save single format to disk..."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:138 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:138
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:984 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:993
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:49 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:49
msgid "Error" msgid "Error"
msgstr "" msgstr ""
@ -4569,7 +4573,7 @@ msgid "Save to disk in a single directory"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:278 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:278
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1457 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1466
msgid "Save only %s format to disk" msgid "Save only %s format to disk"
msgstr "" msgstr ""
@ -4598,36 +4602,37 @@ msgstr ""
msgid "Similar books..." msgid "Similar books..."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:421 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:422
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:423
msgid "Bad database location" msgid "Bad database location"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:424 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:426
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1585 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1594
msgid "Choose a location for your ebook library." msgid "Choose a location for your ebook library."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:597 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:605
msgid "Browse by covers" msgid "Browse by covers"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:704 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:712
msgid "Device: " msgid "Device: "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:706 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:714
msgid " detected." msgid " detected."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:728 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:736
msgid "Connected " msgid "Connected "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:740 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:748
msgid "Device database corrupted" msgid "Device database corrupted"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:741 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:749
msgid "" msgid ""
"\n" "\n"
" <p>The database of books on the reader is corrupted. Try the following:\n" " <p>The database of books on the reader is corrupted. Try the following:\n"
@ -4638,301 +4643,301 @@ msgid ""
" " " "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:817 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:825
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:860 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:868
msgid "Uploading books to device." msgid "Uploading books to device."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:825 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:833
msgid "Books" msgid "Books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:826 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:834
msgid "EPUB Books" msgid "EPUB Books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:827 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:835
msgid "LRF Books" msgid "LRF Books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:828 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:836
msgid "HTML Books" msgid "HTML Books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:829 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:837
msgid "LIT Books" msgid "LIT Books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:830 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:838
msgid "MOBI Books" msgid "MOBI Books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:831 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:839
msgid "Text books" msgid "Text books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:832 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:840
msgid "PDF Books" msgid "PDF Books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:833 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:841
msgid "Comics" msgid "Comics"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:834 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:842
msgid "Archives" msgid "Archives"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:869 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:877
msgid "Failed to read metadata" msgid "Failed to read metadata"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:870 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:878
msgid "Failed to read metadata from the following" msgid "Failed to read metadata from the following"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:888 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:897
msgid "The selected books will be <b>permanently deleted</b> and the files removed from your computer. Are you sure?" msgid "The selected books will be <b>permanently deleted</b> and the files removed from your computer. Are you sure?"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:915 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:924
msgid "Deleting books from device." msgid "Deleting books from device."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:946 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:955
msgid "Cannot download metadata" msgid "Cannot download metadata"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:947 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:956
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:995 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1004
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1025 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1034
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1050 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1059
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1181 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1190
msgid "No books selected" msgid "No books selected"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:956 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:965
msgid "covers" msgid "covers"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:956 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:965
msgid "metadata" msgid "metadata"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:958 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:967
msgid "Downloading %s for %d book(s)" msgid "Downloading %s for %d book(s)"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:979 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:988
msgid "Failed to download some metadata" msgid "Failed to download some metadata"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:980 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:989
msgid "Failed to download metadata for the following:" msgid "Failed to download metadata for the following:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:983 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:992
msgid "Failed to download metadata:" msgid "Failed to download metadata:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:994 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1003
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1024 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1033
msgid "Cannot edit metadata" msgid "Cannot edit metadata"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1049 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1058
msgid "Cannot save to disk" msgid "Cannot save to disk"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1052 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1061
msgid "Choose destination directory" msgid "Choose destination directory"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1075 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1084
msgid "Error while saving" msgid "Error while saving"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1076 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1085
msgid "There was an error while saving." msgid "There was an error while saving."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1080 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1089
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1081 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1090
msgid "Could not save some books" msgid "Could not save some books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1082 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1091
msgid "as the %s format is not available for them." msgid "as the %s format is not available for them."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1083 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1092
msgid "Click the show details button to see which ones." msgid "Click the show details button to see which ones."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1102 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1111
msgid "Fetching news from " msgid "Fetching news from "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1115 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1124
msgid " fetched." msgid " fetched."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1180 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1189
msgid "Cannot convert" msgid "Cannot convert"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1350 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1359
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1369 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1378
msgid "No book selected" msgid "No book selected"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1350 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1359
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1402 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1411
msgid "Cannot view" msgid "Cannot view"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1356 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1365
msgid "Choose the format to view" msgid "Choose the format to view"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1368 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1377
msgid "Cannot open folder" msgid "Cannot open folder"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1385 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1394
msgid "Multiple Books Selected" msgid "Multiple Books Selected"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1386 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1395
msgid "You are attempting to open %d books. Opening too many books at once can be slow and have a negative effect on the responsiveness of your computer. Once started the process cannot be stopped until complete. Do you wish to continue?" msgid "You are attempting to open %d books. Opening too many books at once can be slow and have a negative effect on the responsiveness of your computer. Once started the process cannot be stopped until complete. Do you wish to continue?"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1403 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1412
msgid "%s has no available formats." msgid "%s has no available formats."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1441 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1450
msgid "Cannot configure" msgid "Cannot configure"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1442 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1451
msgid "Cannot configure while there are running jobs." msgid "Cannot configure while there are running jobs."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1486 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1495
msgid "No detailed info available" msgid "No detailed info available"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1487 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1496
msgid "No detailed information is available for books on the device." msgid "No detailed information is available for books on the device."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1535 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1544
msgid "Error talking to device" msgid "Error talking to device"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1536 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1545
msgid "There was a temporary error talking to the device. Please unplug and reconnect the device and or reboot." msgid "There was a temporary error talking to the device. Please unplug and reconnect the device and or reboot."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1553 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1562
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1568 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1577
msgid "Conversion Error" msgid "Conversion Error"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1554 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1563
msgid "<p>Could not convert: %s<p>It is a <a href=\"%s\">DRM</a>ed book. You must first remove the DRM using 3rd party tools." msgid "<p>Could not convert: %s<p>It is a <a href=\"%s\">DRM</a>ed book. You must first remove the DRM using 3rd party tools."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1569 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1578
msgid "<b>Failed</b>" msgid "<b>Failed</b>"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1594 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1603
msgid "Invalid library location" msgid "Invalid library location"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1595 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1604
msgid "Could not access %s. Using %s as the library." msgid "Could not access %s. Using %s as the library."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1643 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1652
msgid "is the result of the efforts of many volunteers from all over the world. If you find it useful, please consider donating to support its development." msgid "is the result of the efforts of many volunteers from all over the world. If you find it useful, please consider donating to support its development."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1667 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1676
msgid "There are active jobs. Are you sure you want to quit?" msgid "There are active jobs. Are you sure you want to quit?"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1670 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1679
msgid "" msgid ""
" is communicating with the device!<br>\n" " is communicating with the device!<br>\n"
" Quitting may cause corruption on the device.<br>\n" " Quitting may cause corruption on the device.<br>\n"
" Are you sure you want to quit?" " Are you sure you want to quit?"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1674 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1683
msgid "WARNING: Active jobs" msgid "WARNING: Active jobs"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1725 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1734
msgid "will keep running in the system tray. To close it, choose <b>Quit</b> in the context menu of the system tray." msgid "will keep running in the system tray. To close it, choose <b>Quit</b> in the context menu of the system tray."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1744 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1753
msgid "<span style=\"color:red; font-weight:bold\">Latest version: <a href=\"%s\">%s</a></span>" msgid "<span style=\"color:red; font-weight:bold\">Latest version: <a href=\"%s\">%s</a></span>"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1752 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1761
msgid "Update available" msgid "Update available"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1753 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1762
msgid "%s has been updated to version %s. See the <a href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. Visit the download page?" msgid "%s has been updated to version %s. See the <a href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. Visit the download page?"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1771 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1780
msgid "Use the library located at the specified path." msgid "Use the library located at the specified path."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1773 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1782
msgid "Start minimized to system tray." msgid "Start minimized to system tray."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1775 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1784
msgid "Log debugging information to console" msgid "Log debugging information to console"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1823 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1832
msgid "If you are sure it is not running" msgid "If you are sure it is not running"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1825 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1834
msgid "Cannot Start " msgid "Cannot Start "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1826 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1835
msgid "%s is already running." msgid "%s is already running."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1829 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1838
msgid "may be running in the system tray, in the" msgid "may be running in the system tray, in the"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1831 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1840
msgid "upper right region of the screen." msgid "upper right region of the screen."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1833 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1842
msgid "lower right region of the screen." msgid "lower right region of the screen."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1836 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1845
msgid "try rebooting your computer." msgid "try rebooting your computer."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1838 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1847
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1858 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1867
msgid "try deleting the file" msgid "try deleting the file"
msgstr "" msgstr ""
@ -5274,7 +5279,7 @@ msgid "Options to customize the ebook viewer"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:59 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:59
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:645 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:646
msgid "Remember last used window size" msgid "Remember last used window size"
msgstr "" msgstr ""
@ -5351,67 +5356,67 @@ msgstr ""
msgid "Print Preview" msgid "Print Preview"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:376 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:377
msgid "Choose ebook" msgid "Choose ebook"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:377 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:378
msgid "Ebooks" msgid "Ebooks"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:396 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:397
msgid "Add bookmark" msgid "Add bookmark"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:396 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:397
msgid "Enter title for bookmark:" msgid "Enter title for bookmark:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:417 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:418
msgid "No matches found for: %s" msgid "No matches found for: %s"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:457 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:458
msgid "Loading flow..." msgid "Loading flow..."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:484 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:485
msgid "Laying out %s" msgid "Laying out %s"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:513 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:514
msgid "Manage Bookmarks" msgid "Manage Bookmarks"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:548 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:549
msgid "Loading ebook..." msgid "Loading ebook..."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:556 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:557
msgid "DRM Error" msgid "DRM Error"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:557 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:558
msgid "<p>This book is protected by <a href=\"%s\">DRM</a>" msgid "<p>This book is protected by <a href=\"%s\">DRM</a>"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:561 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:562
msgid "Could not open ebook" msgid "Could not open ebook"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:635 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:636
msgid "Options to control the ebook viewer" msgid "Options to control the ebook viewer"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:642 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:643
msgid "If specified, viewer window will try to come to the front when started." msgid "If specified, viewer window will try to come to the front when started."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:647 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:648
msgid "Print javascript alert and console messages to the console" msgid "Print javascript alert and console messages to the console"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:653 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:654
msgid "" msgid ""
"%prog [options] file\n" "%prog [options] file\n"
"\n" "\n"
@ -5578,7 +5583,7 @@ msgstr ""
msgid "Could not move library" msgid "Could not move library"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:503 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:506
msgid "welcome wizard" msgid "welcome wizard"
msgstr "" msgstr ""
@ -6458,7 +6463,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_jb_online.py:47 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_jb_online.py:47
#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_o_globo.py:69 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_o_globo.py:69
#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_publico.py:20 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_publico.py:20
msgid "Portugese" msgid "Portuguese"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_h1.py:15 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_h1.py:15
@ -6484,7 +6489,7 @@ msgstr ""
msgid "Kovid Goyal and Sujata Raman" msgid "Kovid Goyal and Sujata Raman"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_zaobao.py:19 #: /home/kovid/work/calibre/src/calibre/web/feeds/recipes/recipe_zaobao.py:17
msgid "Chinese" msgid "Chinese"
msgstr "" msgstr ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -10,18 +10,17 @@ import re
from calibre.web.feeds.news import BasicNewsRecipe from calibre.web.feeds.news import BasicNewsRecipe
class ESPN(BasicNewsRecipe): class ESPN(BasicNewsRecipe):
title = 'ESPN' title = 'ESPN'
description = 'Sports news' description = 'Sports news'
__author__ = 'Kovid Goyal' __author__ = 'Kovid Goyal'
language = _('English') language = _('English')
needs_subscription = True needs_subscription = True
remove_tags = [dict(name='font', attrs={'class':'footer'}), dict(name='hr', noshade='noshade')] remove_tags = [dict(name='font', attrs={'class':'footer'}), dict(name='hr', noshade='noshade')]
remove_tags_before = dict(name='font', attrs={'class':'date'}) remove_tags_before = dict(name='font', attrs={'class':'date'})
center_navbar = False center_navbar = False
html2lrf_options = ['--base-font-size', '0']
feeds = [('Top Headlines', 'http://sports.espn.go.com/espn/rss/news'), feeds = [('Top Headlines', 'http://sports.espn.go.com/espn/rss/news'),
'http://sports.espn.go.com/espn/rss/nfl/news', 'http://sports.espn.go.com/espn/rss/nfl/news',
'http://sports.espn.go.com/espn/rss/nba/news', 'http://sports.espn.go.com/espn/rss/nba/news',
@ -39,37 +38,37 @@ class ESPN(BasicNewsRecipe):
'http://sports.espn.go.com/espn/rss/bassmaster/news', 'http://sports.espn.go.com/espn/rss/bassmaster/news',
'http://sports.espn.go.com/espn/rss/oly/news', 'http://sports.espn.go.com/espn/rss/oly/news',
'http://sports.espn.go.com/espn/rss/horse/news'] 'http://sports.espn.go.com/espn/rss/horse/news']
def get_browser(self): def get_browser(self):
br = BasicNewsRecipe.get_browser() br = BasicNewsRecipe.get_browser()
br.set_handle_refresh(False) br.set_handle_refresh(False)
if self.username is not None and self.password is not None: if self.username is not None and self.password is not None:
br.open('http://espn.com') br.open('http://espn.com')
br.select_form(nr=0) br.select_form(nr=1)
br.form.find_control(name='username', type='text').value = self.username br.form.find_control(name='username', type='text').value = self.username
br.form['password'] = self.password br.form['password'] = self.password
br.submit() br.submit()
br.set_handle_refresh(True) br.set_handle_refresh(True)
return br return br
def print_version(self, url): def print_version(self, url):
if 'eticket' in url: if 'eticket' in url:
return url.partition('&')[0].replace('story?', 'print?') return url.partition('&')[0].replace('story?', 'print?')
match = re.search(r'story\?(id=\d+)', url) match = re.search(r'story\?(id=\d+)', url)
if match: if match:
return 'http://sports.espn.go.com/espn/print?'+match.group(1)+'&type=story' return 'http://sports.espn.go.com/espn/print?'+match.group(1)+'&type=story'
return None return None
def preprocess_html(self, soup): def preprocess_html(self, soup):
for div in soup.findAll('div'): for div in soup.findAll('div'):
if div.has_key('style') and 'px' in div['style']: if div.has_key('style') and 'px' in div['style']:
div['style'] = '' div['style'] = ''
return soup return soup
def postprocess_html(self, soup, first_fetch): def postprocess_html(self, soup, first_fetch):
for div in soup.findAll('div', style=True): for div in soup.findAll('div', style=True):
div['style'] = div['style'].replace('center', 'left') div['style'] = div['style'].replace('center', 'left')
return soup return soup

View File

@ -1,62 +1,62 @@
#!/usr/bin/env python #!/usr/bin/env python
__license__ = 'GPL v3' __license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>' __copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
''' '''
estadao.com.br estadao.com.br
''' '''
from calibre.web.feeds.news import BasicNewsRecipe from calibre.web.feeds.news import BasicNewsRecipe
class Estadao(BasicNewsRecipe): class Estadao(BasicNewsRecipe):
title = 'O Estado de S. Paulo' title = 'O Estado de S. Paulo'
__author__ = 'Darko Miletic' __author__ = 'Darko Miletic'
description = 'News from Brasil in Portugese' description = 'News from Brasil in Portuguese'
publisher = 'O Estado de S. Paulo' publisher = 'O Estado de S. Paulo'
category = 'news, politics, Brasil' category = 'news, politics, Brasil'
oldest_article = 2 oldest_article = 2
max_articles_per_feed = 100 max_articles_per_feed = 100
no_stylesheets = True no_stylesheets = True
use_embedded_content = False use_embedded_content = False
encoding = 'utf8' encoding = 'utf8'
cover_url = 'http://www.estadao.com.br/img/logo_estadao.png' cover_url = 'http://www.estadao.com.br/img/logo_estadao.png'
remove_javascript = True remove_javascript = True
html2lrf_options = [ html2lrf_options = [
'--comment', description '--comment', description
, '--category', category , '--category', category
, '--publisher', publisher , '--publisher', publisher
] ]
html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"' html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"'
keep_only_tags = [dict(name='div', attrs={'id':'c1'})] keep_only_tags = [dict(name='div', attrs={'id':'c1'})]
remove_tags = [ remove_tags = [
dict(name=['script','object','form','ul']) dict(name=['script','object','form','ul'])
,dict(name='div', attrs={'id':['votacao','estadaohoje']}) ,dict(name='div', attrs={'id':['votacao','estadaohoje']})
,dict(name='p', attrs={'id':'ctrl_texto'}) ,dict(name='p', attrs={'id':'ctrl_texto'})
,dict(name='p', attrs={'class':'texto'}) ,dict(name='p', attrs={'class':'texto'})
] ]
feeds = [ feeds = [
(u'Manchetes Estadao', u'http://www.estadao.com.br/rss/manchetes.xml') (u'Manchetes Estadao', u'http://www.estadao.com.br/rss/manchetes.xml')
,(u'Ultimas noticias', u'http://www.estadao.com.br/rss/ultimas.xml') ,(u'Ultimas noticias', u'http://www.estadao.com.br/rss/ultimas.xml')
,(u'Nacional', u'http://www.estadao.com.br/rss/nacional.xml') ,(u'Nacional', u'http://www.estadao.com.br/rss/nacional.xml')
,(u'Internacional', u'http://www.estadao.com.br/rss/internacional.xml') ,(u'Internacional', u'http://www.estadao.com.br/rss/internacional.xml')
,(u'Cidades', u'http://www.estadao.com.br/rss/cidades.xml') ,(u'Cidades', u'http://www.estadao.com.br/rss/cidades.xml')
,(u'Esportes', u'http://www.estadao.com.br/rss/esportes.xml') ,(u'Esportes', u'http://www.estadao.com.br/rss/esportes.xml')
,(u'Arte & Lazer', u'http://www.estadao.com.br/rss/arteelazer.xml') ,(u'Arte & Lazer', u'http://www.estadao.com.br/rss/arteelazer.xml')
,(u'Economia', u'http://www.estadao.com.br/rss/economia.xml') ,(u'Economia', u'http://www.estadao.com.br/rss/economia.xml')
,(u'Vida &', u'http://www.estadao.com.br/rss/vidae.xml') ,(u'Vida &', u'http://www.estadao.com.br/rss/vidae.xml')
] ]
def preprocess_html(self, soup): def preprocess_html(self, soup):
ifr = soup.find('iframe') ifr = soup.find('iframe')
if ifr: if ifr:
ifr.extract() ifr.extract()
for item in soup.findAll(style=True): for item in soup.findAll(style=True):
del item['style'] del item['style']
return soup return soup
language = _('Portugese') language = _('Portuguese')

View File

@ -1,47 +1,47 @@
#!/usr/bin/env python #!/usr/bin/env python
__license__ = 'GPL v3' __license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>' __copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
''' '''
jbonline.terra.com.br jbonline.terra.com.br
''' '''
from calibre.web.feeds.news import BasicNewsRecipe from calibre.web.feeds.news import BasicNewsRecipe
class JBOnline(BasicNewsRecipe): class JBOnline(BasicNewsRecipe):
title = 'Jornal Brasileiro Online' title = 'Jornal Brasileiro Online'
__author__ = 'Darko Miletic' __author__ = 'Darko Miletic'
description = 'News from Brasil' description = 'News from Brasil'
publisher = 'Jornal Brasileiro' publisher = 'Jornal Brasileiro'
category = 'news, politics, Brasil' category = 'news, politics, Brasil'
oldest_article = 2 oldest_article = 2
max_articles_per_feed = 100 max_articles_per_feed = 100
no_stylesheets = True no_stylesheets = True
use_embedded_content = False use_embedded_content = False
encoding = 'cp1252' encoding = 'cp1252'
cover_url = 'http://jbonline.terra.com.br/img/logo_01.gif' cover_url = 'http://jbonline.terra.com.br/img/logo_01.gif'
remove_javascript = True remove_javascript = True
html2lrf_options = [ html2lrf_options = [
'--comment', description '--comment', description
, '--category', category , '--category', category
, '--publisher', publisher , '--publisher', publisher
] ]
html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"' html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"'
keep_only_tags = [dict(name='div', attrs={'id':'corpoNoticia'})] keep_only_tags = [dict(name='div', attrs={'id':'corpoNoticia'})]
remove_tags = [dict(name=['script','object','form'])] remove_tags = [dict(name=['script','object','form'])]
feeds = [(u'Todos as editorias', u'http://jbonline.terra.com.br/extra/rsstrjb.xml')] feeds = [(u'Todos as editorias', u'http://jbonline.terra.com.br/extra/rsstrjb.xml')]
def preprocess_html(self, soup): def preprocess_html(self, soup):
ifr = soup.find('iframe') ifr = soup.find('iframe')
if ifr: if ifr:
ifr.extract() ifr.extract()
for item in soup.findAll(style=True): for item in soup.findAll(style=True):
del item['style'] del item['style']
return soup return soup
language = _('Portugese') language = _('Portuguese')

View File

@ -30,6 +30,7 @@ class Newsweek(BasicNewsRecipe):
remove_tags = [ remove_tags = [
{'class':['fwArticle noHr','fwArticle','subinfo','hdlBulletItem','head-content','navbar','link', 'ad', 'sponsorLinksArticle', 'mm-content', {'class':['fwArticle noHr','fwArticle','subinfo','hdlBulletItem','head-content','navbar','link', 'ad', 'sponsorLinksArticle', 'mm-content',
'inline-social-links-wrapper', 'email-article', 'inline-social-links-wrapper', 'email-article',
'inlineComponentRight',
'comments-and-social-links-wrapper', 'EmailArticleBlock']}, 'comments-and-social-links-wrapper', 'EmailArticleBlock']},
{'id' : ['footer', 'ticker-data', 'topTenVertical', {'id' : ['footer', 'ticker-data', 'topTenVertical',
'digg-top-five', 'mesothorax', 'nw-comments', 'digg-top-five', 'mesothorax', 'nw-comments',

View File

@ -1,69 +1,69 @@
#!/usr/bin/env python #!/usr/bin/env python
__license__ = 'GPL v3' __license__ = 'GPL v3'
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>' __copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
''' '''
oglobo.globo.com oglobo.globo.com
''' '''
from calibre.web.feeds.news import BasicNewsRecipe from calibre.web.feeds.news import BasicNewsRecipe
class OGlobo(BasicNewsRecipe): class OGlobo(BasicNewsRecipe):
title = 'O Globo' title = 'O Globo'
__author__ = 'Darko Miletic' __author__ = 'Darko Miletic'
description = 'News from Brasil' description = 'News from Brasil'
publisher = 'O Globo' publisher = 'O Globo'
category = 'news, politics, Brasil' category = 'news, politics, Brasil'
oldest_article = 2 oldest_article = 2
max_articles_per_feed = 100 max_articles_per_feed = 100
no_stylesheets = True no_stylesheets = True
use_embedded_content = False use_embedded_content = False
encoding = 'cp1252' encoding = 'cp1252'
cover_url = 'http://oglobo.globo.com/_img/o-globo.png' cover_url = 'http://oglobo.globo.com/_img/o-globo.png'
remove_javascript = True remove_javascript = True
html2lrf_options = [ html2lrf_options = [
'--comment', description '--comment', description
, '--category', category , '--category', category
, '--publisher', publisher , '--publisher', publisher
] ]
html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"' html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"'
keep_only_tags = [dict(name='div', attrs={'id':'ltintb'})] keep_only_tags = [dict(name='div', attrs={'id':'ltintb'})]
remove_tags = [ remove_tags = [
dict(name='script') dict(name='script')
,dict(name='object') ,dict(name='object')
,dict(name='form') ,dict(name='form')
,dict(name='div', attrs={'id':['linksPatGoogle','rdpm','cor','com','env','rcm_st']}) ,dict(name='div', attrs={'id':['linksPatGoogle','rdpm','cor','com','env','rcm_st']})
,dict(name='div', attrs={'class':'box-zap-anu2'}) ,dict(name='div', attrs={'class':'box-zap-anu2'})
,dict(name='a') ,dict(name='a')
,dict(name='link') ,dict(name='link')
] ]
feeds = [ feeds = [
(u'Todos os canais', u'http://oglobo.globo.com/rss/plantao.xml') (u'Todos os canais', u'http://oglobo.globo.com/rss/plantao.xml')
,(u'Ciencia', u'http://oglobo.globo.com/rss/plantaociencia.xml') ,(u'Ciencia', u'http://oglobo.globo.com/rss/plantaociencia.xml')
,(u'Educacao', u'http://oglobo.globo.com/rss/plantaoeducacao.xml') ,(u'Educacao', u'http://oglobo.globo.com/rss/plantaoeducacao.xml')
,(u'Opiniao', u'http://oglobo.globo.com/rss/plantaoopiniao.xml') ,(u'Opiniao', u'http://oglobo.globo.com/rss/plantaoopiniao.xml')
,(u'Sao Paulo', u'http://oglobo.globo.com/rss/plantaosaopaulo.xml') ,(u'Sao Paulo', u'http://oglobo.globo.com/rss/plantaosaopaulo.xml')
,(u'Viagem', u'http://oglobo.globo.com/rss/plantaoviagem.xml') ,(u'Viagem', u'http://oglobo.globo.com/rss/plantaoviagem.xml')
,(u'Cultura', u'http://oglobo.globo.com/rss/plantaocultura.xml') ,(u'Cultura', u'http://oglobo.globo.com/rss/plantaocultura.xml')
,(u'Esportes', u'http://oglobo.globo.com/rss/plantaoesportes.xml') ,(u'Esportes', u'http://oglobo.globo.com/rss/plantaoesportes.xml')
,(u'Mundo', u'http://oglobo.globo.com/rss/plantaomundo.xml') ,(u'Mundo', u'http://oglobo.globo.com/rss/plantaomundo.xml')
,(u'Pais', u'http://oglobo.globo.com/rss/plantaopais.xml') ,(u'Pais', u'http://oglobo.globo.com/rss/plantaopais.xml')
,(u'Rio', u'http://oglobo.globo.com/rss/plantaorio.xml') ,(u'Rio', u'http://oglobo.globo.com/rss/plantaorio.xml')
,(u'Saude', u'http://oglobo.globo.com/rss/plantaosaude.xml') ,(u'Saude', u'http://oglobo.globo.com/rss/plantaosaude.xml')
,(u'Viver Melhor', u'http://oglobo.globo.com/rss/plantaovivermelhor.xml') ,(u'Viver Melhor', u'http://oglobo.globo.com/rss/plantaovivermelhor.xml')
,(u'Economia', u'http://oglobo.globo.com/rss/plantaoeconomia.xml') ,(u'Economia', u'http://oglobo.globo.com/rss/plantaoeconomia.xml')
,(u'Tecnologia', u'http://oglobo.globo.com/rss/plantaotecnologia.xml') ,(u'Tecnologia', u'http://oglobo.globo.com/rss/plantaotecnologia.xml')
] ]
def preprocess_html(self, soup): def preprocess_html(self, soup):
for item in soup.findAll(style=True): for item in soup.findAll(style=True):
del item['style'] del item['style']
return soup return soup
language = _('Portugese') language = _('Portuguese')

View File

@ -11,23 +11,23 @@ from calibre.web.feeds.news import BasicNewsRecipe
import re import re
class Publico(BasicNewsRecipe): class Publico(BasicNewsRecipe):
title = u'P\xc3\xbablico' title = u'P\xfablico'
__author__ = 'David Rodrigues' __author__ = 'David Rodrigues'
oldest_article = 1 oldest_article = 1
max_articles_per_feed = 30 max_articles_per_feed = 30
encoding='utf-8' encoding='utf-8'
no_stylesheets = True no_stylesheets = True
language = _('Portugese') language = _('Portuguese')
preprocess_regexps = [(re.compile(u"\uFFFD", re.DOTALL|re.IGNORECASE), lambda match: ''),] preprocess_regexps = [(re.compile(u"\uFFFD", re.DOTALL|re.IGNORECASE), lambda match: ''),]
feeds = [ feeds = [
(u'Geral', u'http://feeds.feedburner.com/PublicoUltimaHora'), (u'Geral', u'http://feeds.feedburner.com/PublicoUltimaHora'),
(u'Internacional', u'http://www.publico.clix.pt/rss.ashx?idCanal=11'), (u'Internacional', u'http://www.publico.clix.pt/rss.ashx?idCanal=11'),
(u'Pol\xc3\xadtica', u'http://www.publico.clix.pt/rss.ashx?idCanal=12'), (u'Pol\xedtica', u'http://www.publico.clix.pt/rss.ashx?idCanal=12'),
(u'Ci\xc3\xaancias', u'http://www.publico.clix.pt/rss.ashx?idCanal=13'), (u'Ci\xcencias', u'http://www.publico.clix.pt/rss.ashx?idCanal=13'),
(u'Desporto', u'http://desporto.publico.pt/rss.ashx'), (u'Desporto', u'http://desporto.publico.pt/rss.ashx'),
(u'Economia', u'http://www.publico.clix.pt/rss.ashx?idCanal=57'), (u'Economia', u'http://www.publico.clix.pt/rss.ashx?idCanal=57'),
(u'Educa\xc3\xa7\xc3\xa3o', u'http://www.publico.clix.pt/rss.ashx?idCanal=58'), (u'Educa\xe7\xe3o', u'http://www.publico.clix.pt/rss.ashx?idCanal=58'),
(u'Local', u'http://www.publico.clix.pt/rss.ashx?idCanal=59'), (u'Local', u'http://www.publico.clix.pt/rss.ashx?idCanal=59'),
(u'Media e Tecnologia', u'http://www.publico.clix.pt/rss.ashx?idCanal=61'), (u'Media e Tecnologia', u'http://www.publico.clix.pt/rss.ashx?idCanal=61'),
(u'Sociedade', u'http://www.publico.clix.pt/rss.ashx?idCanal=62') (u'Sociedade', u'http://www.publico.clix.pt/rss.ashx?idCanal=62')

View File

@ -5,10 +5,8 @@ __copyright__ = '2009, Pu Bo <pubo at pubolab.com>'
''' '''
zaobao.com zaobao.com
''' '''
import time, os, traceback, sys
from calibre.web.feeds.news import BasicNewsRecipe from calibre.web.feeds.news import BasicNewsRecipe
from calibre.web.feeds import feeds_from_index, Feed, Article from calibre.web.feeds import feeds_from_index
from BeautifulSoup import Tag
class ZAOBAO(BasicNewsRecipe): class ZAOBAO(BasicNewsRecipe):
title = u'\u8054\u5408\u65e9\u62a5\u7f51 zaobao.com' title = u'\u8054\u5408\u65e9\u62a5\u7f51 zaobao.com'
@ -72,7 +70,7 @@ class ZAOBAO(BasicNewsRecipe):
return soup return soup
def parse_feeds(self): def parse_feeds(self):
self.log_debug('ZAOBAO overrided parse_feeds()') self.log.debug('ZAOBAO overrided parse_feeds()')
parsed_feeds = BasicNewsRecipe.parse_feeds(self) parsed_feeds = BasicNewsRecipe.parse_feeds(self)
for id, obj in enumerate(self.INDEXES): for id, obj in enumerate(self.INDEXES):
@ -89,7 +87,7 @@ class ZAOBAO(BasicNewsRecipe):
a_title = self.tag_to_string(a) a_title = self.tag_to_string(a)
date = '' date = ''
description = '' description = ''
self.log_debug('adding %s at %s'%(a_title,a_url)) self.log.debug('adding %s at %s'%(a_title,a_url))
articles.append({ articles.append({
'title':a_title, 'title':a_title,
'date':date, 'date':date,
@ -100,23 +98,23 @@ class ZAOBAO(BasicNewsRecipe):
pfeeds = feeds_from_index([(title, articles)], oldest_article=self.oldest_article, pfeeds = feeds_from_index([(title, articles)], oldest_article=self.oldest_article,
max_articles_per_feed=self.max_articles_per_feed) max_articles_per_feed=self.max_articles_per_feed)
self.log_debug('adding %s to feed'%(title)) self.log.debug('adding %s to feed'%(title))
for feed in pfeeds: for feed in pfeeds:
self.log_debug('adding feed: %s'%(feed.title)) self.log.debug('adding feed: %s'%(feed.title))
feed.description = self.DESC_SENSE feed.description = self.DESC_SENSE
parsed_feeds.append(feed) parsed_feeds.append(feed)
for a, article in enumerate(feed): for a, article in enumerate(feed):
self.log_debug('added article %s from %s'%(article.title, article.url)) self.log.debug('added article %s from %s'%(article.title, article.url))
self.log_debug('added feed %s'%(feed.title)) self.log.debug('added feed %s'%(feed.title))
for i, feed in enumerate(parsed_feeds): for i, feed in enumerate(parsed_feeds):
# workaorund a strange problem: Somethimes the xml encoding is not apllied correctly by parse() # workaorund a strange problem: Somethimes the xml encoding is not apllied correctly by parse()
weired_encoding_detected = False weired_encoding_detected = False
if not isinstance(feed.description, unicode) and self.encoding and feed.description: if not isinstance(feed.description, unicode) and self.encoding and feed.description:
self.log_debug('Feed %s is not encoded correctly, manually replace it'%(feed.title)) self.log.debug('Feed %s is not encoded correctly, manually replace it'%(feed.title))
feed.description = feed.description.decode(self.encoding, 'replace') feed.description = feed.description.decode(self.encoding, 'replace')
elif feed.description.find(self.DESC_SENSE) == -1 and self.encoding and feed.description: elif feed.description.find(self.DESC_SENSE) == -1 and self.encoding and feed.description:
self.log_debug('Feed %s is strangely encoded, manually redo all'%(feed.title)) self.log.debug('Feed %s is strangely encoded, manually redo all'%(feed.title))
feed.description = feed.description.encode('cp1252', 'replace').decode(self.encoding, 'replace') feed.description = feed.description.encode('cp1252', 'replace').decode(self.encoding, 'replace')
weired_encoding_detected = True weired_encoding_detected = True
@ -138,7 +136,7 @@ class ZAOBAO(BasicNewsRecipe):
article.text_summary = article.text_summary.encode('cp1252', 'replace').decode(self.encoding, 'replace') article.text_summary = article.text_summary.encode('cp1252', 'replace').decode(self.encoding, 'replace')
if article.title == "Untitled article": if article.title == "Untitled article":
self.log_debug('Removing empty article %s from %s'%(article.title, article.url)) self.log.debug('Removing empty article %s from %s'%(article.title, article.url))
# remove the article # remove the article
feed.articles[a:a+1] = [] feed.articles[a:a+1] = []
return parsed_feeds return parsed_feeds