summaryrefslogtreecommitdiffstats
path: root/streams/streams.py
blob: 65669b2df253ec36772064dcca356479c7f43841 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#!/usr/bin/python
import os
import sys
from subprocess import Popen, PIPE

os.chdir(os.path.dirname(os.path.realpath(sys.argv[0])))
pidfile = "/tmp/krebs.stream.pid"
url_file = os.environ.get("STREAM_DB", "stream.db")
urls = []
#urls = [ url,f for (url,f) in open(url_file).readline() ]
for line in open(url_file):
    urls.append(line.split())
#print urls
mybin = sys.argv[0]
cmd = sys.argv[1] if len(sys.argv) > 1 else "you-are-made-of-stupid"
stream = sys.argv[2] if len(sys.argv) == 3 else "groove"


def check_pid(pid):
    """ Check For the existence of a unix pid. """
    try:
        os.kill(pid, 0)
    except OSError:
        return False
    else:
        return True


def urlForStream(stream):
    for url, s in urls:
        if s == stream:
            return url


def start(stream):
    ret = running()
    if ret:
        print "!! Stream `%s` already running with pid `%s` !" % \
                (ret[1], ret[0])
    else:
        pipe_silent = open('/dev/null', 'w')
        url = urlForStream(stream)
        mpl = Popen(["mplayer", url],
                 stdout=pipe_silent, stderr=pipe_silent).pid
        print >> open(pidfile, "w+"), "%d %s" % (mpl, stream)


def stop():
    ret = running()
    if not ret:
        print "!! No Stream running!"
    else:
        pid, name = ret
        print "** Killing `%s` with pid %s" % (name, pid)
        os.kill(int(pid), 15)
        #if check_pid(int(pid)):
        #    print "!! trying harder to kill process"
        #    os.kill(int(pid), 9)
        os.remove(pidfile)


def running():
    try:
        pid, currstream = open(pidfile).read().split()
        if check_pid(int(pid)):
            return (pid, currstream)
        else:
            print "!! removing stale pidfile"
            os.remove(pidfile)
            raise Exception("Pidfile stale")
    except Exception as e:
        return ()


def slist():
    for url, name in urls:
        print "%s : %s" % (name, url)


def shorthelp():
    print "start|stop|restart|status|list [audio stream]"


def longhelp():
    print "Usage: %s" % mybin,
    shorthelp
    print """ get all available streams with '/%(fil)s list'
    Examples:
    %(fil)s list
    %(fil)s start groove
    %(fil)s switch deepmix
    %(fil)s status
    %(fil)s stop""" % {'fil': mybin}

if cmd == "start":
    start(stream)
elif cmd == "stop":
    stop()
elif cmd == "switch" or cmd == "restart":
    stop()
    start(stream)
elif cmd == "status":
    ret = running()
    if not ret:
        print "** no stream running"  # , e
    else:
        print "%s is running(%s)" % (ret[1], urlForStream(ret[1]))
elif cmd == "list":
    slist()
elif cmd == "--help":
    longhelp()
elif cmd == "-h":
    shorthelp()
else:
    print "unknown command `%s`" % cmd
    print "try `%s` --help" % os.path.basename(mybin)