Optimize and order dashboard list

This commit is contained in:
Ruud
2013-09-06 20:03:34 +02:00
parent bc94e90994
commit 1b6bf13619

View File

@@ -4,8 +4,9 @@ from couchpotato.core.event import fireEvent
from couchpotato.core.helpers.variable import splitString, tryInt
from couchpotato.core.logger import CPLog
from couchpotato.core.plugins.base import Plugin
from couchpotato.core.settings.model import Movie
from couchpotato.core.settings.model import Movie, Library, LibraryTitle
from sqlalchemy.orm import joinedload_all
from sqlalchemy.sql.expression import asc
import random as rndm
import time
@@ -48,64 +49,65 @@ class Dashboard(Plugin):
# Get all active movies
active_status = fireEvent('status.get', ['active'], single = True)
active = db.query(Movie) \
q = db.query(Movie) \
.join(Library) \
.filter(Movie.status_id == active_status.get('id')) \
.all()
all_movie_ids = [r.id for r in active]
.with_entities(Movie.id, Movie.profile_id, Library.info, Library.year) \
.group_by(Movie.id)
if not random:
q = q.join(LibraryTitle) \
.filter(LibraryTitle.default == True) \
.order_by(asc(LibraryTitle.simple_title))
active = q.all()
# Do the shuffle
if random:
rndm.shuffle(all_movie_ids)
rndm.shuffle(active)
group_limit = limit * 5
group_offset = 0
movies = []
movie_ids = []
for movie in active:
movie_id, profile_id, info, year = movie
while group_offset < len(all_movie_ids) and len(movies) < limit:
pp = profile_pre.get(profile_id)
if not pp: continue
movie_ids = all_movie_ids[group_offset:group_offset + group_limit]
group_offset += group_limit
eta = info.get('release_date', {}) or {}
coming_soon = False
# Only joined needed
q = db.query(Movie) \
.options(joinedload_all('library')) \
.filter(Movie.id.in_(movie_ids))
all_movies = q.all()
# Theater quality
if pp.get('theater') and fireEvent('movie.searcher.could_be_released', True, eta, year, single = True):
coming_soon = True
elif pp.get('dvd') and fireEvent('movie.searcher.could_be_released', False, eta, year, single = True):
coming_soon = True
for movie in all_movies:
pp = profile_pre.get(movie.profile_id)
if not pp: continue
if coming_soon:
eta = movie.library.info.get('release_date', {}) or {}
coming_soon = False
# Don't list older movies
if ((not late and (not eta.get('dvd') and not eta.get('theater') or eta.get('dvd') and eta.get('dvd') > (now - 2419200))) or
(late and (eta.get('dvd', 0) > 0 or eta.get('theater')) and eta.get('dvd') < (now - 2419200))):
movie_ids.append(movie_id)
# Theater quality
if pp.get('theater') and fireEvent('movie.searcher.could_be_released', True, eta, movie.library.year, single = True):
coming_soon = True
elif pp.get('dvd') and fireEvent('movie.searcher.could_be_released', False, eta, movie.library.year, single = True):
coming_soon = True
if coming_soon:
# Don't list older movies
if ((not late and (not eta.get('dvd') and not eta.get('theater') or eta.get('dvd') and eta.get('dvd') > (now - 2419200))) or
(late and (eta.get('dvd', 0) > 0 or eta.get('theater')) and eta.get('dvd') < (now - 2419200))):
movies.append(movie.id)
if len(movies) >= limit:
break
if len(movie_ids) >= limit:
break
# Get all movie information
movies_raw = db.query(Movie) \
.options(joinedload_all('library.titles')) \
.options(joinedload_all('library.files')) \
.options(joinedload_all('files')) \
.filter(Movie.id.in_(movies)) \
.filter(Movie.id.in_(movie_ids)) \
.all()
# Create dict by movie id
movie_dict = {}
for movie in movies_raw:
movie_dict[movie.id] = movie
movies = []
for r in movies_raw:
movies.append(r.to_dict({
for movie_id in movie_ids:
movies.append(movie_dict[movie_id].to_dict({
'library': {'titles': {}, 'files':{}},
'files': {},
}))