Modify CommonVideoPrcoessor to accomodate mulitple qualities
A few trivial modifciations like replacing store_metadata, etc needed to accomodate multiple qualities.
This commit is contained in:
parent
c62181f4bc
commit
16ef1164c1
@ -165,9 +165,10 @@ class CommonVideoProcessor(MediaProcessor):
|
|||||||
"""
|
"""
|
||||||
Provides a base for various video processing steps
|
Provides a base for various video processing steps
|
||||||
"""
|
"""
|
||||||
acceptable_files = ['original', 'best_quality', 'webm_video']
|
acceptable_files = ['original, best_quality', 'webm_144p', 'webm_360p',
|
||||||
|
'webm_480p', 'webm_720p', 'webm_1080p', 'webm_video']
|
||||||
|
|
||||||
def common_setup(self):
|
def common_setup(self, resolution=None):
|
||||||
self.video_config = mgg \
|
self.video_config = mgg \
|
||||||
.global_config['plugins'][MEDIA_TYPE]
|
.global_config['plugins'][MEDIA_TYPE]
|
||||||
|
|
||||||
@ -179,32 +180,23 @@ class CommonVideoProcessor(MediaProcessor):
|
|||||||
self.transcoder = transcoders.VideoTranscoder()
|
self.transcoder = transcoders.VideoTranscoder()
|
||||||
self.did_transcode = False
|
self.did_transcode = False
|
||||||
|
|
||||||
# Extract metadata and keep a record of it
|
if resolution:
|
||||||
self.metadata = transcoders.discover(self.process_filename)
|
self.curr_file = 'webm_' + str(resolution)
|
||||||
|
self.part_filename = (self.name_builder.fill('{basename}.' +
|
||||||
# metadata's stream info here is a DiscovererContainerInfo instance,
|
str(resolution) + '.webm'))
|
||||||
# it gets split into DiscovererAudioInfo and DiscovererVideoInfo;
|
else:
|
||||||
# metadata itself has container-related data in tags, like video-codec
|
self.curr_file = 'webm_video'
|
||||||
store_metadata(self.entry, self.metadata)
|
self.part_filename = self.name_builder.fill('{basename}.medium.webm')
|
||||||
|
|
||||||
def copy_original(self):
|
def copy_original(self):
|
||||||
# If we didn't transcode, then we need to keep the original
|
# If we didn't transcode, then we need to keep the original
|
||||||
if not self.did_transcode or \
|
raise NotImplementedError
|
||||||
(self.video_config['keep_original'] and self.did_transcode):
|
|
||||||
copy_original(
|
|
||||||
self.entry, self.process_filename,
|
|
||||||
self.name_builder.fill('{basename}{ext}'))
|
|
||||||
|
|
||||||
def _keep_best(self):
|
def _keep_best(self):
|
||||||
"""
|
"""
|
||||||
If there is no original, keep the best file that we have
|
If there is no original, keep the best file that we have
|
||||||
"""
|
"""
|
||||||
if not self.entry.media_files.get('best_quality'):
|
raise NotImplementedError
|
||||||
# Save the best quality file if no original?
|
|
||||||
if not self.entry.media_files.get('original') and \
|
|
||||||
self.entry.media_files.get('webm_video'):
|
|
||||||
self.entry.media_files['best_quality'] = self.entry \
|
|
||||||
.media_files['webm_video']
|
|
||||||
|
|
||||||
def _skip_processing(self, keyname, **kwargs):
|
def _skip_processing(self, keyname, **kwargs):
|
||||||
file_metadata = self.entry.get_file_metadata(keyname)
|
file_metadata = self.entry.get_file_metadata(keyname)
|
||||||
@ -213,7 +205,7 @@ class CommonVideoProcessor(MediaProcessor):
|
|||||||
return False
|
return False
|
||||||
skip = True
|
skip = True
|
||||||
|
|
||||||
if keyname == 'webm_video':
|
if 'webm' in keyname:
|
||||||
if kwargs.get('medium_size') != file_metadata.get('medium_size'):
|
if kwargs.get('medium_size') != file_metadata.get('medium_size'):
|
||||||
skip = False
|
skip = False
|
||||||
elif kwargs.get('vp8_quality') != file_metadata.get('vp8_quality'):
|
elif kwargs.get('vp8_quality') != file_metadata.get('vp8_quality'):
|
||||||
@ -233,8 +225,7 @@ class CommonVideoProcessor(MediaProcessor):
|
|||||||
def transcode(self, medium_size=None, vp8_quality=None, vp8_threads=None,
|
def transcode(self, medium_size=None, vp8_quality=None, vp8_threads=None,
|
||||||
vorbis_quality=None):
|
vorbis_quality=None):
|
||||||
progress_callback = ProgressCallback(self.entry)
|
progress_callback = ProgressCallback(self.entry)
|
||||||
tmp_dst = os.path.join(self.workbench.dir,
|
tmp_dst = os.path.join(self.workbench.dir, self.part_filename)
|
||||||
self.name_builder.fill('{basename}.medium.webm'))
|
|
||||||
|
|
||||||
if not medium_size:
|
if not medium_size:
|
||||||
medium_size = (
|
medium_size = (
|
||||||
@ -252,24 +243,23 @@ class CommonVideoProcessor(MediaProcessor):
|
|||||||
'vp8_quality': vp8_quality,
|
'vp8_quality': vp8_quality,
|
||||||
'vorbis_quality': vorbis_quality}
|
'vorbis_quality': vorbis_quality}
|
||||||
|
|
||||||
if self._skip_processing('webm_video', **file_metadata):
|
if self._skip_processing(self.curr_file, **file_metadata):
|
||||||
return
|
return
|
||||||
|
|
||||||
orig_dst_dimensions = (self.metadata.get_video_streams()[0].get_width(),
|
metadata = transcoders.discover(self.process_filename)
|
||||||
self.metadata.get_video_streams()[0].get_height())
|
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
|
# Figure out whether or not we need to transcode this video or
|
||||||
# if we can skip it
|
# if we can skip it
|
||||||
if skip_transcode(self.metadata, medium_size):
|
if skip_transcode(metadata, medium_size):
|
||||||
_log.debug('Skipping transcoding')
|
_log.debug('Skipping transcoding')
|
||||||
|
|
||||||
dst_dimensions = orig_dst_dimensions
|
|
||||||
|
|
||||||
# If there is an original and transcoded, delete the transcoded
|
# If there is an original and transcoded, delete the transcoded
|
||||||
# since it must be of lower quality then the original
|
# since it must be of lower quality then the original
|
||||||
if self.entry.media_files.get('original') and \
|
if self.entry.media_files.get('original') and \
|
||||||
self.entry.media_files.get('webm_video'):
|
self.entry.media_files.get(self.curr_file):
|
||||||
self.entry.media_files['webm_video'].delete()
|
self.entry.media_files[self.curr_file].delete()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.transcoder.transcode(self.process_filename, tmp_dst,
|
self.transcoder.transcode(self.process_filename, tmp_dst,
|
||||||
@ -279,27 +269,16 @@ class CommonVideoProcessor(MediaProcessor):
|
|||||||
progress_callback=progress_callback,
|
progress_callback=progress_callback,
|
||||||
dimensions=tuple(medium_size))
|
dimensions=tuple(medium_size))
|
||||||
if self.transcoder.dst_data:
|
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
|
# Push transcoded video to public storage
|
||||||
_log.debug('Saving medium...')
|
_log.debug('Saving medium...')
|
||||||
store_public(self.entry, 'webm_video', tmp_dst,
|
store_public(self.entry, 'webm_video', tmp_dst,
|
||||||
self.name_builder.fill('{basename}.medium.webm'))
|
self.name_builder.fill('{basename}.medium.webm'))
|
||||||
_log.debug('Saved medium')
|
_log.debug('Saved medium')
|
||||||
|
|
||||||
self.entry.set_file_metadata('webm_video', **file_metadata)
|
# Is this the file_metadata that paroneayea was talking about?
|
||||||
|
self.entry.set_file_metadata(self.curr_file, **file_metadata)
|
||||||
|
|
||||||
self.did_transcode = True
|
self.did_transcode = True
|
||||||
else:
|
|
||||||
dst_dimensions = orig_dst_dimensions
|
|
||||||
|
|
||||||
# Save the width and height of the transcoded video
|
|
||||||
self.entry.media_data_init(
|
|
||||||
width=dst_dimensions[0],
|
|
||||||
height=dst_dimensions[1])
|
|
||||||
|
|
||||||
def generate_thumb(self, thumb_size=None):
|
def generate_thumb(self, thumb_size=None):
|
||||||
# Temporary file for the video thumbnail (cleaned up with workbench)
|
# Temporary file for the video thumbnail (cleaned up with workbench)
|
||||||
@ -331,6 +310,17 @@ class CommonVideoProcessor(MediaProcessor):
|
|||||||
|
|
||||||
self.entry.set_file_metadata('thumb', thumb_size=thumb_size)
|
self.entry.set_file_metadata('thumb', thumb_size=thumb_size)
|
||||||
|
|
||||||
|
def store_orig_metadata(self):
|
||||||
|
|
||||||
|
# Extract metadata and keep a record of it
|
||||||
|
metadata = transcoders.discover(self.process_filename)
|
||||||
|
|
||||||
|
# metadata's stream info here is a DiscovererContainerInfo instance,
|
||||||
|
# it gets split into DiscovererAudioInfo and DiscovererVideoInfo;
|
||||||
|
# metadata itself has container-related data in tags, like video-codec
|
||||||
|
store_metadata(self.entry, metadata)
|
||||||
|
|
||||||
|
|
||||||
class InitialProcessor(CommonVideoProcessor):
|
class InitialProcessor(CommonVideoProcessor):
|
||||||
"""
|
"""
|
||||||
Initial processing steps for new video
|
Initial processing steps for new video
|
||||||
@ -387,9 +377,9 @@ class InitialProcessor(CommonVideoProcessor):
|
|||||||
'vorbis_quality', 'thumb_size'])
|
'vorbis_quality', 'thumb_size'])
|
||||||
|
|
||||||
def process(self, medium_size=None, vp8_threads=None, vp8_quality=None,
|
def process(self, medium_size=None, vp8_threads=None, vp8_quality=None,
|
||||||
vorbis_quality=None, thumb_size=None):
|
vorbis_quality=None, thumb_size=None, resolution=None):
|
||||||
self.common_setup()
|
self.common_setup(resolution=resolution)
|
||||||
|
self.store_orig_metadata()
|
||||||
self.transcode(medium_size=medium_size, vp8_quality=vp8_quality,
|
self.transcode(medium_size=medium_size, vp8_quality=vp8_quality,
|
||||||
vp8_threads=vp8_threads, vorbis_quality=vorbis_quality)
|
vp8_threads=vp8_threads, vorbis_quality=vorbis_quality)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user