src/pyams_media/video.py
changeset 10 9296741c1470
parent 0 fd39db613f8b
child 24 0f4851b0aef3
--- a/src/pyams_media/video.py	Tue Sep 08 17:01:39 2015 +0200
+++ b/src/pyams_media/video.py	Tue Sep 08 17:02:16 2015 +0200
@@ -21,6 +21,8 @@
 
 # import interfaces
 from pyams_file.interfaces import IVideo, IThumbnail
+from pyams_media.interfaces import IVideoType
+from pyams_utils.interfaces.tales import ITALESExtension
 from zope.annotation.interfaces import IAnnotations
 from zope.traversing.interfaces import ITraversable
 
@@ -30,8 +32,9 @@
 from pyams_file.file import ImageFile, get_magic_content_type
 from pyams_file.image import ThumbnailGeometrry
 from pyams_media.ffbase import FFmpeg
-from pyams_utils.adapter import adapter_config, ContextAdapter
+from pyams_utils.adapter import adapter_config, ContextAdapter, ContextRequestViewAdapter
 from pyramid.threadlocal import get_current_registry
+from zope.interface import Interface
 from zope.lifecycleevent import ObjectCreatedEvent, ObjectAddedEvent
 from zope.location import locate
 
@@ -53,12 +56,11 @@
             return self.thumbnail.get_image_size()
         else:
             mpeg = FFmpeg('ffprobe')
-            streams = mpeg.info(self.video)
-            if streams:
-                for stream in streams:
-                    if stream.get('codec_type') != 'video':
-                        continue
-                    return stream.get('width'), stream.get('height')
+            streams = mpeg.info(self.video).get('streams', ())
+            for stream in streams:
+                if stream.get('codec_type') != 'video':
+                    continue
+                return stream.get('width'), stream.get('height')
 
     def get_thumbnail_size(self, thumbnail_name, forced=False):
         if self.thumbnail is not None:
@@ -161,3 +163,40 @@
         result = thumbnails.get_thumbnail(thumbnail_name, format)
         transaction.commit()
         return result
+
+
+#
+# Custom video types
+#
+
+@adapter_config(context=IVideo, provides=IVideoType)
+class VideoTypeAdapter(ContextAdapter):
+    """Default video content type adapter"""
+
+    @property
+    def video_type(self):
+        return self.context.content_type
+
+
+@adapter_config(name='video/x-flv', context=IVideo, provides=IVideoType)
+class FlashVideoTypeAdapter(ContextAdapter):
+    """Flash video content type adapter"""
+
+    @property
+    def video_type(self):
+        return b'video/flash'
+
+
+@adapter_config(name='video_type', context=(IVideo, Interface, Interface), provides=ITALESExtension)
+class VideoTypeExtension(ContextRequestViewAdapter):
+    """extension:video_type(media) TALES extension"""
+
+    def render(self, context=None):
+        if context is None:
+            context = self.context
+        registry = self.request.registry
+        adapter = registry.queryAdapter(context, IVideoType, name=context.content_type.decode())
+        if adapter is None:
+            adapter = registry.queryAdapter(context, IVideoType)
+        if adapter is not None:
+            return adapter.video_type.decode()