Browse Source

nosql

pull/3111/head
Ruud 11 years ago
parent
commit
b9a8ca14c3
  1. 4
      couchpotato/core/media/_base/media/main.py
  2. 198
      couchpotato/core/media/movie/_base/static/movie.actions.js
  3. 2
      couchpotato/core/media/movie/_base/static/movie.js
  4. 4
      couchpotato/core/media/movie/searcher/main.py
  5. 2
      couchpotato/core/notifications/core/static/notification.js
  6. 38
      couchpotato/core/plugins/manage/main.py
  7. 4
      couchpotato/core/plugins/release/index.py
  8. 36
      couchpotato/core/plugins/release/main.py
  9. 6
      couchpotato/core/plugins/renamer/main.py
  10. 1
      couchpotato/runner.py

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

@ -124,7 +124,7 @@ class MediaPlugin(MediaBase):
if refresh_handler: if refresh_handler:
handlers.append(refresh_handler) handlers.append(refresh_handler)
fireEvent('notify.frontend', type = 'media.busy', data = {'id': ids}) fireEvent('notify.frontend', type = 'media.busy', data = {'_id': ids})
fireEventAsync('schedule.queue', handlers = handlers) fireEventAsync('schedule.queue', handlers = handlers)
return { return {
@ -266,7 +266,7 @@ class MediaPlugin(MediaBase):
def listView(self, **kwargs): def listView(self, **kwargs):
types = splitString(kwargs.get('types')) types = splitString(kwargs.get('type'))
status = splitString(kwargs.get('status')) status = splitString(kwargs.get('status'))
release_status = splitString(kwargs.get('release_status')) release_status = splitString(kwargs.get('release_status'))
limit_offset = kwargs.get('limit_offset') limit_offset = kwargs.get('limit_offset')

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

@ -121,7 +121,7 @@ MA.Release = new Class({
} }
}); });
if(self.movie.data.releases.length == 0) if(!self.movie.data.releases || self.movie.data.releases.length == 0)
self.el.hide() self.el.hide()
else else
self.showHelper(); self.showHelper();
@ -166,92 +166,93 @@ 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.movie.data.releases.each(function(release){ if(self.movie.data.releases)
self.movie.data.releases.each(function(release){
var quality = Quality.getQuality(release.quality) || {},
info = release.info,
provider = self.get(release, 'provider') + (release.info['provider_extra'] ? self.get(release, 'provider_extra') : '');
var quality = Quality.getQuality(release.quality) || {}, var release_name = self.get(release, 'name');
info = release.info, if(release.files && release.files.length > 0){
provider = self.get(release, 'provider') + (release.info['provider_extra'] ? self.get(release, 'provider_extra') : ''); try {
var movie_file = release.files.filter(function(file){
var release_name = self.get(release, 'name'); var type = File.Type.get(file.type_id);
if(release.files && release.files.length > 0){ return type && type.identifier == 'movie'
try { }).pick();
var movie_file = release.files.filter(function(file){ release_name = movie_file.path.split(Api.getOption('path_sep')).getLast();
var type = File.Type.get(file.type_id); }
return type && type.identifier == 'movie' catch(e){}
}).pick();
release_name = movie_file.path.split(Api.getOption('path_sep')).getLast();
} }
catch(e){}
}
// Create release // Create release
var item = new Element('div', { var item = new Element('div', {
'class': 'item '+release.status, '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': release.status, 'class': 'release_status '+release.status}), new Element('span.status', {'text': release.status, 'class': 'release_status '+release.status}),
new Element('span.quality', {'text': quality.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')}),
new Element('span.provider', { 'text': provider, 'title': provider }), new Element('span.provider', { 'text': provider, 'title': provider }),
release.info['detail_url'] ? new Element('a.info.icon2', { release.info['detail_url'] ? new Element('a.info.icon2', {
'href': release.info['detail_url'], 'href': release.info['detail_url'],
'target': '_blank' 'target': '_blank'
}) : new Element('a'), }) : new Element('a'),
new Element('a.download.icon2', { new Element('a.download.icon2', {
'events': { 'events': {
'click': function(e){ 'click': function(e){
(e).preventDefault(); (e).preventDefault();
if(!this.hasClass('completed')) if(!this.hasClass('completed'))
self.download(release); self.download(release);
}
} }
} }),
}), new Element('a.delete.icon2', {
new Element('a.delete.icon2', { 'events': {
'events': { 'click': function(e){
'click': function(e){ (e).preventDefault();
(e).preventDefault(); self.ignore(release);
self.ignore(release); }
} }
} })
}) ).inject(self.release_container);
).inject(self.release_container); release['el'] = item;
release['el'] = item;
if(release.status == 'ignored' || release.status == 'failed' || release.status == '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')) 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 && release.status == '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_' + release.quality), 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); 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(release.status, new_status)); q.set('title', q.get('title').replace(release.status, new_status));
}
} }
}
App.on('release.update_status', update_handle); App.on('release.update_status', update_handle);
}); });
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');
@ -314,16 +315,17 @@ MA.Release = new Class({
var has_available = false, var has_available = false,
has_snatched = false; has_snatched = false;
self.movie.data.releases.each(function(release){ if(self.movie.data.releases)
if(has_available && has_snatched) return; self.movie.data.releases.each(function(release){
if(has_available && has_snatched) return;
if(['snatched', 'downloaded', 'seeding'].contains(release.status)) if(['snatched', 'downloaded', 'seeding'].contains(release.status))
has_snatched = true; has_snatched = true;
if(['available'].contains(release.status)) if(['available'].contains(release.status))
has_available = true; has_available = true;
}); });
if(has_available || has_snatched){ if(has_available || has_snatched){
@ -698,7 +700,7 @@ MA.Readd = new Class({
var self = this; var self = this;
var movie_done = self.movie.data.status == 'done'; var movie_done = self.movie.data.status == 'done';
if(!movie_done) if(self.movie.data.releases && !movie_done)
var snatched = self.movie.data.releases.filter(function(release){ var snatched = self.movie.data.releases.filter(function(release){
return release.status && (release.status == 'snatched' || release.status == 'downloaded' || release.status == 'done'); return release.status && (release.status == 'snatched' || release.status == 'downloaded' || release.status == 'done');
}).length; }).length;
@ -832,15 +834,7 @@ MA.Files = new Class({
}, },
show: function(e){ show: function(){
var self = this;
(e).preventDefault();
self.showFiles();
},
showFiles: function(){
var self = this; var self = this;
if(!self.options_container){ if(!self.options_container){
@ -851,26 +845,26 @@ MA.Files = new Class({
// Header // Header
new Element('div.item.head').adopt( new Element('div.item.head').adopt(
new Element('span.name', {'text': 'File'}), new Element('span.name', {'text': 'File'}),
new Element('span.type', {'text': 'Type'}), new Element('span.type', {'text': 'Type'})
new Element('span.is_available', {'text': 'Available'})
).inject(self.files_container) ).inject(self.files_container)
Array.each(self.releases, function(release){ if(self.movie.data.releases)
Array.each(self.movie.data.releases, function(release){
var rel = new Element('div.release').inject(self.files_container); var rel = new Element('div.release').inject(self.files_container);
Array.each(release.files, function(file){ Object.each(release.files, function(files, type){
new Element('div.file.item').adopt( Array.each(files, function(file){
new Element('span.name', {'text': file.path}), new Element('div.file.item').adopt(
new Element('span.type', {'text': File.Type.get(file.type_id).name}), new Element('span.name', {'text': file}),
new Element('span.available', {'text': file.available}) new Element('span.type', {'text': type})
).inject(rel) ).inject(rel)
});
});
}); });
});
} }
self.movie.slide('in', self.options_container); self.movie.slide('in', self.options_container);
}, }
}); });

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

@ -187,7 +187,7 @@ var Movie = new Class({
) )
); );
if(self.thumbnail.empty) if(!self.thumbnail || self.thumbnail.empty)
self.el.addClass('no_thumbnail'); self.el.addClass('no_thumbnail');
//self.changeView(self.view); //self.changeView(self.view);

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

@ -133,7 +133,7 @@ class MovieSearcher(SearcherBase, MovieTypeBase):
fireEvent('media.delete', movie['_id'], single = True) fireEvent('media.delete', movie['_id'], single = True)
return return
fireEvent('notify.frontend', type = 'movie.searcher.started', data = {'id': movie['_id']}, message = 'Searching for "%s"' % default_title) fireEvent('notify.frontend', type = 'movie.searcher.started', data = {'_id': movie['_id']}, message = 'Searching for "%s"' % default_title)
db = get_db() db = get_db()
@ -200,7 +200,7 @@ class MovieSearcher(SearcherBase, MovieTypeBase):
if len(too_early_to_search) > 0: if len(too_early_to_search) > 0:
log.info2('Too early to search for %s, %s', (too_early_to_search, default_title)) log.info2('Too early to search for %s, %s', (too_early_to_search, default_title))
fireEvent('notify.frontend', type = 'movie.searcher.ended', data = {'id': movie['_id']}) fireEvent('notify.frontend', type = 'movie.searcher.ended', data = {'_id': movie['_id']})
return ret return ret

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

@ -147,7 +147,7 @@ var NotificationBase = new Class({
// Process data // Process data
if(json){ if(json){
Array.each(json.result, function(result){ Array.each(json.result, function(result){
App.trigger(result._t, [result]); App.trigger(result._t || result.type, [result]);
if(result.message && result.read === undefined) if(result.message && result.read === undefined)
self.showMessage(result.message); self.showMessage(result.message);
}) })

38
couchpotato/core/plugins/manage/main.py

@ -1,3 +1,4 @@
from couchpotato import get_db
from couchpotato.api import addApiView from couchpotato.api import addApiView
from couchpotato.core.event import fireEvent, addEvent, fireEventAsync from couchpotato.core.event import fireEvent, addEvent, fireEventAsync
from couchpotato.core.helpers.encoding import sp from couchpotato.core.helpers.encoding import sp
@ -48,7 +49,6 @@ class Manage(Plugin):
if not Env.get('dev') and self.conf('startup_scan'): if not Env.get('dev') and self.conf('startup_scan'):
addEvent('app.load', self.updateLibraryQuick) addEvent('app.load', self.updateLibraryQuick)
addEvent('app.load', self.updateLibrary)
def getProgress(self, **kwargs): def getProgress(self, **kwargs):
return { return {
@ -125,32 +125,34 @@ class Manage(Plugin):
fireEvent('media.delete', media_id = done_movie['id'], delete_from = 'all') fireEvent('media.delete', media_id = done_movie['id'], delete_from = 'all')
else: else:
releases = fireEvent('release.for_movie', id = done_movie.get('_id'), single = True) db = get_db()
releases = list(db.run('release', 'for_media', done_movie.get('_id')))
for release in releases: for release in releases:
if len(release.get('files', [])) > 0: if len(release.get('files', [])) > 0:
for release_file in release.get('files', []): for file_type in release.get('files', {}):
# Remove release not available anymore for release_file in release['files'][file_type]:
if not os.path.isfile(sp(release_file['path'])): # Remove release not available anymore
fireEvent('release.clean', release['id']) if not os.path.isfile(sp(release_file)):
break fireEvent('release.clean', release['_id'])
break
# Check if there are duplicate releases (different quality) use the last one, delete the rest # Check if there are duplicate releases (different quality) use the last one, delete the rest
if len(releases) > 1: if len(releases) > 1:
used_files = {} used_files = {}
for release in releases: for release in releases:
for file_type in release.get('files', {}):
for release_file in release.get('files', []): for release_file in release['files'][file_type]:
already_used = used_files.get(release_file['path']) already_used = used_files.get(release_file)
if already_used: if already_used:
if already_used < release['id']: if already_used.get('last_edit', 0) < release.get('last_edit', 0):
fireEvent('release.delete', release['id'], single = True) # delete this one fireEvent('release.delete', release['_id'], single = True) # delete current one
else:
fireEvent('release.delete', already_used['_id'], single = True) # delete previous one
break
else: else:
fireEvent('release.delete', already_used, single = True) # delete previous one used_files[release_file] = release
break
else:
used_files[release_file['path']] = release.get('id')
del used_files del used_files
Env.prop('manage.last_update', time.time()) Env.prop('manage.last_update', time.time())

4
couchpotato/core/plugins/release/index.py

@ -1,4 +1,5 @@
from hashlib import md5 from hashlib import md5
from CodernityDB.hash_index import HashIndex
from CodernityDB.tree_index import TreeBasedIndex from CodernityDB.tree_index import TreeBasedIndex
@ -42,14 +43,13 @@ class ReleaseStatusIndex(TreeBasedIndex):
return md5(data.get('status')).hexdigest(), {'media_id': data.get('media_id')} return md5(data.get('status')).hexdigest(), {'media_id': data.get('media_id')}
class ReleaseIDIndex(TreeBasedIndex): class ReleaseIDIndex(HashIndex):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
kwargs['key_format'] = '32s' kwargs['key_format'] = '32s'
super(ReleaseIDIndex, self).__init__(*args, **kwargs) super(ReleaseIDIndex, self).__init__(*args, **kwargs)
def make_key(self, key): def make_key(self, key):
print key
return md5(key).hexdigest() return md5(key).hexdigest()
def make_key_value(self, data): def make_key_value(self, data):

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

@ -111,41 +111,41 @@ class Release(Plugin):
try: try:
db = get_db() db = get_db()
identifier = '%s.%s.%s' % (group['identifier'], group['meta_data'].get('audio', 'unknown'), group['meta_data']['quality']['identifier']) release_identifier = '%s.%s.%s' % (group['identifier'], group['meta_data'].get('audio', 'unknown'), group['meta_data']['quality']['identifier'])
# Add movie if it doesn't exist # Add movie if it doesn't exist
try: try:
media = db.get('media', group['identifier'], with_doc = True)['doc'] media = db.get('media', group['identifier'], with_doc = True)['doc']
media['status'] = 'done'
db.update(media)
except: except:
media = { media = fireEvent('movie.add', params = {
'_t': 'media',
'identifier': group['identifier'], 'identifier': group['identifier'],
'profile_id': None, 'profile_id': None,
'status': 'done' }, search_after = False, status = 'done', single = True)
}
m = db.insert(media)
media.update(m)
# Add Release # Add Release
release = { release = {
'_t': 'release', '_t': 'release',
'media_id': media['_id'], 'media_id': media['_id'],
'identifier': identifier, 'identifier': release_identifier,
'quality': group['meta_data']['quality'].get('identifier'), 'quality': group['meta_data']['quality'].get('identifier'),
'last_edit': int(time.time()),
'status': 'done' 'status': 'done'
} }
try: try:
r = db.get('release_identifier', identifier, with_doc = True)['doc'] r = db.get('release_identifier', release_identifier, with_doc = True)['doc']
release.update(r) r['media_id'] = media['_id']
db.update(release)
except: except:
r = db.insert(release) r = db.insert(release)
release.update(r)
# Add each file type # Update with ref and _id
release.update({
'_id': r['_id'],
'_rev': r['_rev'],
})
# Empty out empty file groups
release['files'] = dict((k, v) for k, v in group['files'].items() if v) release['files'] = dict((k, v) for k, v in group['files'].items() if v)
db.update(release)
fireEvent('media.restatus', media['_id']) fireEvent('media.restatus', media['_id'])
@ -307,7 +307,7 @@ class Release(Plugin):
# Mark release as snatched # Mark release as snatched
if renamer_enabled: if renamer_enabled:
self.updateStatus(rls.id, status = snatched_status) self.updateStatus(rls.id, status = 'snatched')
# If renamer isn't used, mark media done if finished or release downloaded # If renamer isn't used, mark media done if finished or release downloaded
else: else:
@ -318,7 +318,7 @@ class Release(Plugin):
log.info('Renamer disabled, marking media as finished: %s', log_movie) log.info('Renamer disabled, marking media as finished: %s', log_movie)
# Mark release done # Mark release done
self.updateStatus(rls.id, status = done_status) self.updateStatus(rls.id, status = 'done')
# Mark media done # Mark media done
mdia = db.query(Media).filter_by(id = media['id']).first() mdia = db.query(Media).filter_by(id = media['id']).first()
@ -329,7 +329,7 @@ class Release(Plugin):
return True return True
# Assume release downloaded # Assume release downloaded
self.updateStatus(rls.id, status = downloaded_status) self.updateStatus(rls.id, status = 'downloaded')
except: except:
log.error('Failed storing download status: %s', traceback.format_exc()) log.error('Failed storing download status: %s', traceback.format_exc())

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

@ -472,14 +472,14 @@ class Renamer(Plugin):
if release_download['rls_id'] == release.id: if release_download['rls_id'] == release.id:
if release_download['status'] == 'completed': if release_download['status'] == 'completed':
# Set the release to downloaded # Set the release to downloaded
fireEvent('release.update_status', release.id, status = downloaded_status, single = True) fireEvent('release.update_status', release.id, status = 'downloaded', single = True)
elif release_download['status'] == 'seeding': elif release_download['status'] == 'seeding':
# Set the release to seeding # Set the release to seeding
fireEvent('release.update_status', release.id, status = seeding_status, single = True) fireEvent('release.update_status', release.id, status = 'seeding', single = True)
elif release.quality.id is group['meta_data']['quality']['id']: elif release.quality.id is group['meta_data']['quality']['id']:
# Set the release to downloaded # Set the release to downloaded
fireEvent('release.update_status', release.id, status = downloaded_status, single = True) fireEvent('release.update_status', release.id, status = 'downloaded', single = True)
# Remove leftover files # Remove leftover files
if not remove_leftovers: # Don't remove anything if not remove_leftovers: # Don't remove anything

1
couchpotato/runner.py

@ -13,7 +13,6 @@ from uuid import uuid4
import locale import locale
import logging import logging
import os.path import os.path
import shutil
import sys import sys
import time import time
import traceback import traceback

Loading…
Cancel
Save