Skip to content

Nan-Shen/NerdishDoubanFM

 
 

Repository files navigation

NerdishDoubanFM

A nerd-ish command line Douban FM client written in Python.

Overview

这是基于python编写的命令行版的豆瓣FM,在Ubuntu 12.10 x64上测试运行。

这份代码参考了很多别人的已有代码和资料,包括:

注:以上有些作者没有标明代码的版权协议,我这里也没有给出代码遵从的协议。如有任何 关于代码的问题,请与我联系。

Requirement

  • Requests 。建议用pip安装。
  • Gstreamer 。有些发行版默认没装必须的插件,无法播放mp3。可以通过gst-launch-0.10 playbin2 uri=file://path/to/mp3 测试能否正常播放。如提示缺少插件,Ubuntu的解决 办法为:
    sudo aptitude install gstreamer0.10-plugins-ugly
        

Functions

  • 支持豆瓣FM网络版的大部分功能,包括选电台,播放,暂停,下一首,登录,加红心,取 消红心,显示播放进度等
  • 支持自动下载歌词并显示,采用歌词迷的API,见 http://api.geci.me/en/latest/index.html
  • 支持代理功能。
  • 支持Linux的桌面通知。
  • 默认在歌曲播放时下载歌曲到本地,可以查看.cache/.song目录。播放相同歌曲时优先选 择本地缓存,不保存播放过程中跳过的歌曲。

Usage

在终端中运行

python NerdishDoubanFM.py

输入正确的用户名、密码以便登录。如果不需要登录功能,直接回车即可。

配置文件是Settings.py,注意不要修改系统设置部分,修改用户设置即可。配置方法示例如下:

user_email = 'foo@bar.com'
user_password = 'secret'
system_proxies = {"http": "127.0.0.1:8087", "https": "a.b.c.d"}
system_notification = True

如果配置了用户名密码,程序在启动时将不再提示输入用户名和密码。注意代理的格式是 Python中的字典。

目前尚未完成帮助部分。 按键功能说明如下:

  • “j,k,Up,Down”:上下移动光标选择频道,j、k键是Vim习惯
  • “c”:播放该频道
  • “n”:下一首
  • “p”:暂停/播放
  • “l”:用户登录
  • “r”:标为喜欢
  • “u”:取消喜欢
  • “q”:退出

update <2013-10-21 Mon>: 增加了频道搜索功能,但是没有和目前的界面结合。需先运 行

python DoubanFM.py

输入关键词搜索,然后选择一个频道(目前只支持一个频道)。再次运行

python NerdishDoubanFM.py

界面的最后一个频道即是前面通过搜索得到的结果。

Problems

  • 多线程模型采用了一个非常dirty的解决方案。curses库不是thread-safe的,但是显示歌 曲进度和歌词需要修改curses界面,网上没有找到现成的解决方案。目前采用的方法是在 while循环中给select设置超时,然后在接下来的部分更新歌曲进度和歌词,再判断是否可 读,做用户输入处理,这样所有的界面处理都放到了主线程中。可能在别人已有的代码中 有更加优雅的解决方案。下载歌词也在主线程中进行,会有卡顿现象。
  • 中文歌词的显示有一定的问题,因为len不能正常计算出正常的显示长度。理论上可以用unicodedata的east_asian_width计算实际显示长度,无法在curses节目中使用,会有问 题, 同时另外一种正则表达式来计算的办法也不行。尚未明白其中原因。 目前采用简单的ASCII码来计算,大部分能正常工作。
  • 程序的错误处理比较粗暴简单,因此不能处理网络情况比较差导致的许多问题。
  • 按照PyGST官方教程,采用playbin2进行播放,注册了消息处理的回调函数,但是歌曲播送 完后不发送EOS(End Of Stream)消息。目前采用比较dirty的解决方法是用 query_position来判断音乐是否播放结束。(update: 后台已改成使用两个不同的播放器: playbin2用于播放本地音乐,自己组装的播放器(souphttpsrc name=httpsrc ! tee name=t ! queue ! filesink name=filedest t. ! queue ! mad ! audioconvert ! alsasink)可以通过http协议播放音乐并自动下载到本地。)
  • 红心兆赫不在get_channel_list函数返回的列表中,在豆瓣FM的网页版通过web console监 视网络请求可以看到红心兆赫的实际channel_id为-3,因此在代码中我手动加入这个 channel。另外,从web console可以看到豆瓣FM的网页版似乎是通过 http://douban.fm/j/mine/playlist 进行交互的, https://github.com/zhendi/DoubanFM-CLI/ 也是采用同一套API。(我采用的是 http://www.douban.com/j/app/radio
  • 没有对广告进行处理
  • 好吧,bugs太多,经常卡死,Ctrl+C强行退出后重启便好。(update: 很大一部分bug由 歌词下载模块导致,因为当时没有考虑许多特殊情况。修正后目前卡死情况已经少很多了。)

TODO

  • 加入Linux的桌面通知
  • 改善配置系统,加入代理等功能设置
  • 增加下载歌曲功能
  • 后台采用Pipeline替代playbin2,测试能否修正playbin2不发送EOS的问题
  • 处理广告的问题
  • 显示完整的频道列表
  • 加入history
  • 歌词采用异步方式下载
  • 加入播放历史功能,可以提供播放历史列表和前一首,单曲循环等功能
  • 显示manual
  • 改善Console输出,加强Console窗口功能,可以考虑加入类似Vim的命令功能。
  • Emacs客户端
  • 重构代码,目前由于写得比较仓促,有无用冗余和风格奇怪的代码。

Acknowledgement

About

A nerd-ish command line Douban FM client written in Python.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 100.0%