[Python]简易terminal歌词滚动播放器

  整合了网易云的一些API,想写一个terminal版的音乐播放器,但是还没有想好写成什么样子。

  暂时写了一个必须又的功能:带歌词滚动的播放器,用了pygame里的mixer来播放音乐。

  准备有时间的时候实现一下其他的功能。

 1 # -*- coding:utf-8 -*-
 2 import re
 3 import os
 4 import time
 5 import copy
 6 import threading
 7 import pygame
 8 from pygame import mixer
 9
10
11 def read_file(path):
12     if not os.path.exists(path):
13         print ‘path : \‘‘ + path + ‘\‘ not find.‘
14         return []
15     content = ‘‘
16     try:
17         with open(path, ‘r‘) as fp:
18             content += reduce(lambda x, y: x + y, fp)
19     finally:
20         fp.close()
21     return content.split(‘\n‘)
22
23 class Lyrics:
24     TIME_AXIS_REGEXP = re.compile(‘\[(\d+)\:(\d+)\.(\d+)\]‘)
25     DEL_TIME_AXIS_REGEXP = re.compile(‘\[\d+\:\d+\.\d+\](.*)‘)
26
27     def __init__(self, path):
28         self.path = path
29
30     def _get_time_diff(self, line):
31         tm = map(lambda each: map(int, each), self.TIME_AXIS_REGEXP.findall(line))
32         tm = map(lambda each: each[0] * 60 * 1000 + each[1] * 1000 + each[2], tm)
33         return (tm[0], line)
34
35     def _show_lyric(self, line):
36         print line
37
38     def static_lyric(self, lyrics):
39         for line in lyrics:
40             self._show_lyric(line)
41
42     def dynamic_lyric(self, lyrics):
43         for line in lyrics:
44             try:
45                 time.sleep(float(line[0]) / 1000.0)
46                 self._show_lyric(line[1])
47             except:
48                 pass
49
50     def get_lyric(self):
51         lyrics = read_file(self.path)
52         tmp_lyric = lyrics
53         lyrics = filter(lambda line: len(self.TIME_AXIS_REGEXP.findall(line))!=0, lyrics)
54         if len(lyrics) == 0:
55             return False, tmp_lyric
56         lyrics = map(self._get_time_diff, lyrics)
57         tmp_lyric = copy.deepcopy(lyrics[:-1])
58         tmp_lyric.insert(0, (0, ‘‘))
59         lyrics = map(lambda x:(x[0][0]-x[1][0], x[0][1]), zip(lyrics, tmp_lyric))
60         lyrics = map(lambda x: (x[0], self.DEL_TIME_AXIS_REGEXP.findall(x[1])[0]), lyrics)
61         return True, lyrics
62
63     def show_lyric(self):
64         play_option, lyrics = self.get_lyric()
65         if play_option == True:
66             self.dynamic_lyric(lyrics)
67         else:
68             self.static_lyric(lyrics)
69
70 def play_mp3(path):
71     mixer.init()
72     track = mixer.music.load(path)
73     mixer.music.play(1)
74
75 def play(mp3_path, lrc_path):
76     t_mp3 = threading.Thread(target=play_mp3(mp3_path))
77     lyrics = Lyrics(lrc_path)
78     t_lyric = threading.Thread(target=lyrics.show_lyric())
79
80     t_mp3.start()
81     t_lyric.start()
82     t_mp3.join()
83     t_lyric.join()
84
85
86 def __main__():
87     play(‘./test1.mp3‘, ‘./test1.lrc‘)
88
89 if __name__ == ‘__main__‘:
90     __main__()
时间: 2024-10-11 12:41:46

[Python]简易terminal歌词滚动播放器的相关文章

Python实现 ---【简易】在线音乐播放器

最近这几天,学习了一下python,对于爬虫比较感兴趣,就做了一个简单的爬虫项目,使用Python的库Tkinsert做了一个界面,感觉这个库使用起来还是挺方便的,音乐的数据来自网易云音乐的一个接口,通过requests模块,get请求将数据获得,使用Json模块进行数据的解析,最终使用python的mp3play库进行对音乐的在线播放,以下是该程序的源码. 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Date : 2016-12

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

import cv2 import threading import win32gui,win32con class Producer(threading.Thread): """docstring for ClassName""" def __init__(self,str_rtsp): super(Producer, self).__init__() self.str_rtsp = str_rtsp self.play = True #通过c

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

网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助 这个其实很简单,只要在HTML上添加以上代码就OK了,前提是你的电脑上已经安装了播放器,如RealPlay. 复制代码 代码如下: <embed src="C:/mp3/10.19/画心.mp3" width="480" height="100"02. loop="false"

iOS音乐播放器(歌词自动滚动)

简单实现基于IOS的音乐播放器,并且带有歌词,随播放自动滚动,实现效果如下: 首先,需要建立一个解析歌词的类ZMPlrc,解析歌词主要就是把时间和对应的歌词分离出来,然后存储到数组中. ZMPlrc.h #import <Foundation/Foundation.h> @interface ZMPlrc : NSObject /** 时间 */ @property (nonatomic,strong)NSMutableArray *timeArray; /** 歌词 */ @property

用Vue来实现音乐播放器(三十八):歌词滚动列表的问题

1.频繁切换歌曲时,歌词会跳来跳去 原因: // 歌词跳跃是因为内部有一个currentLyric对像内部有一些功能来完成歌词的跳跃 //每个currentLyric能实现歌曲的播放跳到相应的位置 是因为它内部有个计时器 //每次currentSong改变的时候都会重新new一个新的lyric-parser出来, //但是我们之前的对象并没有做清理操作 也就是说我们之前对象还是有计时器在里面 //所以歌词会来回闪动 解决办法: 在切换歌曲之前 即getLyric()之前 重新去getLyric(

简单的HTML5音乐播放器(带歌词滚动)

首先需要整理好lrc格式的歌词放到script标签中以供程序处理.然后把音乐链接放到audio的src属性里就可以了. 源码: HTML部分 1 <div class="container"> 2 <audio id="player" src="test.mp3" loop controls preload></audio> 3 <div id="lrcArea"></di

Android开发本地及网络Mp3音乐播放器(十六)歌词显示及滚动事件实现、ViewPager使用

实现功能: 歌词显示及滚动事件实现 ViewPager使用 后续将博文,将实现已下载音乐扫描功能和已存在歌曲歌词下载. 因为,没有自己的服务器,所以网络音乐所有相关功能(包含搜索音乐.下载音乐.下载歌词)均无法保证时效性,建议,尽快下载和练习:如果你下载时候,已经因为我采集的服务器更改规则,请给我留言,如果可以解决,我将在有空的时候献上新的源码. 截止到目前的源码下载: http://download.csdn.net/album/detail/3105 (最新的,请下载最后一个,本博文对应版本

简易音乐播放器制作

制作简易音乐播放器: 1.功能:音乐列表,播放,暂停,上一曲,下一曲,进度条(显示进度时间,控制进度),随机播放,单曲循环,顺序播放,歌词显示等 2.使用框架:AVFoundation 3.知识点:AVPlayer 使用,pch 文件使用,封装思想,MVC模式,storyBoard的使用,消息发送机制,观察者,block回调,nstimer,nsrunloop,空间约束,第三方使用等 详细过程: 一.布局 :使用 storyBoard 布局 1.歌曲列表界面:使用 TableViewContro

Winform Windows Media Player 简易播放器

新手上路,高手勿进! 窗体设计: 实现效果: 实现代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; using Sy