From 85259e5bba590cb1c68c75d5e76a8d4ae5d822cf Mon Sep 17 00:00:00 2001 From: denise Date: Wed, 8 Aug 2012 13:07:00 -0400 Subject: [PATCH 1/5] CC-4170: Smart Playlist Builder: elements don't organize properly after deleting a row -fixed --- .../airtime/playlist/smart_playlistbuilder.js | 68 +++++++++++++------ 1 file changed, 48 insertions(+), 20 deletions(-) diff --git a/airtime_mvc/public/js/airtime/playlist/smart_playlistbuilder.js b/airtime_mvc/public/js/airtime/playlist/smart_playlistbuilder.js index bfbe094ac..305bb41ca 100644 --- a/airtime_mvc/public/js/airtime/playlist/smart_playlistbuilder.js +++ b/airtime_mvc/public/js/airtime/playlist/smart_playlistbuilder.js @@ -17,6 +17,7 @@ function setSmartPlaylistEvents() { $(this).hide(); } appendAddButton(); + appendModAddButton(); removeButtonCheck(); }); @@ -87,6 +88,8 @@ function setSmartPlaylistEvents() { var count = list_length - curr_pos; var next = curr.next(); var item_to_hide; + var prev; + var index; //remove error message from current row, if any var error_element = curr.find('span[class="errors sp-errors"]'); @@ -94,10 +97,13 @@ function setSmartPlaylistEvents() { error_element.remove(); } - /* assign next row to current row for all rows below and including - * the row getting removed - */ - for (var i=0; i Date: Wed, 8 Aug 2012 13:08:53 -0400 Subject: [PATCH 2/5] CC-430: Audio normalization (Replaygain Support) -Performance enhancement (don't use "file" command unnecessarily) -replace print statements with logging --- .../airtimefilemonitor/replaygain.py | 71 ++++++++++++------- 1 file changed, 45 insertions(+), 26 deletions(-) diff --git a/python_apps/media-monitor/airtimefilemonitor/replaygain.py b/python_apps/media-monitor/airtimefilemonitor/replaygain.py index e10b7a3f2..ef3d51039 100644 --- a/python_apps/media-monitor/airtimefilemonitor/replaygain.py +++ b/python_apps/media-monitor/airtimefilemonitor/replaygain.py @@ -40,7 +40,7 @@ def duplicate_file(file_path): fsrc = open(file_path, 'r') fdst = tempfile.NamedTemporaryFile(delete=False) - print "Copying %s to %s" % (file_path, fdst.name) + logger.info("Copying %s to %s" % (file_path, fdst.name)) shutil.copyfileobj(fsrc, fdst) @@ -49,6 +49,26 @@ def duplicate_file(file_path): return fdst.name +def get_file_type(file_path): + file_type = None + if re.search(r'mp3$', file_path, re.IGNORECASE): + file_type = 'mp3' + elif re.search(r'og(g|a)$', file_path, re.IGNORECASE): + file_type = 'vorbis' + elif re.search(r'flac$', file_path, re.IGNORECASE): + file_type = 'flac' + else: + mime_type = get_mime_type(file_path) == "audio/mpeg" + if 'mpeg' in mime_type: + file_type = 'mp3' + elif 'ogg' in mime_type: + file_type = 'vorbis' + elif 'flac' in mime_type: + file_type = 'flac' + + return file_type + + def calculate_replay_gain(file_path): """ This function accepts files of type mp3/ogg/flac and returns a calculated ReplayGain value in dB. @@ -66,36 +86,35 @@ def calculate_replay_gain(file_path): search = None temp_file_path = duplicate_file(file_path) - if re.search(r'mp3$', file_path, re.IGNORECASE) or get_mime_type(temp_file_path) == "audio/mpeg": - if run_process("which mp3gain > /dev/null") == 0: - out = get_process_output('mp3gain -q "%s" 2> /dev/null' % temp_file_path) - search = re.search(r'Recommended "Track" dB change: (.*)', out) + file_type = get_file_type(file_path) + + if file_type: + if file_type == 'mp3': + if run_process("which mp3gain > /dev/null") == 0: + out = get_process_output('mp3gain -q "%s" 2> /dev/null' % temp_file_path) + search = re.search(r'Recommended "Track" dB change: (.*)', out) + else: + logger.warn("mp3gain not found") + elif file_type == 'vorbis': + if run_process("which vorbisgain > /dev/null && which ogginfo > /dev/null") == 0: + run_process('vorbisgain -q -f "%s" 2>/dev/null >/dev/null' % temp_file_path) + out = get_process_output('ogginfo "%s"' % temp_file_path) + search = re.search(r'REPLAYGAIN_TRACK_GAIN=(.*) dB', out) + else: + logger.warn("vorbisgain/ogginfo not found") + elif file_type == 'flac': + if run_process("which metaflac > /dev/null") == 0: + out = get_process_output('metaflac --show-tag=REPLAYGAIN_TRACK_GAIN "%s"' % temp_file_path) + search = re.search(r'REPLAYGAIN_TRACK_GAIN=(.*) dB', out) + else: + logger.warn("metaflac not found") else: - print "mp3gain not found" - #Log warning - elif re.search(r'og(g|a)$', file_path, re.IGNORECASE) or get_mime_type(temp_file_path) == "application/ogg": - if run_process("which vorbisgain > /dev/null && which ogginfo > /dev/null") == 0: - run_process('vorbisgain -q -f "%s" 2>/dev/null >/dev/null' % temp_file_path) - out = get_process_output('ogginfo "%s"' % temp_file_path) - search = re.search(r'REPLAYGAIN_TRACK_GAIN=(.*) dB', out) - else: - print "vorbisgain/ogginfo not found" - #Log warning - elif re.search(r'flac$', file_path, re.IGNORECASE) or get_mime_type(temp_file_path) == "audio/x-flac": - if run_process("which metaflac > /dev/null") == 0: - out = get_process_output('metaflac --show-tag=REPLAYGAIN_TRACK_GAIN "%s"' % temp_file_path) - search = re.search(r'REPLAYGAIN_TRACK_GAIN=(.*) dB', out) - else: - print "metaflac not found" - #Log warning - else: - pass - #Log unknown file type. + pass #no longer need the temp, file simply remove it. os.remove(temp_file_path) except Exception, e: - print e + logger.error(str(e)) replay_gain = 0 if search: From 67a8457889e3169aa4c32706f8cf9b46ab6f987b Mon Sep 17 00:00:00 2001 From: denise Date: Wed, 8 Aug 2012 13:16:02 -0400 Subject: [PATCH 3/5] Smart Playlists: modifier buttons appear incorrectly when editing --- airtime_mvc/public/js/airtime/library/spl.js | 1 + 1 file changed, 1 insertion(+) diff --git a/airtime_mvc/public/js/airtime/library/spl.js b/airtime_mvc/public/js/airtime/library/spl.js index 82999a3eb..8f6526266 100644 --- a/airtime_mvc/public/js/airtime/library/spl.js +++ b/airtime_mvc/public/js/airtime/library/spl.js @@ -333,6 +333,7 @@ var AIRTIME = (function(AIRTIME){ // functions in smart_playlistbuilder.js setupUI(); appendAddButton(); + appendModAddButton(); removeButtonCheck(); } From 50f9582b95cc204d937b6ae175f1eca0c7b31f51 Mon Sep 17 00:00:00 2001 From: denise Date: Wed, 8 Aug 2012 13:24:53 -0400 Subject: [PATCH 4/5] CC-4179: Media Library -> In brief view of Dynamic Smart Playlist, 'does not contain' will be broken to 2 lines -fixed --- .../views/scripts/library/get-file-metadata.ajax.phtml | 5 ++++- airtime_mvc/public/css/styles.css | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml b/airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml index d882eb9c9..ca14ac39f 100644 --- a/airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml +++ b/airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml @@ -84,10 +84,13 @@ if (strlen($crit["display_name"]) > $critMaxStrLen) { $crit["display_name"] = substr($crit["display_name"], 0, 12)."..."; } + if (strlen($crit["modifier"]) > $critMaxStrLen) { + $crit["modifier"] = substr($crit["modifier"], 0, 12)."..."; + } ?> - + to diff --git a/airtime_mvc/public/css/styles.css b/airtime_mvc/public/css/styles.css index f4948dab8..b4a398055 100644 --- a/airtime_mvc/public/css/styles.css +++ b/airtime_mvc/public/css/styles.css @@ -451,7 +451,7 @@ table.library-get-file-md.table-small{ } .file-md-qtip-criteria-width-mod{ - width:60px; + width:70px; } .file-md-qtip-criteria-width{ From 3a4a827f1fb5b7a9188e53ce8fae99924111c458 Mon Sep 17 00:00:00 2001 From: denise Date: Wed, 8 Aug 2012 15:24:47 -0400 Subject: [PATCH 5/5] CC-4180: Smart Playlist Builder: modifier select boxes do not change when criteria changes -fixed --- .../airtime/playlist/smart_playlistbuilder.js | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/airtime_mvc/public/js/airtime/playlist/smart_playlistbuilder.js b/airtime_mvc/public/js/airtime/playlist/smart_playlistbuilder.js index 81ba7acaa..8123e99c4 100644 --- a/airtime_mvc/public/js/airtime/playlist/smart_playlistbuilder.js +++ b/airtime_mvc/public/js/airtime/playlist/smart_playlistbuilder.js @@ -429,26 +429,27 @@ function sizeTextBoxes(ele, classToRemove, classToAdd) { } function populateModifierSelect(e) { - /*var criteria = $(e).val(), - criteria_type = criteriaTypes[criteria],*/ var criteria_type = getCriteriaOptionType(e), - div = $(e).siblings('select[id^="sp_criteria_modifier"]'); + index = getRowIndex($(e).parent()), + divs = $(e).parents().find('select[id^="sp_criteria_modifier_'+index+'"]'); - div.children().remove(); - - if (criteria_type == 's') { - $.each(stringCriteriaOptions, function(key, value){ - div.append($('') - .attr('value', key) - .text(value)); - }); - } else { - $.each(numericCriteriaOptions, function(key, value){ - div.append($('') - .attr('value', key) - .text(value)); - }); - } + $.each(divs, function(i, div){ + $(div).children().remove(); + + if (criteria_type == 's') { + $.each(stringCriteriaOptions, function(key, value){ + $(div).append($('') + .attr('value', key) + .text(value)); + }); + } else { + $.each(numericCriteriaOptions, function(key, value){ + $(div).append($('') + .attr('value', key) + .text(value)); + }); + } + }); } function getCriteriaOptionType(e) {