From 0c14334e231bf3e5e90b49ec25a583ab96661333 Mon Sep 17 00:00:00 2001 From: Ruud Date: Wed, 11 Jul 2012 23:50:00 +0200 Subject: [PATCH 01/16] More feedback on download button. fix #537 --- couchpotato/core/plugins/movie/static/movie.js | 18 ++++++++++++++++-- couchpotato/core/plugins/release/main.py | 6 +++--- couchpotato/static/images/icon.attention.png | Bin 0 -> 49032 bytes couchpotato/static/images/icon.spinner.gif | Bin 0 -> 1539 bytes couchpotato/static/style/main.css | 4 +++- 5 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 couchpotato/static/images/icon.attention.png create mode 100644 couchpotato/static/images/icon.spinner.gif diff --git a/couchpotato/core/plugins/movie/static/movie.js b/couchpotato/core/plugins/movie/static/movie.js index d71eb64..23b8c0d 100644 --- a/couchpotato/core/plugins/movie/static/movie.js +++ b/couchpotato/core/plugins/movie/static/movie.js @@ -365,7 +365,8 @@ var ReleaseAction = new Class({ } catch(e){} new Element('div', { - 'class': 'item '+status.identifier + 'class': 'item '+status.identifier, + 'id': 'release_'+release.id }).adopt( new Element('span.name', {'text': self.get(release, 'name'), 'title': self.get(release, 'name')}), new Element('span.status', {'text': status.identifier, 'class': 'release_status '+status.identifier}), @@ -382,7 +383,8 @@ var ReleaseAction = new Class({ 'events': { 'click': function(e){ (e).preventDefault(); - self.download(release); + if(!this.hasClass('completed')) + self.download(release); } } }), @@ -414,9 +416,21 @@ var ReleaseAction = new Class({ download: function(release){ var self = this; + var release_el = self.release_container.getElement('#release_'+release.id), + icon = release_el.getElement('.download.icon'); + + icon.addClass('spinner'); + Api.request('release.download', { 'data': { 'id': release.id + }, + 'onComplete': function(json){ + icon.removeClass('spinner') + if(json.success) + icon.addClass('completed'); + else + icon.addClass('attention').set('title', 'Something went wrong when downloading, please check logs.'); } }); }, diff --git a/couchpotato/core/plugins/release/main.py b/couchpotato/core/plugins/release/main.py index 10de054..ff2507e 100644 --- a/couchpotato/core/plugins/release/main.py +++ b/couchpotato/core/plugins/release/main.py @@ -146,16 +146,16 @@ class Release(Plugin): provider = fireEvent('provider.belongs_to', item['url'], provider = item.get('provider'), single = True) item['download'] = provider.download - fireEvent('searcher.download', data = item, movie = rel.movie.to_dict({ + success = fireEvent('searcher.download', data = item, movie = rel.movie.to_dict({ 'profile': {'types': {'quality': {}}}, 'releases': {'status': {}, 'quality': {}}, 'library': {'titles': {}, 'files':{}}, 'files': {} - }), manual = True) + }), manual = True, single = True) #db.close() return jsonified({ - 'success': True + 'success': success }) else: log.error('Couldn\'t find release with id: %s', id) diff --git a/couchpotato/static/images/icon.attention.png b/couchpotato/static/images/icon.attention.png new file mode 100644 index 0000000000000000000000000000000000000000..9878676c885b3480bbb3192301b8d1ca63acd9fe GIT binary patch literal 49032 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 MYrU0RY`Ht?4~Jtpd;kCd literal 0 HcmV?d00001 diff --git a/couchpotato/static/images/icon.spinner.gif b/couchpotato/static/images/icon.spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..4abd8868ba1a29885c3a1a91054435d5e966f0e2 GIT binary patch literal 1539 zcmb7^drVVT9LH-PaQnWuz4!KJQ_|kvmeK($ZNVy4X=$~k<=rwMn3c8?ltpDQdBy-% zEl@kkKtKsgkUB;`iro=Cr_z&27%3fy9l+Qo(b|Pl|EOm`R+oYN2~4g|z7=q+bd?Sms|8k%a6hXR zE(MoOCIvm&Nba4+!9cLvF(n0i4}~oDI*GU4cV?l@uQ^Nf8YX@qBFgL5lnR-RFSeQa zDzq3mfFnBvAX1JF`ejFsRyZt#0NTm#hU(LDTVc7#7~d>cAs~n&83HR@Y#op_dTXki#R4dUUnA*LW5eo%JZ*73)PU@W zS&)?N%nx3OE`iGTGwO81rgJ^5-t-_ijVBcK|mK`66C?WU0!Thd>A`)2CUaYrn49{q8@xn zL;F`)oiQ3L`vpyo?qPWlBNi`)ZoB%cz+1PL7XC6oH>~ZHpS>G|3cjClB1q*CGs*Lk4i9O;7;y^0p$}+OC6| zMmy9tfk9feq>^}{=OqwG+C&0KoLGBu9iG~|nm*V)c869ft+P8HsT)IDyS6avn{#(s zLl~2G(8h4`JmCmgx4@uT^U01e9_6EbUxz#i+o+EX=-xk3KQnPpUJXTyO5BU^BYze# zJ92VaR9@J8Iccf8r&2yhmCCb?sF%LpJtr*erPS%Br$MK6d)P6qPt>ZT|L|s}CidgwVmFy?u8&gMX;8l9F>$(2CRJ9FD`{$}VTuh<#@-pIB-@V(8Ga83xz zz@$*>TouekQ9ermv)DMIJE%;InS^nGDuSP+V$$S{R5i|FB#ts(^jA^- zUnD3hkeDBQF)$>_by9&edX!L7Qv|H8A})r2jhIqGg}6+F)!Be2Cu1Bs2C{mo6X8a`|5To#gbKDnesVvw{!9rIbaTTciT$(jq`IJ znFS5Am%@e%Y3AE7Ig$6SghNI{Kc9|!pI6Yoq?{YANk>K{9&3|`zAzp@XahLaZ^8VUP+_33{rF=Ol)R4UG8wea0&3j*3CDilQEy+d}H VUXux$WCCcH0)v{;PRGpW{te?{(zO5p literal 0 HcmV?d00001 diff --git a/couchpotato/static/style/main.css b/couchpotato/static/style/main.css index f5630f3..17ca8bf 100644 --- a/couchpotato/static/style/main.css +++ b/couchpotato/static/style/main.css @@ -147,7 +147,7 @@ body > .spinner, .mask{ .icon.delete { background-image: url('../images/icon.delete.png'); } .icon.download { background-image: url('../images/icon.download.png'); } .icon.edit { background-image: url('../images/icon.edit.png'); } -.icon.check { background-image: url('../images/icon.check.png'); } +.icon.completed { background-image: url('../images/icon.check.png'); } .icon.folder { background-image: url('../images/icon.folder.png'); } .icon.imdb { background-image: url('../images/icon.imdb.png'); } .icon.refresh { background-image: url('../images/icon.refresh.png'); } @@ -155,6 +155,8 @@ body > .spinner, .mask{ .icon.files { background-image: url('../images/icon.files.png'); } .icon.info { background-image: url('../images/icon.info.png'); } .icon.trailer { background-image: url('../images/icon.trailer.png'); } +.icon.spinner { background-image: url('../images/icon.spinner.gif'); } +.icon.attention { background-image: url('../images/icon.attention.png'); } /*** Navigation ***/ .header { From 0d0ac196c2249551252e1444d94cd8d6f577ca74 Mon Sep 17 00:00:00 2001 From: Ruud Date: Wed, 11 Jul 2012 23:59:47 +0200 Subject: [PATCH 02/16] Properly show update message --- couchpotato/core/_base/updater/static/updater.js | 2 ++ couchpotato/static/style/main.css | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/couchpotato/core/_base/updater/static/updater.js b/couchpotato/core/_base/updater/static/updater.js index df6cf35..9f51b0c 100644 --- a/couchpotato/core/_base/updater/static/updater.js +++ b/couchpotato/core/_base/updater/static/updater.js @@ -62,6 +62,8 @@ var UpdaterBase = new Class({ createMessage: function(data){ var self = this; + if(self.message) return; + var changelog = 'https://github.com/'+data.repo_name+'/compare/'+data.version.hash+'...'+data.branch; if(data.update_version.changelog) changelog = data.update_version.changelog + '#' + data.version.hash+'...'+data.update_version.hash diff --git a/couchpotato/static/style/main.css b/couchpotato/static/style/main.css index 17ca8bf..183374b 100644 --- a/couchpotato/static/style/main.css +++ b/couchpotato/static/style/main.css @@ -315,7 +315,7 @@ body > .spinner, .mask{ .header .message.update { text-align: center; position: relative; - top: -100px; + top: -70px; padding: 2px 0; background: #ff6134; font-size: 12px; From 7ddb5c245027ffd45ac15861165546b614144c59 Mon Sep 17 00:00:00 2001 From: Ruud Date: Thu, 12 Jul 2012 00:01:46 +0200 Subject: [PATCH 03/16] Don't fire search on start --- couchpotato/core/plugins/searcher/main.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/couchpotato/core/plugins/searcher/main.py b/couchpotato/core/plugins/searcher/main.py index 9ebdec6..03eb6cf 100644 --- a/couchpotato/core/plugins/searcher/main.py +++ b/couchpotato/core/plugins/searcher/main.py @@ -29,9 +29,6 @@ class Searcher(Plugin): # Schedule cronjob fireEvent('schedule.cron', 'searcher.all', self.all_movies, day = self.conf('cron_day'), hour = self.conf('cron_hour'), minute = self.conf('cron_minute')) - - addEvent('app.load', self.all_movies) - def all_movies(self): if self.in_progress: From 0cceb39c679c6ebcc5a8f5e9c473e7e30ef550fe Mon Sep 17 00:00:00 2001 From: Ruud Date: Thu, 12 Jul 2012 00:23:51 +0200 Subject: [PATCH 04/16] Run updater on start --- couchpotato/core/_base/updater/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/couchpotato/core/_base/updater/main.py b/couchpotato/core/_base/updater/main.py index b0092a2..f3a5bde 100644 --- a/couchpotato/core/_base/updater/main.py +++ b/couchpotato/core/_base/updater/main.py @@ -32,7 +32,7 @@ class Updater(Plugin): self.updater = SourceUpdater() fireEvent('schedule.interval', 'updater.check', self.autoUpdate, hours = 6) - addEvent('app.load', self.check) + addEvent('app.load', self.autoUpdate) addEvent('updater.info', self.info) addApiView('updater.info', self.getInfo, docs = { @@ -208,7 +208,7 @@ class GitUpdater(BaseUpdater): def check(self): if self.update_version: - return + return True log.info('Checking for new version on github for %s', self.repo_name) if not Env.get('dev'): From 5fb6f2dfe27c903ec1c047452151705068838670 Mon Sep 17 00:00:00 2001 From: Ruud Date: Thu, 12 Jul 2012 08:12:47 +0200 Subject: [PATCH 05/16] Subtitle language tag fix --- couchpotato/core/plugins/subtitle/main.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/couchpotato/core/plugins/subtitle/main.py b/couchpotato/core/plugins/subtitle/main.py index 0efb911..9ff39f4 100644 --- a/couchpotato/core/plugins/subtitle/main.py +++ b/couchpotato/core/plugins/subtitle/main.py @@ -54,11 +54,12 @@ class Subtitle(Plugin): for lang in self.getLanguages(): if lang not in available_languages: download = subliminal.download_subtitles(files, multi = True, force = False, languages = [lang], services = self.services, cache_dir = Env.get('cache_dir')) - downloaded.extend(download) + for subtitle in download: + downloaded.extend(download[subtitle]) for d_sub in downloaded: group['files']['subtitle'].add(d_sub.path) - group['subtitle_language'][d_sub.path] = [d_sub.language] + group['subtitle_language'][d_sub.path] = [d_sub.language.alpha2] return True From cc023f73a62915707034737ff34c1e06ddfd883d Mon Sep 17 00:00:00 2001 From: Ruud Date: Thu, 12 Jul 2012 10:14:24 +0200 Subject: [PATCH 06/16] Screwed up updater by passing wrong branch.. --- couchpotato/core/_base/updater/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/couchpotato/core/_base/updater/main.py b/couchpotato/core/_base/updater/main.py index f3a5bde..e52870a 100644 --- a/couchpotato/core/_base/updater/main.py +++ b/couchpotato/core/_base/updater/main.py @@ -112,7 +112,7 @@ class BaseUpdater(Plugin): repo_user = 'RuudBurger' repo_name = 'CouchPotatoServer' - branch = 'master' + branch = 'develop' version = None update_failed = False From 9d962db7556779bf0a1159ff41252ef9a56e278b Mon Sep 17 00:00:00 2001 From: Ruud Date: Fri, 13 Jul 2012 15:03:48 +0200 Subject: [PATCH 07/16] Better description for renaming. fix #568 --- couchpotato/core/plugins/renamer/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/couchpotato/core/plugins/renamer/__init__.py b/couchpotato/core/plugins/renamer/__init__.py index 9ceccb8..5943954 100644 --- a/couchpotato/core/plugins/renamer/__init__.py +++ b/couchpotato/core/plugins/renamer/__init__.py @@ -84,7 +84,7 @@ config = [{ 'advanced': True, 'name': 'separator', 'label': 'Separator', - 'description': 'Replace all the spaces with a character. Example: ".", "-". Leave empty to use spaces.', + 'description': 'Replace all the spaces with a character. Example: ".", "-" (without quotes). Leave empty to use spaces.', }, { 'advanced': True, From b29655c9df6ae36d0ab1395e87f7a1019fcdba88 Mon Sep 17 00:00:00 2001 From: Ruud Date: Fri, 13 Jul 2012 22:35:00 +0200 Subject: [PATCH 08/16] Return if nothing found --- couchpotato/core/providers/torrent/torrentleech/main.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/couchpotato/core/providers/torrent/torrentleech/main.py b/couchpotato/core/providers/torrent/torrentleech/main.py index e106a5a..c174a3d 100644 --- a/couchpotato/core/providers/torrent/torrentleech/main.py +++ b/couchpotato/core/providers/torrent/torrentleech/main.py @@ -52,6 +52,9 @@ class TorrentLeech(TorrentProvider): try: result_table = html.find('table', attrs = {'id' : 'torrenttable'}) + if not result_table: + return results + entries = result_table.find_all('tr') for result in entries[1:]: From 973c4c26c5796e11376c67e76e20610c0ec31c5f Mon Sep 17 00:00:00 2001 From: Ruud Date: Fri, 13 Jul 2012 22:40:45 +0200 Subject: [PATCH 09/16] Add trailer to manage section. close #572 --- couchpotato/static/scripts/page/wanted.js | 1 + 1 file changed, 1 insertion(+) diff --git a/couchpotato/static/scripts/page/wanted.js b/couchpotato/static/scripts/page/wanted.js index 6c918ce..5f2dcf7 100644 --- a/couchpotato/static/scripts/page/wanted.js +++ b/couchpotato/static/scripts/page/wanted.js @@ -244,6 +244,7 @@ window.addEvent('domready', function(){ MovieActions.Done = { 'IMDB': IMDBAction ,'Edit': MovieActions.Wanted.Edit + ,'Trailer': TrailerAction ,'Files': new Class({ Extends: MovieAction, From 974f2d040dbb1b0de20977e8fcd59e19d44fae01 Mon Sep 17 00:00:00 2001 From: Ruud Date: Fri, 13 Jul 2012 23:41:53 +0200 Subject: [PATCH 10/16] Clean unavailable files on full scan. fix #455 --- couchpotato/core/plugins/manage/main.py | 7 ++++++ couchpotato/core/plugins/release/main.py | 39 ++++++++++++++++++++++++++------ 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/couchpotato/core/plugins/manage/main.py b/couchpotato/core/plugins/manage/main.py index bea2fe4..bf739a6 100644 --- a/couchpotato/core/plugins/manage/main.py +++ b/couchpotato/core/plugins/manage/main.py @@ -73,6 +73,13 @@ class Manage(Plugin): for done_movie in done_movies: if done_movie['library']['identifier'] not in added_identifiers: fireEvent('movie.delete', movie_id = done_movie['id'], delete_from = 'all') + else: + for release in done_movie.get('releases', []): + for release_file in release.get('files', []): + # Remove release not available anymore + if not os.path.isfile(release_file['path']): + fireEvent('release.clean', release['id']) + break Env.prop('manage.last_update', time.time()) diff --git a/couchpotato/core/plugins/release/main.py b/couchpotato/core/plugins/release/main.py index ff2507e..ba79d9f 100644 --- a/couchpotato/core/plugins/release/main.py +++ b/couchpotato/core/plugins/release/main.py @@ -7,6 +7,7 @@ from couchpotato.core.plugins.base import Plugin from couchpotato.core.plugins.scanner.main import Scanner from couchpotato.core.settings.model import File, Release as Relea, Movie from sqlalchemy.sql.expression import and_, or_ +import os log = CPLog(__name__) @@ -22,7 +23,7 @@ class Release(Plugin): 'id': {'type': 'id', 'desc': 'ID of the release object in release-table'} } }) - addApiView('release.delete', self.delete, docs = { + addApiView('release.delete', self.deleteView, docs = { 'desc': 'Delete releases', 'params': { 'id': {'type': 'id', 'desc': 'ID of the release object in release-table'} @@ -35,6 +36,9 @@ class Release(Plugin): } }) + addEvent('release.delete', self.delete) + addEvent('release.clean', self.clean) + def add(self, group): db = get_session() @@ -99,20 +103,41 @@ class Release(Plugin): # Check database and update/insert if necessary return fireEvent('file.add', path = filepath, part = fireEvent('scanner.partnumber', file, single = True), type_tuple = Scanner.file_types.get(type), properties = properties, single = True) - def delete(self): + def deleteView(self): + + release_id = getParam('id') + + #db.close() + return jsonified({ + 'success': self.delete(release_id) + }) + + def delete(self, id): db = get_session() - id = getParam('id') rel = db.query(Relea).filter_by(id = id).first() if rel: rel.delete() db.commit() + return True - #db.close() - return jsonified({ - 'success': True - }) + return False + + def clean(self, id): + + db = get_session() + + rel = db.query(Relea).filter_by(id = id).first() + if rel: + for release_file in rel.files: + if not os.path.isfile(release_file.path): + db.delete(release_file) + db.commit() + + return True + + return False def ignore(self): From 199ac61b59c93f08018a6dab3325f1e914380570 Mon Sep 17 00:00:00 2001 From: Ruud Date: Fri, 13 Jul 2012 23:46:03 +0200 Subject: [PATCH 11/16] Encode trailer search title. fix #461 --- couchpotato/core/plugins/movie/static/movie.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/couchpotato/core/plugins/movie/static/movie.js b/couchpotato/core/plugins/movie/static/movie.js index 23b8c0d..09cf1a3 100644 --- a/couchpotato/core/plugins/movie/static/movie.js +++ b/couchpotato/core/plugins/movie/static/movie.js @@ -470,7 +470,7 @@ var TrailerAction = new Class({ var data_url = 'http://gdata.youtube.com/feeds/videos?vq="{title}" {year} trailer&max-results=1&alt=json-in-script&orderby=relevance&sortorder=descending&format=5&fmt=18' var url = data_url.substitute({ - 'title': self.movie.getTitle(), + 'title': encodeURI(self.movie.getTitle()), 'year': self.movie.get('year'), 'offset': offset || 1 }), From 57d3ef8058384f549c10bd030bcedf654fa0b1c1 Mon Sep 17 00:00:00 2001 From: Ruud Date: Fri, 13 Jul 2012 23:57:25 +0200 Subject: [PATCH 12/16] Meta data getting renamed with sample filename. fix #467 --- couchpotato/core/plugins/renamer/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/couchpotato/core/plugins/renamer/main.py b/couchpotato/core/plugins/renamer/main.py index 50f7e13..e75ab5c 100644 --- a/couchpotato/core/plugins/renamer/main.py +++ b/couchpotato/core/plugins/renamer/main.py @@ -165,7 +165,6 @@ class Renamer(Plugin): # Group filename without cd extension replacements['cd'] = '' replacements['cd_nr'] = '' - group['filename'] = self.doReplace(file_name, replacements)[:-(len(getExt(final_file_name)) + 1)] # Meta naming if file_type is 'trailer': @@ -238,6 +237,7 @@ class Renamer(Plugin): ) rename_files = mergeDicts(rename_files, rename_extras) + group['filename'] = self.doReplace(file_name, replacements)[:-(len(getExt(final_file_name)) + 1)] group['destination_dir'] = os.path.join(destination, final_folder_name) if multiple: From 7f983c953066e64738d1827c7e3192cbff59c2da Mon Sep 17 00:00:00 2001 From: Ruud Date: Sat, 14 Jul 2012 00:15:31 +0200 Subject: [PATCH 13/16] Prevent parameter reference.. --- couchpotato/core/plugins/base.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/couchpotato/core/plugins/base.py b/couchpotato/core/plugins/base.py index 3d1682c..92f6f8c 100644 --- a/couchpotato/core/plugins/base.py +++ b/couchpotato/core/plugins/base.py @@ -95,7 +95,10 @@ class Plugin(object): return False # http request - def urlopen(self, url, timeout = 30, params = {}, headers = {}, opener = None, multipart = False, show_error = True): + def urlopen(self, url, timeout = 30, params = None, headers = None, opener = None, multipart = False, show_error = True): + + if not headers: headers = {} + if not params: params = {} # Fill in some headers if not headers.get('Referer'): From 44096f7ca0f296aad801dd612d875f988cae8861 Mon Sep 17 00:00:00 2001 From: Ruud Date: Sat, 14 Jul 2012 00:16:02 +0200 Subject: [PATCH 14/16] Simplify KickAssTorrent search. fix #472 --- couchpotato/core/providers/torrent/kickasstorrents/main.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/couchpotato/core/providers/torrent/kickasstorrents/main.py b/couchpotato/core/providers/torrent/kickasstorrents/main.py index 2c9b893..ad3448d 100644 --- a/couchpotato/core/providers/torrent/kickasstorrents/main.py +++ b/couchpotato/core/providers/torrent/kickasstorrents/main.py @@ -1,6 +1,6 @@ from bs4 import BeautifulSoup from couchpotato.core.event import fireEvent -from couchpotato.core.helpers.variable import tryInt, getTitle +from couchpotato.core.helpers.variable import tryInt from couchpotato.core.logger import CPLog from couchpotato.core.providers.torrent.base import TorrentProvider import StringIO @@ -16,7 +16,7 @@ class KickAssTorrents(TorrentProvider): urls = { 'test': 'http://www.kat.ph/', 'detail': 'http://www.kat.ph/%s-t%s.html', - 'search': 'http://www.kat.ph/%s-i%s/', + 'search': 'http://www.kat.ph/i%s/', 'download': 'http://torcache.net/', } @@ -38,7 +38,7 @@ class KickAssTorrents(TorrentProvider): return results cache_key = 'kickasstorrents.%s.%s' % (movie['library']['identifier'], quality.get('identifier')) - data = self.getCache(cache_key, self.urls['search'] % (getTitle(movie['library']), movie['library']['identifier'].replace('tt', ''))) + data = self.getCache(cache_key, self.urls['search'] % (movie['library']['identifier'].replace('tt', ''))) if data: cat_ids = self.getCatId(quality['identifier']) From 6c52a991b05c4e2518fb6b6ab9caf22d9f6e2424 Mon Sep 17 00:00:00 2001 From: Ruud Date: Sat, 14 Jul 2012 00:22:18 +0200 Subject: [PATCH 15/16] Don't use backup category for KickAssTrrent. fix #524 --- couchpotato/core/providers/torrent/kickasstorrents/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/couchpotato/core/providers/torrent/kickasstorrents/main.py b/couchpotato/core/providers/torrent/kickasstorrents/main.py index ad3448d..c57ae8a 100644 --- a/couchpotato/core/providers/torrent/kickasstorrents/main.py +++ b/couchpotato/core/providers/torrent/kickasstorrents/main.py @@ -30,6 +30,7 @@ class KickAssTorrents(TorrentProvider): ] http_time_between_calls = 1 #seconds + cat_backup_id = None def search(self, movie, quality): From 1f4a545c39c988ea260766b9742eb8d287915aa7 Mon Sep 17 00:00:00 2001 From: Ruud Date: Sat, 14 Jul 2012 00:27:38 +0200 Subject: [PATCH 16/16] Also show release list when no quality. fix #565 --- couchpotato/core/plugins/movie/static/movie.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/couchpotato/core/plugins/movie/static/movie.js b/couchpotato/core/plugins/movie/static/movie.js index 09cf1a3..1ce0af7 100644 --- a/couchpotato/core/plugins/movie/static/movie.js +++ b/couchpotato/core/plugins/movie/static/movie.js @@ -357,7 +357,7 @@ var ReleaseAction = new Class({ Array.each(self.movie.data.releases, function(release){ var status = Status.get(release.status_id), - quality = Quality.getProfile(release.quality_id), + quality = Quality.getProfile(release.quality_id) || {}, info = release.info; try {