From f93091952306baab27d5d7a0e0a75e5a996708b6 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 13 Jul 2009 18:08:42 -0600 Subject: [PATCH 1/4] Fix #2835 (Cover images not being sent to Kindle and mobi files not converting) --- src/calibre/ebooks/mobi/writer.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/mobi/writer.py b/src/calibre/ebooks/mobi/writer.py index 8e8cff2aff..5bd75d5e9a 100644 --- a/src/calibre/ebooks/mobi/writer.py +++ b/src/calibre/ebooks/mobi/writer.py @@ -1957,6 +1957,12 @@ class MobiWriter(object): # Test to see if this child's offset is the same as the previous child's # offset, skip it h = child.href + first = False + + if h is None: + self._oeb.logger.warn(' Ignoring TOC entry with no href:', + child.title) + continue currentOffset = self._id_offsets[h] # print "_generate_ctoc: child offset: 0x%X" % currentOffset @@ -1967,7 +1973,6 @@ class MobiWriter(object): else : self._oeb.logger.warn(" Ignoring redundant href: %s in '%s'" % (h, child.title)) - first = False else : if self.opts.verbose > 2 : self._oeb.logger.info("skipping class: %s depth %d at position %d" % \ From cf818b1c621e19e85c9cb666796ad33e70063e4a Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 13 Jul 2009 18:21:58 -0600 Subject: [PATCH 2/4] Fix #2825 ("No such file or directory" error in viewer) --- src/calibre/ebooks/mobi/writer.py | 5 +++++ src/calibre/ebooks/oeb/iterator.py | 7 +++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/mobi/writer.py b/src/calibre/ebooks/mobi/writer.py index 5bd75d5e9a..04fd835c96 100644 --- a/src/calibre/ebooks/mobi/writer.py +++ b/src/calibre/ebooks/mobi/writer.py @@ -1963,6 +1963,11 @@ class MobiWriter(object): self._oeb.logger.warn(' Ignoring TOC entry with no href:', child.title) continue + if h not in self._id_offsets: + self._oeb.logger.warn(' Ignoring missing TOC entry:', + child) + continue + currentOffset = self._id_offsets[h] # print "_generate_ctoc: child offset: 0x%X" % currentOffset diff --git a/src/calibre/ebooks/oeb/iterator.py b/src/calibre/ebooks/oeb/iterator.py index 2b68b6cf57..03c09262d4 100644 --- a/src/calibre/ebooks/oeb/iterator.py +++ b/src/calibre/ebooks/oeb/iterator.py @@ -41,9 +41,12 @@ class SpineItem(unicode): def __new__(cls, *args): args = list(args) - args[0] = args[0].partition('#')[0] - obj = super(SpineItem, cls).__new__(cls, *args) path = args[0] + ppath = path.partition('#')[0] + if not os.path.exists(path) and os.path.exists(ppath): + path = ppath + args[0] = path + obj = super(SpineItem, cls).__new__(cls, *args) raw = open(path, 'rb').read() raw, obj.encoding = xml_to_unicode(raw) obj.character_count = character_count(raw) From 11c0953f2de58439f9dd8359314bc3257087ee43 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 13 Jul 2009 20:57:38 -0600 Subject: [PATCH 3/4] Fix #2808 (PRS-505 upload does not handle long titles well) --- src/calibre/devices/usbms/driver.py | 50 ++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/src/calibre/devices/usbms/driver.py b/src/calibre/devices/usbms/driver.py index ae5504fc71..5c5a7fb1da 100644 --- a/src/calibre/devices/usbms/driver.py +++ b/src/calibre/devices/usbms/driver.py @@ -10,9 +10,11 @@ for a particular device. import os import fnmatch import shutil +from math import ceil from itertools import cycle from calibre import sanitize_file_name as sanitize +from calibre.constants import iswindows from calibre.ebooks.metadata import authors_to_string from calibre.devices.usbms.cli import CLI from calibre.devices.usbms.device import Device @@ -127,6 +129,7 @@ class USBMS(CLI, Device): for i, infile in enumerate(files): newpath = path + resizable = [] if self.SUPPORTS_SUB_DIRS: mdata = metadata.next() @@ -135,23 +138,54 @@ class USBMS(CLI, Device): for tag in mdata['tags']: if tag.startswith(_('News')): newpath = os.path.join(newpath, 'news') - newpath = os.path.join(newpath, sanitize(mdata.get('title', ''))) - newpath = os.path.join(newpath, sanitize(mdata.get('timestamp', ''))) + c = sanitize(mdata.get('title', '')) + if c: + newpath = os.path.join(newpath, c) + resizable.append(c) + c = sanitize(mdata.get('timestamp', '')) + if c: + newpath = os.path.join(newpath, c) + resizable.append(c) break elif tag.startswith('/'): - newpath += tag - newpath = os.path.normpath(newpath) + for c in tag.split('/'): + c = sanitize(c) + if not c: continue + newpath = os.path.join(newpath, c) + resizable.append(c) break if newpath == path: - newpath = os.path.join(newpath, - sanitize(mdata.get('authors', _('Unknown'))), - sanitize(mdata.get('title', _('Unknown')))) + c = sanitize(mdata.get('authors', _('Unknown'))) + if c: + newpath = os.path.join(newpath, c) + resizable.append(c) + c = sanitize(mdata.get('title', _('Unknown'))) + if c: + newpath = os.path.join(newpath, c) + resizable.append(c) + + newpath = os.path.abspath(newpath) + fname = sanitize(names.next()) + resizable.append(fname) + filepath = os.path.join(newpath, fname) + + if iswindows and len(filepath) > 250: + extra = len(filepath) - 250 + delta = int(ceil(extra/float(len(resizable)))) + for x in resizable: + if delta > len(x): + r = '' + else: + r = x[:-delta] + filepath = filepath.replace(os.sep+x+os.sep, os.sep+r+os.sep) + filepath = filepath.replace(os.sep+os.sep, os.sep) + newpath = os.path.dirname(filepath) + if not os.path.exists(newpath): os.makedirs(newpath) - filepath = os.path.join(newpath, sanitize(names.next())) paths.append(filepath) if hasattr(infile, 'read'): From 284c3b1797ed4943fe51fffde5ef5262fb23e8f7 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 13 Jul 2009 21:01:36 -0600 Subject: [PATCH 4/4] New recipe for NOAA by Darko Miletic --- src/calibre/gui2/images/news/noaa.png | Bin 0 -> 994 bytes src/calibre/web/feeds/recipes/__init__.py | 2 +- src/calibre/web/feeds/recipes/recipe_noaa.py | 41 +++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/calibre/gui2/images/news/noaa.png create mode 100644 src/calibre/web/feeds/recipes/recipe_noaa.py diff --git a/src/calibre/gui2/images/news/noaa.png b/src/calibre/gui2/images/news/noaa.png new file mode 100644 index 0000000000000000000000000000000000000000..9a04db7cfdbac61f63e2cc4c2a54dd03fee3c60a GIT binary patch literal 994 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zK-vS0-A-oPfdtD69Mgd`SU*F|v9*U87?`;|T^vI!PUlYc%?SyWIa>ey-uGv_mtN-i z(rl(HuxjEeMb{V0rgTWLFu8T8l_nNhze%|q$?dq)K?#jY*q~B>VY||3dbiiE0`vE&!vIExzyF06^-n@AIU^D-> z30}uGGSuz1Iv(-M%!{+CI_ie?hIwb^8g0|(c zhI2#t2f=eSMGeo|B(^bWFL@C)dx@do!p)}V+SaM$>hhW#5uIHfR{ZP8>5_7j#l8I} z^mnR>#-989T7G-Q^B)>#djpday9**V1{8F(==@Poh%fp1=0tQB-tm zNpY!w(4L05uNTR@jdzasp0W9{@tHekKKsP0FG@DepL4p%bos<>N*@-k_f_ocIXhE$ zde?~!hZv51p2$^Je$>M3hF`wcq3~eWee-k*YA-H+A;r>k;H%}O`7SXhr=GnwSyF&Y z@c_#PH8sl}hF+oE=hC!Nyrq^fu?BJQu=SjOy6`JUa!v7z=Q_$Sg^ZGz+YT^TF&y6H zaZ>azf0kUn-PW#&b7N13uDenj_s8(?&;2qT5grHs3rR4qdv=r8@Z6jCYJ!{OdQPs) zz9&2X`RS9@EVmj|1-%&99y8x^Z+r0dxb)A80$sz~Q9F