def __init__(self, content_dict, **kwargs): super(AudiobookManifest, self).__init__(**kwargs) self.raw = content_dict # Metadata values that map directly onto the core spec. self.import_metadata('title') self.import_metadata('publisher') self.import_metadata('description') self.import_metadata('isbn', 'identifier') self.import_metadata('authors', 'author') self.import_metadata('narrators', 'narrator') self.import_metadata('minutes', 'duration', lambda x: x*60) # Metadata values that have no equivalent in the core spec, # but are potentially useful. self.import_metadata('size', 'schema:contentSize') self.import_metadata('titleid', 'rbdigital:id', str) self.import_metadata('hasDrm', 'rbdigital:hasDrm') self.import_metadata('encryptionKey', 'rbdigital:encryptionKey') # Spine items. for file_data in self.raw.get('files', []): self.import_spine(file_data) # Links. download_url = self.raw.get('downloadUrl') if download_url: self.add_link( download_url, 'alternate', type=Representation.guess_media_type(download_url) ) cover = self.best_cover(self.raw.get('images', [])) if cover: self.add_link( cover, "cover", type=Representation.guess_media_type(cover) )
def import_spine(self, file_data): """Import an RBdigital spine item as a Web Publication Manifest spine item. """ href = file_data.get('downloadUrl') duration = file_data.get('minutes') * 60 title = file_data.get('display') id = file_data.get('id') size = file_data.get('size') filename = file_data.get('filename') type = Representation.guess_media_type(filename) extra = {} for k, v, transform in ( ('id', 'rbdigital:id', str), ('size', 'schema:contentSize', lambda x: x), ('minutes', 'duration', lambda x: x * 60), ): if k in file_data: extra[v] = transform(file_data[k]) self.add_spine(href, type, title, **extra)