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
9
from flexget.plugins.filter.movie_queue import QueueError, queue_add, queue_del, queue_get, parse_what
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):
20
Handle IMDb queue management; add, delete and list
24
def optik_movie_queue(option, opt, value, parser):
25
"""Callback for Optik, parses --movie-queue options and populates movie_queue options value"""
27
usage_error = OptionValueError('Usage: ' + USAGE)
31
options['action'] = parser.rargs[0].lower()
32
if options['action'] not in ('add', 'del', 'list', 'downloaded', 'clear'):
35
if len(parser.rargs) == 1:
36
if options['action'] not in ('list', 'downloaded', 'clear'):
39
# 2, args is the minimum allowed (operation + item) for actions other than list
40
if len(parser.rargs) >= 2:
41
options['what'] = parser.rargs[1]
44
if len(parser.rargs) >= 3:
45
options['quality'] = parser.rargs[2]
47
options['quality'] = 'ANY'
48
# TODO: Get default from config somehow?
49
# why not use the quality user has queued most, ie option called 'auto' ?
50
# and if none is queued default to something good like '720p bluray'
53
if len(parser.rargs) >= 4:
54
options['force'] = str_to_boolean(parser.rargs[3])
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):
66
feed.manager.disable_feeds()
67
options = feed.manager.options.movie_queue
69
if options['action'] == 'list':
70
self.queue_list(feed.session)
73
if options['action'] == 'downloaded':
74
self.queue_list(feed.session, downloaded=True)
77
if options['action'] == 'clear':
78
self.clear(feed.session)
81
# all other actions require movie info to work
82
# Generate imdb_id, tmdb_id and movie title from any single one
84
what = parse_what(options['what'])
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
94
if options['action'] == 'add':
96
added = queue_add(title=options['title'], imdb_id=options['imdb_id'],
97
tmdb_id=options['tmdb_id'], quality=options['quality'], force=options['force'])
98
# warn about a bit silly quality value
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:
104
# This is an invalid quality error, display some more info
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.')
108
console('Added %s to queue with quality %s' % (added['title'], added['quality']))
109
elif options['action'] == 'del':
111
title = queue_del(imdb_id=options['imdb_id'])
112
except QueueError, e:
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)
124
console('%-10s %-7s %-37s %-15s %s' % ('IMDB id', 'TMDB id', 'Title', 'Quality', 'Force'))
127
console('%-10s %-7s %-37s %-15s %s' % (item.imdb_id, item.tmdb_id, item.title, item.quality, item.immortal))
130
console('No results')
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:')
142
queue_del(imdb_id=item.imdb_id)
145
console('No results')
150
register_plugin(MovieQueueManager, 'movie_queue_manager', builtin=True)
151
register_parser_option('--movie-queue', action='callback',
152
callback=MovieQueueManager.optik_movie_queue,