Refactor processing/reprocessing functions into ProcessImage class
This commit is contained in:
parent
3988c9d66d
commit
7ac66a3dd0
@ -13,17 +13,13 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU Affero General Public License
|
# 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/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
import argparse
|
|
||||||
import datetime
|
import datetime
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from mediagoblin.db.models import MediaEntry
|
|
||||||
from mediagoblin.media_types import MediaManagerBase
|
from mediagoblin.media_types import MediaManagerBase
|
||||||
from mediagoblin.media_types.image.processing import ProcessImage, \
|
from mediagoblin.media_types.image.processing import ProcessImage, \
|
||||||
sniff_handler
|
sniff_handler
|
||||||
from mediagoblin.submit.lib import run_process_media
|
|
||||||
from mediagoblin.tools import pluginapi
|
from mediagoblin.tools import pluginapi
|
||||||
from mediagoblin.tools.translate import lazy_pass_to_ugettext as _
|
|
||||||
|
|
||||||
_log = logging.getLogger(__name__)
|
_log = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -71,105 +67,11 @@ def get_media_type_and_manager(ext):
|
|||||||
return MEDIA_TYPE, ImageMediaManager
|
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 = {
|
hooks = {
|
||||||
'setup': setup_plugin,
|
'setup': setup_plugin,
|
||||||
'get_media_type_and_manager': get_media_type_and_manager,
|
'get_media_type_and_manager': get_media_type_and_manager,
|
||||||
'sniff_handler': sniff_handler,
|
'sniff_handler': sniff_handler,
|
||||||
('media_manager', MEDIA_TYPE): lambda: ImageMediaManager,
|
('media_manager', MEDIA_TYPE): lambda: ImageMediaManager,
|
||||||
('reprocess_action', 'image'): reprocess_action,
|
('reprocess_action', 'image'): ProcessImage().reprocess_action,
|
||||||
('media_reprocess', 'image'): media_reprocess,
|
('media_reprocess', 'image'): ProcessImage().media_reprocess,
|
||||||
}
|
}
|
||||||
|
@ -20,12 +20,16 @@ except ImportError:
|
|||||||
import Image
|
import Image
|
||||||
import os
|
import os
|
||||||
import logging
|
import logging
|
||||||
|
import argparse
|
||||||
|
|
||||||
from mediagoblin import mg_globals as mgg
|
from mediagoblin import mg_globals as mgg
|
||||||
|
from mediagoblin.db.models import MediaEntry
|
||||||
from mediagoblin.processing import BadMediaFail, FilenameBuilder
|
from mediagoblin.processing import BadMediaFail, FilenameBuilder
|
||||||
|
from mediagoblin.submit.lib import run_process_media
|
||||||
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, \
|
||||||
exif_image_needs_rotation
|
exif_image_needs_rotation
|
||||||
|
from mediagoblin.tools.translate import lazy_pass_to_ugettext as _
|
||||||
|
|
||||||
_log = logging.getLogger(__name__)
|
_log = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -147,6 +151,58 @@ class ProcessImage(object):
|
|||||||
|
|
||||||
os.mkdir(self.conversions_subdir)
|
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):
|
def initial_processing(self):
|
||||||
# Is there any GPS data
|
# Is there any GPS data
|
||||||
gps_data = get_gps_data(self.exif_tags)
|
gps_data = get_gps_data(self.exif_tags)
|
||||||
@ -179,9 +235,14 @@ class ProcessImage(object):
|
|||||||
self.entry.media_data_init(**gps_data)
|
self.entry.media_data_init(**gps_data)
|
||||||
|
|
||||||
def reprocess(self, reprocess_info):
|
def reprocess(self, reprocess_info):
|
||||||
|
"""
|
||||||
|
This function actually does the reprocessing when called by
|
||||||
|
ProcessMedia in gmg/processing/task.py
|
||||||
|
"""
|
||||||
new_size = None
|
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'):
|
if reprocess_info.get('max_width'):
|
||||||
max_width = reprocess_info['max_width']
|
max_width = reprocess_info['max_width']
|
||||||
max_height = reprocess_info['max_height']
|
max_height = reprocess_info['max_height']
|
||||||
@ -192,6 +253,53 @@ class ProcessImage(object):
|
|||||||
self.name_builder.fill('{basename}.medium{ext}'),
|
self.name_builder.fill('{basename}.medium{ext}'),
|
||||||
self.conversions_subdir, self.exif_tags, new_size)
|
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__':
|
if __name__ == '__main__':
|
||||||
import sys
|
import sys
|
||||||
import pprint
|
import pprint
|
||||||
|
Loading…
x
Reference in New Issue
Block a user