From cdf7270d53225d0535eaf9c576fcac48ab2e31ee Mon Sep 17 00:00:00 2001 From: yomguy Date: Mon, 30 May 2011 22:25:10 +0200 Subject: [PATCH] add flag controller --- setup.py | 2 +- telemeta/models/media.py | 13 +++++++++++++ telemeta/web/base.py | 20 +++++++++++++++----- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/setup.py b/setup.py index d9228e63..f9251e9e 100644 --- a/setup.py +++ b/setup.py @@ -48,7 +48,7 @@ setup( name = "Telemeta", url = "http://telemeta.org", description = "Web Audio Content Management System", - author = ["Guillaume Pellerin, Olivier Guilyardi", "Riccardo Zaccarelli"], + author = ["Guillaume Pellerin", "Olivier Guilyardi", "Riccardo Zaccarelli"], author_email = ["yomguy@parisson.com","olivier@samalyse.com", "riccardo.zaccarelli@gmail.com"], version = version, packages = packages, diff --git a/telemeta/models/media.py b/telemeta/models/media.py index 2b7fe39a..31327439 100644 --- a/telemeta/models/media.py +++ b/telemeta/models/media.py @@ -431,6 +431,19 @@ class MediaItemMarker(MediaResource): else: return self.public_id + +class MediaItemTranscodingFlag(ModelCore): + "Item flag to know if the MediaItem has been transcoded to a given format" + + item = ForeignKey('MediaItem', related_name="transcoding", verbose_name=_('item')) + mime_type = CharField(_('mime_type'), required=True) + date = DateTimeField(_('date'), auto_now=True) + value = BooleanField(_('transcoded')) + + class Meta(MetaCore): + db_table = 'media_transcoding' + + class Search(ModelCore): "Keywork search" diff --git a/telemeta/web/base.py b/telemeta/web/base.py index 47ef17f0..6ebc8c8e 100644 --- a/telemeta/web/base.py +++ b/telemeta/web/base.py @@ -80,10 +80,12 @@ def render(request, template, data = None, mimetype = None): return render_to_response(template, data, context_instance=RequestContext(request), mimetype=mimetype) -def stream_from_processor(__decoder, __processor): +def stream_from_processor(__decoder, __processor, __flag): while True: __frames, eodproc = __processor.process(*__decoder.process()) if eodproc: + __flag.value = True + __flag.save() break yield __processor.chunk @@ -487,7 +489,7 @@ class WebView(object): """Export a given media item in the specified format (OGG, FLAC, ...)""" item = MediaItem.objects.get(public_id=public_id) - + public_access = self.get_public_access(item.public_access, item.recorded_from_date, item.recorded_to_date) if (not public_access or not extension in settings.TELEMETA_STREAMING_FORMATS) and not request.user.is_staff: return HttpResponseRedirect('not_allowed/') @@ -503,6 +505,14 @@ class WebView(object): file = public_id + '.' + encoder.file_extension() audio = item.file.path + flag = MediaItemTranscodingFlag.objects.filter(item=item, mime_type=mime_type) + if not flag: + flag = MediaItemTranscodingFlag(item=item, mime_type=mime_type) + flag.value = False + flag.save() + else: + flag = flag[0] + analyzers = self.item_analyze(item) if analyzers: for analyzer in analyzers: @@ -521,14 +531,14 @@ class WebView(object): mapping = DublinCoreToFormatMetadata(extension) metadata = mapping.get_metadata(dc_metadata) media = self.cache_export.dir + os.sep + file - if not self.cache_export.exists(file): - decoder = timeside.decoder.FileDecoder(audio) + if not self.cache_export.exists(file) or flag.value == False: # source > encoder > stream + decoder = timeside.decoder.FileDecoder(audio) decoder.setup() proc = encoder(media, streaming=True) proc.setup(channels=decoder.channels(), samplerate=decoder.samplerate()) proc.set_metadata(metadata) - response = HttpResponse(stream_from_processor(decoder, proc), mimetype = mime_type) + response = HttpResponse(stream_from_processor(decoder, proc, flag), mimetype = mime_type) else: # cache > stream proc = encoder(media) -- 2.39.5