5 changed files with 510 additions and 39 deletions
@ -0,0 +1,450 @@ |
|||||
|
var EpisodeAction = new Class({ |
||||
|
|
||||
|
Implements: [Options], |
||||
|
|
||||
|
class_name: '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.open.bind(self) |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
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; |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
open: function(e){ |
||||
|
var self = this; |
||||
|
if(e) |
||||
|
(e).preventDefault(); |
||||
|
|
||||
|
self.createReleases(); |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
createReleases: function(){ |
||||
|
var self = this; |
||||
|
|
||||
|
if(!self.releases_container){ |
||||
|
self.releases_container = new Element('div.releases.table').inject(self.episode.el); |
||||
|
|
||||
|
// 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_container); |
||||
|
|
||||
|
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': 'release_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_container); |
||||
|
|
||||
|
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_container.getElements('#release_'+self.last_release._id).addClass('last_release'); |
||||
|
|
||||
|
if(self.next_release) |
||||
|
self.releases_container.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_container, '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(){ |
||||
|
console.log('outerClick'); |
||||
|
|
||||
|
self.releases_container.removeClass('expanded'); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
self.releases_container.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_container.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.show.get('_id') |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
}); |
Loading…
Reference in new issue