Optimize movie.list

This commit is contained in:
Ruud committed 2013-09-04 22:30:32 +02:00
1 parent 0c5b950c87
commit ac9aaec7b8
3 files changed
+136 -65

No files matched your search

+35 -12
View File
@@ -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();