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 @@
-
+
{{option.text}}
@@ -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");
/***/ }),