]> git.parisson.com Git - deefuzzer.git/commitdiff
fix infinite loop when no connection available on first start (try pinging server...
authorGuillaume Pellerin <yomguy@parisson.com>
Tue, 5 Jul 2011 09:57:55 +0000 (09:57 +0000)
committerGuillaume Pellerin <yomguy@parisson.com>
Tue, 5 Jul 2011 09:57:55 +0000 (09:57 +0000)
better error and reconnection handling when no network,
reduce relay queue size

deefuzzer/tools/player.py
deefuzzer/tools/relay.py
deefuzzer/tools/station.py
setup.py

index 85985c7924a922f0d51f6c13bea43e344e85adbf..2699014b7cc817b09ccf0c186e43df62c5f3d07c 100644 (file)
@@ -43,7 +43,7 @@ class Player:
 
     def __init__(self):
         self.main_buffer_size = 0x100000
-        self.relay_buffer_size = 0x40000
+        self.relay_queue_size = 0x2000
         self.sub_buffer_size = 0x10000
 
     def set_media(self, media):
@@ -51,7 +51,7 @@ class Player:
 
     def start_relay(self, url):
         self.url = url
-        self.relay = Relay(self.sub_buffer_size, self.relay_buffer_size)
+        self.relay = Relay(self.sub_buffer_size, self.relay_queue_size)
         self.relay.set_url(self.url)
         self.relay.open()
         self.relay.start()
index 831989ee0c1bc9cb5ee4d658407ff1dae50ed9e8..69321a6cb31e4947b8732ebd0b70c4aa5be04c07 100644 (file)
@@ -42,11 +42,11 @@ import urllib
 
 class Relay(Thread):
 
-    def __init__(self, sub_buffer_size, main_buffer_size):
+    def __init__(self, sub_buffer_size, queue_size):
         Thread.__init__(self)
         self.sub_buffer_size = sub_buffer_size
-        self.main_buffer_size = main_buffer_size
-        self.queue = Queue.Queue(self.main_buffer_size)
+        self.queue_size = queue_size
+        self.queue = Queue.Queue(self.queue_size)
 
     def set_url(self, url):
         self.url = url
@@ -67,6 +67,7 @@ class Relay(Thread):
             if self.isopen:
                 self.chunk = self.stream.read(self.sub_buffer_size)
                 self.queue.put_nowait(self.chunk)
+#                print self.queue.qsize()
             else:
                 self.stream.close()
                 break
index 60d2dc1022d9618a5c14a1c70e9c8a547c7bd6e9..a5c844e0b5d86c197e95144ef546dd9419e9ff7e 100644 (file)
@@ -43,6 +43,7 @@ import datetime
 import string
 import random
 import shout
+import urllib
 from threading import Thread
 from __init__ import *
 
@@ -97,6 +98,11 @@ class Station(Thread):
                                     'samplerate': self.samplerate,
                                     'quality': self.ogg_quality,
                                     'channels': self.voices,}
+        self.server_url = 'http://' + self.channel.host + ':' + str(self.channel.port)
+        self.channel_url = self.server_url + self.channel.mount 
+        self.server_ping = False
+        
+        # Playlist
         self.playlist = self.get_playlist()
         self.lp = len(self.playlist)
 
@@ -132,7 +138,7 @@ class Station(Thread):
             self.relay_url = self.station['relay']['url']
             self.relay_author = self.station['relay']['author']
             if self.relay_mode == 1:
-                self.relay_callback('/relay', [1])
+                self.relay_callback('/media/relay', [1])
 
         # Twitting
         # mode = 0 means Off, mode = 1 means On
@@ -179,13 +185,13 @@ class Station(Thread):
     def run_callback(self, path, value):
         value = value[0]
         self.run_mode = value
-        message = "Received OSC message '%s' with arguments '%d'" % (path, value)
+        message = "Station " + self.channel_url + " : received OSC message '%s' with arguments '%d'" % (path, value)
         self.logger.write_info(message)
 
     def media_next_callback(self, path, value):
         value = value[0]
         self.next_media = value
-        message = "Received OSC message '%s' with arguments '%d'" % (path, value)
+        message = "Station " + self.channel_url + " : received OSC message '%s' with arguments '%d'" % (path, value)
         self.logger.write_info(message)
 
     def relay_callback(self, path, value):
@@ -198,9 +204,9 @@ class Station(Thread):
             self.player.stop_relay()
         self.id = 0
         self.next_media = 1
-        message = "Received OSC message '%s' with arguments '%d'" % (path, value)
+        message = "Station " + self.channel_url + " : received OSC message '%s' with arguments '%d'" % (path, value)
         self.logger.write_info(message)
-        message = "Relaying : %s" % self.relay_url
+        message = "Station " + self.channel_url + " : relaying : %s" % self.relay_url
         self.logger.write_info(message)
 
     def twitter_callback(self, path, value):
@@ -208,7 +214,7 @@ class Station(Thread):
         import tinyurl
         self.twitter = Twitter(self.twitter_key, self.twitter_secret)
         self.twitter_mode = value
-        message = "Received OSC message '%s' with arguments '%d'" % (path, value)
+        message = "Station " + self.channel_url + " : received OSC message '%s' with arguments '%d'" % (path, value)
         self.m3u_tinyurl = tinyurl.create_one(self.channel.url + '/m3u/' + self.m3u.split(os.sep)[-1])
         self.rss_tinyurl = tinyurl.create_one(self.channel.url + '/rss/' + self.rss_playlist_file.split(os.sep)[-1])
         self.logger.write_info(message)
@@ -220,7 +226,7 @@ class Station(Thread):
             self.jingles_length = len(self.jingles_list)
             self.jingle_id = 0
         self.jingles_mode = value
-        message = "Received OSC message '%s' with arguments '%d'" % (path, value)
+        message = "Station " + self.channel_url + " : received OSC message '%s' with arguments '%d'" % (path, value)
         self.logger.write_info(message)
 
     def record_callback(self, path, value):
@@ -246,13 +252,13 @@ class Station(Thread):
                                 'date' : date.encode('utf-8'),}
             media.write_tags()
         self.record_mode = value
-        message = "Received OSC message '%s' with arguments '%d'" % (path, value)
+        message = "Station " + self.channel_url + " : received OSC message '%s' with arguments '%d'" % (path, value)
         self.logger.write_info(message)
 
     def player_callback(self, path, value):
         value = value[0]
         self.player_mode = value
-        message = "Received OSC message '%s' with arguments '%d'" % (path, value)
+        message = "Station " + self.channel_url + " : received OSC message '%s' with arguments '%d'" % (path, value)
         self.logger.write_info(message)
 
     def get_playlist(self):
@@ -321,7 +327,7 @@ class Station(Thread):
                     playlist.insert(0, track)
                 self.playlist = playlist
                 
-                self.logger.write_info('Station ' + self.short_name + \
+                self.logger.write_info('Station ' + self.channel_url + \
                                  ' : generating new playlist (' + str(self.lp) + ' tracks)')
                 self.update_rss(self.media_to_objs(self.playlist), self.rss_playlist_file, '(playlist)')
 
@@ -465,12 +471,30 @@ class Station(Thread):
         self.channel.open()
         self.channel_delay = self.channel.delay()
     
+    def ping_server(self):
+        log = True
+        while not self.server_ping:
+            try:
+                self.q.get(1)
+                server = urllib.urlopen(self.server_url)
+                self.server_ping = True
+                self.logger.write_info('Station ' + self.channel_url + ' : channel available')
+                self.q.task_done()
+            except:
+                time.sleep(0.5)
+                if log:
+                    self.logger.write_error('Station ' + self.channel_url + ' : could not connect the channel' )
+                    log = False
+                self.q.task_done()
+                pass
+        
     def run(self):
-        try:
-            self.channel_open()
-        except:
-            pass
-            
+        self.ping_server()
+        self.q.get(1)
+        self.channel_open()
+        self.logger.write_info('Station ' + self.channel_url + ' : channel connected')
+        self.q.task_done()
+        
         while self.run_mode:
             self.q.get(1)
             self.next_media = 0
@@ -480,7 +504,7 @@ class Station(Thread):
                 self.set_relay_mode()
             elif os.path.exists(self.media) and not os.sep+'.' in self.media:
                 if self.lp == 0:
-                    self.logger.write_error('Station ' + self.short_name + ' has no media to stream !')
+                    self.logger.write_error('Station ' + self.channel_url + ' : has no media to stream !')
                     break
                 self.set_read_mode()
             self.q.task_done()
@@ -505,25 +529,33 @@ class Station(Thread):
                     if self.record_mode:
                         self.recorder.write(self.chunk)
                 except:
-                    self.logger.write_error('Station ' + self.short_name + ' : could not write the buffer to the file')
+                    self.logger.write_error('Station ' + self.channel_url + ' : could not write the buffer to the file')
                     continue
                 try:
                     self.channel.send(self.chunk)
                     self.channel.sync()
                 except:
-                    self.logger.write_error('Station ' + self.short_name + ' : could not send the buffer')
+                    self.logger.write_error('Station ' + self.channel_url + ' : could not send the buffer')
+                    self.q.task_done()
+                    self.ping_server()
                     try:
+                        self.q.get(1)
                         self.channel.close()
+                        self.logger.write_info('Station ' + self.channel_url + ' : channel closed')
+                        self.q.task_done()
+                    except:
+                        self.logger.write_error('Station ' + self.channel_url + ' : could not close the channel')
+                        self.q.task_done()
+                        continue
+                    try:
+                        self.q.get(1)
+                        self.channel_open()
+                        self.channel.set_metadata({'song': self.song, 'charset': 'utf8',})
+                        self.channel.send(self.chunk)
+                        self.channel.sync()
+                        self.logger.write_info('Station ' + self.channel_url + ' : channel restarted')
                     except:
-                        self.logger.write_error('Station ' + self.short_name + ' : could not close the channel')
-                        try:
-                            self.channel.open()
-                            self.channel.set_metadata({'song': self.song, 'charset': 'utf8',})
-                            self.channel.send(self.chunk)
-                            self.channel.sync()
-                        except:
-                            self.logger.write_error('Station ' + self.short_name + ' : could not restart the channel')
-                            continue
+                        self.logger.write_error('Station ' + self.channel_url + ' : could not restart the channel')
                         continue
                     continue
                 self.q.task_done()
index de6bc3082f20cc4e255a6ac5fb02a78a558f2c3a..6495e63a0c56826fee516b89d67b4de04d9d6007 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -6,7 +6,7 @@
 import os
 
 __author__ = 'yomguy@parisson.com'
-__version__ = '0.5.4'
+__version__ = '0.5.5'
 
 
 # The base package metadata to be used by both distutils and setuptools