This commit is contained in:
Ruud committed 2014-02-08 17:58:45 +01:00
1 parent a609b401c4
commit c3bc9c8591
27 files changed
+185 -352

No files matched your search

@@ -92,20 +92,6 @@ from couchpotato.core.helpers.encoding import simplifyString"""
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):
custom_header = """from CodernityDB.tree_index import TreeBasedIndex
+18 -26
View File
@@ -1,13 +1,12 @@
import traceback
from couchpotato import get_session, tryInt, get_db
from couchpotato import tryInt, get_db
from couchpotato.api import addApiView
from couchpotato.core.event import fireEvent, fireEventAsync, addEvent
from couchpotato.core.helpers.encoding import toUnicode
from couchpotato.core.helpers.variable import splitString, getImdb, getTitle
from couchpotato.core.logger import CPLog
from couchpotato.core.media import MediaBase
from .index import MediaIMDBIndex, MediaStatusIndex, YearIndex, MediaTypeIndex, TitleSearchIndex, TitleIndex, StartsWithIndex
from couchpotato.core.settings.model import Media
from .index import MediaIMDBIndex, MediaStatusIndex, MediaTypeIndex, TitleSearchIndex, TitleIndex, StartsWithIndex
from string import ascii_lowercase
log = CPLog(__name__)
@@ -102,12 +101,6 @@ class MediaPlugin(MediaBase):
log.debug('Index already exists')
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
try: db.add_index(TitleIndex(db.path, 'media_title'))
except:
@@ -377,46 +370,45 @@ class MediaPlugin(MediaBase):
def delete(self, media_id, delete_from = None):
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:
deleted = False
if delete_from == 'all':
db.delete(media)
db.commit()
deleted = True
else:
total_releases = len(media.releases)
media_releases = list(db.run('release', 'for_media', media['_id']))
total_releases = len(media_releases)
total_deleted = 0
new_movie_status = None
for release in media.releases:
new_media_status = None
for release in media_releases:
if delete_from in ['wanted', 'snatched', 'late']:
if release.get('status') != 'done':
db.delete(release)
total_deleted += 1
new_movie_status = 'done'
new_media_status = 'done'
elif delete_from == 'manage':
if release.get('status') == 'done':
db.delete(release)
total_deleted += 1
new_movie_status = 'active'
db.commit()
new_media_status = 'active'
if total_releases == total_deleted:
db.delete(media)
db.commit()
deleted = True
elif new_movie_status:
media.profile_id = None
media['status'] = new_status
db.commit()
elif new_media_status:
media['status'] = new_media_status
db.update(media)
else:
fireEvent('media.restatus', media.id, single = True)
fireEvent('media.restatus', media.get('_id'), single = True)
if deleted:
fireEvent('notify.frontend', type = 'movie.deleted', data = media.to_dict())
fireEvent('notify.frontend', type = 'media.deleted', data = media)
except:
log.error('Failed deleting media: %s', traceback.format_exc())
@@ -453,7 +445,7 @@ class MediaPlugin(MediaBase):
move_to_wanted = True
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']:
index = profile['qualities'].index(q_identifier)
+5 -5
View File
@@ -94,7 +94,7 @@ class MovieBase(MovieTypeBase):
'identifier': params.get('identifier'),
'status': status if status else 'active',
'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
@@ -135,7 +135,7 @@ class MovieBase(MovieTypeBase):
fireEvent('release.delete', release['_id'], single = True)
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:
log.debug('Movie already exists, not updating: %s', params)
added = False
@@ -198,7 +198,7 @@ class MovieBase(MovieTypeBase):
cat_id = kwargs.get('category_id')
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
for rel in db.run('release', 'for_media', m['_id']):
@@ -209,12 +209,12 @@ class MovieBase(MovieTypeBase):
if kwargs.get('default_title'):
m['title'] = kwargs.get('default_title')
print m
db.update(m)
fireEvent('media.restatus', m['_id'])
m = db.get('id', media_id)
movie_dict = db.run('media', 'to_dict', m['_id'])
fireEventAsync('movie.searcher.single', movie_dict, on_complete = self.createNotifyFront(media_id))
@@ -63,7 +63,7 @@ var MovieList = new Class({
self.movies.each(function(movie){
if(movie.get('_id') == notification.data._id){
movie.destroy();
delete self.movies_added[notification.data.id];
delete self.movies_added[notification.data._id];
self.setCounter(self.counter_count-1);
self.total_movies--;
}
@@ -77,7 +77,7 @@ var MovieList = new Class({
var self = this;
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);
self.createMovie(notification.data, 'top');
self.setCounter(self.counter_count+1);
@@ -180,7 +180,7 @@ var MovieList = new Class({
m.fireEvent('injected');
self.movies.include(m)
self.movies_added[movie.id] = true;
self.movies_added[movie._id] = true;
},
createNavigation: function(){
@@ -259,8 +259,8 @@ var MovieList = new Class({
self.mass_edit_select_class = new Form.Check(self.mass_edit_select);
Quality.getActiveProfiles().each(function(profile){
new Element('option', {
'value': profile.id ? profile.id : profile.data.id,
'text': profile.label ? profile.label : profile.data.label
'value': profile.get('_id'),
'text': profile.get('label')
}).inject(self.mass_edit_quality)
});
@@ -127,7 +127,7 @@ MA.Release = new Class({
self.showHelper();
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;
if(self.options_container){
@@ -143,30 +143,7 @@ MA.Release = new Class({
if(e)
(e).preventDefault();
if(self.releases)
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.');
}
});
}
self.createReleases();
},
@@ -189,9 +166,9 @@ MA.Release = new Class({
new Element('span.provider', {'text': 'Provider'})
).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,
provider = self.get(release, 'provider') + (release.info['provider_extra'] ? self.get(release, 'provider_extra') : '');
@@ -209,12 +186,12 @@ MA.Release = new Class({
// Create release
var item = new Element('div', {
'class': 'item '+status.identifier,
'id': 'release_'+release.id
'class': 'item '+release.status,
'id': 'release_'+release._id
}).adopt(
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.quality', {'text': quality.get('label') || 'n/a'}),
new Element('span.status', {'text': release.status, 'class': 'release_status '+release.status}),
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.age', {'text': self.get(release, 'age')}),
new Element('span.score', {'text': self.get(release, 'score')}),
@@ -243,32 +220,32 @@ MA.Release = new Class({
).inject(self.release_container);
release['el'] = item;
if(status.identifier == 'ignored' || status.identifier == 'failed' || status.identifier == 'snatched'){
if(!self.last_release || (self.last_release && self.last_release.status.identifier != 'snatched' && status.identifier == 'snatched'))
if(release.status == 'ignored' || release.status == 'failed' || release.status == 'snatched'){
if(!self.last_release || (self.last_release && self.last_release.status != 'snatched' && release.status == 'snatched'))
self.last_release = release;
}
else if(!self.next_release && status.identifier == 'available'){
else if(!self.next_release && release.status == 'available'){
self.next_release = release;
}
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;
release.el.set('class', 'item ' + new_status);
var status_el = release.el.getElement('.release_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'))
var q = self.addQuality(release.quality_id);
if(q && !q.hasClass(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)
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)
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');
@@ -385,7 +362,7 @@ MA.Release = new Class({
download: function(release){
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');
if(icon)
@@ -393,7 +370,7 @@ MA.Release = new Class({
Api.request('release.manual_download', {
'data': {
'id': release.id
'id': release._id
},
'onComplete': function(json){
if(icon)
@@ -416,7 +393,7 @@ MA.Release = new Class({
Api.request('release.ignore', {
'data': {
'id': release.id
'id': release._id
},
})
@@ -623,14 +600,14 @@ MA.Edit = new Class({
self.category_select.show();
categories.each(function(category){
var category_id = category.data.id;
var category_id = category.data._id;
new Element('option', {
'value': category_id,
'text': category.data.label
}).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);
});
@@ -859,29 +836,7 @@ MA.Files = new Class({
var self = this;
(e).preventDefault();
if(self.releases)
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.');
}
});
}
self.showFiles();
},
@@ -27,7 +27,7 @@ var Movie = new Class({
// Do refresh with new data
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.removeView();
@@ -38,7 +38,7 @@ var Movie = new Class({
// Add spinner on load / search
['media.busy', 'movie.searcher.started'].each(function(listener){
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);
}
App.on(listener, self.global_events[listener]);
@@ -46,7 +46,7 @@ var Movie = new Class({
// Remove spinner
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)
}
App.on('movie.searcher.ended', self.global_events['movie.searcher.ended']);
@@ -54,12 +54,12 @@ var Movie = new Class({
// Reload when releases have updated
self.global_events['release.update_status'] = function(notification){
var data = notification.data
if(data && self.data.id == data.movie_id){
if(data && self.data._id == data.movie_id){
if(!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();
}
}
@@ -197,7 +197,7 @@ var Movie = new Class({
if(self.profile.data)
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')){
q.addClass('finish');
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){
var q = self.quality.getElement('.q_id'+ release.quality_id),
var q = self.quality.getElement('.q_'+ release.quality),
status = release.status;
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)){
q.addClass(status);
@@ -236,13 +236,13 @@ var Movie = new Class({
});
},
addQuality: function(quality_identifier){
addQuality: function(quality){
var self = this;
var q = Quality.getQuality(quality_identifier);
var q = Quality.getQuality(quality);
return new Element('span', {
'text': q.label,
'class': 'q_'+q.identifier + ' q_id' + q.id,
'class': 'q_'+q.identifier,
'title': ''
}).inject(self.quality);
@@ -184,7 +184,7 @@ Block.Search.MovieItem = new Class({
self.category_select.show();
categories.each(function(category){
new Element('option', {
'value': category.data.id,
'value': category.data._id,
'text': category.data.label
}).inject(self.category_select);
});
@@ -139,7 +139,7 @@ class MovieSearcher(SearcherBase, MovieTypeBase):
profile = db.get('id', movie['profile_id'])
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
@@ -202,7 +202,6 @@ class MovieSearcher(SearcherBase, MovieTypeBase):
fireEvent('notify.frontend', type = 'movie.searcher.ended', data = {'id': movie['_id']})
pass #db.close()
return ret
def correctRelease(self, nzb = None, media = None, quality = None, **kwargs):
@@ -1,12 +1,9 @@
from couchpotato import get_session
from couchpotato import get_db
from couchpotato.api import addApiView
from couchpotato.core.event import fireEvent
from couchpotato.core.helpers.variable import splitString, removeDuplicate
from couchpotato.core.plugins.base import Plugin
from couchpotato.core.settings.model import Media, Library
from couchpotato.environment import Env
from sqlalchemy.orm import joinedload_all
from sqlalchemy.sql.expression import or_
class Suggestion(Plugin):
@@ -28,12 +25,9 @@ class Suggestion(Plugin):
else:
if not movies or len(movies) == 0:
db = get_session()
active_movies = db.query(Media) \
.options(joinedload_all('library')) \
.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()
db = get_db()
active_movies = db.run('media', 'with_status', ['active', 'done'])
movies = [x['identifier'] for x in active_movies]
if not ignored or len(ignored) == 0:
ignored = splitString(Env.prop('suggest_ignore', default = ''))
@@ -88,15 +82,10 @@ class Suggestion(Plugin):
# Get new results and add them
if len(new_suggestions) - 1 < limit:
db = get_session()
active_movies = db.query(Media) \
.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]
db = get_db()
active_movies = db.run('media', 'with_status', ['active', 'done'])
movies = [x['identifier'] for x in active_movies]
movies.extend(seen)
pass #db.close()
ignored.extend([x.get('imdb') for x in cached_suggestion])
suggestions = fireEvent('movie.suggest', movies = movies, ignore = removeDuplicate(ignored), single = True)