Merge branch 'refs/heads/develop' into desktop
This commit is contained in:
commit
1e7fa82e11
750 files changed
+28672
-101971
No files matched your search
@@ -6,7 +6,7 @@ var AboutSettingTab = new Class({
|
||||
initialize: function(){
|
||||
var self = this;
|
||||
|
||||
App.addEvent('load', self.addSettings.bind(self))
|
||||
App.addEvent('loadSettings', self.addSettings.bind(self))
|
||||
|
||||
},
|
||||
|
||||
@@ -124,4 +124,4 @@ var AboutSettingTab = new Class({
|
||||
|
||||
window.addEvent('domready', function(){
|
||||
new AboutSettingTab();
|
||||
});
|
||||
});
|
||||
@@ -21,7 +21,9 @@ Page.Home = new Class({
|
||||
self.chain.chain(
|
||||
self.createAvailable.bind(self),
|
||||
self.createSoon.bind(self),
|
||||
self.createSuggestionsChartsMenu.bind(self),
|
||||
self.createSuggestions.bind(self),
|
||||
self.createCharts.bind(self),
|
||||
self.createLate.bind(self)
|
||||
);
|
||||
|
||||
@@ -52,7 +54,8 @@ Page.Home = new Class({
|
||||
})
|
||||
),
|
||||
'filter': {
|
||||
'release_status': 'snatched,seeding,missing,available,downloaded'
|
||||
'release_status': 'snatched,missing,available,downloaded,done,seeding',
|
||||
'with_tags': 'recent'
|
||||
},
|
||||
'limit': null,
|
||||
'onLoaded': function(){
|
||||
@@ -62,12 +65,12 @@ Page.Home = new Class({
|
||||
|
||||
// Track movie added
|
||||
var after_search = function(data){
|
||||
if(notification.data.id != data.data.id) return;
|
||||
if(notification.data._id != data.data._id) return;
|
||||
|
||||
// Force update after search
|
||||
self.available_list.update();
|
||||
App.off('movie.searcher.ended', after_search);
|
||||
}
|
||||
};
|
||||
App.on('movie.searcher.ended', after_search);
|
||||
|
||||
}
|
||||
@@ -102,14 +105,13 @@ Page.Home = new Class({
|
||||
|
||||
// Make all thumbnails the same size
|
||||
self.soon_list.addEvent('loaded', function(){
|
||||
var images = $(self.soon_list).getElements('.poster'),
|
||||
var images = $(self.soon_list).getElements('.poster, .no_thumbnail'),
|
||||
timer,
|
||||
highest = 100;
|
||||
|
||||
images.each(function(img_container){
|
||||
img_container.getElements('img').addEvent('load', function(){
|
||||
var img = this,
|
||||
height = img.getSize().y;
|
||||
images.each(function(img){
|
||||
img.addEvent('load', function(){
|
||||
var height = img.getSize().y;
|
||||
if(!highest || highest < height){
|
||||
highest = height;
|
||||
if(timer) clearTimeout(timer);
|
||||
@@ -124,10 +126,8 @@ Page.Home = new Class({
|
||||
if(timer) clearTimeout(timer);
|
||||
timer = (function(){
|
||||
var highest = 100;
|
||||
images.each(function(img_container){
|
||||
var img = img_container.getElement('img');
|
||||
if(!img) return
|
||||
|
||||
images.each(function(img){
|
||||
img.setStyle('height', null);
|
||||
var height = img.getSize().y;
|
||||
if(!highest || highest < height)
|
||||
highest = height;
|
||||
@@ -154,7 +154,78 @@ Page.Home = new Class({
|
||||
|
||||
$(self.suggestion_list).inject(self.el);
|
||||
|
||||
},
|
||||
|
||||
createCharts: function(){
|
||||
var self = this;
|
||||
|
||||
// Charts
|
||||
self.charts = new Charts({
|
||||
'onCreated': function(){
|
||||
self.chain.callChain();
|
||||
}
|
||||
});
|
||||
|
||||
$(self.charts).inject(self.el);
|
||||
|
||||
},
|
||||
|
||||
createSuggestionsChartsMenu: function(){
|
||||
var self = this;
|
||||
|
||||
self.el_toggle_menu_suggestions = new Element('a.toggle_suggestions.active', {
|
||||
'href': '#',
|
||||
'events': { 'click': function(e) {
|
||||
e.preventDefault();
|
||||
self.toggleSuggestionsCharts('suggestions');
|
||||
}
|
||||
}
|
||||
}).grab( new Element('h2', {'text': 'Suggestions'}));
|
||||
|
||||
self.el_toggle_menu_charts = new Element('a.toggle_charts', {
|
||||
'href': '#',
|
||||
'events': { 'click': function(e) {
|
||||
e.preventDefault();
|
||||
self.toggleSuggestionsCharts('charts');
|
||||
}
|
||||
}
|
||||
}).grab( new Element('h2', {'text': 'Charts'}));
|
||||
|
||||
self.el_toggle_menu = new Element('div.toggle_menu').grab(
|
||||
self.el_toggle_menu_suggestions
|
||||
).grab(
|
||||
self.el_toggle_menu_charts
|
||||
);
|
||||
|
||||
var menu_selected = Cookie.read('suggestions_charts_menu_selected');
|
||||
if( menu_selected === null ) menu_selected = 'suggestions';
|
||||
self.toggleSuggestionsCharts( menu_selected );
|
||||
|
||||
self.el_toggle_menu.inject(self.el);
|
||||
|
||||
self.chain.callChain();
|
||||
|
||||
},
|
||||
|
||||
toggleSuggestionsCharts: function(menu_id){
|
||||
var self = this;
|
||||
|
||||
switch(menu_id) {
|
||||
case 'suggestions':
|
||||
if($(self.suggestion_list)) $(self.suggestion_list).show();
|
||||
self.el_toggle_menu_suggestions.addClass('active');
|
||||
if($(self.charts)) $(self.charts).hide();
|
||||
self.el_toggle_menu_charts.removeClass('active');
|
||||
break;
|
||||
case 'charts':
|
||||
if($(self.charts)) $(self.charts).show();
|
||||
self.el_toggle_menu_charts.addClass('active');
|
||||
if($(self.suggestion_list)) $(self.suggestion_list).hide();
|
||||
self.el_toggle_menu_suggestions.removeClass('active');
|
||||
break;
|
||||
}
|
||||
|
||||
Cookie.write('suggestions_charts_menu_selected', menu_id, {'duration': 365});
|
||||
},
|
||||
|
||||
createLate: function(){
|
||||
|
||||
@@ -1,147 +0,0 @@
|
||||
Page.Manage = new Class({
|
||||
|
||||
Extends: PageBase,
|
||||
|
||||
name: 'manage',
|
||||
title: 'Do stuff to your existing movies!',
|
||||
|
||||
indexAction: function(){
|
||||
var self = this;
|
||||
|
||||
if(!self.list){
|
||||
self.refresh_button = new Element('a', {
|
||||
'title': 'Rescan your library for new movies',
|
||||
'text': 'Full library refresh',
|
||||
'events':{
|
||||
'click': self.refresh.bind(self, true)
|
||||
}
|
||||
});
|
||||
|
||||
self.refresh_quick = new Element('a', {
|
||||
'title': 'Just scan for recently changed',
|
||||
'text': 'Quick library scan',
|
||||
'events':{
|
||||
'click': self.refresh.bind(self, false)
|
||||
}
|
||||
});
|
||||
|
||||
self.list = new MovieList({
|
||||
'identifier': 'manage',
|
||||
'filter': {
|
||||
'release_status': 'done'
|
||||
},
|
||||
'actions': [MA.IMDB, MA.Trailer, MA.Files, MA.Readd, MA.Edit, MA.Delete],
|
||||
'menu': [self.refresh_button, self.refresh_quick],
|
||||
'on_empty_element': new Element('div.empty_manage').adopt(
|
||||
new Element('div', {
|
||||
'text': 'Seems like you don\'t have anything in your library yet.'
|
||||
}),
|
||||
new Element('div', {
|
||||
'text': 'Add your existing movie folders in '
|
||||
}).adopt(
|
||||
new Element('a', {
|
||||
'text': 'Settings > Manage',
|
||||
'href': App.createUrl('settings/manage')
|
||||
})
|
||||
),
|
||||
new Element('div.after_manage', {
|
||||
'text': 'When you\'ve done that, hit this button → '
|
||||
}).adopt(
|
||||
new Element('a.button.green', {
|
||||
'text': 'Hit me, but not too hard',
|
||||
'events':{
|
||||
'click': self.refresh.bind(self, true)
|
||||
}
|
||||
})
|
||||
)
|
||||
)
|
||||
});
|
||||
$(self.list).inject(self.el);
|
||||
|
||||
// Check if search is in progress
|
||||
self.startProgressInterval();
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
refresh: function(full){
|
||||
var self = this;
|
||||
|
||||
if(!self.update_in_progress){
|
||||
|
||||
Api.request('manage.update', {
|
||||
'data': {
|
||||
'full': +full
|
||||
}
|
||||
});
|
||||
|
||||
self.startProgressInterval();
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
startProgressInterval: function(){
|
||||
var self = this;
|
||||
|
||||
self.progress_interval = setInterval(function(){
|
||||
|
||||
if(self.progress_request && self.progress_request.running)
|
||||
return;
|
||||
|
||||
self.update_in_progress = true;
|
||||
self.progress_request = Api.request('manage.progress', {
|
||||
'onComplete': function(json){
|
||||
|
||||
if(!json || !json.progress){
|
||||
clearInterval(self.progress_interval);
|
||||
self.update_in_progress = false;
|
||||
if(self.progress_container){
|
||||
self.progress_container.destroy();
|
||||
self.list.update();
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Capture progress so we can use it in our *each* closure
|
||||
var progress = json.progress
|
||||
|
||||
// Don't add loader when page is loading still
|
||||
if(!self.list.navigation)
|
||||
return;
|
||||
|
||||
if(!self.progress_container)
|
||||
self.progress_container = new Element('div.progress').inject(self.list.navigation, 'after');
|
||||
|
||||
self.progress_container.empty();
|
||||
|
||||
var sorted_table = self.parseProgress(json.progress)
|
||||
|
||||
sorted_table.each(function(folder){
|
||||
var folder_progress = progress[folder]
|
||||
new Element('div').adopt(
|
||||
new Element('span.folder', {'text': folder +
|
||||
(folder_progress.eta > 0 ? ', ' + new Date ().increment('second', folder_progress.eta).timeDiffInWords().replace('from now', 'to go') : '')
|
||||
}),
|
||||
new Element('span.percentage', {'text': folder_progress.total ? (((folder_progress.total-folder_progress.to_go)/folder_progress.total)*100).round() + '%' : '0%'})
|
||||
).inject(self.progress_container)
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
}, 1000);
|
||||
},
|
||||
|
||||
parseProgress: function (progress_object) {
|
||||
var folder, temp_array = [];
|
||||
|
||||
for (folder in progress_object) {
|
||||
if (progress_object.hasOwnProperty(folder)) {
|
||||
temp_array.push(folder)
|
||||
}
|
||||
}
|
||||
return temp_array.stableSort()
|
||||
}
|
||||
|
||||
});
|
||||
@@ -2,6 +2,7 @@ Page.Settings = new Class({
|
||||
|
||||
Extends: PageBase,
|
||||
|
||||
order: 50,
|
||||
name: 'settings',
|
||||
title: 'Change settings.',
|
||||
wizard_only: false,
|
||||
@@ -26,8 +27,8 @@ Page.Settings = new Class({
|
||||
},
|
||||
|
||||
openTab: function(action){
|
||||
var self = this;
|
||||
var action = (action == 'index' ? 'about' : action) || self.action;
|
||||
var self = this,
|
||||
action = (action == 'index' ? 'about' : action) || self.action;
|
||||
|
||||
if(self.current)
|
||||
self.toggleTab(self.current, true);
|
||||
@@ -112,14 +113,20 @@ Page.Settings = new Class({
|
||||
},
|
||||
|
||||
sortByOrder: function(a, b){
|
||||
return (a.order || 100) - (b.order || 100)
|
||||
return (a.order || 100) - (b.order || 100)
|
||||
},
|
||||
|
||||
create: function(json){
|
||||
var self = this;
|
||||
|
||||
self.tabs_container = new Element('ul.tabs');
|
||||
self.containers = new Element('form.uniForm.containers').adopt(
|
||||
self.containers = new Element('form.uniForm.containers', {
|
||||
'events': {
|
||||
'click:relay(.enabler.disabled h2)': function(e, el){
|
||||
el.getPrevious().getElements('.check').fireEvent('click');
|
||||
}
|
||||
}
|
||||
}).adopt(
|
||||
new Element('label.advanced_toggle').adopt(
|
||||
new Element('span', {
|
||||
'text': 'Show advanced settings'
|
||||
@@ -284,14 +291,23 @@ Page.Settings = new Class({
|
||||
})
|
||||
}
|
||||
|
||||
var icon;
|
||||
if(group.icon){
|
||||
icon = new Element('span.icon').grab(new Element('img', {
|
||||
'src': 'data:image/png;base64,' + group.icon
|
||||
}));
|
||||
}
|
||||
|
||||
var label = new Element('span.group_label', {
|
||||
'text': group.label || (group.name).capitalize()
|
||||
})
|
||||
|
||||
return new Element('fieldset', {
|
||||
'class': (group.advanced ? 'inlineLabels advanced' : 'inlineLabels') + ' group_' + (group.name || '') + ' subtab_' + (group.subtab || '')
|
||||
}).grab(
|
||||
new Element('h2', {
|
||||
'text': group.label || (group.name).capitalize()
|
||||
}).grab(hint)
|
||||
);
|
||||
new Element('h2').adopt(icon, label, hint)
|
||||
);
|
||||
|
||||
},
|
||||
|
||||
createList: function(content_container){
|
||||
@@ -370,7 +386,7 @@ var OptionBase = new Class({
|
||||
createTooltip(self.options.description[1]).inject(hint, 'top');
|
||||
}
|
||||
else {
|
||||
var hint = new Element('p.formHint', {
|
||||
new Element('p.formHint', {
|
||||
'html': self.options.description || ''
|
||||
}).inject(self.el)
|
||||
}
|
||||
@@ -1312,8 +1328,9 @@ Option.Combined = new Class({
|
||||
var head = new Element('div.head').inject(self.combined_list);
|
||||
|
||||
Object.each(self.inputs, function(input, name){
|
||||
var _in = input.getNext();
|
||||
self.labels[name] = input.getPrevious().get('text');
|
||||
self.descriptions[name] = (_in = input.getNext()) ? _in.get('text') : '';
|
||||
self.descriptions[name] = _in ? _in.get('text') : '';
|
||||
|
||||
new Element('abbr', {
|
||||
'class': name,
|
||||
@@ -1465,4 +1482,4 @@ var createTooltip = function(description){
|
||||
);
|
||||
|
||||
return tip;
|
||||
}
|
||||
};
|
||||
@@ -1,123 +0,0 @@
|
||||
Page.Wanted = new Class({
|
||||
|
||||
Extends: PageBase,
|
||||
|
||||
name: 'wanted',
|
||||
title: 'Gimmy gimmy gimmy!',
|
||||
folder_browser: null,
|
||||
|
||||
indexAction: function(){
|
||||
var self = this;
|
||||
|
||||
if(!self.wanted){
|
||||
|
||||
self.manual_search = new Element('a', {
|
||||
'title': 'Force a search for the full wanted list',
|
||||
'text': 'Search all wanted',
|
||||
'events':{
|
||||
'click': self.doFullSearch.bind(self, true)
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
self.scan_folder = new Element('a', {
|
||||
'title': 'Scan a folder and rename all movies in it',
|
||||
'text': 'Manual folder scan',
|
||||
'events':{
|
||||
'click': self.scanFolder.bind(self)
|
||||
}
|
||||
});
|
||||
|
||||
// Wanted movies
|
||||
self.wanted = new MovieList({
|
||||
'identifier': 'wanted',
|
||||
'status': 'active',
|
||||
'actions': [MA.IMDB, MA.Trailer, MA.Release, MA.Edit, MA.Refresh, MA.Readd, MA.Delete],
|
||||
'add_new': true,
|
||||
'menu': [self.manual_search, self.scan_folder],
|
||||
'on_empty_element': App.createUserscriptButtons().addClass('empty_wanted')
|
||||
});
|
||||
$(self.wanted).inject(self.el);
|
||||
|
||||
// Check if search is in progress
|
||||
self.startProgressInterval.delay(4000, self);
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
doFullSearch: function(){
|
||||
var self = this;
|
||||
|
||||
if(!self.search_in_progress){
|
||||
|
||||
Api.request('movie.searcher.full_search');
|
||||
self.startProgressInterval();
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
startProgressInterval: function(){
|
||||
var self = this;
|
||||
|
||||
var start_text = self.manual_search.get('text');
|
||||
self.progress_interval = setInterval(function(){
|
||||
if(self.search_progress && self.search_progress.running) return;
|
||||
self.search_progress = Api.request('movie.searcher.progress', {
|
||||
'onComplete': function(json){
|
||||
self.search_in_progress = true;
|
||||
if(!json.movie){
|
||||
clearInterval(self.progress_interval);
|
||||
self.search_in_progress = false;
|
||||
self.manual_search.set('text', start_text);
|
||||
}
|
||||
else {
|
||||
var progress = json.movie;
|
||||
self.manual_search.set('text', 'Searching.. (' + (((progress.total-progress.to_go)/progress.total)*100).round() + '%)');
|
||||
}
|
||||
}
|
||||
});
|
||||
}, 1000);
|
||||
|
||||
},
|
||||
|
||||
scanFolder: function(e) {
|
||||
(e).stop();
|
||||
|
||||
var self = this;
|
||||
var options = {
|
||||
'name': 'Scan_folder'
|
||||
}
|
||||
|
||||
if(!self.folder_browser){
|
||||
self.folder_browser = new Option['Directory']("Scan", "folder", "", options);
|
||||
|
||||
self.folder_browser.save = function() {
|
||||
var folder = self.folder_browser.getValue();
|
||||
Api.request('renamer.scan', {
|
||||
'data': {
|
||||
'base_folder': folder,
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
self.folder_browser.inject(self.el, 'top');
|
||||
self.folder_browser.fireEvent('injected');
|
||||
|
||||
// Hide the settings box
|
||||
self.folder_browser.directory_inlay.hide();
|
||||
self.folder_browser.el.removeChild(self.folder_browser.el.firstChild);
|
||||
|
||||
self.folder_browser.showBrowser();
|
||||
|
||||
// Make adjustments to the browser
|
||||
self.folder_browser.browser.getElements('.clear.button').hide();
|
||||
self.folder_browser.save_button.text = "Select";
|
||||
self.folder_browser.browser.style.zIndex=1000;
|
||||
}
|
||||
else{
|
||||
self.folder_browser.showBrowser();
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
Reference in new issue
Block a user