Optimize movie.list
This commit is contained in:
1 parent
0c5b950c87
commit
ac9aaec7b8
3 files changed
+136
-65
No files matched your search
@@ -2,7 +2,8 @@ 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, simplifyString
|
from couchpotato.core.helpers.encoding import toUnicode, simplifyString
|
||||||
from couchpotato.core.helpers.variable import getImdb, splitString, tryInt
|
from couchpotato.core.helpers.variable import getImdb, 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, Movie, \
|
from couchpotato.core.settings.model import Library, LibraryTitle, Movie, \
|
||||||
@@ -204,28 +205,50 @@ class MovieBase(MovieTypeBase):
|
|||||||
else:
|
else:
|
||||||
q = q.order_by(asc(LibraryTitle.simple_title))
|
q = q.order_by(asc(LibraryTitle.simple_title))
|
||||||
|
|
||||||
q = q.subquery()
|
if limit_offset:
|
||||||
q2 = db.query(Movie).join((q, q.c.id == Movie.id)) \
|
splt = splitString(limit_offset) if isinstance(limit_offset, (str, unicode)) else limit_offset
|
||||||
.options(joinedload_all('releases.files')) \
|
limit = splt[0]
|
||||||
.options(joinedload_all('releases.info')) \
|
offset = 0 if len(splt) is 1 else splt[1]
|
||||||
|
q = q.limit(limit).offset(offset)
|
||||||
|
|
||||||
|
|
||||||
|
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(Movie) \
|
||||||
.options(joinedload_all('library.titles')) \
|
.options(joinedload_all('library.titles')) \
|
||||||
.options(joinedload_all('library.files')) \
|
.options(joinedload_all('library.files')) \
|
||||||
.options(joinedload_all('status')) \
|
.options(joinedload_all('status')) \
|
||||||
.options(joinedload_all('files'))
|
.options(joinedload_all('files'))
|
||||||
|
|
||||||
if limit_offset:
|
q2 = q2.filter(Movie.id.in_(movie_ids))
|
||||||
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]
|
|
||||||
q2 = q2.limit(limit).offset(offset)
|
|
||||||
|
|
||||||
results = q2.all()
|
results = q2.all()
|
||||||
|
|
||||||
movies = []
|
movies = []
|
||||||
for movie in results:
|
for movie in results:
|
||||||
movies.append(movie.to_dict({
|
|
||||||
'releases': {'files':{}, 'info': {}},
|
releases = []
|
||||||
|
for r in release_statuses.get(movie.id):
|
||||||
|
x = splitString(r)
|
||||||
|
releases.append({'status_id': x[0], 'quality_id': x[1]})
|
||||||
|
movies.append(mergeDicts(movie.to_dict({
|
||||||
'library': {'titles': {}, 'files':{}},
|
'library': {'titles': {}, 'files':{}},
|
||||||
'files': {},
|
'files': {},
|
||||||
|
}), {
|
||||||
|
'releases': releases,
|
||||||
|
'releases_count': releases_count.get(movie.id),
|
||||||
}))
|
}))
|
||||||
|
|
||||||
db.expire_all()
|
db.expire_all()
|
||||||
|
|||||||
@@ -124,6 +124,46 @@ MA.Release = new Class({
|
|||||||
else
|
else
|
||||||
self.showHelper();
|
self.showHelper();
|
||||||
|
|
||||||
|
App.addEvent('movie.searcher.ended.'+self.movie.data.id, function(notification){
|
||||||
|
self.releases = null;
|
||||||
|
if(self.options_container){
|
||||||
|
self.options_container.destroy();
|
||||||
|
self.options_container = null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
show: function(e){
|
||||||
|
var self = this;
|
||||||
|
if(e)
|
||||||
|
(e).preventDefault();
|
||||||
|
|
||||||
|
if(self.releases)
|
||||||
|
self.createReleases();
|
||||||
|
else {
|
||||||
|
|
||||||
|
self.movie.busy(true);
|
||||||
|
|
||||||
|
Api.request('release.for_movie', {
|
||||||
|
'data': {
|
||||||
|
'id': self.movie.data.id
|
||||||
|
},
|
||||||
|
'onComplete': function(json){
|
||||||
|
self.movie.busy(false, 1);
|
||||||
|
|
||||||
|
if(json && json.releases){
|
||||||
|
self.releases = json.releases;
|
||||||
|
self.createReleases();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
alert('Something went wrong, check the logs.');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
createReleases: function(){
|
createReleases: function(){
|
||||||
@@ -145,7 +185,7 @@ MA.Release = new Class({
|
|||||||
new Element('span.provider', {'text': 'Provider'})
|
new Element('span.provider', {'text': 'Provider'})
|
||||||
).inject(self.release_container)
|
).inject(self.release_container)
|
||||||
|
|
||||||
self.movie.data.releases.sortBy('-info.score').each(function(release){
|
self.releases.each(function(release){
|
||||||
|
|
||||||
var status = Status.get(release.status_id),
|
var status = Status.get(release.status_id),
|
||||||
quality = Quality.getProfile(release.quality_id) || {},
|
quality = Quality.getProfile(release.quality_id) || {},
|
||||||
@@ -211,13 +251,11 @@ MA.Release = new Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if(self.last_release){
|
if(self.last_release)
|
||||||
self.release_container.getElement('#release_'+self.last_release.id).addClass('last_release');
|
self.release_container.getElement('#release_'+self.last_release.id).addClass('last_release');
|
||||||
}
|
|
||||||
|
|
||||||
if(self.next_release){
|
if(self.next_release)
|
||||||
self.release_container.getElement('#release_'+self.next_release.id).addClass('next_release');
|
self.release_container.getElement('#release_'+self.next_release.id).addClass('next_release');
|
||||||
}
|
|
||||||
|
|
||||||
if(self.next_release || (self.last_release && ['ignored', 'failed'].indexOf(self.last_release.status.identifier) === false)){
|
if(self.next_release || (self.last_release && ['ignored', 'failed'].indexOf(self.last_release.status.identifier) === false)){
|
||||||
|
|
||||||
@@ -230,7 +268,9 @@ MA.Release = new Class({
|
|||||||
self.last_release ? new Element('a.button.orange', {
|
self.last_release ? new Element('a.button.orange', {
|
||||||
'text': 'the same release again',
|
'text': 'the same release again',
|
||||||
'events': {
|
'events': {
|
||||||
'click': self.trySameRelease.bind(self)
|
'click': function(){
|
||||||
|
self.download(self.last_release);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}) : null,
|
}) : null,
|
||||||
self.next_release && self.last_release ? new Element('span.or', {
|
self.next_release && self.last_release ? new Element('span.or', {
|
||||||
@@ -239,7 +279,9 @@ MA.Release = new Class({
|
|||||||
self.next_release ? [new Element('a.button.green', {
|
self.next_release ? [new Element('a.button.green', {
|
||||||
'text': self.last_release ? 'another release' : 'the best release',
|
'text': self.last_release ? 'another release' : 'the best release',
|
||||||
'events': {
|
'events': {
|
||||||
'click': self.tryNextRelease.bind(self)
|
'click': function(){
|
||||||
|
self.download(self.next_release);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
new Element('span.or', {
|
new Element('span.or', {
|
||||||
@@ -248,18 +290,15 @@ MA.Release = new Class({
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.last_release = null;
|
||||||
|
self.next_release = null;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
// Show it
|
||||||
|
|
||||||
show: function(e){
|
|
||||||
var self = this;
|
|
||||||
if(e)
|
|
||||||
(e).preventDefault();
|
|
||||||
|
|
||||||
self.createReleases();
|
|
||||||
self.options_container.inject(self.movie, 'top');
|
self.options_container.inject(self.movie, 'top');
|
||||||
self.movie.slide('in', self.options_container);
|
self.movie.slide('in', self.options_container);
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
showHelper: function(e){
|
showHelper: function(e){
|
||||||
@@ -267,15 +306,29 @@ MA.Release = new Class({
|
|||||||
if(e)
|
if(e)
|
||||||
(e).preventDefault();
|
(e).preventDefault();
|
||||||
|
|
||||||
self.createReleases();
|
var has_available = false,
|
||||||
|
has_snatched = false;
|
||||||
|
|
||||||
if(self.next_release || (self.last_release && ['ignored', 'failed'].indexOf(self.last_release.status.identifier) === false)){
|
self.movie.data.releases.each(function(release){
|
||||||
|
if(has_available && has_snatched) return;
|
||||||
|
|
||||||
|
var status = Status.get(release.status_id);
|
||||||
|
|
||||||
|
if(['snatched', 'downloaded', 'seeding'].contains(status.identifier))
|
||||||
|
has_snatched = true;
|
||||||
|
|
||||||
|
if(['available'].contains(status.identifier))
|
||||||
|
has_available = true;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
if(has_available || has_snatched){
|
||||||
|
|
||||||
self.trynext_container = new Element('div.buttons.trynext').inject(self.movie.info_container);
|
self.trynext_container = new Element('div.buttons.trynext').inject(self.movie.info_container);
|
||||||
|
|
||||||
self.trynext_container.adopt(
|
self.trynext_container.adopt(
|
||||||
self.next_release ? [new Element('a.icon2.readd', {
|
has_available ? [new Element('a.icon2.readd', {
|
||||||
'text': self.last_release ? 'Download another release' : 'Download the best release',
|
'text': has_snatched ? 'Download another release' : 'Download the best release',
|
||||||
'events': {
|
'events': {
|
||||||
'click': self.tryNextRelease.bind(self)
|
'click': self.tryNextRelease.bind(self)
|
||||||
}
|
}
|
||||||
@@ -291,24 +344,7 @@ MA.Release = new Class({
|
|||||||
new Element('a.icon2.completed', {
|
new Element('a.icon2.completed', {
|
||||||
'text': 'mark this movie done',
|
'text': 'mark this movie done',
|
||||||
'events': {
|
'events': {
|
||||||
'click': function(){
|
'click': self.markMovieDone.bind(self)
|
||||||
Api.request('movie.delete', {
|
|
||||||
'data': {
|
|
||||||
'id': self.movie.get('id'),
|
|
||||||
'delete_from': 'wanted'
|
|
||||||
},
|
|
||||||
'onComplete': function(){
|
|
||||||
var movie = $(self.movie);
|
|
||||||
movie.set('tween', {
|
|
||||||
'duration': 300,
|
|
||||||
'onComplete': function(){
|
|
||||||
self.movie.destroy()
|
|
||||||
}
|
|
||||||
});
|
|
||||||
movie.tween('height', 0);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
@@ -326,14 +362,14 @@ MA.Release = new Class({
|
|||||||
var release_el = self.release_container.getElement('#release_'+release.id),
|
var release_el = self.release_container.getElement('#release_'+release.id),
|
||||||
icon = release_el.getElement('.download.icon2');
|
icon = release_el.getElement('.download.icon2');
|
||||||
|
|
||||||
self.movie.busy(true);
|
icon.addClass('icon spinner').removeClass('download');
|
||||||
|
|
||||||
Api.request('release.download', {
|
Api.request('release.download', {
|
||||||
'data': {
|
'data': {
|
||||||
'id': release.id
|
'id': release.id
|
||||||
},
|
},
|
||||||
'onComplete': function(json){
|
'onComplete': function(json){
|
||||||
self.movie.busy(false);
|
icon.removeClass('icon spinner');
|
||||||
|
|
||||||
if(json.success)
|
if(json.success)
|
||||||
icon.addClass('completed');
|
icon.addClass('completed');
|
||||||
@@ -365,24 +401,36 @@ MA.Release = new Class({
|
|||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
tryNextRelease: function(movie_id){
|
markMovieDone: function(){
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
self.createReleases();
|
Api.request('movie.delete', {
|
||||||
|
'data': {
|
||||||
if(self.last_release)
|
'id': self.movie.get('id'),
|
||||||
self.ignore(self.last_release);
|
'delete_from': 'wanted'
|
||||||
|
},
|
||||||
if(self.next_release)
|
'onComplete': function(){
|
||||||
self.download(self.next_release);
|
var movie = $(self.movie);
|
||||||
|
movie.set('tween', {
|
||||||
|
'duration': 300,
|
||||||
|
'onComplete': function(){
|
||||||
|
self.movie.destroy()
|
||||||
|
}
|
||||||
|
});
|
||||||
|
movie.tween('height', 0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
trySameRelease: function(movie_id){
|
tryNextRelease: function(movie_id){
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
if(self.last_release)
|
Api.request('movie.searcher.try_next', {
|
||||||
self.download(self.last_release);
|
'data': {
|
||||||
|
'id': self.movie.get('id')
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ var Movie = new Class({
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
busy: function(set_busy){
|
busy: function(set_busy, timeout){
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
if(!set_busy){
|
if(!set_busy){
|
||||||
@@ -72,9 +72,9 @@ var Movie = new Class({
|
|||||||
self.spinner.el.destroy();
|
self.spinner.el.destroy();
|
||||||
self.spinner = null;
|
self.spinner = null;
|
||||||
self.mask = null;
|
self.mask = null;
|
||||||
}, 400);
|
}, timeout || 400);
|
||||||
}
|
}
|
||||||
}, 1000)
|
}, timeout || 1000)
|
||||||
}
|
}
|
||||||
else if(!self.spinner) {
|
else if(!self.spinner) {
|
||||||
self.createMask();
|
self.createMask();
|
||||||
|
|||||||
Reference in new issue
Block a user