Extrapolate type= based on the video metadata that we have, if we can.
authorChristopher Allan Webber <cwebber@dustycloud.org>
Sun, 3 Mar 2013 17:41:40 +0000 (11:41 -0600)
committerChristopher Allan Webber <cwebber@dustycloud.org>
Sun, 3 Mar 2013 17:41:40 +0000 (11:41 -0600)
It's kind of awkward because it relies on there being a entry.media_data,
but that's not guaranteed... (see http://issues.mediagoblin.org/ticket/650)
so we use a dopey fallback in the template in that case (kind of
annoying info duplication).

This commit sponsored by Piotr Wieczorek.  Thank you!

mediagoblin/media_types/video/models.py
mediagoblin/media_types/video/util.py
mediagoblin/templates/mediagoblin/media_displays/video.html

index e0043718f05e9ed2aa7a68dbf0b6b4bf268b3603..4639b8c823da1bfecb7c652fd246a95e86a22bd7 100644 (file)
@@ -26,6 +26,8 @@ from mediagoblin.db.extratypes import JSONEncoded
 BACKREF_NAME = "video__media_data"
 
 
+DEFAULT_WEBM_TYPE = 'video/webm; codecs="vp8, vorbis"'
+
 class VideoData(Base):
     """
     Attributes:
@@ -57,6 +59,33 @@ class VideoData(Base):
 
     orig_metadata = Column(JSONEncoded)
 
+    def source_type(self):
+        """
+        Construct a useful type=... that is to say, used like:
+          <video><source type="{{ entry.media_data.source_type() }}" /></video>
+
+        Try to construct it out of self.orig_metadata... if we fail we
+        just dope'ily fall back on DEFAULT_WEBM_TYPE
+        """
+        orig_metadata = self.orig_metadata or {}
+
+        if "webm_640" not in self.get_media_entry.media_files \
+           and "mimetype" in orig_metadata \
+           and "tags" in orig_metadata \
+           and "audio-codec" in orig_metadata["tags"] \
+           and "video-codec" in orig_metadata["tags"]:
+            if orig_metadata['mimetype'] == 'application/ogg':
+                # stupid ambiguous .ogg extension
+                mimetype = "video/ogg"
+            else:
+                mimetype = orig_metadata['mimetype']
+            return '%s; codecs="%s, %s"' % (
+                mimetype,
+                orig_metadata["tags"]["video-codec"].lower(),
+                orig_metadata["tags"]["audio-codec"].lower())
+        else:
+            return DEFAULT_WEBM_TYPE
+
 
 DATA_MODEL = VideoData
 MODELS = [VideoData]
index 93f098f7acd61ea25deb1b668547a341e6371eb0..5765ecfb1fe01c7752268a8fe5ab90920666d03c 100644 (file)
@@ -57,4 +57,3 @@ def skip_transcode(metadata):
             return False
 
     return True
-
index d30c6a2bcb6b602b55fe7e9a2e9c8e32ade5c551..dc0c7b55fcb12cd0d7568a56e5028e108f1e9e7c 100644 (file)
          data-setup='{"height": {{ media.media_data.height }},
                       "width": {{ media.media_data.width }} }'>
     <source src="{{ request.app.public_store.file_url(display_path) }}"
-            type="video/webm; codecs=&quot;vp8, vorbis&quot;" />
+            {% if media.media_data %}
+              type="{{ media.media_data.source_type() }}"
+            {% else %}
+              type="video/webm; codecs=&quot;vp8, vorbis&quot;"
+            {% endif %} />
     <div class="no_html5">
       {%- trans -%}Sorry, this video will not work because
       your web browser does not support HTML5