Merge branch 'develop'

This commit is contained in:
Ruud
2014-10-04 22:19:37 +02:00
8 changed files with 114 additions and 79 deletions
@@ -2,6 +2,8 @@ var Charts = new Class({
Implements: [Options, Events], Implements: [Options, Events],
shown_once: false,
initialize: function(options){ initialize: function(options){
var self = this; var self = this;
self.setOptions(options); self.setOptions(options);
@@ -40,17 +42,13 @@ var Charts = new Class({
) )
); );
if( Cookie.read('suggestions_charts_menu_selected') === 'charts') if( Cookie.read('suggestions_charts_menu_selected') === 'charts'){
self.el.show(); self.show();
self.fireEvent.delay(0, self, 'created');
}
else else
self.el.hide(); self.el.hide();
self.api_request = Api.request('charts.view', {
'onComplete': self.fill.bind(self)
});
self.fireEvent.delay(0, self, 'created');
}, },
fill: function(json){ fill: function(json){
@@ -157,6 +155,24 @@ var Charts = new Class({
}, },
show: function(){
var self = this;
self.el.show();
if(!self.shown_once){
self.api_request = Api.request('charts.view', {
'onComplete': self.fill.bind(self)
});
self.shown_once = true;
}
},
hide: function(){
this.el.hide();
},
afterAdded: function(m){ afterAdded: function(m){
$(m).getElement('div.chart_number') $(m).getElement('div.chart_number')
@@ -3,7 +3,7 @@ import re
from bs4 import SoupStrainer, BeautifulSoup from bs4 import SoupStrainer, BeautifulSoup
from couchpotato.core.helpers.encoding import tryUrlencode from couchpotato.core.helpers.encoding import tryUrlencode
from couchpotato.core.helpers.variable import mergeDicts, getTitle from couchpotato.core.helpers.variable import mergeDicts, getTitle, getIdentifier
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.media.movie.providers.trailer.base import TrailerProvider from couchpotato.core.media.movie.providers.trailer.base import TrailerProvider
from requests import HTTPError from requests import HTTPError
@@ -29,7 +29,7 @@ class HDTrailers(TrailerProvider):
url = self.urls['api'] % self.movieUrlName(movie_name) url = self.urls['api'] % self.movieUrlName(movie_name)
try: try:
data = self.getCache('hdtrailers.%s' % group['identifier'], url, show_error = False) data = self.getCache('hdtrailers.%s' % getIdentifier(group), url, show_error = False)
except HTTPError: except HTTPError:
log.debug('No page found for: %s', movie_name) log.debug('No page found for: %s', movie_name)
data = None data = None
@@ -59,7 +59,7 @@ class HDTrailers(TrailerProvider):
url = "%s?%s" % (self.urls['backup'], tryUrlencode({'s':movie_name})) url = "%s?%s" % (self.urls['backup'], tryUrlencode({'s':movie_name}))
try: try:
data = self.getCache('hdtrailers.alt.%s' % group['identifier'], url, show_error = False) data = self.getCache('hdtrailers.alt.%s' % getIdentifier(group), url, show_error = False)
except HTTPError: except HTTPError:
log.debug('No alternative page found for: %s', movie_name) log.debug('No alternative page found for: %s', movie_name)
data = None data = None
@@ -68,7 +68,7 @@ class HDTrailers(TrailerProvider):
return results return results
try: try:
html = BeautifulSoup(data, 'html.parser', parse_only = self.only_tables_tags) html = BeautifulSoup(data, parse_only = self.only_tables_tags)
result_table = html.find_all('h2', text = re.compile(movie_name)) result_table = html.find_all('h2', text = re.compile(movie_name))
for h2 in result_table: for h2 in result_table:
@@ -90,7 +90,7 @@ class HDTrailers(TrailerProvider):
results = {'480p':[], '720p':[], '1080p':[]} results = {'480p':[], '720p':[], '1080p':[]}
try: try:
html = BeautifulSoup(data, 'html.parser', parse_only = self.only_tables_tags) html = BeautifulSoup(data, parse_only = self.only_tables_tags)
result_table = html.find('table', attrs = {'class':'bottomTable'}) result_table = html.find('table', attrs = {'class':'bottomTable'})
for tr in result_table.find_all('tr'): for tr in result_table.find_all('tr'):
+7 -6
View File
@@ -55,6 +55,7 @@ class MovieSearcher(SearcherBase, MovieTypeBase):
if self.conf('run_on_launch'): if self.conf('run_on_launch'):
addEvent('app.load', self.searchAll) addEvent('app.load', self.searchAll)
addEvent('app.load', self.searchAll)
def searchAllView(self, **kwargs): def searchAllView(self, **kwargs):
@@ -141,17 +142,17 @@ class MovieSearcher(SearcherBase, MovieTypeBase):
previous_releases = movie.get('releases', []) previous_releases = movie.get('releases', [])
too_early_to_search = [] too_early_to_search = []
outside_eta_results = 0 outside_eta_results = 0
alway_search = self.conf('always_search') always_search = self.conf('always_search')
ignore_eta = manual ignore_eta = manual
total_result_count = 0 total_result_count = 0
fireEvent('notify.frontend', type = 'movie.searcher.started', data = {'_id': movie['_id']}, message = 'Searching for "%s"' % default_title) fireEvent('notify.frontend', type = 'movie.searcher.started', data = {'_id': movie['_id']}, message = 'Searching for "%s"' % default_title)
# Ignore eta once every 7 days # Ignore eta once every 7 days
if not alway_search: if not always_search:
prop_name = 'last_ignored_eta.%s' % movie['_id'] prop_name = 'last_ignored_eta.%s' % movie['_id']
last_ignored_eta = float(Env.prop(prop_name, default = 0)) last_ignored_eta = float(Env.prop(prop_name, default = 0))
if last_ignored_eta > time.time() - 604800: if last_ignored_eta < time.time() - 604800:
ignore_eta = True ignore_eta = True
Env.prop(prop_name, value = time.time()) Env.prop(prop_name, value = time.time())
@@ -170,7 +171,7 @@ class MovieSearcher(SearcherBase, MovieTypeBase):
} }
could_not_be_released = not self.couldBeReleased(q_identifier in pre_releases, release_dates, movie['info']['year']) could_not_be_released = not self.couldBeReleased(q_identifier in pre_releases, release_dates, movie['info']['year'])
if not alway_search and could_not_be_released: if not always_search and could_not_be_released:
too_early_to_search.append(q_identifier) too_early_to_search.append(q_identifier)
# Skip release, if ETA isn't ignored # Skip release, if ETA isn't ignored
@@ -196,7 +197,7 @@ class MovieSearcher(SearcherBase, MovieTypeBase):
break break
quality = fireEvent('quality.single', identifier = q_identifier, single = True) quality = fireEvent('quality.single', identifier = q_identifier, single = True)
log.info('Search for %s in %s%s', (default_title, quality['label'], ' ignoring ETA' if alway_search or ignore_eta else '')) log.info('Search for %s in %s%s', (default_title, quality['label'], ' ignoring ETA' if always_search or ignore_eta else ''))
# Extend quality with profile customs # Extend quality with profile customs
quality['custom'] = quality_custom quality['custom'] = quality_custom
@@ -223,7 +224,7 @@ class MovieSearcher(SearcherBase, MovieTypeBase):
log.debug('Found %s releases for "%s", but ETA isn\'t correct yet.', (results_count, default_title)) log.debug('Found %s releases for "%s", but ETA isn\'t correct yet.', (results_count, default_title))
# Try find a valid result and download it # Try find a valid result and download it
if (force_download or not could_not_be_released or alway_search) and fireEvent('release.try_download_result', results, movie, quality_custom, single = True): if (force_download or not could_not_be_released or always_search) and fireEvent('release.try_download_result', results, movie, quality_custom, single = True):
ret = True ret = True
# Remove releases that aren't found anymore # Remove releases that aren't found anymore
@@ -2,6 +2,8 @@ var SuggestList = new Class({
Implements: [Options, Events], Implements: [Options, Events],
shown_once: false,
initialize: function(options){ initialize: function(options){
var self = this; var self = this;
self.setOptions(options); self.setOptions(options);
@@ -44,12 +46,13 @@ var SuggestList = new Class({
} }
}); });
var cookie_menu_select = Cookie.read('suggestions_charts_menu_selected'); var cookie_menu_select = Cookie.read('suggestions_charts_menu_selected') || 'suggestions';
if( cookie_menu_select === 'suggestions' || cookie_menu_select === null ) self.el.show(); else self.el.hide(); if( cookie_menu_select === 'suggestions')
self.show();
else
self.hide();
self.api_request = Api.request('suggestion.view', { self.fireEvent('created');
'onComplete': self.fill.bind(self)
});
}, },
@@ -145,6 +148,24 @@ var SuggestList = new Class({
}, },
show: function(){
var self = this;
self.el.show();
if(!self.shown_once){
self.api_request = Api.request('suggestion.view', {
'onComplete': self.fill.bind(self)
});
self.shown_once = true;
}
},
hide: function(){
this.el.hide();
},
toElement: function(){ toElement: function(){
return this.el; return this.el;
} }
+1 -1
View File
@@ -42,7 +42,7 @@ class Email(Notification):
# Open the SMTP connection, via SSL if requested # Open the SMTP connection, via SSL if requested
log.debug("Connecting to host %s on port %s" % (smtp_server, smtp_port)) log.debug("Connecting to host %s on port %s" % (smtp_server, smtp_port))
log.debug("SMTP over SSL %s", ("enabled" if ssl == 1 else "disabled")) log.debug("SMTP over SSL %s", ("enabled" if ssl == 1 else "disabled"))
mailserver = smtplib.SMTP_SSL(smtp_server) if ssl == 1 else smtplib.SMTP(smtp_server) mailserver = smtplib.SMTP_SSL(smtp_server, smtp_port) if ssl == 1 else smtplib.SMTP(smtp_server, smtp_port)
if starttls: if starttls:
log.debug("Using StartTLS to initiate the connection with the SMTP server") log.debug("Using StartTLS to initiate the connection with the SMTP server")
+1 -1
View File
@@ -241,7 +241,7 @@ Running on: ...\n\
'href': 'https://github.com/RuudBurger/CouchPotatoServer/blob/develop/contributing.md' 'href': 'https://github.com/RuudBurger/CouchPotatoServer/blob/develop/contributing.md'
}), }),
new Element('span', { new Element('span', {
'text': ' before posting (kittens die if you don\'t), then copy the text below.' 'html': ' before posting, then copy the text below and <strong>FILL IN</strong> the dots.'
}) })
), ),
textarea = new Element('textarea', { textarea = new Element('textarea', {
+15 -6
View File
@@ -541,12 +541,13 @@ class Renamer(Plugin):
(not keep_original or self.fileIsAdded(current_file, group)): (not keep_original or self.fileIsAdded(current_file, group)):
remove_files.append(current_file) remove_files.append(current_file)
total_space, available_space = getFreeSpace(destination) if self.conf('check_space'):
renaming_size = getSize(rename_files.keys()) total_space, available_space = getFreeSpace(destination)
if renaming_size > available_space: renaming_size = getSize(rename_files.keys())
log.error('Not enough space left, need %s MB but only %s MB available', (renaming_size, available_space)) if renaming_size > available_space:
self.tagRelease(group = group, tag = 'not_enough_space') log.error('Not enough space left, need %s MB but only %s MB available', (renaming_size, available_space))
continue self.tagRelease(group = group, tag = 'not_enough_space')
continue
# Remove files # Remove files
delete_folders = [] delete_folders = []
@@ -1389,6 +1390,14 @@ config = [{
'label': 'Folder-Separator', 'label': 'Folder-Separator',
'description': ('Replace all the spaces with a character.', 'Example: ".", "-" (without quotes). Leave empty to use spaces.'), 'description': ('Replace all the spaces with a character.', 'Example: ".", "-" (without quotes). Leave empty to use spaces.'),
}, },
{
'name': 'check_space',
'label': 'Check space',
'default': True,
'type': 'bool',
'description': ('Check if there\'s enough available space to rename the files', 'Disable when the filesystem doesn\'t return the proper value'),
'advanced': True,
},
{ {
'name': 'default_file_action', 'name': 'default_file_action',
'label': 'Default File Action', 'label': 'Default File Action',
+35 -47
View File
@@ -146,13 +146,13 @@ Page.Home = new Class({
var self = this; var self = this;
// Suggest // Suggest
self.suggestion_list = new SuggestList({ self.suggestions_list = new SuggestList({
'onLoaded': function(){ 'onCreated': function(){
self.chain.callChain(); self.chain.callChain();
} }
}); });
$(self.suggestion_list).inject(self.el); $(self.suggestions_list).inject(self.el);
}, },
@@ -160,46 +160,38 @@ Page.Home = new Class({
var self = this; var self = this;
// Charts // Charts
self.charts = new Charts({ self.charts_list = new Charts({
'onCreated': function(){ 'onCreated': function(){
self.chain.callChain(); self.chain.callChain();
} }
}); });
$(self.charts).inject(self.el); $(self.charts_list).inject(self.el);
}, },
createSuggestionsChartsMenu: function(){ createSuggestionsChartsMenu: function(){
var self = this; var self = this,
suggestion_tab, charts_tab;
self.el_toggle_menu_suggestions = new Element('a.toggle_suggestions.active', { self.el_toggle_menu = new Element('div.toggle_menu', {
'href': '#', 'events': {
'events': { 'click': function(e) { 'click:relay(a)': function(e, el) {
e.preventDefault(); e.preventDefault();
self.toggleSuggestionsCharts('suggestions'); self.toggleSuggestionsCharts(el.get('data-container'), el);
} }
} }
}).grab( new Element('h2', {'text': 'Suggestions'})); }).adopt(
suggestion_tab = new Element('a.toggle_suggestions', {
'data-container': 'suggestions'
}).grab(new Element('h2', {'text': 'Suggestions'})),
charts_tab = new Element('a.toggle_charts', {
'data-container': 'charts'
}).grab( new Element('h2', {'text': 'Charts'}))
);
self.el_toggle_menu_charts = new Element('a.toggle_charts', { var menu_selected = Cookie.read('suggestions_charts_menu_selected') || 'suggestions';
'href': '#', self.toggleSuggestionsCharts(menu_selected, menu_selected == 'suggestions' ? suggestion_tab : charts_tab);
'events': { 'click': function(e) {
e.preventDefault();
self.toggleSuggestionsCharts('charts');
}
}
}).grab( new Element('h2', {'text': 'Charts'}));
self.el_toggle_menu = new Element('div.toggle_menu').grab(
self.el_toggle_menu_suggestions
).grab(
self.el_toggle_menu_charts
);
var menu_selected = Cookie.read('suggestions_charts_menu_selected');
if( menu_selected === null ) menu_selected = 'suggestions';
self.toggleSuggestionsCharts( menu_selected );
self.el_toggle_menu.inject(self.el); self.el_toggle_menu.inject(self.el);
@@ -207,23 +199,19 @@ Page.Home = new Class({
}, },
toggleSuggestionsCharts: function(menu_id){ toggleSuggestionsCharts: function(menu_id, el){
var self = this; var self = this;
switch(menu_id) { // Toggle ta
case 'suggestions': self.el_toggle_menu.getElements('.active').removeClass('active');
if($(self.suggestion_list)) $(self.suggestion_list).show(); if(el) el.addClass('active');
self.el_toggle_menu_suggestions.addClass('active');
if($(self.charts)) $(self.charts).hide(); // Hide both
self.el_toggle_menu_charts.removeClass('active'); if(self.suggestions_list) self.suggestions_list.hide();
break; if(self.charts_list) self.charts_list.hide();
case 'charts':
if($(self.charts)) $(self.charts).show(); var toggle_to = self[menu_id + '_list'];
self.el_toggle_menu_charts.addClass('active'); if(toggle_to) toggle_to.show();
if($(self.suggestion_list)) $(self.suggestion_list).hide();
self.el_toggle_menu_suggestions.removeClass('active');
break;
}
Cookie.write('suggestions_charts_menu_selected', menu_id, {'duration': 365}); Cookie.write('suggestions_charts_menu_selected', menu_id, {'duration': 365});
}, },