refactor get_orig_filename to return an acceptable filename to the processor.

If there is an original video file and we skip transcoding, delete the webm_640 file
This commit is contained in:
Rodney Ewing 2013-08-15 08:54:09 -07:00
parent 9b1317e3e2
commit 1cefccc755
7 changed files with 94 additions and 65 deletions

View File

@ -26,7 +26,7 @@ from mediagoblin import mg_globals as mgg
from mediagoblin.processing import ( from mediagoblin.processing import (
create_pub_filepath, FilenameBuilder, create_pub_filepath, FilenameBuilder,
MediaProcessor, ProcessingManager, MediaProcessor, ProcessingManager,
get_orig_filename, copy_original, get_process_filename, copy_original,
store_public, request_from_args) store_public, request_from_args)
from mediagoblin.media_types.ascii import asciitoimage from mediagoblin.media_types.ascii import asciitoimage
@ -52,6 +52,8 @@ class CommonAsciiProcessor(MediaProcessor):
""" """
Provides a base for various ascii processing steps Provides a base for various ascii processing steps
""" """
acceptable_files = ['original', 'unicode']
def common_setup(self): def common_setup(self):
self.ascii_config = mgg.global_config[ self.ascii_config = mgg.global_config[
'media_type:mediagoblin.media_types.ascii'] 'media_type:mediagoblin.media_types.ascii']
@ -61,16 +63,16 @@ class CommonAsciiProcessor(MediaProcessor):
self.workbench.dir, 'convirsions') self.workbench.dir, 'convirsions')
os.mkdir(self.conversions_subdir) os.mkdir(self.conversions_subdir)
# Pull down and set up the original file # Pull down and set up the processing file
self.orig_filename = get_orig_filename( self.process_filename = get_process_filename(
self.entry, self.workbench) self.entry, self.workbench, self.acceptable_files)
self.name_builder = FilenameBuilder(self.orig_filename) self.name_builder = FilenameBuilder(self.process_filename)
self.charset = None self.charset = None
def copy_original(self): def copy_original(self):
copy_original( copy_original(
self.entry, self.orig_filename, self.entry, self.process_filename,
self.name_builder.fill('{basename}{ext}')) self.name_builder.fill('{basename}{ext}'))
def _detect_charset(self, orig_file): def _detect_charset(self, orig_file):
@ -91,7 +93,7 @@ class CommonAsciiProcessor(MediaProcessor):
orig_file.seek(0) orig_file.seek(0)
def store_unicode_file(self): def store_unicode_file(self):
with file(self.orig_filename, 'rb') as orig_file: with file(self.process_filename, 'rb') as orig_file:
self._detect_charset(orig_file) self._detect_charset(orig_file)
unicode_filepath = create_pub_filepath(self.entry, unicode_filepath = create_pub_filepath(self.entry,
'ascii-portable.txt') 'ascii-portable.txt')
@ -110,7 +112,7 @@ class CommonAsciiProcessor(MediaProcessor):
self.entry.media_files['unicode'] = unicode_filepath self.entry.media_files['unicode'] = unicode_filepath
def generate_thumb(self, font=None, thumb_size=None): def generate_thumb(self, font=None, thumb_size=None):
with file(self.orig_filename, 'rb') as orig_file: with file(self.process_filename, 'rb') as orig_file:
# If no font kwarg, check config # If no font kwarg, check config
if not font: if not font:
font = self.ascii_config.get('thumbnail_font', None) font = self.ascii_config.get('thumbnail_font', None)

View File

@ -22,7 +22,7 @@ from mediagoblin import mg_globals as mgg
from mediagoblin.processing import ( from mediagoblin.processing import (
BadMediaFail, FilenameBuilder, BadMediaFail, FilenameBuilder,
ProgressCallback, MediaProcessor, ProcessingManager, ProgressCallback, MediaProcessor, ProcessingManager,
request_from_args, get_orig_filename, request_from_args, get_process_filename,
store_public, copy_original) store_public, copy_original)
from mediagoblin.media_types.audio.transcoders import ( from mediagoblin.media_types.audio.transcoders import (
@ -52,6 +52,7 @@ class CommonAudioProcessor(MediaProcessor):
""" """
Provides a base for various audio processing steps Provides a base for various audio processing steps
""" """
acceptable_files = ['original', 'webm_audio']
def common_setup(self): def common_setup(self):
""" """
@ -61,10 +62,10 @@ class CommonAudioProcessor(MediaProcessor):
self.audio_config = mgg \ self.audio_config = mgg \
.global_config['media_type:mediagoblin.media_types.audio'] .global_config['media_type:mediagoblin.media_types.audio']
# Pull down and set up the original file # Pull down and set up the processing file
self.orig_filename = get_orig_filename( self.process_filename = get_process_filename(
self.entry, self.workbench) self.entry, self.workbench, self.acceptable_files)
self.name_builder = FilenameBuilder(self.orig_filename) self.name_builder = FilenameBuilder(self.process_filename)
self.transcoder = AudioTranscoder() self.transcoder = AudioTranscoder()
self.thumbnailer = AudioThumbnailer() self.thumbnailer = AudioThumbnailer()
@ -72,7 +73,7 @@ class CommonAudioProcessor(MediaProcessor):
def copy_original(self): def copy_original(self):
if self.audio_config['keep_original']: if self.audio_config['keep_original']:
copy_original( copy_original(
self.entry, self.orig_filename, self.entry, self.process_filename,
self.name_builder.fill('{basename}{ext}')) self.name_builder.fill('{basename}{ext}'))
def transcode(self, quality=None): def transcode(self, quality=None):
@ -85,7 +86,7 @@ class CommonAudioProcessor(MediaProcessor):
'{basename}{ext}')) '{basename}{ext}'))
self.transcoder.transcode( self.transcoder.transcode(
self.orig_filename, self.process_filename,
webm_audio_tmp, webm_audio_tmp,
quality=quality, quality=quality,
progress_callback=progress_callback) progress_callback=progress_callback)
@ -107,7 +108,7 @@ class CommonAudioProcessor(MediaProcessor):
_log.info('Creating OGG source for spectrogram') _log.info('Creating OGG source for spectrogram')
self.transcoder.transcode( self.transcoder.transcode(
self.orig_filename, self.process_filename,
wav_tmp, wav_tmp,
mux_string='vorbisenc quality={0} ! oggmux'.format( mux_string='vorbisenc quality={0} ! oggmux'.format(
self.audio_config['quality'])) self.audio_config['quality']))

View File

@ -26,7 +26,7 @@ from mediagoblin import mg_globals as mgg
from mediagoblin.processing import ( from mediagoblin.processing import (
BadMediaFail, FilenameBuilder, BadMediaFail, FilenameBuilder,
MediaProcessor, ProcessingManager, MediaProcessor, ProcessingManager,
request_from_args, get_orig_filename, request_from_args, get_process_filename,
store_public, copy_original) store_public, copy_original)
from mediagoblin.tools.exif import exif_fix_image_orientation, \ from mediagoblin.tools.exif import exif_fix_image_orientation, \
extract_exif, clean_exif, get_gps_data, get_useful, \ extract_exif, clean_exif, get_gps_data, get_useful, \
@ -131,6 +131,9 @@ class CommonImageProcessor(MediaProcessor):
""" """
Provides a base for various media processing steps Provides a base for various media processing steps
""" """
# list of acceptable file keys in order of prefrence for reprocessing
acceptable_files = ['original', 'medium']
def common_setup(self): def common_setup(self):
""" """
Set up the workbench directory and pull down the original file Set up the workbench directory and pull down the original file
@ -144,13 +147,13 @@ class CommonImageProcessor(MediaProcessor):
self.workbench.dir, 'convirsions') self.workbench.dir, 'convirsions')
os.mkdir(self.conversions_subdir) os.mkdir(self.conversions_subdir)
# Pull down and set up the original file # Pull down and set up the processing file
self.orig_filename = get_orig_filename( self.process_filename = get_process_filename(
self.entry, self.workbench) self.entry, self.workbench, self.acceptable_files)
self.name_builder = FilenameBuilder(self.orig_filename) self.name_builder = FilenameBuilder(self.process_filename)
# Exif extraction # Exif extraction
self.exif_tags = extract_exif(self.orig_filename) self.exif_tags = extract_exif(self.process_filename)
def generate_medium_if_applicable(self, size=None, quality=None, def generate_medium_if_applicable(self, size=None, quality=None,
filter=None): filter=None):
@ -159,7 +162,7 @@ class CommonImageProcessor(MediaProcessor):
if not filter: if not filter:
filter = self.image_config['resize_filter'] filter = self.image_config['resize_filter']
resize_tool(self.entry, False, 'medium', self.orig_filename, resize_tool(self.entry, False, 'medium', self.process_filename,
self.name_builder.fill('{basename}.medium{ext}'), self.name_builder.fill('{basename}.medium{ext}'),
self.conversions_subdir, self.exif_tags, quality, self.conversions_subdir, self.exif_tags, quality,
filter, size) filter, size)
@ -170,14 +173,14 @@ class CommonImageProcessor(MediaProcessor):
if not filter: if not filter:
filter = self.image_config['resize_filter'] filter = self.image_config['resize_filter']
resize_tool(self.entry, True, 'thumb', self.orig_filename, resize_tool(self.entry, True, 'thumb', self.process_filename,
self.name_builder.fill('{basename}.thumbnail{ext}'), self.name_builder.fill('{basename}.thumbnail{ext}'),
self.conversions_subdir, self.exif_tags, quality, self.conversions_subdir, self.exif_tags, quality,
filter, size) filter, size)
def copy_original(self): def copy_original(self):
copy_original( copy_original(
self.entry, self.orig_filename, self.entry, self.process_filename,
self.name_builder.fill('{basename}{ext}')) self.name_builder.fill('{basename}{ext}'))
def extract_metadata(self): def extract_metadata(self):

View File

@ -23,7 +23,7 @@ from mediagoblin import mg_globals as mgg
from mediagoblin.processing import ( from mediagoblin.processing import (
FilenameBuilder, BadMediaFail, FilenameBuilder, BadMediaFail,
MediaProcessor, ProcessingManager, MediaProcessor, ProcessingManager,
request_from_args, get_orig_filename, request_from_args, get_process_filename,
store_public, copy_original) store_public, copy_original)
from mediagoblin.tools.translate import fake_ugettext_passthrough as _ from mediagoblin.tools.translate import fake_ugettext_passthrough as _
@ -239,20 +239,22 @@ class CommonPdfProcessor(MediaProcessor):
""" """
Provides a base for various pdf processing steps Provides a base for various pdf processing steps
""" """
acceptable_files = ['original', 'pdf']
def common_setup(self): def common_setup(self):
""" """
Set up common pdf processing steps Set up common pdf processing steps
""" """
# Pull down and set up the original file # Pull down and set up the processing file
self.orig_filename = get_orig_filename( self.process_filename = get_process_filename(
self.entry, self.workbench) self.entry, self.workbench, self.acceptable_files)
self.name_builder = FilenameBuilder(self.orig_filename) self.name_builder = FilenameBuilder(self.process_filename)
self._set_pdf_filename() self._set_pdf_filename()
def _set_pdf_filename(self): def _set_pdf_filename(self):
if self.name_builder.ext == 'pdf': if self.name_builder.ext == 'pdf':
self.pdf_filename = self.orig_filename self.pdf_filename = self.process_filename
elif self.entry.media_files.get('pdf'): elif self.entry.media_files.get('pdf'):
self.pdf_filename = self.workbench.localized_file( self.pdf_filename = self.workbench.localized_file(
mgg.public_store, self.entry.media_files['pdf']) mgg.public_store, self.entry.media_files['pdf'])
@ -261,7 +263,7 @@ class CommonPdfProcessor(MediaProcessor):
def copy_original(self): def copy_original(self):
copy_original( copy_original(
self.entry, self.orig_filename, self.entry, self.process_filename,
self.name_builder.fill('{basename}{ext}')) self.name_builder.fill('{basename}{ext}'))
def generate_thumb(self, thumb_size=None): def generate_thumb(self, thumb_size=None):
@ -290,11 +292,11 @@ class CommonPdfProcessor(MediaProcessor):
""" """
Store the pdf. If the file is not a pdf, make it a pdf Store the pdf. If the file is not a pdf, make it a pdf
""" """
tmp_pdf = self.orig_filename tmp_pdf = self.process_filename
unoconv = where('unoconv') unoconv = where('unoconv')
Popen(executable=unoconv, Popen(executable=unoconv,
args=[unoconv, '-v', '-f', 'pdf', self.orig_filename]).wait() args=[unoconv, '-v', '-f', 'pdf', self.process_filename]).wait()
if not os.path.exists(tmp_pdf): if not os.path.exists(tmp_pdf):
_log.debug('unoconv failed to convert file to pdf') _log.debug('unoconv failed to convert file to pdf')

View File

@ -25,7 +25,7 @@ from mediagoblin import mg_globals as mgg
from mediagoblin.processing import ( from mediagoblin.processing import (
FilenameBuilder, MediaProcessor, FilenameBuilder, MediaProcessor,
ProcessingManager, request_from_args, ProcessingManager, request_from_args,
get_orig_filename, store_public, get_process_filename, store_public,
copy_original) copy_original)
from mediagoblin.media_types.stl import model_loader from mediagoblin.media_types.stl import model_loader
@ -83,12 +83,13 @@ class CommonStlProcessor(MediaProcessor):
""" """
Provides a common base for various stl processing steps Provides a common base for various stl processing steps
""" """
acceptable_files = ['original']
def common_setup(self): def common_setup(self):
# Pull down and set up the original file # Pull down and set up the processing file
self.orig_filename = get_orig_filename( self.process_filename = get_process_filename(
self.entry, self.workbench) self.entry, self.workbench, self.acceptable_files)
self.name_builder = FilenameBuilder(self.orig_filename) self.name_builder = FilenameBuilder(self.process_filename)
self._set_ext() self._set_ext()
self._set_model() self._set_model()
@ -107,7 +108,7 @@ class CommonStlProcessor(MediaProcessor):
Attempt to parse the model file and divine some useful Attempt to parse the model file and divine some useful
information about it. information about it.
""" """
with open(self.orig_filename, 'rb') as model_file: with open(self.process_filename, 'rb') as model_file:
self.model = model_loader.auto_detect(model_file, self.ext) self.model = model_loader.auto_detect(model_file, self.ext)
def _set_greatest(self): def _set_greatest(self):
@ -117,14 +118,14 @@ class CommonStlProcessor(MediaProcessor):
def copy_original(self): def copy_original(self):
copy_original( copy_original(
self.entry, self.orig_filename, self.entry, self.process_filename,
self.name_builder.fill('{basename}{ext}')) self.name_builder.fill('{basename}{ext}'))
def _snap(self, keyname, name, camera, size, project="ORTHO"): def _snap(self, keyname, name, camera, size, project="ORTHO"):
filename = self.name_builder.fill(name) filename = self.name_builder.fill(name)
workbench_path = self.workbench.joinpath(filename) workbench_path = self.workbench.joinpath(filename)
shot = { shot = {
"model_path": self.orig_filename, "model_path": self.process_filename,
"model_ext": self.ext, "model_ext": self.ext,
"camera_coord": camera, "camera_coord": camera,
"camera_focus": self.model.average, "camera_focus": self.model.average,

View File

@ -24,7 +24,7 @@ from mediagoblin.processing import (
FilenameBuilder, BaseProcessingFail, FilenameBuilder, BaseProcessingFail,
ProgressCallback, MediaProcessor, ProgressCallback, MediaProcessor,
ProcessingManager, request_from_args, ProcessingManager, request_from_args,
get_orig_filename, store_public, get_process_filename, store_public,
copy_original) copy_original)
from mediagoblin.tools.translate import lazy_pass_to_ugettext as _ from mediagoblin.tools.translate import lazy_pass_to_ugettext as _
@ -122,15 +122,16 @@ class CommonVideoProcessor(MediaProcessor):
""" """
Provides a base for various video processing steps Provides a base for various video processing steps
""" """
acceptable_files = ['original', 'webm_640']
def common_setup(self): def common_setup(self):
self.video_config = mgg \ self.video_config = mgg \
.global_config['media_type:mediagoblin.media_types.video'] .global_config['media_type:mediagoblin.media_types.video']
# Pull down and set up the original file # Pull down and set up the processing file
self.orig_filename = get_orig_filename( self.process_filename = get_process_filename(
self.entry, self.workbench) self.entry, self.workbench, self.acceptable_files)
self.name_builder = FilenameBuilder(self.orig_filename) self.name_builder = FilenameBuilder(self.process_filename)
self.transcoder = transcoders.VideoTranscoder() self.transcoder = transcoders.VideoTranscoder()
self.did_transcode = False self.did_transcode = False
@ -140,7 +141,7 @@ class CommonVideoProcessor(MediaProcessor):
if not self.did_transcode or \ if not self.did_transcode or \
(self.video_config['keep_original'] and self.did_transcode): (self.video_config['keep_original'] and self.did_transcode):
copy_original( copy_original(
self.entry, self.orig_filename, self.entry, self.process_filename,
self.name_builder.fill('{basename}{ext}')) self.name_builder.fill('{basename}{ext}'))
def transcode(self, medium_size=None, vp8_quality=None, vp8_threads=None, def transcode(self, medium_size=None, vp8_quality=None, vp8_threads=None,
@ -161,7 +162,7 @@ class CommonVideoProcessor(MediaProcessor):
vorbis_quality = self.video_config['vorbis_quality'] vorbis_quality = self.video_config['vorbis_quality']
# Extract metadata and keep a record of it # Extract metadata and keep a record of it
metadata = self.transcoder.discover(self.orig_filename) metadata = self.transcoder.discover(self.process_filename)
store_metadata(self.entry, metadata) store_metadata(self.entry, metadata)
# Figure out whether or not we need to transcode this video or # Figure out whether or not we need to transcode this video or
@ -171,8 +172,14 @@ class CommonVideoProcessor(MediaProcessor):
dst_dimensions = metadata['videowidth'], metadata['videoheight'] dst_dimensions = metadata['videowidth'], metadata['videoheight']
# If there is an original and transcoded, delete the transcoded
# since it must be of lower quality then the original
if self.entry.media_files.get('original') and \
self.entry.media_files.get('webm_640'):
self.entry.media_files['webm_640'].delete()
else: else:
self.transcoder.transcode(self.orig_filename, tmp_dst, self.transcoder.transcode(self.process_filename, tmp_dst,
vp8_quality=vp8_quality, vp8_quality=vp8_quality,
vp8_threads=vp8_threads, vp8_threads=vp8_threads,
vorbis_quality=vorbis_quality, vorbis_quality=vorbis_quality,
@ -206,7 +213,7 @@ class CommonVideoProcessor(MediaProcessor):
mgg.global_config['media:thumb']['max_height']) mgg.global_config['media:thumb']['max_height'])
transcoders.VideoThumbnailerMarkII( transcoders.VideoThumbnailerMarkII(
self.orig_filename, self.process_filename,
tmp_thumb, tmp_thumb,
thumb_size[0], thumb_size[0],
thumb_size[1]) thumb_size[1])

View File

@ -327,29 +327,34 @@ def mark_entry_failed(entry_id, exc):
u'fail_metadata': {}}) u'fail_metadata': {}})
def get_orig_filename(entry, workbench): def get_process_filename(entry, workbench, acceptable_files):
""" """
Get the a filename for the original, on local storage Try and get the queued file if available, otherwise return the first file
in the acceptable_files that we have.
If the media entry has a queued_media_file, use that, otherwise If no acceptable_files, raise ProcessFileNotFound
use the original.
In the future, this will return the highest quality file available
if neither the original or queued file are available by checking
some ordered list of preferred keys.
""" """
if entry.queued_media_file: if entry.queued_media_file:
orig_filepath = entry.queued_media_file filepath = entry.queued_media_file
storage = mgg.queue_store storage = mgg.queue_store
else: else:
orig_filepath = entry.media_files['original'] for keyname in acceptable_files:
storage = mgg.public_store if entry.media_files.get(keyname):
filepath = entry.media_files[keyname]
storage = mgg.public_store
break
orig_filename = workbench.localized_file( if not filepath:
storage, orig_filepath, raise ProcessFileNotFound()
filename = workbench.localized_file(
storage, filepath,
'source') 'source')
return orig_filename if not os.path.exists(filename):
raise ProcessFileNotFound()
return filename
def store_public(entry, keyname, local_file, target_name=None, def store_public(entry, keyname, local_file, target_name=None,
@ -415,3 +420,11 @@ class PublicStoreFail(BaseProcessingFail):
Error that should be raised when copying to public store fails Error that should be raised when copying to public store fails
""" """
general_message = _('Copying to public storage failed.') general_message = _('Copying to public storage failed.')
class ProcessFileNotFound(BaseProcessingFail):
"""
Error that should be raised when an acceptable file for processing
is not found.
"""
general_message = _(u'An acceptable processing file was not found')