diff --git a/src/calibre/library/server/opds.py b/src/calibre/library/server/opds.py index 41d3654890..79fac73e3d 100644 --- a/src/calibre/library/server/opds.py +++ b/src/calibre/library/server/opds.py @@ -22,7 +22,7 @@ from calibre.library.server import custom_fields_to_display from calibre.library.server.utils import format_tag_string, Offsets from calibre import guess_type, prepare_string_for_xml as xml from calibre.utils.icu import sort_key -from calibre.utils.date import as_utc +from calibre.utils.date import as_utc, is_date_undefined BASE_HREFS = { 0 : '/stanza', @@ -45,10 +45,11 @@ def unhexlify(x): return binascii.unhexlify(x).decode('utf-8') # Vocabulary for building OPDS feeds {{{ +DC_NS = 'http://purl.org/dc/terms/' E = ElementMaker(namespace='http://www.w3.org/2005/Atom', nsmap={ None : 'http://www.w3.org/2005/Atom', - 'dc' : 'http://purl.org/dc/terms/', + 'dc' : DC_NS, 'opds' : 'http://opds-spec.org/2010/catalog', }) @@ -205,7 +206,10 @@ def ACQUISITION_ENTRY(item, version, db, updated, CFM, CKEYS, prefix): idm = 'calibre' if version == 0 else 'uuid' id_ = 'urn:%s:%s'%(idm, item[FM['uuid']]) ans = E.entry(TITLE(title), E.author(E.name(authors)), ID(id_), - UPDATED(item[FM['last_modified']])) + UPDATED(item[FM['last_modified']]), E.published(item[FM['timestamp']].isoformat())) + if mi.pubdate and not is_date_undefined(mi.pubdate): + ans.append(ans.makeelement('{%s}date' % DC_NS)) + ans[-1].text = mi.pubdate.isoformat() if len(extra): ans.append(E.content(extra, type='xhtml')) formats = item[FM['formats']] diff --git a/src/calibre/srv/opds.py b/src/calibre/srv/opds.py index a1e50306e6..05d8b40bdd 100644 --- a/src/calibre/srv/opds.py +++ b/src/calibre/srv/opds.py @@ -20,7 +20,7 @@ from calibre.ebooks.metadata import fmt_sidx, authors_to_string from calibre.library.comments import comments_to_html from calibre import guess_type, prepare_string_for_xml as xml from calibre.utils.icu import sort_key -from calibre.utils.date import as_utc, timestampfromdt +from calibre.utils.date import as_utc, timestampfromdt, is_date_undefined from calibre.srv.errors import HTTPNotFound from calibre.srv.routes import endpoint @@ -54,10 +54,11 @@ def format_tag_string(tags, sep, joinval=', '): return joinval.join(tlist) if tlist else '' # Vocabulary for building OPDS feeds {{{ +DC_NS = 'http://purl.org/dc/terms/' E = ElementMaker(namespace='http://www.w3.org/2005/Atom', nsmap={ None : 'http://www.w3.org/2005/Atom', - 'dc' : 'http://purl.org/dc/terms/', + 'dc' : DC_NS, 'opds' : 'http://opds-spec.org/2010/catalog', }) @@ -198,7 +199,11 @@ def ACQUISITION_ENTRY(book_id, updated, request_context): extra.append(comments) if extra: extra = html_to_lxml('\n'.join(extra)) - ans = E.entry(TITLE(mi.title), E.author(E.name(authors_to_string(mi.authors))), ID('urn:uuid:' + mi.uuid), UPDATED(mi.last_modified)) + ans = E.entry(TITLE(mi.title), E.author(E.name(authors_to_string(mi.authors))), ID('urn:uuid:' + mi.uuid), UPDATED(mi.last_modified), + E.published(mi.timestamp.isoformat())) + if mi.pubdate and not is_date_undefined(mi.pubdate): + ans.append(ans.makeelement('{%s}date' % DC_NS)) + ans[-1].text = mi.pubdate.isoformat() if len(extra): ans.append(E.content(extra, type='xhtml')) get = partial(request_context.ctx.url_for, '/get', book_id=book_id, library_id=request_context.library_id)