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.

200 lines
5.1 KiB

14 years ago
from couchpotato import get_session
from couchpotato.api import addApiView
from couchpotato.core.event import addEvent, fireEvent
from couchpotato.core.helpers.encoding import toUnicode
14 years ago
from couchpotato.core.logger import CPLog
from couchpotato.core.plugins.base import Plugin
from couchpotato.core.settings.model import Profile, ProfileType, Movie
14 years ago
log = CPLog(__name__)
class ProfilePlugin(Plugin):
to_dict = {'types': {}}
def __init__(self):
14 years ago
addEvent('profile.all', self.all)
addEvent('profile.default', self.default)
addApiView('profile.save', self.save)
14 years ago
addApiView('profile.save_order', self.saveOrder)
addApiView('profile.delete', self.delete)
addApiView('profile.list', self.allView, docs = {
'desc': 'List all available profiles',
'return': {'type': 'object', 'example': """{
'success': True,
'list': array, profiles
}"""}
})
addEvent('app.initialize', self.fill, priority = 90)
addEvent('app.load', self.forceDefaults)
def forceDefaults(self):
# Get all active movies without profile
active_status = fireEvent('status.get', 'active', single = True)
db = get_session()
movies = db.query(Movie).filter(Movie.status_id == active_status.get('id'), Movie.profile == None).all()
if len(movies) > 0:
default_profile = self.default()
for movie in movies:
movie.profile_id = default_profile.get('id')
db.commit()
def allView(self):
return {
'success': True,
'list': self.all()
}
14 years ago
def all(self):
db = get_session()
profiles = db.query(Profile).all()
14 years ago
temp = []
for profile in profiles:
temp.append(profile.to_dict(self.to_dict))
14 years ago
db.expire_all()
14 years ago
return temp
def save(self, **kwargs):
14 years ago
db = get_session()
p = db.query(Profile).filter_by(id = kwargs.get('id')).first()
14 years ago
if not p:
p = Profile()
db.add(p)
p.label = toUnicode(kwargs.get('label'))
p.order = kwargs.get('order', p.order if p.order else 0)
p.core = kwargs.get('core', False)
14 years ago
#delete old types
[db.delete(t) for t in p.types]
order = 0
for type in kwargs.get('types', []):
14 years ago
t = ProfileType(
order = order,
finish = type.get('finish') if order > 0 else 1,
wait_for = kwargs.get('wait_for'),
14 years ago
quality_id = type.get('quality_id')
)
p.types.append(t)
order += 1
db.commit()
profile_dict = p.to_dict(self.to_dict)
return {
'success': True,
'profile': profile_dict
}
def default(self):
db = get_session()
default = db.query(Profile).first()
default_dict = default.to_dict(self.to_dict)
db.expire_all()
return default_dict
def saveOrder(self, **kwargs):
14 years ago
db = get_session()
order = 0
for profile in kwargs.get('ids', []):
14 years ago
p = db.query(Profile).filter_by(id = profile).first()
p.hide = kwargs.get('hidden')[order]
14 years ago
p.order = order
order += 1
db.commit()
return {
14 years ago
'success': True
}
14 years ago
def delete(self, id = None):
14 years ago
db = get_session()
success = False
message = ''
try:
p = db.query(Profile).filter_by(id = id).first()
db.delete(p)
db.commit()
# Force defaults on all empty profile movies
self.forceDefaults()
14 years ago
success = True
except Exception, e:
message = log.error('Failed deleting Profile: %s', e)
14 years ago
db.expire_all()
return {
14 years ago
'success': success,
'message': message
}
def fill(self):
db = get_session();
profiles = [{
'label': 'Best',
'qualities': ['720p', '1080p', 'brrip', 'dvdrip']
}, {
'label': 'HD',
'qualities': ['720p', '1080p']
}, {
'label': 'SD',
'qualities': ['dvdrip', 'dvdr']
}]
# Create default quality profile
order = -2
for profile in profiles:
log.info('Creating default profile: %s', profile.get('label'))
p = Profile(
label = toUnicode(profile.get('label')),
order = order
)
db.add(p)
quality_order = 0
for quality in profile.get('qualities'):
quality = fireEvent('quality.single', identifier = quality, single = True)
profile_type = ProfileType(
quality_id = quality.get('id'),
profile = p,
finish = True,
wait_for = 0,
order = quality_order
)
p.types.append(profile_type)
quality_order += 1
order += 1
db.commit()
return True