diff --git a/src/calibre/devices/prs505/driver.py b/src/calibre/devices/prs505/driver.py index f569667ba1..702dd37592 100644 --- a/src/calibre/devices/prs505/driver.py +++ b/src/calibre/devices/prs505/driver.py @@ -4,15 +4,14 @@ __copyright__ = '2008, Kovid Goyal ' \ ''' Device driver for the SONY PRS-505 ''' -import sys, os, shutil, time, subprocess, re +import os, time from itertools import cycle from calibre.devices.usbms.cli import CLI from calibre.devices.usbms.device import Device from calibre.devices.errors import DeviceError, FreeSpaceError from calibre.devices.prs505.books import BookList, fix_ids -from calibre import iswindows, islinux, isosx, __appname__ -from calibre.devices.errors import PathError +from calibre import __appname__ class PRS505(CLI, Device): @@ -22,7 +21,7 @@ class PRS505(CLI, Device): supported_platforms = ['windows', 'osx', 'linux'] FORMATS = ['epub', 'lrf', 'lrx', 'rtf', 'pdf', 'txt'] - + VENDOR_ID = [0x054c] #: SONY Vendor Id PRODUCT_ID = [0x031e] #: Product Id for the PRS-505 BCD = [0x229] #: Needed to disambiguate 505 and 700 on linux @@ -46,27 +45,34 @@ class PRS505(CLI, Device): def open(self): Device.open(self) - + def write_cache(prefix): try: cachep = os.path.join(prefix, self.CACHE_XML) if not os.path.exists(cachep): - os.makedirs(os.path.dirname(cachep), mode=0777) - f = open(cachep, 'wb') - f.write(u''' - - -'''.encode('utf8')) - f.close() + try: + os.makedirs(os.path.dirname(cachep), mode=0777) + except: + time.sleep(5) + os.makedirs(os.path.dirname(cachep), mode=0777) + with open(cachep, 'wb') as f: + f.write(u''' + + + '''.encode('utf8')) + return True except: self._card_prefix = None import traceback traceback.print_exc() + return False if self._card_a_prefix is not None: - write_cache(self._card_a_prefix) + if not write_cache(self._card_a_prefix): + self._card_a_prefix = None if self._card_b_prefix is not None: - write_cache(self._card_b_prefix) + if not write_cache(self._card_b_prefix): + self._card_b_prefix = None def get_device_information(self, end_session=True): return (self.__class__.__name__, '', '', '') @@ -132,7 +138,7 @@ class PRS505(CLI, Device): if not hasattr(infile, 'read'): infile, close = open(infile, 'rb'), True infile.seek(0) - + newpath = path mdata = metadata.next() @@ -159,11 +165,11 @@ class PRS505(CLI, Device): paths.append(filepath) self.put_file(infile, paths[-1], replace_file=True) - + if close: infile.close() ctimes.append(os.path.getctime(paths[-1])) - + return zip(paths, sizes, ctimes, cycle([on_card])) @classmethod @@ -199,7 +205,7 @@ class PRS505(CLI, Device): f = open(self._main_prefix + self.__class__.MEDIA_XML, 'wb') booklists[0].write(f) f.close() - + def write_card_prefix(prefix, listid): if prefix is not None and hasattr(booklists[listid], 'write'): if not os.path.exists(prefix): diff --git a/src/calibre/ebooks/conversion/cli.py b/src/calibre/ebooks/conversion/cli.py index b165fbf8f4..53b1a2065d 100644 --- a/src/calibre/ebooks/conversion/cli.py +++ b/src/calibre/ebooks/conversion/cli.py @@ -128,7 +128,7 @@ def add_pipeline_options(parser, plumber): [ 'dont_split_on_page_breaks', 'chapter', 'chapter_mark', 'prefer_metadata_cover', 'remove_first_image', - 'insert_comments', 'page_breaks_before', + 'insert_metadata', 'page_breaks_before', ] ), diff --git a/src/calibre/ebooks/conversion/plumber.py b/src/calibre/ebooks/conversion/plumber.py index 9987ec0243..37611dcea7 100644 --- a/src/calibre/ebooks/conversion/plumber.py +++ b/src/calibre/ebooks/conversion/plumber.py @@ -300,11 +300,11 @@ OptionRecommendation(name='remove_first_image', ) ), -OptionRecommendation(name='insert_comments', +OptionRecommendation(name='insert_metadata', recommended_value=False, level=OptionRecommendation.LOW, - help=_('Insert the comments/summary from the book metadata at the start of ' + help=_('Insert the book metadata at the start of ' 'the book. This is useful if your ebook reader does not support ' - 'displaying the comments from the metadata.' + 'displaying/searching metadata directly.' ) ), @@ -607,7 +607,7 @@ OptionRecommendation(name='list_recipes', fkey = map(float, fkey.split(',')) from calibre.ebooks.oeb.transforms.jacket import Jacket - Jacket()(self.oeb, self.opts) + Jacket()(self.oeb, self.opts, self.user_metadata) pr(0.4) if self.opts.extra_css and os.path.exists(self.opts.extra_css): diff --git a/src/calibre/ebooks/oeb/transforms/jacket.py b/src/calibre/ebooks/oeb/transforms/jacket.py index c182faedfa..78f4ab871e 100644 --- a/src/calibre/ebooks/oeb/transforms/jacket.py +++ b/src/calibre/ebooks/oeb/transforms/jacket.py @@ -25,9 +25,13 @@ class Jacket(object): %(title)s -

%(title)s

-

%(jacket)s

-
+
+

%(title)s

+

%(jacket)s

+
%(series)s
+
%(tags)s
+
+
%(comments)s
@@ -46,21 +50,47 @@ class Jacket(object): img.getparent().remove(img) return - def insert_comments(self, comments): - self.log('Inserting metadata comments into book...') + def insert_metadata(self, mi): + self.log('Inserting metadata into book...') + comments = mi.comments + if not comments: + try: + comments = unicode(self.oeb.metadata.description[0]) + except: + comments = '' + if not comments.strip(): + comments = '' comments = comments.replace('\r\n', '\n').replace('\n\n', '

') + series = 'Series: ' + mi.series if mi.series else '' + if series and mi.series_index is not None: + series += ' [%s]'%mi.series_index + tags = mi.tags + if not tags: + try: + tags = map(unicode, self.oeb.metadata.subject) + except: + tags = [] + tags = u'/'.join(tags) + if tags: + tags = 'Tags: ' + u'/%s/'%tags + else: + tags = '' + try: + title = mi.title if mi.title else unicode(self.oeb.metadata.title[0]) + except: + title = _('Unknown') html = self.JACKET_TEMPLATE%dict(xmlns=XPNSMAP['h'], - title=self.opts.title, comments=comments, - jacket=_('Book Jacket')) + title=title, comments=comments, + jacket=_('Book Jacket'), series=series, tags=tags) id, href = self.oeb.manifest.generate('jacket', 'jacket.xhtml') root = etree.fromstring(html) item = self.oeb.manifest.add(id, href, guess_type(href)[0], data=root) self.oeb.spine.insert(0, item, True) - def __call__(self, oeb, opts): + def __call__(self, oeb, opts, metadata): self.oeb, self.opts, self.log = oeb, opts, oeb.log if opts.remove_first_image: self.remove_fisrt_image() - if opts.insert_comments and opts.comments: - self.insert_comments(opts.comments) + if opts.insert_metadata: + self.insert_metadata(metadata) diff --git a/src/calibre/linux.py b/src/calibre/linux.py index 1d641de51c..e6c0504316 100644 --- a/src/calibre/linux.py +++ b/src/calibre/linux.py @@ -5,7 +5,6 @@ import sys, os, shutil from subprocess import check_call, call from calibre import __version__, __appname__ -from calibre.devices import devices DEVICES = devices()