mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Release 0.8.2
This commit is contained in:
commit
aa33318e41
@ -19,6 +19,72 @@
|
||||
# new recipes:
|
||||
# - title:
|
||||
|
||||
- version: 0.8.2
|
||||
date: 2011-05-20
|
||||
|
||||
new features:
|
||||
- title: "Various new ebook sources added to Get Books: Google Books, O'Reilly, archive.org, some Polish ebooks stores, etc."
|
||||
|
||||
- title: "Amazon metadata download: Allow user to configure Amazon plugin to use any of the US, UK, German, French and Italian Amazon websites"
|
||||
|
||||
- title: "When deleting large numbers of books, give the user the option to skip the Recycle Bin, since sending lots of files to the recycle bin can be very slow."
|
||||
tickets: [784987]
|
||||
|
||||
- title: "OS X: The unified title+toolbar was disabled as it had various bugs. If you really want it you can turn it on again via Preferences->Tweaks, but be aware that you will see problems like the calibre windowd being too wide, weird animations when a device is detected, etc."
|
||||
|
||||
- title: "Add a tweak that controls what words are treated as suffixes when generating an author sort string from an author name."
|
||||
|
||||
- title: "Get Books: Store last few searches in history"
|
||||
|
||||
bug fixes:
|
||||
- title: "Fix a crash when a device is connected/disconnected while a modal dialog opened from the toolbar is visible"
|
||||
tickets: [780484]
|
||||
|
||||
- title: "Fix incorrect results from ebooks.com when searching via Get Books"
|
||||
|
||||
- title: "Metadata plugboards: Add prioritization scheme to allow for using different settings for different locations"
|
||||
tickets: [783229]
|
||||
|
||||
- title: "Fix manage authors dialog too wide"
|
||||
tickets: [783065]
|
||||
|
||||
- title: "Fix multiple bracket types in author names not handled correctly when generating author sort string"
|
||||
tickets: [782551]
|
||||
|
||||
- title: "MOBI Input: Don't error out when detecting TOC structure if one of the elements has an invalid margin unit"
|
||||
|
||||
- title: "More fixes for japanese language calibre on windows"
|
||||
tickets: [782408]
|
||||
|
||||
- title: "Linux binaries: Always use either Cleanlook or Plastique styles for the GUI if no style can be loaded from the host computer"
|
||||
|
||||
improved recipes:
|
||||
- Newsweek
|
||||
- Economist
|
||||
- Dvhn
|
||||
- United Daily
|
||||
- Dagens Nyheter
|
||||
- GoComics
|
||||
- faz.net
|
||||
- golem.de
|
||||
|
||||
new recipes:
|
||||
- title: National Geographic
|
||||
author: gagsays
|
||||
|
||||
- title: Various German news sources
|
||||
author: schuster
|
||||
|
||||
- title: Dilema Veche
|
||||
author: Silviu Cotoara
|
||||
|
||||
- title: "Glamour, Good to Know, Good Housekeeping and Men's Health"
|
||||
author: Anonymous
|
||||
|
||||
- title: "Financial Sense and iProfessional"
|
||||
author: Darko Miletic
|
||||
|
||||
|
||||
- version: 0.8.1
|
||||
date: 2011-05-13
|
||||
|
||||
|
@ -14,7 +14,7 @@ class Economist(BasicNewsRecipe):
|
||||
description = ('Global news and current affairs from a European'
|
||||
' perspective. Best downloaded on Friday mornings (GMT).'
|
||||
' Much slower than the print edition based version.')
|
||||
|
||||
extra_css = '.headline {font-size: x-large;} \n h2 { font-size: small; } \n h1 { font-size: medium; }'
|
||||
oldest_article = 7.0
|
||||
cover_url = 'http://www.economist.com/images/covers/currentcoverus_large.jpg'
|
||||
remove_tags = [
|
||||
|
@ -53,7 +53,8 @@ authors_completer_append_separator = False
|
||||
# periods are automatically handled.
|
||||
author_sort_copy_method = 'comma'
|
||||
author_name_suffixes = ('Jr', 'Sr', 'Inc', 'Ph.D', 'Phd',
|
||||
'MD', 'M.D', 'I', 'II', 'III', 'IV')
|
||||
'MD', 'M.D', 'I', 'II', 'III', 'IV',
|
||||
'Junior', 'Senior')
|
||||
|
||||
#: Use author sort in Tag Browser
|
||||
# Set which author field to display in the tags pane (the list of authors,
|
||||
|
@ -4,7 +4,7 @@ __license__ = 'GPL v3'
|
||||
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
|
||||
__docformat__ = 'restructuredtext en'
|
||||
__appname__ = u'calibre'
|
||||
numeric_version = (0, 8, 1)
|
||||
numeric_version = (0, 8, 2)
|
||||
__version__ = u'.'.join(map(unicode, numeric_version))
|
||||
__author__ = u"Kovid Goyal <kovid@kovidgoyal.net>"
|
||||
|
||||
|
@ -269,8 +269,8 @@ class NEXTBOOK(USBMS):
|
||||
|
||||
EBOOK_DIR_MAIN = ''
|
||||
|
||||
VENDOR_NAME = 'NEXT2'
|
||||
WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = '1.0.14'
|
||||
VENDOR_NAME = ['NEXT2', 'BK7005']
|
||||
WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = ['1.0.14', 'PLAYER']
|
||||
SUPPORTS_SUB_DIRS = True
|
||||
THUMBNAIL_HEIGHT = 120
|
||||
|
||||
|
@ -549,7 +549,8 @@ class Amazon(Source):
|
||||
r'//div[@id="Results"]/descendant::td[starts-with(@id, "search:Td:")]'):
|
||||
for a in td.xpath(r'descendant::td[@class="dataColumn"]/descendant::a[@href]/span[@class="srTitle"]/..'):
|
||||
title = tostring(a, method='text', encoding=unicode).lower()
|
||||
if 'bulk pack' not in title:
|
||||
if ('bulk pack' not in title and '[audiobook]' not in
|
||||
title and '[audio cd]' not in title):
|
||||
matches.append(a.get('href'))
|
||||
break
|
||||
|
||||
|
@ -313,7 +313,7 @@ class Source(Plugin):
|
||||
title_patterns = [(re.compile(pat, re.IGNORECASE), repl) for pat, repl in
|
||||
[
|
||||
# Remove things like: (2010) (Omnibus) etc.
|
||||
(r'(?i)[({\[](\d{4}|omnibus|anthology|hardcover|paperback|turtleback|mass\s*market|edition|ed\.)[\])}]', ''),
|
||||
(r'(?i)[({\[](\d{4}|omnibus|anthology|hardcover|audiobook|audio\scd|paperback|turtleback|mass\s*market|edition|ed\.)[\])}]', ''),
|
||||
# Remove any strings that contain the substring edition inside
|
||||
# parentheses
|
||||
(r'(?i)[({\[].*?(edition|ed.).*?[\]})]', ''),
|
||||
|
@ -76,7 +76,7 @@ class UserDefinedDevice(QDialog):
|
||||
for i,d in enumerate(sorted(new_drives,
|
||||
key=lambda x: after['drive_details'][x][0])):
|
||||
if i == 0:
|
||||
res += _('Windows main memory ID string') + ': ' + \
|
||||
res += _('Windows main memory vendor string') + ': ' + \
|
||||
after['drive_details'][d][1] + '\n'
|
||||
res += _('Windows main memory ID string') + ': ' + \
|
||||
after['drive_details'][d][2] + '\n'
|
||||
|
@ -59,9 +59,10 @@ class EbookscomStore(BasicStoreConfig, StorePlugin):
|
||||
break
|
||||
|
||||
id = ''.join(data.xpath('.//a[1]/@href'))
|
||||
id = id.split('=')[-1]
|
||||
if not id:
|
||||
mo = re.search('\d+', id)
|
||||
if not mo:
|
||||
continue
|
||||
id = mo.group()
|
||||
|
||||
cover_url = ''.join(data.xpath('.//img[1]/@src'))
|
||||
|
||||
|
@ -374,13 +374,18 @@ To accomplish this, we:
|
||||
Templates and Plugboards
|
||||
------------------------
|
||||
|
||||
Plugboards are used for changing the metadata written into books during send-to-device and save-to-disk operations. A plugboard permits you to specify a template to provide the data to write into the book's metadata. You can use plugboards to modify the following fields: authors, author_sort, language, publisher, tags, title, title_sort. This feature should help those of you who want to use different metadata in your books on devices to solve sorting or display issues.
|
||||
Plugboards are used for changing the metadata written into books during send-to-device and save-to-disk operations. A plugboard permits you to specify a template to provide the data to write into the book's metadata. You can use plugboards to modify the following fields: authors, author_sort, language, publisher, tags, title, title_sort. This feature helps people who want to use different metadata in books on devices to solve sorting or display issues.
|
||||
|
||||
When you create a plugboard, you specify the format and device for which the plugboard is to be used. A special device is provided, save_to_disk, that is used when saving formats (as opposed to sending them to a device). Once you have chosen the format and device, you choose the metadata fields to change, providing templates to supply the new values. These templates are `connected` to their destination fields, hence the name `plugboards`. You can, of course, use composite columns in these templates.
|
||||
|
||||
The tags and authors fields have special treatment, because both of these fields can hold more than one item. After all, book can have many tags and many authors. When you specify that one of these two fields is to be changed, the result of evaluating the template is examined to see if more than one item is there.
|
||||
When a plugboard might apply (content server, save to disk, or send to device), |app| searches the defined plugboards to choose the correct one for the given format and device. For example, to find the appropriate plugboard for an EPUB book being sent to an ANDROID device, |app| searches the plugboards using the following search order:
|
||||
|
||||
For tags, the result cut apart whereever |app| finds a comma. For example, if the template produces the value ``Thriller, Horror``, then the result will be two tags, ``Thriller`` and ``Horror``. There is no way to put a comma in the middle of a tag.
|
||||
* a plugboard with an exact match on format and device, e.g., ``EPUB`` and ``ANDROID``
|
||||
* a plugboard with an exact match on format and the special ``any device`` choice, e.g., ``EPUB`` and ``any device``
|
||||
* a plugboard with the special ``any format`` choice and an exact match on device, e.g., ``any format`` and ``ANDROID``
|
||||
* a plugboard with ``any format`` and ``any device``
|
||||
|
||||
The tags and authors fields have special treatment, because both of these fields can hold more than one item. A book can have many tags and many authors. When you specify that one of these two fields is to be changed, the template's result is examined to see if more than one item is there. For tags, the result is cut apart wherever |app| finds a comma. For example, if the template produces the value ``Thriller, Horror``, then the result will be two tags, ``Thriller`` and ``Horror``. There is no way to put a comma in the middle of a tag.
|
||||
|
||||
The same thing happens for authors, but using a different character for the cut, a `&` (ampersand) instead of a comma. For example, if the template produces the value ``Blogs, Joe&Posts, Susan``, then the book will end up with two authors, ``Blogs, Joe`` and ``Posts, Susan``. If the template produces the value ``Blogs, Joe;Posts, Susan``, then the book will have one author with a rather strange name.
|
||||
|
||||
|
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
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
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
@ -55,7 +55,7 @@ PARALLEL_FUNCS = {
|
||||
('calibre.utils.ipc.worker', 'arbitrary', None),
|
||||
|
||||
'arbitrary_n' :
|
||||
('calibre.utils.ipc.worker', 'arbitrary', 'notification'),
|
||||
('calibre.utils.ipc.worker', 'arbitrary_n', 'notification'),
|
||||
}
|
||||
|
||||
class Progress(Thread):
|
||||
@ -110,6 +110,10 @@ def arbitrary(module_name, func_name, args, kwargs={}):
|
||||
function ``func_name``
|
||||
:param kwargs: A dictionary of keyword arguments to pass to func_name
|
||||
'''
|
||||
if module_name.startswith('calibre_plugins'):
|
||||
# Initialize the plugin loader by doing this dummy import
|
||||
from calibre.customize.ui import find_plugin
|
||||
find_plugin
|
||||
module = importlib.import_module(module_name)
|
||||
func = getattr(module, func_name)
|
||||
return func(*args, **kwargs)
|
||||
@ -124,6 +128,10 @@ def arbitrary_n(module_name, func_name, args, kwargs={},
|
||||
completed and the second is a string with a message (it can be an empty
|
||||
string).
|
||||
'''
|
||||
if module_name.startswith('calibre_plugins'):
|
||||
# Initialize the plugin loader by doing this dummy import
|
||||
from calibre.customize.ui import find_plugin
|
||||
find_plugin
|
||||
module = importlib.import_module(module_name)
|
||||
func = getattr(module, func_name)
|
||||
kwargs['notification'] = notification
|
||||
|
Loading…
x
Reference in New Issue
Block a user