树莓派放在抽屉里吃灰有半年多了,去年玩了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()

界面 专辑号要手动输入

参考文章

在Pi上听豆瓣电台之Python(有更新)

比特率

<raspberry pi > 用树莓派来听落网电台的更多相关文章

  1. Raspberry Pi(树莓派)上从零开始构建Linux系统(简称PiLFS)(一)

    一. 准备工作 1. 装有Linux宿主系统的树莓派主板,可参考 Raspberry Pi(树莓派)上安装Raspbian(无路由器,无显示器) 2. 参考网址:Linux From Scratch ...

  2. 在(Raspberry Pi)树莓派上安装NodeJS

    本文主讲如何在树莓派3B上安装node.js 环境描述1. 树莓派安装了`2016-11-25-raspbian-jessie-lite`(PS:在此版本的镜像中,默认禁用了ssh,在烧录好镜像之后, ...

  3. 2019 年在 Raspberry Pi 「树莓派」上运行的 10 个操作系统推荐

    原文:2019 年在 Raspberry Pi 「树莓派」上运行的 10 个操作系统推荐 image Raspberry Pi** 是一款基于 ARM 的单板计算机,默认运行一款称为 Raspbian ...

  4. 转:Raspberry Pi(树莓派)试用小记

    近期入手一树莓派卡片机,体验了一下它的强大,写篇报告,推广一下哈! 机器截图: 基础参数: CPU:700 MHz, ARM11 内存:512M(还有一种是256M的) 支持GPU加速(高清视频无压力 ...

  5. 【树莓派】【转载】Raspberry Pi (树莓派)折腾记

    在网上看到一篇对树莓派折腾记录比较详细的文章,时间比较早,但是有些东西没变. 对于新手而言,还是有点参考价值.文章参见:http://skypegnu1.blog.51cto.com/8991766/ ...

  6. Raspberry Pi(树莓派)上安装Raspbian(无路由器,无显示器)

    一. 准备工作 1. 树莓派主板 型号:树莓派3 B型 处理器:四核64位ARM Cortex-A53 CPU 内核架构:ARMv8 2. 一张大于8G的TF卡(本人用的是32G的,也作为PiLFS用 ...

  7. Raspberry Pi:树莓派开发板配置USB启动系统

    准备材料 树莓派4B U盘 TF卡 树莓派基础镜像2020-08-20稳定版(这个系统是必须的并拷录在TF卡) Kali树莓派系统(这个是我想要学习的系统,大家可以准备自己的系统,拷录在U盘的) SD ...

  8. Raspberry Pi:树莓派安装基础系统 Raspberry Pi(树莓派系统)

    准备材料 树莓派4B 树莓派系统镜像 SDFormatter (格式化工具) Win32DiskImager (镜像拷录工具) 镜像下载 Rspberry Pi (2020-08-24版本比较稳定) ...

  9. Raspberry pi之树莓派基础建设-2

    1.ssh pi与本地文件传输   一般ssh是默认会支持sftp的,所以你可以考虑用filezila之类的ftp工具远程连接登陆 2.我考虑到要拍照,前提是你得有个摄像头,usb直接插上去 3.py ...

随机推荐

  1. 小菜的系统框架界面设计-XiaoCai.WinformUI代码开源

    我的源码分享 曾经,看到别人漂亮的系统界面,合理的布局,可是却没有提供源码,道理很简单,就是有偿提供,实际上对于有些技巧的东西也并没有多么难,只是不懂原理,感觉到困难罢了. 而对于刚毕业的我,求知欲强 ...

  2. Facebook Rebound 弹性动画库 源码分析

    Rebound源码分析 让动画不再僵硬:Facebook Rebound Android动画库介绍一文中介绍了rebound这个库. 对于想体验一下rebound的效果,又懒得clone和编译代码的, ...

  3. [置顶] pycurl检测网站性能,pycurl.*_TIME时间问题

    今天使用python+pycurl来检测网站性能,使用curl_obj.getinfo(pycurl.*_TIME)来获取各个阶段运行时间 total_time = curl_obj.getinfo( ...

  4. flask的httponly默认值为True

    如图flask的app.py里显示app的默认配置,httponly默认值为true,所以如果开发者不修改这个配置的话,攻击者是无法通过xss攻击读取浏览器cookie这部分信息的. Cookie:s ...

  5. 转: IO设计模式:Reactor和Proactor对比

    转: https://segmentfault.com/a/1190000002715832 平时接触的开源产品如Redis.ACE,事件模型都使用的Reactor模式:而同样做事件处理的Proact ...

  6. AngularJS中选择样式

    代码下载:https://files.cnblogs.com/files/xiandedanteng/angularJSSelectClass.rar 要点,{{ctrl.name}}比<spa ...

  7. AutoCAD2004启动时出现fail to get CommcntrController的怎么办

    解决AutoCAD2004启动时出现fail to get CommcntrController的问题! 2009-02-01 18:06 以前安装AutoCAD2004的时候可以用正常使用,后来又装 ...

  8. struts2获取ServletContext对象

      CreateTime--2017年9月7日09:24:40 Author:Marydon struts2获取ServletContext对象 需要导入: import javax.servlet. ...

  9. 【Python】向函数传递列表

    向函数传递列表 在实际使用中你会发现,向函数传递列表是比较实用的,这种列表可能包含名字.数字.可能更复杂的对象(字典) 假设向一个函数传递一堆水果,我们说出我们喜欢所有的水果 def Obj(frui ...

  10. mybatis性能优化之降低数据库连接

    做性能优化的最重要的功能就是降低数据库的交互.非常多程序猿一般在开发的时候仅仅考虑简单的实现功能,无论业务简单复杂,仅仅要实现即可. mybatis有个重要的功能就是考虑在联合查询时技巧: <? ...