12 changed files with 1545 additions and 4343 deletions
@ -1,59 +0,0 @@ |
|||||
Page.Shows = new Class({ |
|
||||
|
|
||||
Extends: PageBase, |
|
||||
|
|
||||
name: 'shows', |
|
||||
title: 'List of TV Shows subscribed to', |
|
||||
folder_browser: null, |
|
||||
has_tab: false, |
|
||||
|
|
||||
toggleShows: function(arg) { |
|
||||
var self = this; |
|
||||
var nav = App.getBlock('navigation'); |
|
||||
|
|
||||
if ((typeof arg === 'object' && arg.data === true) || arg === true) { |
|
||||
self.tab = nav.addTab(self.name, { |
|
||||
'href': App.createUrl(self.name), |
|
||||
'title': self.title, |
|
||||
'text': self.name.capitalize() |
|
||||
}); |
|
||||
self.has_tab = true; |
|
||||
} else { |
|
||||
self.has_tab = false; |
|
||||
self.tab = null; |
|
||||
nav.removeTab('shows'); |
|
||||
} |
|
||||
}, |
|
||||
|
|
||||
load: function() { |
|
||||
var self = this; |
|
||||
|
|
||||
Api.request('settings', { |
|
||||
'onComplete': function(json){ |
|
||||
self.toggleShows(json.values.shows.enabled); |
|
||||
} |
|
||||
}); |
|
||||
|
|
||||
App.on('shows.enabled', self.toggleShows.bind(self)); |
|
||||
}, |
|
||||
|
|
||||
indexAction: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
if(!self.wanted){ |
|
||||
|
|
||||
// Wanted movies
|
|
||||
self.wanted = new ShowList({ |
|
||||
'identifier': 'wanted', |
|
||||
'status': 'active', |
|
||||
'type': 'show', |
|
||||
'actions': [MA.IMDB, MA.Trailer, MA.Release, MA.Edit, MA.Refresh, MA.Readd, MA.Delete], |
|
||||
'add_new': true, |
|
||||
'on_empty_element': App.createUserscriptButtons().addClass('empty_wanted') |
|
||||
}); |
|
||||
$(self.wanted).inject(self.el); |
|
||||
} |
|
||||
|
|
||||
} |
|
||||
|
|
||||
}); |
|
@ -1,474 +0,0 @@ |
|||||
var EpisodeAction = new Class({ |
|
||||
|
|
||||
Implements: [Options], |
|
||||
|
|
||||
class_name: 'item-action icon2', |
|
||||
|
|
||||
initialize: function(episode, options){ |
|
||||
var self = this; |
|
||||
self.setOptions(options); |
|
||||
|
|
||||
self.show = episode.show; |
|
||||
self.episode = episode; |
|
||||
|
|
||||
self.create(); |
|
||||
if(self.el) |
|
||||
self.el.addClass(self.class_name) |
|
||||
}, |
|
||||
|
|
||||
create: function(){}, |
|
||||
|
|
||||
disable: function(){ |
|
||||
if(this.el) |
|
||||
this.el.addClass('disable') |
|
||||
}, |
|
||||
|
|
||||
enable: function(){ |
|
||||
if(this.el) |
|
||||
this.el.removeClass('disable') |
|
||||
}, |
|
||||
|
|
||||
getTitle: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
try { |
|
||||
return self.show.getTitle(); |
|
||||
} |
|
||||
catch(e){ |
|
||||
try { |
|
||||
return self.show.original_title ? self.show.original_title : self.show.titles[0]; |
|
||||
} |
|
||||
catch(e){ |
|
||||
return 'Unknown'; |
|
||||
} |
|
||||
} |
|
||||
}, |
|
||||
|
|
||||
get: function(key){ |
|
||||
var self = this; |
|
||||
try { |
|
||||
return self.show.get(key) |
|
||||
} |
|
||||
catch(e){ |
|
||||
return self.show[key] |
|
||||
} |
|
||||
}, |
|
||||
|
|
||||
createMask: function(){ |
|
||||
var self = this; |
|
||||
self.mask = new Element('div.mask', { |
|
||||
'styles': { |
|
||||
'z-index': '1' |
|
||||
} |
|
||||
}).inject(self.show, 'top').fade('hide'); |
|
||||
}, |
|
||||
|
|
||||
toElement: function(){ |
|
||||
return this.el || null |
|
||||
} |
|
||||
|
|
||||
}); |
|
||||
|
|
||||
var EA = {}; |
|
||||
|
|
||||
EA.IMDB = new Class({ |
|
||||
|
|
||||
Extends: EpisodeAction, |
|
||||
id: null, |
|
||||
|
|
||||
create: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
self.id = self.show.getIdentifier ? self.show.getIdentifier() : self.get('imdb'); |
|
||||
|
|
||||
self.el = new Element('a.imdb', { |
|
||||
'title': 'Go to the IMDB page of ' + self.getTitle(), |
|
||||
'href': 'http://www.imdb.com/title/'+self.id+'/', |
|
||||
'target': '_blank' |
|
||||
}); |
|
||||
|
|
||||
if(!self.id) self.disable(); |
|
||||
} |
|
||||
|
|
||||
}); |
|
||||
|
|
||||
EA.Release = new Class({ |
|
||||
|
|
||||
Extends: EpisodeAction, |
|
||||
|
|
||||
create: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
self.el = new Element('a.releases.download', { |
|
||||
'title': 'Show the releases that are available for ' + self.getTitle(), |
|
||||
'events': { |
|
||||
'click': self.toggle.bind(self) |
|
||||
} |
|
||||
}); |
|
||||
|
|
||||
self.options = new Element('div.episode-options').inject(self.episode.el); |
|
||||
|
|
||||
if(!self.episode.data.releases || self.episode.data.releases.length == 0) |
|
||||
self.el.hide(); |
|
||||
else |
|
||||
self.showHelper(); |
|
||||
|
|
||||
App.on('show.searcher.ended', function(notification){ |
|
||||
if(self.show.data._id != notification.data._id) return; |
|
||||
|
|
||||
self.releases = null; |
|
||||
if(self.options_container){ |
|
||||
self.options_container.destroy(); |
|
||||
self.options_container = null; |
|
||||
} |
|
||||
}); |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
toggle: function(e){ |
|
||||
var self = this; |
|
||||
|
|
||||
if(self.options && self.options.hasClass('expanded')) { |
|
||||
self.close(); |
|
||||
} else { |
|
||||
self.open(); |
|
||||
} |
|
||||
}, |
|
||||
|
|
||||
open: function(e){ |
|
||||
var self = this; |
|
||||
|
|
||||
if(e) |
|
||||
(e).preventDefault(); |
|
||||
|
|
||||
self.createReleases(); |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
close: function(e) { |
|
||||
var self = this; |
|
||||
|
|
||||
if(e) |
|
||||
(e).preventDefault(); |
|
||||
|
|
||||
self.options.setStyle('height', 0) |
|
||||
.removeClass('expanded'); |
|
||||
}, |
|
||||
|
|
||||
createReleases: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
if(!self.releases_table){ |
|
||||
self.options.adopt( |
|
||||
self.releases_table = new Element('div.releases.table') |
|
||||
); |
|
||||
|
|
||||
// Header
|
|
||||
new Element('div.item.head').adopt( |
|
||||
new Element('span.name', {'text': 'Release name'}), |
|
||||
new Element('span.status', {'text': 'Status'}), |
|
||||
new Element('span.quality', {'text': 'Quality'}), |
|
||||
new Element('span.size', {'text': 'Size'}), |
|
||||
new Element('span.age', {'text': 'Age'}), |
|
||||
new Element('span.score', {'text': 'Score'}), |
|
||||
new Element('span.provider', {'text': 'Provider'}) |
|
||||
).inject(self.releases_table); |
|
||||
|
|
||||
if(self.episode.data.releases) |
|
||||
self.episode.data.releases.each(function(release){ |
|
||||
|
|
||||
var quality = Quality.getQuality(release.quality) || {}, |
|
||||
info = release.info || {}, |
|
||||
provider = self.get(release, 'provider') + (info['provider_extra'] ? self.get(release, 'provider_extra') : ''); |
|
||||
|
|
||||
var release_name = self.get(release, 'name'); |
|
||||
if(release.files && release.files.length > 0){ |
|
||||
try { |
|
||||
var movie_file = release.files.filter(function(file){ |
|
||||
var type = File.Type.get(file.type_id); |
|
||||
return type && type.identifier == 'movie' |
|
||||
}).pick(); |
|
||||
release_name = movie_file.path.split(Api.getOption('path_sep')).getLast(); |
|
||||
} |
|
||||
catch(e){} |
|
||||
} |
|
||||
|
|
||||
// Create release
|
|
||||
release['el'] = new Element('div', { |
|
||||
'class': 'item '+release.status, |
|
||||
'id': 'release_'+release._id |
|
||||
}).adopt( |
|
||||
new Element('span.name', {'text': release_name, 'title': release_name}), |
|
||||
new Element('span.status', {'text': release.status, 'class': 'status '+release.status}), |
|
||||
new Element('span.quality', {'text': quality.label + (release.is_3d ? ' 3D' : '') || 'n/a'}), |
|
||||
new Element('span.size', {'text': 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')}), |
|
||||
new Element('span.provider', { 'text': provider, 'title': provider }), |
|
||||
info['detail_url'] ? new Element('a.info.icon2', { |
|
||||
'href': info['detail_url'], |
|
||||
'target': '_blank' |
|
||||
}) : new Element('a'), |
|
||||
new Element('a.download.icon2', { |
|
||||
'events': { |
|
||||
'click': function(e){ |
|
||||
(e).preventDefault(); |
|
||||
if(!this.hasClass('completed')) |
|
||||
self.download(release); |
|
||||
} |
|
||||
} |
|
||||
}), |
|
||||
new Element('a.delete.icon2', { |
|
||||
'events': { |
|
||||
'click': function(e){ |
|
||||
(e).preventDefault(); |
|
||||
self.ignore(release); |
|
||||
} |
|
||||
} |
|
||||
}) |
|
||||
).inject(self.releases_table); |
|
||||
|
|
||||
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 && release.status == 'available'){ |
|
||||
self.next_release = release; |
|
||||
} |
|
||||
|
|
||||
var update_handle = function(notification) { |
|
||||
if(notification.data._id != release._id) return; |
|
||||
|
|
||||
var q = self.show.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); |
|
||||
|
|
||||
if(!q && (new_status == 'snatched' || new_status == 'seeding' || new_status == 'done')) |
|
||||
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(release.status, new_status)); |
|
||||
} |
|
||||
}; |
|
||||
|
|
||||
App.on('release.update_status', update_handle); |
|
||||
|
|
||||
}); |
|
||||
|
|
||||
if(self.last_release) |
|
||||
self.releases_table.getElements('#release_'+self.last_release._id).addClass('last_release'); |
|
||||
|
|
||||
if(self.next_release) |
|
||||
self.releases_table.getElements('#release_'+self.next_release._id).addClass('next_release'); |
|
||||
|
|
||||
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.releases_table, 'top'); |
|
||||
|
|
||||
var nr = self.next_release, |
|
||||
lr = self.last_release; |
|
||||
|
|
||||
self.trynext_container.adopt( |
|
||||
new Element('span.or', { |
|
||||
'text': 'If anything went wrong, download' |
|
||||
}), |
|
||||
lr ? new Element('a.button.orange', { |
|
||||
'text': 'the same release again', |
|
||||
'events': { |
|
||||
'click': function(){ |
|
||||
self.download(lr); |
|
||||
} |
|
||||
} |
|
||||
}) : null, |
|
||||
nr && lr ? new Element('span.or', { |
|
||||
'text': ',' |
|
||||
}) : null, |
|
||||
nr ? [new Element('a.button.green', { |
|
||||
'text': lr ? 'another release' : 'the best release', |
|
||||
'events': { |
|
||||
'click': function(){ |
|
||||
self.download(nr); |
|
||||
} |
|
||||
} |
|
||||
}), |
|
||||
new Element('span.or', { |
|
||||
'text': 'or pick one below' |
|
||||
})] : null |
|
||||
) |
|
||||
} |
|
||||
|
|
||||
self.last_release = null; |
|
||||
self.next_release = null; |
|
||||
|
|
||||
self.episode.el.addEvent('outerClick', function(){ |
|
||||
self.close(); |
|
||||
}); |
|
||||
} |
|
||||
|
|
||||
self.options.setStyle('height', self.releases_table.getSize().y) |
|
||||
.addClass('expanded'); |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
showHelper: function(e){ |
|
||||
var self = this; |
|
||||
if(e) |
|
||||
(e).preventDefault(); |
|
||||
|
|
||||
var has_available = false, |
|
||||
has_snatched = false; |
|
||||
|
|
||||
if(self.episode.data.releases) |
|
||||
self.episode.data.releases.each(function(release){ |
|
||||
if(has_available && has_snatched) return; |
|
||||
|
|
||||
if(['snatched', 'downloaded', 'seeding'].contains(release.status)) |
|
||||
has_snatched = true; |
|
||||
|
|
||||
if(['available'].contains(release.status)) |
|
||||
has_available = true; |
|
||||
|
|
||||
}); |
|
||||
|
|
||||
if(has_available || has_snatched){ |
|
||||
|
|
||||
self.trynext_container = new Element('div.buttons.trynext').inject(self.show.info_container); |
|
||||
|
|
||||
self.trynext_container.adopt( |
|
||||
has_available ? [new Element('a.icon2.readd', { |
|
||||
'text': has_snatched ? 'Download another release' : 'Download the best release', |
|
||||
'events': { |
|
||||
'click': self.tryNextRelease.bind(self) |
|
||||
} |
|
||||
}), |
|
||||
new Element('a.icon2.download', { |
|
||||
'text': 'pick one yourself', |
|
||||
'events': { |
|
||||
'click': function(){ |
|
||||
self.show.quality.fireEvent('click'); |
|
||||
} |
|
||||
} |
|
||||
})] : null, |
|
||||
new Element('a.icon2.completed', { |
|
||||
'text': 'mark this movie done', |
|
||||
'events': { |
|
||||
'click': self.markMovieDone.bind(self) |
|
||||
} |
|
||||
}) |
|
||||
) |
|
||||
} |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
get: function(release, type){ |
|
||||
return (release.info && release.info[type] !== undefined) ? release.info[type] : 'n/a' |
|
||||
}, |
|
||||
|
|
||||
download: function(release){ |
|
||||
var self = this; |
|
||||
|
|
||||
var release_el = self.releases_table.getElement('#release_'+release._id), |
|
||||
icon = release_el.getElement('.download.icon2'); |
|
||||
|
|
||||
if(icon) |
|
||||
icon.addClass('icon spinner').removeClass('download'); |
|
||||
|
|
||||
Api.request('release.manual_download', { |
|
||||
'data': { |
|
||||
'id': release._id |
|
||||
}, |
|
||||
'onComplete': function(json){ |
|
||||
if(icon) |
|
||||
icon.removeClass('icon spinner'); |
|
||||
|
|
||||
if(json.success){ |
|
||||
if(icon) |
|
||||
icon.addClass('completed'); |
|
||||
release_el.getElement('.release_status').set('text', 'snatched'); |
|
||||
} |
|
||||
else |
|
||||
if(icon) |
|
||||
icon.addClass('attention').set('title', 'Something went wrong when downloading, please check logs.'); |
|
||||
} |
|
||||
}); |
|
||||
}, |
|
||||
|
|
||||
ignore: function(release){ |
|
||||
|
|
||||
Api.request('release.ignore', { |
|
||||
'data': { |
|
||||
'id': release._id |
|
||||
} |
|
||||
}) |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
markMovieDone: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
Api.request('media.delete', { |
|
||||
'data': { |
|
||||
'id': self.show.get('_id'), |
|
||||
'delete_from': 'wanted' |
|
||||
}, |
|
||||
'onComplete': function(){ |
|
||||
var movie = $(self.show); |
|
||||
movie.set('tween', { |
|
||||
'duration': 300, |
|
||||
'onComplete': function(){ |
|
||||
self.show.destroy() |
|
||||
} |
|
||||
}); |
|
||||
movie.tween('height', 0); |
|
||||
} |
|
||||
}); |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
tryNextRelease: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
Api.request('movie.searcher.try_next', { |
|
||||
'data': { |
|
||||
'media_id': self.show.get('_id') |
|
||||
} |
|
||||
}); |
|
||||
|
|
||||
} |
|
||||
|
|
||||
}); |
|
||||
|
|
||||
EA.Refresh = new Class({ |
|
||||
|
|
||||
Extends: EpisodeAction, |
|
||||
|
|
||||
create: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
self.el = new Element('a.refresh', { |
|
||||
'title': 'Refresh the movie info and do a forced search', |
|
||||
'events': { |
|
||||
'click': self.doRefresh.bind(self) |
|
||||
} |
|
||||
}); |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
doRefresh: function(e){ |
|
||||
var self = this; |
|
||||
(e).preventDefault(); |
|
||||
|
|
||||
Api.request('media.refresh', { |
|
||||
'data': { |
|
||||
'id': self.episode.get('_id') |
|
||||
} |
|
||||
}); |
|
||||
} |
|
||||
|
|
||||
}); |
|
@ -1,636 +1,8 @@ |
|||||
var ShowList = new Class({ |
var ShowList = new Class({ |
||||
|
|
||||
Implements: [Events, Options], |
Extends: MovieList, |
||||
|
|
||||
options: { |
media_type: 'show', |
||||
navigation: true, |
list_key: 'shows' |
||||
limit: 50, |
|
||||
load_more: true, |
|
||||
loader: true, |
|
||||
menu: [], |
|
||||
add_new: false, |
|
||||
force_view: false |
|
||||
}, |
|
||||
|
|
||||
movies: [], |
|
||||
movies_added: {}, |
|
||||
total_movies: 0, |
|
||||
letters: {}, |
|
||||
filter: null, |
|
||||
|
|
||||
initialize: function(options){ |
|
||||
var self = this; |
|
||||
self.setOptions(options); |
|
||||
|
|
||||
self.offset = 0; |
|
||||
self.filter = self.options.filter || { |
|
||||
'starts_with': null, |
|
||||
'search': null |
|
||||
}; |
|
||||
|
|
||||
self.el = new Element('div.shows').adopt( |
|
||||
self.title = self.options.title ? new Element('h2', { |
|
||||
'text': self.options.title, |
|
||||
'styles': {'display': 'none'} |
|
||||
}) : null, |
|
||||
self.description = self.options.description ? new Element('div.description', { |
|
||||
'html': self.options.description, |
|
||||
'styles': {'display': 'none'} |
|
||||
}) : null, |
|
||||
self.movie_list = new Element('div.list'), |
|
||||
self.load_more = self.options.load_more ? new Element('a.load_more', { |
|
||||
'events': { |
|
||||
'click': self.loadMore.bind(self) |
|
||||
} |
|
||||
}) : null |
|
||||
); |
|
||||
|
|
||||
if($(window).getSize().x <= 480 && !self.options.force_view) |
|
||||
self.changeView('list'); |
|
||||
else |
|
||||
self.changeView(self.getSavedView() || self.options.view || 'details'); |
|
||||
|
|
||||
self.getMovies(); |
|
||||
|
|
||||
App.on('movie.added', self.movieAdded.bind(self)); |
|
||||
App.on('movie.deleted', self.movieDeleted.bind(self)) |
|
||||
}, |
|
||||
|
|
||||
movieDeleted: function(notification){ |
|
||||
var self = this; |
|
||||
|
|
||||
if(self.movies_added[notification.data._id]){ |
|
||||
self.movies.each(function(movie){ |
|
||||
if(movie.get('_id') == notification.data._id){ |
|
||||
movie.destroy(); |
|
||||
delete self.movies_added[notification.data._id]; |
|
||||
self.setCounter(self.counter_count-1); |
|
||||
self.total_movies--; |
|
||||
} |
|
||||
}) |
|
||||
} |
|
||||
|
|
||||
self.checkIfEmpty(); |
|
||||
}, |
|
||||
|
|
||||
movieAdded: function(notification){ |
|
||||
var self = this; |
|
||||
|
|
||||
self.fireEvent('movieAdded', notification); |
|
||||
if(self.options.add_new && !self.movies_added[notification.data._id] && notification.data.status == self.options.status){ |
|
||||
window.scroll(0,0); |
|
||||
self.createShow(notification.data, 'top'); |
|
||||
self.setCounter(self.counter_count+1); |
|
||||
|
|
||||
self.checkIfEmpty(); |
|
||||
} |
|
||||
}, |
|
||||
|
|
||||
create: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
// Create the alphabet nav
|
|
||||
if(self.options.navigation) |
|
||||
self.createNavigation(); |
|
||||
|
|
||||
if(self.options.load_more) |
|
||||
self.scrollspy = new ScrollSpy({ |
|
||||
min: function(){ |
|
||||
var c = self.load_more.getCoordinates(); |
|
||||
return c.top - window.document.getSize().y - 300 |
|
||||
}, |
|
||||
onEnter: self.loadMore.bind(self) |
|
||||
}); |
|
||||
|
|
||||
self.created = true; |
|
||||
}, |
|
||||
|
|
||||
addMovies: function(movies, total){ |
|
||||
var self = this; |
|
||||
|
|
||||
if(!self.created) self.create(); |
|
||||
|
|
||||
// do scrollspy
|
|
||||
if(movies.length < self.options.limit && self.scrollspy){ |
|
||||
self.load_more.hide(); |
|
||||
self.scrollspy.stop(); |
|
||||
} |
|
||||
|
|
||||
Object.each(movies, function(movie){ |
|
||||
self.createShow(movie); |
|
||||
}); |
|
||||
|
|
||||
self.total_movies += total; |
|
||||
self.setCounter(total); |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
setCounter: function(count){ |
|
||||
var self = this; |
|
||||
|
|
||||
if(!self.navigation_counter) return; |
|
||||
|
|
||||
self.counter_count = count; |
|
||||
self.navigation_counter.set('text', (count || 0) + ' shows'); |
|
||||
|
|
||||
if (self.empty_message) { |
|
||||
self.empty_message.destroy(); |
|
||||
self.empty_message = null; |
|
||||
} |
|
||||
|
|
||||
if(self.total_movies && count == 0 && !self.empty_message){ |
|
||||
var message = (self.filter.search ? 'for "'+self.filter.search+'"' : '') + |
|
||||
(self.filter.starts_with ? ' in <strong>'+self.filter.starts_with+'</strong>' : ''); |
|
||||
|
|
||||
self.empty_message = new Element('.message', { |
|
||||
'html': 'No shows found ' + message + '.<br/>' |
|
||||
}).grab( |
|
||||
new Element('a', { |
|
||||
'text': 'Reset filter', |
|
||||
'events': { |
|
||||
'click': function(){ |
|
||||
self.filter = { |
|
||||
'starts_with': null, |
|
||||
'search': null |
|
||||
}; |
|
||||
self.navigation_search_input.set('value', ''); |
|
||||
self.reset(); |
|
||||
self.activateLetter(); |
|
||||
self.getMovies(true); |
|
||||
self.last_search_value = ''; |
|
||||
} |
|
||||
} |
|
||||
}) |
|
||||
).inject(self.movie_list); |
|
||||
|
|
||||
} |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
createShow: function(show, inject_at){ |
|
||||
var self = this; |
|
||||
var m = new Show(self, { |
|
||||
'actions': self.options.actions, |
|
||||
'view': self.current_view, |
|
||||
'onSelect': self.calculateSelected.bind(self) |
|
||||
}, show); |
|
||||
|
|
||||
$(m).inject(self.movie_list, inject_at || 'bottom'); |
|
||||
|
|
||||
m.fireEvent('injected'); |
|
||||
|
|
||||
self.movies.include(m); |
|
||||
self.movies_added[show._id] = true; |
|
||||
}, |
|
||||
|
|
||||
createNavigation: function(){ |
|
||||
var self = this; |
|
||||
var chars = '#ABCDEFGHIJKLMNOPQRSTUVWXYZ'; |
|
||||
|
|
||||
self.el.addClass('with_navigation'); |
|
||||
|
|
||||
self.navigation = new Element('div.alph_nav').adopt( |
|
||||
self.mass_edit_form = new Element('div.mass_edit_form').adopt( |
|
||||
new Element('span.select').adopt( |
|
||||
self.mass_edit_select = new Element('input[type=checkbox].inlay', { |
|
||||
'events': { |
|
||||
'change': self.massEditToggleAll.bind(self) |
|
||||
} |
|
||||
}), |
|
||||
self.mass_edit_selected = new Element('span.count', {'text': 0}), |
|
||||
self.mass_edit_selected_label = new Element('span', {'text': 'selected'}) |
|
||||
), |
|
||||
new Element('div.quality').adopt( |
|
||||
self.mass_edit_quality = new Element('select'), |
|
||||
new Element('a.button.orange', { |
|
||||
'text': 'Change quality', |
|
||||
'events': { |
|
||||
'click': self.changeQualitySelected.bind(self) |
|
||||
} |
|
||||
}) |
|
||||
), |
|
||||
new Element('div.delete').adopt( |
|
||||
new Element('span[text=or]'), |
|
||||
new Element('a.button.red', { |
|
||||
'text': 'Delete', |
|
||||
'events': { |
|
||||
'click': self.deleteSelected.bind(self) |
|
||||
} |
|
||||
}) |
|
||||
), |
|
||||
new Element('div.refresh').adopt( |
|
||||
new Element('span[text=or]'), |
|
||||
new Element('a.button.green', { |
|
||||
'text': 'Refresh', |
|
||||
'events': { |
|
||||
'click': self.refreshSelected.bind(self) |
|
||||
} |
|
||||
}) |
|
||||
) |
|
||||
), |
|
||||
new Element('div.menus').adopt( |
|
||||
self.navigation_counter = new Element('span.counter[title=Total]'), |
|
||||
self.filter_menu = new Block.Menu(self, { |
|
||||
'class': 'filter' |
|
||||
}), |
|
||||
self.navigation_actions = new Element('ul.actions', { |
|
||||
'events': { |
|
||||
'click:relay(li)': function(e, el){ |
|
||||
var a = 'active'; |
|
||||
self.navigation_actions.getElements('.'+a).removeClass(a); |
|
||||
self.changeView(el.get('data-view')); |
|
||||
this.addClass(a); |
|
||||
|
|
||||
el.inject(el.getParent(), 'top'); |
|
||||
el.getSiblings().hide(); |
|
||||
setTimeout(function(){ |
|
||||
el.getSiblings().setStyle('display', null); |
|
||||
}, 100) |
|
||||
} |
|
||||
} |
|
||||
}), |
|
||||
self.navigation_menu = new Block.Menu(self, { |
|
||||
'class': 'extra' |
|
||||
}) |
|
||||
) |
|
||||
).inject(self.el, 'top'); |
|
||||
|
|
||||
// Mass edit
|
|
||||
self.mass_edit_select_class = new Form.Check(self.mass_edit_select); |
|
||||
Quality.getActiveProfiles().each(function(profile){ |
|
||||
new Element('option', { |
|
||||
'value': profile.get('_id'), |
|
||||
'text': profile.get('label') |
|
||||
}).inject(self.mass_edit_quality) |
|
||||
}); |
|
||||
|
|
||||
self.filter_menu.addLink( |
|
||||
self.navigation_search_input = new Element('input', { |
|
||||
'title': 'Search through ' + self.options.identifier, |
|
||||
'placeholder': 'Search through ' + self.options.identifier, |
|
||||
'events': { |
|
||||
'keyup': self.search.bind(self), |
|
||||
'change': self.search.bind(self) |
|
||||
} |
|
||||
}) |
|
||||
).addClass('search'); |
|
||||
|
|
||||
var available_chars; |
|
||||
self.filter_menu.addEvent('open', function(){ |
|
||||
self.navigation_search_input.focus(); |
|
||||
|
|
||||
// Get available chars and highlight
|
|
||||
if(!available_chars && (self.navigation.isDisplayed() || self.navigation.isVisible())) |
|
||||
Api.request('media.available_chars', { |
|
||||
'data': Object.merge({ |
|
||||
'type': 'show', |
|
||||
'status': self.options.status |
|
||||
}, self.filter), |
|
||||
'onSuccess': function(json){ |
|
||||
available_chars = json.chars; |
|
||||
|
|
||||
available_chars.each(function(c){ |
|
||||
self.letters[c.capitalize()].addClass('available') |
|
||||
}) |
|
||||
|
|
||||
} |
|
||||
}); |
|
||||
}); |
|
||||
|
|
||||
self.filter_menu.addLink( |
|
||||
self.navigation_alpha = new Element('ul.numbers', { |
|
||||
'events': { |
|
||||
'click:relay(li.available)': function(e, el){ |
|
||||
self.activateLetter(el.get('data-letter')); |
|
||||
self.getMovies(true) |
|
||||
} |
|
||||
} |
|
||||
}) |
|
||||
); |
|
||||
|
|
||||
// Actions
|
|
||||
['mass_edit', 'details', 'list'].each(function(view){ |
|
||||
var current = self.current_view == view; |
|
||||
new Element('li', { |
|
||||
'class': 'icon2 ' + view + (current ? ' active ' : ''), |
|
||||
'data-view': view |
|
||||
}).inject(self.navigation_actions, current ? 'top' : 'bottom'); |
|
||||
}); |
|
||||
|
|
||||
// All
|
|
||||
self.letters['all'] = new Element('li.letter_all.available.active', { |
|
||||
'text': 'ALL' |
|
||||
}).inject(self.navigation_alpha); |
|
||||
|
|
||||
// Chars
|
|
||||
chars.split('').each(function(c){ |
|
||||
self.letters[c] = new Element('li', { |
|
||||
'text': c, |
|
||||
'class': 'letter_'+c, |
|
||||
'data-letter': c |
|
||||
}).inject(self.navigation_alpha); |
|
||||
}); |
|
||||
|
|
||||
// Add menu or hide
|
|
||||
if (self.options.menu.length > 0) |
|
||||
self.options.menu.each(function(menu_item){ |
|
||||
self.navigation_menu.addLink(menu_item); |
|
||||
}); |
|
||||
else |
|
||||
self.navigation_menu.hide(); |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
calculateSelected: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
var selected = 0, |
|
||||
movies = self.movies.length; |
|
||||
self.movies.each(function(movie){ |
|
||||
selected += movie.isSelected() ? 1 : 0 |
|
||||
}); |
|
||||
|
|
||||
var indeterminate = selected > 0 && selected < movies, |
|
||||
checked = selected == movies && selected > 0; |
|
||||
|
|
||||
self.mass_edit_select.set('indeterminate', indeterminate); |
|
||||
|
|
||||
self.mass_edit_select_class[checked ? 'check' : 'uncheck'](); |
|
||||
self.mass_edit_select_class.element[indeterminate ? 'addClass' : 'removeClass']('indeterminate'); |
|
||||
|
|
||||
self.mass_edit_selected.set('text', selected); |
|
||||
}, |
|
||||
|
|
||||
deleteSelected: function(){ |
|
||||
var self = this, |
|
||||
ids = self.getSelectedMovies(), |
|
||||
help_msg = self.identifier == 'wanted' ? 'If you do, you won\'t be able to watch them, as they won\'t get downloaded!' : 'Your files will be safe, this will only delete the reference from the CouchPotato manage list'; |
|
||||
|
|
||||
var qObj = new Question('Are you sure you want to delete '+ids.length+' movie'+ (ids.length != 1 ? 's' : '') +'?', help_msg, [{ |
|
||||
'text': 'Yes, delete '+(ids.length != 1 ? 'them' : 'it'), |
|
||||
'class': 'delete', |
|
||||
'events': { |
|
||||
'click': function(e){ |
|
||||
(e).preventDefault(); |
|
||||
this.set('text', 'Deleting..'); |
|
||||
Api.request('media.delete', { |
|
||||
'method': 'post', |
|
||||
'data': { |
|
||||
'id': ids.join(','), |
|
||||
'delete_from': self.options.identifier |
|
||||
}, |
|
||||
'onSuccess': function(){ |
|
||||
qObj.close(); |
|
||||
|
|
||||
var erase_movies = []; |
|
||||
self.movies.each(function(movie){ |
|
||||
if (movie.isSelected()){ |
|
||||
$(movie).destroy(); |
|
||||
erase_movies.include(movie); |
|
||||
} |
|
||||
}); |
|
||||
|
|
||||
erase_movies.each(function(movie){ |
|
||||
self.movies.erase(movie); |
|
||||
movie.destroy(); |
|
||||
self.setCounter(self.counter_count-1); |
|
||||
self.total_movies--; |
|
||||
}); |
|
||||
|
|
||||
self.calculateSelected(); |
|
||||
} |
|
||||
}); |
|
||||
|
|
||||
} |
|
||||
} |
|
||||
}, { |
|
||||
'text': 'Cancel', |
|
||||
'cancel': true |
|
||||
}]); |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
changeQualitySelected: function(){ |
|
||||
var self = this; |
|
||||
var ids = self.getSelectedMovies(); |
|
||||
|
|
||||
Api.request('movie.edit', { |
|
||||
'method': 'post', |
|
||||
'data': { |
|
||||
'id': ids.join(','), |
|
||||
'profile_id': self.mass_edit_quality.get('value') |
|
||||
}, |
|
||||
'onSuccess': self.search.bind(self) |
|
||||
}); |
|
||||
}, |
|
||||
|
|
||||
refreshSelected: function(){ |
|
||||
var self = this; |
|
||||
var ids = self.getSelectedMovies(); |
|
||||
|
|
||||
Api.request('media.refresh', { |
|
||||
'method': 'post', |
|
||||
'data': { |
|
||||
'id': ids.join(',') |
|
||||
} |
|
||||
}); |
|
||||
}, |
|
||||
|
|
||||
getSelectedMovies: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
var ids = []; |
|
||||
self.movies.each(function(movie){ |
|
||||
if (movie.isSelected()) |
|
||||
ids.include(movie.get('_id')) |
|
||||
}); |
|
||||
|
|
||||
return ids |
|
||||
}, |
|
||||
|
|
||||
massEditToggleAll: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
var select = self.mass_edit_select.get('checked'); |
|
||||
|
|
||||
self.movies.each(function(movie){ |
|
||||
movie.select(select) |
|
||||
}); |
|
||||
|
|
||||
self.calculateSelected() |
|
||||
}, |
|
||||
|
|
||||
reset: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
self.movies = []; |
|
||||
if(self.mass_edit_select) |
|
||||
self.calculateSelected(); |
|
||||
if(self.navigation_alpha) |
|
||||
self.navigation_alpha.getElements('.active').removeClass('active'); |
|
||||
|
|
||||
self.offset = 0; |
|
||||
if(self.scrollspy){ |
|
||||
//self.load_more.show();
|
|
||||
self.scrollspy.start(); |
|
||||
} |
|
||||
}, |
|
||||
|
|
||||
activateLetter: function(letter){ |
|
||||
var self = this; |
|
||||
|
|
||||
self.reset(); |
|
||||
|
|
||||
self.letters[letter || 'all'].addClass('active'); |
|
||||
self.filter.starts_with = letter; |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
changeView: function(new_view){ |
|
||||
var self = this; |
|
||||
|
|
||||
self.el |
|
||||
.removeClass(self.current_view+'_list') |
|
||||
.addClass(new_view+'_list'); |
|
||||
|
|
||||
self.current_view = new_view; |
|
||||
Cookie.write(self.options.identifier+'_view2', new_view, {duration: 1000}); |
|
||||
}, |
|
||||
|
|
||||
getSavedView: function(){ |
|
||||
var self = this; |
|
||||
return Cookie.read(self.options.identifier+'_view2'); |
|
||||
}, |
|
||||
|
|
||||
search: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
if(self.search_timer) clearTimeout(self.search_timer); |
|
||||
self.search_timer = (function(){ |
|
||||
var search_value = self.navigation_search_input.get('value'); |
|
||||
if (search_value == self.last_search_value) return; |
|
||||
|
|
||||
self.reset(); |
|
||||
|
|
||||
self.activateLetter(); |
|
||||
self.filter.search = search_value; |
|
||||
|
|
||||
self.getMovies(true); |
|
||||
|
|
||||
self.last_search_value = search_value; |
|
||||
|
|
||||
}).delay(250); |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
update: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
self.reset(); |
|
||||
self.getMovies(true); |
|
||||
}, |
|
||||
|
|
||||
getMovies: function(reset){ |
|
||||
var self = this; |
|
||||
|
|
||||
if(self.scrollspy){ |
|
||||
self.scrollspy.stop(); |
|
||||
self.load_more.set('text', 'loading...'); |
|
||||
} |
|
||||
|
|
||||
if(self.movies.length == 0 && self.options.loader){ |
|
||||
|
|
||||
self.loader_first = new Element('div.loading').adopt( |
|
||||
new Element('div.message', {'text': self.options.title ? 'Loading \'' + self.options.title + '\'' : 'Loading...'}) |
|
||||
).inject(self.el, 'top'); |
|
||||
|
|
||||
createSpinner(self.loader_first, { |
|
||||
radius: 4, |
|
||||
length: 4, |
|
||||
width: 1 |
|
||||
}); |
|
||||
|
|
||||
self.el.setStyle('min-height', 93); |
|
||||
|
|
||||
} |
|
||||
|
|
||||
Api.request(self.options.api_call || 'media.list', { |
|
||||
'data': Object.merge({ |
|
||||
'type': self.options.type || 'movie', |
|
||||
'status': self.options.status, |
|
||||
'limit_offset': self.options.limit ? self.options.limit + ',' + self.offset : null |
|
||||
}, self.filter), |
|
||||
'onSuccess': function(json){ |
|
||||
|
|
||||
if(reset) |
|
||||
self.movie_list.empty(); |
|
||||
|
|
||||
if(self.loader_first){ |
|
||||
var lf = self.loader_first; |
|
||||
self.loader_first.addClass('hide'); |
|
||||
self.loader_first = null; |
|
||||
setTimeout(function(){ |
|
||||
lf.destroy(); |
|
||||
}, 20000); |
|
||||
self.el.setStyle('min-height', null); |
|
||||
} |
|
||||
|
|
||||
self.store(json.shows); |
|
||||
self.addMovies(json.shows, json.total || json.shows.length); |
|
||||
if(self.scrollspy) { |
|
||||
self.load_more.set('text', 'load more movies'); |
|
||||
self.scrollspy.start(); |
|
||||
} |
|
||||
|
|
||||
self.checkIfEmpty(); |
|
||||
self.fireEvent('loaded'); |
|
||||
} |
|
||||
}); |
|
||||
}, |
|
||||
|
|
||||
loadMore: function(){ |
|
||||
var self = this; |
|
||||
if(self.offset >= self.options.limit) |
|
||||
self.getMovies() |
|
||||
}, |
|
||||
|
|
||||
store: function(movies){ |
|
||||
var self = this; |
|
||||
|
|
||||
self.offset += movies.length; |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
checkIfEmpty: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
var is_empty = self.movies.length == 0 && (self.total_movies == 0 || self.total_movies === undefined); |
|
||||
|
|
||||
if(self.title) |
|
||||
self.title[is_empty ? 'hide' : 'show'](); |
|
||||
|
|
||||
if(self.description) |
|
||||
self.description.setStyle('display', [is_empty ? 'none' : '']); |
|
||||
|
|
||||
if(is_empty && self.options.on_empty_element){ |
|
||||
self.options.on_empty_element.inject(self.loader_first || self.title || self.movie_list, 'after'); |
|
||||
|
|
||||
if(self.navigation) |
|
||||
self.navigation.hide(); |
|
||||
|
|
||||
self.empty_element = self.options.on_empty_element; |
|
||||
} |
|
||||
else if(self.empty_element){ |
|
||||
self.empty_element.destroy(); |
|
||||
|
|
||||
if(self.navigation) |
|
||||
self.navigation.show(); |
|
||||
} |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
toElement: function(){ |
|
||||
return this.el; |
|
||||
} |
|
||||
|
|
||||
}); |
}); |
||||
|
@ -0,0 +1,56 @@ |
|||||
|
Page.Shows = new Class({ |
||||
|
|
||||
|
Extends: PageBase, |
||||
|
|
||||
|
name: 'shows', |
||||
|
icon: 'show', |
||||
|
sub_pages: ['Wanted'], |
||||
|
default_page: 'Wanted', |
||||
|
current_page: null, |
||||
|
|
||||
|
initialize: function(parent, options){ |
||||
|
var self = this; |
||||
|
self.parent(parent, options); |
||||
|
|
||||
|
self.navigation = new BlockNavigation(); |
||||
|
$(self.navigation).inject(self.content, 'top'); |
||||
|
|
||||
|
App.on('shows.enabled', self.toggleShows.bind(self)); |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
defaultAction: function(action, params){ |
||||
|
var self = this; |
||||
|
|
||||
|
if(self.current_page){ |
||||
|
self.current_page.hide(); |
||||
|
|
||||
|
if(self.current_page.list && self.current_page.list.navigation) |
||||
|
self.current_page.list.navigation.dispose(); |
||||
|
} |
||||
|
|
||||
|
var route = new Route(); |
||||
|
route.parse(action); |
||||
|
|
||||
|
var page_name = route.getPage() != 'index' ? route.getPage().capitalize() : self.default_page; |
||||
|
|
||||
|
var page = self.sub_pages.filter(function(page){ |
||||
|
return page.name == page_name; |
||||
|
}).pick()['class']; |
||||
|
|
||||
|
page.open(route.getAction() || 'index', params); |
||||
|
page.show(); |
||||
|
|
||||
|
if(page.list && page.list.navigation) |
||||
|
page.list.navigation.inject(self.navigation); |
||||
|
|
||||
|
self.current_page = page; |
||||
|
self.navigation.activate(page_name.toLowerCase()); |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
toggleShows: function(notification) { |
||||
|
document.body[notification.data === true ? 'addClass' : 'removeClass']('show_support'); |
||||
|
} |
||||
|
|
||||
|
}); |
@ -1,230 +1,7 @@ |
|||||
Block.Search.ShowItem = new Class({ |
var BlockSearchShowItem = new Class({ |
||||
|
|
||||
Implements: [Options, Events], |
Extends: BlockSearchMovieItem, |
||||
|
|
||||
initialize: function(info, options){ |
media_type: 'movie' |
||||
var self = this; |
|
||||
self.setOptions(options); |
|
||||
|
|
||||
self.info = info; |
|
||||
self.alternative_titles = []; |
|
||||
|
|
||||
self.create(); |
|
||||
}, |
|
||||
|
|
||||
create: function(){ |
|
||||
var self = this, |
|
||||
info = self.info; |
|
||||
|
|
||||
self.el = new Element('div.media_result', { |
|
||||
'id': info.id |
|
||||
}).adopt( |
|
||||
self.thumbnail = info.images && info.images.poster.length > 0 ? new Element('img.thumbnail', { |
|
||||
'src': info.images.poster[0], |
|
||||
'height': null, |
|
||||
'width': null |
|
||||
}) : null, |
|
||||
self.options_el = new Element('div.options.inlay'), |
|
||||
self.data_container = new Element('div.data', { |
|
||||
'events': { |
|
||||
'click': self.showOptions.bind(self) |
|
||||
} |
|
||||
}).adopt( |
|
||||
self.info_container = new Element('div.info').adopt( |
|
||||
new Element('h2').adopt( |
|
||||
self.title = new Element('span.title', { |
|
||||
'text': info.titles && info.titles.length > 0 ? info.titles[0] : 'Unknown' |
|
||||
}), |
|
||||
self.year = info.year ? new Element('span.year', { |
|
||||
'text': info.year |
|
||||
}) : null |
|
||||
) |
|
||||
) |
|
||||
) |
|
||||
) |
|
||||
|
|
||||
if(info.titles) |
|
||||
info.titles.each(function(title){ |
|
||||
self.alternativeTitle({ |
|
||||
'title': title |
|
||||
}); |
|
||||
}) |
|
||||
}, |
|
||||
|
|
||||
alternativeTitle: function(alternative){ |
|
||||
var self = this; |
|
||||
|
|
||||
self.alternative_titles.include(alternative); |
|
||||
}, |
|
||||
|
|
||||
getTitle: function(){ |
|
||||
var self = this; |
|
||||
try { |
|
||||
return self.info.original_title ? self.info.original_title : self.info.titles[0]; |
|
||||
} |
|
||||
catch(e){ |
|
||||
return 'Unknown'; |
|
||||
} |
|
||||
}, |
|
||||
|
|
||||
get: function(key){ |
|
||||
return this.info[key] |
|
||||
}, |
|
||||
|
|
||||
showOptions: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
self.createOptions(); |
|
||||
|
|
||||
self.data_container.addClass('open'); |
|
||||
self.el.addEvent('outerClick', self.closeOptions.bind(self)) |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
closeOptions: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
self.data_container.removeClass('open'); |
|
||||
self.el.removeEvents('outerClick') |
|
||||
}, |
|
||||
|
|
||||
add: function(e){ |
|
||||
var self = this; |
|
||||
|
|
||||
if(e) |
|
||||
(e).preventDefault(); |
|
||||
|
|
||||
self.loadingMask(); |
|
||||
|
|
||||
Api.request('show.add', { |
|
||||
'data': { |
|
||||
'identifiers': self.info.identifiers, |
|
||||
'type': self.info.type, |
|
||||
'title': self.title_select.get('value'), |
|
||||
'profile_id': self.profile_select.get('value'), |
|
||||
'category_id': self.category_select.get('value') |
|
||||
}, |
|
||||
'onComplete': function(json){ |
|
||||
self.options_el.empty(); |
|
||||
self.options_el.adopt( |
|
||||
new Element('div.message', { |
|
||||
'text': json.success ? 'Show successfully added.' : 'Show didn\'t add properly. Check logs' |
|
||||
}) |
|
||||
); |
|
||||
self.mask.fade('out'); |
|
||||
|
|
||||
self.fireEvent('added'); |
|
||||
}, |
|
||||
'onFailure': function(){ |
|
||||
self.options_el.empty(); |
|
||||
self.options_el.adopt( |
|
||||
new Element('div.message', { |
|
||||
'text': 'Something went wrong, check the logs for more info.' |
|
||||
}) |
|
||||
); |
|
||||
self.mask.fade('out'); |
|
||||
} |
|
||||
}); |
|
||||
}, |
|
||||
|
|
||||
createOptions: function(){ |
|
||||
var self = this, |
|
||||
info = self.info; |
|
||||
|
|
||||
if(!self.options_el.hasClass('set')){ |
|
||||
|
|
||||
if(self.info.in_library){ |
|
||||
var in_library = []; |
|
||||
self.info.in_library.releases.each(function(release){ |
|
||||
in_library.include(release.quality.label) |
|
||||
}); |
|
||||
} |
|
||||
|
|
||||
self.options_el.grab( |
|
||||
new Element('div', { |
|
||||
'class': self.info.in_wanted && self.info.in_wanted.profile_id || in_library ? 'in_library_wanted' : '' |
|
||||
}).adopt( |
|
||||
self.info.in_wanted && self.info.in_wanted.profile_id ? new Element('span.in_wanted', { |
|
||||
'text': 'Already in wanted list: ' + Quality.getProfile(self.info.in_wanted.profile_id).get('label') |
|
||||
}) : (in_library ? new Element('span.in_library', { |
|
||||
'text': 'Already in library: ' + in_library.join(', ') |
|
||||
}) : null), |
|
||||
self.title_select = new Element('select', { |
|
||||
'name': 'title' |
|
||||
}), |
|
||||
self.profile_select = new Element('select', { |
|
||||
'name': 'profile' |
|
||||
}), |
|
||||
self.category_select = new Element('select', { |
|
||||
'name': 'category' |
|
||||
}).grab( |
|
||||
new Element('option', {'value': -1, 'text': 'None'}) |
|
||||
), |
|
||||
self.add_button = new Element('a.button', { |
|
||||
'text': 'Add', |
|
||||
'events': { |
|
||||
'click': self.add.bind(self) |
|
||||
} |
|
||||
}) |
|
||||
) |
|
||||
); |
|
||||
|
|
||||
Array.each(self.alternative_titles, function(alt){ |
|
||||
new Element('option', { |
|
||||
'text': alt.title |
|
||||
}).inject(self.title_select) |
|
||||
}) |
|
||||
|
|
||||
|
|
||||
// Fill categories
|
|
||||
var categories = CategoryList.getAll(); |
|
||||
|
|
||||
if(categories.length == 0) |
|
||||
self.category_select.hide(); |
|
||||
else { |
|
||||
self.category_select.show(); |
|
||||
categories.each(function(category){ |
|
||||
new Element('option', { |
|
||||
'value': category.data._id, |
|
||||
'text': category.data.label |
|
||||
}).inject(self.category_select); |
|
||||
}); |
|
||||
} |
|
||||
|
|
||||
// Fill profiles
|
|
||||
var profiles = Quality.getActiveProfiles(); |
|
||||
if(profiles.length == 1) |
|
||||
self.profile_select.hide(); |
|
||||
|
|
||||
profiles.each(function(profile){ |
|
||||
new Element('option', { |
|
||||
'value': profile.get('_id'), |
|
||||
'text': profile.get('label') |
|
||||
}).inject(self.profile_select) |
|
||||
}); |
|
||||
|
|
||||
self.options_el.addClass('set'); |
|
||||
|
|
||||
if(categories.length == 0 && self.title_select.getElements('option').length == 1 && profiles.length == 1 && |
|
||||
!(self.info.in_wanted && self.info.in_wanted.profile_id || in_library)) |
|
||||
self.add(); |
|
||||
|
|
||||
} |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
loadingMask: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
self.mask = new Element('div.mask').inject(self.el).fade('hide') |
|
||||
|
|
||||
createSpinner(self.mask) |
|
||||
self.mask.fade('in') |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
toElement: function(){ |
|
||||
return this.el |
|
||||
} |
|
||||
|
|
||||
}); |
}); |
||||
|
@ -1,370 +1,5 @@ |
|||||
var Show = new Class({ |
var Show = new Class({ |
||||
|
|
||||
Extends: BlockBase, |
Extends: Movie |
||||
|
|
||||
action: {}, |
|
||||
|
|
||||
initialize: function(list, options, data){ |
|
||||
var self = this; |
|
||||
|
|
||||
self.data = data; |
|
||||
self.view = options.view || 'details'; |
|
||||
self.list = list; |
|
||||
|
|
||||
self.el = new Element('div.show'); |
|
||||
|
|
||||
self.episodes = new Episodes(self, { |
|
||||
'actions': [EA.IMDB, EA.Release, EA.Refresh] |
|
||||
}); |
|
||||
|
|
||||
self.profile = Quality.getProfile(data.profile_id) || {}; |
|
||||
self.category = CategoryList.getCategory(data.category_id) || {}; |
|
||||
self.parent(self, options); |
|
||||
|
|
||||
self.addEvents(); |
|
||||
}, |
|
||||
|
|
||||
addEvents: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
self.global_events = {}; |
|
||||
|
|
||||
// Do refresh with new data
|
|
||||
self.global_events['movie.update'] = function(notification){ |
|
||||
if(self.data._id != notification.data._id) return; |
|
||||
|
|
||||
self.busy(false); |
|
||||
self.removeView(); |
|
||||
self.update.delay(2000, self, notification); |
|
||||
}; |
|
||||
App.on('movie.update', self.global_events['movie.update']); |
|
||||
|
|
||||
// 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))) |
|
||||
self.busy(true); |
|
||||
}; |
|
||||
App.on(listener, self.global_events[listener]); |
|
||||
}); |
|
||||
|
|
||||
// Remove spinner
|
|
||||
self.global_events['movie.searcher.ended'] = function(notification){ |
|
||||
if(notification.data && self.data._id == notification.data._id) |
|
||||
self.busy(false) |
|
||||
}; |
|
||||
App.on('movie.searcher.ended', self.global_events['movie.searcher.ended']); |
|
||||
|
|
||||
// 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(!self.data.releases) |
|
||||
self.data.releases = []; |
|
||||
|
|
||||
self.data.releases.push({'quality': data.quality, 'status': data.status}); |
|
||||
self.updateReleases(); |
|
||||
} |
|
||||
}; |
|
||||
|
|
||||
App.on('release.update_status', self.global_events['release.update_status']); |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
destroy: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
self.el.destroy(); |
|
||||
delete self.list.movies_added[self.get('id')]; |
|
||||
self.list.movies.erase(self); |
|
||||
|
|
||||
self.list.checkIfEmpty(); |
|
||||
|
|
||||
// Remove events
|
|
||||
Object.each(self.global_events, function(handle, listener){ |
|
||||
App.off(listener, handle); |
|
||||
}); |
|
||||
}, |
|
||||
|
|
||||
busy: function(set_busy, timeout){ |
|
||||
var self = this; |
|
||||
|
|
||||
if(!set_busy){ |
|
||||
setTimeout(function(){ |
|
||||
if(self.spinner){ |
|
||||
self.mask.fade('out'); |
|
||||
setTimeout(function(){ |
|
||||
if(self.mask) |
|
||||
self.mask.destroy(); |
|
||||
if(self.spinner) |
|
||||
self.spinner.el.destroy(); |
|
||||
self.spinner = null; |
|
||||
self.mask = null; |
|
||||
}, timeout || 400); |
|
||||
} |
|
||||
}, timeout || 1000) |
|
||||
} |
|
||||
else if(!self.spinner) { |
|
||||
self.createMask(); |
|
||||
self.spinner = createSpinner(self.mask); |
|
||||
self.mask.fade('in'); |
|
||||
} |
|
||||
}, |
|
||||
|
|
||||
createMask: function(){ |
|
||||
var self = this; |
|
||||
self.mask = new Element('div.mask', { |
|
||||
'styles': { |
|
||||
'z-index': 4 |
|
||||
} |
|
||||
}).inject(self.el, 'top').fade('hide'); |
|
||||
}, |
|
||||
|
|
||||
update: function(notification){ |
|
||||
var self = this; |
|
||||
|
|
||||
self.data = notification.data; |
|
||||
self.el.empty(); |
|
||||
self.removeView(); |
|
||||
|
|
||||
self.profile = Quality.getProfile(self.data.profile_id) || {}; |
|
||||
self.category = CategoryList.getCategory(self.data.category_id) || {}; |
|
||||
self.create(); |
|
||||
|
|
||||
self.busy(false); |
|
||||
}, |
|
||||
|
|
||||
create: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
self.el.addClass('status_'+self.get('status')); |
|
||||
|
|
||||
var eta = null, |
|
||||
eta_date = null, |
|
||||
now = Math.round(+new Date()/1000); |
|
||||
|
|
||||
if(self.data.info.release_date) |
|
||||
[self.data.info.release_date.dvd, self.data.info.release_date.theater].each(function(timestamp){ |
|
||||
if (timestamp > 0 && (eta == null || Math.abs(timestamp - now) < Math.abs(eta - now))) |
|
||||
eta = timestamp; |
|
||||
}); |
|
||||
|
|
||||
if(eta){ |
|
||||
eta_date = new Date(eta * 1000); |
|
||||
eta_date = eta_date.toLocaleString('en-us', { month: "long" }) + ' ' + eta_date.getFullYear(); |
|
||||
} |
|
||||
|
|
||||
self.el.adopt( |
|
||||
self.select_checkbox = new Element('input[type=checkbox].inlay', { |
|
||||
'events': { |
|
||||
'change': function(){ |
|
||||
self.fireEvent('select') |
|
||||
} |
|
||||
} |
|
||||
}), |
|
||||
self.thumbnail = (self.data.files && self.data.files.image_poster) ? new Element('img', { |
|
||||
'class': 'type_image poster', |
|
||||
'src': Api.createUrl('file.cache') + self.data.files.image_poster[0].split(Api.getOption('path_sep')).pop() |
|
||||
}): null, |
|
||||
self.data_container = new Element('div.data.inlay.light').adopt( |
|
||||
self.info_container = new Element('div.info').adopt( |
|
||||
new Element('div.title').adopt( |
|
||||
self.title = new Element('a', { |
|
||||
'events': { |
|
||||
'click': function(e){ |
|
||||
self.episodes.open(); |
|
||||
} |
|
||||
}, |
|
||||
'text': self.getTitle() || 'n/a' |
|
||||
}), |
|
||||
self.year = new Element('div.year', { |
|
||||
'text': self.data.info.year || 'n/a' |
|
||||
}) |
|
||||
), |
|
||||
self.description = new Element('div.description.tiny_scroll', { |
|
||||
'text': self.data.info.plot |
|
||||
}), |
|
||||
self.eta = eta_date && (now+8035200 > eta) ? new Element('div.eta', { |
|
||||
'text': eta_date, |
|
||||
'title': 'ETA' |
|
||||
}) : null, |
|
||||
self.quality = new Element('div.quality', { |
|
||||
'events': { |
|
||||
'click': function(e){ |
|
||||
var releases = self.el.getElement('.actions .releases'); |
|
||||
if(releases.isVisible()) |
|
||||
releases.fireEvent('click', [e]) |
|
||||
} |
|
||||
} |
|
||||
}) |
|
||||
), |
|
||||
self.actions = new Element('div.actions') |
|
||||
) |
|
||||
); |
|
||||
|
|
||||
if(!self.thumbnail) |
|
||||
self.el.addClass('no_thumbnail'); |
|
||||
|
|
||||
//self.changeView(self.view);
|
|
||||
self.select_checkbox_class = new Form.Check(self.select_checkbox); |
|
||||
|
|
||||
// Add profile
|
|
||||
if(self.profile.data) |
|
||||
self.profile.getTypes().each(function(type){ |
|
||||
|
|
||||
var q = self.addQuality(type.get('quality'), type.get('3d')); |
|
||||
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.') |
|
||||
} |
|
||||
|
|
||||
}); |
|
||||
|
|
||||
// Add releases
|
|
||||
self.updateReleases(); |
|
||||
|
|
||||
Object.each(self.options.actions, function(action, key){ |
|
||||
self.action[key.toLowerCase()] = action = new self.options.actions[key](self); |
|
||||
if(action.el) |
|
||||
self.actions.adopt(action) |
|
||||
}); |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
updateReleases: function(){ |
|
||||
var self = this; |
|
||||
if(!self.data.releases || self.data.releases.length == 0) return; |
|
||||
|
|
||||
self.data.releases.each(function(release){ |
|
||||
|
|
||||
var q = self.quality.getElement('.q_'+ release.quality+(release.is_3d ? '.is_3d' : ':not(.is_3d)')), |
|
||||
status = release.status; |
|
||||
|
|
||||
if(!q && (status == 'snatched' || status == 'seeding' || status == 'done')) |
|
||||
q = self.addQuality(release.quality, release.is_3d || false); |
|
||||
|
|
||||
if (q && !q.hasClass(status)){ |
|
||||
q.addClass(status); |
|
||||
q.set('title', (q.get('title') ? q.get('title') : '') + ' status: '+ status) |
|
||||
} |
|
||||
|
|
||||
}); |
|
||||
}, |
|
||||
|
|
||||
addQuality: function(quality, is_3d){ |
|
||||
var self = this; |
|
||||
|
|
||||
var q = Quality.getQuality(quality); |
|
||||
return new Element('span', { |
|
||||
'text': q.label + (is_3d ? ' 3D' : ''), |
|
||||
'class': 'q_'+q.identifier + (is_3d ? ' is_3d' : ''), |
|
||||
'title': '' |
|
||||
}).inject(self.quality); |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
getTitle: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
if(self.data.title) |
|
||||
return self.getUnprefixedTitle(self.data.title); |
|
||||
else if(self.data.info.titles.length > 0) |
|
||||
return self.getUnprefixedTitle(self.data.info.titles[0]); |
|
||||
|
|
||||
return 'Unknown movie' |
|
||||
}, |
|
||||
|
|
||||
getUnprefixedTitle: function(t){ |
|
||||
if(t.substr(0, 4).toLowerCase() == 'the ') |
|
||||
t = t.substr(4) + ', The'; |
|
||||
else if(t.substr(0, 3).toLowerCase() == 'an ') |
|
||||
t = t.substr(3) + ', An'; |
|
||||
else if(t.substr(0, 2).toLowerCase() == 'a ') |
|
||||
t = t.substr(2) + ', A'; |
|
||||
return t; |
|
||||
}, |
|
||||
|
|
||||
slide: function(direction, el, expand){ |
|
||||
var self = this; |
|
||||
|
|
||||
if(direction == 'in'){ |
|
||||
self.temp_view = self.view; |
|
||||
self.changeView('details'); |
|
||||
|
|
||||
self.el.addEvent('outerClick', function(){ |
|
||||
self.removeView(); |
|
||||
self.slide('out') |
|
||||
}); |
|
||||
el.show(); |
|
||||
|
|
||||
|
|
||||
if(expand === true) { |
|
||||
self.el.addClass('expanded'); |
|
||||
self.el.getElements('.table').addClass('expanded'); |
|
||||
} |
|
||||
|
|
||||
self.data_container.addClass('hide_right'); |
|
||||
} |
|
||||
else { |
|
||||
self.el.removeEvents('outerClick'); |
|
||||
|
|
||||
setTimeout(function(){ |
|
||||
if(self.el) |
|
||||
{ |
|
||||
self.el.getElements('> :not(.data):not(.poster):not(.movie_container)').hide(); |
|
||||
self.el.getElements('.table').removeClass('expanded'); |
|
||||
} |
|
||||
}, 600); |
|
||||
|
|
||||
self.el.removeClass('expanded'); |
|
||||
self.data_container.removeClass('hide_right'); |
|
||||
} |
|
||||
}, |
|
||||
|
|
||||
changeView: function(new_view){ |
|
||||
var self = this; |
|
||||
|
|
||||
if(self.el) |
|
||||
self.el |
|
||||
.removeClass(self.view+'_view') |
|
||||
.addClass(new_view+'_view'); |
|
||||
|
|
||||
self.view = new_view; |
|
||||
}, |
|
||||
|
|
||||
removeView: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
self.el.removeClass(self.view+'_view') |
|
||||
}, |
|
||||
|
|
||||
getIdentifier: function(){ |
|
||||
var self = this; |
|
||||
|
|
||||
try { |
|
||||
return self.get('identifiers').imdb; |
|
||||
} |
|
||||
catch (e){ } |
|
||||
|
|
||||
return self.get('imdb'); |
|
||||
}, |
|
||||
|
|
||||
get: function(attr){ |
|
||||
return this.data[attr] || this.data.info[attr] |
|
||||
}, |
|
||||
|
|
||||
select: function(bool){ |
|
||||
var self = this; |
|
||||
self.select_checkbox_class[bool ? 'check' : 'uncheck']() |
|
||||
}, |
|
||||
|
|
||||
isSelected: function(){ |
|
||||
return this.select_checkbox.get('checked'); |
|
||||
}, |
|
||||
|
|
||||
toElement: function(){ |
|
||||
return this.el; |
|
||||
} |
|
||||
|
|
||||
}); |
}); |
||||
|
@ -0,0 +1,28 @@ |
|||||
|
var ShowsWanted = new Class({ |
||||
|
Extends: PageBase, |
||||
|
|
||||
|
name: 'wanted', |
||||
|
title: 'List of TV Shows subscribed to', |
||||
|
folder_browser: null, |
||||
|
has_tab: false, |
||||
|
|
||||
|
indexAction: function(){ |
||||
|
var self = this; |
||||
|
|
||||
|
if(!self.wanted){ |
||||
|
|
||||
|
// Wanted movies
|
||||
|
self.wanted = new ShowList({ |
||||
|
'identifier': 'wanted', |
||||
|
'status': 'active', |
||||
|
'type': 'show', |
||||
|
'actions': [MA.IMDB, MA.Release, MA.Refresh, MA.Delete], |
||||
|
'add_new': true, |
||||
|
'on_empty_element': App.createUserscriptButtons().addClass('empty_wanted') |
||||
|
}); |
||||
|
$(self.wanted).inject(self.content); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
}); |
File diff suppressed because it is too large
Loading…
Reference in new issue