This commit is contained in:
Ruud
2014-02-08 17:58:45 +01:00
parent a609b401c4
commit c3bc9c8591
27 changed files with 185 additions and 352 deletions
+17 -4
View File
@@ -1,16 +1,29 @@
from hashlib import md5
from CodernityDB.tree_index import TreeBasedIndex
class CategoryIndex(TreeBasedIndex):
def __init__(self, *args, **kwargs):
kwargs['key_format'] = '32s'
kwargs['key_format'] = 'i'
super(CategoryIndex, self).__init__(*args, **kwargs)
def make_key(self, key):
return md5(key).hexdigest()
return key
def make_key_value(self, data):
if data.get('_t') == 'category':
return md5(data['media_id']).hexdigest(), None
return data.get('order', -99), None
class CategoryMediaIndex(TreeBasedIndex):
def __init__(self, *args, **kwargs):
kwargs['key_format'] = '32s'
super(CategoryMediaIndex, self).__init__(*args, **kwargs)
def make_key(self, key):
return str(key)
def make_key_value(self, data):
if data.get('_t') == 'media' and data.get('category_id'):
return str(data.get('category_id')), None
+26 -36
View File
@@ -1,12 +1,11 @@
import traceback
from couchpotato import get_session, get_db
from couchpotato import get_db
from couchpotato.api import addApiView
from couchpotato.core.event import addEvent
from couchpotato.core.helpers.encoding import toUnicode
from couchpotato.core.logger import CPLog
from couchpotato.core.plugins.base import Plugin
from .index import CategoryIndex
from couchpotato.core.settings.model import Media, Category
from .index import CategoryIndex, CategoryMediaIndex
log = CPLog(__name__)
@@ -32,18 +31,25 @@ class CategoryPlugin(Plugin):
db = get_db()
# Release media_id index
# Category index
try:
db.add_index(CategoryIndex(db.path, 'category'))
except:
log.debug('Index already exists')
db.edit_index(CategoryIndex(db.path, 'category'))
# Category media_id index
try:
db.add_index(CategoryMediaIndex(db.path, 'category_media'))
except:
log.debug('Index already exists')
db.edit_index(CategoryMediaIndex(db.path, 'category_media'))
def allView(self, **kwargs):
return {
'success': True,
'list': self.all()
'categories': self.all()
}
def all(self):
@@ -51,11 +57,7 @@ class CategoryPlugin(Plugin):
db = get_db()
categories = db.all('category', with_doc = True)
temp = []
for category in categories:
temp.append(category['doc'])
return temp
return [x['doc'] for x in categories]
def save(self, **kwargs):
@@ -63,7 +65,8 @@ class CategoryPlugin(Plugin):
db = get_db()
category = {
'order': kwargs.get('order', 0),
'_t': 'category',
'order': kwargs.get('order', 999),
'label': toUnicode(kwargs.get('label', '')),
'ignored': toUnicode(kwargs.get('ignored', '')),
'preferred': toUnicode(kwargs.get('preferred', '')),
@@ -96,26 +99,21 @@ class CategoryPlugin(Plugin):
def saveOrder(self, **kwargs):
try:
db = get_session()
db = get_db()
order = 0
for category_id in kwargs.get('ids', []):
c = db.query(Category).filter_by(id = category_id).first()
c.order = order
c = db.get('id', category_id)
c['order'] = order
db.update(c)
order += 1
db.commit()
pass #db.close()
return {
'success': True
}
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
pass #db.close()
return {
'success': False
@@ -124,32 +122,27 @@ class CategoryPlugin(Plugin):
def delete(self, id = None, **kwargs):
try:
db = get_session()
db = get_db()
success = False
message = ''
try:
c = db.query(Category).filter_by(id = id).first()
c = db.get('id', id)
db.delete(c)
db.commit()
# Force defaults on all empty category movies
self.removeFromMovie(id)
success = True
except Exception as e:
message = log.error('Failed deleting category: %s', e)
except:
message = log.error('Failed deleting category: %s', traceback.format_exc())
pass #db.close()
return {
'success': success,
'message': message
}
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
pass #db.close()
return {
'success': False
@@ -158,15 +151,12 @@ class CategoryPlugin(Plugin):
def removeFromMovie(self, category_id):
try:
db = get_session()
movies = db.query(Media).filter(Media.category_id == category_id).all()
db = get_db()
movies = [x['doc'] for x in db.get_many('category_media', category_id, with_doc = True)]
if len(movies) > 0:
for movie in movies:
movie.category_id = None
db.commit()
movie['category_id'] = None
db.update(movie)
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
pass #db.close()
@@ -86,7 +86,7 @@ var CategoryListBase = new Class({
getCategory: function(id){
return this.categories.filter(function(category){
return category.data.id == id
return category.data._id == id
}).pick()
},
@@ -121,7 +121,7 @@ var CategoryListBase = new Class({
).inject(self.content)
Array.each(self.categories, function(category){
new Element('li', {'data-id': category.data.id}).adopt(
new Element('li', {'data-id': category.data._id}).adopt(
new Element('span.category_label', {
'text': category.data.label
}),
@@ -258,7 +258,7 @@ var Category = new Class({
var self = this;
var data = {
'id' : self.data.id,
'id' : self.data._id,
'label' : self.el.getElement('.category_label input').get('value'),
'required' : self.el.getElement('.category_required input').get('value'),
'preferred' : self.el.getElement('.category_preferred input').get('value'),
@@ -271,7 +271,7 @@ var Category = new Class({
del: function(){
var self = this;
if(self.data.label == undefined){
self.el.destroy();
return;
@@ -286,7 +286,7 @@ var Category = new Class({
(e).preventDefault();
Api.request('category.delete', {
'data': {
'id': self.data.id
'id': self.data._id
},
'useSpinner': true,
'spinnerOptions': {
@@ -329,4 +329,4 @@ var Category = new Class({
return this.el
}
});
});
+31 -40
View File
@@ -1,8 +1,9 @@
import traceback
from couchpotato import get_session, get_db
from couchpotato import get_session, get_db, tryInt
from couchpotato.api import addApiView
from couchpotato.core.event import addEvent
from couchpotato.core.helpers.encoding import toUnicode
from couchpotato.core.helpers.variable import splitString
from couchpotato.core.logger import CPLog
from couchpotato.core.plugins.base import Plugin
from .index import ProfileIndex
@@ -78,45 +79,41 @@ class ProfilePlugin(Plugin):
def save(self, **kwargs):
try:
db = get_session()
db = get_db()
p = db.query(Profile).filter_by(id = kwargs.get('id')).first()
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)
#delete old types
[db.delete(t) for t in p.types]
profile = {
'label': toUnicode(kwargs.get('label')),
'order': tryInt(kwargs.get('order', 999)),
'core': kwargs.get('core', False),
'qualities': [],
'wait_for': [],
'finish': []
}
# Update types
order = 0
for type in kwargs.get('types', []):
t = ProfileType(
order = order,
finish = type.get('finish') if order > 0 else 1,
wait_for = kwargs.get('wait_for'),
quality_id = type.get('quality_id')
)
p.types.append(t)
profile['qualities'].append(type.get('quality'))
profile['wait_for'].append(tryInt(type.get('wait_for')))
profile['finish'].append((tryInt(type.get('finish')) == 1) if order > 0 else True)
order += 1
db.commit()
id = kwargs.get('id')
try:
p = db.get('id', id)
except:
p = db.insert(profile)
p.update(profile)
profile_dict = p.to_dict(self.to_dict)
p['order'] = tryInt(kwargs.get('order', p.get('order', 999)))
db.update(p)
return {
'success': True,
'profile': profile_dict
'profile': p
}
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
pass #db.close()
return {
'success': False
@@ -129,26 +126,23 @@ class ProfilePlugin(Plugin):
def saveOrder(self, **kwargs):
try:
db = get_session()
db = get_db()
order = 0
for profile in kwargs.get('ids', []):
p = db.query(Profile).filter_by(id = profile).first()
p.hide = kwargs.get('hidden')[order]
p.order = order
for profile_id in kwargs.get('ids', []):
p = db.get('id', profile_id)
p['hide'] = tryInt(kwargs.get('hidden')[order]) == 1
p['order'] = order
db.update(p)
order += 1
db.commit()
return {
'success': True
}
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
pass #db.close()
return {
'success': False
@@ -180,9 +174,6 @@ class ProfilePlugin(Plugin):
}
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
pass #db.close()
return {
'success': False
@@ -57,14 +57,16 @@ var Profile = new Class({
self.makeSortable();
// Combine qualities and properties into types
data.types = [];
data.qualities.each(function(quality, nr){
data.types.include({
'quality_identifier': quality,
'finish': data.finish[nr] || false,
'wait_for': data.wait_for[nr] || 0
})
});
if(data.qualities){
data.types = [];
data.qualities.each(function(quality, nr){
data.types.include({
'quality': quality,
'finish': data.finish[nr] || false,
'wait_for': data.wait_for[nr] || 0
})
});
}
if(data.types)
data.types.each(self.addType.bind(self));
@@ -112,16 +114,16 @@ var Profile = new Class({
var self = this;
var data = {
'id' : self.data.id,
'id' : self.data._id,
'label' : self.el.getElement('.quality_label input').get('value'),
'wait_for' : self.el.getElement('.wait_for input').get('value'),
'types': []
}
Array.each(self.type_container.getElements('.type'), function(type){
if(!type.hasClass('deleted') && type.getElement('select').get('value') > 0)
if(!type.hasClass('deleted') && type.getElement('select').get('value') != -1)
data.types.include({
'quality_identifier': type.getElement('select').get('value'),
'quality': type.getElement('select').get('value'),
'finish': +type.getElement('input[type=checkbox]').checked,
'wait_for': 0
});
@@ -156,7 +158,7 @@ var Profile = new Class({
var self = this;
return self.types.filter(function(type){
return type.get('quality_identifier')
return type.get('quality')
});
},
@@ -173,7 +175,7 @@ var Profile = new Class({
(e).preventDefault();
Api.request('profile.delete', {
'data': {
'id': self.data.id
'id': self.data._id
},
'useSpinner': true,
'spinnerOptions': {
@@ -275,7 +277,7 @@ Profile.Type = new Class({
new Element('span.handle')
);
self.el[self.data.quality_identifier ? 'removeClass' : 'addClass']('is_empty');
self.el[self.data.quality ? 'removeClass' : 'addClass']('is_empty');
self.finish_class = new Form.Check(self.finish);
@@ -302,7 +304,7 @@ Profile.Type = new Class({
}).inject(self.qualities)
});
self.qualities.set('value', self.data.quality_identifier);
self.qualities.set('value', self.data.quality);
return self.qualities;
@@ -312,7 +314,7 @@ Profile.Type = new Class({
var self = this;
return {
'quality_identifier': self.qualities.get('value'),
'quality': self.qualities.get('value'),
'finish': +self.finish.checked,
'wait_for': 0
}
-3
View File
@@ -138,9 +138,6 @@ class QualityPlugin(Plugin):
}
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
pass #db.close()
return {
'success': False
@@ -117,7 +117,7 @@ var QualityBase = new Class({
Array.each(self.profiles, function(profile){
var check;
new Element('li', {'data-id': profile.data.id}).adopt(
new Element('li', {'data-id': profile.data._id}).adopt(
check = new Element('input.inlay[type=checkbox]', {
'checked': !profile.data.hide,
'events': {
-36
View File
@@ -42,18 +42,11 @@ class Release(Plugin):
'id': {'type': 'id', 'desc': 'ID of the release object in release-table'}
}
})
addApiView('release.for_movie', self.forMovieView, docs = {
'desc': 'Returns all releases for a movie. Ordered by score(desc)',
'params': {
'id': {'type': 'id', 'desc': 'ID of the movie'}
}
})
addEvent('release.add', self.add)
addEvent('release.download', self.download)
addEvent('release.try_download_result', self.tryDownloadResult)
addEvent('release.create_from_search', self.createFromSearch)
addEvent('release.for_movie', self.forMovie)
addEvent('release.delete', self.delete)
addEvent('release.clean', self.clean)
addEvent('release.update_status', self.updateStatus)
@@ -266,7 +259,6 @@ class Release(Plugin):
if success:
fireEvent('notify.frontend', type = 'release.manual_download', data = True, message = 'Successfully snatched "%s"' % item['name'])
pass #db.close()
return {
'success': success == True
}
@@ -352,10 +344,7 @@ class Release(Plugin):
except:
log.error('Failed storing download status: %s', traceback.format_exc())
db.rollback()
return False
finally:
pass #db.close()
return True
@@ -431,31 +420,6 @@ class Release(Plugin):
return []
def forMovie(self, id = None):
db = get_session()
releases_raw = db.query(Relea) \
.options(joinedload_all('info')) \
.options(joinedload_all('files')) \
.filter(Relea.movie_id == id) \
.all()
releases = [r.to_dict({'info': {}, 'files': {}}) for r in releases_raw]
releases = sorted(releases, key = lambda k: k['info'].get('score', 0), reverse = True)
pass #db.close()
return releases
def forMovieView(self, id = None, **kwargs):
releases = self.forMovie(id)
return {
'releases': releases,
'success': True
}
def updateStatus(self, release_id, status = None):
if not status: return False
+1 -4
View File
@@ -591,7 +591,6 @@ class Renamer(Plugin):
break
self.renaming_started = False
pass #db.close()
def getRenameExtras(self, extra_type = '', replacements = None, folder_name = '', file_name = '', destination = '', group = None, current_file = '', remove_multiple = False):
if not group: group = {}
@@ -845,7 +844,7 @@ Remove it if you want it to be renamed (again, or at least let it try again)
try:
db = get_db()
rels = list(db.get_many('release', 'with_status', ['snatched', 'seeding', 'missing']))
rels = list(db.run('release', 'with_status', ['snatched', 'seeding', 'missing']))
if not rels:
#No releases found that need status checking
@@ -1058,8 +1057,6 @@ Remove it if you want it to be renamed (again, or at least let it try again)
if not rls:
log.error('Download ID %s from downloader %s not found in releases', (release_download.get('id'), release_download.get('downloader')))
pass #db.close()
if rls:
rls_dict = rls.to_dict({'info':{}})
+1 -20
View File
@@ -1,11 +1,9 @@
from couchpotato import get_session
from couchpotato.core.event import fireEvent, addEvent
from couchpotato.core.helpers.encoding import toUnicode, simplifyString, ss, sp
from couchpotato.core.helpers.encoding import toUnicode, simplifyString, sp
from couchpotato.core.helpers.variable import getExt, getImdb, tryInt, \
splitString
from couchpotato.core.logger import CPLog
from couchpotato.core.plugins.base import Plugin
from couchpotato.core.settings.model import File
from enzyme.exceptions import NoParserError, ParseError
from guessit import guess_movie_info
from subliminal.videos import Video
@@ -352,7 +350,6 @@ class Scanner(Plugin):
release_download = None
# Determine file types
db = get_session()
processed_movies = {}
while True and not self.shuttingDown():
try:
@@ -439,7 +436,6 @@ class Scanner(Plugin):
else:
log.debug('Found no movies in the folder %s', folder)
pass #db.close()
return processed_movies
def getMetaData(self, group, folder = '', release_download = None):
@@ -594,21 +590,6 @@ class Scanner(Plugin):
except:
pass
# Check if path is already in db
if not imdb_id:
db = get_session()
for cf in files['movie']:
f = db.query(File).filter_by(path = toUnicode(cf)).first()
try:
imdb_id = f.library[0].identifier
log.debug('Found movie via database: %s', cf)
cur_file = cf
break
except:
pass
pass #db.close()
# Search based on identifiers
if not imdb_id:
for identifier in group['identifiers']:
+1 -26
View File
@@ -1,10 +1,8 @@
from couchpotato import get_session
from couchpotato.core.event import addEvent, fireEvent
from couchpotato.core.event import addEvent
from couchpotato.core.helpers.encoding import toUnicode, sp
from couchpotato.core.helpers.variable import splitString
from couchpotato.core.logger import CPLog
from couchpotato.core.plugins.base import Plugin
from couchpotato.core.settings.model import Library, FileType
from couchpotato.environment import Env
import subliminal
import traceback
@@ -19,29 +17,6 @@ class Subtitle(Plugin):
def __init__(self):
addEvent('renamer.before', self.searchSingle)
def searchLibrary(self):
# Get all active and online movies
db = get_session()
library = db.query(Library).all()
for movie in library.movies:
for release in movie.releases:
# get releases and their movie files
if release.get('status') == 'done':
files = []
for file in release.files.filter(FileType.status.has(identifier = 'movie')).all():
files.append(file.path)
# get subtitles for those files
subliminal.list_subtitles(files, cache_dir = Env.get('cache_dir'), multi = True, languages = self.getLanguages(), services = self.services)
pass #db.close()
def searchSingle(self, group):
if self.isDisabled(): return