diff --git a/couchpotato/core/_base/_core.py b/couchpotato/core/_base/_core.py index 730bc884..0a98103b 100644 --- a/couchpotato/core/_base/_core.py +++ b/couchpotato/core/_base/_core.py @@ -51,6 +51,7 @@ class Core(Plugin): addEvent('app.api_url', self.createApiUrl) addEvent('app.version', self.version) addEvent('app.load', self.checkDataDir) + addEvent('app.load', self.cleanUpFolders) addEvent('setting.save.core.password', self.md5Password) addEvent('setting.save.core.api_key', self.checkApikey) @@ -75,6 +76,9 @@ class Core(Plugin): return True + def cleanUpFolders(self): + self.deleteEmptyFolder(Env.get('app_dir'), show_error = False) + def available(self, **kwargs): return { 'success': True diff --git a/couchpotato/core/_base/updater/main.py b/couchpotato/core/_base/updater/main.py index 17ed1bdd..cba91b7e 100644 --- a/couchpotato/core/_base/updater/main.py +++ b/couchpotato/core/_base/updater/main.py @@ -142,6 +142,10 @@ class Updater(Plugin): 'success': success } + def doShutdown(self): + self.updater.deletePyc(show_logs = False) + return super(Updater, self).doShutdown() + class BaseUpdater(Plugin): @@ -176,7 +180,7 @@ class BaseUpdater(Plugin): def check(self): pass - def deletePyc(self, only_excess = True): + def deletePyc(self, only_excess = True, show_logs = True): for root, dirs, files in scandir.walk(ss(Env.get('app_dir'))): @@ -186,7 +190,7 @@ class BaseUpdater(Plugin): for excess_pyc_file in excess_pyc_files: full_path = os.path.join(root, excess_pyc_file) - log.debug('Removing old PYC file: %s', full_path) + if show_logs: log.debug('Removing old PYC file: %s', full_path) try: os.remove(full_path) except: @@ -212,9 +216,6 @@ class GitUpdater(BaseUpdater): log.info('Updating to latest version') self.repo.pull() - # Delete leftover .pyc files - self.deletePyc() - return True except: log.error('Failed updating via GIT: %s', traceback.format_exc()) diff --git a/couchpotato/core/downloaders/base.py b/couchpotato/core/downloaders/base.py index bb7db606..269bdc62 100644 --- a/couchpotato/core/downloaders/base.py +++ b/couchpotato/core/downloaders/base.py @@ -162,7 +162,7 @@ class Downloader(Provider): (d_manual and manual or d_manual is False) and \ (not data or self.isCorrectProtocol(data.get('protocol'))) - def _test(self): + def _test(self, **kwargs): t = self.test() if isinstance(t, tuple): return {'success': t[0], 'msg': t[1]} diff --git a/couchpotato/core/media/_base/providers/base.py b/couchpotato/core/media/_base/providers/base.py index 94c70a01..13f0f6e0 100644 --- a/couchpotato/core/media/_base/providers/base.py +++ b/couchpotato/core/media/_base/providers/base.py @@ -200,7 +200,7 @@ class YarrProvider(Provider): self._search(media, quality, results) # Search possible titles else: - media_title = fireEvent('library.query', media['library'], single = True) + media_title = fireEvent('library.query', media, single = True) for title in possibleTitles(media_title): self._searchOnTitle(title, media, quality, results) diff --git a/couchpotato/core/media/_base/providers/nzb/newznab.py b/couchpotato/core/media/_base/providers/nzb/newznab.py index 41147d01..4430ac26 100644 --- a/couchpotato/core/media/_base/providers/nzb/newznab.py +++ b/couchpotato/core/media/_base/providers/nzb/newznab.py @@ -130,7 +130,7 @@ class Base(NZBProvider, RSS): hosts = self.getHosts() for host in hosts: - result = super(Newznab, self).belongsTo(url, host = host['host'], provider = provider) + result = super(Base, self).belongsTo(url, host = host['host'], provider = provider) if result: return result diff --git a/couchpotato/core/media/movie/_base/main.py b/couchpotato/core/media/movie/_base/main.py index 36e0a479..b2234cfc 100644 --- a/couchpotato/core/media/movie/_base/main.py +++ b/couchpotato/core/media/movie/_base/main.py @@ -14,8 +14,6 @@ import six log = CPLog(__name__) -autoload = 'MovieBase' - class MovieBase(MovieTypeBase): @@ -106,7 +104,7 @@ class MovieBase(MovieTypeBase): 'identifier': params.get('identifier'), 'status': status if status else 'active', 'profile_id': params.get('profile_id', default_profile.get('_id')), - 'category_id': cat_id if cat_id is not None and len(cat_id) > 0 else None, + 'category_id': cat_id if cat_id is not None and len(cat_id) > 0 and cat_id != '-1' else None, } # Update movie info diff --git a/couchpotato/core/media/movie/library.py b/couchpotato/core/media/movie/library.py new file mode 100644 index 00000000..a6e29f32 --- /dev/null +++ b/couchpotato/core/media/movie/library.py @@ -0,0 +1,29 @@ +from couchpotato.core.event import addEvent +from couchpotato.core.logger import CPLog +from couchpotato.core.media._base.library.base import LibraryBase + + +log = CPLog(__name__) + +autoload = 'MovieLibraryPlugin' + + +class MovieLibraryPlugin(LibraryBase): + + def __init__(self): + addEvent('library.query', self.query) + + def query(self, media, first = True, include_year = True, **kwargs): + if media.get('type') != 'movie': + return + + titles = media['info'].get('titles', []) + + # Add year identifier to titles + if include_year: + titles = [title + (' %s' % str(media['info']['year'])) for title in titles] + + if first: + return titles[0] if titles else None + + return titles diff --git a/couchpotato/core/plugins/base.py b/couchpotato/core/plugins/base.py index 2bd15e55..7d52e1eb 100644 --- a/couchpotato/core/plugins/base.py +++ b/couchpotato/core/plugins/base.py @@ -17,6 +17,7 @@ from couchpotato.environment import Env import requests from requests.packages.urllib3 import Timeout from requests.packages.urllib3.exceptions import MaxRetryError +from scandir import scandir from tornado import template from tornado.web import StaticFileHandler @@ -63,16 +64,11 @@ class Plugin(object): def databaseSetup(self): - db = get_db() - for index_name in self._database: klass = self._database[index_name] fireEvent('database.setup_index', index_name, klass) - def afterDatabaseSetup(self): - print self._database_indexes - def conf(self, attr, value = None, default = None, section = None): class_name = self.getName().lower().split(':')[0].lower() return Env.setting(attr, section = section if section else class_name, value = value, default = default) @@ -146,6 +142,26 @@ class Plugin(object): return False + def deleteEmptyFolder(self, folder, show_error = True): + folder = sp(folder) + + for root, dirs, files in scandir.walk(folder): + + for dir_name in dirs: + full_path = os.path.join(root, dir_name) + if len(os.listdir(full_path)) == 0: + try: + os.rmdir(full_path) + except: + if show_error: + log.error('Couldn\'t remove empty directory %s: %s', (full_path, traceback.format_exc())) + + try: + os.rmdir(folder) + except: + if show_error: + log.error('Couldn\'t remove empty directory %s: %s', (folder, traceback.format_exc())) + # http request def urlopen(self, url, timeout = 30, data = None, headers = None, files = None, show_error = True): url = urllib2.quote(ss(url), safe = "%/:=&?~#+!$,;'@()*[]") diff --git a/couchpotato/core/plugins/renamer.py b/couchpotato/core/plugins/renamer.py index be9170c0..0f531bc6 100644 --- a/couchpotato/core/plugins/renamer.py +++ b/couchpotato/core/plugins/renamer.py @@ -256,7 +256,7 @@ class Renamer(Plugin): destination = to_folder category_label = '' - if media.get('category_id'): + if media.get('category_id') and media.get('category_id') != '-1': try: category = db.get('id', media['category_id']) category_label = category['label'] @@ -823,25 +823,6 @@ Remove it if you want it to be renamed (again, or at least let it try again) return string - def deleteEmptyFolder(self, folder, show_error = True): - folder = sp(folder) - - loge = log.error if show_error else log.debug - for root, dirs, files in scandir.walk(folder): - - for dir_name in dirs: - full_path = os.path.join(root, dir_name) - if len(os.listdir(full_path)) == 0: - try: - os.rmdir(full_path) - except: - loge('Couldn\'t remove empty directory %s: %s', (full_path, traceback.format_exc())) - - try: - os.rmdir(folder) - except: - loge('Couldn\'t remove empty directory %s: %s', (folder, traceback.format_exc())) - def checkSnatched(self, fire_scan = True): if self.checking_snatched: @@ -1055,7 +1036,7 @@ Remove it if you want it to be renamed (again, or at least let it try again) if release_download and release_download.get('id'): try: - rls = db.get('release_download', '%s_%s' % (release_download.get('downloader'), release_download.get('id')), with_doc = True)['doc'] + rls = db.get('release_download', '%s-%s' % (release_download.get('downloader'), release_download.get('id')), with_doc = True)['doc'] except: log.error('Download ID %s from downloader %s not found in releases', (release_download.get('id'), release_download.get('downloader')))