Python Internet Radio Manager
In their infinite wisdom, the Norwegian government decided to shut down all FM boardcasts in favor of the even more obsolete and inferior DAB broadcast system this year. In response to their futile attempts, I have instead set up a Raspberry Pi 2 to function as an Internet radio and feed the audio into my existing radio equipment.
I only listen to the radio in the morning, so to avoid using the Internet connection at all times I needed some kind of manager. The result is a Python script which keeps track of the time of day and switches whatever is played on the audio output. This also gives the possibility to easily switch channels during the weekend.
Here is the script, where everything is just configured with my preferences within the script itself:
#!/usr/bin/python import subprocess import signal import datetime import time events = ( ("SUN", 15, 0, ["su", "root", "-c", "ntpdate 192.168.0.1"]), ("MON", 7, 45, ["mpg123", "http://nrk-mms-live.telenorcdn.net:80/nrk_radio_p1_rogaland_mp3_h"]), ("MON", 8, 30, ["./portal_looping_radio.sh"]), ("TUE", 7, 45, ["mpg123", "http://nrk-mms-live.telenorcdn.net:80/nrk_radio_p1_rogaland_mp3_h"]), ("TUE", 8, 30, ["./portal_looping_radio.sh"]), ("WED", 7, 45, ["mpg123", "http://nrk-mms-live.telenorcdn.net:80/nrk_radio_p1_rogaland_mp3_h"]), ("WED", 8, 30, ["./portal_looping_radio.sh"]), ("THU", 7, 45, ["mpg123", "http://nrk-mms-live.telenorcdn.net:80/nrk_radio_p1_rogaland_mp3_h"]), ("THU", 8, 30, ["./portal_looping_radio.sh"]), ("FRI", 7, 45, ["mpg123", "http://nrk-mms-live.telenorcdn.net:80/nrk_radio_p1_rogaland_mp3_h"]), ("FRI", 8, 30, ["./portal_looping_radio.sh"]), ("SAT", 7, 45, ["mpg123", "http://nrk-mms-live.telenorcdn.net:80/nrk_radio_jazz_mp3_h"]), ("SAT", 9, 30, ["./portal_looping_radio.sh"]), ("SUN", 7, 45, ["mpg123", "http://nrk-mms-live.telenorcdn.net:80/nrk_radio_jazz_mp3_h"]), ("SUN", 9, 30, ["./portal_looping_radio.sh"]), ) default_event = ["./portal_looping_radio.sh"] p = None def alarm_handler(signum, frame): print "[RADIO] Got Alarm!" p.kill() def event_to_secs(event): if event[0] == "MON": secs = 0 elif event[0] == "TUE": secs = 86400 elif event[0] == "WED": secs = 172800 elif event[0] == "THU": secs = 259200 elif event[0] == "FRI": secs = 345600 elif event[0] == "SAT": secs = 432000 elif event[0] == "SUN": secs = 518400 secs += (event[1] * 3600) secs += (event[2] * 60) return secs def get_next_event(): now = datetime.datetime.now().timetuple() now_secs = (now.tm_wday * 86400) + (now.tm_hour * 3600) + (now.tm_min * 60) + now.tm_sec nearest_event_secs = 604801 nearest_event = None first_event_secs = 604801 first_event = None for event in events: event_secs = event_to_secs(event) if event_secs < first_event_secs: first_event_secs = event_secs first_event = event if event_secs > now_secs and event_secs < nearest_event_secs: nearest_event_secs = event_secs nearest_event = event if nearest_event == None: return (604800 + first_event_secs) - now_secs, first_event[3] else: return nearest_event_secs - now_secs, nearest_event[3] if __name__ == "__main__": print "[RADIO] Starting" signal.signal(signal.SIGALRM, alarm_handler) p = subprocess.Popen(default_event) while True: timeleft, next_event = get_next_event() print "[RADIO] Time Left:", timeleft signal.alarm(timeleft) p.wait() print "[RADIO] Event:", next_event p = subprocess.Popen(next_event) time.sleep(30) p.poll() if p.returncode != None: print "[RADIO] Error, running default." p = subprocess.Popen(default_event) time.sleep(3) p.poll() if p.returncode != None: break print "[RADIO] Exit"