Merge branch '2.3.x' into devel

This commit is contained in:
Naomi 2013-02-15 17:05:36 -05:00
commit 542553bbc1
18 changed files with 303 additions and 13049 deletions
airtime_mvc
install_full/ubuntu
python_apps
api_clients
pypo/media/update

View File

@ -42,8 +42,9 @@ class ApiController extends Zend_Controller_Action
->addActionContext('reload-metadata-group' , 'json')
->addActionContext('notify-webstream-data' , 'json')
->addActionContext('get-stream-parameters' , 'json')
->addActionContext('push-stream-stats' , 'json')
->addActionContext('update-stream-setting-table' , 'json')
->addActionContext('push-stream-stats' , 'json')
->addActionContext('update-stream-setting-table' , 'json')
->addActionContext('update-replay-gain-value' , 'json')
->initContext();
}
@ -947,10 +948,6 @@ class ApiController extends Zend_Controller_Action
public function updateReplayGainValueAction()
{
// disable layout
$this->view->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender(true);
$request = $this->getRequest();
$data = json_decode($request->getParam('data'));
@ -961,6 +958,8 @@ class ApiController extends Zend_Controller_Action
$file->setDbReplayGain($gain);
$file->save();
}
$this->view->msg = "OK";
}
public function updateCueValuesBySilanAction()

View File

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Airtime 2.3\n"
"Report-Msgid-Bugs-To: <contact@sourcefabric.org>\n"
"POT-Creation-Date: 2013-02-07 16:22-0500\n"
"PO-Revision-Date: 2013-02-08 11:13+0100\n"
"PO-Revision-Date: 2013-02-14 17:18+0100\n"
"Last-Translator: Daniel James <daniel.james@sourcefabric.org>\n"
"Language-Team: Greek Localization <contact@sourcefabric.org>\n"
"Language: el_GR\n"
@ -2867,7 +2867,7 @@ msgstr "Εμφάνιση Πηγής "
#: airtime_mvc/application/views/scripts/partialviews/header.phtml:45
msgid "Scheduled Play"
msgstr "Προγραμματισμένη Αναπαραγωγή"
msgstr "Πρόγραμμα"
#: airtime_mvc/application/views/scripts/partialviews/header.phtml:54
msgid "ON AIR"

View File

@ -360,13 +360,15 @@ function controlSwitchLight(){
}
function getScheduleFromServer(){
$.ajax({ url: baseUrl+"Schedule/get-current-playlist/format/json", dataType:"json", success:function(data){
$.ajax({ url: baseUrl+"Schedule/get-current-playlist/format/json",
dataType:"json",
success:function(data){
parseItems(data.entries);
parseSourceStatus(data.source_status);
parseSwitchStatus(data.switch_status);
showName = data.show_name;
setTimeout(getScheduleFromServer, serverUpdateInterval);
}, error:function(jqXHR, textStatus, errorThrown){}});
setTimeout(getScheduleFromServer, serverUpdateInterval);
}
function setupQtip(){

View File

@ -511,9 +511,11 @@ var AIRTIME = (function(AIRTIME) {
},
"fnStateLoad": function fnLibStateLoad(oSettings) {
var settings = localStorage.getItem('datatables-library');
if (settings !== "") {
try {
return JSON.parse(settings);
} catch (e) {
return null;
}
},
"fnStateLoadParams": function (oSettings, oData) {
@ -521,18 +523,22 @@ var AIRTIME = (function(AIRTIME) {
length,
a = oData.abVisCols;
// putting serialized data back into the correct js type to make
// sure everything works properly.
for (i = 0, length = a.length; i < length; i++) {
if (typeof(a[i]) === "string") {
a[i] = (a[i] === "true") ? true : false;
}
if (a) {
// putting serialized data back into the correct js type to make
// sure everything works properly.
for (i = 0, length = a.length; i < length; i++) {
if (typeof(a[i]) === "string") {
a[i] = (a[i] === "true") ? true : false;
}
}
}
a = oData.ColReorder;
for (i = 0, length = a.length; i < length; i++) {
if (typeof(a[i]) === "string") {
a[i] = parseInt(a[i], 10);
if (a) {
for (i = 0, length = a.length; i < length; i++) {
if (typeof(a[i]) === "string") {
a[i] = parseInt(a[i], 10);
}
}
}
@ -842,8 +848,7 @@ var AIRTIME = (function(AIRTIME) {
});
checkImportStatus();
setInterval(checkImportStatus, 5000);
setInterval(checkLibrarySCUploadStatus, 5000);
checkLibrarySCUploadStatus();
addQtipToSCIcons();
@ -1071,6 +1076,7 @@ function checkImportStatus() {
}
div.hide();
}
setTimeout(checkImportStatus, 5000);
});
}
@ -1104,6 +1110,7 @@ function checkLibrarySCUploadStatus(){
else if (json.sc_id == "-3") {
span.removeClass("progress").addClass("sc-error");
}
setTimeout(checkLibrarySCUploadStatus, 5000);
}
function checkSCUploadStatusRequest() {

View File

@ -102,6 +102,8 @@ function checkLiquidsoapStatus(){
}
$("#s"+id+"Liquidsoap-error-msg-element").html(html);
}
setTimeout(checkLiquidsoapStatus, 2000);
});
}
@ -241,10 +243,10 @@ function setupEventListeners() {
return false;
})
setLiveSourceConnectionOverrideListener()
setLiveSourceConnectionOverrideListener();
showErrorSections()
setInterval('checkLiquidsoapStatus()', 1000)
showErrorSections();
checkLiquidsoapStatus();
// qtip for help text
$(".override_help_icon").qtip({

View File

@ -406,10 +406,9 @@ function setAddShowEvents() {
event.stopPropagation();
event.preventDefault();
$("#schedule_calendar").removeAttr("style")
.fullCalendar('render');
$("#add-show-form").hide();
windowResize();
$.get(baseUrl+"Schedule/get-form", {format:"json"}, function(json){
$("#add-show-form")
.empty()
@ -652,13 +651,14 @@ function windowResize() {
var calendarWidth = 100-(($("#schedule-add-show").width() + (16 * 4))/windowWidth*100);
var widthPercent = parseInt(calendarWidth)+"%";
$("#schedule_calendar").css("width", widthPercent);
} else {
$("#schedule_calendar").css("width", 98.5+"%");
}
// 200 px for top dashboard and 50 for padding on main content
// this calculation was copied from schedule.js line 326
var mainHeight = document.documentElement.clientHeight - 200 - 50;
$('#schedule_calendar').fullCalendar('option', 'contentHeight', mainHeight)
$("#schedule_calendar").fullCalendar('render');
$('#schedule_calendar').fullCalendar('option', 'contentHeight', mainHeight);
}

View File

@ -28,7 +28,11 @@ function openAddShowForm() {
var calendarWidth = 100-(($("#schedule-add-show").width() + (16 * 4))/windowWidth*100);
var widthPercent = parseInt(calendarWidth)+"%";
$("#schedule_calendar").css("width", widthPercent);
$("#schedule_calendar").fullCalendar('render');
// 200 px for top dashboard and 50 for padding on main content
// this calculation was copied from schedule.js line 326
var mainHeight = document.documentElement.clientHeight - 200 - 50;
$('#schedule_calendar').fullCalendar('option', 'contentHeight', mainHeight);
}
$("#schedule-show-what").show(0, function(){
$add_show_name = $("#add_show_name");
@ -372,6 +376,7 @@ function checkSCUploadStatus(){
}else if(json.sc_id == "-3"){
$("span[id="+id+"]:not(.recording)").removeClass("progress").addClass("sc-error");
}
setTimeout(checkSCUploadStatus, 5000);
});
});
}
@ -424,6 +429,7 @@ function getCurrentShow(){
$(this).remove("span[small-icon now-playing]");
}
});
setTimeout(getCurrentShow, 5000);
});
}
@ -564,8 +570,8 @@ function alertShowErrorAndReload(){
preloadEventFeed();
$(document).ready(function(){
setInterval( "checkSCUploadStatus()", 5000 );
setInterval( "getCurrentShow()", 5000 );
checkSCUploadStatus();
getCurrentShow();
});
var view_name;

View File

@ -93,6 +93,8 @@ function checkCalendarSCUploadStatus(){
else if (json.sc_id == "-3") {
span.removeClass("progress").addClass("sc-error");
}
setTimeout(checkCalendarSCUploadStatus, 5000);
}
function checkSCUploadStatusRequest() {
@ -328,7 +330,7 @@ function alertShowErrorAndReload(){
}
$(document).ready(function() {
setInterval(checkCalendarSCUploadStatus, 5000);
checkCalendarSCUploadStatus();
$.contextMenu({
selector: 'div.fc-event',

View File

@ -86,7 +86,7 @@ AIRTIME = (function(AIRTIME) {
.end();
oTable = $('#show_builder_table').dataTable();
oTable.fnDraw();
//oTable.fnDraw();
}
}
@ -277,12 +277,13 @@ AIRTIME = (function(AIRTIME) {
if (json.update === true) {
oTable.fnDraw();
}
setTimeout(checkScheduleUpdates, 5000);
}
});
}
//check if the timeline view needs updating.
setInterval(checkScheduleUpdates, 5 * 1000); //need refresh in milliseconds
checkScheduleUpdates();
};
mod.onResize = function() {

View File

@ -66,6 +66,7 @@ function success(data, textStatus, jqXHR){
if (data.status.partitions){
generatePartitions(data.status.partitions);
}
setTimeout(function(){updateStatus(false);}, 5000);
}
function updateStatus(getDiskInfo){
@ -75,5 +76,4 @@ function updateStatus(getDiskInfo){
$(document).ready(function() {
updateStatus(true);
setInterval(function(){updateStatus(false);}, 5000);
});

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,8 @@
/*
* File: ColReorder.js
* Version: 1.0.5
* Version: 1.0.8
* CVS: $Id$
* Description: Controls for column visiblity in DataTables
* Description: Allow columns to be reordered in a DataTable
* Author: Allan Jardine (www.sprymedia.co.uk)
* Created: Wed Sep 15 18:23:29 BST 2010
* Modified: $Date$ by $Author$
@ -174,10 +174,10 @@ $.fn.dataTableExt.oApi.fnColReorder = function ( oSettings, iFrom, iTo )
for ( i=0, iLen=iCols ; i<iLen ; i++ )
{
oCol = oSettings.aoColumns[i];
if ( typeof oCol.mDataProp == 'number' ) {
oCol.mDataProp = aiInvertMapping[ oCol.mDataProp ];
oCol.fnGetData = oSettings.oApi._fnGetObjectDataFn( oCol.mDataProp );
oCol.fnSetData = oSettings.oApi._fnSetObjectDataFn( oCol.mDataProp );
if ( typeof oCol.mData == 'number' ) {
oCol.mData = aiInvertMapping[ oCol.mData ];
oCol.fnGetData = oSettings.oApi._fnGetObjectDataFn( oCol.mData );
oCol.fnSetData = oSettings.oApi._fnSetObjectDataFn( oCol.mData );
}
}
@ -274,13 +274,12 @@ $.fn.dataTableExt.oApi.fnColReorder = function ( oSettings, iFrom, iTo )
}
/*
* Any extra operations for the other plug-ins
*/
if ( typeof ColVis != 'undefined' )
{
ColVis.fnRebuild( oSettings.oInstance );
}
/* Fire an event so other plug-ins can update */
$(oSettings.oInstance).trigger( 'column-reorder', [ oSettings, {
"iFrom": iFrom,
"iTo": iTo,
"aiInvertMapping": aiInvertMapping
} ] );
if ( typeof oSettings.oInstance._oPluginFixedHeader != 'undefined' )
{
@ -295,10 +294,10 @@ $.fn.dataTableExt.oApi.fnColReorder = function ( oSettings, iFrom, iTo )
* ColReorder provides column visiblity control for DataTables
* @class ColReorder
* @constructor
* @param {object} DataTables object
* @param {object} DataTables settings object
* @param {object} ColReorder options
*/
ColReorder = function( oTable, oOpts )
ColReorder = function( oDTSettings, oOpts )
{
/* Santiy check that we are a new instance */
if ( !this.CLASS || this.CLASS != "ColReorder" )
@ -401,9 +400,12 @@ ColReorder = function( oTable, oOpts )
/* Constructor logic */
this.s.dt = oTable.fnSettings();
this.s.dt = oDTSettings.oInstance.fnSettings();
this._fnConstruct();
/* Add destroy callback */
oDTSettings.oApi._fnCallbackReg(oDTSettings, 'aoDestroyCallback', jQuery.proxy(this._fnDestroy, this), 'ColReorder');
/* Store the instance for later use */
ColReorder.aoInstances.push( this );
return this;
@ -527,7 +529,7 @@ ColReorder.prototype = {
{
if ( a.length != this.s.dt.aoColumns.length )
{
this.s.dt.oInstance.oApi._fnLog( oDTSettings, 1, "ColReorder - array reorder does not "+
this.s.dt.oInstance.oApi._fnLog( this.s.dt, 1, "ColReorder - array reorder does not "+
"match known number of columns. Skipping." );
return;
}
@ -611,8 +613,8 @@ ColReorder.prototype = {
{
var that = this;
$(nTh).bind( 'mousedown.ColReorder', function (e) {
e.preventDefault();
that._fnMouseDown.call( that, e, nTh );
return false;
} );
},
@ -812,7 +814,7 @@ ColReorder.prototype = {
}
$('thead tr:eq(0)', this.dom.drag).each( function () {
$('th:not(:eq('+that.s.mouse.targetIndex+'))', this).remove();
$('th', this).eq(that.s.mouse.targetIndex).siblings().remove();
} );
$('tr', this.dom.drag).height( $('tr:eq(0)', that.s.dt.nTHead).height() );
@ -845,6 +847,29 @@ ColReorder.prototype = {
document.body.appendChild( this.dom.pointer );
document.body.appendChild( this.dom.drag );
},
/**
* Clean up ColReorder memory references and event handlers
* @method _fnDestroy
* @returns void
* @private
*/
"_fnDestroy": function ()
{
for ( var i=0, iLen=ColReorder.aoInstances.length ; i<iLen ; i++ )
{
if ( ColReorder.aoInstances[i] === this )
{
ColReorder.aoInstances.splice( i, 1 );
break;
}
}
$(this.s.dt.nTHead).find( '*' ).unbind( '.ColReorder' );
this.s.dt.oInstance._oPluginColReorder = null;
this.s = null;
}
};
@ -914,7 +939,7 @@ ColReorder.prototype.CLASS = "ColReorder";
* @type String
* @default As code
*/
ColReorder.VERSION = "1.0.5";
ColReorder.VERSION = "1.0.8";
ColReorder.prototype.VERSION = ColReorder.VERSION;
@ -930,7 +955,7 @@ ColReorder.prototype.VERSION = ColReorder.VERSION;
*/
if ( typeof $.fn.dataTable == "function" &&
typeof $.fn.dataTableExt.fnVersionCheck == "function" &&
$.fn.dataTableExt.fnVersionCheck('1.9.0') )
$.fn.dataTableExt.fnVersionCheck('1.9.3') )
{
$.fn.dataTableExt.aoFeatures.push( {
"fnInit": function( oDTSettings ) {
@ -938,7 +963,7 @@ if ( typeof $.fn.dataTable == "function" &&
if ( typeof oTable._oPluginColReorder == 'undefined' ) {
var opts = typeof oDTSettings.oInit.oColReorder != 'undefined' ?
oDTSettings.oInit.oColReorder : {};
oTable._oPluginColReorder = new ColReorder( oDTSettings.oInstance, opts );
oTable._oPluginColReorder = new ColReorder( oDTSettings, opts );
} else {
oTable.oApi._fnLog( oDTSettings, 1, "ColReorder attempted to initialise twice. Ignoring second" );
}
@ -951,7 +976,7 @@ if ( typeof $.fn.dataTable == "function" &&
}
else
{
alert( "Warning: ColReorder requires DataTables 1.9.0 or greater - www.datatables.net/download");
alert( "Warning: ColReorder requires DataTables 1.9.3 or greater - www.datatables.net/download");
}
})(jQuery, window, document);

View File

@ -2,6 +2,9 @@
#
# Auto install script for airtime on Ubuntu
#
# NGINX changes are contributed by Eugene MechanisM
# Link to the post:
# http://forum.sourcefabric.org/discussion/13563/first-step-to-run-airtime-via-nginx-based-on-airtime-2.0-beta-files
exec > >(tee install_log.txt)
exec 2>&1
@ -11,6 +14,8 @@ if [ "$(id -u)" != "0" ]; then
exit 1
fi
server="$1"
#Current dir
# Absolute path to this script, e.g. /home/user/bin/foo.sh
SCRIPT=`readlink -f $0`
@ -60,7 +65,6 @@ pwgen libfaad2
#of Debian, where these packages are unauthorized)
apt-get -y --force-yes install libmp3lame-dev lame icecast2
#Debian Squeeze only has zendframework package. Newer versions of Ubuntu have zend-framework package.
#Ubuntu Lucid has both zendframework and zend-framework. Difference appears to be that zendframework is for
#1.10 and zend-framework is 1.11
@ -70,32 +74,59 @@ else
apt-get -y --force-yes install libzend-framework-php
fi
#get the "timeout" unix command
if [ "$code" = "lucid" ]; then
apt-get -y --force-yes install timeout
else
apt-get -y --force-yes install coreutils
fi
#Install Sourcefabric's custom Liquidsoap debian package
apt-get -y --force-yes install sourcefabric-keyring
apt-get -y --force-yes install liquidsoap
apt-get -y --force-yes install silan
if [ "$server" = "nginx" ]; then
# NGINX Config File
echo "----------------------------------------------------"
echo "2.1 NGINX Config File"
echo "----------------------------------------------------"
if [ ! -f /etc/nginx/sites-available/airtime ]; then
cp $SCRIPTPATH/../nginx/airtime-vhost /etc/nginx/sites-available/airtime
ln -s /etc/nginx/sites-available/airtime /etc/nginx/sites-enabled/airtime
service nginx reload
else
echo "NGINX config for Airtime already exists..."
fi
# Apache Config File
echo "----------------------------------------------------"
echo "2. Apache Config File"
echo "----------------------------------------------------"
if [ ! -f /etc/apache2/sites-available/airtime ]; then
cp $SCRIPTPATH/../apache/airtime-vhost /etc/apache2/sites-available/airtime
a2dissite default
a2ensite airtime
a2enmod rewrite php5
service apache2 restart
# php-fpm Airtime pool file
echo "----------------------------------------------------"
echo "2.2 Airtime php pool file"
echo "----------------------------------------------------"
if [ ! -f /etc/php5/fpm/pool.d/airtime.conf ]; then
cp $SCRIPTPATH/../php5-fpm/airtime.conf /etc/php5/fpm/pool.d/airtime.conf
service php5-fpm reload
else
echo "Airtime php pool file already exists..."
fi
else
echo "Apache config for Airtime already exists..."
# Apache Config File
echo "----------------------------------------------------"
echo "2. Apache Config File"
echo "----------------------------------------------------"
if [ ! -f /etc/apache2/sites-available/airtime ]; then
cp $SCRIPTPATH/../apache/airtime-vhost /etc/apache2/sites-available/airtime
a2dissite default
a2ensite airtime
a2enmod rewrite php5
service apache2 restart
else
echo "Apache config for Airtime already exists..."
fi
fi
# Enable Icecast
echo "----------------------------------------------------"
echo "3. Enable Icecast"

View File

@ -1,130 +1,10 @@
#!/bin/bash -e
#
# Auto install script for airtime on Ubuntu
#
# NGINX changes are contributed by Eugene MechanisM
# Link to the post:
# http://forum.sourcefabric.org/discussion/13563/first-step-to-run-airtime-via-nginx-based-on-airtime-2.0-beta-files
#!/bin/bash
# Auto install script for airtime + nginx
exec > >(tee install_log.txt)
exec 2>&1
if [ "$(id -u)" != "0" ]; then
echo "Please run as root user."
exit 1
fi
#Current dir
# Absolute path to this script, e.g. /home/user/bin/foo.sh
SCRIPT=`readlink -f $0`
# Absolute path this script is in, thus /home/user/bin
SCRIPTPATH=`dirname $SCRIPT`
#Prerequisite
echo "----------------------------------------------------"
echo " 1. Install Packages"
echo "----------------------------------------------------"
dist=`lsb_release -is`
code=`lsb_release -cs`
#enable squeeze backports to get lame packages
if [ "$dist" = "Debian" -a "$code" = "squeeze" ]; then
grep "deb http://backports.debian.org/debian-backports squeeze-backports main" /etc/apt/sources.list
if [ "$?" -ne "0" ]; then
echo "deb http://backports.debian.org/debian-backports squeeze-backports main" >> /etc/apt/sources.list
fi
fi
apt-get update
# Updated package list
apt-get -y --force-yes install tar gzip curl nginx php5-pgsql php5-fpm \
php-pear php5-gd postgresql odbc-postgresql python libsoundtouch-ocaml \
libtaglib-ocaml libao-ocaml libmad-ocaml ecasound \
libesd0 libportaudio2 libsamplerate0 rabbitmq-server patch \
php5-curl mpg123 monit python-virtualenv multitail libcamomile-ocaml-data \
libpulse0 vorbis-tools lsb-release lsof sudo mp3gain vorbisgain flac vorbis-tools \
pwgen libfaad2
#install packages with --force-yes option (this is useful in the case
#of Debian, where these packages are unauthorized)
apt-get -y --force-yes install libmp3lame-dev lame icecast2
#Debian Squeeze only has zendframework package. Newer versions of Ubuntu have zend-framework package.
#Ubuntu Lucid has both zendframework and zend-framework. Difference appears to be that zendframework is for
#1.10 and zend-framework is 1.11
if [ "$dist" = "Debian" ]; then
apt-get -y install --force-yes zendframework
else
apt-get -y install --force-yes libzend-framework-php
fi
if [ "$code" = "lucid" ]; then
apt-get -y install --force-yes timeout
else
apt-get -y install --force-yes coreutils
fi
# NGINX Config File
echo "----------------------------------------------------"
echo "2.1 NGINX Config File"
echo "----------------------------------------------------"
if [ ! -f /etc/nginx/sites-available/airtime ]; then
cp $SCRIPTPATH/../nginx/airtime-vhost /etc/nginx/sites-available/airtime
ln -s /etc/nginx/sites-available/airtime /etc/nginx/sites-enabled/airtime
service nginx reload
else
echo "NGINX config for Airtime already exists..."
fi
#Install Sourcefabric's custom Liquidsoap debian package
apt-get -y --force-yes install sourcefabric-keyring
apt-get -y --force-yes install liquidsoap
# php-fpm Airtime pool file
echo "----------------------------------------------------"
echo "2.2 Airtime php pool file"
echo "----------------------------------------------------"
if [ ! -f /etc/php5/fpm/pool.d/airtime.conf ]; then
cp $SCRIPTPATH/../php5-fpm/airtime.conf /etc/php5/fpm/pool.d/airtime.conf
service php5-fpm reload
else
echo "Airtime php pool file already exists..."
fi
# Enable Icecast
echo "----------------------------------------------------"
echo "3. Enable Icecast"
echo "----------------------------------------------------"
cd /etc/default/
sed -i 's/ENABLE=false/ENABLE=true/g' icecast2
set +e
service icecast2 start
set -e
echo ""
# Enable Monit
echo "----------------------------------------------------"
echo "4. Enable Monit"
echo "----------------------------------------------------"
cd /etc/default/
sed -i 's/startup=0/startup=1/g' monit
set +e
grep -q "include /etc/monit/conf.d" /etc/monit/monitrc
RETVAL=$?
set -e
if [ $RETVAL -ne 0 ] ; then
mkdir -p /etc/monit/conf.d
echo "include /etc/monit/conf.d/*" >> /etc/monit/monitrc
fi
# Run Airtime Install
echo "----------------------------------------------------"
echo "5. Run Airtime Install"
echo "----------------------------------------------------"
cd $SCRIPTPATH/../../install_minimal
./airtime-install
$SCRIPTPATH/airtime-full-install nginx

View File

@ -115,7 +115,7 @@ get_bootstrap_info = 'get-bootstrap-info/format/json/api_key/%%api_key%%'
get_files_without_replay_gain = 'get-files-without-replay-gain/api_key/%%api_key%%/dir_id/%%dir_id%%'
update_replay_gain_value = 'update-replay-gain-value/api_key/%%api_key%%'
update_replay_gain_value = 'update-replay-gain-value/format/json/api_key/%%api_key%%'
notify_webstream_data = 'notify-webstream-data/api_key/%%api_key%%/media_id/%%media_id%%/format/json'

View File

@ -58,7 +58,9 @@ class ReplayGainUpdater(Thread):
try:
self.api_client.update_replay_gain_values(processed_data)
except Exception as e: self.unexpected_exception(e)
except Exception as e:
self.logger.error(e)
self.logger.debug(traceback.format_exc())
if len(files) == 0: break
self.logger.info("Processed: %d songs" % total)