From a1b04a765c8586015324ce008f546e7b5319fd96 Mon Sep 17 00:00:00 2001 From: GRiker Date: Fri, 11 Jan 2013 14:23:54 -0700 Subject: [PATCH 1/2] 1) Added uuid to OPF with id="uuid_id", matching style when converting epubs. 2) Fixed bug lp:1098325, improperly formatted ISBN field when exporting CSV. --- src/calibre/ebooks/metadata/opf2.py | 9 +++------ src/calibre/library/catalogs/csv_xml.py | 4 ++-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/calibre/ebooks/metadata/opf2.py b/src/calibre/ebooks/metadata/opf2.py index 3e5d95f1ce..248c60e3a9 100644 --- a/src/calibre/ebooks/metadata/opf2.py +++ b/src/calibre/ebooks/metadata/opf2.py @@ -458,7 +458,6 @@ def serialize_user_metadata(metadata_elem, all_user_metadata, tail='\n'+(' '*8)) from calibre.utils.config import to_json from calibre.ebooks.metadata.book.json_codec import (object_to_unicode, encode_is_multiple) - for name, fm in all_user_metadata.items(): try: fm = copy.copy(fm) @@ -960,14 +959,13 @@ class OPF(object): # {{{ def fset(self, val): matches = self.uuid_id_path(self.metadata) if not matches: - attrib = {'{%s}scheme'%self.NAMESPACES['opf']: 'uuid'} + attrib = {'{%s}scheme'%self.NAMESPACES['opf']: 'uuid', 'id':'uuid_id'} matches = [self.create_metadata_element('identifier', attrib=attrib)] self.set_text(matches[0], unicode(val)) return property(fget=fget, fset=fset) - @dynamic_property def language(self): @@ -981,7 +979,6 @@ class OPF(object): # {{{ return property(fget=fget, fset=fset) - @dynamic_property def languages(self): @@ -1006,7 +1003,6 @@ class OPF(object): # {{{ return property(fget=fget, fset=fset) - @dynamic_property def book_producer(self): @@ -1152,13 +1148,14 @@ class OPF(object): # {{{ for attr in ('title', 'authors', 'author_sort', 'title_sort', 'publisher', 'series', 'series_index', 'rating', 'isbn', 'tags', 'category', 'comments', 'book_producer', - 'pubdate', 'user_categories', 'author_link_map'): + 'pubdate', 'user_categories', 'author_link_map','uuid'): val = getattr(mi, attr, None) if val is not None and val != [] and val != (None, None): setattr(self, attr, val) langs = getattr(mi, 'languages', []) if langs and langs != ['und']: self.languages = langs + self.get_identifiers = mi.get_identifiers temp = self.to_book_metadata() temp.smart_update(mi, replace_metadata=replace_metadata) self._user_metadata_ = temp.get_all_user_metadata(True) diff --git a/src/calibre/library/catalogs/csv_xml.py b/src/calibre/library/catalogs/csv_xml.py index fd2bb5113b..c594a346d4 100644 --- a/src/calibre/library/catalogs/csv_xml.py +++ b/src/calibre/library/catalogs/csv_xml.py @@ -133,8 +133,8 @@ class CSV_XML(CatalogPlugin): elif field in ['authors', 'tags']: item = ', '.join(item) elif field == 'isbn': - # Could be 9, 10 or 13 digits - item = u'%s' % re.sub(r'[\D]', '', item) + # Could be 9, 10 or 13 digits, with hyphens, possibly ending in 'X' + item = u'%s' % re.sub(r'[^\dX-]', '', item) elif field in ['pubdate', 'timestamp']: item = isoformat(item) elif field == 'comments': From 63a274dc32e4580eb46dbfd495d595826dbbd9da Mon Sep 17 00:00:00 2001 From: GRiker Date: Sat, 12 Jan 2013 05:00:55 -0700 Subject: [PATCH 2/2] Revised method adding with calibre uuid to ePub OPF files. --- src/calibre/ebooks/metadata/epub.py | 3 ++- src/calibre/ebooks/metadata/opf2.py | 12 +++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/calibre/ebooks/metadata/epub.py b/src/calibre/ebooks/metadata/epub.py index bc81df5a79..5b8f75c3b1 100644 --- a/src/calibre/ebooks/metadata/epub.py +++ b/src/calibre/ebooks/metadata/epub.py @@ -289,8 +289,9 @@ def set_metadata(stream, mi, apply_null=False, update_timestamp=False): langs.append(lc) mi.languages = langs - reader.opf.smart_update(mi) + reader.opf.add_uuid_identifier(mi.uuid) + if apply_null: if not getattr(mi, 'series', None): reader.opf.series = None diff --git a/src/calibre/ebooks/metadata/opf2.py b/src/calibre/ebooks/metadata/opf2.py index 248c60e3a9..5d853288de 100644 --- a/src/calibre/ebooks/metadata/opf2.py +++ b/src/calibre/ebooks/metadata/opf2.py @@ -458,6 +458,7 @@ def serialize_user_metadata(metadata_elem, all_user_metadata, tail='\n'+(' '*8)) from calibre.utils.config import to_json from calibre.ebooks.metadata.book.json_codec import (object_to_unicode, encode_is_multiple) + for name, fm in all_user_metadata.items(): try: fm = copy.copy(fm) @@ -959,13 +960,14 @@ class OPF(object): # {{{ def fset(self, val): matches = self.uuid_id_path(self.metadata) if not matches: - attrib = {'{%s}scheme'%self.NAMESPACES['opf']: 'uuid', 'id':'uuid_id'} + attrib = {'{%s}scheme'%self.NAMESPACES['opf']: 'uuid'} matches = [self.create_metadata_element('identifier', attrib=attrib)] self.set_text(matches[0], unicode(val)) return property(fget=fget, fset=fset) + @dynamic_property def language(self): @@ -979,6 +981,7 @@ class OPF(object): # {{{ return property(fget=fget, fset=fset) + @dynamic_property def languages(self): @@ -1003,6 +1006,7 @@ class OPF(object): # {{{ return property(fget=fget, fset=fset) + @dynamic_property def book_producer(self): @@ -1148,18 +1152,20 @@ class OPF(object): # {{{ for attr in ('title', 'authors', 'author_sort', 'title_sort', 'publisher', 'series', 'series_index', 'rating', 'isbn', 'tags', 'category', 'comments', 'book_producer', - 'pubdate', 'user_categories', 'author_link_map','uuid'): + 'pubdate', 'user_categories', 'author_link_map'): val = getattr(mi, attr, None) if val is not None and val != [] and val != (None, None): setattr(self, attr, val) langs = getattr(mi, 'languages', []) if langs and langs != ['und']: self.languages = langs - self.get_identifiers = mi.get_identifiers temp = self.to_book_metadata() temp.smart_update(mi, replace_metadata=replace_metadata) self._user_metadata_ = temp.get_all_user_metadata(True) + def add_uuid_identifier(self,uuid): + setattr(self,'uuid',uuid) + # }}} class OPFCreator(Metadata):