diff --git a/couchpotato/core/plugins/automation/__init__.py b/couchpotato/core/plugins/automation/__init__.py index 8287cf0d..550da5d7 100644 --- a/couchpotato/core/plugins/automation/__init__.py +++ b/couchpotato/core/plugins/automation/__init__.py @@ -10,24 +10,24 @@ config = [{ 'tab': 'automation', 'name': 'automation', 'label': 'Automation', - 'description': 'Enable automatic movie adding', + 'description': 'Minimal movie requirements', 'options': [ { 'name': 'year', 'default': 2011, - 'Label': 'Minimal year', + 'Label': 'Year', 'type': 'int', }, { 'name': 'votes', 'default': 1000, - 'Label': 'Minimal votes', + 'Label': 'Votes', 'type': 'int', }, { 'name': 'rating', 'default': 6.0, - 'Label': 'Minimal rating', + 'Label': 'Rating', 'type': 'float', }, ], diff --git a/couchpotato/core/providers/automation/imdb/__init__.py b/couchpotato/core/providers/automation/imdb/__init__.py index f6f75a35..86561e28 100644 --- a/couchpotato/core/providers/automation/imdb/__init__.py +++ b/couchpotato/core/providers/automation/imdb/__init__.py @@ -10,15 +10,22 @@ config = [{ 'tab': 'automation', 'name': 'imdb_automation', 'label': 'IMDB', - 'description': 'Enable automatic movie adding of IMDB watchlists', + 'description': 'From any public IMDB watchlists', 'options': [ { 'name': 'automation_enabled', 'default': False, 'type': 'enabler', }, + { + 'name': 'automation_urls_use', + 'label': 'Use', + }, { 'name': 'automation_urls', + 'label': 'url', + 'type': 'combined', + 'combine': ['automation_urls_use', 'automation_urls'], }, ], }, diff --git a/couchpotato/core/providers/automation/kinepolis/__init__.py b/couchpotato/core/providers/automation/kinepolis/__init__.py index a1618461..3d4a156c 100644 --- a/couchpotato/core/providers/automation/kinepolis/__init__.py +++ b/couchpotato/core/providers/automation/kinepolis/__init__.py @@ -10,13 +10,21 @@ config = [{ 'tab': 'automation', 'name': 'kinepolis_automation', 'label': 'Kinepolis', - 'description': 'Enable automatic movie adding from Kinepolis', + 'description': 'from Kinepolis', 'options': [ { 'name': 'automation_enabled', 'default': False, 'type': 'enabler', }, + { + 'name': 'automation_use_requirements', + 'label': 'Use requirements', + 'description': 'Use the minimal requirements set above', + 'default': True, + 'advanced': True, + 'type': 'bool', + }, ], }, ], diff --git a/couchpotato/core/providers/automation/kinepolis/main.py b/couchpotato/core/providers/automation/kinepolis/main.py index a40251be..08e0c692 100644 --- a/couchpotato/core/providers/automation/kinepolis/main.py +++ b/couchpotato/core/providers/automation/kinepolis/main.py @@ -35,7 +35,7 @@ class Kinepolis(Automation, RSS): result = self.search(title) if result: - if self.isMinimal(result): + if not self.conf('automation_use_requirements') or self.isMinimal(result): movies.append(result) return movies diff --git a/couchpotato/core/providers/nzb/newznab/__init__.py b/couchpotato/core/providers/nzb/newznab/__init__.py index e519b96a..f963e00d 100644 --- a/couchpotato/core/providers/nzb/newznab/__init__.py +++ b/couchpotato/core/providers/nzb/newznab/__init__.py @@ -23,13 +23,15 @@ config = [{ { 'name': 'host', 'default': 'nzb.su', - 'description': 'The hostname of your newznab provider' + 'description': 'The hostname of your newznab provider', }, { 'name': 'api_key', 'default': '', 'label': 'Api Key', 'description': 'Can be found on your profile page', + 'type': 'combined', + 'combine': ['use', 'host', 'api_key'], }, ], }, diff --git a/couchpotato/core/providers/nzb/newznab/static/newznab.js b/couchpotato/core/providers/nzb/newznab/static/newznab.js deleted file mode 100644 index 13647b59..00000000 --- a/couchpotato/core/providers/nzb/newznab/static/newznab.js +++ /dev/null @@ -1,163 +0,0 @@ -var MultipleNewznab = new Class({ - - input_types: ['use', 'host', 'api_key'], - - initialize: function(page){ - var self = this; - - self.items = []; - self.values = []; - self.inputs = {}; - - self.page = page; - - App.addEvent('load', self.addSettings.bind(self)) - - }, - - addSettings: function(){ - var self = this; - - self.settings = App.getPage(self.page || 'Settings') - self.settings.addEvent('create', function(){ - - self.fieldset = self.settings.tabs.providers.content.getElement('.section_newznab'); - - self.input_types.each(function(name){ - self.inputs[name] = self.fieldset.getElement('input[name=newznab['+name+']]'); - var values = self.inputs[name].get('value').split(','); - - values.each(function(value, nr){ - if (!self.values[nr]) self.values[nr] = {}; - self.values[nr][name] = value.trim(); - }); - - self.inputs[name].getParent().addClass('hide') - self.inputs[name].addEvent('change', self.addEmpty.bind(self)) - }); - - - self.values.each(function(item, nr){ - self.createItem(item.use, item.host, item.api_key); - }); - - new Element('div.head').adopt( - new Element('abbr.host', { - 'text': 'Host', - 'title': self.inputs['host'].getNext().get('text') - }), - new Element('abbr.api_key', { - 'text': 'Api Key', - 'title': self.inputs['api_key'].getNext().get('text') - }) - ).inject(self.fieldset.getElement('h2'), 'after'); - - self.addEmpty(); - - }) - - }, - - add_empty_timeout: 0, - addEmpty: function(){ - var self = this; - - if(self.add_empty_timeout) clearTimeout(self.add_empty_timeout); - - var has_empty = false; - self.items.each(function(ctrl_holder){ - if(ctrl_holder.getElement('.host').get('value') == '' && ctrl_holder.getElement('.api_key').get('value') == ''){ - has_empty = true; - } - ctrl_holder[has_empty ? 'addClass' : 'removeClass']('is_empty'); - }); - if(has_empty) return; - - self.add_empty_timeout = setTimeout(function(){ - self.createItem(false, null, null); - }, 10); - }, - - createItem: function(use, host, api){ - var self = this; - - var checkbox = new Element('input[type=checkbox].use.inlay', { - 'checked': +use, - 'events': { - 'click': self.save.bind(self), - 'change': self.save.bind(self) - } - }) - - var item = new Element('div.ctrlHolder').adopt( - checkbox, - new Element('input[type=text].host.inlay', { - 'value': host, - 'placeholder': 'Host', - 'events': { - 'keyup': self.save.bind(self), - 'change': self.save.bind(self) - } - }), - new Element('input[type=text].api_key.inlay', { - 'value': api, - 'placeholder': 'Api hash key', - 'events': { - 'keyup': self.save.bind(self), - 'change': self.save.bind(self) - } - }), - new Element('a.icon.delete', { - 'events': { - 'click': self.deleteItem.bind(self) - } - }) - ).inject(self.fieldset); - item[!host ? 'addClass' : 'removeClass']('is_empty'); - - new Form.Check(checkbox, { - 'onChange': checkbox.fireEvent.bind(checkbox, 'change') - }); - - self.items.include(item) - - }, - - save: function(){ - var self = this; - - var temp = {} - self.items.each(function(item, nr){ - self.input_types.each(function(type){ - var input = item.getElement('input.'+type); - if(input.getParent('.ctrlHolder').hasClass('is_empty')) return; - - if(!temp[type]) temp[type] = []; - temp[type][nr] = input.get('type') == 'checkbox' ? +input.get('checked') : input.get('value').trim(); - - }) - }); - - self.input_types.each(function(name){ - self.inputs[name].set('value', temp[name].join(',')); - self.inputs[name].fireEvent('change'); - }); - - - }, - - deleteItem: function(e){ - var self = this; - (e).stop(); - - var item = e.target.getParent(); - - self.items.erase(item); - item.destroy(); - - self.save(); - } - -}); - -window.MNewznab = new MultipleNewznab(); diff --git a/couchpotato/static/scripts/page/settings.js b/couchpotato/static/scripts/page/settings.js index 18cd9604..c4dede3d 100644 --- a/couchpotato/static/scripts/page/settings.js +++ b/couchpotato/static/scripts/page/settings.js @@ -1003,3 +1003,165 @@ Option.Choice.Tag = new Class({ } }); + +Option.Combined = new Class({ + + Extends: Option.String, + + afterInject: function(){ + var self = this; + + self.fieldset = self.input.getParent('fieldset'); + self.combined_list = new Element('div.combined_table').inject(self.fieldset.getElement('h2'), 'after'); + self.values = {} + self.inputs = {} + self.items = [] + + self.options.combine.each(function(name){ + + self.inputs[name] = self.fieldset.getElement('input[name='+self.section+'['+name+']]'); + var values = self.inputs[name].get('value').split(','); + + values.each(function(value, nr){ + if (!self.values[nr]) self.values[nr] = {}; + self.values[nr][name] = value.trim(); + }); + + self.inputs[name].getParent('.ctrlHolder').hide(); + self.inputs[name].addEvent('change', self.addEmpty.bind(self)) + + }); + + var head = new Element('div.head').inject(self.combined_list) + + Object.each(self.inputs, function(input, name){ + new Element('abbr', { + 'class': name, + 'text': input.getPrevious().get('text'), + //'title': input.getNext().get('text') + }).inject(head) + }) + + + Object.each(self.values, function(item, nr){ + self.createItem(item); + }); + + self.addEmpty(); + + }, + + add_empty_timeout: 0, + addEmpty: function(){ + var self = this; + + if(self.add_empty_timeout) clearTimeout(self.add_empty_timeout); + + var has_empty = 0; + self.items.each(function(ctrl_holder){ + var empty_count = 0; + self.options.combine.each(function(name){ + var input = ctrl_holder.getElement('input.'+name) + if(input.get('value') == '' || input.get('type') == 'checkbox') + empty_count++ + }); + has_empty += (empty_count == self.options.combine.length) ? 1 : 0; + ctrl_holder[(empty_count == self.options.combine.length) ? 'addClass' : 'removeClass']('is_empty'); + }); + if(has_empty > 0) return; + + self.add_empty_timeout = setTimeout(function(){ + self.createItem(false, null); + }, 10); + }, + + createItem: function(values){ + var self = this; + + var item = new Element('div.ctrlHolder').inject(self.combined_list), + value_count = 0, + value_empty = 0; + + self.options.combine.each(function(name){ + var value = values[name] || '' + + if(name.indexOf('use') != -1){ + var checkbox = new Element('input[type=checkbox].inlay.'+name, { + 'checked': +value, + 'events': { + 'click': self.saveCombined.bind(self), + 'change': self.saveCombined.bind(self) + } + }).inject(item); + + new Form.Check(checkbox); + } + else { + value_count++; + new Element('input[type=text].inlay.'+name, { + 'value': value, + 'placeholder': name, + 'events': { + 'keyup': self.saveCombined.bind(self), + 'change': self.saveCombined.bind(self) + } + }).inject(item); + + if(!value) + value_empty++; + } + + + }); + + item[value_empty == value_count ? 'addClass' : 'removeClass']('is_empty'); + + new Element('a.icon.delete', { + 'events': { + 'click': self.deleteCombinedItem.bind(self) + } + }).inject(item) + + self.items.include(item); + + + }, + + saveCombined: function(){ + var self = this; + + + var temp = {} + self.items.each(function(item, nr){ + self.options.combine.each(function(name){ + var input = item.getElement('input.'+name); + if(item.hasClass('is_empty')) return; + + if(!temp[name]) temp[name] = []; + temp[name][nr] = input.get('type') == 'checkbox' ? +input.get('checked') : input.get('value').trim(); + + }) + }); + + self.options.combine.each(function(name){ + self.inputs[name].set('value', (temp[name] || []).join(',')); + self.inputs[name].fireEvent('change'); + }); + + self.addEmpty() + + }, + + deleteCombinedItem: function(e){ + var self = this; + (e).stop(); + + var item = e.target.getParent(); + + self.items.erase(item); + item.destroy(); + + self.saveCombined(); + } + +}); \ No newline at end of file diff --git a/couchpotato/static/style/page/settings.css b/couchpotato/static/style/page/settings.css index 9df7134e..f6fc174c 100644 --- a/couchpotato/static/style/page/settings.css +++ b/couchpotato/static/style/page/settings.css @@ -86,7 +86,7 @@ .page fieldset.disabled .ctrlHolder { display: none; } - .page fieldset .ctrlHolder:first-child { + .page fieldset > .ctrlHolder:first-child { display: block; padding: 0; width: auto; @@ -454,40 +454,46 @@ margin-top: -13px; } - .page .section_newznab .head { + .page .combined_table .head { margin: 0 0 0 60px; } .page .disabled .head { display: none; } - .page .section_newznab .head abbr { + .page .combined_table .head abbr { display: inline-block; font-weight: bold; border-bottom: 1px dotted #fff; line-height: 140%; cursor: help; } - .page .section_newznab .head abbr.host { + .page .combined_table .head abbr.use, .page .combined_table .head abbr.automation_urls_use { + display: none; + } + .page .combined_table .head abbr.host { margin-right: 197px; } - .page .section_newznab .ctrlHolder { + .page .combined_table .ctrlHolder { padding-top: 2px; padding-bottom: 3px; } - .page .section_newznab .ctrlHolder.hide { display: none; } + .page .combined_table .ctrlHolder.hide { display: none; } - .page .section_newznab .ctrlHolder > * { + .page .combined_table .ctrlHolder > * { margin: 0 10px 0 0; } - .page .section_newznab .ctrlHolder .delete { - display: inline-block; + .page .combined_table .ctrlHolder .delete { + display: none; width: 22px; height: 22px; vertical-align: middle; background-position: left center; } + .page .combined_table .ctrlHolder:hover .delete { + display: inline-block; + } - .page .section_newznab .ctrlHolder.is_empty .delete, .page.settings .section_newznab .ctrlHolder.is_empty .use { + .page .combined_table .ctrlHolder.is_empty .delete, .page.settings .combined_table .ctrlHolder.is_empty .check { visibility: hidden; }