import Queue
import datetime
import mimetypes
+import hashlib
from threading import Thread
from deefuzzer.station import *
from deefuzzer.tools import *
# 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()
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()
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
+
class Station(Thread):
"""a DeeFuzzer shouting station thread"""
- id = 999999
+ id = 0
valid = False
counter = 0
delay = 0
feeds_showfilename = 0
short_name = ''
channelIsOpen = False
+ starting_id = -1
+ jingles_frequency = 2
+ statusfile = ''
def __init__(self, station, q, logqueue, m3u):
Thread.__init__(self)
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']
# 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])
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
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)
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
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=(',',':')))
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:
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'})