Browse Source

Nosql

pull/3111/head
Ruud 11 years ago
parent
commit
c3bc9c8591
  1. 6
      couchpotato/core/helpers/request.py
  2. 14
      couchpotato/core/media/_base/media/index.py
  3. 44
      couchpotato/core/media/_base/media/main.py
  4. 10
      couchpotato/core/media/movie/_base/main.py
  5. 10
      couchpotato/core/media/movie/_base/static/list.js
  6. 89
      couchpotato/core/media/movie/_base/static/movie.actions.js
  7. 22
      couchpotato/core/media/movie/_base/static/movie.js
  8. 2
      couchpotato/core/media/movie/_base/static/search.js
  9. 3
      couchpotato/core/media/movie/searcher/main.py
  10. 25
      couchpotato/core/media/movie/suggestion/main.py
  11. 4
      couchpotato/core/notifications/core/static/notification.js
  12. 21
      couchpotato/core/plugins/category/index.py
  13. 62
      couchpotato/core/plugins/category/main.py
  14. 8
      couchpotato/core/plugins/category/static/category.js
  15. 71
      couchpotato/core/plugins/profile/main.py
  16. 20
      couchpotato/core/plugins/profile/static/profile.js
  17. 3
      couchpotato/core/plugins/quality/main.py
  18. 2
      couchpotato/core/plugins/quality/static/quality.js
  19. 36
      couchpotato/core/plugins/release/main.py
  20. 5
      couchpotato/core/plugins/renamer/main.py
  21. 21
      couchpotato/core/plugins/scanner/main.py
  22. 27
      couchpotato/core/plugins/subtitle/main.py
  23. 2
      couchpotato/core/providers/info/_modifier/main.py
  24. 2
      couchpotato/core/providers/nzb/newznab/__init__.py
  25. 2
      couchpotato/core/settings/__init__.py
  26. 2
      couchpotato/runner.py
  27. 2
      couchpotato/static/scripts/page/home.js

6
couchpotato/core/helpers/request.py

@ -9,6 +9,7 @@ def getParams(params):
reg = re.compile('^[a-z0-9_\.]+$') reg = re.compile('^[a-z0-9_\.]+$')
temp = {} temp = {}
for param, value in sorted(params.items()): for param, value in sorted(params.items()):
nest = re.split("([\[\]]+)", param) nest = re.split("([\[\]]+)", param)
@ -44,7 +45,10 @@ def dictToList(params):
new = {} new = {}
for x, value in params.items(): for x, value in params.items():
try: try:
new_value = [dictToList(value[k]) for k in sorted(value.keys(), cmp = natcmp)] convert = lambda text: int(text) if text.isdigit() else text.lower()
alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
sorted_keys = sorted(value.keys(), key = alphanum_key)
new_value = [dictToList(value[k]) for k in sorted_keys]
except: except:
new_value = value new_value = value

14
couchpotato/core/media/_base/media/index.py

@ -92,20 +92,6 @@ from couchpotato.core.helpers.encoding import simplifyString"""
return key.rjust(32, '_').lower() return key.rjust(32, '_').lower()
class YearIndex(TreeBasedIndex):
def __init__(self, *args, **kwargs):
kwargs['key_format'] = 'i'
super(YearIndex, self).__init__(*args, **kwargs)
def make_key(self, key):
return key
def make_key_value(self, data):
if data.get('_t') == 'media' and data.get('year') is not None:
return data['year'], None
class TitleIndex(TreeBasedIndex): class TitleIndex(TreeBasedIndex):
custom_header = """from CodernityDB.tree_index import TreeBasedIndex custom_header = """from CodernityDB.tree_index import TreeBasedIndex

44
couchpotato/core/media/_base/media/main.py

@ -1,13 +1,12 @@
import traceback import traceback
from couchpotato import get_session, tryInt, get_db from couchpotato import tryInt, get_db
from couchpotato.api import addApiView from couchpotato.api import addApiView
from couchpotato.core.event import fireEvent, fireEventAsync, addEvent from couchpotato.core.event import fireEvent, fireEventAsync, addEvent
from couchpotato.core.helpers.encoding import toUnicode from couchpotato.core.helpers.encoding import toUnicode
from couchpotato.core.helpers.variable import splitString, getImdb, getTitle from couchpotato.core.helpers.variable import splitString, getImdb, getTitle
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.media import MediaBase from couchpotato.core.media import MediaBase
from .index import MediaIMDBIndex, MediaStatusIndex, YearIndex, MediaTypeIndex, TitleSearchIndex, TitleIndex, StartsWithIndex from .index import MediaIMDBIndex, MediaStatusIndex, MediaTypeIndex, TitleSearchIndex, TitleIndex, StartsWithIndex
from couchpotato.core.settings.model import Media
from string import ascii_lowercase from string import ascii_lowercase
log = CPLog(__name__) log = CPLog(__name__)
@ -102,12 +101,6 @@ class MediaPlugin(MediaBase):
log.debug('Index already exists') log.debug('Index already exists')
db.edit_index(MediaTypeIndex(db.path, 'media_by_type')) db.edit_index(MediaTypeIndex(db.path, 'media_by_type'))
# Year index
try: db.add_index(YearIndex(db.path, 'media_year'))
except:
log.debug('Index already exists')
db.edit_index(YearIndex(db.path, 'media_year'))
# Title index # Title index
try: db.add_index(TitleIndex(db.path, 'media_title')) try: db.add_index(TitleIndex(db.path, 'media_title'))
except: except:
@ -377,46 +370,45 @@ class MediaPlugin(MediaBase):
def delete(self, media_id, delete_from = None): def delete(self, media_id, delete_from = None):
try: try:
db = get_session() db = get_db()
media = db.query(Media).filter_by(id = media_id).first() media = db.get('id', media_id)
if media: if media:
deleted = False deleted = False
if delete_from == 'all': if delete_from == 'all':
db.delete(media) db.delete(media)
db.commit()
deleted = True deleted = True
else: else:
total_releases = len(media.releases) media_releases = list(db.run('release', 'for_media', media['_id']))
total_releases = len(media_releases)
total_deleted = 0 total_deleted = 0
new_movie_status = None new_media_status = None
for release in media.releases:
for release in media_releases:
if delete_from in ['wanted', 'snatched', 'late']: if delete_from in ['wanted', 'snatched', 'late']:
if release.get('status') != 'done': if release.get('status') != 'done':
db.delete(release) db.delete(release)
total_deleted += 1 total_deleted += 1
new_movie_status = 'done' new_media_status = 'done'
elif delete_from == 'manage': elif delete_from == 'manage':
if release.get('status') == 'done': if release.get('status') == 'done':
db.delete(release) db.delete(release)
total_deleted += 1 total_deleted += 1
new_movie_status = 'active' new_media_status = 'active'
db.commit()
if total_releases == total_deleted: if total_releases == total_deleted:
db.delete(media) db.delete(media)
db.commit()
deleted = True deleted = True
elif new_movie_status: elif new_media_status:
media.profile_id = None media['status'] = new_media_status
media['status'] = new_status db.update(media)
db.commit()
else: else:
fireEvent('media.restatus', media.id, single = True) fireEvent('media.restatus', media.get('_id'), single = True)
if deleted: if deleted:
fireEvent('notify.frontend', type = 'movie.deleted', data = media.to_dict()) fireEvent('notify.frontend', type = 'media.deleted', data = media)
except: except:
log.error('Failed deleting media: %s', traceback.format_exc()) log.error('Failed deleting media: %s', traceback.format_exc())
@ -453,7 +445,7 @@ class MediaPlugin(MediaBase):
move_to_wanted = True move_to_wanted = True
profile = db.get('id', m['profile_id']) profile = db.get('id', m['profile_id'])
media_releases = db.get_many('release', m['_id']) media_releases = db.run('release', 'for_media', m['_id'])
for q_identifier in profile['qualities']: for q_identifier in profile['qualities']:
index = profile['qualities'].index(q_identifier) index = profile['qualities'].index(q_identifier)

10
couchpotato/core/media/movie/_base/main.py

@ -94,7 +94,7 @@ class MovieBase(MovieTypeBase):
'identifier': params.get('identifier'), 'identifier': params.get('identifier'),
'status': status if status else 'active', 'status': status if status else 'active',
'profile_id': params.get('profile_id', default_profile.get('_id')), 'profile_id': params.get('profile_id', default_profile.get('_id')),
'category_id': tryInt(cat_id) if cat_id is not None and tryInt(cat_id) > 0 else None, 'category_id': cat_id if cat_id is not None and len(cat_id) > 0 else None,
} }
new = False new = False
@ -135,7 +135,7 @@ class MovieBase(MovieTypeBase):
fireEvent('release.delete', release['_id'], single = True) fireEvent('release.delete', release['_id'], single = True)
m['profile_id'] = params.get('profile_id', default_profile.get('id')) m['profile_id'] = params.get('profile_id', default_profile.get('id'))
m['category_id'] = tryInt(cat_id) if cat_id is not None and tryInt(cat_id) > 0 else (m.get('category_id') or None) m['category_id'] = cat_id if cat_id is not None and len(cat_id) > 0 else (m.get('category_id') or None)
else: else:
log.debug('Movie already exists, not updating: %s', params) log.debug('Movie already exists, not updating: %s', params)
added = False added = False
@ -198,7 +198,7 @@ class MovieBase(MovieTypeBase):
cat_id = kwargs.get('category_id') cat_id = kwargs.get('category_id')
if cat_id is not None: if cat_id is not None:
m['category_id'] = tryInt(cat_id) if tryInt(cat_id) > 0 else None m['category_id'] = cat_id if len(cat_id) > 0 else None
# Remove releases # Remove releases
for rel in db.run('release', 'for_media', m['_id']): for rel in db.run('release', 'for_media', m['_id']):
@ -209,12 +209,12 @@ class MovieBase(MovieTypeBase):
if kwargs.get('default_title'): if kwargs.get('default_title'):
m['title'] = kwargs.get('default_title') m['title'] = kwargs.get('default_title')
print m
db.update(m) db.update(m)
fireEvent('media.restatus', m['_id']) fireEvent('media.restatus', m['_id'])
m = db.get('id', media_id)
movie_dict = db.run('media', 'to_dict', m['_id']) movie_dict = db.run('media', 'to_dict', m['_id'])
fireEventAsync('movie.searcher.single', movie_dict, on_complete = self.createNotifyFront(media_id)) fireEventAsync('movie.searcher.single', movie_dict, on_complete = self.createNotifyFront(media_id))

10
couchpotato/core/media/movie/_base/static/list.js

@ -63,7 +63,7 @@ var MovieList = new Class({
self.movies.each(function(movie){ self.movies.each(function(movie){
if(movie.get('_id') == notification.data._id){ if(movie.get('_id') == notification.data._id){
movie.destroy(); movie.destroy();
delete self.movies_added[notification.data.id]; delete self.movies_added[notification.data._id];
self.setCounter(self.counter_count-1); self.setCounter(self.counter_count-1);
self.total_movies--; self.total_movies--;
} }
@ -77,7 +77,7 @@ var MovieList = new Class({
var self = this; var self = this;
self.fireEvent('movieAdded', notification); self.fireEvent('movieAdded', notification);
if(self.options.add_new && !self.movies_added[notification.data.id] && notification.data.status.identifier == self.options.status){ if(self.options.add_new && !self.movies_added[notification.data._id] && notification.data.status == self.options.status){
window.scroll(0,0); window.scroll(0,0);
self.createMovie(notification.data, 'top'); self.createMovie(notification.data, 'top');
self.setCounter(self.counter_count+1); self.setCounter(self.counter_count+1);
@ -180,7 +180,7 @@ var MovieList = new Class({
m.fireEvent('injected'); m.fireEvent('injected');
self.movies.include(m) self.movies.include(m)
self.movies_added[movie.id] = true; self.movies_added[movie._id] = true;
}, },
createNavigation: function(){ createNavigation: function(){
@ -259,8 +259,8 @@ var MovieList = new Class({
self.mass_edit_select_class = new Form.Check(self.mass_edit_select); self.mass_edit_select_class = new Form.Check(self.mass_edit_select);
Quality.getActiveProfiles().each(function(profile){ Quality.getActiveProfiles().each(function(profile){
new Element('option', { new Element('option', {
'value': profile.id ? profile.id : profile.data.id, 'value': profile.get('_id'),
'text': profile.label ? profile.label : profile.data.label 'text': profile.get('label')
}).inject(self.mass_edit_quality) }).inject(self.mass_edit_quality)
}); });

89
couchpotato/core/media/movie/_base/static/movie.actions.js

@ -127,7 +127,7 @@ MA.Release = new Class({
self.showHelper(); self.showHelper();
App.on('movie.searcher.ended', function(notification){ App.on('movie.searcher.ended', function(notification){
if(self.movie.data.id != notification.data.id) return; if(self.movie.data._id != notification.data._id) return;
self.releases = null; self.releases = null;
if(self.options_container){ if(self.options_container){
@ -143,30 +143,7 @@ MA.Release = new Class({
if(e) if(e)
(e).preventDefault(); (e).preventDefault();
if(self.releases)
self.createReleases(); self.createReleases();
else {
self.movie.busy(true);
Api.request('release.for_movie', {
'data': {
'id': self.movie.data.id
},
'onComplete': function(json){
self.movie.busy(false, 1);
if(json && json.releases){
self.releases = json.releases;
self.createReleases();
}
else
alert('Something went wrong, check the logs.');
}
});
}
}, },
@ -189,9 +166,9 @@ MA.Release = new Class({
new Element('span.provider', {'text': 'Provider'}) new Element('span.provider', {'text': 'Provider'})
).inject(self.release_container) ).inject(self.release_container)
self.releases.each(function(release){ self.movie.data.releases.each(function(release){
var quality = Quality.getProfile(release.quality_id) || {}, var quality = Quality.getQuality(release.quality) || {},
info = release.info, info = release.info,
provider = self.get(release, 'provider') + (release.info['provider_extra'] ? self.get(release, 'provider_extra') : ''); provider = self.get(release, 'provider') + (release.info['provider_extra'] ? self.get(release, 'provider_extra') : '');
@ -209,12 +186,12 @@ MA.Release = new Class({
// Create release // Create release
var item = new Element('div', { var item = new Element('div', {
'class': 'item '+status.identifier, 'class': 'item '+release.status,
'id': 'release_'+release.id 'id': 'release_'+release._id
}).adopt( }).adopt(
new Element('span.name', {'text': release_name, 'title': release_name}), new Element('span.name', {'text': release_name, 'title': release_name}),
new Element('span.status', {'text': status.identifier, 'class': 'release_status '+release.status}), new Element('span.status', {'text': release.status, 'class': 'release_status '+release.status}),
new Element('span.quality', {'text': quality.get('label') || 'n/a'}), new Element('span.quality', {'text': quality.label || 'n/a'}),
new Element('span.size', {'text': release.info['size'] ? Math.floor(self.get(release, 'size')) : 'n/a'}), new Element('span.size', {'text': release.info['size'] ? Math.floor(self.get(release, 'size')) : 'n/a'}),
new Element('span.age', {'text': self.get(release, 'age')}), new Element('span.age', {'text': self.get(release, 'age')}),
new Element('span.score', {'text': self.get(release, 'score')}), new Element('span.score', {'text': self.get(release, 'score')}),
@ -243,32 +220,32 @@ MA.Release = new Class({
).inject(self.release_container); ).inject(self.release_container);
release['el'] = item; release['el'] = item;
if(status.identifier == 'ignored' || status.identifier == 'failed' || status.identifier == 'snatched'){ if(release.status == 'ignored' || release.status == 'failed' || release.status == 'snatched'){
if(!self.last_release || (self.last_release && self.last_release.status.identifier != 'snatched' && status.identifier == 'snatched')) if(!self.last_release || (self.last_release && self.last_release.status != 'snatched' && release.status == 'snatched'))
self.last_release = release; self.last_release = release;
} }
else if(!self.next_release && status.identifier == 'available'){ else if(!self.next_release && release.status == 'available'){
self.next_release = release; self.next_release = release;
} }
var update_handle = function(notification) { var update_handle = function(notification) {
if(notification.data.id != release.id) return; if(notification.data._id != release._id) return;
var q = self.movie.quality.getElement('.q_id' + release.quality_id), var q = self.movie.quality.getElement('.q_' + release.quality),
new_status = notification.data.status; new_status = notification.data.status;
release.el.set('class', 'item ' + new_status); release.el.set('class', 'item ' + new_status);
var status_el = release.el.getElement('.release_status'); var status_el = release.el.getElement('.release_status');
status_el.set('class', 'release_status ' + new_status); status_el.set('class', 'release_status ' + new_status);
status_el.set('text', new_status.identifier); status_el.set('text', new_status);
if(!q && (new_status == 'snatched' || new_status == 'seeding' || new_status == 'done')) if(!q && (new_status == 'snatched' || new_status == 'seeding' || new_status == 'done'))
var q = self.addQuality(release.quality_id); var q = self.addQuality(release.quality_id);
if(q && !q.hasClass(new_status)) { if(q && !q.hasClass(new_status)) {
q.removeClass(release.status).addClass(new_status); q.removeClass(release.status).addClass(new_status);
q.set('title', q.get('title').replace(status, new_status)); q.set('title', q.get('title').replace(release.status, new_status));
} }
} }
@ -277,12 +254,12 @@ MA.Release = new Class({
}); });
if(self.last_release) if(self.last_release)
self.release_container.getElements('#release_'+self.last_release.id).addClass('last_release'); self.release_container.getElements('#release_'+self.last_release._id).addClass('last_release');
if(self.next_release) if(self.next_release)
self.release_container.getElements('#release_'+self.next_release.id).addClass('next_release'); self.release_container.getElements('#release_'+self.next_release._id).addClass('next_release');
if(self.next_release || (self.last_release && ['ignored', 'failed'].indexOf(self.last_release.status.identifier) === false)){ if(self.next_release || (self.last_release && ['ignored', 'failed'].indexOf(self.last_release.status) === false)){
self.trynext_container = new Element('div.buttons.try_container').inject(self.release_container, 'top'); self.trynext_container = new Element('div.buttons.try_container').inject(self.release_container, 'top');
@ -385,7 +362,7 @@ MA.Release = new Class({
download: function(release){ download: function(release){
var self = this; var self = this;
var release_el = self.release_container.getElement('#release_'+release.id), var release_el = self.release_container.getElement('#release_'+release._id),
icon = release_el.getElement('.download.icon2'); icon = release_el.getElement('.download.icon2');
if(icon) if(icon)
@ -393,7 +370,7 @@ MA.Release = new Class({
Api.request('release.manual_download', { Api.request('release.manual_download', {
'data': { 'data': {
'id': release.id 'id': release._id
}, },
'onComplete': function(json){ 'onComplete': function(json){
if(icon) if(icon)
@ -416,7 +393,7 @@ MA.Release = new Class({
Api.request('release.ignore', { Api.request('release.ignore', {
'data': { 'data': {
'id': release.id 'id': release._id
}, },
}) })
@ -623,14 +600,14 @@ MA.Edit = new Class({
self.category_select.show(); self.category_select.show();
categories.each(function(category){ categories.each(function(category){
var category_id = category.data.id; var category_id = category.data._id;
new Element('option', { new Element('option', {
'value': category_id, 'value': category_id,
'text': category.data.label 'text': category.data.label
}).inject(self.category_select); }).inject(self.category_select);
if(self.movie.category && self.movie.category.data && self.movie.category.data.id == category_id) if(self.movie.category && self.movie.category.data && self.movie.category.data._id == category_id)
self.category_select.set('value', category_id); self.category_select.set('value', category_id);
}); });
@ -859,29 +836,7 @@ MA.Files = new Class({
var self = this; var self = this;
(e).preventDefault(); (e).preventDefault();
if(self.releases)
self.showFiles(); self.showFiles();
else {
self.movie.busy(true);
Api.request('release.for_movie', {
'data': {
'id': self.movie.data.id
},
'onComplete': function(json){
self.movie.busy(false, 1);
if(json && json.releases){
self.releases = json.releases;
self.showFiles();
}
else
alert('Something went wrong, check the logs.');
}
});
}
}, },

22
couchpotato/core/media/movie/_base/static/movie.js

@ -27,7 +27,7 @@ var Movie = new Class({
// Do refresh with new data // Do refresh with new data
self.global_events['movie.update'] = function(notification){ self.global_events['movie.update'] = function(notification){
if(self.data.id != notification.data.id) return; if(self.data._id != notification.data._id) return;
self.busy(false); self.busy(false);
self.removeView(); self.removeView();
@ -38,7 +38,7 @@ var Movie = new Class({
// Add spinner on load / search // Add spinner on load / search
['media.busy', 'movie.searcher.started'].each(function(listener){ ['media.busy', 'movie.searcher.started'].each(function(listener){
self.global_events[listener] = function(notification){ self.global_events[listener] = function(notification){
if(notification.data && (self.data.id == notification.data.id || (typeOf(notification.data.id) == 'array' && notification.data.id.indexOf(self.data.id) > -1))) if(notification.data && (self.data._id == notification.data._id || (typeOf(notification.data._id) == 'array' && notification.data._id.indexOf(self.data._id) > -1)))
self.busy(true); self.busy(true);
} }
App.on(listener, self.global_events[listener]); App.on(listener, self.global_events[listener]);
@ -46,7 +46,7 @@ var Movie = new Class({
// Remove spinner // Remove spinner
self.global_events['movie.searcher.ended'] = function(notification){ self.global_events['movie.searcher.ended'] = function(notification){
if(notification.data && self.data.id == notification.data.id) if(notification.data && self.data._id == notification.data._id)
self.busy(false) self.busy(false)
} }
App.on('movie.searcher.ended', self.global_events['movie.searcher.ended']); App.on('movie.searcher.ended', self.global_events['movie.searcher.ended']);
@ -54,12 +54,12 @@ var Movie = new Class({
// Reload when releases have updated // Reload when releases have updated
self.global_events['release.update_status'] = function(notification){ self.global_events['release.update_status'] = function(notification){
var data = notification.data var data = notification.data
if(data && self.data.id == data.movie_id){ if(data && self.data._id == data.movie_id){
if(!self.data.releases) if(!self.data.releases)
self.data.releases = []; self.data.releases = [];
self.data.releases.push({'quality_identifier': data.quality_identifier, 'status': data.status}); self.data.releases.push({'quality': data.quality, 'status': data.status});
self.updateReleases(); self.updateReleases();
} }
} }
@ -197,7 +197,7 @@ var Movie = new Class({
if(self.profile.data) if(self.profile.data)
self.profile.getTypes().each(function(type){ self.profile.getTypes().each(function(type){
var q = self.addQuality(type.quality_identifier || type.get('quality_identifier')); var q = self.addQuality(type.get('quality'));
if((type.finish == true || type.get('finish')) && !q.hasClass('finish')){ if((type.finish == true || type.get('finish')) && !q.hasClass('finish')){
q.addClass('finish'); q.addClass('finish');
q.set('title', q.get('title') + ' Will finish searching for this movie if this quality is found.') q.set('title', q.get('title') + ' Will finish searching for this movie if this quality is found.')
@ -222,11 +222,11 @@ var Movie = new Class({
self.data.releases.each(function(release){ self.data.releases.each(function(release){
var q = self.quality.getElement('.q_id'+ release.quality_id), var q = self.quality.getElement('.q_'+ release.quality),
status = release.status; status = release.status;
if(!q && (status == 'snatched' || status == 'seeding' || status == 'done')) if(!q && (status == 'snatched' || status == 'seeding' || status == 'done'))
var q = self.addQuality(release.quality_identifier) var q = self.addQuality(release.quality)
if (q && !q.hasClass(status)){ if (q && !q.hasClass(status)){
q.addClass(status); q.addClass(status);
@ -236,13 +236,13 @@ var Movie = new Class({
}); });
}, },
addQuality: function(quality_identifier){ addQuality: function(quality){
var self = this; var self = this;
var q = Quality.getQuality(quality_identifier); var q = Quality.getQuality(quality);
return new Element('span', { return new Element('span', {
'text': q.label, 'text': q.label,
'class': 'q_'+q.identifier + ' q_id' + q.id, 'class': 'q_'+q.identifier,
'title': '' 'title': ''
}).inject(self.quality); }).inject(self.quality);

2
couchpotato/core/media/movie/_base/static/search.js

@ -184,7 +184,7 @@ Block.Search.MovieItem = new Class({
self.category_select.show(); self.category_select.show();
categories.each(function(category){ categories.each(function(category){
new Element('option', { new Element('option', {
'value': category.data.id, 'value': category.data._id,
'text': category.data.label 'text': category.data.label
}).inject(self.category_select); }).inject(self.category_select);
}); });

3
couchpotato/core/media/movie/searcher/main.py

@ -139,7 +139,7 @@ class MovieSearcher(SearcherBase, MovieTypeBase):
profile = db.get('id', movie['profile_id']) profile = db.get('id', movie['profile_id'])
quality_order = fireEvent('quality.order', single = True) quality_order = fireEvent('quality.order', single = True)
media_releases = db.get_many('release', movie['_id']) media_releases = db.run('release', 'for_media', movie['_id'])
ret = False ret = False
@ -202,7 +202,6 @@ class MovieSearcher(SearcherBase, MovieTypeBase):
fireEvent('notify.frontend', type = 'movie.searcher.ended', data = {'id': movie['_id']}) fireEvent('notify.frontend', type = 'movie.searcher.ended', data = {'id': movie['_id']})
pass #db.close()
return ret return ret
def correctRelease(self, nzb = None, media = None, quality = None, **kwargs): def correctRelease(self, nzb = None, media = None, quality = None, **kwargs):

25
couchpotato/core/media/movie/suggestion/main.py

@ -1,12 +1,9 @@
from couchpotato import get_session from couchpotato import get_db
from couchpotato.api import addApiView from couchpotato.api import addApiView
from couchpotato.core.event import fireEvent from couchpotato.core.event import fireEvent
from couchpotato.core.helpers.variable import splitString, removeDuplicate from couchpotato.core.helpers.variable import splitString, removeDuplicate
from couchpotato.core.plugins.base import Plugin from couchpotato.core.plugins.base import Plugin
from couchpotato.core.settings.model import Media, Library
from couchpotato.environment import Env from couchpotato.environment import Env
from sqlalchemy.orm import joinedload_all
from sqlalchemy.sql.expression import or_
class Suggestion(Plugin): class Suggestion(Plugin):
@ -28,12 +25,9 @@ class Suggestion(Plugin):
else: else:
if not movies or len(movies) == 0: if not movies or len(movies) == 0:
db = get_session() db = get_db()
active_movies = db.query(Media) \ active_movies = db.run('media', 'with_status', ['active', 'done'])
.options(joinedload_all('library')) \ movies = [x['identifier'] for x in active_movies]
.filter(or_(*[Media.status.has(identifier = s) for s in ['active', 'done']])).all()
movies = [x.library.identifier for x in active_movies]
pass #db.close()
if not ignored or len(ignored) == 0: if not ignored or len(ignored) == 0:
ignored = splitString(Env.prop('suggest_ignore', default = '')) ignored = splitString(Env.prop('suggest_ignore', default = ''))
@ -88,15 +82,10 @@ class Suggestion(Plugin):
# Get new results and add them # Get new results and add them
if len(new_suggestions) - 1 < limit: if len(new_suggestions) - 1 < limit:
db = get_db()
db = get_session() active_movies = db.run('media', 'with_status', ['active', 'done'])
active_movies = db.query(Media) \ movies = [x['identifier'] for x in active_movies]
.join(Library) \
.with_entities(Library.identifier) \
.filter(Media.status_id.in_([active_status.get('id'), done_status.get('id')])).all()
movies = [x[0] for x in active_movies]
movies.extend(seen) movies.extend(seen)
pass #db.close()
ignored.extend([x.get('imdb') for x in cached_suggestion]) ignored.extend([x.get('imdb') for x in cached_suggestion])
suggestions = fireEvent('movie.suggest', movies = movies, ignore = removeDuplicate(ignored), single = True) suggestions = fireEvent('movie.suggest', movies = movies, ignore = removeDuplicate(ignored), single = True)

4
couchpotato/core/notifications/core/static/notification.js

@ -77,7 +77,7 @@ var NotificationBase = new Class({
var ids = [] var ids = []
rn.each(function(n){ rn.each(function(n){
ids.include(n.id) ids.include(n._id)
}) })
} }
@ -187,7 +187,7 @@ var NotificationBase = new Class({
new Element('a.close.icon2', { new Element('a.close.icon2', {
'events': { 'events': {
'click': function(){ 'click': function(){
self.markAsRead([data.id]); self.markAsRead([data._id]);
hide_message(); hide_message();
} }
} }

21
couchpotato/core/plugins/category/index.py

@ -1,16 +1,29 @@
from hashlib import md5
from CodernityDB.tree_index import TreeBasedIndex from CodernityDB.tree_index import TreeBasedIndex
class CategoryIndex(TreeBasedIndex): class CategoryIndex(TreeBasedIndex):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
kwargs['key_format'] = '32s' kwargs['key_format'] = 'i'
super(CategoryIndex, self).__init__(*args, **kwargs) super(CategoryIndex, self).__init__(*args, **kwargs)
def make_key(self, key): def make_key(self, key):
return md5(key).hexdigest() return key
def make_key_value(self, data): def make_key_value(self, data):
if data.get('_t') == 'category': 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

62
couchpotato/core/plugins/category/main.py

@ -1,12 +1,11 @@
import traceback import traceback
from couchpotato import get_session, get_db from couchpotato import get_db
from couchpotato.api import addApiView from couchpotato.api import addApiView
from couchpotato.core.event import addEvent from couchpotato.core.event import addEvent
from couchpotato.core.helpers.encoding import toUnicode from couchpotato.core.helpers.encoding import toUnicode
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.plugins.base import Plugin from couchpotato.core.plugins.base import Plugin
from .index import CategoryIndex from .index import CategoryIndex, CategoryMediaIndex
from couchpotato.core.settings.model import Media, Category
log = CPLog(__name__) log = CPLog(__name__)
@ -32,18 +31,25 @@ class CategoryPlugin(Plugin):
db = get_db() db = get_db()
# Release media_id index # Category index
try: try:
db.add_index(CategoryIndex(db.path, 'category')) db.add_index(CategoryIndex(db.path, 'category'))
except: except:
log.debug('Index already exists') log.debug('Index already exists')
db.edit_index(CategoryIndex(db.path, 'category')) 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): def allView(self, **kwargs):
return { return {
'success': True, 'success': True,
'list': self.all() 'categories': self.all()
} }
def all(self): def all(self):
@ -51,11 +57,7 @@ class CategoryPlugin(Plugin):
db = get_db() db = get_db()
categories = db.all('category', with_doc = True) categories = db.all('category', with_doc = True)
temp = [] return [x['doc'] for x in categories]
for category in categories:
temp.append(category['doc'])
return temp
def save(self, **kwargs): def save(self, **kwargs):
@ -63,7 +65,8 @@ class CategoryPlugin(Plugin):
db = get_db() db = get_db()
category = { category = {
'order': kwargs.get('order', 0), '_t': 'category',
'order': kwargs.get('order', 999),
'label': toUnicode(kwargs.get('label', '')), 'label': toUnicode(kwargs.get('label', '')),
'ignored': toUnicode(kwargs.get('ignored', '')), 'ignored': toUnicode(kwargs.get('ignored', '')),
'preferred': toUnicode(kwargs.get('preferred', '')), 'preferred': toUnicode(kwargs.get('preferred', '')),
@ -96,26 +99,21 @@ class CategoryPlugin(Plugin):
def saveOrder(self, **kwargs): def saveOrder(self, **kwargs):
try: try:
db = get_session() db = get_db()
order = 0 order = 0
for category_id in kwargs.get('ids', []): for category_id in kwargs.get('ids', []):
c = db.query(Category).filter_by(id = category_id).first() c = db.get('id', category_id)
c.order = order c['order'] = order
db.update(c)
order += 1 order += 1
db.commit()
pass #db.close()
return { return {
'success': True 'success': True
} }
except: except:
log.error('Failed: %s', traceback.format_exc()) log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
pass #db.close()
return { return {
'success': False 'success': False
@ -124,32 +122,27 @@ class CategoryPlugin(Plugin):
def delete(self, id = None, **kwargs): def delete(self, id = None, **kwargs):
try: try:
db = get_session() db = get_db()
success = False success = False
message = '' message = ''
try: try:
c = db.query(Category).filter_by(id = id).first() c = db.get('id', id)
db.delete(c) db.delete(c)
db.commit()
# Force defaults on all empty category movies # Force defaults on all empty category movies
self.removeFromMovie(id) self.removeFromMovie(id)
success = True success = True
except Exception as e: except:
message = log.error('Failed deleting category: %s', e) message = log.error('Failed deleting category: %s', traceback.format_exc())
pass #db.close()
return { return {
'success': success, 'success': success,
'message': message 'message': message
} }
except: except:
log.error('Failed: %s', traceback.format_exc()) log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
pass #db.close()
return { return {
'success': False 'success': False
@ -158,15 +151,12 @@ class CategoryPlugin(Plugin):
def removeFromMovie(self, category_id): def removeFromMovie(self, category_id):
try: try:
db = get_session() db = get_db()
movies = db.query(Media).filter(Media.category_id == category_id).all() movies = [x['doc'] for x in db.get_many('category_media', category_id, with_doc = True)]
if len(movies) > 0: if len(movies) > 0:
for movie in movies: for movie in movies:
movie.category_id = None movie['category_id'] = None
db.commit() db.update(movie)
except: except:
log.error('Failed: %s', traceback.format_exc()) log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
pass #db.close()

8
couchpotato/core/plugins/category/static/category.js

@ -86,7 +86,7 @@ var CategoryListBase = new Class({
getCategory: function(id){ getCategory: function(id){
return this.categories.filter(function(category){ return this.categories.filter(function(category){
return category.data.id == id return category.data._id == id
}).pick() }).pick()
}, },
@ -121,7 +121,7 @@ var CategoryListBase = new Class({
).inject(self.content) ).inject(self.content)
Array.each(self.categories, function(category){ 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', { new Element('span.category_label', {
'text': category.data.label 'text': category.data.label
}), }),
@ -258,7 +258,7 @@ var Category = new Class({
var self = this; var self = this;
var data = { var data = {
'id' : self.data.id, 'id' : self.data._id,
'label' : self.el.getElement('.category_label input').get('value'), 'label' : self.el.getElement('.category_label input').get('value'),
'required' : self.el.getElement('.category_required input').get('value'), 'required' : self.el.getElement('.category_required input').get('value'),
'preferred' : self.el.getElement('.category_preferred input').get('value'), 'preferred' : self.el.getElement('.category_preferred input').get('value'),
@ -286,7 +286,7 @@ var Category = new Class({
(e).preventDefault(); (e).preventDefault();
Api.request('category.delete', { Api.request('category.delete', {
'data': { 'data': {
'id': self.data.id 'id': self.data._id
}, },
'useSpinner': true, 'useSpinner': true,
'spinnerOptions': { 'spinnerOptions': {

71
couchpotato/core/plugins/profile/main.py

@ -1,8 +1,9 @@
import traceback import traceback
from couchpotato import get_session, get_db from couchpotato import get_session, get_db, tryInt
from couchpotato.api import addApiView from couchpotato.api import addApiView
from couchpotato.core.event import addEvent from couchpotato.core.event import addEvent
from couchpotato.core.helpers.encoding import toUnicode from couchpotato.core.helpers.encoding import toUnicode
from couchpotato.core.helpers.variable import splitString
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.plugins.base import Plugin from couchpotato.core.plugins.base import Plugin
from .index import ProfileIndex from .index import ProfileIndex
@ -78,45 +79,41 @@ class ProfilePlugin(Plugin):
def save(self, **kwargs): def save(self, **kwargs):
try: 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 profile = {
[db.delete(t) for t in p.types] 'label': toUnicode(kwargs.get('label')),
'order': tryInt(kwargs.get('order', 999)),
'core': kwargs.get('core', False),
'qualities': [],
'wait_for': [],
'finish': []
}
# Update types
order = 0 order = 0
for type in kwargs.get('types', []): for type in kwargs.get('types', []):
t = ProfileType( profile['qualities'].append(type.get('quality'))
order = order, profile['wait_for'].append(tryInt(type.get('wait_for')))
finish = type.get('finish') if order > 0 else 1, profile['finish'].append((tryInt(type.get('finish')) == 1) if order > 0 else True)
wait_for = kwargs.get('wait_for'),
quality_id = type.get('quality_id')
)
p.types.append(t)
order += 1 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 { return {
'success': True, 'success': True,
'profile': profile_dict 'profile': p
} }
except: except:
log.error('Failed: %s', traceback.format_exc()) log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
pass #db.close()
return { return {
'success': False 'success': False
@ -129,26 +126,23 @@ class ProfilePlugin(Plugin):
def saveOrder(self, **kwargs): def saveOrder(self, **kwargs):
try: try:
db = get_session() db = get_db()
order = 0 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
order += 1 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)
db.commit() order += 1
return { return {
'success': True 'success': True
} }
except: except:
log.error('Failed: %s', traceback.format_exc()) log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
pass #db.close()
return { return {
'success': False 'success': False
@ -180,9 +174,6 @@ class ProfilePlugin(Plugin):
} }
except: except:
log.error('Failed: %s', traceback.format_exc()) log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
pass #db.close()
return { return {
'success': False 'success': False

20
couchpotato/core/plugins/profile/static/profile.js

@ -57,14 +57,16 @@ var Profile = new Class({
self.makeSortable(); self.makeSortable();
// Combine qualities and properties into types // Combine qualities and properties into types
if(data.qualities){
data.types = []; data.types = [];
data.qualities.each(function(quality, nr){ data.qualities.each(function(quality, nr){
data.types.include({ data.types.include({
'quality_identifier': quality, 'quality': quality,
'finish': data.finish[nr] || false, 'finish': data.finish[nr] || false,
'wait_for': data.wait_for[nr] || 0 'wait_for': data.wait_for[nr] || 0
}) })
}); });
}
if(data.types) if(data.types)
data.types.each(self.addType.bind(self)); data.types.each(self.addType.bind(self));
@ -112,16 +114,16 @@ var Profile = new Class({
var self = this; var self = this;
var data = { var data = {
'id' : self.data.id, 'id' : self.data._id,
'label' : self.el.getElement('.quality_label input').get('value'), 'label' : self.el.getElement('.quality_label input').get('value'),
'wait_for' : self.el.getElement('.wait_for input').get('value'), 'wait_for' : self.el.getElement('.wait_for input').get('value'),
'types': [] 'types': []
} }
Array.each(self.type_container.getElements('.type'), function(type){ 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({ data.types.include({
'quality_identifier': type.getElement('select').get('value'), 'quality': type.getElement('select').get('value'),
'finish': +type.getElement('input[type=checkbox]').checked, 'finish': +type.getElement('input[type=checkbox]').checked,
'wait_for': 0 'wait_for': 0
}); });
@ -156,7 +158,7 @@ var Profile = new Class({
var self = this; var self = this;
return self.types.filter(function(type){ 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(); (e).preventDefault();
Api.request('profile.delete', { Api.request('profile.delete', {
'data': { 'data': {
'id': self.data.id 'id': self.data._id
}, },
'useSpinner': true, 'useSpinner': true,
'spinnerOptions': { 'spinnerOptions': {
@ -275,7 +277,7 @@ Profile.Type = new Class({
new Element('span.handle') 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); self.finish_class = new Form.Check(self.finish);
@ -302,7 +304,7 @@ Profile.Type = new Class({
}).inject(self.qualities) }).inject(self.qualities)
}); });
self.qualities.set('value', self.data.quality_identifier); self.qualities.set('value', self.data.quality);
return self.qualities; return self.qualities;
@ -312,7 +314,7 @@ Profile.Type = new Class({
var self = this; var self = this;
return { return {
'quality_identifier': self.qualities.get('value'), 'quality': self.qualities.get('value'),
'finish': +self.finish.checked, 'finish': +self.finish.checked,
'wait_for': 0 'wait_for': 0
} }

3
couchpotato/core/plugins/quality/main.py

@ -138,9 +138,6 @@ class QualityPlugin(Plugin):
} }
except: except:
log.error('Failed: %s', traceback.format_exc()) log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
pass #db.close()
return { return {
'success': False 'success': False

2
couchpotato/core/plugins/quality/static/quality.js

@ -117,7 +117,7 @@ var QualityBase = new Class({
Array.each(self.profiles, function(profile){ Array.each(self.profiles, function(profile){
var check; 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]', { check = new Element('input.inlay[type=checkbox]', {
'checked': !profile.data.hide, 'checked': !profile.data.hide,
'events': { 'events': {

36
couchpotato/core/plugins/release/main.py

@ -42,18 +42,11 @@ class Release(Plugin):
'id': {'type': 'id', 'desc': 'ID of the release object in release-table'} '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.add', self.add)
addEvent('release.download', self.download) addEvent('release.download', self.download)
addEvent('release.try_download_result', self.tryDownloadResult) addEvent('release.try_download_result', self.tryDownloadResult)
addEvent('release.create_from_search', self.createFromSearch) addEvent('release.create_from_search', self.createFromSearch)
addEvent('release.for_movie', self.forMovie)
addEvent('release.delete', self.delete) addEvent('release.delete', self.delete)
addEvent('release.clean', self.clean) addEvent('release.clean', self.clean)
addEvent('release.update_status', self.updateStatus) addEvent('release.update_status', self.updateStatus)
@ -266,7 +259,6 @@ class Release(Plugin):
if success: if success:
fireEvent('notify.frontend', type = 'release.manual_download', data = True, message = 'Successfully snatched "%s"' % item['name']) fireEvent('notify.frontend', type = 'release.manual_download', data = True, message = 'Successfully snatched "%s"' % item['name'])
pass #db.close()
return { return {
'success': success == True 'success': success == True
} }
@ -352,10 +344,7 @@ class Release(Plugin):
except: except:
log.error('Failed storing download status: %s', traceback.format_exc()) log.error('Failed storing download status: %s', traceback.format_exc())
db.rollback()
return False return False
finally:
pass #db.close()
return True return True
@ -431,31 +420,6 @@ class Release(Plugin):
return [] 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): def updateStatus(self, release_id, status = None):
if not status: return False if not status: return False

5
couchpotato/core/plugins/renamer/main.py

@ -591,7 +591,6 @@ class Renamer(Plugin):
break break
self.renaming_started = False 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): def getRenameExtras(self, extra_type = '', replacements = None, folder_name = '', file_name = '', destination = '', group = None, current_file = '', remove_multiple = False):
if not group: group = {} 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: try:
db = get_db() 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: if not rels:
#No releases found that need status checking #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: if not rls:
log.error('Download ID %s from downloader %s not found in releases', (release_download.get('id'), release_download.get('downloader'))) 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: if rls:
rls_dict = rls.to_dict({'info':{}}) rls_dict = rls.to_dict({'info':{}})

21
couchpotato/core/plugins/scanner/main.py

@ -1,11 +1,9 @@
from couchpotato import get_session
from couchpotato.core.event import fireEvent, addEvent 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, \ from couchpotato.core.helpers.variable import getExt, getImdb, tryInt, \
splitString splitString
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.plugins.base import Plugin from couchpotato.core.plugins.base import Plugin
from couchpotato.core.settings.model import File
from enzyme.exceptions import NoParserError, ParseError from enzyme.exceptions import NoParserError, ParseError
from guessit import guess_movie_info from guessit import guess_movie_info
from subliminal.videos import Video from subliminal.videos import Video
@ -352,7 +350,6 @@ class Scanner(Plugin):
release_download = None release_download = None
# Determine file types # Determine file types
db = get_session()
processed_movies = {} processed_movies = {}
while True and not self.shuttingDown(): while True and not self.shuttingDown():
try: try:
@ -439,7 +436,6 @@ class Scanner(Plugin):
else: else:
log.debug('Found no movies in the folder %s', folder) log.debug('Found no movies in the folder %s', folder)
pass #db.close()
return processed_movies return processed_movies
def getMetaData(self, group, folder = '', release_download = None): def getMetaData(self, group, folder = '', release_download = None):
@ -594,21 +590,6 @@ class Scanner(Plugin):
except: except:
pass 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 # Search based on identifiers
if not imdb_id: if not imdb_id:
for identifier in group['identifiers']: for identifier in group['identifiers']:

27
couchpotato/core/plugins/subtitle/main.py

@ -1,10 +1,8 @@
from couchpotato import get_session from couchpotato.core.event import addEvent
from couchpotato.core.event import addEvent, fireEvent
from couchpotato.core.helpers.encoding import toUnicode, sp from couchpotato.core.helpers.encoding import toUnicode, sp
from couchpotato.core.helpers.variable import splitString from couchpotato.core.helpers.variable import splitString
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.plugins.base import Plugin from couchpotato.core.plugins.base import Plugin
from couchpotato.core.settings.model import Library, FileType
from couchpotato.environment import Env from couchpotato.environment import Env
import subliminal import subliminal
import traceback import traceback
@ -19,29 +17,6 @@ class Subtitle(Plugin):
def __init__(self): def __init__(self):
addEvent('renamer.before', self.searchSingle) 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): def searchSingle(self, group):
if self.isDisabled(): return if self.isDisabled(): return

2
couchpotato/core/providers/info/_modifier/main.py

@ -100,7 +100,7 @@ class MovieResultModifier(Plugin):
if media.get('status') == 'active': if media.get('status') == 'active':
temp['in_wanted'] = media temp['in_wanted'] = media
for release in db.get_many('release', media.get('_id'), with_doc = True): for release in db.run('release', 'for_media', media.get('_id')):
if release.get('status') == 'done': if release.get('status') == 'done':
temp['in_library'] = media temp['in_library'] = media
except: except:

2
couchpotato/core/providers/nzb/newznab/__init__.py

@ -29,7 +29,7 @@ config = [{
}, },
{ {
'name': 'host', 'name': 'host',
'default': 'nzb.su,dognzb.cr,nzbs.org,https://index.nzbgeek.info, https://smackdownonyou.com, https://www.nzbfinder.ws', 'default': 'api.nzb.su,dognzb.cr,nzbs.org,https://index.nzbgeek.info, https://smackdownonyou.com, https://www.nzbfinder.ws',
'description': 'The hostname of your newznab provider', 'description': 'The hostname of your newznab provider',
}, },
{ {

2
couchpotato/core/settings/__init__.py

@ -228,7 +228,7 @@ class Settings(object):
propert = db.get('property', identifier, with_doc = True) propert = db.get('property', identifier, with_doc = True)
prop = propert['doc']['value'] prop = propert['doc']['value']
except: except:
self.log.debug('Property doesn\'t exist: %s', traceback.format_exc(0)) self.log.debug('Property "%s" doesn\'t exist: %s', (identifier, traceback.format_exc(0)))
return prop return prop

2
couchpotato/runner.py

@ -86,8 +86,6 @@ def runCouchPotato(options, base_path, args, data_dir = None, log_dir = None, En
db_path = toUnicode(os.path.join(data_dir, 'database')) db_path = toUnicode(os.path.join(data_dir, 'database'))
# Check if database exists # Check if database exists
print db_path
db = ThreadSafeDatabase(db_path) db = ThreadSafeDatabase(db_path)
db_exists = db.exists() db_exists = db.exists()
if db_exists: if db_exists:

2
couchpotato/static/scripts/page/home.js

@ -62,7 +62,7 @@ Page.Home = new Class({
// Track movie added // Track movie added
var after_search = function(data){ var after_search = function(data){
if(notification.data.id != data.data.id) return; if(notification.data._id != data.data._id) return;
// Force update after search // Force update after search
self.available_list.update(); self.available_list.update();

Loading…
Cancel
Save