flexget.plugins.cli.movie_queue
Covered: 32 lines
Missed: 80 lines
Skipped 42 lines
Percent: 28 %
  1
import logging
  2
from optparse import OptionValueError
  3
from sqlalchemy.exc import OperationalError
  4
from flexget.utils import qualities
  5
from flexget.utils.tools import console, str_to_boolean
  6
from flexget.plugin import DependencyError, register_plugin, register_parser_option
  8
try:
  9
    from flexget.plugins.filter.movie_queue import QueueError, queue_add, queue_del, queue_get, parse_what
 10
except ImportError:
 11
    raise DependencyError(issued_by='cli_movie_queue', missing='movie_queue')
 13
log = logging.getLogger('cli_movie_queue')
 15
USAGE = '(add|del|list|downloaded) [NAME|IMDB_ID|tmdb_id=TMDB_ID] [QUALITY] [FORCE]'
 18
class MovieQueueManager(object):
 19
    """
 20
    Handle IMDb queue management; add, delete and list
 21
    """
 23
    @staticmethod
 24
    def optik_movie_queue(option, opt, value, parser):
 25
        """Callback for Optik, parses --movie-queue options and populates movie_queue options value"""
 26
        options = {}
 27
        usage_error = OptionValueError('Usage: ' + USAGE)
 28
        if not parser.rargs:
 29
            raise usage_error
 31
        options['action'] = parser.rargs[0].lower()
 32
        if options['action'] not in ('add', 'del', 'list', 'downloaded', 'clear'):
 33
            raise usage_error
 35
        if len(parser.rargs) == 1:
 36
            if options['action'] not in ('list', 'downloaded', 'clear'):
 37
                raise usage_error
 40
        if len(parser.rargs) >= 2:
 41
            options['what'] = parser.rargs[1]
 44
        if len(parser.rargs) >= 3:
 45
            options['quality'] = parser.rargs[2]
 46
        else:
 47
            options['quality'] = 'ANY' 
 53
        if len(parser.rargs) >= 4:
 54
            options['force'] = str_to_boolean(parser.rargs[3])
 55
        else:
 56
            options['force'] = True
 58
        parser.values.movie_queue = options
 60
    def on_process_start(self, feed):
 61
        """Handle --movie-queue management"""
 63
        if not getattr(feed.manager.options, 'movie_queue', False):
 64
            return
 66
        feed.manager.disable_feeds()
 67
        options = feed.manager.options.movie_queue
 69
        if options['action'] == 'list':
 70
            self.queue_list(feed.session)
 71
            return
 73
        if options['action'] == 'downloaded':
 74
            self.queue_list(feed.session, downloaded=True)
 75
            return
 77
        if options['action'] == 'clear':
 78
            self.clear(feed.session)
 79
            return
 83
        try:
 84
            what = parse_what(options['what'])
 85
            options.update(what)
 86
        except QueueError, e:
 87
            console(e.message)
 89
        if not options.get('title') or not (options.get('imdb_id') or options.get('tmdb_id')):
 90
            console('could not determine movie') # TODO: Rethink errors
 91
            return
 93
        try:
 94
            if options['action'] == 'add':
 95
                try:
 96
                    added = queue_add(title=options['title'], imdb_id=options['imdb_id'],
 97
                        tmdb_id=options['tmdb_id'], quality=options['quality'], force=options['force'])
 99
                    if qualities.common_name(options['quality']) == '720p':
100
                        console('WARNING: quality 720p in movie context will not retrieve BluRay rips. You might want to use "720p bluray" instead!')
101
                except QueueError, e:
102
                    console(e.message)
103
                    if e.errno == 1:
105
                        console('Recognized qualities are %s' % ', '.join([qual.name for qual in qualities.all()]))
106
                        console('ANY is the default and can also be used explicitly to specify that quality should be ignored.')
107
                else:
108
                    console('Added %s to queue with quality %s' % (added['title'], added['quality']))
109
            elif options['action'] == 'del':
110
                try:
111
                    title = queue_del(imdb_id=options['imdb_id'])
112
                except QueueError, e:
113
                    console(e.message)
114
                else:
115
                    console('Removed %s from queue' % title)
116
        except OperationalError:
117
            log.critical('OperationalError')
119
    def queue_list(self, session, downloaded=False):
120
        """List IMDb queue"""
122
        items = queue_get(session=session, downloaded=downloaded)
123
        console('-' * 79)
124
        console('%-10s %-7s %-37s %-15s %s' % ('IMDB id', 'TMDB id', 'Title', 'Quality', 'Force'))
125
        console('-' * 79)
126
        for item in items:
127
            console('%-10s %-7s %-37s %-15s %s' % (item.imdb_id, item.tmdb_id, item.title, item.quality, item.immortal))
129
        if not items:
130
            console('No results')
132
        console('-' * 79)
134
    def clear(self, session):
135
        """Delete movie queue"""
137
        items = queue_get(session=session, downloaded=False)
138
        console('Removing the following movies from movie queue:')
139
        console('-' * 79)
140
        for item in items:
141
            console(item.title)
142
            queue_del(imdb_id=item.imdb_id)
144
        if not items:
145
            console('No results')
147
        console('-' * 79)
150
register_plugin(MovieQueueManager, 'movie_queue_manager', builtin=True)
151
register_parser_option('--movie-queue', action='callback',
152
                       callback=MovieQueueManager.optik_movie_queue,
153
                       help=USAGE)