From 4447b7611e016cda8600d86e27b5e70051dd2649 Mon Sep 17 00:00:00 2001 From: Cybertinus Date: Mon, 14 Jan 2013 22:52:56 +0100 Subject: [PATCH 01/12] Added the e-mail notifier --- .../core/notifications/email/__init__.py | 60 +++++++++++++++++++ couchpotato/core/notifications/email/main.py | 53 ++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 couchpotato/core/notifications/email/__init__.py create mode 100644 couchpotato/core/notifications/email/main.py diff --git a/couchpotato/core/notifications/email/__init__.py b/couchpotato/core/notifications/email/__init__.py new file mode 100644 index 00000000..c2601356 --- /dev/null +++ b/couchpotato/core/notifications/email/__init__.py @@ -0,0 +1,60 @@ +from .main import Email + +def start(): + return Email() + +config = [{ + 'name': 'email', + 'groups': [ + { + 'tab': 'notifications', + 'name': 'email', + 'options': [ + { + 'name': 'enabled', + 'default': 0, + 'type': 'enabler', + }, + { + 'name': 'from', + 'label': 'Send e-mail from', + }, + { + 'name': 'to', + 'label': 'Send e-mail to', + }, + { + 'name': 'subject', + 'label': 'Subject', + 'default': 'Couch Potato report', + }, + { + 'name': 'smtp_server', + 'label': 'SMTP server', + }, + { + 'name': 'ssl', + 'label': 'Enable SSL', + 'default': 0, + 'type': 'bool', + }, + { + 'name': 'smtp_user', + 'label': 'SMTP user', + }, + { + 'name': 'smtp_pass', + 'label': 'SMTP password', + 'type': 'password', + }, + { + 'name': 'on_snatch', + 'default': 0, + 'type': 'bool', + 'advanced': True, + 'description': 'Also send message when movie is snatched.', + }, + ], + } + ], +}] diff --git a/couchpotato/core/notifications/email/main.py b/couchpotato/core/notifications/email/main.py new file mode 100644 index 00000000..492462dd --- /dev/null +++ b/couchpotato/core/notifications/email/main.py @@ -0,0 +1,53 @@ +from couchpotato.core.helpers.encoding import toUnicode +from couchpotato.core.logger import CPLog +from couchpotato.core.notifications.base import Notification +from email.mime.text import MIMEText +import traceback +import smtplib + +log = CPLog(__name__) + + +class Email(Notification): + + def notify(self, message = '', data = {}, listener = None): + if self.isDisabled(): return + + # Extract all the settings from the database + from_address = self.conf('from') + to = self.conf('to') + smtp_server = self.conf('smtp_server') + ssl = self.conf('ssl') + smtp_user = self.conf('smtp_user') + smtp_pass = self.conf('smtp_pass') + + # Make the basic message + message = MIMEText(toUnicode(message)) + message['Subject'] = self.conf('subject') + message['From'] = from_address + message['To'] = to + + try: + # Open the SMTP connection, via SSL if requested + if ssl == 1: + mailserver = smtplib.SMTP_SSL(smtp_server) + else: + mailserver = smtplib.SMTP(smtp_server) + + + # Check too see if an login attempt should be attempted + if len(smtp_user) > 0: + mailserver.login(smtp_user, smtp_pass) + + # Send the e-mail + mailserver.sendmail(from_address, to, message.as_string()) + + # Close the SMTP connection + mailserver.quit() + log.info('Email notifications sent.') + return True + except: + log.error('E-mail failed: %s', traceback.format_exc()) + return False + + return False From fe52ac7203859f2a536fdf901ee0b5cc2afef9fe Mon Sep 17 00:00:00 2001 From: Ruud Date: Wed, 16 Jan 2013 19:45:39 +0100 Subject: [PATCH 02/12] Use default title as email subject --- .../core/notifications/email/__init__.py | 5 ----- couchpotato/core/notifications/email/main.py | 22 ++++++++----------- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/couchpotato/core/notifications/email/__init__.py b/couchpotato/core/notifications/email/__init__.py index c2601356..ed55528d 100644 --- a/couchpotato/core/notifications/email/__init__.py +++ b/couchpotato/core/notifications/email/__init__.py @@ -23,11 +23,6 @@ config = [{ 'name': 'to', 'label': 'Send e-mail to', }, - { - 'name': 'subject', - 'label': 'Subject', - 'default': 'Couch Potato report', - }, { 'name': 'smtp_server', 'label': 'SMTP server', diff --git a/couchpotato/core/notifications/email/main.py b/couchpotato/core/notifications/email/main.py index 492462dd..118ed1b6 100644 --- a/couchpotato/core/notifications/email/main.py +++ b/couchpotato/core/notifications/email/main.py @@ -2,8 +2,8 @@ from couchpotato.core.helpers.encoding import toUnicode from couchpotato.core.logger import CPLog from couchpotato.core.notifications.base import Notification from email.mime.text import MIMEText -import traceback import smtplib +import traceback log = CPLog(__name__) @@ -13,35 +13,31 @@ class Email(Notification): def notify(self, message = '', data = {}, listener = None): if self.isDisabled(): return - # Extract all the settings from the database + # Extract all the settings from settings from_address = self.conf('from') to = self.conf('to') smtp_server = self.conf('smtp_server') ssl = self.conf('ssl') smtp_user = self.conf('smtp_user') smtp_pass = self.conf('smtp_pass') - + # Make the basic message message = MIMEText(toUnicode(message)) - message['Subject'] = self.conf('subject') + message['Subject'] = self.default_title message['From'] = from_address message['To'] = to - + try: # Open the SMTP connection, via SSL if requested - if ssl == 1: - mailserver = smtplib.SMTP_SSL(smtp_server) - else: - mailserver = smtplib.SMTP(smtp_server) + mailserver = smtplib.SMTP_SSL(smtp_server) if ssl == 1 else smtplib.SMTP(smtp_server) - # Check too see if an login attempt should be attempted if len(smtp_user) > 0: mailserver.login(smtp_user, smtp_pass) - + # Send the e-mail mailserver.sendmail(from_address, to, message.as_string()) - + # Close the SMTP connection mailserver.quit() log.info('Email notifications sent.') @@ -49,5 +45,5 @@ class Email(Notification): except: log.error('E-mail failed: %s', traceback.format_exc()) return False - + return False From 61a0bb8ec6e7bf99554084aa935a524906206be8 Mon Sep 17 00:00:00 2001 From: Ruud Date: Sat, 19 Jan 2013 00:45:08 +0100 Subject: [PATCH 03/12] Don't use quality identifier in title searches --- .../core/providers/nzb/binsearch/main.py | 5 +- .../core/providers/nzb/nzbclub/main.py | 6 +- .../core/providers/nzb/nzbindex/main.py | 2 +- .../core/providers/torrent/scenehd/main.py | 2 +- .../providers/torrent/thepiratebay/main.py | 84 +++++++++++-------- .../providers/torrent/torrentleech/main.py | 2 +- 6 files changed, 57 insertions(+), 44 deletions(-) diff --git a/couchpotato/core/providers/nzb/binsearch/main.py b/couchpotato/core/providers/nzb/binsearch/main.py index a7e27b56..1d863002 100644 --- a/couchpotato/core/providers/nzb/binsearch/main.py +++ b/couchpotato/core/providers/nzb/binsearch/main.py @@ -22,11 +22,10 @@ class BinSearch(NZBProvider): def _search(self, movie, quality, results): - q = '%s %s' % (movie['library']['identifier'], quality.get('identifier')) arguments = tryUrlencode({ - 'q': q, + 'q': movie['library']['identifier'], 'm': 'n', - 'max': 250, + 'max': 400, 'adv_age': Env.setting('retention', 'nzb'), 'adv_sort': 'date', 'adv_col': 'on', diff --git a/couchpotato/core/providers/nzb/nzbclub/main.py b/couchpotato/core/providers/nzb/nzbclub/main.py index 0e66baff..59382dfd 100644 --- a/couchpotato/core/providers/nzb/nzbclub/main.py +++ b/couchpotato/core/providers/nzb/nzbclub/main.py @@ -20,13 +20,13 @@ class NZBClub(NZBProvider, RSS): def _searchOnTitle(self, title, movie, quality, results): - q = '"%s %s" %s' % (title, movie['library']['year'], quality.get('identifier')) + q = '"%s %s"' % (title, movie['library']['year']) params = tryUrlencode({ 'q': q, - 'ig': '1', + 'ig': 1, 'rpp': 200, - 'st': 1, + 'st': 5, 'sp': 1, 'ns': 1, }) diff --git a/couchpotato/core/providers/nzb/nzbindex/main.py b/couchpotato/core/providers/nzb/nzbindex/main.py index 6da89fc2..3643f55b 100644 --- a/couchpotato/core/providers/nzb/nzbindex/main.py +++ b/couchpotato/core/providers/nzb/nzbindex/main.py @@ -23,7 +23,7 @@ class NzbIndex(NZBProvider, RSS): def _searchOnTitle(self, title, movie, quality, results): - q = '"%s" %s %s' % (title, movie['library']['year'], quality.get('identifier')) + q = '"%s %s"' % (title, movie['library']['year']) arguments = tryUrlencode({ 'q': q, 'age': Env.setting('retention', 'nzb'), diff --git a/couchpotato/core/providers/torrent/scenehd/main.py b/couchpotato/core/providers/torrent/scenehd/main.py index cc914660..93897c67 100644 --- a/couchpotato/core/providers/torrent/scenehd/main.py +++ b/couchpotato/core/providers/torrent/scenehd/main.py @@ -22,7 +22,7 @@ class SceneHD(TorrentProvider): def _searchOnTitle(self, title, movie, quality, results): - q = '"%s %s" %s' % (simplifyString(title), movie['library']['year'], quality.get('identifier')) + q = '"%s %s"' % (simplifyString(title), movie['library']['year']) arguments = tryUrlencode({ 'search': q, }) diff --git a/couchpotato/core/providers/torrent/thepiratebay/main.py b/couchpotato/core/providers/torrent/thepiratebay/main.py index 41bebe38..5c007c3a 100644 --- a/couchpotato/core/providers/torrent/thepiratebay/main.py +++ b/couchpotato/core/providers/torrent/thepiratebay/main.py @@ -15,7 +15,7 @@ class ThePirateBay(TorrentMagnetProvider): urls = { 'detail': '%s/torrent/%s', - 'search': '%s/search/%s/0/7/%d' + 'search': '%s/search/%s/%s/7/%d' } cat_ids = [ @@ -45,52 +45,66 @@ class ThePirateBay(TorrentMagnetProvider): def _searchOnTitle(self, title, movie, quality, results): - search_url = self.urls['search'] % (self.getDomain(), tryUrlencode(title + ' ' + quality['identifier']), self.getCatId(quality['identifier'])[0]) + page = 0 + total_pages = 1 - data = self.getHTMLData(search_url) + while page < total_pages: - if data: - try: - soup = BeautifulSoup(data) - results_table = soup.find('table', attrs = {'id': 'searchResult'}) + search_url = self.urls['search'] % (self.getDomain(), tryUrlencode('"%s %s"' % (title, movie['library']['year'])), page, self.getCatId(quality['identifier'])[0]) - if not results_table: - return + data = self.getHTMLData(search_url) - entries = results_table.find_all('tr') - for result in entries[2:]: - link = result.find(href = re.compile('torrent\/\d+\/')) - download = result.find(href = re.compile('magnet:')) + if data: + try: + soup = BeautifulSoup(data) + results_table = soup.find('table', attrs = {'id': 'searchResult'}) + + if not results_table: + return try: - size = re.search('Size (?P.+),', unicode(result.select('font.detDesc')[0])).group('size') + total_pages = len(soup.find('div', attrs = {'align': 'center'}).find_all('a')) + page += 1 except: - continue + pass - if link and download: + print total_pages, page - def extra_score(item): - trusted = (0, 10)[result.find('img', alt = re.compile('Trusted')) != None] - vip = (0, 20)[result.find('img', alt = re.compile('VIP')) != None] - confirmed = (0, 30)[result.find('img', alt = re.compile('Helpers')) != None] - moderated = (0, 50)[result.find('img', alt = re.compile('Moderator')) != None] + entries = results_table.find_all('tr') + for result in entries[2:]: + link = result.find(href = re.compile('torrent\/\d+\/')) + download = result.find(href = re.compile('magnet:')) - return confirmed + trusted + vip + moderated + try: + size = re.search('Size (?P.+),', unicode(result.select('font.detDesc')[0])).group('size') + except: + continue - results.append({ - 'id': re.search('/(?P\d+)/', link['href']).group('id'), - 'name': link.string, - 'url': download['href'], - 'detail_url': self.getDomain(link['href']), - 'size': self.parseSize(size), - 'seeders': tryInt(result.find_all('td')[2].string), - 'leechers': tryInt(result.find_all('td')[3].string), - 'extra_score': extra_score, - 'get_more_info': self.getMoreInfo - }) + if link and download: + + def extra_score(item): + trusted = (0, 10)[result.find('img', alt = re.compile('Trusted')) != None] + vip = (0, 20)[result.find('img', alt = re.compile('VIP')) != None] + confirmed = (0, 30)[result.find('img', alt = re.compile('Helpers')) != None] + moderated = (0, 50)[result.find('img', alt = re.compile('Moderator')) != None] + + return confirmed + trusted + vip + moderated + + results.append({ + 'id': re.search('/(?P\d+)/', link['href']).group('id'), + 'name': link.string, + 'url': download['href'], + 'detail_url': self.getDomain(link['href']), + 'size': self.parseSize(size), + 'seeders': tryInt(result.find_all('td')[2].string), + 'leechers': tryInt(result.find_all('td')[3].string), + 'extra_score': extra_score, + 'get_more_info': self.getMoreInfo + }) + + except: + log.error('Failed getting results from %s: %s', (self.getName(), traceback.format_exc())) - except: - log.error('Failed getting results from %s: %s', (self.getName(), traceback.format_exc())) def isEnabled(self): return super(ThePirateBay, self).isEnabled() and self.getDomain() diff --git a/couchpotato/core/providers/torrent/torrentleech/main.py b/couchpotato/core/providers/torrent/torrentleech/main.py index df6072d0..6de18fbd 100644 --- a/couchpotato/core/providers/torrent/torrentleech/main.py +++ b/couchpotato/core/providers/torrent/torrentleech/main.py @@ -34,7 +34,7 @@ class TorrentLeech(TorrentProvider): def _searchOnTitle(self, title, movie, quality, results): - url = self.urls['search'] % (tryUrlencode(title.replace(':', '') + ' ' + quality['identifier']), self.getCatId(quality['identifier'])[0]) + url = self.urls['search'] % (tryUrlencode('%s %s' % (title.replace(':', ''), movie['library']['year'])), self.getCatId(quality['identifier'])[0]) data = self.getHTMLData(url, opener = self.login_opener) if data: From d4de68ef86589f6525812765b48384f8f4129f15 Mon Sep 17 00:00:00 2001 From: Ruud Date: Sat, 19 Jan 2013 00:51:20 +0100 Subject: [PATCH 04/12] Add page nr after --- couchpotato/core/providers/torrent/thepiratebay/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/couchpotato/core/providers/torrent/thepiratebay/main.py b/couchpotato/core/providers/torrent/thepiratebay/main.py index 5c007c3a..2a2433f0 100644 --- a/couchpotato/core/providers/torrent/thepiratebay/main.py +++ b/couchpotato/core/providers/torrent/thepiratebay/main.py @@ -51,6 +51,7 @@ class ThePirateBay(TorrentMagnetProvider): while page < total_pages: search_url = self.urls['search'] % (self.getDomain(), tryUrlencode('"%s %s"' % (title, movie['library']['year'])), page, self.getCatId(quality['identifier'])[0]) + page += 1 data = self.getHTMLData(search_url) @@ -64,7 +65,6 @@ class ThePirateBay(TorrentMagnetProvider): try: total_pages = len(soup.find('div', attrs = {'align': 'center'}).find_all('a')) - page += 1 except: pass From b93488f025bed66219bf000b0c288c38952ffddc Mon Sep 17 00:00:00 2001 From: Ruud Date: Sat, 19 Jan 2013 00:56:03 +0100 Subject: [PATCH 05/12] Use default timeout for CP calls --- couchpotato/core/providers/movie/couchpotatoapi/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/couchpotato/core/providers/movie/couchpotatoapi/main.py b/couchpotato/core/providers/movie/couchpotatoapi/main.py index 5d6a35ba..88883d79 100644 --- a/couchpotato/core/providers/movie/couchpotatoapi/main.py +++ b/couchpotato/core/providers/movie/couchpotatoapi/main.py @@ -33,7 +33,7 @@ class CouchPotatoApi(MovieProvider): def search(self, q, limit = 12): cache_key = 'cpapi.cache.%s' % q - cached = self.getCache(cache_key, self.urls['search'] % tryUrlencode(q), timeout = 3, headers = self.getRequestHeaders()) + cached = self.getCache(cache_key, self.urls['search'] % tryUrlencode(q), headers = self.getRequestHeaders()) if cached: try: @@ -50,7 +50,7 @@ class CouchPotatoApi(MovieProvider): return cache_key = 'cpapi.cache.info.%s' % identifier - cached = self.getCache(cache_key, self.urls['info'] % identifier, timeout = 3, headers = self.getRequestHeaders()) + cached = self.getCache(cache_key, self.urls['info'] % identifier, headers = self.getRequestHeaders()) if cached: try: From d2496d768db5cc6563d9675cd9f52740d23cac22 Mon Sep 17 00:00:00 2001 From: Ruud Date: Sat, 19 Jan 2013 01:04:24 +0100 Subject: [PATCH 06/12] Don't reorder based on omdb --- couchpotato/core/providers/movie/_modifier/main.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/couchpotato/core/providers/movie/_modifier/main.py b/couchpotato/core/providers/movie/_modifier/main.py index 7346480e..f0f98e0e 100644 --- a/couchpotato/core/providers/movie/_modifier/main.py +++ b/couchpotato/core/providers/movie/_modifier/main.py @@ -30,11 +30,6 @@ class MovieResultModifier(Plugin): temp[imdb] = self.getLibraryTags(imdb) order.append(imdb) - if item.get('via_imdb'): - if order.count(imdb): - order.remove(imdb) - order.insert(0, imdb) - # Merge dicts temp[imdb] = mergeDicts(temp[imdb], item) From 0f789b5b40990db7edfcff73fae3118423127c0e Mon Sep 17 00:00:00 2001 From: Ruud Date: Sat, 19 Jan 2013 01:17:57 +0100 Subject: [PATCH 07/12] NZBsRus rss different item path. fix #1301 --- couchpotato/core/providers/base.py | 4 ++-- couchpotato/core/providers/nzb/nzbsrus/main.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/couchpotato/core/providers/base.py b/couchpotato/core/providers/base.py index a07282af..12d77740 100644 --- a/couchpotato/core/providers/base.py +++ b/couchpotato/core/providers/base.py @@ -56,14 +56,14 @@ class Provider(Plugin): return [] - def getRSSData(self, url, **kwargs): + def getRSSData(self, url, item_path = 'channel/item', **kwargs): data = self.getCache(md5(url), url, **kwargs) if data: try: data = XMLTree.fromstring(data) - return self.getElements(data, 'channel/item') + return self.getElements(data, item_path) except: log.error('Failed to parsing %s: %s', (self.getName(), traceback.format_exc())) diff --git a/couchpotato/core/providers/nzb/nzbsrus/main.py b/couchpotato/core/providers/nzb/nzbsrus/main.py index 9a20153b..f6a16aaa 100644 --- a/couchpotato/core/providers/nzb/nzbsrus/main.py +++ b/couchpotato/core/providers/nzb/nzbsrus/main.py @@ -37,7 +37,7 @@ class Nzbsrus(NZBProvider, RSS): arguments += '&lang0=1&lang3=1&lang1=1' url = '%s&%s&%s' % (self.urls['search'], arguments , cat_id_string) - nzbs = self.getRSSData(url, cache_timeout = 1800, headers = {'User-Agent': Env.getIdentifier()}) + nzbs = self.getRSSData(url, item_path = 'results/result', cache_timeout = 1800, headers = {'User-Agent': Env.getIdentifier()}) for nzb in nzbs: From f41fc794c131cb84b632aced1a9821845142af83 Mon Sep 17 00:00:00 2001 From: Ruud Date: Sat, 19 Jan 2013 01:30:56 +0100 Subject: [PATCH 08/12] Don't search full disk when no manage folders are filled. fix #1304 --- couchpotato/core/plugins/manage/main.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/couchpotato/core/plugins/manage/main.py b/couchpotato/core/plugins/manage/main.py index ead5b6ea..9ef2a9c2 100644 --- a/couchpotato/core/plugins/manage/main.py +++ b/couchpotato/core/plugins/manage/main.py @@ -198,9 +198,12 @@ class Manage(Plugin): def directories(self): try: - return splitString(self.conf('library', default = ''), '::') + if self.conf('library', '').strip(): + return splitString(self.conf('library', default = ''), '::') except: - return [] + pass + + return [] def scanFilesToLibrary(self, folder = None, files = None): From faaf351662a3d5896b9fced3967c9804623c20f2 Mon Sep 17 00:00:00 2001 From: Ruud Date: Sun, 20 Jan 2013 20:50:50 +0100 Subject: [PATCH 09/12] Group providers together --- couchpotato/core/downloaders/__init__.py | 13 ++++ .../core/downloaders/blackhole/__init__.py | 1 + .../core/downloaders/nzbget/__init__.py | 1 + .../core/downloaders/nzbvortex/__init__.py | 1 + .../core/downloaders/pneumatic/__init__.py | 1 + .../core/downloaders/sabnzbd/__init__.py | 1 + .../core/downloaders/synology/__init__.py | 1 + .../core/downloaders/transmission/__init__.py | 1 + .../core/downloaders/utorrent/__init__.py | 1 + couchpotato/core/loader.py | 12 +++ couchpotato/core/notifications/__init__.py | 13 ++++ .../core/notifications/boxcar/__init__.py | 1 + .../core/notifications/email/__init__.py | 1 + .../core/notifications/growl/__init__.py | 1 + .../core/notifications/nmj/__init__.py | 1 + .../core/notifications/notifo/__init__.py | 1 + .../notifications/notifymyandroid/__init__.py | 1 + .../core/notifications/notifymywp/__init__.py | 1 + .../core/notifications/plex/__init__.py | 1 + .../core/notifications/prowl/__init__.py | 1 + .../core/notifications/pushover/__init__.py | 1 + .../core/notifications/synoindex/__init__.py | 1 + .../core/notifications/toasty/__init__.py | 1 + .../core/notifications/twitter/__init__.py | 1 + .../core/notifications/xbmc/__init__.py | 1 + .../core/providers/automation/__init__.py | 21 ++++++ .../providers/automation/bluray/__init__.py | 1 + .../providers/automation/imdb/__init__.py | 1 + .../providers/automation/itunes/__init__.py | 1 + .../automation/kinepolis/__init__.py | 1 + .../automation/moviemeter/__init__.py | 1 + .../automation/movies_io/__init__.py | 1 + .../automation/rottentomatoes/__init__.py | 1 + .../providers/automation/trakt/__init__.py | 1 + couchpotato/core/providers/nzb/__init__.py | 14 ++++ .../core/providers/nzb/binsearch/__init__.py | 3 +- .../core/providers/nzb/ftdworld/__init__.py | 3 +- .../core/providers/nzb/newznab/__init__.py | 3 +- .../core/providers/nzb/nzbclub/__init__.py | 3 +- .../core/providers/nzb/nzbindex/__init__.py | 3 +- .../core/providers/nzb/nzbsrus/__init__.py | 3 +- .../core/providers/nzb/nzbx/__init__.py | 3 +- .../core/providers/nzb/omgwtfnzbs/__init__.py | 3 +- .../core/providers/torrent/__init__.py | 14 ++++ .../torrent/kickasstorrents/__init__.py | 3 +- .../torrent/passthepopcorn/__init__.py | 3 +- .../providers/torrent/publichd/__init__.py | 3 +- .../providers/torrent/sceneaccess/__init__.py | 3 +- .../providers/torrent/scenehd/__init__.py | 3 +- .../torrent/thepiratebay/__init__.py | 3 +- .../providers/torrent/torrentday/__init__.py | 3 +- .../torrent/torrentleech/__init__.py | 3 +- couchpotato/static/scripts/page/settings.js | 37 ++++++++-- couchpotato/static/style/page/settings.css | 73 ++++++++++++++++++- 54 files changed, 253 insertions(+), 22 deletions(-) diff --git a/couchpotato/core/downloaders/__init__.py b/couchpotato/core/downloaders/__init__.py index e69de29b..5fb7125f 100644 --- a/couchpotato/core/downloaders/__init__.py +++ b/couchpotato/core/downloaders/__init__.py @@ -0,0 +1,13 @@ +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': [], + }, + ], +} diff --git a/couchpotato/core/downloaders/blackhole/__init__.py b/couchpotato/core/downloaders/blackhole/__init__.py index 71649df1..290e8d43 100644 --- a/couchpotato/core/downloaders/blackhole/__init__.py +++ b/couchpotato/core/downloaders/blackhole/__init__.py @@ -10,6 +10,7 @@ config = [{ 'groups': [ { 'tab': 'downloaders', + 'list': 'download_providers', 'name': 'blackhole', 'label': 'Black hole', 'description': 'Download the NZB/Torrent to a specific folder.', diff --git a/couchpotato/core/downloaders/nzbget/__init__.py b/couchpotato/core/downloaders/nzbget/__init__.py index 4fdac265..403a7e7d 100644 --- a/couchpotato/core/downloaders/nzbget/__init__.py +++ b/couchpotato/core/downloaders/nzbget/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'downloaders', + 'list': 'download_providers', 'name': 'nzbget', 'label': 'NZBGet', 'description': 'Use NZBGet to download NZBs.', diff --git a/couchpotato/core/downloaders/nzbvortex/__init__.py b/couchpotato/core/downloaders/nzbvortex/__init__.py index e0e77466..f1604ea8 100644 --- a/couchpotato/core/downloaders/nzbvortex/__init__.py +++ b/couchpotato/core/downloaders/nzbvortex/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'downloaders', + 'list': 'download_providers', 'name': 'nzbvortex', 'label': 'NZBVortex', 'description': 'Use NZBVortex to download NZBs.', diff --git a/couchpotato/core/downloaders/pneumatic/__init__.py b/couchpotato/core/downloaders/pneumatic/__init__.py index f119cfc5..96574a7a 100644 --- a/couchpotato/core/downloaders/pneumatic/__init__.py +++ b/couchpotato/core/downloaders/pneumatic/__init__.py @@ -9,6 +9,7 @@ config = [{ 'groups': [ { 'tab': 'downloaders', + 'list': 'download_providers', 'name': 'pneumatic', 'label': 'Pneumatic', 'description': 'Use Pneumatic to download .strm files.', diff --git a/couchpotato/core/downloaders/sabnzbd/__init__.py b/couchpotato/core/downloaders/sabnzbd/__init__.py index e4162509..6c976f1e 100644 --- a/couchpotato/core/downloaders/sabnzbd/__init__.py +++ b/couchpotato/core/downloaders/sabnzbd/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'downloaders', + 'list': 'download_providers', 'name': 'sabnzbd', 'label': 'Sabnzbd', 'description': 'Use SABnzbd to download NZBs.', diff --git a/couchpotato/core/downloaders/synology/__init__.py b/couchpotato/core/downloaders/synology/__init__.py index 2b7e861d..00a135d4 100644 --- a/couchpotato/core/downloaders/synology/__init__.py +++ b/couchpotato/core/downloaders/synology/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'downloaders', + 'list': 'download_providers', 'name': 'synology', 'label': 'Synology', 'description': 'Use Synology Download Station to download.', diff --git a/couchpotato/core/downloaders/transmission/__init__.py b/couchpotato/core/downloaders/transmission/__init__.py index 0fe11845..210a0d9e 100644 --- a/couchpotato/core/downloaders/transmission/__init__.py +++ b/couchpotato/core/downloaders/transmission/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'downloaders', + 'list': 'download_providers', 'name': 'transmission', 'label': 'Transmission', 'description': 'Use Transmission to download torrents.', diff --git a/couchpotato/core/downloaders/utorrent/__init__.py b/couchpotato/core/downloaders/utorrent/__init__.py index 09a82a1e..2c494eb2 100644 --- a/couchpotato/core/downloaders/utorrent/__init__.py +++ b/couchpotato/core/downloaders/utorrent/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'downloaders', + 'list': 'download_providers', 'name': 'utorrent', 'label': 'uTorrent', 'description': 'Use uTorrent to download torrents.', diff --git a/couchpotato/core/loader.py b/couchpotato/core/loader.py index 30395195..a97437a2 100644 --- a/couchpotato/core/loader.py +++ b/couchpotato/core/loader.py @@ -67,6 +67,18 @@ class Loader(object): def addFromDir(self, plugin_type, priority, module, dir_name): + # Load dir module + try: + m = __import__(module) + splitted = module.split('.') + for sub in splitted[1:]: + m = getattr(m, sub) + + if hasattr(m, 'config'): + fireEvent('settings.options', splitted[-1] + '_config', getattr(m, 'config')) + except: + raise + for cur_file in glob.glob(os.path.join(dir_name, '*')): name = os.path.basename(cur_file) if os.path.isdir(os.path.join(dir_name, name)): diff --git a/couchpotato/core/notifications/__init__.py b/couchpotato/core/notifications/__init__.py index e69de29b..8ac24dfb 100644 --- a/couchpotato/core/notifications/__init__.py +++ b/couchpotato/core/notifications/__init__.py @@ -0,0 +1,13 @@ +config = { + 'name': 'notification_providers', + 'groups': [ + { + 'label': 'Notifications', + 'description': 'Notify when movies are done or snatched', + 'type': 'list', + 'name': 'notification_providers', + 'tab': 'notifications', + 'options': [], + }, + ], +} diff --git a/couchpotato/core/notifications/boxcar/__init__.py b/couchpotato/core/notifications/boxcar/__init__.py index f83722f9..ab244c32 100644 --- a/couchpotato/core/notifications/boxcar/__init__.py +++ b/couchpotato/core/notifications/boxcar/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'notifications', + 'list': 'notification_providers', 'name': 'boxcar', 'options': [ { diff --git a/couchpotato/core/notifications/email/__init__.py b/couchpotato/core/notifications/email/__init__.py index ed55528d..b41cc8e6 100644 --- a/couchpotato/core/notifications/email/__init__.py +++ b/couchpotato/core/notifications/email/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'notifications', + 'list': 'notification_providers', 'name': 'email', 'options': [ { diff --git a/couchpotato/core/notifications/growl/__init__.py b/couchpotato/core/notifications/growl/__init__.py index 82a66361..8e462236 100644 --- a/couchpotato/core/notifications/growl/__init__.py +++ b/couchpotato/core/notifications/growl/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'notifications', + 'list': 'notification_providers', 'name': 'growl', 'description': 'Version 1.4+', 'options': [ diff --git a/couchpotato/core/notifications/nmj/__init__.py b/couchpotato/core/notifications/nmj/__init__.py index 6fac5ee6..08a21a3e 100644 --- a/couchpotato/core/notifications/nmj/__init__.py +++ b/couchpotato/core/notifications/nmj/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'notifications', + 'list': 'notification_providers', 'name': 'nmj', 'label': 'NMJ', 'options': [ diff --git a/couchpotato/core/notifications/notifo/__init__.py b/couchpotato/core/notifications/notifo/__init__.py index 5bf035c8..941246cc 100644 --- a/couchpotato/core/notifications/notifo/__init__.py +++ b/couchpotato/core/notifications/notifo/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'notifications', + 'list': 'notification_providers', 'name': 'notifo', 'description': 'Keep in mind that Notifo service will end soon.', 'options': [ diff --git a/couchpotato/core/notifications/notifymyandroid/__init__.py b/couchpotato/core/notifications/notifymyandroid/__init__.py index 58f8e62c..9ee5d90a 100644 --- a/couchpotato/core/notifications/notifymyandroid/__init__.py +++ b/couchpotato/core/notifications/notifymyandroid/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'notifications', + 'list': 'notification_providers', 'name': 'notifymyandroid', 'label': 'Notify My Android', 'options': [ diff --git a/couchpotato/core/notifications/notifymywp/__init__.py b/couchpotato/core/notifications/notifymywp/__init__.py index 76228e6a..4e52761d 100644 --- a/couchpotato/core/notifications/notifymywp/__init__.py +++ b/couchpotato/core/notifications/notifymywp/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'notifications', + 'list': 'notification_providers', 'name': 'notifymywp', 'label': 'Notify My Windows Phone', 'options': [ diff --git a/couchpotato/core/notifications/plex/__init__.py b/couchpotato/core/notifications/plex/__init__.py index f908cbb2..8d89a40f 100644 --- a/couchpotato/core/notifications/plex/__init__.py +++ b/couchpotato/core/notifications/plex/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'notifications', + 'list': 'notification_providers', 'name': 'plex', 'options': [ { diff --git a/couchpotato/core/notifications/prowl/__init__.py b/couchpotato/core/notifications/prowl/__init__.py index 5884f748..e0564289 100644 --- a/couchpotato/core/notifications/prowl/__init__.py +++ b/couchpotato/core/notifications/prowl/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'notifications', + 'list': 'notification_providers', 'name': 'prowl', 'options': [ { diff --git a/couchpotato/core/notifications/pushover/__init__.py b/couchpotato/core/notifications/pushover/__init__.py index d8d76b78..1ea1d5c0 100644 --- a/couchpotato/core/notifications/pushover/__init__.py +++ b/couchpotato/core/notifications/pushover/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'notifications', + 'list': 'notification_providers', 'name': 'pushover', 'options': [ { diff --git a/couchpotato/core/notifications/synoindex/__init__.py b/couchpotato/core/notifications/synoindex/__init__.py index af476238..eb3a793f 100644 --- a/couchpotato/core/notifications/synoindex/__init__.py +++ b/couchpotato/core/notifications/synoindex/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'notifications', + 'list': 'notification_providers', 'name': 'synoindex', 'description': 'Automaticly adds index to Synology Media Server.', 'options': [ diff --git a/couchpotato/core/notifications/toasty/__init__.py b/couchpotato/core/notifications/toasty/__init__.py index 25d27ecd..8e2dae76 100644 --- a/couchpotato/core/notifications/toasty/__init__.py +++ b/couchpotato/core/notifications/toasty/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'notifications', + 'list': 'notification_providers', 'name': 'toasty', 'options': [ { diff --git a/couchpotato/core/notifications/twitter/__init__.py b/couchpotato/core/notifications/twitter/__init__.py index 5910b0a2..9db8dcb8 100644 --- a/couchpotato/core/notifications/twitter/__init__.py +++ b/couchpotato/core/notifications/twitter/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'notifications', + 'list': 'notification_providers', 'name': 'twitter', 'options': [ { diff --git a/couchpotato/core/notifications/xbmc/__init__.py b/couchpotato/core/notifications/xbmc/__init__.py index ee2b4cc2..0753c82a 100644 --- a/couchpotato/core/notifications/xbmc/__init__.py +++ b/couchpotato/core/notifications/xbmc/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'notifications', + 'list': 'notification_providers', 'name': 'xbmc', 'label': 'XBMC', 'description': 'v11 (Eden) and v12 (Frodo)', diff --git a/couchpotato/core/providers/automation/__init__.py b/couchpotato/core/providers/automation/__init__.py index e69de29b..a217948a 100644 --- a/couchpotato/core/providers/automation/__init__.py +++ b/couchpotato/core/providers/automation/__init__.py @@ -0,0 +1,21 @@ +config = { + 'name': 'automation_providers', + 'groups': [ + { + 'label': 'Watchlists', + 'description': 'Check watchlists for new movies', + 'type': 'list', + 'name': 'watchlist_providers', + 'tab': 'automation', + 'options': [], + }, + { + 'label': 'Automated', + 'description': 'Uses minimal requirements', + 'type': 'list', + 'name': 'automation_providers', + 'tab': 'automation', + 'options': [], + }, + ], +} diff --git a/couchpotato/core/providers/automation/bluray/__init__.py b/couchpotato/core/providers/automation/bluray/__init__.py index 6e9d831d..b916b0af 100644 --- a/couchpotato/core/providers/automation/bluray/__init__.py +++ b/couchpotato/core/providers/automation/bluray/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'automation', + 'list': 'automation_providers', 'name': 'bluray_automation', 'label': 'Blu-ray.com', 'description': 'Imports movies from blu-ray.com. (uses minimal requirements)', diff --git a/couchpotato/core/providers/automation/imdb/__init__.py b/couchpotato/core/providers/automation/imdb/__init__.py index 925138d0..8a91d42e 100644 --- a/couchpotato/core/providers/automation/imdb/__init__.py +++ b/couchpotato/core/providers/automation/imdb/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'automation', + 'list': 'watchlist_providers', 'name': 'imdb_automation', 'label': 'IMDB', 'description': 'From any public IMDB watchlists. Url should be the RSS link.', diff --git a/couchpotato/core/providers/automation/itunes/__init__.py b/couchpotato/core/providers/automation/itunes/__init__.py index 368c1e43..b5c565f6 100644 --- a/couchpotato/core/providers/automation/itunes/__init__.py +++ b/couchpotato/core/providers/automation/itunes/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'automation', + 'list': 'automation_providers', 'name': 'itunes_automation', 'label': 'iTunes', 'description': 'From any iTunes Store feed. Url should be the RSS link. (uses minimal requirements)', diff --git a/couchpotato/core/providers/automation/kinepolis/__init__.py b/couchpotato/core/providers/automation/kinepolis/__init__.py index eea36016..d3b8e898 100644 --- a/couchpotato/core/providers/automation/kinepolis/__init__.py +++ b/couchpotato/core/providers/automation/kinepolis/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'automation', + 'list': 'automation_providers', 'name': 'kinepolis_automation', 'label': 'Kinepolis', 'description': 'Imports movies from the current top 10 of kinepolis. (uses minimal requirements)', diff --git a/couchpotato/core/providers/automation/moviemeter/__init__.py b/couchpotato/core/providers/automation/moviemeter/__init__.py index 8ea7c06d..773bed45 100644 --- a/couchpotato/core/providers/automation/moviemeter/__init__.py +++ b/couchpotato/core/providers/automation/moviemeter/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'automation', + 'list': 'automation_providers', 'name': 'moviemeter_automation', 'label': 'Moviemeter', 'description': 'Imports movies from the current top 10 of moviemeter.nl. (uses minimal requirements)', diff --git a/couchpotato/core/providers/automation/movies_io/__init__.py b/couchpotato/core/providers/automation/movies_io/__init__.py index 5d997e9a..9b280930 100644 --- a/couchpotato/core/providers/automation/movies_io/__init__.py +++ b/couchpotato/core/providers/automation/movies_io/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'automation', + 'list': 'watchlist_providers', 'name': 'moviesio', 'label': 'Movies.IO', 'description': 'Imports movies from Movies.io RSS watchlists', diff --git a/couchpotato/core/providers/automation/rottentomatoes/__init__.py b/couchpotato/core/providers/automation/rottentomatoes/__init__.py index f3c12919..dd96fe45 100644 --- a/couchpotato/core/providers/automation/rottentomatoes/__init__.py +++ b/couchpotato/core/providers/automation/rottentomatoes/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'automation', + 'list': 'automation_providers', 'name': 'rottentomatoes_automation', 'label': 'Rottentomatoes', 'description': 'Imports movies from the rottentomatoes "in theaters"-feed.', diff --git a/couchpotato/core/providers/automation/trakt/__init__.py b/couchpotato/core/providers/automation/trakt/__init__.py index fca7af35..cbaaece3 100644 --- a/couchpotato/core/providers/automation/trakt/__init__.py +++ b/couchpotato/core/providers/automation/trakt/__init__.py @@ -8,6 +8,7 @@ config = [{ 'groups': [ { 'tab': 'automation', + 'list': 'watchlist_providers', 'name': 'trakt_automation', 'label': 'Trakt', 'description': 'import movies from your own watchlist', diff --git a/couchpotato/core/providers/nzb/__init__.py b/couchpotato/core/providers/nzb/__init__.py index e69de29b..a704a94e 100644 --- a/couchpotato/core/providers/nzb/__init__.py +++ b/couchpotato/core/providers/nzb/__init__.py @@ -0,0 +1,14 @@ +config = { + 'name': 'nzb_providers', + 'groups': [ + { + 'label': 'Usenet', + 'description': 'Providers searching usenet for new releases', + 'type': 'list', + 'name': 'nzb_providers', + 'tab': 'searcher', + 'subtab': 'providers', + 'options': [], + }, + ], +} diff --git a/couchpotato/core/providers/nzb/binsearch/__init__.py b/couchpotato/core/providers/nzb/binsearch/__init__.py index 42281ec0..bf45f668 100644 --- a/couchpotato/core/providers/nzb/binsearch/__init__.py +++ b/couchpotato/core/providers/nzb/binsearch/__init__.py @@ -8,7 +8,8 @@ config = [{ 'groups': [ { 'tab': 'searcher', - 'subtab': 'nzb_providers', + 'subtab': 'providers', + 'list': 'nzb_providers', 'name': 'binsearch', 'description': 'Free provider, less accurate. See BinSearch', 'options': [ diff --git a/couchpotato/core/providers/nzb/ftdworld/__init__.py b/couchpotato/core/providers/nzb/ftdworld/__init__.py index e11f486a..76985648 100644 --- a/couchpotato/core/providers/nzb/ftdworld/__init__.py +++ b/couchpotato/core/providers/nzb/ftdworld/__init__.py @@ -8,7 +8,8 @@ config = [{ 'groups': [ { 'tab': 'searcher', - 'subtab': 'nzb_providers', + 'subtab': 'providers', + 'list': 'nzb_providers', 'name': 'FTDWorld', 'description': 'Free provider, less accurate. See FTDWorld', 'options': [ diff --git a/couchpotato/core/providers/nzb/newznab/__init__.py b/couchpotato/core/providers/nzb/newznab/__init__.py index 1e76d1ca..9047d200 100644 --- a/couchpotato/core/providers/nzb/newznab/__init__.py +++ b/couchpotato/core/providers/nzb/newznab/__init__.py @@ -8,7 +8,8 @@ config = [{ 'groups': [ { 'tab': 'searcher', - 'subtab': 'nzb_providers', + 'subtab': 'providers', + 'list': 'nzb_providers', 'name': 'newznab', 'order': 10, 'description': 'Enable NewzNab providers such as NZB.su, \ diff --git a/couchpotato/core/providers/nzb/nzbclub/__init__.py b/couchpotato/core/providers/nzb/nzbclub/__init__.py index c7cf8d94..310f4b09 100644 --- a/couchpotato/core/providers/nzb/nzbclub/__init__.py +++ b/couchpotato/core/providers/nzb/nzbclub/__init__.py @@ -8,7 +8,8 @@ config = [{ 'groups': [ { 'tab': 'searcher', - 'subtab': 'nzb_providers', + 'subtab': 'providers', + 'list': 'nzb_providers', 'name': 'NZBClub', 'description': 'Free provider, less accurate. See NZBClub', 'options': [ diff --git a/couchpotato/core/providers/nzb/nzbindex/__init__.py b/couchpotato/core/providers/nzb/nzbindex/__init__.py index 04d5022e..bad0557d 100644 --- a/couchpotato/core/providers/nzb/nzbindex/__init__.py +++ b/couchpotato/core/providers/nzb/nzbindex/__init__.py @@ -8,7 +8,8 @@ config = [{ 'groups': [ { 'tab': 'searcher', - 'subtab': 'nzb_providers', + 'subtab': 'providers', + 'list': 'nzb_providers', 'name': 'nzbindex', 'description': 'Free provider, less accurate. See NZBIndex', 'options': [ diff --git a/couchpotato/core/providers/nzb/nzbsrus/__init__.py b/couchpotato/core/providers/nzb/nzbsrus/__init__.py index cd4d6691..5c4586d7 100644 --- a/couchpotato/core/providers/nzb/nzbsrus/__init__.py +++ b/couchpotato/core/providers/nzb/nzbsrus/__init__.py @@ -8,7 +8,8 @@ config = [{ 'groups': [ { 'tab': 'searcher', - 'subtab': 'nzb_providers', + 'subtab': 'providers', + 'list': 'nzb_providers', 'name': 'nzbsrus', 'label': 'Nzbsrus', 'description': 'See NZBsRus', diff --git a/couchpotato/core/providers/nzb/nzbx/__init__.py b/couchpotato/core/providers/nzb/nzbx/__init__.py index f1c7d588..2063a5e8 100644 --- a/couchpotato/core/providers/nzb/nzbx/__init__.py +++ b/couchpotato/core/providers/nzb/nzbx/__init__.py @@ -8,7 +8,8 @@ config = [{ 'groups': [ { 'tab': 'searcher', - 'subtab': 'nzb_providers', + 'subtab': 'providers', + 'list': 'nzb_providers', 'name': 'nzbX', 'description': 'Free provider. See nzbX', 'options': [ diff --git a/couchpotato/core/providers/nzb/omgwtfnzbs/__init__.py b/couchpotato/core/providers/nzb/omgwtfnzbs/__init__.py index 089b72c6..74fee0a8 100644 --- a/couchpotato/core/providers/nzb/omgwtfnzbs/__init__.py +++ b/couchpotato/core/providers/nzb/omgwtfnzbs/__init__.py @@ -8,7 +8,8 @@ config = [{ 'groups': [ { 'tab': 'searcher', - 'subtab': 'nzb_providers', + 'subtab': 'providers', + 'list': 'nzb_providers', 'name': 'OMGWTFNZBs', 'description': 'See OMGWTFNZBs', 'options': [ diff --git a/couchpotato/core/providers/torrent/__init__.py b/couchpotato/core/providers/torrent/__init__.py index e69de29b..df6cd9ad 100644 --- a/couchpotato/core/providers/torrent/__init__.py +++ b/couchpotato/core/providers/torrent/__init__.py @@ -0,0 +1,14 @@ +config = { + 'name': 'torrent_providers', + 'groups': [ + { + 'label': 'Torrent', + 'description': 'Providers searching torrent sites for new releases', + 'type': 'list', + 'name': 'torrent_providers', + 'tab': 'searcher', + 'subtab': 'providers', + 'options': [], + }, + ], +} diff --git a/couchpotato/core/providers/torrent/kickasstorrents/__init__.py b/couchpotato/core/providers/torrent/kickasstorrents/__init__.py index d31250fb..8ddb1f4a 100644 --- a/couchpotato/core/providers/torrent/kickasstorrents/__init__.py +++ b/couchpotato/core/providers/torrent/kickasstorrents/__init__.py @@ -8,7 +8,8 @@ config = [{ 'groups': [ { 'tab': 'searcher', - 'subtab': 'torrent_providers', + 'subtab': 'providers', + 'list': 'torrent_providers', 'name': 'KickAssTorrents', 'description': 'See KickAssTorrents', 'wizard': True, diff --git a/couchpotato/core/providers/torrent/passthepopcorn/__init__.py b/couchpotato/core/providers/torrent/passthepopcorn/__init__.py index 3291c9cd..ce9d3822 100644 --- a/couchpotato/core/providers/torrent/passthepopcorn/__init__.py +++ b/couchpotato/core/providers/torrent/passthepopcorn/__init__.py @@ -8,7 +8,8 @@ config = [{ 'groups': [ { 'tab': 'searcher', - 'subtab': 'torrent_providers', + 'subtab': 'providers', + 'list': 'torrent_providers', 'name': 'PassThePopcorn', 'description': 'See PassThePopcorn.me', 'options': [ diff --git a/couchpotato/core/providers/torrent/publichd/__init__.py b/couchpotato/core/providers/torrent/publichd/__init__.py index b0d3b70b..06be3354 100644 --- a/couchpotato/core/providers/torrent/publichd/__init__.py +++ b/couchpotato/core/providers/torrent/publichd/__init__.py @@ -8,7 +8,8 @@ config = [{ 'groups': [ { 'tab': 'searcher', - 'subtab': 'torrent_providers', + 'subtab': 'providers', + 'list': 'torrent_providers', 'name': 'PublicHD', 'description': 'Public Torrent site with only HD content. See PublicHD', 'options': [ diff --git a/couchpotato/core/providers/torrent/sceneaccess/__init__.py b/couchpotato/core/providers/torrent/sceneaccess/__init__.py index e59f89b1..13614820 100644 --- a/couchpotato/core/providers/torrent/sceneaccess/__init__.py +++ b/couchpotato/core/providers/torrent/sceneaccess/__init__.py @@ -8,7 +8,8 @@ config = [{ 'groups': [ { 'tab': 'searcher', - 'subtab': 'torrent_providers', + 'subtab': 'providers', + 'list': 'torrent_providers', 'name': 'SceneAccess', 'description': 'See SceneAccess', 'options': [ diff --git a/couchpotato/core/providers/torrent/scenehd/__init__.py b/couchpotato/core/providers/torrent/scenehd/__init__.py index 69cf8a17..032e7055 100644 --- a/couchpotato/core/providers/torrent/scenehd/__init__.py +++ b/couchpotato/core/providers/torrent/scenehd/__init__.py @@ -8,7 +8,8 @@ config = [{ 'groups': [ { 'tab': 'searcher', - 'subtab': 'torrent_providers', + 'subtab': 'providers', + 'list': 'torrent_providers', 'name': 'SceneHD', 'description': 'See SceneHD', 'options': [ diff --git a/couchpotato/core/providers/torrent/thepiratebay/__init__.py b/couchpotato/core/providers/torrent/thepiratebay/__init__.py index f890ca0e..38169084 100644 --- a/couchpotato/core/providers/torrent/thepiratebay/__init__.py +++ b/couchpotato/core/providers/torrent/thepiratebay/__init__.py @@ -8,7 +8,8 @@ config = [{ 'groups': [ { 'tab': 'searcher', - 'subtab': 'torrent_providers', + 'subtab': 'providers', + 'list': 'torrent_providers', 'name': 'ThePirateBay', 'description': 'The world\'s largest bittorrent tracker. See ThePirateBay', 'wizard': True, diff --git a/couchpotato/core/providers/torrent/torrentday/__init__.py b/couchpotato/core/providers/torrent/torrentday/__init__.py index 8ffd48cf..2ebf0d94 100644 --- a/couchpotato/core/providers/torrent/torrentday/__init__.py +++ b/couchpotato/core/providers/torrent/torrentday/__init__.py @@ -8,7 +8,8 @@ config = [{ 'groups': [ { 'tab': 'searcher', - 'subtab': 'torrent_providers', + 'subtab': 'providers', + 'list': 'torrent_providers', 'name': 'TorrentDay', 'description': 'See TorrentDay', 'options': [ diff --git a/couchpotato/core/providers/torrent/torrentleech/__init__.py b/couchpotato/core/providers/torrent/torrentleech/__init__.py index b808a005..5d1de874 100644 --- a/couchpotato/core/providers/torrent/torrentleech/__init__.py +++ b/couchpotato/core/providers/torrent/torrentleech/__init__.py @@ -8,7 +8,8 @@ config = [{ 'groups': [ { 'tab': 'searcher', - 'subtab': 'torrent_providers', + 'subtab': 'providers', + 'list': 'torrent_providers', 'name': 'TorrentLeech', 'description': 'See TorrentLeech', 'options': [ diff --git a/couchpotato/static/scripts/page/settings.js b/couchpotato/static/scripts/page/settings.js index 11f1aa44..a050b3fe 100644 --- a/couchpotato/static/scripts/page/settings.js +++ b/couchpotato/static/scripts/page/settings.js @@ -7,6 +7,7 @@ Page.Settings = new Class({ wizard_only: false, tabs: {}, + lists: {}, current: 'about', has_tab: false, @@ -178,12 +179,24 @@ Page.Settings = new Class({ var content_container = self.tabs[group.tab].subtabs[group.subtab].content } + if(group.list && !self.lists[group.list]){ + self.lists[group.list] = self.createList(content_container); + } + // Create the group if(!self.tabs[group.tab].groups[group.name]){ var group_el = self.createGroup(group) - .inject(content_container) + .inject(group.list ? self.lists[group.list] : content_container) .addClass('section_'+section_name); - self.tabs[group.tab].groups[group.name] = group_el + self.tabs[group.tab].groups[group.name] = group_el; + } + + // Create list if needed + if(group.type && group.type == 'list'){ + if(!self.lists[group.name]) + self.lists[group.name] = self.createList(content_container); + else + self.lists[group.name].inject(self.tabs[group.tab].groups[group.name]); } // Add options to group @@ -283,6 +296,14 @@ Page.Settings = new Class({ ) return group_el + }, + + createList: function(content_container){ + return new Element('div.option_list').grab( + new Element('h3', { + 'text': 'Enable more providers' + }) + ).inject(content_container) } }); @@ -550,15 +571,21 @@ Option.Enabler = new Class({ }, checkState: function(){ - var self = this; + var self = this, + enabled = self.getValue(); + + self.parentFieldset[ enabled ? 'removeClass' : 'addClass']('disabled'); + + if(self.parentList) + self.parentFieldset.inject(self.parentList.getElement('h3'), enabled ? 'before' : 'after'); - self.parentFieldset[ self.getValue() ? 'removeClass' : 'addClass']('disabled'); }, afterInject: function(){ var self = this; - self.parentFieldset = self.el.getParent('fieldset') + self.parentFieldset = self.el.getParent('fieldset').addClass('enabler') + self.parentList = self.parentFieldset.getParent('.option_list'); self.el.inject(self.parentFieldset, 'top') self.checkState() } diff --git a/couchpotato/static/style/page/settings.css b/couchpotato/static/style/page/settings.css index 571e5a68..b9c9ea4e 100644 --- a/couchpotato/static/style/page/settings.css +++ b/couchpotato/static/style/page/settings.css @@ -92,6 +92,10 @@ font-size: 12px; margin-left: 10px; } + .page fieldset h2 .hint a { + margin: 0 !important; + padding: 0; + } .page fieldset.disabled .ctrlHolder { display: none; @@ -102,7 +106,7 @@ width: auto; margin: 0; position: relative; - margin-bottom: -25px; + margin-bottom: -23px; border: none; width: 20px; } @@ -148,6 +152,73 @@ } .page .xsmall { width: 20px !important; text-align: center; } + + .page .enabler { + display: block; + } + + .page .option_list { + margin-bottom: 20px; + } + + .page .option_list .enabler { + padding: 0; + } + + .page .option_list .enabler:not(.disabled) { + margin: 0 0 0 30px; + } + + .page .option_list .enabler:not(.disabled) .ctrlHolder:first-child { + margin: 10px 0 -33px 0; + } + + .page .option_list h3 { + padding: 0; + margin: 10px 0 0 0; + text-align: center; + font-weight: normal; + text-shadow: none; + text-transform: uppercase; + font-size: 12px; + background: rgba(255,255,255,0.03); + } + + .page .option_list .enabler.disabled { + display: inline-block; + margin: 3px 3px 3px 20px; + padding: 4px 0; + width: 159px; + vertical-align: top; + } + + .page .option_list .enabler.disabled h2 { + border: none; + box-shadow: none; + padding: 0 10px 0 25px; + font-size: 16px; + } + + .page .option_list .enabler:not(.disabled) h2 { + font-size: 16px; + font-weight: bold; + border: none; + border-top: 1px solid rgba(255,255,255, 0.15); + box-shadow: 0 -1px 0px #333; + margin: 0; + padding: 10px 0 5px 25px; + } + .page .option_list .enabler:not(.disabled):first-child h2 { + border: none; + box-shadow: none; + } + + .page .option_list .enabler.disabled h2 .hint { + display: none; + } + .page .option_list .enabler h2 .hint { + font-weight: normal; + } .page input[type=text], .page input[type=password] { padding: 5px 3px; From f8b4e75b74c53b2abfd44c1720ee6e40776d8310 Mon Sep 17 00:00:00 2001 From: Ruud Date: Sun, 20 Jan 2013 21:11:36 +0100 Subject: [PATCH 10/12] If data is empty, assume correct type for downloaders --- couchpotato/core/downloaders/base.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/couchpotato/core/downloaders/base.py b/couchpotato/core/downloaders/base.py index 377e6062..770d0316 100644 --- a/couchpotato/core/downloaders/base.py +++ b/couchpotato/core/downloaders/base.py @@ -106,4 +106,6 @@ class Downloader(Provider): def isEnabled(self, manual, data = {}): d_manual = self.conf('manual', default = False) - return super(Downloader, self).isEnabled() and ((d_manual and manual) or (d_manual is False)) and self.isCorrectType(data.get('type')) + return super(Downloader, self).isEnabled() and \ + ((d_manual and manual) or (d_manual is False)) and \ + (not data or self.isCorrectType(data.get('type'))) From 6ea045ddd3e7e39f52ad8a22014df13f288dbe5a Mon Sep 17 00:00:00 2001 From: Ruud Date: Mon, 21 Jan 2013 22:37:58 +0100 Subject: [PATCH 11/12] Remove failed wrong parameters --- couchpotato/core/downloaders/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/couchpotato/core/downloaders/base.py b/couchpotato/core/downloaders/base.py index 770d0316..4695d3b3 100644 --- a/couchpotato/core/downloaders/base.py +++ b/couchpotato/core/downloaders/base.py @@ -59,7 +59,7 @@ class Downloader(Provider): def _removeFailed(self, item): if self.conf('delete_failed', default = True): - return self.removeFailed(self, item) + return self.removeFailed(item) return False def removeFailed(self, item): From f84b23eeccb162b22f79b4f513833085d5a06dbd Mon Sep 17 00:00:00 2001 From: Ruud Date: Tue, 22 Jan 2013 21:35:11 +0100 Subject: [PATCH 12/12] Only fire enabled downloader failed event --- couchpotato/core/downloaders/base.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/couchpotato/core/downloaders/base.py b/couchpotato/core/downloaders/base.py index 4695d3b3..55a41838 100644 --- a/couchpotato/core/downloaders/base.py +++ b/couchpotato/core/downloaders/base.py @@ -58,12 +58,16 @@ class Downloader(Provider): return self.getAllDownloadStatus() def _removeFailed(self, item): + if self.isDisabled(manual = True, data = {}): + return + if self.conf('delete_failed', default = True): return self.removeFailed(item) + return False def removeFailed(self, item): - return False + return def isCorrectType(self, item_type): is_correct = item_type in self.type