From 4804ded964281eb05591b2ce4ae6ea527028d183 Mon Sep 17 00:00:00 2001 From: rembo10 Date: Sun, 19 Aug 2012 16:11:29 +0530 Subject: [PATCH 1/3] Added backend stuff for target range when preferred_bitrate option is selected --- headphones/__init__.py | 9 ++++++++- headphones/webserve.py | 7 ++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/headphones/__init__.py b/headphones/__init__.py index 129d37f7..2ed09fa8 100644 --- a/headphones/__init__.py +++ b/headphones/__init__.py @@ -90,6 +90,8 @@ FILE_FORMAT = None PATH_TO_XML = None PREFERRED_QUALITY = None PREFERRED_BITRATE = None +PREFERRED_BITRATE_HIGH_BUFFER = None +PREFERRED_BITRATE_LOW_BUFFER = None DETECT_BITRATE = False ADD_ARTISTS = False CORRECT_METADATA = False @@ -252,7 +254,8 @@ def initialize(): ENCODERFOLDER, ENCODER, BITRATE, SAMPLINGFREQUENCY, MUSIC_ENCODER, ADVANCEDENCODER, ENCODEROUTPUTFORMAT, ENCODERQUALITY, \ ENCODERVBRCBR, ENCODERLOSSLESS, DELETE_LOSSLESS_FILES, PROWL_ENABLED, PROWL_PRIORITY, PROWL_KEYS, PROWL_ONSNATCH, MIRRORLIST, \ MIRROR, CUSTOMHOST, CUSTOMPORT, CUSTOMSLEEP, HPUSER, HPPASS, XBMC_ENABLED, XBMC_HOST, XBMC_USERNAME, XBMC_PASSWORD, XBMC_UPDATE, \ - XBMC_NOTIFY, NMA_ENABLED, NMA_APIKEY, NMA_PRIORITY, SYNOINDEX_ENABLED, ALBUM_COMPLETION_PCT + XBMC_NOTIFY, NMA_ENABLED, NMA_APIKEY, NMA_PRIORITY, SYNOINDEX_ENABLED, ALBUM_COMPLETION_PCT, PREFERRED_BITRATE_HIGH_BUFFER, \ + PREFERRED_BITRATE_LOW_BUFFER if __INITIALIZED__: return False @@ -302,6 +305,8 @@ def initialize(): LOSSLESS_DESTINATION_DIR = check_setting_str(CFG, 'General', 'lossless_destination_dir', '') PREFERRED_QUALITY = check_setting_int(CFG, 'General', 'preferred_quality', 0) PREFERRED_BITRATE = check_setting_int(CFG, 'General', 'preferred_bitrate', '') + PREFERRED_BITRATE_HIGH_BUFFER = check_setting_int(CFG, 'General', 'preferred_bitrate_high_buffer', '') + PREFERRED_BITRATE_LOW_BUFFER = check_setting_int(CFG, 'General', 'preferred_bitrate_low_buffer', '') DETECT_BITRATE = bool(check_setting_int(CFG, 'General', 'detect_bitrate', 0)) ADD_ARTISTS = bool(check_setting_int(CFG, 'General', 'auto_add_artists', 1)) CORRECT_METADATA = bool(check_setting_int(CFG, 'General', 'correct_metadata', 0)) @@ -580,6 +585,8 @@ def config_write(): new_config['General']['lossless_destination_dir'] = LOSSLESS_DESTINATION_DIR new_config['General']['preferred_quality'] = PREFERRED_QUALITY new_config['General']['preferred_bitrate'] = PREFERRED_BITRATE + new_config['General']['preferred_bitrate_high_buffer'] = PREFERRED_BITRATE_HIGH_BUFFER + new_config['General']['preferred_bitrate_low_buffer'] = PREFERRED_BITRATE_LOW_BUFFER new_config['General']['detect_bitrate'] = int(DETECT_BITRATE) new_config['General']['auto_add_artists'] = int(ADD_ARTISTS) new_config['General']['correct_metadata'] = int(CORRECT_METADATA) diff --git a/headphones/webserve.py b/headphones/webserve.py index ca4a70a9..7e905a24 100644 --- a/headphones/webserve.py +++ b/headphones/webserve.py @@ -455,6 +455,8 @@ class WebInterface(object): "pref_qual_3" : radio(headphones.PREFERRED_QUALITY, 3), "pref_qual_2" : radio(headphones.PREFERRED_QUALITY, 2), "pref_bitrate" : headphones.PREFERRED_BITRATE, + "pref_bitrate_high" : headphones.PREFERRED_BITRATE_HIGH_BUFFER, + "pref_bitrate_low" : headphones.PREFERRED_BITRATE_LOW_BUFFER, "detect_bitrate" : checked(headphones.DETECT_BITRATE), "move_files" : checked(headphones.MOVE_FILES), "rename_files" : checked(headphones.RENAME_FILES), @@ -535,7 +537,8 @@ class WebInterface(object): interface=None, log_dir=None, music_encoder=0, encoder=None, bitrate=None, samplingfrequency=None, encoderfolder=None, advancedencoder=None, encoderoutputformat=None, encodervbrcbr=None, encoderquality=None, encoderlossless=0, delete_lossless_files=0, prowl_enabled=0, prowl_onsnatch=0, prowl_keys=None, prowl_priority=0, xbmc_enabled=0, xbmc_host=None, xbmc_username=None, xbmc_password=None, xbmc_update=0, xbmc_notify=0, nma_enabled=False, - nma_apikey=None, nma_priority=0, synoindex_enabled=False, mirror=None, customhost=None, customport=None, customsleep=None, hpuser=None, hppass=None, **kwargs): + nma_apikey=None, nma_priority=0, synoindex_enabled=False, mirror=None, customhost=None, customport=None, customsleep=None, hpuser=None, hppass=None, + preferred_bitrate_high_buffer=None, preferred_bitrate_low_buffer=None, **kwargs): headphones.HTTP_HOST = http_host headphones.HTTP_PORT = http_port @@ -580,6 +583,8 @@ class WebInterface(object): headphones.WAFFLES_PASSKEY = waffles_passkey headphones.PREFERRED_QUALITY = int(preferred_quality) headphones.PREFERRED_BITRATE = preferred_bitrate + headphones.PREFERRED_BITRATE_HIGH_BUFFER = preferred_bitrate_high_buffer + headphones.PREFERRED_BITRATE_LOW_BUFFER = preferred_bitrate_low_buffer headphones.DETECT_BITRATE = detect_bitrate headphones.MOVE_FILES = move_files headphones.CORRECT_METADATA = correct_metadata From 0f87a1e1acfe6830a4e2ae227ec2208a734da7c7 Mon Sep 17 00:00:00 2001 From: rembo10 Date: Sun, 19 Aug 2012 17:10:07 +0530 Subject: [PATCH 2/3] Put buffer_size limits in the default interface config page --- data/interfaces/default/config.html | 37 +++++++++++++++++++++------ data/interfaces/default/css/style.css | 4 +++ 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/data/interfaces/default/config.html b/data/interfaces/default/config.html index 6f709ebc..75219f33 100644 --- a/data/interfaces/default/config.html +++ b/data/interfaces/default/config.html @@ -316,16 +316,18 @@ m<%inherit file="base.html"/>
Quality
- + - -
-
- - -
+ Preferred Bitrate: kbps
+
+ Reject if less than % or more than % of the target size (leave blank for no limit)

+
+ + +
+
+
@@ -848,6 +850,25 @@ m<%inherit file="base.html"/> { $("#nmaoptions").slideUp(); } + }); + if ($("#preferred_bitrate").is(":checked")) + { + $("#preferred_bitrate_options").show(); + } + else + { + $("#preferred_bitrate_options").hide(); + } + + $('input[type=radio]').change(function(){ + if ($("#preferred_bitrate").is(":checked")) + { + $("#preferred_bitrate_options").slideDown("fast"); + } + else + { + $("#preferred_bitrate_options").slideUp("fast"); + } }); $("#mirror").change(handleNewSelection); diff --git a/data/interfaces/default/css/style.css b/data/interfaces/default/css/style.css index 771d4db3..e171b4db 100644 --- a/data/interfaces/default/css/style.css +++ b/data/interfaces/default/css/style.css @@ -376,6 +376,10 @@ form .radio label { padding-top: 1px; width: auto; } +.override-float { + float: none !important; + margin-bottom: 0px !important; +} form .radio input { float: left; margin-bottom: 10px; From cecda0bab993da2e3115639df3b375360253ee38 Mon Sep 17 00:00:00 2001 From: rembo10 Date: Sun, 19 Aug 2012 17:27:56 +0530 Subject: [PATCH 3/3] Added backend stuff to searcher.py to limit sizes to a specified range with preferred quality --- headphones/searcher.py | 41 ++++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/headphones/searcher.py b/headphones/searcher.py index 50068271..7470c790 100644 --- a/headphones/searcher.py +++ b/headphones/searcher.py @@ -426,15 +426,38 @@ def searchNZB(albumid=None, new=False, losslessOnly=False): albumlength = sum([pair[0] for pair in tracks]) targetsize = albumlength/1000 * int(headphones.PREFERRED_BITRATE) * 128 - logger.info('Target size: %s' % helpers.bytes_to_mb(targetsize)) - - newlist = [] - - for result in resultlist: - delta = abs(targetsize - result[1]) - newlist.append((result[0], result[1], result[2], result[3], delta)) - - nzblist = sorted(newlist, key=lambda title: title[4]) + + if not targetsize: + logger.info('No track information for %s - %s. Defaulting to highest quality' % (albums[0], albums[1])) + nzblist = sorted(resultlist, key=lambda title: title[1], reverse=True) + + else: + logger.info('Target size: %s' % helpers.bytes_to_mb(targetsize)) + newlist = [] + + if headphones.PREFERRED_BITRATE_HIGH_BUFFER: + high_size_limit = targetsize * int(headphones.PREFERRED_BITRATE_HIGH_BUFFER)/100 + else: + high_size_limit = None + if headphones.PREFERRED_BITRATE_LOW_BUFFER: + low_size_limit = targetsize * int(headphones.PREFERRED_BITRATE_LOW_BUFFER)/100 + else: + low_size_limit = None + + for result in resultlist: + + if high_size_limit and (result[1] > high_size_limit): + logger.info(result[0] + "is too large for this album - not considering it. (Size: " + helpers.bytes_to_mb(result[1]) + ", Maxsize: " + helpers.bytes_to_mb(high_size_limit)) + continue + + if low_size_limit and (result[1] < low_size_limit): + logger.info(result[0] + "is too small for this album - not considering it. (Size: " + helpers.bytes_to_mb(result[1]) + ", Minsize: " + helpers.bytes_to_mb(low_size_limit)) + continue + + delta = abs(targetsize - result[1]) + newlist.append((result[0], result[1], result[2], result[3], delta)) + + nzblist = sorted(newlist, key=lambda title: title[4]) except Exception, e: