Example #1
0
 def run(self, video_id, **kwargs):
     """
     Converts the Video and creates the related files.
     """
     logger = self.get_logger(**kwargs)
     Video.objects.filter(pk=video_id).update(status=Video.CONVERTING)
     try:
         video = Video.objects.get(pk=video_id)
     except Video.DoesNotExist:
         return 'Video was deleted'
     logger.info("Starting screen shoots of video %s" % video.pk)
     for preview in video.preview_set.all():
         preview.delete()
     options = ConvertOptions.objects.get(title='hq_file')
     source_file = NamedTemporaryFile(delete=False,
         suffix='.mp4', prefix='screen_shot_source')
     source_file.write(video.best_quality_file().read())
     logger.info("Downloaded best {0} ({1})".format(video, source_file.name))
     source_file.close()
     try:
         file_params = media_info(source_file.name)
     except OSError:
         self._error_handle(video)
         return "Stop screenshoot - bad source file"
     if not file_params.get('Video', None):
         self._error_handle(video)
         return "Stop screenshoot - bad source file"
     options.update(file_params)
     size = '{0}x{1}'.format(options.width, options.height)
     video.best_quality_file().open()
     duration = video.seconds_duration()
     if duration > 30:
         offset = 10
     else:
         offset = 1
     screenable_duration = duration - offset * 2
     previews_count = settings.PREVIEWS_COUNT
     if screenable_duration < 1:
         previews_count = screenable_duration = 1
     elif screenable_duration < previews_count:
         previews_count = screenable_duration
     step = screenable_duration / previews_count
     for offset in (offset+step for i in xrange(previews_count)):
         result_file = NamedTemporaryFile(suffix='.jpg',
             prefix='screen_shot')
         preview = Preview(owner=video)
         cmd = self.get_commandline(source_file.name, random.choice(
             range(offset, offset+step)), size, result_file.name)
         process = subprocess.call(cmd, shell=False)
         if process:
             Video.objects.filter(pk=video_id).update(status=Video.ERROR)
             logger.error("Some error during ffmpeging %s" % video.pk)
             return "Stop making screen shoots - video is deleted"
         try:
             orig = Image.open(result_file.name)
             img = orig.copy()
             result_file.close()
             preview_name = '{0}.jpg'.format(offset)
             preview.image = thumb_img(img, name=preview_name)
             preview.thumbnail = thumb_img(img, 190, name=preview_name)
             preview.icon = thumb_img(img, 60, name=preview_name)
             preview.save()
         except IOError:
             result_file.close()
             logger.error('error during imagining {0}'.format(
                 result_file.name))
     logger.info("Screened {0} ({1})".format(video, source_file.name))
     os.unlink(source_file.name)
     Video.objects.filter(pk=video_id).update(status=Video.READY)
     return "Ready"
Example #2
0
 def run(self, video_id, **kwargs):
     """
     Converts the Video and creates the related files.
     """
     #TODO: what if user update videofile during converting
     logger = self.get_logger(**kwargs)
     try:
         video = Video.objects.get(pk=video_id)
     except Video.DoesNotExist:
         return "Stop Convert - video is deleted"
     logger.info("Starting Video Post conversion: %s" % video)
     ext = os.path.splitext(video.original_file.name)[1]
     self.original_copy = NamedTemporaryFile(delete=False,
         prefix='video_source', suffix=ext)
     self.original_copy.write(video.original_file.file.read())
     video.original_file.open()
     self.original_copy.close()
     try:
         file_params = media_info(self.original_copy.name)
     except OSError:
         self._error_handle(video)
         return "Stop Convert - bad original file"
     if not file_params.get('Video', None):
         self._error_handle(video)
         return "Stop Convert - bad original file"
     video.duration = file_params['Video']['Duration']
     video.status = Video.CONVERTING
     video.save()
     for options in ConvertOptions.objects.all():
         options.update(file_params)
         file_field_name = options.title
         self.result_file_name = mktemp('.mp4', 'video')
         self.convert_options = options.as_commandline()
         setattr(video, file_field_name, None)
         video.save()
         process = subprocess.call(self.get_commandline(), shell=False)
         logger.info("Processed {0} ({1})".format(video, options.title))
         try:
             video = Video.objects.get(pk=video_id)
         except Video.DoesNotExist:
             os.unlink(self.original_copy.name)
             os.unlink(self.result_file_name)
             return "Stop Convert - video is deleted"
         if process:
             logger.error("some error during convert: %s" % video)
             stdout, stderr = process.communicate()
             logger.error('stdout: {0}'.format(stdout))
             logger.error('stderr: {0}'.format(stderr))
             video.status = Video.ERROR
         else:
             size = os.path.getsize(self.result_file_name)
             converted_file = InMemoryUploadedFile(
                 open(self.result_file_name), None,
                 '{0}.mp4'.format(options.title), 'video/mp4', size, None)
             setattr(video, file_field_name, converted_file)
         video.save()
         os.unlink(self.result_file_name)
         logger.info("Saved {0} of {1} (was {2})".format(options.title,
             video, self.result_file_name))
     os.unlink(self.original_copy.name)
     logger.info('Convert of {0} ready'.format(video))
     if video.best_quality_file():
         logger.info('Send task to screen {0}'.format(video))
         MakeScreenShots.delay(video_id)
     return "Ready"