From d0521b114b1e8b06ad1c9ebb79c1c713b4c94f51 Mon Sep 17 00:00:00 2001 From: achbed Date: Wed, 3 Dec 2014 09:16:09 -0600 Subject: [PATCH] Split try block for exporting the different feed types (so failure on one doesn't block the other) Converted the Producer to put a static True value on the queue instead (prevent possible overflow) Add jingles:frequency option Now resets counter to prevent eventual overflow Add saving of status file to record current position Add reading of status file on station init to restart where it left off Reset the counter when incremented to prevent overflows When a new playlist is detected (ie, songs added/removed) playback attempts to keep going instead of restarting --- deefuzzer/core.py | 34 ++++++++++++++++------------ deefuzzer/station.py | 54 ++++++++++++++++++++++++++++++++++++-------- 2 files changed, 64 insertions(+), 24 deletions(-) diff --git a/deefuzzer/core.py b/deefuzzer/core.py index f34cecc..9c7c37d 100644 --- a/deefuzzer/core.py +++ b/deefuzzer/core.py @@ -41,6 +41,7 @@ import shout import Queue import datetime import mimetypes +import hashlib from threading import Thread from deefuzzer.station import * from deefuzzer.tools import * @@ -70,9 +71,9 @@ class DeeFuzzer(Thread): # Get the log setting first (if possible) log_file = str(self.conf['deefuzzer'].pop('log', '')) - log_dir = os.sep.join(log_file.split(os.sep)[:-1]) - if not os.path.exists(log_dir) and log_dir: - os.makedirs(log_dir) + self.log_dir = os.sep.join(log_file.split(os.sep)[:-1]) + if not os.path.exists(self.log_dir) and self.log_dir: + os.makedirs(self.log_dir) self.logger = QueueLogger(log_file, self.logqueue) self.logger.start() @@ -256,26 +257,28 @@ class DeeFuzzer(Thread): self._info('Loading new stations') for i in range(0, ns_new): try: - station = self.station_settings[i] - if 'station_name' in station.keys(): + if 'station_name' in self.station_settings[i].keys(): continue # Apply station defaults if they exist if 'stationdefaults' in self.conf['deefuzzer']: if isinstance(self.conf['deefuzzer']['stationdefaults'], dict): - station = merge_defaults(station, self.conf['deefuzzer']['stationdefaults']) + self.station_settings[i] = merge_defaults(self.station_settings[i], self.conf['deefuzzer']['stationdefaults']) name = 'Station ' + str(i) - if 'info' in station.keys(): - if 'short_name' in station['infos']: - name = station['infos']['short_name'] + if 'info' in self.station_settings[i].keys(): + if 'short_name' in self.station_settings[i]['infos']: + name = self.station_settings[i]['infos']['short_name'] y = 1 while name in self.station_instances.keys(): y = y + 1 - name = station['infos']['short_name'] + " " + str(y) + name = self.station_settings[i]['infos']['short_name'] + " " + str(y) self.station_settings[i]['station_name'] = name - new_station = Station(station, q, self.logqueue, self.m3u) + namehash = hashlib.md5(name).hexdigest() + self.station_settings[i]['station_statusfile'] = os.sep.join([self.log_dir, namehash]) + + new_station = Station(self.station_settings[i], q, self.logqueue, self.m3u) if new_station.valid: self.station_instances[name] = new_station self.station_instances[name].start() @@ -311,8 +314,9 @@ class Producer(Thread): self.q = q def run(self): - i=0 - q = self.q while True: - q.put(i,1) - i+=1 + try: + self.q.put(True, True) + except: + pass + diff --git a/deefuzzer/station.py b/deefuzzer/station.py index e9ac3e1..1432b37 100644 --- a/deefuzzer/station.py +++ b/deefuzzer/station.py @@ -58,7 +58,7 @@ from tools import * class Station(Thread): """a DeeFuzzer shouting station thread""" - id = 999999 + id = 0 valid = False counter = 0 delay = 0 @@ -83,6 +83,9 @@ class Station(Thread): feeds_showfilename = 0 short_name = '' channelIsOpen = False + starting_id = -1 + jingles_frequency = 2 + statusfile = '' def __init__(self, station, q, logqueue, m3u): Thread.__init__(self) @@ -91,6 +94,16 @@ class Station(Thread): self.logqueue = logqueue self.m3u = m3u + if 'station_statusfile' in station: + self.statusfile = station['station_statusfile'] + try: + if os.path.exists(self.statusfile): + f = open(self.statusfile,'r') + self.starting_id = int(f.read()) + f.close() + except: + pass + if 'station_dir' in self.station: self.station_dir = self.station['station_dir'] @@ -219,9 +232,14 @@ class Station(Thread): # Jingling between each media. if 'jingles' in self.station: - self.jingles_mode = int(self.station['jingles']['mode']) - self.jingles_shuffle = int(self.station['jingles']['shuffle']) - self.jingles_dir = self.station['jingles']['dir'] + if 'mode' in self.station['jingles']: + self.jingles_mode = int(self.station['jingles']['mode']) + if 'shuffle' in self.station['jingles']: + self.jingles_shuffle = int(self.station['jingles']['shuffle']) + if 'frequency' in self.station['jingles']: + self.jingles_frequency = int(self.station['jingles']['frequency']) + if 'dir' in self.station['jingles']: + self.jingles_dir = self.station['jingles']['dir'] if self.jingles_mode == 1: self.jingles_callback('/jingles', [1]) @@ -431,6 +449,8 @@ class Station(Thread): if not self.counter: self.id = 0 + if self.starting_id > -1: + self.id = self.starting_id self.playlist = new_playlist self.lp = lp_new @@ -444,8 +464,11 @@ class Station(Thread): self.update_feeds(self.media_to_objs(self.playlist), self.feeds_playlist_file, '(playlist)') elif lp_new != self.lp: - self.id = 0 - self.lp = lp_new + self.id += 1 + if self.id >= lp_new: + self.id = 0 + else: + self.lp = lp_new # Twitting new tracks new_playlist_set = set(new_playlist) @@ -471,15 +494,24 @@ class Station(Thread): if self.feeds_playlist: self.update_feeds(self.media_to_objs(self.playlist), self.feeds_playlist_file, '(playlist)') - if self.jingles_mode and not (self.counter % 2) and self.jingles_length: + if self.jingles_mode and not (self.counter % self.jingles_frequency) and self.jingles_length: media = self.jingles_list[self.jingle_id] self.jingle_id = (self.jingle_id + 1) % self.jingles_length else: media = self.playlist[self.id] self.id = (self.id + 1) % self.lp + + self.q.get(1) + try: + f = open(self.statusfile, 'w') + f.write(str(self.id)) + f.close() + except: + pass + self.q.task_done() return media else: - mess = 'No media in media_dir !' + mess = 'No media in media_dir!' self._err(mess) self.run_mode = 0 @@ -592,7 +624,10 @@ class Station(Thread): f = open(rss_file + '.xml', 'w') rss.write_xml(f, 'utf-8') f.close() + except: + pass + try: if self.feeds_json: f = open(rss_file + '.json', 'w') f.write(json.dumps(json_data, separators=(',',':'))) @@ -714,6 +749,7 @@ class Station(Thread): self.next_media = 0 self.media = self.get_next_media() self.counter += 1 + self.counter = (self.counter % self.jingles_frequency) + self.jingles_frequency if self.relay_mode: self.set_relay_mode() elif os.path.exists(self.media) and not os.sep+'.' in self.media: @@ -729,7 +765,7 @@ class Station(Thread): def icecastloop_metadata(self): try: - if (not (self.jingles_mode and (self.counter % 2)) or \ + if (not (self.jingles_mode and (self.counter % self.jingles_frequency)) or \ self.relay_mode) and self.twitter_mode: self.update_twitter_current() self.channel.set_metadata({'song': self.song, 'charset': 'utf-8'}) -- 2.39.5