From d3833f9a321bff6ca35263b7b1a632d90a195c14 Mon Sep 17 00:00:00 2001
From: james <james@james-P35-DS3L.(none)>
Date: Mon, 10 Oct 2011 20:14:27 -0400
Subject: [PATCH] CC-2745: Show status of liquidsoap/icecast connection on
 Stream Settings page

- initial commit
---
 .../application/controllers/ApiController.php | 18 ++++++
 .../application/models/StreamSetting.php      | 32 +++++++++-
 python_apps/api_clients/api_client.cfg        |  6 ++
 python_apps/api_clients/api_client.py         | 35 +++++++++-
 .../pypo/liquidsoap_scripts/ls_lib.liq        | 16 ++++-
 .../pypo/liquidsoap_scripts/ls_script.liq     |  7 +-
 python_apps/pypo/pypo-notify.py               | 64 ++++++++++++++-----
 7 files changed, 156 insertions(+), 22 deletions(-)

diff --git a/airtime_mvc/application/controllers/ApiController.php b/airtime_mvc/application/controllers/ApiController.php
index 60cd776a8..07559124b 100644
--- a/airtime_mvc/application/controllers/ApiController.php
+++ b/airtime_mvc/application/controllers/ApiController.php
@@ -23,6 +23,8 @@ class ApiController extends Zend_Controller_Action
                 ->addActionContext('get-stream-setting', 'json')
                 ->addActionContext('status', 'json')
                 ->addActionContext('register-component', 'json')
+                ->addActionContext('update-liquidsoap-error', 'json')
+                ->addActionContext('update-liquidsoap-connection', 'json')
                 ->initContext();
     }
 
@@ -696,5 +698,21 @@ class ApiController extends Zend_Controller_Action
 
         Application_Model_ServiceRegister::Register($component, $remoteAddr);
     }
+    
+    public function updateLiquidsoapErrorAction(){
+        $request = $this->getRequest();
+        
+        $error_msg = $request->getParam('error_msg');
+        $stream_id = $request->getParam('stream_id');
+        Application_Model_StreamSetting::setLiquidsoapError($stream_id, $error_msg);
+    }
+    
+    public function updateLiquidsoapConnectionAction(){
+        $request = $this->getRequest();
+        
+        $stream_id = $request->getParam('stream_id');
+        // setting error_msg as "" when there is no error_msg
+        Application_Model_StreamSetting::setLiquidsoapError($stream_id, "");
+    }
 }
 
diff --git a/airtime_mvc/application/models/StreamSetting.php b/airtime_mvc/application/models/StreamSetting.php
index eea87ba0a..1febaf042 100644
--- a/airtime_mvc/application/models/StreamSetting.php
+++ b/airtime_mvc/application/models/StreamSetting.php
@@ -43,7 +43,8 @@ class Application_Model_StreamSetting {
     public static function getStreamSetting(){
         global $CC_DBC;
         $sql = "SELECT *"
-                ." FROM cc_stream_setting";
+                ." FROM cc_stream_setting"
+                ." WHERE keyname not like '%_error'";
 
         $rows = $CC_DBC->getAll($sql);
         return $rows;
@@ -74,4 +75,33 @@ class Application_Model_StreamSetting {
             }
         }
     }
+    
+    public static function setLiquidsoapError($stream_id, $msg){
+        global $CC_DBC;
+        
+        $keyname = "s".$stream_id."_liquidsoap_error";
+        $sql = "SELECT COUNT(*) FROM cc_stream_setting"
+            ." WHERE keyname = '$keyname'";
+        $result = $CC_DBC->GetOne($sql);
+        
+        if ($result == 1){
+            $sql = "UPDATE cc_stream_setting"
+                ." SET value = '$value'"
+                ." WHERE keyname = '$keyname'";
+        }else{
+            $sql = "INSERT INTO cc_stream_setting (keyname, value, type)"
+                ." VALUES ($keyname, '$msg', 'string')";
+        }
+    }
+    
+    public static function getLiquidsoapError($stream_id){
+        global $CC_DBC;
+        
+        $keyname = "s".$stream_id."_liquidsoap_error";
+        $sql = "SELECT value FROM cc_stream_setting"
+            ." WHERE keyname = '$key'";
+        $result = $CC_DBC->GetOne($sql);
+        
+        return $result;
+    }
 }
diff --git a/python_apps/api_clients/api_client.cfg b/python_apps/api_clients/api_client.cfg
index bf04dcc26..3457db2e3 100644
--- a/python_apps/api_clients/api_client.cfg
+++ b/python_apps/api_clients/api_client.cfg
@@ -92,6 +92,12 @@ generate_range_url = 'generate_range_dp.php'
 # URL to tell Airtime we want to get stream setting
 get_stream_setting = 'get-stream-setting/format/json/api_key/%%api_key%%/'
 
+#URL to update liquidsoap error msg
+update_liquidsoap_error = 'update-liquidsoap-error/format/json/api_key/%%api_key%%/error_msg/%%error_msg%%/stream_id/%%stream_id%%'
+
+#URL to update liquidsoap connection
+update_liquidsoap_connection = 'update-liquidsoap-connection/format/json/api_key/%%api_key%%/stream_id/%%stream_id%%'
+
 ##############
 # OBP config #
 ##############
diff --git a/python_apps/api_clients/api_client.py b/python_apps/api_clients/api_client.py
index 8509a7c9f..5fb9aa7b4 100755
--- a/python_apps/api_clients/api_client.py
+++ b/python_apps/api_clients/api_client.py
@@ -140,6 +140,12 @@ class ApiClientInterface:
     def register_component(self):
         pass
 
+    def notify_liquidsoap_error(self, error_msg, stream_id):
+        pass
+    
+    def notify_liquidsoap_connection(self, stream_id):
+        pass
+        
     # Put here whatever tests you want to run to make sure your API is working
     def test(self):
         pass
@@ -564,7 +570,34 @@ class AirTimeApiClient(ApiClientInterface):
             response = urllib2.urlopen(req).read()
         except Exception, e:
             logger.error("Exception: %s", e)
-
+    
+    def notify_liquidsoap_error(self, error_msg, stream_id):
+        logger = logging.getLogger()
+        try:
+            url = "http://%s:%s/%s/%s" % (self.config["base_url"], str(self.config["base_port"]), self.config["api_base"], self.config["update_liquidsoap_error"])
+            
+            url = url.replace("%%api_key%%", self.config["api_key"])
+            url = url.replace("%%error_msg%%", error_msg)
+            url = url.replace("%%stream_id%%", stream_id)
+            logger.debug(url)
+            req = urllib2.Request(url)
+            response = urllib2.urlopen(req).read()
+        except Exception, e:
+            logger.error("Exception: %s", e)
+        
+    def notify_liquidsoap_connection(self, stream_id):
+        logger = logging.getLogger()
+        try:
+            url = "http://%s:%s/%s/%s" % (self.config["base_url"], str(self.config["base_port"]), self.config["api_base"], self.config["update_liquidsoap_connection"])
+            
+            url = url.replace("%%api_key%%", self.config["api_key"])
+            url = url.replace("%%stream_id%%", stream_id)
+            logger.debug(url)
+            req = urllib2.Request(url)
+            response = urllib2.urlopen(req).read()
+        except Exception, e:
+            logger.error("Exception: %s", e)
+        
 ################################################################################
 # OpenBroadcast API Client
 ################################################################################
diff --git a/python_apps/pypo/liquidsoap_scripts/ls_lib.liq b/python_apps/pypo/liquidsoap_scripts/ls_lib.liq
index c59a211f0..f10c9c207 100644
--- a/python_apps/pypo/liquidsoap_scripts/ls_lib.liq
+++ b/python_apps/pypo/liquidsoap_scripts/ls_lib.liq
@@ -37,7 +37,17 @@ def to_live(old,new) =
 end
 
 
-def output_to(output_type, type, bitrate, host, port, pass, mount_point, url, description, genre, user, s) =
+def output_to(output_type, type, bitrate, host, port, pass, mount_point, url, description, genre, user, s, stream) =
+    def on_error(msg)
+        system("airtime-check-system > ~/temp/temp1.log 2>&1")
+        system("/usr/lib/airtime/pypo/bin/liquidsoap_scripts/notify.sh --error='#{msg}' --stream-id=#{stream} > ~/temp/temp.log 2>&1")
+        log("/usr/lib/airtime/pypo/bin/liquidsoap_scripts/notify.sh --error='#{msg}' --stream-id=#{stream}")
+        5.
+    end
+    def on_connect()
+        system("/usr/lib/airtime/pypo/bin/liquidsoap_scripts/notify.sh --connect --stream-id=#{stream}")
+        log("/usr/lib/airtime/pypo/bin/liquidsoap_scripts/notify.sh --connect --stream-id=#{stream}")
+    end
     if output_type == "icecast" then
         user_ref = ref user
         if user == "" then
@@ -52,7 +62,9 @@ def output_to(output_type, type, bitrate, host, port, pass, mount_point, url, de
                     url = url,
                     description = description,
                     genre = genre,
-                    user = !user_ref)
+                    user = !user_ref,
+                    on_error = on_error,
+                    on_connect = on_connect)
         if type == "mp3" then
             if bitrate == 24 then 
                 ignore(output(%mp3(bitrate = 24),s))
diff --git a/python_apps/pypo/liquidsoap_scripts/ls_script.liq b/python_apps/pypo/liquidsoap_scripts/ls_script.liq
index 1ea328c86..80b4dca26 100644
--- a/python_apps/pypo/liquidsoap_scripts/ls_script.liq
+++ b/python_apps/pypo/liquidsoap_scripts/ls_script.liq
@@ -56,17 +56,18 @@ end
 
 if s1_output != "disabled" then
     #output_to(output_type, type, bitrate, host, port, pass, mount_point, url, description, genre, s)
-    output_to(s1_output, s1_type, s1_bitrate, s1_host, s1_port, s1_pass, s1_mount, s1_url, s1_description, s1_genre, s1_user, s)
+    output_to(s1_output, s1_type, s1_bitrate, s1_host, s1_port, s1_pass, s1_mount, s1_url, s1_description, s1_genre, s1_user, s, "1")
 end
 
 if s2_output != "disabled" then
     #output_to(output_type, type, bitrate, host, port, pass, mount_point, url, description, genre, s)
-    output_to(s2_output, s2_type, s2_bitrate, s2_host, s2_port, s2_pass, s2_mount, s2_url, s2_description, s2_genre, s2_user, s)
+    output_to(s2_output, s2_type, s2_bitrate, s2_host, s2_port, s2_pass, s2_mount, s2_url, s2_description, s2_genre, s2_user, s, "2")
+    
 end
 
 if s3_output != "disabled" then
     #output_to(output_type, type, bitrate, host, port, pass, mount_point, url, description, genre, s)
-    output_to(s3_output, s3_type, s3_bitrate, s3_host, s3_port, s3_pass, s3_mount, s3_url, s3_description, s3_genre, s3_user, s)
+    output_to(s3_output, s3_type, s3_bitrate, s3_host, s3_port, s3_pass, s3_mount, s3_url, s3_description, s3_genre, s3_user, s, "3")
 end
 
 ignore(output.dummy(blank()))
diff --git a/python_apps/pypo/pypo-notify.py b/python_apps/pypo/pypo-notify.py
index 45461f8b3..e1416a8d8 100644
--- a/python_apps/pypo/pypo-notify.py
+++ b/python_apps/pypo/pypo-notify.py
@@ -47,6 +47,9 @@ parser = OptionParser(usage=usage)
 # Options
 parser.add_option("-d", "--data", help="Pass JSON data from liquidsoap into this script.", metavar="data")
 parser.add_option("-m", "--media-id", help="ID of the file that is currently playing.", metavar="media_id")
+parser.add_option("-e", "--error", help="liquidsoap error msg.", metavar="error_msg")
+parser.add_option("-s", "--stream-id", help="ID stream", metavar="stream_id")
+parser.add_option("-c", "--connect", help="liquidsoap connected", action="store_true", metavar="connect")
 
 # parse options
 (options, args) = parser.parse_args()
@@ -76,8 +79,26 @@ class Notify:
         logger.debug('data = '+ str(data))
         response = self.api_client.notify_media_item_start_playing(data, media_id) 
         logger.debug("Response: "+json.dumps(response))
-
-
+    
+    def notify_liquidsoap_error(self, error_msg, stream_id):
+        logger = logging.getLogger()
+        
+        logger.debug('#################################################')
+        logger.debug('# Calling server to update liquidsoap error     #')
+        logger.debug('#################################################')
+        logger.debug('error msg = '+ str(error_msg))
+        response = self.api_client.notify_liquidsoap_error(error_msg, stream_id) 
+        logger.debug("Response: "+json.dumps(response))
+    
+    def notify_liquidsoap_connection(self, stream_id):
+        logger = logging.getLogger()
+        
+        logger.debug('#################################################')
+        logger.debug('# Calling server to update liquidsoap connection#')
+        logger.debug('#################################################')
+        response = self.api_client.notify_liquidsoap_connection(stream_id) 
+        logger.debug("Response: "+json.dumps(response))
+        
 if __name__ == '__main__':
     print
     print '#########################################'
@@ -87,17 +108,30 @@ if __name__ == '__main__':
     
     # initialize
     logger = logging.getLogger()
-
-    if not options.data:
-        print "NOTICE: 'data' command-line argument not given."
-        sys.exit()
     
-    if not options.media_id:
-        print "NOTICE: 'media_id' command-line argument not given."
-        sys.exit()
-    
-    try:
-        n = Notify()
-        n.notify_media_start_playing(options.data, options.media_id)
-    except Exception, e:
-        print e
+    if options.error_msg and options.stream_id:
+        try:
+            n = Notify()
+            n.notify_liquidsoap_error(options.error_msg, options.stream_id)
+        except Exception, e:
+            print e
+    elif optioins.connect and options.stream_id:
+        try:
+            n = Notify()
+            n.notify_liquidsoap_connection(options.stream_id)
+        except Exception, e:
+            print e
+    else:
+        if not options.data:
+            print "NOTICE: 'data' command-line argument not given."
+            sys.exit()
+        
+        if not options.media_id:
+            print "NOTICE: 'media_id' command-line argument not given."
+            sys.exit()
+        
+        try:
+            n = Notify()
+            n.notify_media_start_playing(options.data, options.media_id)
+        except Exception, e:
+            print e