douban.fm 是我常用的网络音乐电台,但因为是web应用,无法使用全局热键控制,官方又没有提供linux桌面版本,故打算自己开发一个linux doufan.fm播放器。

要实现的功能:

  1. 全局热键控制
  2. 开始播放时桌面通知
  3. 登录、选频道

想要实现并不一定能实现,但我会花时间来慢慢攻破困难,目前为止已经简单的实现了基本功能。

douban.fm 播放器的简单实现

既然是简单实现,那么在保证功能的前提下应该尽量保持实现的简单,以便后续完善。在开发工具上我选择python,以便快速交付和测试我的想法。

数据来源

如何获取要播放的音乐及相关信息是首要解决的问题,这就必须要研究douban.fm的工作流程。其实我们可以思考一下,如果要我们实现一个网络电台,该怎么实现?不可能把所有的播放列表都放在客户端,是了,一个很好的方案是先由客户端发送请求播放列表,服务端返回播放列表,客户端再根据播放列表中的url请求文件以播放。

当然,具体情况还是要实际分析过才可得知,我们可以用网页调试工具(firebug或chrome的开发者工具),甚至抓包软件,分析douban.fm的数据通信。

刷新后,可以看到douban.fm发出的所有http请求,接下来,我们要有目的的寻找携带播放列表的http响应:

从url可以明显的看到playlist字样,展开该请求响应,可以看出响应数据的格式是json,继续展开,终于找到了我们想要的数据。

接着,我们要研究该url的参数,以便定制我们的播放器。在新标签打开该url:

经过多次尝试,大概可以确定这几个参数的行为:

  • type:字面意义是类型,具体作用不明,由douban.fm发出的所有请求都使用了type=n,缺少该参数将无法正常获取播放列表;
  • sid:作用不明,可省,猜测与用户相关;
  • pt:作用不明,可省,猜测与音乐类型相关;
  • chanel:频道ID,经过测试发现,0:公共/私人(指定sid时)兆赫、1:华语、-3:红心兆赫;
  • from:客户端来源,可省;
  • r:从值来看,应该是random的缩写,可省;

所以,一条最简单的获取播放列表的url是:http://douban.fm/j/mine/playlist?type=n&channel=0

播放音乐

有了音乐文件,怎么用python播放呢?我们没有必要先把mp3文件下载到,又自己实现一个播放器。即使利用已有的模块或库都显得过于麻烦。linux如此多基于命令行的流媒体播放器,为什么不直接拿来用?比如我经常使用的mplayer。

使用mplayer:mplayer http://mr3.douban.com/201212101049/fbc67748d2c7791b86653220b2ccbd08/view/song/small/p1472407.mp3,一条命令就可以播放在线的音乐。然后,用python的subprocess模块调用即可。

至此已经可以写出一个最简单的douban.fm播放器:

httpConnection = httplib.HTTPConnection('douban.fm')
httpConnection.request('GET', '/j/mine/playlist?type=n&channel=0')
song = json.loads(httpConnection.getresponse().read())['song']
subprocess.call(['mplayer', song[0]['url']])

激动人心的是,这一功能的实现只用了4行代码。

Ubuntu桌面通知

统一的桌面通知是很有意义的(想想windows下混乱的弹窗吧),从OS X v10.8 “Mountain Lion"开始,Mac开始统一Notification Center,与此同时各linux桌面也在完善各自的通知系统。

ubuntu unity拥有自己的桌面通知接口,打开~/.bashrc,可以发现有这样一条命令别名:

alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

在shell中输入命令:alert "test",可以看到如下效果:

alert是别名,核心命令是notify-send,通过man notify-send,我们可以查看其用法。

ubuntu下播放器开启notify插件后,每次切歌都会发出一个桌面提示:

这是一个很酷的功能,那么如何实现?

仔细想想的话并不难,图片可以由song[0]['picture']下载,然后构造命令notify-send -i pictrue_path ['title'] ['artist'] ['albumtitle']即可。其中涉及到图片文件的下载保存,可以用httplib+文件读写来完成,实际中我用的是wget。

用python来实现就是:

picture = 'images/' + song[0]['picture'].split('/')[4]# 下载专辑封面
if not os.path.exists(picture):subprocess.call(['wget','-P','images',song[0]['picture']])# 发送桌面通知
subprocess.call(['notify-send','-i',os.getcwd() + '/' + picture,song[0]['title'],song[0]['artist'] + '\n' + song[0]['albumtitle']])

获取图片名时小小的hack了一下,song[0]['picture'].split('/')[4] 这句用来获取url中的图片名,当然,这并不是一个很好的方法。

小结

最后,结合前面的播放代码,已经算是基本完成了,虽然没有实现全局热键控制、登录,但已经可以使用了。

完整的代码:

 1 #!/usr/bin/python
 2 # coding: utf-8
 3
 4 import httplib
 5 import json
 6 import os
 7 import sys
 8 import subprocess
 9 import time
10
11 reload(sys)
12 sys.setdefaultencoding('utf-8')
13
14 while True:
15     # 获取播放列表
16     httpConnection = httplib.HTTPConnection('douban.fm')
17     httpConnection.request('GET', '/j/mine/playlist?type=n&channel=0')
18     song = json.loads(httpConnection.getresponse().read())['song']
19
20     picture = 'images/' + song[0]['picture'].split('/')[4]
21
22     # 下载专辑封面
23     if not os.path.exists(picture):
24         subprocess.call([
25             'wget',
26             '-P',
27             'images',
28             song[0]['picture']])
29
30     # 发送桌面通知
31     subprocess.call([
32         'notify-send',
33         '-i',
34         os.getcwd() + '/' + picture,
35         song[0]['title'],
36         song[0]['artist'] + '\n' + song[0]['albumtitle']])
37
38     # 播放
39     player = subprocess.Popen(['mplayer', song[0]['url']])
40     time.sleep(song[0]['length'])
41     player.kill()

转载于:https://www.cnblogs.com/7c00/archive/2012/12/10/2811242.html

Ubuntu下自制douban.fm播放器相关推荐

  1. Ubuntu下安装Audacious音乐播放器详细配置方法(中文化,歌词显示等)

    Windows下有不少比较有名气的音乐播放器,例如千千静听,Kugou,foobar和QQ音乐等,但是ubuntu下的音乐播放器则没有这么丰富,但是现在则给大家介绍一款ubuntu下的"千千 ...

  2. linux安装深度播放器,Ubuntu下安装深度音乐播放器Dmusic

    昨天尝试了Deepin 2014 alpche测试版本,除了Deepin自身做得很好外,深度原生的程序也很棒,包括深度媒体播放软件,深度视频.深度音乐,今天在我的Ubuntu系统上安装了Dmusic, ...

  3. ubuntu下安装windows adobeflash播放器插件

    在ubuntu下一般默认的浏览器是firefox(火狐浏览器),播放视频需要安装adobe flash播放器插件 1.下载adobeflash for ubuntu 2.我下载的是tar包,解压把解压 ...

  4. JavaScript + Audio API自制简易音乐播放器(详细完整版、小白都能看懂)

    JavaScript + Audio API自制简易音乐播放器(详细完整版) ** 音乐播放器的功能清单如下: ** 1.点击暂停按钮,歌曲暂停 2.点击播放按钮,歌曲播放 3.单曲循环与取消单曲循环 ...

  5. 单片机(Arduino)+FLASH+MIC+喇叭自制录音、播放器(二)

    单片机(Arduino)自制录音.播放器(二)播放器篇 前一篇给大家分享了录放机设计的大致流程,那么这篇我们将先专注于如何实现声音播放器,具体内容如下: 1. 声音播放器原理与知识点介绍 2. 硬件电 ...

  6. linux ubuntu10.10下最好的音乐播放器deadbeef

    linux ubuntu10.10下最好的音乐播放器deadbeef 十一 18 无冷 Linux , Ubuntu 1,162 viewsGo to comment 推荐一款播放器Deadbeef ...

  7. 在openSUSE-Leap-15.2-DVD-x86_64下使用VLC媒体播放器

    在openSUSE-Leap-15.2-DVD-x86_64下使用VLC媒体播放器 原文连接:http://blog.sina.com.cn/s/blog_76edd3f90102z51v.html ...

  8. 计算机音乐播放器设置,Win7系统下设置默认音乐播放器的两种方法

    可能很多新手用户不知道Win7系统下怎么设置默认音乐播放器?我们习惯将某一程序设置为默认打开方式,音乐播放器也可以这样子的.一些用户想把酷狗播放器.或者qq音乐设置为默认音乐播放器,只要打开音乐文件, ...

  9. ubuntu下好用的视频播放器

    Ubuntu 16.04,Ubuntu 16.10,Ubuntu 17.04,Ubuntu 17.10安装 MPV播放器 从默认仓库中安装: sudo apt install mpv smplayer ...

  10. totem 解码器_从Ubuntu中的Totem电影播放器​​清除历史记录

    totem 解码器 If you've been using the default movie player in Ubuntu to play videos, you might have not ...

最新文章

  1. ASP.NET Web Forms – 服务器控件简介
  2. C++100w个数中找出最大的前K个数
  3. linux系统盘使用率达到100%的问题查找和解决方法
  4. 【C语言】switch…case无break情况(2)
  5. leetcode - 206. 反转链表
  6. shell如何自动输入密码
  7. 在Node.js中操作文件系统(一)
  8. Spring安全依赖查找
  9. 弹性计算安全组最佳实践及新特性介绍
  10. html设置回到顶部按钮,给网站添加回到顶部按钮
  11. 通过js实现文字合成语音并播报
  12. 注册谷歌账号,提示“此电话号码无法用于进行验证”
  13. 前端请求路径为何不能写成http://localhost:8080/**/** ?
  14. excel替换tab、换行符特殊字符
  15. html5拖放详解,HTML5拖拽/拖放(drag drop)详解
  16. 如何对某一个文件夹下的所有文件快速重命名
  17. 大数据营销模型思路架构
  18. 订阅者java_发布者订阅者模式之JAVA实现
  19. 1319. 移棋子游戏(sg+图论(移棋子)邻接表)
  20. 蓝桥杯真题2017-2021

热门文章

  1. CAD中插入外部参照字体会变繁体_什么是CAD的形文件,它与字体文件有什么区别?...
  2. c++三子棋游戏程序
  3. pythonmatplotlib怎么设置柱面_协调basemap quiver和matplotlib
  4. java实训鉴定表_java实习自我鉴定材料定稿(资料4)
  5. java语言的基本介绍及相关特性
  6. Snagit 2021\2022
  7. startuml如何画流程图_Startuml 画流程图使用方法
  8. DCB差分码偏差概念及应用(附RTKLIB测试对比结果)
  9. 二维码的纠错码原理及如何纠错(1)
  10. 32款 jQuery UI框架开源软件