]> git.parisson.com Git - telemeta.git/commitdiff
add flag controller
authoryomguy <yomguy@parisson.com>
Mon, 30 May 2011 20:25:10 +0000 (22:25 +0200)
committeryomguy <yomguy@parisson.com>
Mon, 30 May 2011 20:25:10 +0000 (22:25 +0200)
setup.py
telemeta/models/media.py
telemeta/web/base.py

index d9228e63b61e97ba0c37de066ae14cea039d5646..f9251e9e47b8e9d13e30441a1c4b2658dbd80ecf 100644 (file)
--- 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 PellerinOlivier 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,
index 2b7fe39ab6d0f59cd8ea985f70be8a547b863f7e..313274396abfb253a9d40098bbe4763c6d222206 100644 (file)
@@ -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"
     
index 47ef17f04b00f722515ce0759c79152ad303b15b..6ebc8c8e68fc69b1722266fddeeca4e03d7158ef 100644 (file)
@@ -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)