From 2152ae5b3a3719e4a3af9e56963d52a56e5b38cc Mon Sep 17 00:00:00 2001
From: Martin Konecny <martin@localhost.localdomain>
Date: Mon, 19 Sep 2011 12:44:43 -0400
Subject: [PATCH] CC-2830: airtime-playout not working after reboot on Debian
 squeeze

-fixed
---
 python_apps/api_clients/api_client.py | 57 +++++++++++++--------------
 1 file changed, 28 insertions(+), 29 deletions(-)

diff --git a/python_apps/api_clients/api_client.py b/python_apps/api_clients/api_client.py
index 5043c1462..fa1059174 100755
--- a/python_apps/api_clients/api_client.py
+++ b/python_apps/api_clients/api_client.py
@@ -156,6 +156,26 @@ class AirTimeApiClient(ApiClientInterface):
             logger = logging.getLogger()
             logger.error('Error loading config file: %s', e)
             sys.exit(1)
+            
+    def get_response_from_server(self, url):
+        logger = logging.getLogger()
+        successful_response = False
+        
+        while not successful_response:
+            try:
+                response = urllib.urlopen(url)
+                data = response.read()
+                successful_response = True
+            except IOError, e:
+                logger.error('Error Authenticating with remote server: %s', e)
+            except Exception, e:
+                logger.error('Couldn\'t connect to remote server. Is it running?')
+                logger.error("%s" % e)
+            if not successful_response:
+                time.sleep(5)
+            
+        return data
+        
 
     def __get_airtime_version(self, verbose = True):
         logger = logging.getLogger()
@@ -166,30 +186,13 @@ class AirTimeApiClient(ApiClientInterface):
         version = -1
         response = None
         try:
-            response = urllib.urlopen(url)
-            data = response.read()
+            data = self.get_response_from_server(url)
             logger.debug("Data: %s", data)
             response_json = json.loads(data)
             version = response_json['version']
             logger.debug("Airtime Version %s detected", version)
-        except IOError, e:
-            logger.error("Unable to detect Airtime Version - %s, Response: %s", e, data)
-            if e[1] == 401:
-                if (verbose):
-                    logger.info('#####################################')
-                    logger.info('# YOUR API KEY SEEMS TO BE INVALID:')
-                    logger.info('# ' + self.config["api_key"])
-                    logger.info('#####################################')
-
-            if e[1] == 404:
-                if (verbose):
-                    logger.info('#####################################')
-                    logger.info('# Unable to contact the Airtime-API')
-                    logger.info('# ' + url)
-                    logger.info('#####################################')
-            return -1
         except Exception, e:
-            logger.error("Unable to detect Airtime Version - %s, Response: %s", e, data)
+            logger.error("Unable to detect Airtime Version - %s", e)
             return -1
 
         return version
@@ -241,7 +244,7 @@ class AirTimeApiClient(ApiClientInterface):
         response = ""
         status = 0
         try:
-            response_json = urllib.urlopen(export_url).read()
+            response_json = self.get_response_from_server(export_url)
             response = json.loads(response_json)
             status = response['check']
         except Exception, e:
@@ -331,9 +334,10 @@ class AirTimeApiClient(ApiClientInterface):
             url = "http://%s:%s/%s/%s" % (self.config["base_url"], str(self.config["base_port"]), self.config["api_base"], self.config["show_schedule_url"])
             logger.debug(url)
             url = url.replace("%%api_key%%", self.config["api_key"])
+            
+            response = self.get_response_from_server(url)
 
-            response = urllib.urlopen(url)
-            response = json.loads(response.read())
+            response = json.loads(response)
             logger.info("shows %s", response)
 
         except Exception, e:
@@ -385,14 +389,9 @@ class AirTimeApiClient(ApiClientInterface):
             url = "http://%s:%s/%s/%s" % (self.config["base_url"], str(self.config["base_port"]), self.config["api_base"], self.config["media_setup_url"])
             url = url.replace("%%api_key%%", self.config["api_key"])
 
-            response = urllib.urlopen(url)
-            response = json.loads(response.read())
+            response = self.get_response_from_server(url)
+            response = json.loads(response)
             logger.info("Connected to Airtime Server. Json Media Storage Dir: %s", response)
-        except IOError:
-            #this should be a common exception when media-monitor daemon
-            #has started before apache on bootup and apache isn't accepting
-            #connections yet.
-            response = None
         except Exception, e:
             response = None
             logger.error("Exception: %s", e)