Refactor downloaders and pages

This commit is contained in:
Ruud
2014-04-05 11:30:23 +02:00
parent 98a85f6950
commit 84a2afe08f
25 changed files with 63 additions and 50 deletions
-2
View File
@@ -49,10 +49,8 @@ class ClientScript(Plugin):
'scripts/block/footer.js',
'scripts/block/menu.js',
'scripts/page/home.js',
'scripts/page/wanted.js',
'scripts/page/settings.js',
'scripts/page/about.js',
'scripts/page/manage.js',
'scripts/misc/downloaders.js',
],
}
@@ -0,0 +1,20 @@
from .main import Downloader
def autoload():
return Downloader()
config = [{
'name': 'download_providers',
'groups': [
{
'label': 'Downloaders',
'description': 'You can select different downloaders for each type (usenet / torrent)',
'type': 'list',
'name': 'download_providers',
'tab': 'downloaders',
'options': [],
},
],
}]
@@ -7,12 +7,18 @@ from couchpotato.core.event import addEvent
from couchpotato.core.helpers.variable import mergeDicts
from couchpotato.core.logger import CPLog
from couchpotato.core.media._base.providers.base import Provider
from couchpotato.core.plugins.base import Plugin
log = CPLog(__name__)
class Downloader(Provider):
## This is here to load the static files
class Downloader(Plugin):
pass
class DownloaderBase(Provider):
protocol = []
http_time_between_calls = 0
@@ -0,0 +1,75 @@
var DownloadersBase = new Class({
Implements: [Events],
initialize: function(){
var self = this;
// Add test buttons to settings page
App.addEvent('loadSettings', self.addTestButtons.bind(self));
},
// Downloaders setting tests
addTestButtons: function(){
var self = this;
var setting_page = App.getPage('Settings');
setting_page.addEvent('create', function(){
Object.each(setting_page.tabs.downloaders.groups, self.addTestButton.bind(self))
})
},
addTestButton: function(fieldset, plugin_name){
var self = this,
button_name = self.testButtonName(fieldset);
if(button_name.contains('Downloaders')) return;
new Element('.ctrlHolder.test_button').adopt(
new Element('a.button', {
'text': button_name,
'events': {
'click': function(){
var button = fieldset.getElement('.test_button .button');
button.set('text', 'Connecting...');
Api.request('download.'+plugin_name+'.test', {
'onComplete': function(json){
button.set('text', button_name);
if(json.success){
var message = new Element('span.success', {
'text': 'Connection successful'
}).inject(button, 'after')
}
else {
var msg_text = 'Connection failed. Check logs for details.';
if(json.hasOwnProperty('msg')) msg_text = json.msg;
var message = new Element('span.failed', {
'text': msg_text
}).inject(button, 'after')
}
(function(){
message.destroy();
}).delay(3000)
}
});
}
}
})
).inject(fieldset);
},
testButtonName: function(fieldset){
var name = String(fieldset.getElement('h2').innerHTML).substring(0,String(fieldset.getElement('h2').innerHTML).indexOf("<span"));
return 'Test '+name;
}
});
var Downloaders = new DownloadersBase();
-13
View File
@@ -1,13 +0,0 @@
config = [{
'name': 'download_providers',
'groups': [
{
'label': 'Downloaders',
'description': 'You can select different downloaders for each type (usenet / torrent)',
'type': 'list',
'name': 'download_providers',
'tab': 'downloaders',
'options': [],
},
],
}]
+2 -2
View File
@@ -2,7 +2,7 @@ from __future__ import with_statement
import os
import traceback
from couchpotato.core.downloaders.base import Downloader
from couchpotato.core._base.downloader.main import DownloaderBase
from couchpotato.core.helpers.encoding import sp
from couchpotato.core.helpers.variable import getDownloadDir
from couchpotato.core.logger import CPLog
@@ -14,7 +14,7 @@ log = CPLog(__name__)
autoload = 'Blackhole'
class Blackhole(Downloader):
class Blackhole(DownloaderBase):
protocol = ['nzb', 'torrent', 'torrent_magnet']
status_support = False
+2 -2
View File
@@ -6,7 +6,7 @@ import re
import traceback
from bencode import bencode as benc, bdecode
from couchpotato.core.downloaders.base import Downloader, ReleaseDownloadList
from couchpotato.core._base.downloader.main import DownloaderBase, ReleaseDownloadList
from couchpotato.core.helpers.encoding import isInt, sp
from couchpotato.core.helpers.variable import tryFloat, cleanHost
from couchpotato.core.logger import CPLog
@@ -18,7 +18,7 @@ log = CPLog(__name__)
autoload = 'Deluge'
class Deluge(Downloader):
class Deluge(DownloaderBase):
protocol = ['torrent', 'torrent_magnet']
log = CPLog(__name__)
+2 -2
View File
@@ -6,7 +6,7 @@ import socket
import traceback
import xmlrpclib
from couchpotato.core.downloaders.base import Downloader, ReleaseDownloadList
from couchpotato.core._base.downloader.main import DownloaderBase, ReleaseDownloadList
from couchpotato.core.helpers.encoding import ss, sp
from couchpotato.core.helpers.variable import tryInt, md5, cleanHost
from couchpotato.core.logger import CPLog
@@ -17,7 +17,7 @@ log = CPLog(__name__)
autoload = 'NZBGet'
class NZBGet(Downloader):
class NZBGet(DownloaderBase):
protocol = ['nzb']
rpc = 'xmlrpc'
+2 -2
View File
@@ -12,7 +12,7 @@ import time
import traceback
import urllib2
from couchpotato.core.downloaders.base import Downloader, ReleaseDownloadList
from couchpotato.core._base.downloader.main import DownloaderBase, ReleaseDownloadList
from couchpotato.core.helpers.encoding import tryUrlencode, sp
from couchpotato.core.helpers.variable import cleanHost
from couchpotato.core.logger import CPLog
@@ -23,7 +23,7 @@ log = CPLog(__name__)
autoload = 'NZBVortex'
class NZBVortex(Downloader):
class NZBVortex(DownloaderBase):
protocol = ['nzb']
api_level = None
+2 -2
View File
@@ -2,7 +2,7 @@ from __future__ import with_statement
import os
import traceback
from couchpotato.core.downloaders.base import Downloader
from couchpotato.core._base.downloader.main import DownloaderBase
from couchpotato.core.helpers.encoding import sp
from couchpotato.core.logger import CPLog
@@ -12,7 +12,7 @@ log = CPLog(__name__)
autoload = 'Pneumatic'
class Pneumatic(Downloader):
class Pneumatic(DownloaderBase):
protocol = ['nzb']
strm_syntax = 'plugin://plugin.program.pneumatic/?mode=strm&type=add_file&nzb=%s&nzbname=%s'
+4 -4
View File
@@ -1,21 +1,21 @@
from base64 import b16encode, b32decode
from bencode import bencode, bdecode
from hashlib import sha1
import os
from couchpotato.core.downloaders.base import Downloader, ReleaseDownloadList
from bencode import bencode, bdecode
from couchpotato.core._base.downloader.main import DownloaderBase, ReleaseDownloadList
from couchpotato.core.helpers.encoding import sp
from couchpotato.core.helpers.variable import cleanHost
from couchpotato.core.logger import CPLog
from qbittorrent.client import QBittorrentClient
log = CPLog(__name__)
autoload = 'qBittorrent'
class qBittorrent(Downloader):
class qBittorrent(DownloaderBase):
protocol = ['torrent', 'torrent_magnet']
qb = None
+3 -3
View File
@@ -4,14 +4,14 @@ from hashlib import sha1
from urlparse import urlparse
import os
from couchpotato.core.downloaders.base import Downloader, ReleaseDownloadList
from couchpotato.core._base.downloader.main import DownloaderBase, ReleaseDownloadList
from couchpotato.core.event import addEvent
from couchpotato.core.helpers.encoding import sp
from couchpotato.core.helpers.variable import cleanHost, splitString
from couchpotato.core.logger import CPLog
from bencode import bencode, bdecode
from rtorrent import RTorrent
from rtorrent.err import MethodError
from scandir import scandir
@@ -20,7 +20,7 @@ log = CPLog(__name__)
autoload = 'rTorrent'
class rTorrent(Downloader):
class rTorrent(DownloaderBase):
protocol = ['torrent', 'torrent_magnet']
rt = None
+2 -2
View File
@@ -4,7 +4,7 @@ import json
import os
import traceback
from couchpotato.core.downloaders.base import Downloader, ReleaseDownloadList
from couchpotato.core._base.downloader.main import DownloaderBase, ReleaseDownloadList
from couchpotato.core.helpers.encoding import tryUrlencode, ss, sp
from couchpotato.core.helpers.variable import cleanHost, mergeDicts
from couchpotato.core.logger import CPLog
@@ -16,7 +16,7 @@ log = CPLog(__name__)
autoload = 'Sabnzbd'
class Sabnzbd(Downloader):
class Sabnzbd(DownloaderBase):
protocol = ['nzb']
+2 -2
View File
@@ -1,7 +1,7 @@
import json
import traceback
from couchpotato.core.downloaders.base import Downloader
from couchpotato.core._base.downloader.main import DownloaderBase
from couchpotato.core.helpers.encoding import isInt
from couchpotato.core.helpers.variable import cleanHost
from couchpotato.core.logger import CPLog
@@ -13,7 +13,7 @@ log = CPLog(__name__)
autoload = 'Synology'
class Synology(Downloader):
class Synology(DownloaderBase):
protocol = ['nzb', 'torrent', 'torrent_magnet']
status_support = False
+2 -2
View File
@@ -6,7 +6,7 @@ import os.path
import re
import urllib2
from couchpotato.core.downloaders.base import Downloader, ReleaseDownloadList
from couchpotato.core._base.downloader.main import DownloaderBase, ReleaseDownloadList
from couchpotato.core.helpers.encoding import isInt, sp
from couchpotato.core.helpers.variable import tryInt, tryFloat, cleanHost
from couchpotato.core.logger import CPLog
@@ -17,7 +17,7 @@ log = CPLog(__name__)
autoload = 'Transmission'
class Transmission(Downloader):
class Transmission(DownloaderBase):
protocol = ['torrent', 'torrent_magnet']
log = CPLog(__name__)
+2 -2
View File
@@ -12,7 +12,7 @@ import urllib
import urllib2
from bencode import bencode as benc, bdecode
from couchpotato.core.downloaders.base import Downloader, ReleaseDownloadList
from couchpotato.core._base.downloader.main import DownloaderBase, ReleaseDownloadList
from couchpotato.core.helpers.encoding import isInt, ss, sp
from couchpotato.core.helpers.variable import tryInt, tryFloat, cleanHost
from couchpotato.core.logger import CPLog
@@ -24,7 +24,7 @@ log = CPLog(__name__)
autoload = 'uTorrent'
class uTorrent(Downloader):
class uTorrent(DownloaderBase):
protocol = ['torrent', 'torrent_magnet']
utorrent_api = None
@@ -0,0 +1,123 @@
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.. (' + Math.round(((progress.total-progress.to_go)/progress.total)*100) + '%)');
}
}
});
}, 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();
}
}
});
@@ -0,0 +1,149 @@
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': {
'status': 'done',
'release_status': 'done',
'status_or': 1
},
'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 ? Math.round(((folder_progress.total-folder_progress.to_go)/folder_progress.total)*100) + '%' : '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()
}
});
@@ -14,7 +14,7 @@ var NotificationBase = new Class({
App.on('message', self.showMessage.bind(self));
// Add test buttons to settings page
App.addEvent('load', self.addTestButtons.bind(self));
App.addEvent('loadSettings', self.addTestButtons.bind(self));
// Notification bar
self.notifications = [];
@@ -2,7 +2,7 @@ var TwitterNotification = new Class({
initialize: function(){
var self = this;
App.addEvent('load', self.addRegisterButton.bind(self));
App.addEvent('loadSettings', self.addRegisterButton.bind(self));
},
addRegisterButton: function(){
@@ -3,7 +3,7 @@ var CategoryListBase = new Class({
initialize: function(){
var self = this;
App.addEvent('load', self.addSettings.bind(self));
App.addEvent('loadSettings', self.addSettings.bind(self));
},
setup: function(categories){
@@ -11,7 +11,7 @@ var QualityBase = new Class({
self.profiles = [];
Array.each(data.profiles, self.createProfilesClass.bind(self));
App.addEvent('load', self.addSettings.bind(self))
App.addEvent('loadSettings', self.addSettings.bind(self))
},
@@ -53,7 +53,7 @@ var UserscriptSettingTab = new Class({
initialize: function(){
var self = this;
App.addEvent('load', self.addSettings.bind(self))
App.addEvent('loadSettings', self.addSettings.bind(self))
},