diff --git a/couchpotato/core/notifications/core/main.py b/couchpotato/core/notifications/core/main.py index 10a1401..5419049 100644 --- a/couchpotato/core/notifications/core/main.py +++ b/couchpotato/core/notifications/core/main.py @@ -1,6 +1,6 @@ from couchpotato import get_session from couchpotato.api import addApiView -from couchpotato.core.event import addEvent, fireEvent +from couchpotato.core.event import addEvent from couchpotato.core.helpers.encoding import toUnicode from couchpotato.core.helpers.request import jsonified, getParam from couchpotato.core.helpers.variable import tryInt @@ -48,13 +48,6 @@ class CoreNotifier(Notification): addApiView('notification.listener', self.listener) - self.registerEvents() - - def registerEvents(self): - - # Library update, frontend refresh - addEvent('library.update_finish', lambda data: fireEvent('notify.frontend', type = 'library.update', data = data)) - def markAsRead(self): ids = [x.strip() for x in getParam('ids').split(',')] diff --git a/couchpotato/core/notifications/core/static/notification.js b/couchpotato/core/notifications/core/static/notification.js index 371b95e..e35a394 100644 --- a/couchpotato/core/notifications/core/static/notification.js +++ b/couchpotato/core/notifications/core/static/notification.js @@ -88,7 +88,7 @@ var NotificationBase = new Class({ self.request = Api.request('notification.listener', { 'initialDelay': 100, - 'delay': 3000, + 'delay': 1500, 'data': {'init':true}, 'onSuccess': self.processData.bind(self) }) diff --git a/couchpotato/core/plugins/library/main.py b/couchpotato/core/plugins/library/main.py index 347d858..0e4fc8c 100644 --- a/couchpotato/core/plugins/library/main.py +++ b/couchpotato/core/plugins/library/main.py @@ -127,7 +127,7 @@ class LibraryPlugin(Plugin): library_dict = library.to_dict(self.default_dict) - fireEvent('library.update_finish', data = library_dict) + fireEvent('notify.frontend', type = 'library.update.%s' % identifier, data = library_dict) #db.close() return library_dict diff --git a/couchpotato/core/plugins/movie/main.py b/couchpotato/core/plugins/movie/main.py index 2c5ec73..60aa7ad 100644 --- a/couchpotato/core/plugins/movie/main.py +++ b/couchpotato/core/plugins/movie/main.py @@ -247,8 +247,16 @@ class MoviePlugin(Plugin): if title.default: default_title = title.title if movie: - fireEventAsync('library.update', identifier = movie.library.identifier, default_title = default_title, force = True) - fireEventAsync('searcher.single', movie.to_dict(self.default_dict)) + def notifyFront(): + movie = db.query(Movie).filter_by(id = id).first() + fireEvent('notify.frontend', type = 'movie.update.%s' % movie.id, data = movie.to_dict(self.default_dict)) + + def afterUpdate(): + movie = db.query(Movie).filter_by(id = id).first() + fireEventAsync('searcher.single', movie.to_dict(self.default_dict), on_complete = notifyFront) + + fireEventAsync('library.update', identifier = movie.library.identifier, default_title = default_title, force = True, on_complete = afterUpdate) + #db.close() return jsonified({ diff --git a/couchpotato/core/plugins/movie/static/movie.js b/couchpotato/core/plugins/movie/static/movie.js index 39b12ee..9b8fa22 100644 --- a/couchpotato/core/plugins/movie/static/movie.js +++ b/couchpotato/core/plugins/movie/static/movie.js @@ -11,53 +11,114 @@ var Movie = new Class({ self.view = options.view || 'thumbs'; self.list = list; + self.el = new Element('div.movie.inlay'); + self.profile = Quality.getProfile(data.profile_id) || {}; self.parent(self, options); + + App.addEvent('movie.update.'+data.id, self.update.bind(self)); + App.addEvent('searcher.started.'+data.id, self.searching.bind(self)); + App.addEvent('searcher.ended.'+data.id, self.searching.bind(self)); + }, + + searching: function(notification){ + var self = this; + + if(notification && notification.type.indexOf('ended') > -1){ + if(self.spinner){ + self.mask.fade('out'); + setTimeout(function(){ + self.mask.destroy(); + self.spinner.el.destroy(); + self.spinner = null; + self.mask = null; + }, 400); + } + } + else if(!self.spinner) { + self.createMask(); + self.spinner = createSpinner(self.mask); + self.positionMask(); + self.mask.fade('in'); + } + }, + + createMask: function(){ + var self = this; + self.mask = new Element('div.mask', { + 'styles': { + 'z-index': '1' + } + }).inject(self.el, 'top').fade('hide'); + self.positionMask(); + }, + + positionMask: function(){ + var self = this, + s = self.el.getSize() + + return self.mask.setStyles({ + 'width': s.x, + 'height': s.y + }).position({ + 'relativeTo': self.el + }) + }, + + update: function(notification){ + var self = this; + + self.data = notification.data; + self.container.destroy(); + self.profile = Quality.getProfile(self.data.profile_id) || {}; + self.create(); }, create: function(){ var self = this; - self.el = new Element('div.movie.inlay').adopt( - self.select_checkbox = new Element('input[type=checkbox].inlay', { - 'events': { - 'change': function(){ - self.fireEvent('select') + self.el.adopt( + self.container = new Element('div').adopt( + self.select_checkbox = new Element('input[type=checkbox].inlay', { + 'events': { + 'change': function(){ + self.fireEvent('select') + } } - } - }), - self.thumbnail = File.Select.single('poster', self.data.library.files), - self.data_container = new Element('div.data.inlay.light', { - 'tween': { - duration: 400, - transition: 'quint:in:out', - onComplete: self.fireEvent.bind(self, 'slideEnd') - } - }).adopt( - self.info_container = new Element('div.info').adopt( - self.title = new Element('div.title', { - 'text': self.getTitle() || 'n/a' - }), - self.year = new Element('div.year', { - 'text': self.data.library.year || 'n/a' - }), - self.rating = new Element('div.rating.icon', { - 'text': self.data.library.rating - }), - self.description = new Element('div.description', { - 'text': self.data.library.plot - }), - self.quality = new Element('div.quality', { - 'events': { - 'click': function(e){ - var releases = self.el.getElement('.actions .releases'); - if(releases) - releases.fireEvent('click', [e]) + }), + self.thumbnail = File.Select.single('poster', self.data.library.files), + self.data_container = new Element('div.data.inlay.light', { + 'tween': { + duration: 400, + transition: 'quint:in:out', + onComplete: self.fireEvent.bind(self, 'slideEnd') + } + }).adopt( + self.info_container = new Element('div.info').adopt( + self.title = new Element('div.title', { + 'text': self.getTitle() || 'n/a' + }), + self.year = new Element('div.year', { + 'text': self.data.library.year || 'n/a' + }), + self.rating = new Element('div.rating.icon', { + 'text': self.data.library.rating + }), + self.description = new Element('div.description', { + 'text': self.data.library.plot + }), + self.quality = new Element('div.quality', { + 'events': { + 'click': function(e){ + var releases = self.el.getElement('.actions .releases'); + if(releases) + releases.fireEvent('click', [e]) + } } - } - }) - ), - self.actions = new Element('div.actions') + }) + ), + self.actions = new Element('div.actions') + ) ) ); diff --git a/couchpotato/core/plugins/searcher/main.py b/couchpotato/core/plugins/searcher/main.py index 03d9261..93eb55e 100644 --- a/couchpotato/core/plugins/searcher/main.py +++ b/couchpotato/core/plugins/searcher/main.py @@ -83,6 +83,9 @@ class Searcher(Plugin): if not default_title: return + fireEvent('notify.frontend', type = 'searcher.started.%s' % movie['id'], data = True) + + ret = False for quality_type in movie['profile']['types']: if not self.couldBeReleased(quality_type['quality']['identifier'], release_dates, pre_releases): log.info('To early to search for %s, %s' % (quality_type['quality']['identifier'], default_title)) @@ -107,7 +110,7 @@ class Searcher(Plugin): # Check if movie isn't deleted while searching if not db.query(Movie).filter_by(id = movie.get('id')).first(): - return + break # Add them to this movie releases list for nzb in sorted_results: @@ -144,7 +147,8 @@ class Searcher(Plugin): for nzb in sorted_results: downloaded = self.download(data = nzb, movie = movie) if downloaded is True: - return True + ret = True + break elif downloaded != 'try_next': break else: @@ -153,11 +157,13 @@ class Searcher(Plugin): break # Break if CP wants to shut down - if self.shuttingDown(): + if self.shuttingDown() or ret: break + fireEvent('notify.frontend', type = 'searcher.ended.%s' % movie['id'], data = True) + #db.close() - return False + return ret def download(self, data, movie, manual = False): diff --git a/couchpotato/static/scripts/page/wanted.js b/couchpotato/static/scripts/page/wanted.js index 1f811c6..f8858e7 100644 --- a/couchpotato/static/scripts/page/wanted.js +++ b/couchpotato/static/scripts/page/wanted.js @@ -17,7 +17,6 @@ Page.Wanted = new Class({ 'actions': MovieActions }); $(self.wanted).inject(self.el); - App.addEvent('library.update', self.wanted.update.bind(self.wanted)); } } @@ -131,6 +130,7 @@ window.addEvent('domready', function(){ var self = this; (e).preventDefault(); + self.movie.searching(); Api.request('movie.refresh', { 'data': { 'id': self.movie.get('id')