diff --git a/airtime_mvc/application/controllers/ApiController.php b/airtime_mvc/application/controllers/ApiController.php
index e12162efd..97f1e8d77 100644
--- a/airtime_mvc/application/controllers/ApiController.php
+++ b/airtime_mvc/application/controllers/ApiController.php
@@ -42,6 +42,7 @@ class ApiController extends Zend_Controller_Action
->addActionContext('notify-webstream-data' , 'json')
->addActionContext('get-stream-parameters' , 'json')
->addActionContext('push-stream-stats' , 'json')
+ ->addActionContext('update-stream-setting-table' , 'json')
->initContext();
}
@@ -979,5 +980,14 @@ class ApiController extends Zend_Controller_Action
Application_Model_ListenerStat::insertDataPoints($data);
$this->view->data = $data;
}
+
+ public function updateStreamSettingTableAction() {
+ $request = $this->getRequest();
+ $data = json_decode($request->getParam("data"), true);
+
+ foreach ($data as $k=>$v) {
+ Application_Model_StreamSetting::SetListenerStatError($k, $v);
+ }
+ }
}
diff --git a/airtime_mvc/application/controllers/ListenerstatController.php b/airtime_mvc/application/controllers/ListenerstatController.php
index 648a88dfe..302bd386c 100644
--- a/airtime_mvc/application/controllers/ListenerstatController.php
+++ b/airtime_mvc/application/controllers/ListenerstatController.php
@@ -47,6 +47,15 @@ class ListenerstatController extends Zend_Controller_Action
'his_time_end' => $end->format("H:i")
));
+ $errorStatus = Application_Model_StreamSetting::GetAllListenerStatErrors();
+ Logging::info($errorStatus);
+ $out = array();
+ foreach ($errorStatus as $v) {
+ $key = explode('_listener_stat_error', $v['keyname']);
+ $out[$key[0]] = $v['value'];
+ }
+
+ $this->view->errorStatus = $out;
$this->view->date_form = $form;
}
diff --git a/airtime_mvc/application/models/StreamSetting.php b/airtime_mvc/application/models/StreamSetting.php
index 2ea1e0830..6bac3f02b 100644
--- a/airtime_mvc/application/models/StreamSetting.php
+++ b/airtime_mvc/application/models/StreamSetting.php
@@ -457,4 +457,13 @@ class Application_Model_StreamSetting
public static function setOffAirMeta($offAirMeta){
self::setValue("off_air_meta", $offAirMeta, "string");
}
+
+ public static function GetAllListenerStatErrors(){
+ $sql = "SELECT * FROM cc_stream_setting WHERE keyname like :p1";
+ return Application_Common_Database::prepareAndExecute($sql, array(':p1'=>'%_listener_stat_error'));
+ }
+
+ public static function SetListenerStatError($key, $v) {
+ self::setValue($key, $v, 'string');
+ }
}
diff --git a/airtime_mvc/application/views/scripts/listenerstat/index.phtml b/airtime_mvc/application/views/scripts/listenerstat/index.phtml
index d3cff34c7..2ccee9a8b 100644
--- a/airtime_mvc/application/views/scripts/listenerstat/index.phtml
+++ b/airtime_mvc/application/views/scripts/listenerstat/index.phtml
@@ -2,5 +2,13 @@
- date_form; ?>
+ date_form; ?>
+
+
+
\ No newline at end of file
diff --git a/airtime_mvc/build/sql/defaultdata.sql b/airtime_mvc/build/sql/defaultdata.sql
index 03c59c24a..a5d92eabd 100644
--- a/airtime_mvc/build/sql/defaultdata.sql
+++ b/airtime_mvc/build/sql/defaultdata.sql
@@ -1,9 +1,6 @@
INSERT INTO cc_subjs ("login", "type", "pass") VALUES ('admin', 'A', md5('admin'));
-- added in 2.3
INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('off_air_meta', 'Airtime - offline', 'string');
-INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s1_listener_stat_error', '', 'string');
-INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s2_listener_stat_error', '', 'string');
-INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s3_listener_stat_error', '', 'string');
-- end of added in 2.3
-- added in 2.1
diff --git a/python_apps/api_clients/api_client.cfg b/python_apps/api_clients/api_client.cfg
index 61ea22372..369f74eb8 100644
--- a/python_apps/api_clients/api_client.cfg
+++ b/python_apps/api_clients/api_client.cfg
@@ -124,3 +124,5 @@ notify_liquidsoap_started = 'rabbitmq-do-push/api_key/%%api_key%%/format/json'
get_stream_parameters = 'get-stream-parameters/api_key/%%api_key%%/format/json'
push_stream_stats = 'push-stream-stats/api_key/%%api_key%%/format/json'
+
+update_stream_setting_table = 'update-stream-setting-table/api_key/%%api_key%%/format/json'
diff --git a/python_apps/api_clients/api_client.py b/python_apps/api_clients/api_client.py
index dbd2fcbe7..c4a12b2c3 100644
--- a/python_apps/api_clients/api_client.py
+++ b/python_apps/api_clients/api_client.py
@@ -383,3 +383,7 @@ class AirtimeApiClient(object):
# TODO : users of this method should do their own error handling
response = self.services.push_stream_stats(_post_data={'data': json.dumps(data)})
return response
+
+ def update_stream_setting_table(self, data):
+ response = self.services.update_stream_setting_table(_post_data={'data': json.dumps(data)})
+ return response
\ No newline at end of file
diff --git a/python_apps/pypo/liquidsoap_scripts/ls_lib.liq b/python_apps/pypo/liquidsoap_scripts/ls_lib.liq
index 1a18fd00a..3761f91c1 100644
--- a/python_apps/pypo/liquidsoap_scripts/ls_lib.liq
+++ b/python_apps/pypo/liquidsoap_scripts/ls_lib.liq
@@ -407,7 +407,7 @@ end
# fade using both cross() and switch().
def input.http_restart(~id,~initial_url="http://dummy/url")
- source = input.http(buffer=5.,max=15.,id=id,autostart=false,initial_url)
+ source = audio_to_stereo(input.http(buffer=5.,max=15.,id=id,autostart=false,initial_url))
def stopped()
"stopped" == list.hd(server.execute("#{id}.status"))
diff --git a/python_apps/pypo/listenerstat.py b/python_apps/pypo/listenerstat.py
index 4634cb2a2..dd006b9e3 100644
--- a/python_apps/pypo/listenerstat.py
+++ b/python_apps/pypo/listenerstat.py
@@ -95,15 +95,25 @@ class ListenerStat(Thread):
#connections
for k, v in stream_parameters.items():
if v["enable"] == 'true':
- if v["output"] == "icecast":
- stats.append(self.get_icecast_stats(v))
- else:
- stats.append(self.get_shoutcast_stats(v))
+ try:
+ if v["output"] == "icecast":
+ stats.append(self.get_icecast_stats(v))
+ else:
+ stats.append(self.get_shoutcast_stats(v))
+ self.update_listener_stat_error(v["mount"], 'OK')
+ except Exception, e:
+ self.logger.error('Exception: %s', e)
+ self.update_listener_stat_error(v["mount"], str(e))
return stats
def push_stream_stats(self, stats):
self.api_client.push_stream_stats(stats)
+
+ def update_listener_stat_error(self, stream_id, error):
+ keyname = '%s_listener_stat_error' % stream_id
+ data = {keyname: error}
+ self.api_client.update_stream_setting_table(data)
def run(self):
#Wake up every 120 seconds and gather icecast statistics. Note that we
@@ -116,8 +126,11 @@ class ListenerStat(Thread):
stats = self.get_stream_stats(stream_parameters["stream_params"])
self.logger.debug(stats)
-
- self.push_stream_stats(stats)
+
+ if not stats:
+ self.logger.error("Not able to get listener stats")
+ else:
+ self.push_stream_stats(stats)
except Exception, e:
self.logger.error('Exception: %s', e)