<raspberry pi > 用树莓派来听落网电台
树莓派放在抽屉里吃灰有半年多了,去年玩了1个月后就没怎么开整了,上个月没工作,刚好有点闲暇,就把树莓派翻出来折腾,刚好碰到落网改版了,想起以前在树莓派论坛看到有网友拿树莓派来听豆瓣电台,代码那时我都下过,而且用树莓派试过,我喜欢上落网听歌,于是就想写一个 类似的python脚本....
首先 发现落网改版后 那些 mp3的信息就存在试听的html页面上的一个叫volPlaylist的js对象,比以前去相应的xml里找简单多了。
正则拿到这个 json就可以播放了,不过这里没有mp3文件的播放时长,刚开始的时候不能自动播放下一曲,后来google了 一下 发现
mp3文件大小 码率 时长有对应的关系: 【码率】(kbps)=【文件大小】(字节)X8/【时间】(秒)/1000
无法获得码率但发现落网的mp3 都是 128kbps 根据header里得到的Content-Length 获得mp3大小 于是就可以获得 mp3的时长了。。。
首先是 安装 mpg123
apt-get install mpg123
下面是相应的python 代码 部分代码来自 在Pi上听豆瓣电台之Python(有更新)
#!/usr/bin/python
# coding: utf-8
# Filename: luoFm.py import httplib
import json
import re
import sys
import subprocess
import urllib2
import time
from select import select reload(sys)
sys.setdefaultencoding('utf-8') class LuoFM_CLI:
def __init__(self, channel):
self.user = None
self.username = ''
self.ch = channel
self.kbps = 128 def get_songlist(self):
httpConnection = httplib.HTTPConnection('www.luoo.net')
httpConnection.request('GET', '/music/' + self.ch)
luoHtml = httpConnection.getresponse().read()
playPattern = "volPlaylist\s*=\s*(\[\s*\{[\s\S]+?\}\s*\]);"
playUrl = re.compile(playPattern).findall(luoHtml)
self.songlist = json.loads(playUrl[0]) def control(self, r):
rlist, _, _ = select([sys.stdin], [], [], 1)
if rlist:
s = sys.stdin.readline()
if s[0] == 'n':
return 'next'
elif s[0] == 'p':
return 'prev' def start(self):
self.get_songlist()
n = 0
while n < len(self.songlist):
r = self.songlist[n]
song_uri = r['mp3']
self.playmode = True
request = urllib2.Request(song_uri)
response = urllib2.urlopen(request)
headers = response.info()
#获取播放时长,这里选用128kbps 的码率 时长 = mp3的大小(kb) * 8 / 128
durations = int(headers['Content-Length']) * 8 / 1000 / self.kbps
starttime = time.time()
print(u'正在播放: ' + r['title'] + u' 歌手: ' + r['artist'])
self.player = subprocess.Popen(['mpg123', '-v', song_uri], shell=False, universal_newlines=True, stdin=None,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while self.playmode:
c = self.control(r)
endtime = time.time()
usetime = endtime - starttime - durations
if c == 'next' or usetime > 2:
self.player.kill()
n = n + 1
break
elif c == 'prev':
self.player.kill()
n = n - 1
break self.start c = raw_input('请输入您想听的专辑数字:')
luoFm = LuoFM_CLI(c)
use_info = u'''
下一曲输入n
上一曲输入p
'''
print(use_info)
while 1:
luoFm.start()
界面 专辑号要手动输入
参考文章
<raspberry pi > 用树莓派来听落网电台的更多相关文章
- Raspberry Pi(树莓派)上从零开始构建Linux系统(简称PiLFS)(一)
一. 准备工作 1. 装有Linux宿主系统的树莓派主板,可参考 Raspberry Pi(树莓派)上安装Raspbian(无路由器,无显示器) 2. 参考网址:Linux From Scratch ...
- 在(Raspberry Pi)树莓派上安装NodeJS
本文主讲如何在树莓派3B上安装node.js 环境描述1. 树莓派安装了`2016-11-25-raspbian-jessie-lite`(PS:在此版本的镜像中,默认禁用了ssh,在烧录好镜像之后, ...
- 2019 年在 Raspberry Pi 「树莓派」上运行的 10 个操作系统推荐
原文:2019 年在 Raspberry Pi 「树莓派」上运行的 10 个操作系统推荐 image Raspberry Pi** 是一款基于 ARM 的单板计算机,默认运行一款称为 Raspbian ...
- 转:Raspberry Pi(树莓派)试用小记
近期入手一树莓派卡片机,体验了一下它的强大,写篇报告,推广一下哈! 机器截图: 基础参数: CPU:700 MHz, ARM11 内存:512M(还有一种是256M的) 支持GPU加速(高清视频无压力 ...
- 【树莓派】【转载】Raspberry Pi (树莓派)折腾记
在网上看到一篇对树莓派折腾记录比较详细的文章,时间比较早,但是有些东西没变. 对于新手而言,还是有点参考价值.文章参见:http://skypegnu1.blog.51cto.com/8991766/ ...
- Raspberry Pi(树莓派)上安装Raspbian(无路由器,无显示器)
一. 准备工作 1. 树莓派主板 型号:树莓派3 B型 处理器:四核64位ARM Cortex-A53 CPU 内核架构:ARMv8 2. 一张大于8G的TF卡(本人用的是32G的,也作为PiLFS用 ...
- Raspberry Pi:树莓派开发板配置USB启动系统
准备材料 树莓派4B U盘 TF卡 树莓派基础镜像2020-08-20稳定版(这个系统是必须的并拷录在TF卡) Kali树莓派系统(这个是我想要学习的系统,大家可以准备自己的系统,拷录在U盘的) SD ...
- Raspberry Pi:树莓派安装基础系统 Raspberry Pi(树莓派系统)
准备材料 树莓派4B 树莓派系统镜像 SDFormatter (格式化工具) Win32DiskImager (镜像拷录工具) 镜像下载 Rspberry Pi (2020-08-24版本比较稳定) ...
- Raspberry pi之树莓派基础建设-2
1.ssh pi与本地文件传输 一般ssh是默认会支持sftp的,所以你可以考虑用filezila之类的ftp工具远程连接登陆 2.我考虑到要拍照,前提是你得有个摄像头,usb直接插上去 3.py ...
随机推荐
- 小菜的系统框架界面设计-XiaoCai.WinformUI代码开源
我的源码分享 曾经,看到别人漂亮的系统界面,合理的布局,可是却没有提供源码,道理很简单,就是有偿提供,实际上对于有些技巧的东西也并没有多么难,只是不懂原理,感觉到困难罢了. 而对于刚毕业的我,求知欲强 ...
- Facebook Rebound 弹性动画库 源码分析
Rebound源码分析 让动画不再僵硬:Facebook Rebound Android动画库介绍一文中介绍了rebound这个库. 对于想体验一下rebound的效果,又懒得clone和编译代码的, ...
- [置顶]
pycurl检测网站性能,pycurl.*_TIME时间问题
今天使用python+pycurl来检测网站性能,使用curl_obj.getinfo(pycurl.*_TIME)来获取各个阶段运行时间 total_time = curl_obj.getinfo( ...
- flask的httponly默认值为True
如图flask的app.py里显示app的默认配置,httponly默认值为true,所以如果开发者不修改这个配置的话,攻击者是无法通过xss攻击读取浏览器cookie这部分信息的. Cookie:s ...
- 转: IO设计模式:Reactor和Proactor对比
转: https://segmentfault.com/a/1190000002715832 平时接触的开源产品如Redis.ACE,事件模型都使用的Reactor模式:而同样做事件处理的Proact ...
- AngularJS中选择样式
代码下载:https://files.cnblogs.com/files/xiandedanteng/angularJSSelectClass.rar 要点,{{ctrl.name}}比<spa ...
- AutoCAD2004启动时出现fail to get CommcntrController的怎么办
解决AutoCAD2004启动时出现fail to get CommcntrController的问题! 2009-02-01 18:06 以前安装AutoCAD2004的时候可以用正常使用,后来又装 ...
- struts2获取ServletContext对象
CreateTime--2017年9月7日09:24:40 Author:Marydon struts2获取ServletContext对象 需要导入: import javax.servlet. ...
- 【Python】向函数传递列表
向函数传递列表 在实际使用中你会发现,向函数传递列表是比较实用的,这种列表可能包含名字.数字.可能更复杂的对象(字典) 假设向一个函数传递一堆水果,我们说出我们喜欢所有的水果 def Obj(frui ...
- mybatis性能优化之降低数据库连接
做性能优化的最重要的功能就是降低数据库的交互.非常多程序猿一般在开发的时候仅仅考虑简单的实现功能,无论业务简单复杂,仅仅要实现即可. mybatis有个重要的功能就是考虑在联合查询时技巧: <? ...