From: yomguy Date: Thu, 12 May 2011 20:39:36 +0000 (+0200) Subject: add audio metadata tagging after streaming a compressed media : timeside trunk ... X-Git-Tag: 1.1~195 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=2a1059e3dd132d58f00cfd2a28294b4c053de8b9;p=telemeta.git add audio metadata tagging after streaming a compressed media : timeside trunk >= r297 NEEDED (just work for MP3) fix instruments and locations __unicode__ methods cleanup --- diff --git a/telemeta/models/__init__.py b/telemeta/models/__init__.py index 9bec6cce..bd207dc7 100644 --- a/telemeta/models/__init__.py +++ b/telemeta/models/__init__.py @@ -38,5 +38,6 @@ from telemeta.models.instrument import * from telemeta.models.enum import * from telemeta.models.system import * from telemeta.models.query import * +from telemeta.models.dublincore import * diff --git a/telemeta/models/instrument.py b/telemeta/models/instrument.py index 4e4b9837..037d1bad 100644 --- a/telemeta/models/instrument.py +++ b/telemeta/models/instrument.py @@ -66,6 +66,10 @@ class InstrumentRelation(ModelCore): class Meta(MetaCore): db_table = 'instrument_relations' unique_together = (('instrument', 'parent_instrument'),) + + def __unicode__(self): + sep = ' > ' + return self.parent_instrument.name + sep + self.instrument.name class InstrumentAliasRelation(ModelCore): "Instrument family other name" @@ -74,6 +78,10 @@ class InstrumentAliasRelation(ModelCore): instrument = ForeignKey('InstrumentAlias', related_name="relation", verbose_name=_('instrument')) + def __unicode__(self): + sep = ' : ' + return self.alias.name + sep + self.instrument.name + class Meta(MetaCore): db_table = 'instrument_alias_relations' unique_together = (('alias', 'instrument'),) diff --git a/telemeta/models/location.py b/telemeta/models/location.py index 131cb682..85bbc6bc 100644 --- a/telemeta/models/location.py +++ b/telemeta/models/location.py @@ -147,6 +147,9 @@ class LocationType(ModelCore): code = CharField(_('identifier'), max_length=64, unique=True, required=True) name = CharField(_('name'), max_length=150, required=True) + def __unicode__(self): + return self.name + class Meta(MetaCore): db_table = 'location_types' diff --git a/telemeta/models/media.py b/telemeta/models/media.py index 537bdd97..4a0489a6 100644 --- a/telemeta/models/media.py +++ b/telemeta/models/media.py @@ -416,3 +416,50 @@ class Search(ModelCore): return self.keywords +class DublinCoreToFormatMetadata(object): + """ a mapping class to get item DublinCore metadata dictionaries + in various audio metadata format (MP3, OGG, etc...)""" + + metadata_mapping = { + 'mp3' : { + 'title': 'TIT2', #title2 + 'creator': 'TCOM', #composer + 'creator': 'TPE1', #lead + 'identifier': 'UFID', #unique ID + 'relation': 'TALB', #album + 'type': 'TCON', #genre + 'publisher': 'TPUB', #publisher + 'date': 'TDRC', #year +# 'coverage': 'COMM', #comment + }, + 'ogg': { + 'creator': 'artist', + 'relation': 'album', + 'all': 'all', + }, + 'flac': { + 'creator': 'artist', + 'relation': 'album', + 'all': 'all', + }, + } + + def __init__(self, format): + self.format = format + + def get_metadata(self, dc_metadata): + mapp = self.metadata_mapping[self.format] + metadata = {} + keys_done = [] + for data in dc_metadata: + key = data[0] + value = data[1] + if value: + if key == 'date': + value = value.split(';')[0].split('=')[1].split('-')[0] + if key in mapp: + metadata[mapp[key]] = str(value) + elif 'all' in mapp.keys(): + metadata[key] = str(value) + keys_done.append(key) + return metadata diff --git a/telemeta/templates/telemeta_default/mediaitem_copy.html b/telemeta/templates/telemeta_default/mediaitem_copy.html index b302714b..f50285d1 100644 --- a/telemeta/templates/telemeta_default/mediaitem_copy.html +++ b/telemeta/templates/telemeta_default/mediaitem_copy.html @@ -29,7 +29,9 @@ {{ field.errors }} {{ field.label_tag }}: {% if field.html_name == "collection" %} - {{ field }}
 {% trans "Title" %} : {{ item.collection.title }} +  {% trans "Title" %} : {{ item.collection.title }}
+  {% trans "Code" %} : {{ item.collection.code }}
+ {{ field }} {% else %} {{ field }} {% endif %} diff --git a/telemeta/templates/telemeta_default/mediaitem_edit.html b/telemeta/templates/telemeta_default/mediaitem_edit.html index afa7f6f0..eca8d5ef 100644 --- a/telemeta/templates/telemeta_default/mediaitem_edit.html +++ b/telemeta/templates/telemeta_default/mediaitem_edit.html @@ -24,7 +24,9 @@ {{ item.file.name }}
{{ field }} {% else %} {% if field.html_name == "collection" %} - {{ field }}
 {% trans "Title" %} : {{ item.collection.title }} +  {% trans "Title" %} : {{ item.collection.title }}
+  {% trans "Code" %} : {{ item.collection.code }}
+ {{ field }} {% else %} {{ field }} {% endif %} diff --git a/telemeta/web/base.py b/telemeta/web/base.py index 5d90945f..dbbd2466 100644 --- a/telemeta/web/base.py +++ b/telemeta/web/base.py @@ -274,18 +274,13 @@ class WebView(object): analyzers = self.item_analyze(item) playlists = self.get_playlists(request) public_access = self.get_public_access(item.public_access, item.recorded_from_date, item.recorded_to_date) - - translation_list = ['OK', 'Cancel', 'Item' 'Marker', 'added to playlist'] - translations = {} - for term in translation_list: - translations[term] = ugettext(term) return render(request, template, {'item': item, 'export_formats': formats, 'visualizers': graphers, 'visualizer_id': grapher_id,'analysers': analyzers, 'audio_export_enabled': getattr(settings, 'TELEMETA_DOWNLOAD_ENABLED', True), 'previous' : previous, 'next' : next, 'marker': marker_id, 'playlists' : playlists, - 'public_access': public_access, 'translations': translations, + 'public_access': public_access, }) def get_public_access(self, access, date_from, date_to): @@ -531,8 +526,10 @@ class WebView(object): media = self.cache_export.dir + os.sep + file proc = encoder(media, streaming=True) proc.setup(channels=decoder.channels(), samplerate=decoder.samplerate()) -# metadata = dublincore.express_item(item).to_list() -# enc.set_metadata(metadata) + dc_metadata = dublincore.express_item(item).to_list() + mapping = DublinCoreToFormatMetadata(extension) + metadata = mapping.get_metadata(dc_metadata) + proc.set_metadata(metadata) response = HttpResponse(stream_from_processor(decoder, proc), mimetype = mime_type) else: # cache > stream