去年年底发布了一款使用PyQt5开发的音乐播放器(原文),当时发布了一个版本,效果还不错。本次在前一版本进行改进,推出V1.5版本,对之前的版本进行BUG修复、新功能加入,另外,在文中我会解答一些相关问题。
1.加入“歌单同步”—可以同步网易云歌单啦
2.加入“Mini模式” —迷你模式占用桌面资源更小
3.加入“播放列表” —详细操作当前播放歌单
4.加入“ToolTip” —表示更友好
5.加入“快速收藏❤” —方便快捷
6.加入“添加本地音乐” —播放更多本地音乐
7.背景图片显示 —真全屏
1.歌曲排行榜放在了本地 —GUI启动更加快速
2.加入图盘图标 —操作更加快捷
3.加入歌曲分享选择①链接②短链接③二维码 —多种分享方式任你选
4.歌曲列表右击菜单加入“搜索相关歌曲”选项 —搜索更加方便
5.修改了歌词处理逻辑 —提高了容错率,歌词显示更友好
6.修改“播放全部”功能 —实现了真的“播放全部”
7.加入两个“音源”,可在设置中选择 —歌曲库一下子增大了很多呢
8.加入网络情况判断 —可以离线使用本程序啦
9.加入“歌曲搜索结果最多显示数量” —可以根据自己的情况自主选择音乐搜索结果显示数量
着重说一下UI的变化
右下角加入了播放列表,用于显示当前音乐播放列表,双击歌曲名即可播放
本次也是创新性地加入了“歌单同步”,无需登陆账号,即可同步歌单
PS:由于接口限制,只能展示歌单大于10个且每个歌单最多展示十首音乐
将音乐链接以二维码的方式分享出去,扫码即可听歌
加入了系统托盘,便于对播放器控制
(1)UI:使用10个QLabel进行歌词的显示,名称依次是label_110~label_119,其中,当前播放的歌词在label_113上显示,字体较大。
效果:
(2)歌词处理逻辑:
1)使用get_lyric_raw(music_id,source)函数获取原始歌词,歌词结构类似于:
[00:00.000] 作词 : 柳爽
[00:01.000] 作曲 : 柳爽
[00:02.53]编曲:王子豪
[00:03.42]制作人:柳爽 徐林 唐森
[00:04.36]出品:网易青云LAB
[00:10.25]
[00:28.73]我从没有见过极光出现的村落
[00:35.29]也没有见过有人 在深夜放烟火
2)使用get_lyric_format(lyric_raw)处理第一步的歌词:使用正则表达式切割出【时间】与【歌词】,创建一个字典,时间部分通过format_lyric_time(time)函数,将歌词时间转化成毫秒后返回,作为字典time键的值,歌词部分通过调用format_lyric_string(lyric)对“’”,“\r”等字符串进行替换,作为字典lyric键的值,这样就能处理出大部分的歌词,得到像[{‘time’: 28730, ‘lyric’: ‘我从没有见过极光出现的村落’}, {‘time’: 35290, ‘lyric’: ‘也没有见过有人 在深夜放烟火’}]这样格式的歌词。但是,在处理过程中有些格式是不满足我们需要的,比如最开始的歌名、歌手、专辑信息,它们没有时间,解决方法就是在程序中进行判断,将这些没时间的“歌词”加入默认时间0,还有的情况是只有时间没有歌词,这里将这些有时间的“空歌词”加入默认歌词"",最后就产生了我们播放器需要的歌词格式:
[{‘time’: 0, ‘lyric’: ’ 作词 : 柳爽’}, {‘time’: 1000, ‘lyric’: ’ 作曲 : 柳爽’}, {‘time’: 2530, ‘lyric’: ‘编曲:王子豪’}, {‘time’: 3420, ‘lyric’: ‘制作人:柳爽 徐林 唐森’}, {‘time’: 4360, ‘lyric’: ‘出品:网易青云LAB’}, {‘time’: 10250, ‘lyric’: ‘’}, {‘time’: 28730, ‘lyric’: ‘我从没有见过极光出现的村落’}, {‘time’: 35290, ‘lyric’: ‘也没有见过有人 在深夜放烟火’}]
(3)歌词滚动:
由于开始实例了一个QMediaPlayer()对象player,将player的positionChanged事件绑定到自定义的get_position_func§函数上,此函数会定期将音乐播放进度(p)进行更新,这里只说歌词显示逻辑:遍历歌词列表,获取时间和歌词,当当前进度(p)小于或者等于时间的时候,通过调用QLabel的setText()函数将前十句歌词显示到上,其中正在播放的一句歌词显示在label_113上,由于歌曲一直在播放,get_position_func§函数一直在执行,所以正在播放的一句歌词也会一直改变,改变的速度取决于当前播放进度(p),产生的效果就像歌词在“滚动”。
效果:
歌曲播放分为本地歌曲播放以及网络歌曲播放
歌曲播放:
在软件开发时,为了UI复用,将显示歌曲列表的组件QTableWidget复用,设置了8个列,分别是:操作、歌曲名称、歌手、专辑、本地音乐文件地址、歌曲id、图片id、歌曲源,软件运行时,设置了表格列隐藏,只显示了操作、歌曲名称、歌手、专辑四列。
(1)本地音乐播放:
本地音乐是通过点击“本地音乐”、“下载管理”两个按钮展示的,在程序中设置了__play_local_music_flag标志位,当双击歌曲名称时,调用do_play_local_music()函数,该函数获取到QTableWidget的所选行,将歌曲名称和本地音乐文件地址(fileName)调用QPlayList的addMedia(QMediaContent(QUrl.fromLocalFile(fileName)))函数添加到当前播放列表中然后播放。
(2)在线音乐播放:
在线歌曲展示通过多种方式能够触发,音乐榜、我的收藏、点击歌单、歌曲搜索…当双击歌曲名称时调用do_play_song()函数,获取所选音乐的名称、歌曲id、图片id、歌曲源,通过歌曲id去获取歌曲的在线播放地址,通过图片id去获取歌曲的图片,另外,如果歌曲源是netease时,获取此歌曲的评论信息,最后开始播放。
(3)歌曲切换:
在使用音乐播放器的时候无论是当前音乐播放结束还是手动切换歌曲,都会造成当前播放音乐的改变,这里我设置了一个列表变量__current_playlist_items,在此列表中保存当前音乐的播放列表,另外设置了__current_playlist_item_point整型变量用来设置当前播放歌曲的位置,举个例子,如果当前正在播放一首歌曲,且当前播放模式为列表循环,这时候手动切换了歌曲,会造成__current_playlist_item_point+1,然后程序自动获取上/下一首歌曲的信息(包括歌曲名称id、图片id,源)将其加入到QMediaPlaylist中,并不是直接操作的QPlayList,因为如果直接操作的话,每次都要把所有音乐加入到播放列表中,会产生大量的网络请求等待时间,增加额外开销,这也是我没有使用QMediaPlaylist原生的.previous()和.next()函数的原因。
本次对音乐播放器进行了改进,尽可能地增强用户体验,加入新的功能尽量不造成冗余,提高代码的复用。发表本篇博文主要是为了介绍一下v1.5的改进细节和回答一下大家关切的问题。软件开发出来或多或少都会存在bug,如果有时间的话还会再推出新的版本。最后感谢大家的关注,谢谢!
体验地址:蓝奏云
20220109
1.播放收藏音乐,label显示问题 已解决
2.点击最大化按钮后,最大化按钮图标不见了 已解决
3.批量收藏/下载 批量收藏已实现
4.右下角四个图标的布局问题 待测试
5.脱机播放本地音乐处理 没必要
6.歌词窗口增加到两行 没必要
7.搜索框变为透明,便于背景图片的设置 已实现
8.收藏页面去掉“收藏”图标 没必要
9.背景图片设置按钮边加入清除背景图片 已实现
10.主窗口最大化后背景图片全屏显示 已实现
11.修改定时任务-定时退出逻辑 已实现
12.加入音量详细调节 已实现
13.去掉Qdialog的问号,只保留关闭 已实现
14.使用base64或者自定义md5盐写入文件
15.解决歌曲评论翻页网络请求超时报错 已解决
16.主窗口空格及其他快捷键 已实现
17.“播放全部”功能未完全实现 已实现
18.将网络排行榜列表json加载方式为读取本地json文件 已实现 ->提高了程序启动速度
20220205
19.增加新的音源 已实现->新增两个音源
20.最后一句歌词播放问题
21.默认歌曲、歌词下载位置更改后写入配置文件
22.修改
还原:mdi.minus-box-multiple
最小化:mdi.minus-circle
最大化:fa5s.expand-alt
关闭:mdi.close-circle 已解决
23.增加最大搜索结果展示数量设置 已解决
24.加入评论信息详情查看
用户名:
id:
用户头像:
主页地址:
评论时间:
评论内容:
//复制评论、访问主页 已实现
25.托盘注册 已实现
26.修复单击按钮多次弹出对话框问题 已修复 信号与槽问题
27.推荐收藏的歌曲无法取消收藏 已修复
28.歌词显示时时渲染 先计算label4的歌词内容,再计算这句歌词持续的时间,时间计算的具体操作是:(下一句歌词time-当前歌词time)=current_time,使用不同颜色的label覆盖当前歌词,使用current_time/歌词数量=每个歌词的速度
29.加入“我的歌单” 接口:http://music.xiongsihao.com/api.php post types: userlist uid: 9499119 已加入
使用新窗口
获取uid:
1、首先点我(http://music.163.com/)打开网易云音乐官网
2、然后点击页面右上角的“登录”,登录您的账号
3、点击您的头像,进入我的主页
4、此时浏览器地址栏 /user/home?id= 后面的数字就是您的网易云 UID 已加入
30.加入“歌单同步”按钮 已加入
31.欢迎你:{}
切换uid 退出同步 已加入
20220219
32.左击用户头像图片放大
33.多线程加载词图 已实现
34.用户歌单推荐加入首页和尾页 已加入
35.音乐播放逻辑问题(将整个歌单加入播放列表,默认循环播放)
36.主页歌曲推荐显示问题 已修复
37.整体toolTip 已加入
38.音量调节问题 已解决
39.评论数量不显示 不修了
40.歌曲列表右击事件 已修复
41.本地音乐-添加本地音乐 已加入
42.设置桌面歌词字号,预览
43.播放器mini模式 已加入
44.歌词处理逻辑 已更改
45.歌曲没有版权会停止播放
46.短链接分享歌曲 已更改
47.托盘右击事件,【播放控制(上一首、暂停、下一首)】【音量调节】【切换播放模式】【桌面歌词打开/关闭】【设置】【退出】 已加入部分
48.取消收藏失败
49.歌单列表 已加入
50.歌单音乐删除
51.本地音乐全部播放,上一曲下一曲切换问题 已解决
52.分享歌曲使用二维码 已加入
53.托盘图标关闭-最小化/关闭/记住选择 已加入
54.歌曲右击搜索歌曲/歌手/专辑 清空列表 已加入
55.防止程序多开 已加入
56.歌曲没有版权处理,自动播放下一曲 已解决
57.点完下载管理后,歌曲右击事件有时候不显示
58.托盘加入“歌曲播放控制” 已加入
59.播放收藏音乐会显示没版权,其实是可以播放的 已解决
60.播放本地音乐无法加到歌单中 已解决