Prevent exception on transcoding failure (bug 460)
authorBoris Bobrov <breton@cynicmansion.ru>
Sat, 7 Mar 2015 10:30:43 +0000 (13:30 +0300)
committerBoris Bobrov <breton@cynicmansion.ru>
Thu, 19 Mar 2015 22:53:18 +0000 (01:53 +0300)
Fix an unhandled exception when video fails to transcode for some
reason. Closes bug 460.

mediagoblin/media_types/video/processing.py
mediagoblin/media_types/video/transcoders.py

index bf19522267cd7f0d141d0d2a3388fe810d31bb25..a85b232cc4c07ef27988b84dac006e5c1351eb72 100644 (file)
@@ -252,13 +252,15 @@ class CommonVideoProcessor(MediaProcessor):
         # metadata itself has container-related data in tags, like video-codec
         store_metadata(self.entry, metadata)
 
+        orig_dst_dimensions = (metadata.get_video_streams()[0].get_width(),
+                metadata.get_video_streams()[0].get_height())
+
         # Figure out whether or not we need to transcode this video or
         # if we can skip it
         if skip_transcode(metadata, medium_size):
             _log.debug('Skipping transcoding')
 
-            dst_dimensions = (metadata.get_video_streams()[0].get_width(),
-                    metadata.get_video_streams()[0].get_height())
+            dst_dimensions = orig_dst_dimensions
 
             # If there is an original and transcoded, delete the transcoded
             # since it must be of lower quality then the original
@@ -273,19 +275,23 @@ class CommonVideoProcessor(MediaProcessor):
                                       vorbis_quality=vorbis_quality,
                                       progress_callback=progress_callback,
                                       dimensions=tuple(medium_size))
-            video_info = self.transcoder.dst_data.get_video_streams()[0]
-            dst_dimensions = (video_info.get_width(), video_info.get_height())
-            self._keep_best()
-
-            # Push transcoded video to public storage
-            _log.debug('Saving medium...')
-            store_public(self.entry, 'webm_video', tmp_dst,
-                         self.name_builder.fill('{basename}.medium.webm'))
-            _log.debug('Saved medium')
-
-            self.entry.set_file_metadata('webm_video', **file_metadata)
-
-            self.did_transcode = True
+            if self.transcoder.dst_data:
+                video_info = self.transcoder.dst_data.get_video_streams()[0]
+                dst_dimensions = (video_info.get_width(),
+                                  video_info.get_height())
+                self._keep_best()
+
+                # Push transcoded video to public storage
+                _log.debug('Saving medium...')
+                store_public(self.entry, 'webm_video', tmp_dst,
+                             self.name_builder.fill('{basename}.medium.webm'))
+                _log.debug('Saved medium')
+
+                self.entry.set_file_metadata('webm_video', **file_metadata)
+
+                self.did_transcode = True
+            else:
+                dst_dimensions = orig_dst_dimensions
 
         # Save the width and height of the transcoded video
         self.entry.media_data_init(
index 3c060fd7099b12c33c2292a0bac6a02703a75bf5..ba469af2e80cb4f145727637494ed5930d2db958 100644 (file)
@@ -358,6 +358,7 @@ class VideoTranscoder(object):
                     _log.info('{percent}% done...'.format(percent=percent))
         elif message.type == Gst.MessageType.ERROR:
             _log.error('Got error: {0}'.format(message.parse_error()))
+            self.dst_data = None
             self.__stop()
 
     def __stop(self):