Refactor processing/reprocessing functions into ProcessImage class

This commit is contained in:
Rodney Ewing 2013-08-06 09:47:09 -07:00
parent 3988c9d66d
commit 7ac66a3dd0
2 changed files with 111 additions and 101 deletions

View File

@ -13,17 +13,13 @@
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import argparse
import datetime
import logging
from mediagoblin.db.models import MediaEntry
from mediagoblin.media_types import MediaManagerBase
from mediagoblin.media_types.image.processing import ProcessImage, \
sniff_handler
from mediagoblin.submit.lib import run_process_media
from mediagoblin.tools import pluginapi
from mediagoblin.tools.translate import lazy_pass_to_ugettext as _
_log = logging.getLogger(__name__)
@ -71,105 +67,11 @@ def get_media_type_and_manager(ext):
return MEDIA_TYPE, ImageMediaManager
def reprocess_action(args):
"""
List the available actions for media in a given state
"""
if args[0].state == 'processed':
print _('\n Available reprocessing actions for processed images:'
'\n \t --resize: thumb or medium'
'\n Options:'
'\n \t --size: max_width max_height (defaults to config specs)')
return True
def _parser(args):
"""
Parses the unknown args from the gmg parser
"""
parser = argparse.ArgumentParser()
parser.add_argument(
'--resize',
choices=['thumb', 'medium'])
parser.add_argument(
'--size',
nargs=2,
type=int)
parser.add_argument(
'--initial_processing',
action='store_true')
return parser.parse_args(args[1])
def _check_eligible(entry_args, reprocess_args):
"""
Check to see if we can actually process the given media as requested
"""
if entry_args.state == 'processed':
if reprocess_args.initial_processing:
raise Exception(_('You can not run --initial_processing on media'
' that has already been processed.'))
if entry_args.state == 'failed':
if reprocess_args.resize:
raise Exception(_('You can not run --resize on media that has not'
' been processed.'))
if reprocess_args.size:
_log.warn('With --initial_processing, the --size flag will be'
' ignored.')
if entry_args.state == 'processing':
raise Exception(_('We currently do not support reprocessing on media'
' that is in the "processing" state.'))
def media_reprocess(args):
reprocess_args = _parser(args)
entry_args = args[0]
# Can we actually process the given media as requested?
_check_eligible(entry_args, reprocess_args)
# Do we want to re-try initial processing?
if reprocess_args.initial_processing:
for id in entry_args.media_id:
entry = MediaEntry.query.filter_by(id=id).first()
run_process_media(entry)
# Are we wanting to resize the thumbnail or medium?
elif reprocess_args.resize:
# reprocess all given media entries
for id in entry_args.media_id:
entry = MediaEntry.query.filter_by(id=id).first()
# For now we can only reprocess with the original file
if not entry.media_files.get('original'):
raise Exception(_('The original file for this media entry'
' does not exist.'))
reprocess_info = {'resize': reprocess_args.resize}
if reprocess_args.size:
reprocess_info['max_width'] = reprocess_args.size[0]
reprocess_info['max_height'] = reprocess_args.size[1]
run_process_media(entry, reprocess_info=reprocess_info)
# If we are here, they forgot to tell us how to reprocess
else:
_log.warn('You must set either --resize or --initial_processing flag'
' to reprocess an image.')
hooks = {
'setup': setup_plugin,
'get_media_type_and_manager': get_media_type_and_manager,
'sniff_handler': sniff_handler,
('media_manager', MEDIA_TYPE): lambda: ImageMediaManager,
('reprocess_action', 'image'): reprocess_action,
('media_reprocess', 'image'): media_reprocess,
('reprocess_action', 'image'): ProcessImage().reprocess_action,
('media_reprocess', 'image'): ProcessImage().media_reprocess,
}

View File

@ -20,12 +20,16 @@ except ImportError:
import Image
import os
import logging
import argparse
from mediagoblin import mg_globals as mgg
from mediagoblin.db.models import MediaEntry
from mediagoblin.processing import BadMediaFail, FilenameBuilder
from mediagoblin.submit.lib import run_process_media
from mediagoblin.tools.exif import exif_fix_image_orientation, \
extract_exif, clean_exif, get_gps_data, get_useful, \
exif_image_needs_rotation
from mediagoblin.tools.translate import lazy_pass_to_ugettext as _
_log = logging.getLogger(__name__)
@ -147,6 +151,58 @@ class ProcessImage(object):
os.mkdir(self.conversions_subdir)
def reprocess_action(self, args):
"""
List the available actions for media in a given state
"""
if args[0].state == 'processed':
print _('\n Available reprocessing actions for processed images:'
'\n \t --resize: thumb or medium'
'\n Options:'
'\n \t --size: max_width max_height (defaults to'
'config specs)')
return True
def _parser(self, args):
"""
Parses the unknown args from the gmg parser
"""
parser = argparse.ArgumentParser()
parser.add_argument(
'--resize',
choices=['thumb', 'medium'])
parser.add_argument(
'--size',
nargs=2,
type=int)
parser.add_argument(
'--initial_processing',
action='store_true')
return parser.parse_args(args[1])
def _check_eligible(self, entry_args, reprocess_args):
"""
Check to see if we can actually process the given media as requested
"""
if entry_args.state == 'processed':
if reprocess_args.initial_processing:
raise Exception(_('You can not run --initial_processing on'
' media that has already been processed.'))
if entry_args.state == 'failed':
if reprocess_args.resize:
raise Exception(_('You can not run --resize on media that has'
' not been processed.'))
if reprocess_args.size:
_log.warn('With --initial_processing, the --size flag will be'
' ignored.')
if entry_args.state == 'processing':
raise Exception(_('We currently do not support reprocessing on'
' media that is in the "processing" state.'))
def initial_processing(self):
# Is there any GPS data
gps_data = get_gps_data(self.exif_tags)
@ -179,9 +235,14 @@ class ProcessImage(object):
self.entry.media_data_init(**gps_data)
def reprocess(self, reprocess_info):
"""
This function actually does the reprocessing when called by
ProcessMedia in gmg/processing/task.py
"""
new_size = None
# Did they specify a size?
# Did they specify a size? They must specify either both or none, so
# we only need to check if one is present
if reprocess_info.get('max_width'):
max_width = reprocess_info['max_width']
max_height = reprocess_info['max_height']
@ -192,6 +253,53 @@ class ProcessImage(object):
self.name_builder.fill('{basename}.medium{ext}'),
self.conversions_subdir, self.exif_tags, new_size)
def media_reprocess(self, args):
"""
This function handles the all of the reprocessing logic, before calling
gmg/submit/lib/run_process_media
"""
reprocess_args = self._parser(args)
entry_args = args[0]
# Can we actually process the given media as requested?
self._check_eligible(entry_args, reprocess_args)
# Do we want to re-try initial processing?
if reprocess_args.initial_processing:
for id in entry_args.media_id:
entry = MediaEntry.query.filter_by(id=id).first()
run_process_media(entry)
# Are we wanting to resize the thumbnail or medium?
elif reprocess_args.resize:
# reprocess all given media entries
for id in entry_args.media_id:
entry = MediaEntry.query.filter_by(id=id).first()
# For now we can only reprocess with the original file
if not entry.media_files.get('original'):
raise Exception(_('The original file for this media entry'
' does not exist.'))
reprocess_info = self._get_reprocess_info(reprocess_args)
run_process_media(entry, reprocess_info=reprocess_info)
# If we are here, they forgot to tell us how to reprocess
else:
_log.warn('You must set either --resize or --initial_processing'
' flag to reprocess an image.')
def _get_reprocess_info(self, args):
""" Returns a dict with the info needed for reprocessing"""
reprocess_info = {'resize': args.resize}
if args.size:
reprocess_info['max_width'] = args.size[0]
reprocess_info['max_height'] = args.size[1]
return reprocess_info
if __name__ == '__main__':
import sys
import pprint