diff --git a/medusa/clients/torrent/generic.py b/medusa/clients/torrent/generic.py index 76ecd2dfd9..b2ce78cfdb 100644 --- a/medusa/clients/torrent/generic.py +++ b/medusa/clients/torrent/generic.py @@ -308,6 +308,9 @@ def test_authentication(self): except (requests.exceptions.MissingSchema, requests.exceptions.InvalidURL): return False, 'Error: Invalid {name} host'.format(name=self.name) + if not self.response: + return False, 'Unable to connect to {name}'.format(name=self.name) + if self.response.status_code == 401: return False, 'Error: Invalid {name} Username or Password, check your config!'.format(name=self.name) diff --git a/medusa/process_tv.py b/medusa/process_tv.py index f671030c56..a199cd648d 100644 --- a/medusa/process_tv.py +++ b/medusa/process_tv.py @@ -77,8 +77,7 @@ def update_resource(self, status): """ main_db_con = db.DBConnection() main_db_con.action( - 'UPDATE history set client_status = ? ' - 'WHERE date = (select max(date) from history where info_hash = ?)', + 'UPDATE history set client_status = ? WHERE info_hash = ?', [status.status, self.info_hash] ) log.info('Updated history with resource path: {path} and resource: {resource} with new status {status}', { @@ -87,8 +86,8 @@ def update_resource(self, status): 'status': status }) - def update_history(self, process_results): - """Update main.history table with process results.""" + def update_history_processed(self, process_results): + """Update the history table when we have a processed path + resource.""" from medusa.schedulers.download_handler import ClientStatus status = ClientStatus() @@ -99,7 +98,7 @@ def update_history(self, process_results): # If succeeded store Postprocessed + Completed. (384) # If failed store Postprocessed + Failed. (272) - if process_results.result: + if process_results.result and not process_results.failed: status.add_status_string('Completed') self.success = True else: @@ -112,44 +111,55 @@ def update_history(self, process_results): 'resource': self.resource_name }) + def process_path(self): + """Process for when we have a valid path.""" + process_method = self.process_method or app.PROCESS_METHOD + + process_results = ProcessResult(self.path, process_method, failed=self.failed) + process_results.process( + resource_name=self.resource_name, + force=self.force, + is_priority=self.is_priority, + delete_on=self.delete_on, + proc_type=self.proc_type, + ignore_subs=self.ignore_subs + ) + + # A user might want to use advanced post-processing, but opt-out of failed download handling. + if (app.USE_FAILED_DOWNLOADS and (process_results.failed or (not process_results.succeeded and self.resource_name))): + process_results.process_failed(self.path) + + # In case we have an info_hash or (nzbid), update the history table with the pp results. + if self.info_hash: + self.update_history_processed(process_results) + + return process_results + def run(self): """Run postprocess queueitem thread.""" generic_queue.QueueItem.run(self) self.started = True try: - log.info('Beginning postprocessing for path {path}', {'path': self.path}) + log.info('Beginning postprocessing for path {path} and resource {resource}', { + 'path': self.path, 'resource': self.resource_name + }) # Push an update to any open Web UIs through the WebSocket ws.Message('QueueItemUpdate', self.to_json).push() - path = self.path or app.TV_DOWNLOAD_DIR - process_method = self.process_method or app.PROCESS_METHOD - - process_results = ProcessResult(path, process_method, failed=self.failed) - process_results.process( - resource_name=self.resource_name, - force=self.force, - is_priority=self.is_priority, - delete_on=self.delete_on, - proc_type=self.proc_type, - ignore_subs=self.ignore_subs - ) + if not self.path and self.resource_name: + # We don't have a path, but do have a resource name. If this is a failed download. + # Let's use the TV_DOWNLOAD_DIR as path combined with the resource_name. + self.path = app.TV_DOWNLOAD_DIR - # A user might want to use advanced post-processing, but opt-out of failed download handling. - if app.USE_FAILED_DOWNLOADS \ - and (process_results.failed or (not process_results.succeeded and self.resource_name)): - process_results.process_failed(path) - - # In case we have an info_hash or (nzbid), update the history table with the pp results. - if self.info_hash: - self.update_history(process_results) + if self.path: + process_results = self.process_path() + if process_results._output: + self.to_json.update({'output': process_results._output}) log.info('Completed Postproccessing') - if process_results._output: - self.to_json.update({'output': process_results._output}) - # Use success as a flag for a finished PP. PP it self can be succeeded or failed. self.success = True @@ -460,7 +470,7 @@ def _get_files(self, path): # If resource_name is a file and not an NZB, process it directly def walk_path(path_name): topdown = True if self.directory == path_name else False - for root, dirs, files in os.walk(path, topdown=topdown): + for root, dirs, files in os.walk(path_name, topdown=topdown): if files: yield root, sorted(files) if topdown: diff --git a/medusa/schedulers/download_handler.py b/medusa/schedulers/download_handler.py index 4b3763cfcb..c6c0390302 100644 --- a/medusa/schedulers/download_handler.py +++ b/medusa/schedulers/download_handler.py @@ -200,14 +200,30 @@ def _check_postprocess(self, client): continue log.debug( - 'Found {client_type} (status {status}) on {client} with info_hash {info_hash}', + 'Sending postprocess job for {client_type} with info_hash: {info_hash}' + '\nstatus: {status}\nclient: {client}' + '\ndestination: {destination}\nresource: {resource}', { 'client_type': client_type, + 'info_hash': history_result['info_hash'], 'status': status, 'client': app.TORRENT_METHOD if client_type == 'torrent' else app.NZB_METHOD, - 'info_hash': history_result['info_hash'] + 'destination': status.destination, + 'resource': status.resource or history_result['resource'] } ) + + if not status.destination and not status.resource and history_result['resource']: + # We didn't get a destination, because probably it failed to start a download. + # For example when it already failed to get the nzb. But we have a resource name from the snatch. + # We'll use this, so that we can finish the postprocessing and possible failed download handling. + status.resource = history_result['resource'] + + if not status.destination and not status.resource: + log.warning('Not starting postprocessing for info_hash {info_hash}, need a destination path.', + {'info_hash': history_result['info_hash']}) + continue + self._postprocess( status.destination, history_result['info_hash'], status.resource, failed=str(status) == 'Failed' @@ -311,7 +327,7 @@ def _clean(self, client): """Update status in the history table for torrents/nzb's that can't be located anymore.""" client_type = 'torrent' if isinstance(client, GenericClient) else 'nzb' - # Make sure the client can be reached. As we don't want to change the state for downlaods + # Make sure the client can be reached. As we don't want to change the state for downloads # because the client is temporary unavailable. if not self._test_connection(client, client_type): log.warning('The client cannot be reached or authentication is failing. Abandon cleanup.') diff --git a/medusa/server/api/v2/postprocess.py b/medusa/server/api/v2/postprocess.py index a103709230..aaa8846764 100644 --- a/medusa/server/api/v2/postprocess.py +++ b/medusa/server/api/v2/postprocess.py @@ -51,7 +51,7 @@ def post(self, identifier=None): is_priority = bool(data.get('is_priority', False)) delete_on = bool(data.get('delete_on', False)) failed = bool(data.get('failed', False)) - proc_type = bool(data.get('proc_type', False)) + proc_type = data.get('proc_type', '') ignore_subs = bool(data.get('is_priority', False)) if not proc_dir: diff --git a/themes-default/slim/src/components/manual-post-process.vue b/themes-default/slim/src/components/manual-post-process.vue index 58b0d1873e..cfe81ae819 100644 --- a/themes-default/slim/src/components/manual-post-process.vue +++ b/themes-default/slim/src/components/manual-post-process.vue @@ -8,7 +8,7 @@
- @@ -69,6 +69,10 @@ export default { ConfigTemplate, ConfigToggleSlider }, + mounted() { + this.processMethod = this.postprocessing.processMethod; + this.path = this.postprocessing.showDownloadDir; + }, data() { return { processMethod: null, diff --git a/themes/dark/assets/js/medusa-runtime.js b/themes/dark/assets/js/medusa-runtime.js index 475b89762a..3f323c9eeb 100644 --- a/themes/dark/assets/js/medusa-runtime.js +++ b/themes/dark/assets/js/medusa-runtime.js @@ -554,7 +554,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'manual-post-process',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_1__.AppLink,\n FileBrowser: _helpers__WEBPACK_IMPORTED_MODULE_1__.FileBrowser,\n ConfigTemplate: _helpers__WEBPACK_IMPORTED_MODULE_1__.ConfigTemplate,\n ConfigToggleSlider: _helpers__WEBPACK_IMPORTED_MODULE_1__.ConfigToggleSlider\n },\n\n data() {\n return {\n processMethod: null,\n path: '',\n force: false,\n priority: false,\n deleteOn: false,\n failed: false,\n ignoreSubs: false,\n failedMessage: '',\n logs: [],\n queueIdentifier: null\n };\n },\n\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_2__.mapState)({\n general: state => state.config.general,\n postprocessing: state => state.config.postprocessing,\n search: state => state.config.search,\n queueitems: state => state.queue.queueitems\n }),\n\n availableMethods() {\n const {\n postprocessing\n } = this;\n const defaultMethods = [{\n value: 'copy',\n text: 'Copy'\n }, {\n value: 'move',\n text: 'Move'\n }, {\n value: 'hardlink',\n text: 'Hard Link'\n }, {\n value: 'symlink',\n text: 'Symbolic Link'\n }, {\n value: 'keeplink',\n text: 'Keep Link'\n }];\n\n if (postprocessing.reflinkAvailable) {\n defaultMethods.push({\n value: 'reflink',\n text: 'Reference Link'\n });\n }\n\n return defaultMethods;\n }\n\n },\n methods: {\n /**\n * Start postprocessing sync or async\n * @param {Boolean} runAsync - Pass true for running a post-process job async.\n */\n start(runAsync) {\n const {\n processMethod,\n path,\n force,\n priority,\n deleteOn,\n failed,\n ignoreSubs\n } = this;\n this.logs = [];\n const form = new FormData();\n form.set('process_method', processMethod);\n form.set('proc_dir', path);\n form.set('force', force);\n form.set('is_priority', priority);\n form.set('delete_on', deleteOn);\n form.set('failed', failed);\n form.set('proc_type', 'manual');\n form.set('ignore_subs', ignoreSubs);\n\n if (runAsync) {\n form.set('run_async', true);\n _api__WEBPACK_IMPORTED_MODULE_0__.apiRoute.post('home/postprocess/processEpisode', form).then(response => {\n if (response && response.data.status === 'success') {\n this.logs.push(response.data.message.trim());\n this.queueIdentifier = response.data.queueItem.identifier;\n } else if (response && response.data.message) {\n this.failedMessage = response.data.message;\n } else {\n this.failedMessage = 'Something went wrong, check logs';\n }\n });\n } else {\n form.set('run_sync', true);\n _api__WEBPACK_IMPORTED_MODULE_0__.apiRoute.post('home/postprocess/processEpisode', form).then(response => {\n if (response && response.data.status === 'success') {\n this.logs = [...this.logs, ...response.data.output];\n }\n });\n }\n }\n\n },\n watch: {\n 'postprocessing.processMethod'(value) {\n if (value) {\n this.processMethod = value;\n }\n },\n\n 'postprocessing.showDownloadDir'(value) {\n if (value) {\n this.path = value;\n }\n },\n\n queueitems(queueItems) {\n queueItems.filter(item => item.identifier === this.queueIdentifier).forEach(item => {\n // Loop through all queueItems and search for a specific queue identifier.\n // If post-process job is finished, get the log lines for display.\n if (item.success) {\n this.logs.push(`Finished Post-processing on path: ${item.config.path}`);\n this.queueIdentifier = null;\n\n if (item.output) {\n this.logs = [...this.logs, ...item.output];\n }\n } else {\n this.logs.push(`Started Post-processing on path: ${item.config.path}`);\n }\n });\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/manual-post-process.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'manual-post-process',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_1__.AppLink,\n FileBrowser: _helpers__WEBPACK_IMPORTED_MODULE_1__.FileBrowser,\n ConfigTemplate: _helpers__WEBPACK_IMPORTED_MODULE_1__.ConfigTemplate,\n ConfigToggleSlider: _helpers__WEBPACK_IMPORTED_MODULE_1__.ConfigToggleSlider\n },\n\n mounted() {\n this.processMethod = this.postprocessing.processMethod;\n this.path = this.postprocessing.showDownloadDir;\n },\n\n data() {\n return {\n processMethod: null,\n path: '',\n force: false,\n priority: false,\n deleteOn: false,\n failed: false,\n ignoreSubs: false,\n failedMessage: '',\n logs: [],\n queueIdentifier: null\n };\n },\n\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_2__.mapState)({\n general: state => state.config.general,\n postprocessing: state => state.config.postprocessing,\n search: state => state.config.search,\n queueitems: state => state.queue.queueitems\n }),\n\n availableMethods() {\n const {\n postprocessing\n } = this;\n const defaultMethods = [{\n value: 'copy',\n text: 'Copy'\n }, {\n value: 'move',\n text: 'Move'\n }, {\n value: 'hardlink',\n text: 'Hard Link'\n }, {\n value: 'symlink',\n text: 'Symbolic Link'\n }, {\n value: 'keeplink',\n text: 'Keep Link'\n }];\n\n if (postprocessing.reflinkAvailable) {\n defaultMethods.push({\n value: 'reflink',\n text: 'Reference Link'\n });\n }\n\n return defaultMethods;\n }\n\n },\n methods: {\n /**\n * Start postprocessing sync or async\n * @param {Boolean} runAsync - Pass true for running a post-process job async.\n */\n start(runAsync) {\n const {\n processMethod,\n path,\n force,\n priority,\n deleteOn,\n failed,\n ignoreSubs\n } = this;\n this.logs = [];\n const form = new FormData();\n form.set('process_method', processMethod);\n form.set('proc_dir', path);\n form.set('force', force);\n form.set('is_priority', priority);\n form.set('delete_on', deleteOn);\n form.set('failed', failed);\n form.set('proc_type', 'manual');\n form.set('ignore_subs', ignoreSubs);\n\n if (runAsync) {\n form.set('run_async', true);\n _api__WEBPACK_IMPORTED_MODULE_0__.apiRoute.post('home/postprocess/processEpisode', form).then(response => {\n if (response && response.data.status === 'success') {\n this.logs.push(response.data.message.trim());\n this.queueIdentifier = response.data.queueItem.identifier;\n } else if (response && response.data.message) {\n this.failedMessage = response.data.message;\n } else {\n this.failedMessage = 'Something went wrong, check logs';\n }\n });\n } else {\n form.set('run_sync', true);\n _api__WEBPACK_IMPORTED_MODULE_0__.apiRoute.post('home/postprocess/processEpisode', form).then(response => {\n if (response && response.data.status === 'success') {\n this.logs = [...this.logs, ...response.data.output];\n }\n });\n }\n }\n\n },\n watch: {\n 'postprocessing.processMethod'(value) {\n if (value) {\n this.processMethod = value;\n }\n },\n\n 'postprocessing.showDownloadDir'(value) {\n if (value) {\n this.path = value;\n }\n },\n\n queueitems(queueItems) {\n queueItems.filter(item => item.identifier === this.queueIdentifier).forEach(item => {\n // Loop through all queueItems and search for a specific queue identifier.\n // If post-process job is finished, get the log lines for display.\n if (item.success) {\n this.logs.push(`Finished Post-processing on path: ${item.config.path}`);\n this.queueIdentifier = null;\n\n if (item.output) {\n this.logs = [...this.logs, ...item.output];\n }\n } else {\n this.logs.push(`Started Post-processing on path: ${item.config.path}`);\n }\n });\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/manual-post-process.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }), @@ -5182,7 +5182,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* binding */ render),\n/* harmony export */ \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\n \"form\",\n {\n attrs: { name: \"processForm\", method: \"post\" },\n on: {\n submit: function($event) {\n $event.preventDefault()\n }\n }\n },\n [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-lg-3\" },\n [\n _c(\n \"p\",\n [\n _vm._v(\n \"Manual post process a file or folder. For more options related to post-processing visit \"\n ),\n _c(\"app-link\", { attrs: { href: \"config/postprocessing\" } }, [\n _vm._v(\"Post-Processing\")\n ])\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"col-xs-12 col-lg-9\" },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n label: \"Process Method to be used\",\n \"label-for\": \"process_method\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.processMethod,\n expression: \"processMethod\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: { id: \"process_method\", name: \"process_method\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.processMethod = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n _vm._l(_vm.availableMethods, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n label: \"Post-Processing Dir\",\n \"label-for\": \"process_path\"\n }\n },\n [\n _c(\"file-browser\", {\n attrs: {\n name: \"location\",\n title: \"postprocess location\",\n \"initial-dir\": _vm.postprocessing.showDownloadDir\n },\n on: {\n update: function($event) {\n _vm.path = $event\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"clear-left\" }, [\n _c(\"p\", [\n _vm._v(\n \"Select the folder from you'd like to process files from\"\n )\n ])\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Force already processed files\",\n id: \"force\"\n },\n model: {\n value: _vm.force,\n callback: function($$v) {\n _vm.force = $$v\n },\n expression: \"force\"\n }\n },\n [\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\n \" (Check this to post-process files that were already post-processed)\"\n )\n ])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Mark Dir/Files as priority download\",\n id: \"priority\"\n },\n model: {\n value: _vm.priority,\n callback: function($$v) {\n _vm.priority = $$v\n },\n expression: \"priority\"\n }\n },\n [\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\n \" (Check this to replace the file even if it exists at higher quality)\"\n )\n ])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"Delete files and folders\", id: \"deleteOn\" },\n model: {\n value: _vm.deleteOn,\n callback: function($$v) {\n _vm.deleteOn = $$v\n },\n expression: \"deleteOn\"\n }\n },\n [\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\n \" (Check this to delete files and folders like auto processing)\"\n )\n ])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n disabled: !_vm.search.general.failedDownloads.enabled,\n label: \"Mark as failed\",\n id: \"failed\"\n },\n model: {\n value: _vm.failed,\n callback: function($$v) {\n _vm.failed = $$v\n },\n expression: \"failed\"\n }\n },\n [\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\" (Check this to mark download as failed)\")\n ])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n disabled: !_vm.postprocessing.ignoreSubs,\n label: \"Skip associated subtitles check*\",\n id: \"ignoreSubs\"\n },\n model: {\n value: _vm.ignoreSubs,\n callback: function($$v) {\n _vm.ignoreSubs = $$v\n },\n expression: \"ignoreSubs\"\n }\n },\n [\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\n \" (Check this to post-process when no subtitles available)\"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\n \"* Create a new folder in PP folder and move only the files you want to ignore subtitles for\"\n )\n ])\n ])\n ]\n )\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n id: \"submit\",\n disabled: _vm.queueIdentifier,\n type: \"submit\",\n value: \"Process\"\n },\n on: {\n click: function($event) {\n return _vm.start((_vm.runAsync = false))\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n id: \"submit\",\n disabled: _vm.queueIdentifier,\n type: \"submit\",\n value: \"Process Async\"\n },\n on: {\n click: function($event) {\n return _vm.start((_vm.runAsync = true))\n }\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _vm.failedMessage !== \"\"\n ? _c(\"div\", [\n _c(\"span\", { staticStyle: { color: \"red\" } }, [\n _vm._v(_vm._s(_vm.failedMessage))\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.logs.length > 0\n ? _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"pre\",\n { staticClass: \"col-lg-10 col-lg-offset-2\" },\n [\n _vm._v(\" \"),\n _vm._l(_vm.logs, function(line, index) {\n return _c(\"div\", { key: \"line-\" + index }, [\n _vm._v(_vm._s(line))\n ])\n }),\n _vm._v(\"\\n \")\n ],\n 2\n )\n ])\n : _vm._e()\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://slim/./src/components/manual-post-process.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* binding */ render),\n/* harmony export */ \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\n \"form\",\n {\n attrs: { name: \"processForm\", method: \"post\" },\n on: {\n submit: function($event) {\n $event.preventDefault()\n }\n }\n },\n [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-lg-3\" },\n [\n _c(\n \"p\",\n [\n _vm._v(\n \"Manual post process a file or folder. For more options related to post-processing visit \"\n ),\n _c(\"app-link\", { attrs: { href: \"config/postprocessing\" } }, [\n _vm._v(\"Post-Processing\")\n ])\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"col-xs-12 col-lg-9\" },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n label: \"Process Method to be used\",\n \"label-for\": \"process_method\"\n }\n },\n [\n _c(\n \"select\",\n {\n staticClass: \"form-control input-sm\",\n attrs: { id: \"process_method\", name: \"process_method\" },\n domProps: { value: _vm.postprocessing.processMethod },\n on: {\n update: function($event) {\n _vm.processMethod = $event\n }\n }\n },\n _vm._l(_vm.availableMethods, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n label: \"Post-Processing Dir\",\n \"label-for\": \"process_path\"\n }\n },\n [\n _c(\"file-browser\", {\n attrs: {\n name: \"location\",\n title: \"postprocess location\",\n \"initial-dir\": _vm.postprocessing.showDownloadDir\n },\n on: {\n update: function($event) {\n _vm.path = $event\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"clear-left\" }, [\n _c(\"p\", [\n _vm._v(\n \"Select the folder from you'd like to process files from\"\n )\n ])\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Force already processed files\",\n id: \"force\"\n },\n model: {\n value: _vm.force,\n callback: function($$v) {\n _vm.force = $$v\n },\n expression: \"force\"\n }\n },\n [\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\n \" (Check this to post-process files that were already post-processed)\"\n )\n ])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Mark Dir/Files as priority download\",\n id: \"priority\"\n },\n model: {\n value: _vm.priority,\n callback: function($$v) {\n _vm.priority = $$v\n },\n expression: \"priority\"\n }\n },\n [\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\n \" (Check this to replace the file even if it exists at higher quality)\"\n )\n ])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"Delete files and folders\", id: \"deleteOn\" },\n model: {\n value: _vm.deleteOn,\n callback: function($$v) {\n _vm.deleteOn = $$v\n },\n expression: \"deleteOn\"\n }\n },\n [\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\n \" (Check this to delete files and folders like auto processing)\"\n )\n ])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n disabled: !_vm.search.general.failedDownloads.enabled,\n label: \"Mark as failed\",\n id: \"failed\"\n },\n model: {\n value: _vm.failed,\n callback: function($$v) {\n _vm.failed = $$v\n },\n expression: \"failed\"\n }\n },\n [\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\" (Check this to mark download as failed)\")\n ])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n disabled: !_vm.postprocessing.ignoreSubs,\n label: \"Skip associated subtitles check*\",\n id: \"ignoreSubs\"\n },\n model: {\n value: _vm.ignoreSubs,\n callback: function($$v) {\n _vm.ignoreSubs = $$v\n },\n expression: \"ignoreSubs\"\n }\n },\n [\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\n \" (Check this to post-process when no subtitles available)\"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\n \"* Create a new folder in PP folder and move only the files you want to ignore subtitles for\"\n )\n ])\n ])\n ]\n )\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n id: \"submit\",\n disabled: _vm.queueIdentifier,\n type: \"submit\",\n value: \"Process\"\n },\n on: {\n click: function($event) {\n return _vm.start((_vm.runAsync = false))\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n id: \"submit\",\n disabled: _vm.queueIdentifier,\n type: \"submit\",\n value: \"Process Async\"\n },\n on: {\n click: function($event) {\n return _vm.start((_vm.runAsync = true))\n }\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _vm.failedMessage !== \"\"\n ? _c(\"div\", [\n _c(\"span\", { staticStyle: { color: \"red\" } }, [\n _vm._v(_vm._s(_vm.failedMessage))\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.logs.length > 0\n ? _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"pre\",\n { staticClass: \"col-lg-10 col-lg-offset-2\" },\n [\n _vm._v(\" \"),\n _vm._l(_vm.logs, function(line, index) {\n return _c(\"div\", { key: \"line-\" + index }, [\n _vm._v(_vm._s(line))\n ])\n }),\n _vm._v(\"\\n \")\n ],\n 2\n )\n ])\n : _vm._e()\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://slim/./src/components/manual-post-process.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }), diff --git a/themes/light/assets/js/medusa-runtime.js b/themes/light/assets/js/medusa-runtime.js index 475b89762a..3f323c9eeb 100644 --- a/themes/light/assets/js/medusa-runtime.js +++ b/themes/light/assets/js/medusa-runtime.js @@ -554,7 +554,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'manual-post-process',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_1__.AppLink,\n FileBrowser: _helpers__WEBPACK_IMPORTED_MODULE_1__.FileBrowser,\n ConfigTemplate: _helpers__WEBPACK_IMPORTED_MODULE_1__.ConfigTemplate,\n ConfigToggleSlider: _helpers__WEBPACK_IMPORTED_MODULE_1__.ConfigToggleSlider\n },\n\n data() {\n return {\n processMethod: null,\n path: '',\n force: false,\n priority: false,\n deleteOn: false,\n failed: false,\n ignoreSubs: false,\n failedMessage: '',\n logs: [],\n queueIdentifier: null\n };\n },\n\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_2__.mapState)({\n general: state => state.config.general,\n postprocessing: state => state.config.postprocessing,\n search: state => state.config.search,\n queueitems: state => state.queue.queueitems\n }),\n\n availableMethods() {\n const {\n postprocessing\n } = this;\n const defaultMethods = [{\n value: 'copy',\n text: 'Copy'\n }, {\n value: 'move',\n text: 'Move'\n }, {\n value: 'hardlink',\n text: 'Hard Link'\n }, {\n value: 'symlink',\n text: 'Symbolic Link'\n }, {\n value: 'keeplink',\n text: 'Keep Link'\n }];\n\n if (postprocessing.reflinkAvailable) {\n defaultMethods.push({\n value: 'reflink',\n text: 'Reference Link'\n });\n }\n\n return defaultMethods;\n }\n\n },\n methods: {\n /**\n * Start postprocessing sync or async\n * @param {Boolean} runAsync - Pass true for running a post-process job async.\n */\n start(runAsync) {\n const {\n processMethod,\n path,\n force,\n priority,\n deleteOn,\n failed,\n ignoreSubs\n } = this;\n this.logs = [];\n const form = new FormData();\n form.set('process_method', processMethod);\n form.set('proc_dir', path);\n form.set('force', force);\n form.set('is_priority', priority);\n form.set('delete_on', deleteOn);\n form.set('failed', failed);\n form.set('proc_type', 'manual');\n form.set('ignore_subs', ignoreSubs);\n\n if (runAsync) {\n form.set('run_async', true);\n _api__WEBPACK_IMPORTED_MODULE_0__.apiRoute.post('home/postprocess/processEpisode', form).then(response => {\n if (response && response.data.status === 'success') {\n this.logs.push(response.data.message.trim());\n this.queueIdentifier = response.data.queueItem.identifier;\n } else if (response && response.data.message) {\n this.failedMessage = response.data.message;\n } else {\n this.failedMessage = 'Something went wrong, check logs';\n }\n });\n } else {\n form.set('run_sync', true);\n _api__WEBPACK_IMPORTED_MODULE_0__.apiRoute.post('home/postprocess/processEpisode', form).then(response => {\n if (response && response.data.status === 'success') {\n this.logs = [...this.logs, ...response.data.output];\n }\n });\n }\n }\n\n },\n watch: {\n 'postprocessing.processMethod'(value) {\n if (value) {\n this.processMethod = value;\n }\n },\n\n 'postprocessing.showDownloadDir'(value) {\n if (value) {\n this.path = value;\n }\n },\n\n queueitems(queueItems) {\n queueItems.filter(item => item.identifier === this.queueIdentifier).forEach(item => {\n // Loop through all queueItems and search for a specific queue identifier.\n // If post-process job is finished, get the log lines for display.\n if (item.success) {\n this.logs.push(`Finished Post-processing on path: ${item.config.path}`);\n this.queueIdentifier = null;\n\n if (item.output) {\n this.logs = [...this.logs, ...item.output];\n }\n } else {\n this.logs.push(`Started Post-processing on path: ${item.config.path}`);\n }\n });\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/manual-post-process.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ \"./src/api.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/components/helpers/index.js\");\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n name: 'manual-post-process',\n components: {\n AppLink: _helpers__WEBPACK_IMPORTED_MODULE_1__.AppLink,\n FileBrowser: _helpers__WEBPACK_IMPORTED_MODULE_1__.FileBrowser,\n ConfigTemplate: _helpers__WEBPACK_IMPORTED_MODULE_1__.ConfigTemplate,\n ConfigToggleSlider: _helpers__WEBPACK_IMPORTED_MODULE_1__.ConfigToggleSlider\n },\n\n mounted() {\n this.processMethod = this.postprocessing.processMethod;\n this.path = this.postprocessing.showDownloadDir;\n },\n\n data() {\n return {\n processMethod: null,\n path: '',\n force: false,\n priority: false,\n deleteOn: false,\n failed: false,\n ignoreSubs: false,\n failedMessage: '',\n logs: [],\n queueIdentifier: null\n };\n },\n\n computed: { ...(0,vuex__WEBPACK_IMPORTED_MODULE_2__.mapState)({\n general: state => state.config.general,\n postprocessing: state => state.config.postprocessing,\n search: state => state.config.search,\n queueitems: state => state.queue.queueitems\n }),\n\n availableMethods() {\n const {\n postprocessing\n } = this;\n const defaultMethods = [{\n value: 'copy',\n text: 'Copy'\n }, {\n value: 'move',\n text: 'Move'\n }, {\n value: 'hardlink',\n text: 'Hard Link'\n }, {\n value: 'symlink',\n text: 'Symbolic Link'\n }, {\n value: 'keeplink',\n text: 'Keep Link'\n }];\n\n if (postprocessing.reflinkAvailable) {\n defaultMethods.push({\n value: 'reflink',\n text: 'Reference Link'\n });\n }\n\n return defaultMethods;\n }\n\n },\n methods: {\n /**\n * Start postprocessing sync or async\n * @param {Boolean} runAsync - Pass true for running a post-process job async.\n */\n start(runAsync) {\n const {\n processMethod,\n path,\n force,\n priority,\n deleteOn,\n failed,\n ignoreSubs\n } = this;\n this.logs = [];\n const form = new FormData();\n form.set('process_method', processMethod);\n form.set('proc_dir', path);\n form.set('force', force);\n form.set('is_priority', priority);\n form.set('delete_on', deleteOn);\n form.set('failed', failed);\n form.set('proc_type', 'manual');\n form.set('ignore_subs', ignoreSubs);\n\n if (runAsync) {\n form.set('run_async', true);\n _api__WEBPACK_IMPORTED_MODULE_0__.apiRoute.post('home/postprocess/processEpisode', form).then(response => {\n if (response && response.data.status === 'success') {\n this.logs.push(response.data.message.trim());\n this.queueIdentifier = response.data.queueItem.identifier;\n } else if (response && response.data.message) {\n this.failedMessage = response.data.message;\n } else {\n this.failedMessage = 'Something went wrong, check logs';\n }\n });\n } else {\n form.set('run_sync', true);\n _api__WEBPACK_IMPORTED_MODULE_0__.apiRoute.post('home/postprocess/processEpisode', form).then(response => {\n if (response && response.data.status === 'success') {\n this.logs = [...this.logs, ...response.data.output];\n }\n });\n }\n }\n\n },\n watch: {\n 'postprocessing.processMethod'(value) {\n if (value) {\n this.processMethod = value;\n }\n },\n\n 'postprocessing.showDownloadDir'(value) {\n if (value) {\n this.path = value;\n }\n },\n\n queueitems(queueItems) {\n queueItems.filter(item => item.identifier === this.queueIdentifier).forEach(item => {\n // Loop through all queueItems and search for a specific queue identifier.\n // If post-process job is finished, get the log lines for display.\n if (item.success) {\n this.logs.push(`Finished Post-processing on path: ${item.config.path}`);\n this.queueIdentifier = null;\n\n if (item.output) {\n this.logs = [...this.logs, ...item.output];\n }\n } else {\n this.logs.push(`Started Post-processing on path: ${item.config.path}`);\n }\n });\n }\n\n }\n});\n\n//# sourceURL=webpack://slim/./src/components/manual-post-process.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-1%5B0%5D.rules%5B0%5D!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }), @@ -5182,7 +5182,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* binding */ render),\n/* harmony export */ \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\n \"form\",\n {\n attrs: { name: \"processForm\", method: \"post\" },\n on: {\n submit: function($event) {\n $event.preventDefault()\n }\n }\n },\n [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-lg-3\" },\n [\n _c(\n \"p\",\n [\n _vm._v(\n \"Manual post process a file or folder. For more options related to post-processing visit \"\n ),\n _c(\"app-link\", { attrs: { href: \"config/postprocessing\" } }, [\n _vm._v(\"Post-Processing\")\n ])\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"col-xs-12 col-lg-9\" },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n label: \"Process Method to be used\",\n \"label-for\": \"process_method\"\n }\n },\n [\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.processMethod,\n expression: \"processMethod\"\n }\n ],\n staticClass: \"form-control input-sm\",\n attrs: { id: \"process_method\", name: \"process_method\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.processMethod = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n _vm._l(_vm.availableMethods, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n label: \"Post-Processing Dir\",\n \"label-for\": \"process_path\"\n }\n },\n [\n _c(\"file-browser\", {\n attrs: {\n name: \"location\",\n title: \"postprocess location\",\n \"initial-dir\": _vm.postprocessing.showDownloadDir\n },\n on: {\n update: function($event) {\n _vm.path = $event\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"clear-left\" }, [\n _c(\"p\", [\n _vm._v(\n \"Select the folder from you'd like to process files from\"\n )\n ])\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Force already processed files\",\n id: \"force\"\n },\n model: {\n value: _vm.force,\n callback: function($$v) {\n _vm.force = $$v\n },\n expression: \"force\"\n }\n },\n [\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\n \" (Check this to post-process files that were already post-processed)\"\n )\n ])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Mark Dir/Files as priority download\",\n id: \"priority\"\n },\n model: {\n value: _vm.priority,\n callback: function($$v) {\n _vm.priority = $$v\n },\n expression: \"priority\"\n }\n },\n [\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\n \" (Check this to replace the file even if it exists at higher quality)\"\n )\n ])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"Delete files and folders\", id: \"deleteOn\" },\n model: {\n value: _vm.deleteOn,\n callback: function($$v) {\n _vm.deleteOn = $$v\n },\n expression: \"deleteOn\"\n }\n },\n [\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\n \" (Check this to delete files and folders like auto processing)\"\n )\n ])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n disabled: !_vm.search.general.failedDownloads.enabled,\n label: \"Mark as failed\",\n id: \"failed\"\n },\n model: {\n value: _vm.failed,\n callback: function($$v) {\n _vm.failed = $$v\n },\n expression: \"failed\"\n }\n },\n [\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\" (Check this to mark download as failed)\")\n ])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n disabled: !_vm.postprocessing.ignoreSubs,\n label: \"Skip associated subtitles check*\",\n id: \"ignoreSubs\"\n },\n model: {\n value: _vm.ignoreSubs,\n callback: function($$v) {\n _vm.ignoreSubs = $$v\n },\n expression: \"ignoreSubs\"\n }\n },\n [\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\n \" (Check this to post-process when no subtitles available)\"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\n \"* Create a new folder in PP folder and move only the files you want to ignore subtitles for\"\n )\n ])\n ])\n ]\n )\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n id: \"submit\",\n disabled: _vm.queueIdentifier,\n type: \"submit\",\n value: \"Process\"\n },\n on: {\n click: function($event) {\n return _vm.start((_vm.runAsync = false))\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n id: \"submit\",\n disabled: _vm.queueIdentifier,\n type: \"submit\",\n value: \"Process Async\"\n },\n on: {\n click: function($event) {\n return _vm.start((_vm.runAsync = true))\n }\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _vm.failedMessage !== \"\"\n ? _c(\"div\", [\n _c(\"span\", { staticStyle: { color: \"red\" } }, [\n _vm._v(_vm._s(_vm.failedMessage))\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.logs.length > 0\n ? _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"pre\",\n { staticClass: \"col-lg-10 col-lg-offset-2\" },\n [\n _vm._v(\" \"),\n _vm._l(_vm.logs, function(line, index) {\n return _c(\"div\", { key: \"line-\" + index }, [\n _vm._v(_vm._s(line))\n ])\n }),\n _vm._v(\"\\n \")\n ],\n 2\n )\n ])\n : _vm._e()\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://slim/./src/components/manual-post-process.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"render\": () => (/* binding */ render),\n/* harmony export */ \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\n \"form\",\n {\n attrs: { name: \"processForm\", method: \"post\" },\n on: {\n submit: function($event) {\n $event.preventDefault()\n }\n }\n },\n [\n _c(\"div\", { staticClass: \"row component-group\" }, [\n _c(\n \"div\",\n { staticClass: \"component-group-desc col-xs-12 col-lg-3\" },\n [\n _c(\n \"p\",\n [\n _vm._v(\n \"Manual post process a file or folder. For more options related to post-processing visit \"\n ),\n _c(\"app-link\", { attrs: { href: \"config/postprocessing\" } }, [\n _vm._v(\"Post-Processing\")\n ])\n ],\n 1\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"col-xs-12 col-lg-9\" },\n [\n _c(\n \"config-template\",\n {\n attrs: {\n label: \"Process Method to be used\",\n \"label-for\": \"process_method\"\n }\n },\n [\n _c(\n \"select\",\n {\n staticClass: \"form-control input-sm\",\n attrs: { id: \"process_method\", name: \"process_method\" },\n domProps: { value: _vm.postprocessing.processMethod },\n on: {\n update: function($event) {\n _vm.processMethod = $event\n }\n }\n },\n _vm._l(_vm.availableMethods, function(option) {\n return _c(\n \"option\",\n {\n key: option.value,\n domProps: { value: option.value }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(option.text) +\n \"\\n \"\n )\n ]\n )\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-template\",\n {\n attrs: {\n label: \"Post-Processing Dir\",\n \"label-for\": \"process_path\"\n }\n },\n [\n _c(\"file-browser\", {\n attrs: {\n name: \"location\",\n title: \"postprocess location\",\n \"initial-dir\": _vm.postprocessing.showDownloadDir\n },\n on: {\n update: function($event) {\n _vm.path = $event\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"clear-left\" }, [\n _c(\"p\", [\n _vm._v(\n \"Select the folder from you'd like to process files from\"\n )\n ])\n ])\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Force already processed files\",\n id: \"force\"\n },\n model: {\n value: _vm.force,\n callback: function($$v) {\n _vm.force = $$v\n },\n expression: \"force\"\n }\n },\n [\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\n \" (Check this to post-process files that were already post-processed)\"\n )\n ])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n label: \"Mark Dir/Files as priority download\",\n id: \"priority\"\n },\n model: {\n value: _vm.priority,\n callback: function($$v) {\n _vm.priority = $$v\n },\n expression: \"priority\"\n }\n },\n [\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\n \" (Check this to replace the file even if it exists at higher quality)\"\n )\n ])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: { label: \"Delete files and folders\", id: \"deleteOn\" },\n model: {\n value: _vm.deleteOn,\n callback: function($$v) {\n _vm.deleteOn = $$v\n },\n expression: \"deleteOn\"\n }\n },\n [\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\n \" (Check this to delete files and folders like auto processing)\"\n )\n ])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n disabled: !_vm.search.general.failedDownloads.enabled,\n label: \"Mark as failed\",\n id: \"failed\"\n },\n model: {\n value: _vm.failed,\n callback: function($$v) {\n _vm.failed = $$v\n },\n expression: \"failed\"\n }\n },\n [\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\" (Check this to mark download as failed)\")\n ])\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\n \"config-toggle-slider\",\n {\n attrs: {\n disabled: !_vm.postprocessing.ignoreSubs,\n label: \"Skip associated subtitles check*\",\n id: \"ignoreSubs\"\n },\n model: {\n value: _vm.ignoreSubs,\n callback: function($$v) {\n _vm.ignoreSubs = $$v\n },\n expression: \"ignoreSubs\"\n }\n },\n [\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\n \" (Check this to post-process when no subtitles available)\"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"span\", { staticClass: \"smallhelp\" }, [\n _c(\"i\", [\n _vm._v(\n \"* Create a new folder in PP folder and move only the files you want to ignore subtitles for\"\n )\n ])\n ])\n ]\n )\n ],\n 1\n )\n ]),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n id: \"submit\",\n disabled: _vm.queueIdentifier,\n type: \"submit\",\n value: \"Process\"\n },\n on: {\n click: function($event) {\n return _vm.start((_vm.runAsync = false))\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"btn-medusa\",\n attrs: {\n id: \"submit\",\n disabled: _vm.queueIdentifier,\n type: \"submit\",\n value: \"Process Async\"\n },\n on: {\n click: function($event) {\n return _vm.start((_vm.runAsync = true))\n }\n }\n })\n ]\n ),\n _vm._v(\" \"),\n _vm.failedMessage !== \"\"\n ? _c(\"div\", [\n _c(\"span\", { staticStyle: { color: \"red\" } }, [\n _vm._v(_vm._s(_vm.failedMessage))\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _vm.logs.length > 0\n ? _c(\"div\", { staticClass: \"row\" }, [\n _c(\n \"pre\",\n { staticClass: \"col-lg-10 col-lg-offset-2\" },\n [\n _vm._v(\" \"),\n _vm._l(_vm.logs, function(line, index) {\n return _c(\"div\", { key: \"line-\" + index }, [\n _vm._v(_vm._s(line))\n ])\n }),\n _vm._v(\"\\n \")\n ],\n 2\n )\n ])\n : _vm._e()\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack://slim/./src/components/manual-post-process.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options"); /***/ }),