Nosql
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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': {
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,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,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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user