樹莓派放在抽屜裏吃灰有半年多了,去年玩了1個月後就沒怎麼開整了,上個月沒工做,恰好有點閒暇,就把樹莓派翻出來折騰,恰好碰到落網改版了,想起之前在樹莓派論壇看到有網友拿樹莓派來聽豆瓣電臺,代碼那時我都下過,並且用樹莓派試過,我喜歡上落網聽歌,因而就想寫一個 相似的python腳本....html
首先 發現落網改版後 那些 mp3的信息就存在試聽的html頁面上的一個叫volPlaylist的js對象,比之前去相應的xml裏找簡單多了。
python
正則拿到這個 json就能夠播放了,不過這裏沒有mp3文件的播放時長,剛開始的時候不能自動播放下一曲,後來google了 一下 發現 shell
mp3文件大小 碼率 時長有對應的關係: 【碼率】(kbps)=【文件大小】(字節)X8/【時間】(秒)/1000 json
沒法得到碼率但發現落網的mp3 都是 128kbps 根據header裏獲得的Content-Length 得到mp3大小 因而就能夠得到 mp3的時長了。。。google
首先是 安裝 mpg123 url
apt-get install mpg123
下面是相應的python 代碼 部分代碼來自 在Pi上聽豆瓣電臺之Python(有更新)spa
1 #!/usr/bin/python 2 # coding: utf-8 3 # Filename: luoFm.py 4 5 import httplib 6 import json 7 import re 8 import sys 9 import subprocess 10 import urllib2 11 import time 12 from select import select 13 14 reload(sys) 15 sys.setdefaultencoding('utf-8') 16 17 18 class LuoFM_CLI: 19 def __init__(self, channel): 20 self.user = None 21 self.username = '' 22 self.ch = channel 23 self.kbps = 128 24 25 def get_songlist(self): 26 httpConnection = httplib.HTTPConnection('www.luoo.net') 27 httpConnection.request('GET', '/music/' + self.ch) 28 luoHtml = httpConnection.getresponse().read() 29 playPattern = "volPlaylist\s*=\s*(\[\s*\{[\s\S]+?\}\s*\]);" 30 playUrl = re.compile(playPattern).findall(luoHtml) 31 self.songlist = json.loads(playUrl[0]) 32 33 def control(self, r): 34 rlist, _, _ = select([sys.stdin], [], [], 1) 35 if rlist: 36 s = sys.stdin.readline() 37 if s[0] == 'n': 38 return 'next' 39 elif s[0] == 'p': 40 return 'prev' 41 42 def start(self): 43 self.get_songlist() 44 n = 0 45 while n < len(self.songlist): 46 r = self.songlist[n] 47 song_uri = r['mp3'] 48 self.playmode = True 49 request = urllib2.Request(song_uri) 50 response = urllib2.urlopen(request) 51 headers = response.info() 52 #獲取播放時長,這裏選用128kbps 的碼率 時長 = mp3的大小(kb) * 8 / 128 53 durations = int(headers['Content-Length']) * 8 / 1000 / self.kbps 54 starttime = time.time() 55 print(u'正在播放: ' + r['title'] + u' 歌手: ' + r['artist']) 56 self.player = subprocess.Popen(['mpg123', '-v', song_uri], shell=False, universal_newlines=True, stdin=None, 57 stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 58 while self.playmode: 59 c = self.control(r) 60 endtime = time.time() 61 usetime = endtime - starttime - durations 62 if c == 'next' or usetime > 2: 63 self.player.kill() 64 n = n + 1 65 break 66 elif c == 'prev': 67 self.player.kill() 68 n = n - 1 69 break 70 71 self.start 72 73 74 c = raw_input('請輸入您想聽的專輯數字:') 75 luoFm = LuoFM_CLI(c) 76 use_info = u''' 77 下一曲輸入n 78 上一曲輸入p 79 ''' 80 print(use_info) 81 while 1: 82 luoFm.start()
界面 專輯號要手動輸入 .net
參考文章 code