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

    deep&wide为啥work,如何优化特征:详述attention,attention在ctr预估中如何使用,din为啥work?详述transformer,如何应用于ctr预估;item2 ...

  2. struts2设置默认首页

    在默认情况下,我们一般希望.当我们在浏览器中输入127.0.0.1:8080/project_name时候跳到项目的首页,那么在struts中我们这么设置呢?光加上<default-action ...

  3. Mysql 性能监控及调优

    死锁概念: 两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象 1.监控死锁(innotop): (1) 启用 innodb_status_file 在/etc/my.cnf添加如 ...

  4. 出自 HTML4 规范的可用颜色字符串值列表(常用颜色名称及对应的十六进制值)

    据称由于 HTML5 没有修改专属的颜色,HTML4 的颜色都可以在 HTML5 中正确显示. 出自 HTML4 规范的可用颜色字符串值列表如下,此表来源是 http://www.lovean.com ...

  5. vue prop单向数据流

    Prop 是单向绑定的:当父组件的属性变化时,将传导给子组件,但是反过来不会.这是为了防止子组件无意间修改了父组件的状态,来避免应用的数据流变得难以理解. 另外,每次父组件更新时,子组件的所有 pro ...

  6. TCP/IP详解 卷一(第七、八章 Ping、Traceroute程序)

    Ping程序 Ping程序由Mike Muuss编写,目的是为了测试另一台主机是否可达. 该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答. ping程序还能测出到这台主机的往返时 ...

  7. (转)Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义

    1.从Spring2.0以后的版本中,Spring也引入了基于注解(Annotation)方式的配置,注解(Annotation)是JDK1.5中引入的一个新特性,用于简化Bean的配置,某些场合可以 ...

  8. Android TelephonyManager类的使用

    TelephonyManager类主要提供了一系列获取手机与通讯相关的状态和信息的get方法,包含手机用户的信息.手机SIM的状态.电信网络的状态等. TelephonyManager类的对象的获取: ...

  9. anaconda2下面安装opencv2.4.13.4完成----解决默认安装的问题----Thefunction is not implemented. Rebuild the library with Windows, GTK+ 2.x orCarbon support. If you are on Ubuntu or Debian, install libgtk2.0‑dev and pkg

    转载自:http://blog.csdn.net/qingyanyichen/article/details/73550924 本人下载编译安装了opencv2.4.9,oppencv2.4.10,o ...

  10. 查看mysql 的存储过程定义

    查询数据库中的存储过程 方法一: select `name` from mysql.proc where db = 'your_db_name' and `type` = 'PROCEDURE' 方法 ...