di-p (4712B)
1 #!/usr/bin/python 2 # coding=utf-8 3 # 4 # Copy me if you can. 5 # by 20h 6 # 7 8 import sys 9 import json 10 import os 11 import time 12 import datetime 13 import random 14 import signal 15 from subprocess import Popen 16 import requests 17 from getopt import getopt, GetoptError 18 19 def runstream(player, stream): 20 return Popen("%s \"%s\"" % (player, stream["playlist"]), 21 shell=True) 22 23 def loadplaylistall(): 24 pluri = "http://api.audioaddict.com/v1/di/track_history.jsonp?"\ 25 "callback=_API_TrackHistory_getAll&_=%s" 26 27 utim = time.mktime(datetime.datetime.now().timetuple()) 28 fd = requests.get(pluri % (utim)) 29 playlists = str(fd.read(), "iso-8859-1") 30 fd.close() 31 playlists = playlists[playlists.index("(")+1:\ 32 playlists.rindex(");")] 33 playlist = json.loads(playlists) 34 35 def loadplaylist(ids): 36 pluri = "http://api.v2.audioaddict.com/v1/di/track_history/"\ 37 "channel/%s.jsonp?callback=_API_Track"\ 38 "History_getChannel&_=%s" 39 40 utim = time.mktime(datetime.datetime.now().timetuple()) 41 fd = requests.get(pluri % (ids, utim)) 42 playlists = fd.text 43 playlists = playlists[playlists.index("[{"):\ 44 playlists.rindex(");")] 45 playlist = json.loads(playlists) 46 47 return playlist 48 49 def usage(app): 50 app = os.path.basename(app) 51 sys.stderr.write("usage: %s [-dnluwy] [-i channel URI] [-p player]"\ 52 " [-s shuffletime]"\ 53 " key\n" % (app)) 54 sys.exit(1) 55 56 def main(args): 57 try: 58 opts, largs = getopt(args[1:], "hai:p:dlnrs:uwy") 59 except GetoptError as err: 60 print(str(err)) 61 usage(args[0]) 62 sys.exit(1) 63 64 uri = "http://listen.di.fm/public3" 65 66 player = "mpv -quiet -cache 512 -playlist" 67 debug = False 68 listen = False 69 plainlist = False 70 playlist = False 71 # 10 minutes 72 shuffletime = 600 73 doshuffle = False 74 dorandom = False 75 showuri = False 76 doplaylist = False 77 whatson = False 78 for o, a in opts: 79 if o == "-d": 80 debug = True 81 elif o == "-a": 82 doplaylist = True 83 elif o == "-h": 84 usage(args[0]) 85 elif o == "-i": 86 uri = a 87 elif o == "-l": 88 listen = True 89 elif o == "-p": 90 player = a 91 elif o == "-n": 92 plainlist = True 93 elif o == "-r": 94 dorandom = True 95 elif o == "-s": 96 doshuffle = True 97 shuffletime = int(a) 98 elif o == "-u": 99 showuri = True 100 elif o == "-y": 101 playlist = True 102 elif o == "-w": 103 whatson = True 104 else: 105 assert False, "unhandled option" 106 107 if len(largs) < 1 and listen != True and dorandom != True and \ 108 doplaylist != True and whatson != True and \ 109 playlist != True: 110 sys.stderr.write("You need to specify the to be played " 111 "stream. Please see -l for all available " 112 "streams.\n") 113 usage(args[0]) 114 115 fd = requests.get(uri) 116 streams = fd.json() 117 118 streams = sorted(streams, key = lambda k: k["key"]) 119 120 if doplaylist == True: 121 sys.stdout.write("[Playlist]\n") 122 sys.stdout.write("Version=2\n") 123 sys.stdout.write("NumOfEntries=%d\n" % (len(streams))) 124 125 i = 1 126 for stream in streams: 127 sys.stdout.write("Title%d=%s\n" % (i, 128 stream["key"])) 129 sys.stdout.write("File%d=%s\n" % (i, 130 stream["playlist"])) 131 i = i + 1 132 sys.stdout.write("\n") 133 134 return 0 135 136 if whatson == True: 137 recentdata = loadplaylistall() 138 for i in streams: 139 cplay = recentdata[str(i["id"])] 140 sys.stdout.write("%s\t%s\n" % (i["key"],\ 141 cplay["track"])) 142 143 return 0 144 145 if playlist == True: 146 def displayplaylist(playlist): 147 for song in playlist[::-1]: 148 dates = datetime.datetime.fromtimestamp( 149 int(song["started"])).\ 150 strftime("%H:%M:%S") 151 sys.stdout.write("[%s] %s\n" % (dates,\ 152 song["track"])) 153 154 for i in streams: 155 if i["key"] != largs[0]: 156 continue 157 158 cplaylist = loadplaylist(i["id"]) 159 displayplaylist(cplaylist) 160 return 0 161 162 if listen == True: 163 if plainlist == True: 164 for i in streams: 165 print(i["key"]) 166 return 0 167 168 if showuri == True: 169 for i in streams: 170 print(i["playlist"]) 171 return 0 172 173 for i in streams: 174 print("%30s %s" % (i["key"], 175 i["name"])) 176 return 0 177 178 stream = None 179 if dorandom == True: 180 stream = random.choice(streams); 181 else: 182 for i in streams: 183 if i["key"] == largs[0]: 184 stream = i 185 break 186 187 if stream == None: 188 sys.stderr.write("Could not find the given stream." \ 189 " Please use -l for all available streams.\n") 190 return 1 191 192 if showuri == True: 193 print(("%s" % (stream["playlist"]))) 194 return 0 195 196 while 1: 197 p = runstream(player, stream) 198 sts = os.waitpid(p.pid, os.P_NOWAIT)[1] 199 if sts < 0: 200 return 1 201 202 if doshuffle == False: 203 break 204 205 i = 0 206 while 1: 207 time.sleep(1); 208 i += 1 209 210 sts = os.waitpid(p.pid, os.P_NOWAIT)[1] 211 if sts < 0 or i > shuffletime: 212 if i > shuffletime: 213 os.kill(p.pid, signal.SIGTERM) 214 os.waitpid(p.pid, os.P_WAIT) 215 216 stream = random.choice(streams) 217 break 218 219 os.waitpid(p.pid, os.P_WAIT) 220 221 return 0 222 223 if __name__ == "__main__": 224 sys.exit(main(sys.argv)) 225