123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- # GNU MediaGoblin -- federated, autonomous media hosting
- # Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
- #
- # This program is free software: you can redistribute it and/or modify
- # it under the terms of the GNU Affero General Public License as published by
- # the Free Software Foundation, either version 3 of the License, or
- # (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU Affero General Public License for more details.
- #
- # 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/>.
- from __future__ import print_function
- import argparse
- import os
- from mediagoblin import mg_globals
- from mediagoblin.db.models import MediaEntry
- from mediagoblin.gmg_commands import util as commands_util
- from mediagoblin.submit.lib import run_process_media
- from mediagoblin.tools.translate import lazy_pass_to_ugettext as _
- from mediagoblin.tools.pluginapi import hook_handle
- from mediagoblin.processing import (
- ProcessorDoesNotExist, ProcessorNotEligible,
- get_entry_and_processing_manager, get_processing_manager_for_type,
- ProcessingManagerDoesNotExist)
- def reprocess_parser_setup(subparser):
- subparser.add_argument(
- '--celery',
- action='store_true',
- help="Don't process eagerly, pass off to celery")
- subparsers = subparser.add_subparsers(dest="reprocess_subcommand")
- ###################
- # available command
- ###################
- available_parser = subparsers.add_parser(
- "available",
- help="Find out what actions are available for this media")
- available_parser.add_argument(
- "id_or_type",
- help="Media id or media type to check")
- available_parser.add_argument(
- "--action-help",
- action="store_true",
- help="List argument help for each action available")
- available_parser.add_argument(
- "--state",
- help="The state of media you would like to reprocess")
- #############
- # run command
- #############
- run_parser = subparsers.add_parser(
- "run",
- help="Run a reprocessing on one or more media")
- run_parser.add_argument(
- 'media_id',
- help="The media_entry id(s) you wish to reprocess.")
- run_parser.add_argument(
- 'reprocess_command',
- help="The reprocess command you intend to run")
- run_parser.add_argument(
- 'reprocess_args',
- nargs=argparse.REMAINDER,
- help="rest of arguments to the reprocessing tool")
- ################
- # thumbs command
- ################
- thumbs = subparsers.add_parser(
- 'thumbs',
- help='Regenerate thumbs for all processed media')
- thumbs.add_argument(
- '--size',
- nargs=2,
- type=int,
- metavar=('max_width', 'max_height'))
- #################
- # initial command
- #################
- subparsers.add_parser(
- 'initial',
- help='Reprocess all failed media')
- ##################
- # bulk_run command
- ##################
- bulk_run_parser = subparsers.add_parser(
- 'bulk_run',
- help='Run reprocessing on a given media type or state')
- bulk_run_parser.add_argument(
- 'type',
- help='The type of media you would like to process')
- bulk_run_parser.add_argument(
- '--state',
- default='processed',
- nargs='?',
- help='The state of the media you would like to process. Defaults to' \
- " 'processed'")
- bulk_run_parser.add_argument(
- 'reprocess_command',
- help='The reprocess command you intend to run')
- bulk_run_parser.add_argument(
- 'reprocess_args',
- nargs=argparse.REMAINDER,
- help='The rest of the arguments to the reprocessing tool')
- ###############
- # help command?
- ###############
- def available(args):
- # Get the media type, either by looking up media id, or by specific type
- try:
- media_id = int(args.id_or_type)
- media_entry, manager = get_entry_and_processing_manager(media_id)
- media_type = media_entry.media_type
- except ValueError:
- media_type = args.id_or_type
- media_entry = None
- manager = get_processing_manager_for_type(media_type)
- except ProcessingManagerDoesNotExist:
- entry = MediaEntry.query.filter_by(id=args.id_or_type).first()
- print('No such processing manager for {0}'.format(entry.media_type))
- if args.state:
- processors = manager.list_all_processors_by_state(args.state)
- elif media_entry is None:
- processors = manager.list_all_processors()
- else:
- processors = manager.list_eligible_processors(media_entry)
- print("Available processors:")
- print("=====================")
- print("")
- if args.action_help:
- for processor in processors:
- print(processor.name)
- print("-" * len(processor.name))
- parser = processor.generate_parser()
- parser.print_help()
- print("")
- else:
- for processor in processors:
- if processor.description:
- print(" - %s: %s" % (processor.name, processor.description))
- else:
- print(" - %s" % processor.name)
- def run(args, media_id=None):
- if not media_id:
- media_id = args.media_id
- try:
- media_entry, manager = get_entry_and_processing_manager(media_id)
- # TODO: (maybe?) This could probably be handled entirely by the
- # processor class...
- try:
- processor_class = manager.get_processor(
- args.reprocess_command, media_entry)
- except ProcessorDoesNotExist:
- print('No such processor "%s" for media with id "%s"' % (
- args.reprocess_command, media_entry.id))
- return
- except ProcessorNotEligible:
- print('Processor "%s" exists but media "%s" is not eligible' % (
- args.reprocess_command, media_entry.id))
- return
- reprocess_parser = processor_class.generate_parser()
- reprocess_args = reprocess_parser.parse_args(args.reprocess_args)
- reprocess_request = processor_class.args_to_request(reprocess_args)
- run_process_media(
- media_entry,
- reprocess_action=args.reprocess_command,
- reprocess_info=reprocess_request)
- except ProcessingManagerDoesNotExist:
- entry = MediaEntry.query.filter_by(id=media_id).first()
- print('No such processing manager for {0}'.format(entry.media_type))
- def bulk_run(args):
- """
- Bulk reprocessing of a given media_type
- """
- query = MediaEntry.query.filter_by(media_type=args.type,
- state=args.state)
- for entry in query:
- run(args, entry.id)
- def thumbs(args):
- """
- Regenerate thumbs for all processed media
- """
- query = MediaEntry.query.filter_by(state='processed')
- for entry in query:
- try:
- media_entry, manager = get_entry_and_processing_manager(entry.id)
- # TODO: (maybe?) This could probably be handled entirely by the
- # processor class...
- try:
- processor_class = manager.get_processor(
- 'resize', media_entry)
- except ProcessorDoesNotExist:
- print('No such processor "%s" for media with id "%s"' % (
- 'resize', media_entry.id))
- return
- except ProcessorNotEligible:
- print('Processor "%s" exists but media "%s" is not eligible' % (
- 'resize', media_entry.id))
- return
- reprocess_parser = processor_class.generate_parser()
- # prepare filetype and size to be passed into reprocess_parser
- if args.size:
- extra_args = 'thumb --{0} {1} {2}'.format(
- processor_class.thumb_size,
- args.size[0],
- args.size[1])
- else:
- extra_args = 'thumb'
- reprocess_args = reprocess_parser.parse_args(extra_args.split())
- reprocess_request = processor_class.args_to_request(reprocess_args)
- run_process_media(
- media_entry,
- reprocess_action='resize',
- reprocess_info=reprocess_request)
- except ProcessingManagerDoesNotExist:
- print('No such processing manager for {0}'.format(entry.media_type))
- def initial(args):
- """
- Reprocess all failed media
- """
- query = MediaEntry.query.filter_by(state='failed')
- for entry in query:
- try:
- media_entry, manager = get_entry_and_processing_manager(entry.id)
- run_process_media(
- media_entry,
- reprocess_action='initial')
- except ProcessingManagerDoesNotExist:
- print('No such processing manager for {0}'.format(entry.media_type))
- def reprocess(args):
- # Run eagerly unless explicetly set not to
- if not args.celery:
- os.environ['CELERY_ALWAYS_EAGER'] = 'true'
- commands_util.setup_app(args)
- if args.reprocess_subcommand == "run":
- run(args)
- elif args.reprocess_subcommand == "available":
- available(args)
- elif args.reprocess_subcommand == "bulk_run":
- bulk_run(args)
- elif args.reprocess_subcommand == "thumbs":
- thumbs(args)
- elif args.reprocess_subcommand == "initial":
- initial(args)
|