From ae666bd9b69798b7f08b0bbbfe3cdd05dbf788e8 Mon Sep 17 00:00:00 2001 From: mano3m Date: Sat, 5 Oct 2013 16:20:02 +0200 Subject: [PATCH 1/2] Add API call to scan a folder for multiple movies --- couchpotato/core/plugins/renamer/main.py | 26 +++++++++++++++--------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/couchpotato/core/plugins/renamer/main.py b/couchpotato/core/plugins/renamer/main.py index 4aa0f20b..0df3ad02 100755 --- a/couchpotato/core/plugins/renamer/main.py +++ b/couchpotato/core/plugins/renamer/main.py @@ -30,7 +30,8 @@ class Renamer(Plugin): 'desc': 'For the renamer to check for new files to rename in a folder', 'params': { 'async': {'desc': 'Optional: Set to 1 if you dont want to fire the renamer.scan asynchronous.'}, - 'movie_folder': {'desc': 'Optional: The folder of the movie to scan. Keep empty for default renamer folder.'}, + 'base_folder': {'desc': 'Optional: The folder to find releases in. Leave empty for default folder.'}, + 'movie_folder': {'desc': 'Optional: The folder of a specific release to scan. Don\'t use in combination with base_folder.'}, 'downloader' : {'desc': 'Optional: The downloader the release has been downloaded with. \'download_id\' is required with this option.'}, 'download_id': {'desc': 'Optional: The nzb/torrent ID of the release in movie_folder. \'downloader\' is required with this option.'}, 'status': {'desc': 'Optional: The status of the release: \'completed\' (default) or \'seeding\''}, @@ -63,24 +64,26 @@ class Renamer(Plugin): def scanView(self, **kwargs): async = tryInt(kwargs.get('async', 0)) + base_folder = kwargs.get('base_folder') movie_folder = kwargs.get('movie_folder') downloader = kwargs.get('downloader') download_id = kwargs.get('download_id') status = kwargs.get('status', 'completed') - release_download = {'folder': movie_folder} if movie_folder else None - if release_download: + release_download = None + if not base_folder and movie_folder: + release_download = {'folder': movie_folder} release_download.update({'id': download_id, 'downloader': downloader, 'status': status} if download_id else {}) fire_handle = fireEvent if not async else fireEventAsync - fire_handle('renamer.scan', release_download) + fire_handle('renamer.scan', base_folder = base_folder, release_download = release_download) return { 'success': True } - def scan(self, release_download = None): + def scan(self, base_folder = None, release_download = None): if self.isDisabled(): return @@ -89,6 +92,9 @@ class Renamer(Plugin): log.info('Renamer is already running, if you see this often, check the logs above for errors.') return + if not base_folder: + base_folder = self.conf('from') + # Get movie folder to process movie_folder = release_download and release_download.get('folder') @@ -103,12 +109,12 @@ class Renamer(Plugin): pass # Check to see if the no_process folders are inside the "from" folder. - if not os.path.isdir(self.conf('from')) or not os.path.isdir(self.conf('to')): + if not os.path.isdir(base_folder) or not os.path.isdir(self.conf('to')): log.error('Both the "To" and "From" have to exist.') return else: for item in no_process: - if self.conf('from') in item: + if base_folder in item: log.error('To protect your data, the movie libraries can\'t be inside of or the same as the "from" folder.') return @@ -161,7 +167,7 @@ class Renamer(Plugin): folder, movie_folder, files, extr_files = self.extractFiles(folder = folder, movie_folder = movie_folder, files = files, cleanup = self.conf('cleanup') and not self.downloadIsTorrent(release_download)) - groups = fireEvent('scanner.scan', folder = folder if folder else self.conf('from'), + groups = fireEvent('scanner.scan', folder = folder if folder else base_folder, files = files, release_download = release_download, return_ignored = False, single = True) or [] folder_name = self.conf('folder_name') @@ -470,7 +476,7 @@ class Renamer(Plugin): os.remove(src) parent_dir = os.path.normpath(os.path.dirname(src)) - if delete_folders.count(parent_dir) == 0 and os.path.isdir(parent_dir) and not parent_dir in [destination, movie_folder] and not self.conf('from') in parent_dir: + if delete_folders.count(parent_dir) == 0 and os.path.isdir(parent_dir) and not parent_dir in [destination, movie_folder] and not base_folder in parent_dir: delete_folders.append(parent_dir) except: @@ -519,7 +525,7 @@ class Renamer(Plugin): group_folder = movie_folder else: # Delete the first empty subfolder in the tree relative to the 'from' folder - group_folder = os.path.join(self.conf('from'), os.path.relpath(group['parentdir'], self.conf('from')).split(os.path.sep)[0]) + group_folder = os.path.join(base_folder, os.path.relpath(group['parentdir'], base_folder).split(os.path.sep)[0]) try: log.info('Deleting folder: %s', group_folder) From d984f11cbffa2527ab8f4fda603243331b7e45f5 Mon Sep 17 00:00:00 2001 From: mano3m Date: Sun, 6 Oct 2013 23:23:29 +0200 Subject: [PATCH 2/2] First attempt at creating a working directory selector --- couchpotato/static/scripts/page/wanted.js | 64 +++++++++++++++++++++-- couchpotato/static/style/settings.css | 4 +- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/couchpotato/static/scripts/page/wanted.js b/couchpotato/static/scripts/page/wanted.js index 98a676c8..415f4b02 100644 --- a/couchpotato/static/scripts/page/wanted.js +++ b/couchpotato/static/scripts/page/wanted.js @@ -4,6 +4,7 @@ Page.Wanted = new Class({ name: 'wanted', title: 'Gimmy gimmy gimmy!', + folder_browser: null, indexAction: function(){ var self = this; @@ -18,13 +19,22 @@ Page.Wanted = new Class({ } }); + + self.scan_folder = new Element('a', { + 'title': 'Scan a folder and rename all movies in it', + 'text': 'Scan Folder', + 'events':{ + 'click': self.scanFolder.bind(self, event) + } + }); + // 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], + 'menu': [self.manual_search, self.scan_folder], 'on_empty_element': App.createUserscriptButtons().addClass('empty_wanted') }); $(self.wanted).inject(self.el); @@ -69,6 +79,54 @@ Page.Wanted = new Class({ }); }, 1000); - } + }, -}); \ No newline at end of file + scanFolder: function(e) { + if (!e) + e = window.event; + + //IE9 & Other Browsers + if (e.stopPropagation) { + e.stopPropagation(); + } + //IE8 and Lower + else { + e.cancelBubble = true; + } + + var self = this; + var options = {}; + 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.getElementsByClassName("clear button")[0].hide() + self.folder_browser.save_button.text = "Select"; + self.folder_browser.browser.style.zIndex=1000; + } + else{ + self.folder_browser.showBrowser(); + } + } + +}); diff --git a/couchpotato/static/style/settings.css b/couchpotato/static/style/settings.css index 744531a9..861ca713 100644 --- a/couchpotato/static/style/settings.css +++ b/couchpotato/static/style/settings.css @@ -113,6 +113,8 @@ width: 20px; } + .Scan_folder { padding: 0 !important; } + .page .ctrlHolder { line-height: 25px; padding: 10px 10px 10px 30px; @@ -159,7 +161,7 @@ } .page .xsmall { width: 20px !important; text-align: center; } - + .page .enabler { display: block; }