You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.8 KiB
112 lines
3.8 KiB
import random as rndm
|
|
import time
|
|
from CodernityDB.database import RecordDeleted
|
|
|
|
from couchpotato import get_db
|
|
from couchpotato.api import addApiView
|
|
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
|
|
|
|
|
|
log = CPLog(__name__)
|
|
|
|
autoload = 'Dashboard'
|
|
|
|
|
|
class Dashboard(Plugin):
|
|
|
|
def __init__(self):
|
|
addApiView('dashboard.soon', self.getSoonView)
|
|
|
|
def getSoonView(self, limit_offset = None, random = False, late = False, **kwargs):
|
|
|
|
db = get_db()
|
|
now = time.time()
|
|
|
|
# Get profiles first, determine pre or post theater
|
|
profiles = fireEvent('profile.all', single = True)
|
|
pre_releases = fireEvent('quality.pre_releases', single = True)
|
|
|
|
# See what the profile contain and cache it
|
|
profile_pre = {}
|
|
for profile in profiles:
|
|
contains = {}
|
|
for q_identifier in profile.get('qualities', []):
|
|
contains['theater' if q_identifier in pre_releases else 'dvd'] = True
|
|
|
|
profile_pre[profile.get('_id')] = contains
|
|
|
|
# Add limit
|
|
limit = 12
|
|
if limit_offset:
|
|
splt = splitString(limit_offset) if isinstance(limit_offset, (str, unicode)) else limit_offset
|
|
limit = tryInt(splt[0])
|
|
|
|
# Get all active medias
|
|
active_ids = [x['_id'] for x in fireEvent('media.with_status', 'active', with_doc = False, single = True)]
|
|
|
|
medias = []
|
|
|
|
if len(active_ids) > 0:
|
|
|
|
# Order by title or randomize
|
|
if not random:
|
|
orders_ids = db.all('media_title')
|
|
active_ids = [x['_id'] for x in orders_ids if x['_id'] in active_ids]
|
|
else:
|
|
rndm.shuffle(active_ids)
|
|
|
|
for media_id in active_ids:
|
|
try:
|
|
media = db.get('id', media_id)
|
|
except RecordDeleted:
|
|
log.debug('Record already deleted: %s', media_id)
|
|
continue
|
|
|
|
pp = profile_pre.get(media.get('profile_id'))
|
|
if not pp: continue
|
|
|
|
eta = media['info'].get('release_date', {}) or {}
|
|
coming_soon = False
|
|
|
|
# Theater quality
|
|
if pp.get('theater') and fireEvent('movie.searcher.could_be_released', True, eta, media['info']['year'], single = True):
|
|
coming_soon = 'theater'
|
|
elif pp.get('dvd') and fireEvent('movie.searcher.could_be_released', False, eta, media['info']['year'], single = True):
|
|
coming_soon = 'dvd'
|
|
|
|
if coming_soon:
|
|
|
|
# Don't list older movies
|
|
eta_date = eta.get(coming_soon)
|
|
eta_3month_passed = eta_date < (now - 7862400) # Release was more than 3 months ago
|
|
|
|
if (not late and not eta_3month_passed) or \
|
|
(late and eta_3month_passed):
|
|
|
|
add = True
|
|
|
|
# Check if it doesn't have any releases
|
|
if late:
|
|
media['releases'] = fireEvent('release.for_media', media['_id'], single = True)
|
|
|
|
for release in media.get('releases'):
|
|
if release.get('status') in ['snatched', 'available', 'seeding', 'downloaded']:
|
|
add = False
|
|
break
|
|
|
|
if add:
|
|
medias.append(media)
|
|
|
|
if len(medias) >= limit:
|
|
break
|
|
|
|
return {
|
|
'success': True,
|
|
'empty': len(medias) == 0,
|
|
'movies': medias,
|
|
}
|
|
|
|
getLateView = getSoonView
|
|
|