from couchpotato import get_session from couchpotato.api import addApiView from couchpotato.core.event import fireEvent, addEvent from couchpotato.core.helpers.request import getParam, jsonified from couchpotato.core.logger import CPLog from couchpotato.core.plugins.base import Plugin from couchpotato.core.plugins.scanner.main import Scanner from couchpotato.core.settings.model import File, Release as Relea, Movie from sqlalchemy.sql.expression import and_, or_ log = CPLog(__name__) class Release(Plugin): def __init__(self): addEvent('release.add', self.add) addApiView('release.download', self.download) addApiView('release.delete', self.delete) def add(self, group): db = get_session() identifier = '%s.%s.%s' % (group['library']['identifier'], group['meta_data'].get('audio', 'unknown'), group['meta_data']['quality']['identifier']) # Add movie done_status = fireEvent('status.get', 'done', single = True) movie = db.query(Movie).filter_by(library_id = group['library'].get('id')).first() if not movie: movie = Movie( library_id = group['library'].get('id'), profile_id = 0, status_id = done_status.get('id') ) db.add(movie) db.commit() # Add Release snatched_status = fireEvent('status.get', 'snatched', single = True) rel = db.query(Relea).filter( or_( Relea.identifier == identifier, and_(Relea.identifier.startswith(group['library']['identifier']), Relea.status_id == snatched_status.get('id')) ) ).first() if not rel: rel = Relea( identifier = identifier, movie = movie, quality_id = group['meta_data']['quality'].get('id'), status_id = done_status.get('id') ) db.add(rel) db.commit() # Add each file type for type in group['files']: for file in group['files'][type]: added_file = self.saveFile(file, type = type, include_media_info = type is 'movie') try: added_file = db.query(File).filter_by(id = added_file.get('id')).one() Relea.files.append(added_file) db.commit() except Exception, e: log.debug('Failed to attach "%s" to Relea: %s' % (file, e)) db.remove() def saveFile(self, file, type = 'unknown', include_media_info = False): properties = {} # Get media info for files if include_media_info: properties = {} # Check database and update/insert if necessary return fireEvent('file.add', path = file, part = fireEvent('scanner.partnumber', file, single = True), type = Scanner.file_types[type], properties = properties, single = True) def delete(self): db = get_session() id = getParam('id') rel = db.query(Relea).filter_by(id = id).first() if rel: rel.delete() db.commit() return jsonified({ 'success': True }) def download(self): db = get_session() id = getParam('id') rel = db.query(Relea).filter_by(id = id).first() if rel: item = {} for info in rel.info: item[info.identifier] = info.value # Get matching provider provider = fireEvent('provider.belongs_to', item['url'], single = True) item['download'] = provider.download fireEvent('searcher.download', data = item, movie = rel.movie.to_dict({ 'profile': {'types': {'quality': {}}}, 'releases': {'status': {}, 'quality': {}}, 'library': {'titles': {}, 'files':{}}, 'files': {} })) return jsonified({ 'success': True }) else: log.error('Couldn\'t find release with id: %s' % id) return jsonified({ 'success': False })