Move movie listing to media
This commit is contained in:
@@ -1,10 +1,15 @@
|
|||||||
from couchpotato import get_session
|
from couchpotato import get_session
|
||||||
from couchpotato.api import addApiView
|
from couchpotato.api import addApiView
|
||||||
from couchpotato.core.event import fireEvent, fireEventAsync, addEvent
|
from couchpotato.core.event import fireEvent, fireEventAsync, addEvent
|
||||||
from couchpotato.core.helpers.variable import splitString
|
from couchpotato.core.helpers.encoding import toUnicode
|
||||||
|
from couchpotato.core.helpers.variable import mergeDicts, splitString, getImdb
|
||||||
from couchpotato.core.logger import CPLog
|
from couchpotato.core.logger import CPLog
|
||||||
from couchpotato.core.media import MediaBase
|
from couchpotato.core.media import MediaBase
|
||||||
from couchpotato.core.settings.model import Media
|
from couchpotato.core.settings.model import Library, LibraryTitle, Release, \
|
||||||
|
Media
|
||||||
|
from sqlalchemy.orm import joinedload_all
|
||||||
|
from sqlalchemy.sql.expression import or_, asc, not_, desc
|
||||||
|
from string import ascii_lowercase
|
||||||
|
|
||||||
log = CPLog(__name__)
|
log = CPLog(__name__)
|
||||||
|
|
||||||
@@ -20,7 +25,49 @@ class MediaPlugin(MediaBase):
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
addEvent('app.load', self.addSingleRefresh)
|
addApiView('media.list', self.listView, docs = {
|
||||||
|
'desc': 'List media',
|
||||||
|
'params': {
|
||||||
|
'type': {'type': 'string', 'desc': 'Media type to filter on.'},
|
||||||
|
'status': {'type': 'array or csv', 'desc': 'Filter movie by status. Example:"active,done"'},
|
||||||
|
'release_status': {'type': 'array or csv', 'desc': 'Filter movie by status of its releases. Example:"snatched,available"'},
|
||||||
|
'limit_offset': {'desc': 'Limit and offset the movie list. Examples: "50" or "50,30"'},
|
||||||
|
'starts_with': {'desc': 'Starts with these characters. Example: "a" returns all movies starting with the letter "a"'},
|
||||||
|
'search': {'desc': 'Search movie title'},
|
||||||
|
},
|
||||||
|
'return': {'type': 'object', 'example': """{
|
||||||
|
'success': True,
|
||||||
|
'empty': bool, any movies returned or not,
|
||||||
|
'media': array, media found,
|
||||||
|
}"""}
|
||||||
|
})
|
||||||
|
|
||||||
|
addApiView('media.get', self.getView, docs = {
|
||||||
|
'desc': 'Get media by id',
|
||||||
|
'params': {
|
||||||
|
'id': {'desc': 'The id of the media'},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
addApiView('media.delete', self.deleteView, docs = {
|
||||||
|
'desc': 'Delete a media from the wanted list',
|
||||||
|
'params': {
|
||||||
|
'id': {'desc': 'Media ID(s) you want to delete.', 'type': 'int (comma separated)'},
|
||||||
|
'delete_from': {'desc': 'Delete media from this page', 'type': 'string: all (default), wanted, manage'},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
addApiView('media.available_chars', self.charView)
|
||||||
|
|
||||||
|
addEvent('app.load', self.addSingleRefreshView)
|
||||||
|
addEvent('app.load', self.addSingleListView)
|
||||||
|
addEvent('app.load', self.addSingleCharView)
|
||||||
|
addEvent('app.load', self.addSingleDeleteView)
|
||||||
|
|
||||||
|
addEvent('media.get', self.get)
|
||||||
|
addEvent('media.list', self.list)
|
||||||
|
addEvent('media.delete', self.delete)
|
||||||
|
addEvent('media.restatus', self.restatus)
|
||||||
|
|
||||||
def refresh(self, id = '', **kwargs):
|
def refresh(self, id = '', **kwargs):
|
||||||
db = get_session()
|
db = get_session()
|
||||||
@@ -43,7 +90,369 @@ class MediaPlugin(MediaBase):
|
|||||||
'success': True,
|
'success': True,
|
||||||
}
|
}
|
||||||
|
|
||||||
def addSingleRefresh(self):
|
def addSingleRefreshView(self):
|
||||||
|
|
||||||
for media_type in fireEvent('media.types', merge = True):
|
for media_type in fireEvent('media.types', merge = True):
|
||||||
addApiView('%s.refresh' % media_type, self.refresh)
|
addApiView('%s.refresh' % media_type, self.refresh)
|
||||||
|
|
||||||
|
def get(self, media_id):
|
||||||
|
|
||||||
|
db = get_session()
|
||||||
|
|
||||||
|
imdb_id = getImdb(str(media_id))
|
||||||
|
|
||||||
|
if imdb_id:
|
||||||
|
m = db.query(Media).filter(Media.library.has(identifier = imdb_id)).first()
|
||||||
|
else:
|
||||||
|
m = db.query(Media).filter_by(id = media_id).first()
|
||||||
|
|
||||||
|
results = None
|
||||||
|
if m:
|
||||||
|
results = m.to_dict(self.default_dict)
|
||||||
|
|
||||||
|
db.expire_all()
|
||||||
|
return results
|
||||||
|
|
||||||
|
def getView(self, id = None, **kwargs):
|
||||||
|
|
||||||
|
movie = self.get(id) if id else None
|
||||||
|
|
||||||
|
return {
|
||||||
|
'success': movie is not None,
|
||||||
|
'movie': movie,
|
||||||
|
}
|
||||||
|
|
||||||
|
def list(self, types = None, status = None, release_status = None, limit_offset = None, starts_with = None, search = None, order = None):
|
||||||
|
|
||||||
|
db = get_session()
|
||||||
|
|
||||||
|
# Make a list from string
|
||||||
|
if status and not isinstance(status, (list, tuple)):
|
||||||
|
status = [status]
|
||||||
|
if release_status and not isinstance(release_status, (list, tuple)):
|
||||||
|
release_status = [release_status]
|
||||||
|
if types and not isinstance(types, (list, tuple)):
|
||||||
|
types = [types]
|
||||||
|
|
||||||
|
# query movie ids
|
||||||
|
q = db.query(Media) \
|
||||||
|
.with_entities(Media.id) \
|
||||||
|
.group_by(Media.id)
|
||||||
|
|
||||||
|
# Filter on movie status
|
||||||
|
if status and len(status) > 0:
|
||||||
|
statuses = fireEvent('status.get', status, single = len(status) > 1)
|
||||||
|
statuses = [s.get('id') for s in statuses]
|
||||||
|
|
||||||
|
q = q.filter(Media.status_id.in_(statuses))
|
||||||
|
|
||||||
|
# Filter on release status
|
||||||
|
if release_status and len(release_status) > 0:
|
||||||
|
q = q.join(Media.releases)
|
||||||
|
|
||||||
|
statuses = fireEvent('status.get', release_status, single = len(release_status) > 1)
|
||||||
|
statuses = [s.get('id') for s in statuses]
|
||||||
|
|
||||||
|
q = q.filter(Release.status_id.in_(statuses))
|
||||||
|
|
||||||
|
# Filter on type
|
||||||
|
if types and len(types) > 0:
|
||||||
|
try: q = q.filter(Media.type.in_(types))
|
||||||
|
except: pass
|
||||||
|
|
||||||
|
# Only join when searching / ordering
|
||||||
|
if starts_with or search or order != 'release_order':
|
||||||
|
q = q.join(Media.library, Library.titles) \
|
||||||
|
.filter(LibraryTitle.default == True)
|
||||||
|
|
||||||
|
# Add search filters
|
||||||
|
filter_or = []
|
||||||
|
if starts_with:
|
||||||
|
starts_with = toUnicode(starts_with.lower())
|
||||||
|
if starts_with in ascii_lowercase:
|
||||||
|
filter_or.append(LibraryTitle.simple_title.startswith(starts_with))
|
||||||
|
else:
|
||||||
|
ignore = []
|
||||||
|
for letter in ascii_lowercase:
|
||||||
|
ignore.append(LibraryTitle.simple_title.startswith(toUnicode(letter)))
|
||||||
|
filter_or.append(not_(or_(*ignore)))
|
||||||
|
|
||||||
|
if search:
|
||||||
|
filter_or.append(LibraryTitle.simple_title.like('%%' + search + '%%'))
|
||||||
|
|
||||||
|
if len(filter_or) > 0:
|
||||||
|
q = q.filter(or_(*filter_or))
|
||||||
|
|
||||||
|
total_count = q.count()
|
||||||
|
if total_count == 0:
|
||||||
|
return 0, []
|
||||||
|
|
||||||
|
if order == 'release_order':
|
||||||
|
q = q.order_by(desc(Release.last_edit))
|
||||||
|
else:
|
||||||
|
q = q.order_by(asc(LibraryTitle.simple_title))
|
||||||
|
|
||||||
|
if limit_offset:
|
||||||
|
splt = splitString(limit_offset) if isinstance(limit_offset, (str, unicode)) else limit_offset
|
||||||
|
limit = splt[0]
|
||||||
|
offset = 0 if len(splt) is 1 else splt[1]
|
||||||
|
q = q.limit(limit).offset(offset)
|
||||||
|
|
||||||
|
# Get all media_ids in sorted order
|
||||||
|
media_ids = [m.id for m in q.all()]
|
||||||
|
|
||||||
|
# List release statuses
|
||||||
|
releases = db.query(Release) \
|
||||||
|
.filter(Release.movie_id.in_(media_ids)) \
|
||||||
|
.all()
|
||||||
|
|
||||||
|
release_statuses = dict((m, set()) for m in media_ids)
|
||||||
|
releases_count = dict((m, 0) for m in media_ids)
|
||||||
|
for release in releases:
|
||||||
|
release_statuses[release.movie_id].add('%d,%d' % (release.status_id, release.quality_id))
|
||||||
|
releases_count[release.movie_id] += 1
|
||||||
|
|
||||||
|
# Get main movie data
|
||||||
|
q2 = db.query(Media) \
|
||||||
|
.options(joinedload_all('library.titles')) \
|
||||||
|
.options(joinedload_all('library.files')) \
|
||||||
|
.options(joinedload_all('status')) \
|
||||||
|
.options(joinedload_all('files'))
|
||||||
|
|
||||||
|
q2 = q2.filter(Media.id.in_(media_ids))
|
||||||
|
|
||||||
|
results = q2.all()
|
||||||
|
|
||||||
|
# Create dict by movie id
|
||||||
|
movie_dict = {}
|
||||||
|
for movie in results:
|
||||||
|
movie_dict[movie.id] = movie
|
||||||
|
|
||||||
|
# List movies based on media_ids order
|
||||||
|
movies = []
|
||||||
|
for media_id in media_ids:
|
||||||
|
|
||||||
|
releases = []
|
||||||
|
for r in release_statuses.get(media_id):
|
||||||
|
x = splitString(r)
|
||||||
|
releases.append({'status_id': x[0], 'quality_id': x[1]})
|
||||||
|
|
||||||
|
# Merge releases with movie dict
|
||||||
|
movies.append(mergeDicts(movie_dict[media_id].to_dict({
|
||||||
|
'library': {'titles': {}, 'files':{}},
|
||||||
|
'files': {},
|
||||||
|
}), {
|
||||||
|
'releases': releases,
|
||||||
|
'releases_count': releases_count.get(media_id),
|
||||||
|
}))
|
||||||
|
|
||||||
|
db.expire_all()
|
||||||
|
return total_count, movies
|
||||||
|
|
||||||
|
def listView(self, **kwargs):
|
||||||
|
|
||||||
|
types = splitString(kwargs.get('types'))
|
||||||
|
status = splitString(kwargs.get('status'))
|
||||||
|
release_status = splitString(kwargs.get('release_status'))
|
||||||
|
limit_offset = kwargs.get('limit_offset')
|
||||||
|
starts_with = kwargs.get('starts_with')
|
||||||
|
search = kwargs.get('search')
|
||||||
|
order = kwargs.get('order')
|
||||||
|
|
||||||
|
total_movies, movies = self.list(
|
||||||
|
types = types,
|
||||||
|
status = status,
|
||||||
|
release_status = release_status,
|
||||||
|
limit_offset = limit_offset,
|
||||||
|
starts_with = starts_with,
|
||||||
|
search = search,
|
||||||
|
order = order
|
||||||
|
)
|
||||||
|
|
||||||
|
return {
|
||||||
|
'success': True,
|
||||||
|
'empty': len(movies) == 0,
|
||||||
|
'total': total_movies,
|
||||||
|
'movies': movies,
|
||||||
|
}
|
||||||
|
|
||||||
|
def addSingleListView(self):
|
||||||
|
|
||||||
|
for media_type in fireEvent('media.types', merge = True):
|
||||||
|
def tempList(*args, **kwargs):
|
||||||
|
return self.listView(types = media_type, *args, **kwargs)
|
||||||
|
addApiView('%s.list' % media_type, tempList)
|
||||||
|
|
||||||
|
def availableChars(self, types = None, status = None, release_status = None):
|
||||||
|
|
||||||
|
types = types or []
|
||||||
|
status = status or []
|
||||||
|
release_status = release_status or []
|
||||||
|
|
||||||
|
db = get_session()
|
||||||
|
|
||||||
|
# Make a list from string
|
||||||
|
if not isinstance(status, (list, tuple)):
|
||||||
|
status = [status]
|
||||||
|
if release_status and not isinstance(release_status, (list, tuple)):
|
||||||
|
release_status = [release_status]
|
||||||
|
if types and not isinstance(types, (list, tuple)):
|
||||||
|
types = [types]
|
||||||
|
|
||||||
|
q = db.query(Media)
|
||||||
|
|
||||||
|
# Filter on movie status
|
||||||
|
if status and len(status) > 0:
|
||||||
|
statuses = fireEvent('status.get', status, single = len(release_status) > 1)
|
||||||
|
statuses = [s.get('id') for s in statuses]
|
||||||
|
|
||||||
|
q = q.filter(Media.status_id.in_(statuses))
|
||||||
|
|
||||||
|
# Filter on release status
|
||||||
|
if release_status and len(release_status) > 0:
|
||||||
|
|
||||||
|
statuses = fireEvent('status.get', release_status, single = len(release_status) > 1)
|
||||||
|
statuses = [s.get('id') for s in statuses]
|
||||||
|
|
||||||
|
q = q.join(Media.releases) \
|
||||||
|
.filter(Release.status_id.in_(statuses))
|
||||||
|
|
||||||
|
# Filter on type
|
||||||
|
if types and len(types) > 0:
|
||||||
|
try: q = q.filter(Media.type.in_(types))
|
||||||
|
except: pass
|
||||||
|
|
||||||
|
q = q.join(Library, LibraryTitle) \
|
||||||
|
.with_entities(LibraryTitle.simple_title) \
|
||||||
|
.filter(LibraryTitle.default == True)
|
||||||
|
|
||||||
|
titles = q.all()
|
||||||
|
|
||||||
|
chars = set()
|
||||||
|
for title in titles:
|
||||||
|
try:
|
||||||
|
char = title[0][0]
|
||||||
|
char = char if char in ascii_lowercase else '#'
|
||||||
|
chars.add(str(char))
|
||||||
|
except:
|
||||||
|
log.error('Failed getting title for %s', title.libraries_id)
|
||||||
|
|
||||||
|
if len(chars) == 25:
|
||||||
|
break
|
||||||
|
|
||||||
|
db.expire_all()
|
||||||
|
return ''.join(sorted(chars))
|
||||||
|
|
||||||
|
def charView(self, **kwargs):
|
||||||
|
|
||||||
|
type = splitString(kwargs.get('type', 'movie'))
|
||||||
|
status = splitString(kwargs.get('status', None))
|
||||||
|
release_status = splitString(kwargs.get('release_status', None))
|
||||||
|
chars = self.availableChars(type, status, release_status)
|
||||||
|
|
||||||
|
return {
|
||||||
|
'success': True,
|
||||||
|
'empty': len(chars) == 0,
|
||||||
|
'chars': chars,
|
||||||
|
}
|
||||||
|
|
||||||
|
def addSingleCharView(self):
|
||||||
|
|
||||||
|
for media_type in fireEvent('media.types', merge = True):
|
||||||
|
def tempChar(*args, **kwargs):
|
||||||
|
return self.charView(types = media_type, *args, **kwargs)
|
||||||
|
addApiView('%s.available_chars' % media_type, tempChar)
|
||||||
|
|
||||||
|
def delete(self, media_id, delete_from = None):
|
||||||
|
|
||||||
|
db = get_session()
|
||||||
|
|
||||||
|
movie = db.query(Media).filter_by(id = media_id).first()
|
||||||
|
if movie:
|
||||||
|
deleted = False
|
||||||
|
if delete_from == 'all':
|
||||||
|
db.delete(movie)
|
||||||
|
db.commit()
|
||||||
|
deleted = True
|
||||||
|
else:
|
||||||
|
done_status = fireEvent('status.get', 'done', single = True)
|
||||||
|
|
||||||
|
total_releases = len(movie.releases)
|
||||||
|
total_deleted = 0
|
||||||
|
new_movie_status = None
|
||||||
|
for release in movie.releases:
|
||||||
|
if delete_from in ['wanted', 'snatched', 'late']:
|
||||||
|
if release.status_id != done_status.get('id'):
|
||||||
|
db.delete(release)
|
||||||
|
total_deleted += 1
|
||||||
|
new_movie_status = 'done'
|
||||||
|
elif delete_from == 'manage':
|
||||||
|
if release.status_id == done_status.get('id'):
|
||||||
|
db.delete(release)
|
||||||
|
total_deleted += 1
|
||||||
|
new_movie_status = 'active'
|
||||||
|
db.commit()
|
||||||
|
|
||||||
|
if total_releases == total_deleted:
|
||||||
|
db.delete(movie)
|
||||||
|
db.commit()
|
||||||
|
deleted = True
|
||||||
|
elif new_movie_status:
|
||||||
|
new_status = fireEvent('status.get', new_movie_status, single = True)
|
||||||
|
movie.profile_id = None
|
||||||
|
movie.status_id = new_status.get('id')
|
||||||
|
db.commit()
|
||||||
|
else:
|
||||||
|
fireEvent('media.restatus', movie.id, single = True)
|
||||||
|
|
||||||
|
if deleted:
|
||||||
|
fireEvent('notify.frontend', type = 'movie.deleted', data = movie.to_dict())
|
||||||
|
|
||||||
|
db.expire_all()
|
||||||
|
return True
|
||||||
|
|
||||||
|
def deleteView(self, id = '', **kwargs):
|
||||||
|
|
||||||
|
ids = splitString(id)
|
||||||
|
for media_id in ids:
|
||||||
|
self.delete(media_id, delete_from = kwargs.get('delete_from', 'all'))
|
||||||
|
|
||||||
|
return {
|
||||||
|
'success': True,
|
||||||
|
}
|
||||||
|
|
||||||
|
def addSingleDeleteView(self):
|
||||||
|
|
||||||
|
for media_type in fireEvent('media.types', merge = True):
|
||||||
|
def tempDelete(*args, **kwargs):
|
||||||
|
return self.deleteView(types = media_type, *args, **kwargs)
|
||||||
|
addApiView('%s.delete' % media_type, tempDelete)
|
||||||
|
|
||||||
|
def restatus(self, media_id):
|
||||||
|
|
||||||
|
active_status, done_status = fireEvent('status.get', ['active', 'done'], single = True)
|
||||||
|
|
||||||
|
db = get_session()
|
||||||
|
|
||||||
|
m = db.query(Media).filter_by(id = media_id).first()
|
||||||
|
if not m or len(m.library.titles) == 0:
|
||||||
|
log.debug('Can\'t restatus movie, doesn\'t seem to exist.')
|
||||||
|
return False
|
||||||
|
|
||||||
|
log.debug('Changing status for %s', m.library.titles[0].title)
|
||||||
|
if not m.profile:
|
||||||
|
m.status_id = done_status.get('id')
|
||||||
|
else:
|
||||||
|
move_to_wanted = True
|
||||||
|
|
||||||
|
for t in m.profile.types:
|
||||||
|
for release in m.releases:
|
||||||
|
if t.quality.identifier is release.quality.identifier and (release.status_id is done_status.get('id') and t.finish):
|
||||||
|
move_to_wanted = False
|
||||||
|
|
||||||
|
m.status_id = active_status.get('id') if move_to_wanted else done_status.get('id')
|
||||||
|
|
||||||
|
db.commit()
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
|||||||
@@ -2,15 +2,10 @@ from couchpotato import get_session
|
|||||||
from couchpotato.api import addApiView
|
from couchpotato.api import addApiView
|
||||||
from couchpotato.core.event import fireEvent, fireEventAsync, addEvent
|
from couchpotato.core.event import fireEvent, fireEventAsync, addEvent
|
||||||
from couchpotato.core.helpers.encoding import toUnicode
|
from couchpotato.core.helpers.encoding import toUnicode
|
||||||
from couchpotato.core.helpers.variable import getImdb, splitString, tryInt, \
|
from couchpotato.core.helpers.variable import splitString, tryInt
|
||||||
mergeDicts
|
|
||||||
from couchpotato.core.logger import CPLog
|
from couchpotato.core.logger import CPLog
|
||||||
from couchpotato.core.media.movie import MovieTypeBase
|
from couchpotato.core.media.movie import MovieTypeBase
|
||||||
from couchpotato.core.settings.model import Library, LibraryTitle, Media, \
|
from couchpotato.core.settings.model import Media
|
||||||
Release
|
|
||||||
from sqlalchemy.orm import joinedload_all
|
|
||||||
from sqlalchemy.sql.expression import or_, asc, not_, desc
|
|
||||||
from string import ascii_lowercase
|
|
||||||
import time
|
import time
|
||||||
|
|
||||||
log = CPLog(__name__)
|
log = CPLog(__name__)
|
||||||
@@ -26,28 +21,6 @@ class MovieBase(MovieTypeBase):
|
|||||||
super(MovieBase, self).__init__()
|
super(MovieBase, self).__init__()
|
||||||
self.initType()
|
self.initType()
|
||||||
|
|
||||||
addApiView('movie.list', self.listView, docs = {
|
|
||||||
'desc': 'List movies in wanted list',
|
|
||||||
'params': {
|
|
||||||
'status': {'type': 'array or csv', 'desc': 'Filter movie by status. Example:"active,done"'},
|
|
||||||
'release_status': {'type': 'array or csv', 'desc': 'Filter movie by status of its releases. Example:"snatched,available"'},
|
|
||||||
'limit_offset': {'desc': 'Limit and offset the movie list. Examples: "50" or "50,30"'},
|
|
||||||
'starts_with': {'desc': 'Starts with these characters. Example: "a" returns all movies starting with the letter "a"'},
|
|
||||||
'search': {'desc': 'Search movie title'},
|
|
||||||
},
|
|
||||||
'return': {'type': 'object', 'example': """{
|
|
||||||
'success': True,
|
|
||||||
'empty': bool, any movies returned or not,
|
|
||||||
'movies': array, movies found,
|
|
||||||
}"""}
|
|
||||||
})
|
|
||||||
addApiView('movie.get', self.getView, docs = {
|
|
||||||
'desc': 'Get a movie by id',
|
|
||||||
'params': {
|
|
||||||
'id': {'desc': 'The id of the movie'},
|
|
||||||
}
|
|
||||||
})
|
|
||||||
addApiView('movie.available_chars', self.charView)
|
|
||||||
addApiView('movie.add', self.addView, docs = {
|
addApiView('movie.add', self.addView, docs = {
|
||||||
'desc': 'Add new movie to the wanted list',
|
'desc': 'Add new movie to the wanted list',
|
||||||
'params': {
|
'params': {
|
||||||
@@ -65,255 +38,8 @@ class MovieBase(MovieTypeBase):
|
|||||||
'default_title': {'desc': 'Movie title to use for searches. Has to be one of the titles returned by movie.search.'},
|
'default_title': {'desc': 'Movie title to use for searches. Has to be one of the titles returned by movie.search.'},
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
addApiView('movie.delete', self.deleteView, docs = {
|
|
||||||
'desc': 'Delete a movie from the wanted list',
|
|
||||||
'params': {
|
|
||||||
'id': {'desc': 'Movie ID(s) you want to delete.', 'type': 'int (comma separated)'},
|
|
||||||
'delete_from': {'desc': 'Delete movie from this page', 'type': 'string: all (default), wanted, manage'},
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
addEvent('movie.add', self.add)
|
addEvent('movie.add', self.add)
|
||||||
addEvent('movie.delete', self.delete)
|
|
||||||
addEvent('movie.get', self.get)
|
|
||||||
addEvent('movie.list', self.list)
|
|
||||||
addEvent('movie.restatus', self.restatus)
|
|
||||||
|
|
||||||
def getView(self, id = None, **kwargs):
|
|
||||||
|
|
||||||
movie = self.get(id) if id else None
|
|
||||||
|
|
||||||
return {
|
|
||||||
'success': movie is not None,
|
|
||||||
'movie': movie,
|
|
||||||
}
|
|
||||||
|
|
||||||
def get(self, movie_id):
|
|
||||||
|
|
||||||
db = get_session()
|
|
||||||
|
|
||||||
imdb_id = getImdb(str(movie_id))
|
|
||||||
|
|
||||||
if imdb_id:
|
|
||||||
m = db.query(Media).filter(Media.library.has(identifier = imdb_id)).first()
|
|
||||||
else:
|
|
||||||
m = db.query(Media).filter_by(id = movie_id).first()
|
|
||||||
|
|
||||||
results = None
|
|
||||||
if m:
|
|
||||||
results = m.to_dict(self.default_dict)
|
|
||||||
|
|
||||||
db.expire_all()
|
|
||||||
return results
|
|
||||||
|
|
||||||
def list(self, status = None, release_status = None, limit_offset = None, starts_with = None, search = None, order = None):
|
|
||||||
|
|
||||||
db = get_session()
|
|
||||||
|
|
||||||
# Make a list from string
|
|
||||||
if status and not isinstance(status, (list, tuple)):
|
|
||||||
status = [status]
|
|
||||||
if release_status and not isinstance(release_status, (list, tuple)):
|
|
||||||
release_status = [release_status]
|
|
||||||
|
|
||||||
# query movie ids
|
|
||||||
q = db.query(Media) \
|
|
||||||
.with_entities(Media.id) \
|
|
||||||
.group_by(Media.id)
|
|
||||||
|
|
||||||
# Filter on movie status
|
|
||||||
if status and len(status) > 0:
|
|
||||||
statuses = fireEvent('status.get', status, single = len(status) > 1)
|
|
||||||
statuses = [s.get('id') for s in statuses]
|
|
||||||
|
|
||||||
q = q.filter(Media.status_id.in_(statuses))
|
|
||||||
|
|
||||||
# Filter on release status
|
|
||||||
if release_status and len(release_status) > 0:
|
|
||||||
q = q.join(Media.releases)
|
|
||||||
|
|
||||||
statuses = fireEvent('status.get', release_status, single = len(release_status) > 1)
|
|
||||||
statuses = [s.get('id') for s in statuses]
|
|
||||||
|
|
||||||
q = q.filter(Release.status_id.in_(statuses))
|
|
||||||
|
|
||||||
# Only join when searching / ordering
|
|
||||||
if starts_with or search or order != 'release_order':
|
|
||||||
q = q.join(Media.library, Library.titles) \
|
|
||||||
.filter(LibraryTitle.default == True)
|
|
||||||
|
|
||||||
# Add search filters
|
|
||||||
filter_or = []
|
|
||||||
if starts_with:
|
|
||||||
starts_with = toUnicode(starts_with.lower())
|
|
||||||
if starts_with in ascii_lowercase:
|
|
||||||
filter_or.append(LibraryTitle.simple_title.startswith(starts_with))
|
|
||||||
else:
|
|
||||||
ignore = []
|
|
||||||
for letter in ascii_lowercase:
|
|
||||||
ignore.append(LibraryTitle.simple_title.startswith(toUnicode(letter)))
|
|
||||||
filter_or.append(not_(or_(*ignore)))
|
|
||||||
|
|
||||||
if search:
|
|
||||||
filter_or.append(LibraryTitle.simple_title.like('%%' + search + '%%'))
|
|
||||||
|
|
||||||
if len(filter_or) > 0:
|
|
||||||
q = q.filter(or_(*filter_or))
|
|
||||||
|
|
||||||
total_count = q.count()
|
|
||||||
if total_count == 0:
|
|
||||||
return 0, []
|
|
||||||
|
|
||||||
if order == 'release_order':
|
|
||||||
q = q.order_by(desc(Release.last_edit))
|
|
||||||
else:
|
|
||||||
q = q.order_by(asc(LibraryTitle.simple_title))
|
|
||||||
|
|
||||||
if limit_offset:
|
|
||||||
splt = splitString(limit_offset) if isinstance(limit_offset, (str, unicode)) else limit_offset
|
|
||||||
limit = splt[0]
|
|
||||||
offset = 0 if len(splt) is 1 else splt[1]
|
|
||||||
q = q.limit(limit).offset(offset)
|
|
||||||
|
|
||||||
# Get all movie_ids in sorted order
|
|
||||||
movie_ids = [m.id for m in q.all()]
|
|
||||||
|
|
||||||
# List release statuses
|
|
||||||
releases = db.query(Release) \
|
|
||||||
.filter(Release.movie_id.in_(movie_ids)) \
|
|
||||||
.all()
|
|
||||||
|
|
||||||
release_statuses = dict((m, set()) for m in movie_ids)
|
|
||||||
releases_count = dict((m, 0) for m in movie_ids)
|
|
||||||
for release in releases:
|
|
||||||
release_statuses[release.movie_id].add('%d,%d' % (release.status_id, release.quality_id))
|
|
||||||
releases_count[release.movie_id] += 1
|
|
||||||
|
|
||||||
# Get main movie data
|
|
||||||
q2 = db.query(Media) \
|
|
||||||
.options(joinedload_all('library.titles')) \
|
|
||||||
.options(joinedload_all('library.files')) \
|
|
||||||
.options(joinedload_all('status')) \
|
|
||||||
.options(joinedload_all('files'))
|
|
||||||
|
|
||||||
q2 = q2.filter(Media.id.in_(movie_ids))
|
|
||||||
|
|
||||||
results = q2.all()
|
|
||||||
|
|
||||||
# Create dict by movie id
|
|
||||||
movie_dict = {}
|
|
||||||
for movie in results:
|
|
||||||
movie_dict[movie.id] = movie
|
|
||||||
|
|
||||||
# List movies based on movie_ids order
|
|
||||||
movies = []
|
|
||||||
for movie_id in movie_ids:
|
|
||||||
|
|
||||||
releases = []
|
|
||||||
for r in release_statuses.get(movie_id):
|
|
||||||
x = splitString(r)
|
|
||||||
releases.append({'status_id': x[0], 'quality_id': x[1]})
|
|
||||||
|
|
||||||
# Merge releases with movie dict
|
|
||||||
movies.append(mergeDicts(movie_dict[movie_id].to_dict({
|
|
||||||
'library': {'titles': {}, 'files':{}},
|
|
||||||
'files': {},
|
|
||||||
}), {
|
|
||||||
'releases': releases,
|
|
||||||
'releases_count': releases_count.get(movie_id),
|
|
||||||
}))
|
|
||||||
|
|
||||||
db.expire_all()
|
|
||||||
return total_count, movies
|
|
||||||
|
|
||||||
def availableChars(self, status = None, release_status = None):
|
|
||||||
|
|
||||||
status = status or []
|
|
||||||
release_status = release_status or []
|
|
||||||
|
|
||||||
db = get_session()
|
|
||||||
|
|
||||||
# Make a list from string
|
|
||||||
if not isinstance(status, (list, tuple)):
|
|
||||||
status = [status]
|
|
||||||
if release_status and not isinstance(release_status, (list, tuple)):
|
|
||||||
release_status = [release_status]
|
|
||||||
|
|
||||||
q = db.query(Media)
|
|
||||||
|
|
||||||
# Filter on movie status
|
|
||||||
if status and len(status) > 0:
|
|
||||||
statuses = fireEvent('status.get', status, single = len(release_status) > 1)
|
|
||||||
statuses = [s.get('id') for s in statuses]
|
|
||||||
|
|
||||||
q = q.filter(Media.status_id.in_(statuses))
|
|
||||||
|
|
||||||
# Filter on release status
|
|
||||||
if release_status and len(release_status) > 0:
|
|
||||||
|
|
||||||
statuses = fireEvent('status.get', release_status, single = len(release_status) > 1)
|
|
||||||
statuses = [s.get('id') for s in statuses]
|
|
||||||
|
|
||||||
q = q.join(Media.releases) \
|
|
||||||
.filter(Release.status_id.in_(statuses))
|
|
||||||
|
|
||||||
q = q.join(Library, LibraryTitle) \
|
|
||||||
.with_entities(LibraryTitle.simple_title) \
|
|
||||||
.filter(LibraryTitle.default == True)
|
|
||||||
|
|
||||||
titles = q.all()
|
|
||||||
|
|
||||||
chars = set()
|
|
||||||
for title in titles:
|
|
||||||
try:
|
|
||||||
char = title[0][0]
|
|
||||||
char = char if char in ascii_lowercase else '#'
|
|
||||||
chars.add(str(char))
|
|
||||||
except:
|
|
||||||
log.error('Failed getting title for %s', title.libraries_id)
|
|
||||||
|
|
||||||
if len(chars) == 25:
|
|
||||||
break
|
|
||||||
|
|
||||||
db.expire_all()
|
|
||||||
return ''.join(sorted(chars))
|
|
||||||
|
|
||||||
def listView(self, **kwargs):
|
|
||||||
|
|
||||||
status = splitString(kwargs.get('status'))
|
|
||||||
release_status = splitString(kwargs.get('release_status'))
|
|
||||||
limit_offset = kwargs.get('limit_offset')
|
|
||||||
starts_with = kwargs.get('starts_with')
|
|
||||||
search = kwargs.get('search')
|
|
||||||
order = kwargs.get('order')
|
|
||||||
|
|
||||||
total_movies, movies = self.list(
|
|
||||||
status = status,
|
|
||||||
release_status = release_status,
|
|
||||||
limit_offset = limit_offset,
|
|
||||||
starts_with = starts_with,
|
|
||||||
search = search,
|
|
||||||
order = order
|
|
||||||
)
|
|
||||||
|
|
||||||
return {
|
|
||||||
'success': True,
|
|
||||||
'empty': len(movies) == 0,
|
|
||||||
'total': total_movies,
|
|
||||||
'movies': movies,
|
|
||||||
}
|
|
||||||
|
|
||||||
def charView(self, **kwargs):
|
|
||||||
|
|
||||||
status = splitString(kwargs.get('status', None))
|
|
||||||
release_status = splitString(kwargs.get('release_status', None))
|
|
||||||
chars = self.availableChars(status, release_status)
|
|
||||||
|
|
||||||
return {
|
|
||||||
'success': True,
|
|
||||||
'empty': len(chars) == 0,
|
|
||||||
'chars': chars,
|
|
||||||
}
|
|
||||||
|
|
||||||
def add(self, params = None, force_readd = True, search_after = True, update_library = False, status_id = None):
|
def add(self, params = None, force_readd = True, search_after = True, update_library = False, status_id = None):
|
||||||
if not params: params = {}
|
if not params: params = {}
|
||||||
@@ -447,7 +173,7 @@ class MovieBase(MovieTypeBase):
|
|||||||
|
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
fireEvent('movie.restatus', m.id)
|
fireEvent('media.restatus', m.id)
|
||||||
|
|
||||||
movie_dict = m.to_dict(self.default_dict)
|
movie_dict = m.to_dict(self.default_dict)
|
||||||
fireEventAsync('movie.searcher.single', movie_dict, on_complete = self.createNotifyFront(movie_id))
|
fireEventAsync('movie.searcher.single', movie_dict, on_complete = self.createNotifyFront(movie_id))
|
||||||
@@ -456,89 +182,3 @@ class MovieBase(MovieTypeBase):
|
|||||||
return {
|
return {
|
||||||
'success': True,
|
'success': True,
|
||||||
}
|
}
|
||||||
|
|
||||||
def deleteView(self, id = '', **kwargs):
|
|
||||||
|
|
||||||
ids = splitString(id)
|
|
||||||
for movie_id in ids:
|
|
||||||
self.delete(movie_id, delete_from = kwargs.get('delete_from', 'all'))
|
|
||||||
|
|
||||||
return {
|
|
||||||
'success': True,
|
|
||||||
}
|
|
||||||
|
|
||||||
def delete(self, movie_id, delete_from = None):
|
|
||||||
|
|
||||||
db = get_session()
|
|
||||||
|
|
||||||
movie = db.query(Media).filter_by(id = movie_id).first()
|
|
||||||
if movie:
|
|
||||||
deleted = False
|
|
||||||
if delete_from == 'all':
|
|
||||||
db.delete(movie)
|
|
||||||
db.commit()
|
|
||||||
deleted = True
|
|
||||||
else:
|
|
||||||
done_status = fireEvent('status.get', 'done', single = True)
|
|
||||||
|
|
||||||
total_releases = len(movie.releases)
|
|
||||||
total_deleted = 0
|
|
||||||
new_movie_status = None
|
|
||||||
for release in movie.releases:
|
|
||||||
if delete_from in ['wanted', 'snatched', 'late']:
|
|
||||||
if release.status_id != done_status.get('id'):
|
|
||||||
db.delete(release)
|
|
||||||
total_deleted += 1
|
|
||||||
new_movie_status = 'done'
|
|
||||||
elif delete_from == 'manage':
|
|
||||||
if release.status_id == done_status.get('id'):
|
|
||||||
db.delete(release)
|
|
||||||
total_deleted += 1
|
|
||||||
new_movie_status = 'active'
|
|
||||||
db.commit()
|
|
||||||
|
|
||||||
if total_releases == total_deleted:
|
|
||||||
db.delete(movie)
|
|
||||||
db.commit()
|
|
||||||
deleted = True
|
|
||||||
elif new_movie_status:
|
|
||||||
new_status = fireEvent('status.get', new_movie_status, single = True)
|
|
||||||
movie.profile_id = None
|
|
||||||
movie.status_id = new_status.get('id')
|
|
||||||
db.commit()
|
|
||||||
else:
|
|
||||||
fireEvent('movie.restatus', movie.id, single = True)
|
|
||||||
|
|
||||||
if deleted:
|
|
||||||
fireEvent('notify.frontend', type = 'movie.deleted', data = movie.to_dict())
|
|
||||||
|
|
||||||
db.expire_all()
|
|
||||||
return True
|
|
||||||
|
|
||||||
def restatus(self, movie_id):
|
|
||||||
|
|
||||||
active_status, done_status = fireEvent('status.get', ['active', 'done'], single = True)
|
|
||||||
|
|
||||||
db = get_session()
|
|
||||||
|
|
||||||
m = db.query(Media).filter_by(id = movie_id).first()
|
|
||||||
if not m or len(m.library.titles) == 0:
|
|
||||||
log.debug('Can\'t restatus movie, doesn\'t seem to exist.')
|
|
||||||
return False
|
|
||||||
|
|
||||||
log.debug('Changing status for %s', m.library.titles[0].title)
|
|
||||||
if not m.profile:
|
|
||||||
m.status_id = done_status.get('id')
|
|
||||||
else:
|
|
||||||
move_to_wanted = True
|
|
||||||
|
|
||||||
for t in m.profile.types:
|
|
||||||
for release in m.releases:
|
|
||||||
if t.quality.identifier is release.quality.identifier and (release.status_id is done_status.get('id') and t.finish):
|
|
||||||
move_to_wanted = False
|
|
||||||
|
|
||||||
m.status_id = active_status.get('id') if move_to_wanted else done_status.get('id')
|
|
||||||
|
|
||||||
db.commit()
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|||||||
@@ -281,7 +281,7 @@ var MovieList = new Class({
|
|||||||
|
|
||||||
// Get available chars and highlight
|
// Get available chars and highlight
|
||||||
if(!available_chars && (self.navigation.isDisplayed() || self.navigation.isVisible()))
|
if(!available_chars && (self.navigation.isDisplayed() || self.navigation.isVisible()))
|
||||||
Api.request('movie.available_chars', {
|
Api.request('media.available_chars', {
|
||||||
'data': Object.merge({
|
'data': Object.merge({
|
||||||
'status': self.options.status
|
'status': self.options.status
|
||||||
}, self.filter),
|
}, self.filter),
|
||||||
@@ -372,7 +372,7 @@ var MovieList = new Class({
|
|||||||
'click': function(e){
|
'click': function(e){
|
||||||
(e).preventDefault();
|
(e).preventDefault();
|
||||||
this.set('text', 'Deleting..')
|
this.set('text', 'Deleting..')
|
||||||
Api.request('movie.delete', {
|
Api.request('media.delete', {
|
||||||
'data': {
|
'data': {
|
||||||
'id': ids.join(','),
|
'id': ids.join(','),
|
||||||
'delete_from': self.options.identifier
|
'delete_from': self.options.identifier
|
||||||
@@ -550,8 +550,9 @@ var MovieList = new Class({
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Api.request(self.options.api_call || 'movie.list', {
|
Api.request(self.options.api_call || 'media.list', {
|
||||||
'data': Object.merge({
|
'data': Object.merge({
|
||||||
|
'type': 'movie',
|
||||||
'status': self.options.status,
|
'status': self.options.status,
|
||||||
'limit_offset': self.options.limit ? self.options.limit + ',' + self.offset : null
|
'limit_offset': self.options.limit ? self.options.limit + ',' + self.offset : null
|
||||||
}, self.filter),
|
}, self.filter),
|
||||||
|
|||||||
@@ -431,7 +431,7 @@ MA.Release = new Class({
|
|||||||
markMovieDone: function(){
|
markMovieDone: function(){
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
Api.request('movie.delete', {
|
Api.request('media.delete', {
|
||||||
'data': {
|
'data': {
|
||||||
'id': self.movie.get('id'),
|
'id': self.movie.get('id'),
|
||||||
'delete_from': 'wanted'
|
'delete_from': 'wanted'
|
||||||
@@ -821,7 +821,7 @@ MA.Delete = new Class({
|
|||||||
self.callChain();
|
self.callChain();
|
||||||
},
|
},
|
||||||
function(){
|
function(){
|
||||||
Api.request('movie.delete', {
|
Api.request('media.delete', {
|
||||||
'data': {
|
'data': {
|
||||||
'id': self.movie.get('id'),
|
'id': self.movie.get('id'),
|
||||||
'delete_from': self.movie.list.options.identifier
|
'delete_from': self.movie.list.options.identifier
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ class MovieSearcher(SearcherBase, MovieTypeBase):
|
|||||||
default_title = getTitle(movie['library'])
|
default_title = getTitle(movie['library'])
|
||||||
if not default_title:
|
if not default_title:
|
||||||
log.error('No proper info found for movie, removing it from library to cause it from having more issues.')
|
log.error('No proper info found for movie, removing it from library to cause it from having more issues.')
|
||||||
fireEvent('movie.delete', movie['id'], single = True)
|
fireEvent('media.delete', movie['id'], single = True)
|
||||||
return
|
return
|
||||||
|
|
||||||
fireEvent('notify.frontend', type = 'movie.searcher.started', data = {'id': movie['id']}, message = 'Searching for "%s"' % default_title)
|
fireEvent('notify.frontend', type = 'movie.searcher.started', data = {'id': movie['id']}, message = 'Searching for "%s"' % default_title)
|
||||||
@@ -192,7 +192,7 @@ class MovieSearcher(SearcherBase, MovieTypeBase):
|
|||||||
|
|
||||||
else:
|
else:
|
||||||
log.info('Better quality (%s) already available or snatched for %s', (quality_type['quality']['label'], default_title))
|
log.info('Better quality (%s) already available or snatched for %s', (quality_type['quality']['label'], default_title))
|
||||||
fireEvent('movie.restatus', movie['id'])
|
fireEvent('media.restatus', movie['id'])
|
||||||
break
|
break
|
||||||
|
|
||||||
# Break if CP wants to shut down
|
# Break if CP wants to shut down
|
||||||
@@ -333,7 +333,7 @@ class MovieSearcher(SearcherBase, MovieTypeBase):
|
|||||||
rel.status_id = ignored_status.get('id')
|
rel.status_id = ignored_status.get('id')
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
movie_dict = fireEvent('movie.get', movie_id, single = True)
|
movie_dict = fireEvent('media.get', movie_id, single = True)
|
||||||
log.info('Trying next release for: %s', getTitle(movie_dict['library']))
|
log.info('Trying next release for: %s', getTitle(movie_dict['library']))
|
||||||
fireEvent('movie.searcher.single', movie_dict, manual = manual)
|
fireEvent('movie.searcher.single', movie_dict, manual = manual)
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ class Automation(Plugin):
|
|||||||
if self.shuttingDown():
|
if self.shuttingDown():
|
||||||
break
|
break
|
||||||
|
|
||||||
movie_dict = fireEvent('movie.get', movie_id, single = True)
|
movie_dict = fireEvent('media.get', movie_id, single = True)
|
||||||
fireEvent('movie.searcher.single', movie_dict)
|
fireEvent('movie.searcher.single', movie_dict)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|||||||
@@ -112,11 +112,11 @@ class Manage(Plugin):
|
|||||||
if self.conf('cleanup') and full and not self.shuttingDown():
|
if self.conf('cleanup') and full and not self.shuttingDown():
|
||||||
|
|
||||||
# Get movies with done status
|
# Get movies with done status
|
||||||
total_movies, done_movies = fireEvent('movie.list', status = 'done', single = True)
|
total_movies, done_movies = fireEvent('media.list', types = 'movie', status = 'done', single = True)
|
||||||
|
|
||||||
for done_movie in done_movies:
|
for done_movie in done_movies:
|
||||||
if done_movie['library']['identifier'] not in added_identifiers:
|
if done_movie['library']['identifier'] not in added_identifiers:
|
||||||
fireEvent('movie.delete', movie_id = done_movie['id'], delete_from = 'all')
|
fireEvent('media.delete', movie_id = done_movie['id'], delete_from = 'all')
|
||||||
else:
|
else:
|
||||||
|
|
||||||
releases = fireEvent('release.for_movie', id = done_movie.get('id'), single = True)
|
releases = fireEvent('release.for_movie', id = done_movie.get('id'), single = True)
|
||||||
@@ -202,7 +202,7 @@ class Manage(Plugin):
|
|||||||
|
|
||||||
self.in_progress[folder]['to_go'] -= 1
|
self.in_progress[folder]['to_go'] -= 1
|
||||||
total = self.in_progress[folder]['total']
|
total = self.in_progress[folder]['total']
|
||||||
movie_dict = fireEvent('movie.get', identifier, single = True)
|
movie_dict = fireEvent('media.get', identifier, single = True)
|
||||||
|
|
||||||
fireEvent('notify.frontend', type = 'movie.added', data = movie_dict, message = None if total > 5 else 'Added "%s" to manage.' % getTitle(movie_dict['library']))
|
fireEvent('notify.frontend', type = 'movie.added', data = movie_dict, message = None if total > 5 else 'Added "%s" to manage.' % getTitle(movie_dict['library']))
|
||||||
|
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ class Release(Plugin):
|
|||||||
except:
|
except:
|
||||||
log.debug('Failed to attach "%s" to release: %s', (added_files, traceback.format_exc()))
|
log.debug('Failed to attach "%s" to release: %s', (added_files, traceback.format_exc()))
|
||||||
|
|
||||||
fireEvent('movie.restatus', movie.id)
|
fireEvent('media.restatus', movie.id)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|||||||
@@ -820,7 +820,7 @@ Remove it if you want it to be renamed (again, or at least let it try again)
|
|||||||
try:
|
try:
|
||||||
for rel in rels:
|
for rel in rels:
|
||||||
rel_dict = rel.to_dict({'info': {}})
|
rel_dict = rel.to_dict({'info': {}})
|
||||||
movie_dict = fireEvent('movie.get', rel.movie_id, single = True)
|
movie_dict = fireEvent('media.get', rel.movie_id, single = True)
|
||||||
|
|
||||||
if not isinstance(rel_dict['info'], (dict)):
|
if not isinstance(rel_dict['info'], (dict)):
|
||||||
log.error('Faulty release found without any info, ignoring.')
|
log.error('Faulty release found without any info, ignoring.')
|
||||||
|
|||||||
@@ -93,11 +93,11 @@ class MovieResultModifier(Plugin):
|
|||||||
|
|
||||||
for movie in l.movies:
|
for movie in l.movies:
|
||||||
if movie.status_id == active_status['id']:
|
if movie.status_id == active_status['id']:
|
||||||
temp['in_wanted'] = fireEvent('movie.get', movie.id, single = True)
|
temp['in_wanted'] = fireEvent('media.get', movie.id, single = True)
|
||||||
|
|
||||||
for release in movie.releases:
|
for release in movie.releases:
|
||||||
if release.status_id == done_status['id']:
|
if release.status_id == done_status['id']:
|
||||||
temp['in_library'] = fireEvent('movie.get', movie.id, single = True)
|
temp['in_library'] = fireEvent('media.get', movie.id, single = True)
|
||||||
except:
|
except:
|
||||||
log.error('Tried getting more info on searched movies: %s', traceback.format_exc())
|
log.error('Tried getting more info on searched movies: %s', traceback.format_exc())
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user