[Python]简易terminal歌词滚动播放器
整合了网易云的一些API,想写一个terminal版的音乐播放器,但是还没有想好写成什么样子。
暂时写了一个必须又的功能:带歌词滚动的播放器,用了pygame里的mixer来播放音乐。
准备有时间的时候实现一下其他的功能。

# -*- coding:utf-8 -*-
import re
import os
import time
import copy
import threading
import pygame
from pygame import mixer
import itertools def read_file(path):
if not os.path.exists(path):
print 'path : \'' + path + '\' not find.'
return []
content = ''
try:
with open(path, 'r') as fp:
content += reduce(lambda x, y: x + y, fp)
finally:
fp.close()
return content.split('\n') class Lyrics:
TIME_AXIS_REGEXP = re.compile('\[(\d+)\:(\d+)\.(\d+)\]')
DEL_TIME_AXIS_REGEXP = re.compile('\[\d+\:\d+\.\d+\](.*)') def __init__(self, path):
self.path = path def _get_time_diff(self, line):
tm = map(lambda each: map(int, each), self.TIME_AXIS_REGEXP.findall(line))
tm = map(lambda each: each[0] * 60 * 1000 + each[1] * 1000 + each[2], tm)
return (tm[0], line) def _show_lyric(self, line):
print line def static_lyric(self, lyrics):
for line in lyrics:
self._show_lyric(line) def dynamic_lyric(self, lyrics):
for line in lyrics:
try:
time.sleep(float(line[0]) / 1000.0)
self._show_lyric(line[1])
except:
pass
while mixer.music.get_busy() == True:
time.sleep(5) def get_lyric(self):
lyrics = read_file(self.path)
tmp_lyric = lyrics
lyrics = filter(lambda line: len(self.TIME_AXIS_REGEXP.findall(line))!=0, lyrics)
if len(lyrics) == 0:
return False, tmp_lyric
lyrics = map(self._get_time_diff, lyrics)
tmp_lyric = copy.deepcopy(lyrics[:-1])
tmp_lyric.insert(0, (0, ''))
lyrics = map(lambda x: (x[0][0]-x[1][0], x[0][1]), zip(lyrics, tmp_lyric))
lyrics = map(lambda x: (x[0], self.DEL_TIME_AXIS_REGEXP.findall(x[1])[0]), lyrics)
return True, lyrics def show_lyric(self):
play_option, lyrics = self.get_lyric()
if play_option == True:
self.dynamic_lyric(lyrics)
else:
self.static_lyric(lyrics) def play(mp3_path, lrc_path):
lyrics = Lyrics(lrc_path)
mixer.init()
track = mixer.music.load(mp3_path)
mixer.music.play(1)
t_lyric = threading.Thread(target=lyrics.show_lyric)
t_lyric.start()
t_lyric.join() def __main__():
play_list = [['./test1.mp3','./test1.lrc'], ['./test2.mp3','./test2,lrc'], ['./test3.mp3','./test3.lrc']]
play_list = itertools.cycle(play_list)
while True:
tmp = play_list.next()
play(tmp[0], tmp[1]) if __name__ == '__main__':
__main__()
[Python]简易terminal歌词滚动播放器的更多相关文章
- HTML5实践之歌词同步播放器
歌曲播放我们会发现他的兼容性不是很好,譬如IE上能播放的flash播放器,再firfox或者chrome上就不是很好的应用了,因为有插件的阻碍!HTML5的出现让这一切成为了可能,但是播放器虽然播放了 ...
- 用JavaScript实现歌词滚动播放
各种音乐播放器上都有一个自动滚动播放歌词的功能,那么这个功能用JavaScript怎么实现呢?请看下文. 一般音乐播放器使用的歌词格式都是lrc,为了方便处理,我们这里使用XML格式的歌词.介绍一个网 ...
- 基于Basys2开发板的简易电子琴和音乐播放器设计
背景:华中科技大学 电测综合实验 主要功能:Basys2开发板外接一个扬声器(或无源蜂鸣器也可)实现电子琴和音乐播放器的功能.其中由于开发板上只有4个按键,所以电子琴功能只做了4个音调,分别对应于4个 ...
- 使用python打造一款音乐播放器
作者qq:64761294 编程/考试交流群:834531270 欢迎交流 核心播放模块(pygame内核) import time import pygame import easygui as g ...
- python基础===基于cv2的播放器
import cv2 import threading import win32gui,win32con class Producer(threading.Thread): ""& ...
- Lily_music 网页音乐播放器 -可搜索(附歌词联动播放效果解说)
博客地址:https://ainyi.com/59 写在前面 这是我今年(2018)年初的小项目,当时也是手贱,不想用别的播放器,想着做一个自己的网页播放器,有个歌曲列表.可关键词搜索.歌词滚动播放的 ...
- C#winfrom播放器动态加载歌词
上周我们进行了结业项目答辩,是播放器项目.有一个关于播放器变唱歌边加载歌词的方法特别有意思,像酷狗那样子歌词和歌曲同步滚播的样子. 这里的工具是Visual Studio 2013,使用语言是C#和. ...
- (jsp/html)网页上嵌入播放器(常用播放器代码整理) http://www.jb51.net/article/37267.htm
网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助 这个其实很简单,只要在HTML上添加以上代码就O ...
- Qt开发Gif播放器
一.资源下载地址 https://www.aliyundrive.com/s/jBU2wBS8poH 本项目路径:项目->免费->Gif播放器(包含整个工程源码,vs2019打开即可编译运 ...
随机推荐
- Warning C4819
VC工程里有个文件,只有文件里写了汉字,就报警告C4819 Warning C4819:The file contains a character that can ot be represented ...
- c++中vector的用法详解
c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...
- lkx开发日志1-项目前的准备
遇到的问题 不了解github的使用 不能熟练的用Markdown编辑,比如:放入图片 虚拟机的认知也还是有点模糊 解决的方法 参照老师博文给出的链接,好好学习实操一遍 多请教组员,很多小问题便迎刃而 ...
- SpringMVC源码剖析(四)- DispatcherServlet请求转发的实现
SpringMVC完成初始化流程之后,就进入Servlet标准生命周期的第二个阶段,即“service”阶段.在“service”阶段中,每一次Http请求到来,容器都会启动一个请求线程,通过serv ...
- SQLServer中用先进先出思想求成本价和平均成本单价
1.首先是创建表: create table #in ( id ,), TDate datetime not null, goodcode ) , InNum ,) null, --入库数量 Pric ...
- .net实现webservice简单实例分享
原理:WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间的交互.作用:主要用 ...
- iphone H5视频行内播放(禁止全屏播放)
一般用户都知道,ios在网页点击视频播放时,视频会弹出全屏播放框. video标签的playsinline.webkit-playsinline标记根本就不会起作用. 还有传闻说对于没有声音的视频不会 ...
- 编写ros串口节点,使用官方serial包
参考http://www.roswiki.com/read.php?tid=557&fid=39 1.通过sudo apt-get install ros-<distro>-ser ...
- WdatePicker 没有权限 不能执行已释放 Script 的代码
提示 拒绝访问 或 没有权限 或 ' Window.document 或 '$dp' 为空或不是对象 $dp.dd is undefined 之类的错误 SCRIPT70: 没有权限 WdatePic ...
- 盒子模型(W3C盒子模型、IE盒子模型)
盒子模型:一个物体在页面中所占据的位置 盒子模型包含以下几种元素: padding:margin:content:border 这是大家都知道的,也是书本上定义说明的,但是在ie的情况下是有点区别的; ...