diff --git a/couchpotato/core/plugins/dashboard/main.py b/couchpotato/core/plugins/dashboard/main.py index 589b81e7..5a351672 100644 --- a/couchpotato/core/plugins/dashboard/main.py +++ b/couchpotato/core/plugins/dashboard/main.py @@ -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': {}, }))