[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打开即可编译运 ...
随机推荐
- hadoop 性能调优与运维
hadoop 性能调优与运维 . 硬件选择 . 操作系统调优与jvm调优 . hadoop运维 硬件选择 1) hadoop运行环境 2) 原则一: 主节点可靠性要好于从节点 原则二:多路多核,高频 ...
- c语言1
1.c语言的执行过程: 源代码:source code,使用某种计算机语言书写的代码. 编译:compile 对源代码进行翻译的过程. 编译器:compiler 负责编译工具. gcc:一款通用的编译 ...
- xcode调整debug,release模式
今天调试的时候发现变量都不能查看了.在「lldb」中通过「po」命令来查看总是提示变量未找到. 环境 xcode 7, Swift 2 错误提示 ‘XXXX’ was compiled with op ...
- 4. Java Script 变量(untype)
没有块级作用域 数据类型 JavaScript中有5种简单数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number和String.还有1种复杂数据类型——Object ...
- 建模分析之机器学习算法(附python&R代码)
0序 随着移动互联和大数据的拓展越发觉得算法以及模型在设计和开发中的重要性.不管是现在接触比较多的安全产品还是大互联网公司经常提到的人工智能产品(甚至人类2045的的智能拐点时代).都基于算法及建模来 ...
- sql语句修改字段长度
sql语句修改字段长度 alter table <表名> alter column <字段名> 新类型名(长度) 例: alter table students alter c ...
- android 设计
引用:http://my.eoe.cn/blue_rain/archive/3631.html 1.一些概念 模式的定义: 每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案 ...
- 分享一个动态生成RDLC报表的类
在实际工作中,当需要进行大批量查询和生成报表的时候,可以使用我写的类. 特点: 无需报表设计器.无需为报表设置数据集 只需要传入查询结果就可以全自动生成报表,传入的对象为Dynamic(目前支持Dat ...
- logrotate
logrotate程序是一个日志文件管理工具.用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到"转储"作用.可以节省磁盘空间. logrotate命令格式:logrot ...
- ScrollView
在程序设计中,有时我们需要实现自动滚屏或根据选择直接滚动到指定的位置的功能.这里用到的主要组件就是滚动视图(ScrollView). ---------- 那么使用ScrollView如何实现布局自动 ...