整合了网易云的一些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歌词滚动播放器的更多相关文章

  1. HTML5实践之歌词同步播放器

    歌曲播放我们会发现他的兼容性不是很好,譬如IE上能播放的flash播放器,再firfox或者chrome上就不是很好的应用了,因为有插件的阻碍!HTML5的出现让这一切成为了可能,但是播放器虽然播放了 ...

  2. 用JavaScript实现歌词滚动播放

    各种音乐播放器上都有一个自动滚动播放歌词的功能,那么这个功能用JavaScript怎么实现呢?请看下文. 一般音乐播放器使用的歌词格式都是lrc,为了方便处理,我们这里使用XML格式的歌词.介绍一个网 ...

  3. 基于Basys2开发板的简易电子琴和音乐播放器设计

    背景:华中科技大学 电测综合实验 主要功能:Basys2开发板外接一个扬声器(或无源蜂鸣器也可)实现电子琴和音乐播放器的功能.其中由于开发板上只有4个按键,所以电子琴功能只做了4个音调,分别对应于4个 ...

  4. 使用python打造一款音乐播放器

    作者qq:64761294 编程/考试交流群:834531270 欢迎交流 核心播放模块(pygame内核) import time import pygame import easygui as g ...

  5. python基础===基于cv2的播放器

    import cv2 import threading import win32gui,win32con class Producer(threading.Thread): ""& ...

  6. Lily_music 网页音乐播放器 -可搜索(附歌词联动播放效果解说)

    博客地址:https://ainyi.com/59 写在前面 这是我今年(2018)年初的小项目,当时也是手贱,不想用别的播放器,想着做一个自己的网页播放器,有个歌曲列表.可关键词搜索.歌词滚动播放的 ...

  7. C#winfrom播放器动态加载歌词

    上周我们进行了结业项目答辩,是播放器项目.有一个关于播放器变唱歌边加载歌词的方法特别有意思,像酷狗那样子歌词和歌曲同步滚播的样子. 这里的工具是Visual Studio 2013,使用语言是C#和. ...

  8. (jsp/html)网页上嵌入播放器(常用播放器代码整理) http://www.jb51.net/article/37267.htm

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助   这个其实很简单,只要在HTML上添加以上代码就O ...

  9. Qt开发Gif播放器

    一.资源下载地址 https://www.aliyundrive.com/s/jBU2wBS8poH 本项目路径:项目->免费->Gif播放器(包含整个工程源码,vs2019打开即可编译运 ...

随机推荐

  1. Windows Server 2008 R2安装子域控制器

    一.实验网络拓扑图: 二.实验说明: 子域控制器安装前需要先把主域控制器安装好,然后子域控制器的DNS先指向主域控制器的IP地址 192.168.10.30,主域控制器委派DNS给子域控制器后再把子域 ...

  2. Android Studio: Failed to sync Gradle project 'xxx' Error:Unable to start the daemon process: could not reserve enough space for object heap.

    创建项目的时候报错: Failed to sync Gradle project 'xxx' Error:Unable to start the daemon process: could not r ...

  3. ios - 谓词的使用

    谓词在搜索的时候非常管用.简单示例代码如下: 分类Person.h文件 #import <Foundation/Foundation.h> @interface Person : NSOb ...

  4. HDU 4509 湫湫系列故事——减肥记II(线段树-区间覆盖 或者 暴力技巧)

    http://acm.hdu.edu.cn/showproblem.php?pid=4509 题目大意: 中文意义,应该能懂. 解题思路: 因为题目给的时间是一天24小时,而且还有分钟.为了解题方便, ...

  5. php 设计模式

    一.工厂模式 1.创建接口类,规范方法,要实现这个接口的类必须实现这个接口的所有方法,接口的方法默认是抽象的,所以不再方法前面加 abstract interface people{ public f ...

  6. PHP设计模式之:单例模式

        前 些日子开始着真正的去了解下设计模式,开始么,简单地从单例模式开始,当然网上看了一些资料,单例模式比较好理解,看看介绍,然后看看代码基本也就能够理 解了,设计模式这些的花点心思基本的是能够理 ...

  7. java布局学习 (一)

    Java 程序通过jvm可以很好的移植到其他平台上,但是java 生成的图形界面样式,在不使用布局的情况下,往往需要重新设定大小,才能在新的平台上调整到最佳样式.这是由于组件的最佳大小 往往是与平台相 ...

  8. Vs2012编写C语言

    本来我也是用VC++6.0编写C语言的,但是由于这个版本过老并且和win7,win8,win10的不兼容所以去下载了vs2012,一开始的时候不知道怎么用,现在学会了就写一个教程分享一下. 这时就遇到 ...

  9. 解决Qualcomm Atheros AR8161 Gigabit Ethernet网卡Linux下坏掉的问题

    我的戴尔(Dell)I2330R-168一体电脑的网卡在升级某个内核版本后,网卡就用一会儿就坏了 ifconfig eth0 eth0: flags=<UP,BROADCAST,RUNNING, ...

  10. Asp.Net中应用Aspose.Cells输出报表到Excel 及样式设置

    解决思路: 1.找个可用的Aspose.Cells(有钱还是买个正版吧,谁开发个东西也不容易): 2.在.Net方案中引用此Cells: 3.写个函数ToExcel(传递一个DataTable),可以 ...