python实现在线音乐播放器(懒皮鼠音乐)
python实现在线音乐播放器(懒皮鼠音乐)
利用qt设计requests库实现在线音乐播放
文章目录
- python实现在线音乐播放器(懒皮鼠音乐)
- 前言
- 一、qt设计师设计界面
- 二、使用步骤
- 1.引入库
- 2.读入数据
- 3.控件信号函数绑定相应槽函数
- 4.搜索获取音乐链接并播放
- 完整代码
前言
本文主要提供使用python各种库的注意事项,内容仅供参考。
提示:以下是本篇文章正文内容,下面案例可供参考
一、qt设计师设计界面
将设计的ui生成py文件
可以参照:https://blog.csdn.net/zq1391345114/article/details/120104695
二、使用步骤
1.引入库
代码如下(示例):
from PySide2.QtWidgets import QApplication,QWidget
from PySide2.QtCore import QTimer#定时器
from PySide2.QtGui import QColor,QIcon
import os
import re
import requests
import json
import urllib
from ui_ma import Ui_Form
from PySide2.QtWidgets import QMessageBox
2.读入数据
代码如下(示例):
def __init__(self):#if not os.path.exists('data'):#判断文件夹是否存在os.makedirs('data\music',exist_ok=True)super().__init__()# 使用ui文件导入定义界面类self.ui = Ui_Form()# 初始化界面self.ui.setupUi(self)
该处省略绑定使用界
3.控件信号函数绑定相应槽函数
代码如下(示例):
self.ui.pushButton.clicked.connect(self.sousuo)#sousuo不可以带括号否则调试调用
self.ui.pushButton_2.clicked.connect(self.my_love)
self.ui.pushButton_3.clicked.connect(self.xiazai)
self.ui.pushButton_4.clicked.connect(lambda :self.xia(0))
self.ui.pushButton_5.clicked.connect(lambda :self.shang(0))
self.ui.pushButton_6.clicked.connect(self.no_love)
self.ui.pushButton_7.clicked.connect(lambda: self.shang(1))
self.ui.pushButton_8.clicked.connect(lambda: self.xia(1))
self.ui.pushButton_9.clicked.connect(self.exit)
self.ui.lineEdit.returnPressed.connect(self.sousuo)
"""************************************************"""
self.ui.listWidget_2.currentItemChanged.connect(self.change)#列表选中行修改信号
self.ui.listWidget.currentItemChanged.connect(self.change)self.ui.listWidget.itemClicked.connect(lambda: self.bofang(0)) # 单击播放
#self.ui.listWidget.itemDoubleClicked.connect(self.my_love) # 双击喜欢
#self.ui.listWidget_2.setCurrentRow(0)
#self.ui.listWidget_2.itemDoubleClicked.connect(self.no_love)#双击取消收藏
self.ui.listWidget_2.itemPressed.connect(lambda: self.bofang(1)) # 单击播放
提示:该处使用了lambda表达式表示匿名函数传参数
4.搜索获取音乐链接并播放
在各个音乐网站获取歌曲播放链接及时长,采用定时的方式播放下一曲音乐,这里是采用qt中的QwebEngineView实现在线播放
代码如下(示例):
def bofang(self,m):if m==0:self.ui.web.setUrl("")#暂停第二界面播放i = self.ui.listWidget.currentRow() # 获取选中序号m, s = self.music[i][2].strip().split(":")Time = int(m) * 60 + int(s) # 获取歌曲时长rid = self.music[i][1]url = self.huoqu(rid)self.ui.webview.setUrl(url)self.timer = QTimer()#timer.stop()self.timer.timeout.connect(lambda:self.xia(0))#定时器绑定函数#timer.setSingleShot(True)#设置单次定时#QTimer.singleShot((Time+1)*1000, self.xia)#定时器self.timer.start((Time+2)*1000)#启动或重新启动定时器else:self.ui.webview.setUrl("")#暂停第一界面播放i = self.ui.listWidget_2.currentRow() # 获取选中序号m, s = self.mylove[i][2].strip().split(":")Time = int(m) * 60 + int(s) # 获取歌曲时长rid = self.mylove[i][1]url = self.huoqu(rid)self.ui.web.setUrl(url)self.timer = QTimer()self.timer.timeout.connect(lambda:self.xia(1)) # 定时器绑定函数self.timer.start((Time + 2) * 1000) # 启动或重新启动定时器
这里可以看到
这里注意我注释了很多代码,他们都是不能正常之执行的。
我的本意是设置定时,歌曲播放完成后自动播放下一曲。那么有以下方法:
- sleep睡眠机制,很显然是行不通的,程序睡眠,歌曲也就不能播放。
- 多线程机制sleep单个线程,pyqt是不允许多线程机制的,我百度了下早期的python会直接报错,但是我这里没有报错,即使不用sleep睡眠,程序也会直接卡死。但是创建的子线程能够正常输出结果。
- threading定时器,这个定时器的原理也是创建一个子线程,所以它仍然不可用。
- QTimer定时器,它是pyqt中的定时器,可用。在我的代码中有注释掉一个QTimer,是因为他是一个成员变量,当点下一曲后上一个定时器还存在,所以后面就会出现歌曲没有播放完就下一曲的情况,解决方法是采用类变量。所有定时器共用一个内存。
其次播放过程中实现动态突出正在播放的歌曲那么就要采用currentItemChanged信号
def change(self,item2,item1):item2.setBackgroundColor(QColor("red"))#设置选中行背景颜色if item1:item1.setBackgroundColor(QColor(0,0,0,0)) # 设置选中行背景颜色
这里设置了判断上一个item是否被选中。
## 5.下载
代码如下(示例):
def xiazai(self):i = self.ui.listWidget.currentRow() # 获取选中序号rid =self.music[i][1]downloadurl=self.huoqu(rid) # 根据rid获取urltry:urllib.request.urlretrieve(url=downloadurl, filename='data/music/{}.mp3'.format(self.music[i][0]))QMessageBox.information(self,"消息", "下载成功.")except:QMessageBox.information(self,"消息", "下载错误,产生异常.")
提示:这里下载路径不存在就会下载失败,所以我们在开始就要判断下载路径是否存在,不存在就要利用代码os.makedirs('data\music',exist_ok=True)
新建。
完整代码
提示:源码仅供参考。
from PySide2.QtWidgets import QApplication,QWidget
from PySide2.QtCore import QTimer#定时器
from PySide2.QtGui import QColor,QIcon
import os
import re
import requests
import json
import urllib
from ui_ma import Ui_Form
from PySide2.QtWidgets import QMessageBoxclass MainWindow(QWidget):music={}mylove={}def __init__(self):#if not os.path.exists('data'):#判断文件夹是否存在os.makedirs('data\music',exist_ok=True)super().__init__()# 使用ui文件导入定义界面类self.ui = Ui_Form()# 初始化界面self.ui.setupUi(self)self.shuaxin()# 使用界面定义的控件,也是从ui里面访问self.ui.pushButton.clicked.connect(self.sousuo)#sousuo不可以带括号否则调试调用self.ui.pushButton_2.clicked.connect(self.my_love)self.ui.pushButton_3.clicked.connect(self.xiazai)self.ui.pushButton_4.clicked.connect(lambda :self.xia(0))self.ui.pushButton_5.clicked.connect(lambda :self.shang(0))self.ui.pushButton_6.clicked.connect(self.no_love)self.ui.pushButton_7.clicked.connect(lambda: self.shang(1))self.ui.pushButton_8.clicked.connect(lambda: self.xia(1))self.ui.pushButton_9.clicked.connect(self.exit)self.ui.lineEdit.returnPressed.connect(self.sousuo)"""************************************************"""self.ui.listWidget_2.currentItemChanged.connect(self.change)#列表选中行修改信号self.ui.listWidget.currentItemChanged.connect(self.change)self.ui.listWidget.itemClicked.connect(lambda: self.bofang(0)) # 单击播放#self.ui.listWidget.itemDoubleClicked.connect(self.my_love) # 双击喜欢#self.ui.listWidget_2.setCurrentRow(0)#self.ui.listWidget_2.itemDoubleClicked.connect(self.no_love)#双击取消收藏self.ui.listWidget_2.itemPressed.connect(lambda: self.bofang(1)) # 单击播放def change(self,item2,item1):item2.setBackgroundColor(QColor("red"))#设置选中行背景颜色if item1:item1.setBackgroundColor(QColor(0,0,0,0)) # 设置选中行背景颜色def exit(self):self.ui.webview.setUrl("")self.ui.web.setUrl("")self.timer.stop()def no_love(self):i=self.ui.listWidget_2.currentRow()for j in range(len(self.mylove)-i-1):self.mylove[i]=self.mylove[i+1]i+=1del self.mylove[i]s=open("data/my_love(保存收藏音乐信息,请勿随意修改).txt","w")for j in range(len(self.mylove)):s.write(str(self.mylove[j]))s.close()self.shuaxin()def my_love(self):i = self.ui.listWidget.currentRow() # 获取选中序号j=len(self.mylove)self.mylove[j]=self.music[i]s=open("data/my_love(保存收藏音乐信息,请勿随意修改).txt",'a')s.write(str(self.music[i]))s.close()self.ui.listWidget_2.addItem('【{}】'.format(j+1) + self.mylove[j][0])def shuaxin(self):self.ui.listWidget_2.clear()if os.path.exists("data/my_love(保存收藏音乐信息,请勿随意修改).txt"):s=open("data/my_love(保存收藏音乐信息,请勿随意修改).txt",'r')content=s.read()s.close()p = re.compile(r'\[.*?\]')i=0for one in p.findall(content):self.mylove[i]=eval(one)#将字符串转换成列表self.ui.listWidget_2.addItem('【{}】'.format(i + 1)+self.mylove[i][0])i+=1def sousuo(self): # 获取下载ridmusicname = self.ui.lineEdit.text()encodename = urllib.parse.quote(musicname) # 对字符串进行编码url = 'https://www.kuwo.cn/api/www/search/searchMusicBykeyWord'headers = {"Cookie": "Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1611813721; _ga=GA1.2.1711987833.1611813721; _gid=GA1.2.1936491096.1611813721; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1611813751; _gat=1; kw_token=AMJKSZZ014","csrf": "AMJKSZZ014", "Host": "www.kuwo.cn","Referer": "http://www.kuwo.cn/search/list?key={}".format(encodename),"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.53", }data = {"key": "{}".format(musicname), 'pn': 1, "rn": 30, "httpsStatus": 1,"reqId": " f1b198b0-612e-11eb-b682-25ec8c838219"} # 加入后会自动编码res = requests.request('get', url, headers=headers, params=data, timeout=1)dict = json.loads(res.text)if dict['code'] != 200:misicinfo = [{'name': '获取失败,请重试!', 'artist': ''}]else:misicinfo = dict['data']['list']self.ui.listWidget.clear()for i in range(len(misicinfo)):name = misicinfo[i]['name'] + '-' + misicinfo[i]['artist']self.music[i] = [name,misicinfo[i]['rid'],misicinfo[i]['songTimeMinutes']]#组建歌曲信息:名字,rid,时长self.ui.listWidget.addItem( '【{}】'.format(i + 1) + name)#self.ui.listWidget.setCurrentRow(0)#默认选中第一行#self.ui.listWidget.item(1).setBackgroundColor(QColor('red'))#设置颜色def huoqu(self,rid): # 获取urlurl = 'http://www.kuwo.cn/url?'data1 = {"format": "mp3","rid": "{}".format(rid),"response": "url","type": "convert_url3","br": "128kmp3","from": "web","t": 1611821852163,"httpsStatus": 1}header1 = {"User-Agent": "ozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.53"}res1 = requests.get(url, headers=header1, params=data1, timeout=1)return json.loads(res1.text)['url']def xiazai(self):i = self.ui.listWidget.currentRow() # 获取选中序号rid =self.music[i][1]downloadurl=self.huoqu(rid) # 根据rid获取urltry:urllib.request.urlretrieve(url=downloadurl, filename='data/music/{}.mp3'.format(self.music[i][0]))QMessageBox.information(self,"消息", "下载成功.")except:QMessageBox.information(self,"消息", "下载错误,产生异常.")def bofang(self,m):if m==0:self.ui.web.setUrl("")#暂停第二界面播放i = self.ui.listWidget.currentRow() # 获取选中序号m, s = self.music[i][2].strip().split(":")Time = int(m) * 60 + int(s) # 获取歌曲时长rid = self.music[i][1]url = self.huoqu(rid)self.ui.webview.setUrl(url)self.timer = QTimer()#timer.stop()self.timer.timeout.connect(lambda:self.xia(0))#定时器绑定函数#timer.setSingleShot(True)#设置单次定时#QTimer.singleShot((Time+1)*1000, self.xia)#定时器self.timer.start((Time+2)*1000)#启动或重新启动定时器else:self.ui.webview.setUrl("")#暂停第一界面播放i = self.ui.listWidget_2.currentRow() # 获取选中序号m, s = self.mylove[i][2].strip().split(":")Time = int(m) * 60 + int(s) # 获取歌曲时长rid = self.mylove[i][1]url = self.huoqu(rid)self.ui.web.setUrl(url)self.timer = QTimer()self.timer.timeout.connect(lambda:self.xia(1)) # 定时器绑定函数self.timer.start((Time + 2) * 1000) # 启动或重新启动定时器def xia(self,m):if m==0:i = self.ui.listWidget.currentRow()+1 # 获取选中序号if i>=self.ui.listWidget.count():#判断是否是最后一曲i=0self.ui.listWidget.setCurrentRow(i)else:i=self.ui.listWidget_2.currentRow()+1if i>=self.ui.listWidget_2.count():#判断是否是最后一曲i=0self.ui.listWidget_2.setCurrentRow(i)self.bofang(m)def shang(self,m):if m==0:i = self.ui.listWidget.currentRow()-1 # 获取选中序号if i<0:#判断是否是第一曲i=self.ui.listWidget.count()-1self.ui.listWidget.setCurrentRow(i)#修改选中项else:i = self.ui.listWidget_2.currentRow() - 1 # 获取选中序号if i < 0: # 判断是否是第一曲i = self.ui.listWidget_2.count() - 1self.ui.listWidget_2.setCurrentRow(i) # 修改选中项self.bofang(m)
app = QApplication([])
mainw = MainWindow()
mainw.show()
app.exec_()
微信关注公众号懒皮鼠
python实现在线音乐播放器(懒皮鼠音乐)相关推荐
- android 音乐播放器设计,基于Android音乐播放器设计的实现毕业论文.pdf
摘要 随着手机的智能化以及网络的普及和应用,人类将进入移动互联 网的新时代.在国内,随着4G牌照的下发,三大运行商也在加紧抢 占移动互联网领域的制高点.在此过程中,人们对新一代移动互联终 端设备的功能 ...
- 单片机音乐播放器课程设计C语言,单片机音乐播放器课程设计中音乐代码怎么弄...
单片机音乐播放器课程设计中音乐代码怎么弄 答案:2 信息版本:手机版 解决时间 2019-10-06 13:16 已解决 2019-10-06 02:07 单片机音乐播放器课程设计中音乐代码怎么弄 ...
- 开源音乐播放器_使用开源音乐播放器设计生活中的配乐
开源音乐播放器 我们围绕着自己的个人配乐. 我们的音乐让我们想起了人生中最重要的时刻,并帮助我们塑造了自己的感受和看法. 让音乐播放器支持自由选择音乐的播放方式,同时又不影响播放质量非常重要,而且我一 ...
- android 音乐播放器ui界面设计音乐播放器毕业设计。Android studio编译,项目有源码和apk
使用Android Studio开发一个简易的音乐播放器 界面图: 视频展示: android 音乐播放器ui界面设计音乐播放器毕业设计.Android studio编译 项目下载: android音 ...
- 有界面的python音乐播放器(可下载音乐)
tkinter+pygame+spider实现音乐播放器 1.确定页面 SongSheet ------ 显示歌单 MusicCtrl ------显示音乐一些控件(播放,跳转,音量调节) Searc ...
- Android音乐播放器歌手分类,本地音乐:歌曲分类模式比较_软件资讯软件评测-中关村在线...
■歌曲分类模式比较 用户需要在平板电脑本地存取歌曲,当歌曲的数量达到一个比较大的量级之后,如果没有针对本地音乐较大数量级的歌曲进行有效的分类,那么在您需要寻找一首特定歌曲的时候,您可能会遇到很大的麻烦 ...
- python音乐播放器代码_pygame编写音乐播放器的实现代码示例
1.准备工作 ide:pycharm python:3.7 三方包:pygame.pyinstaller.mutagen 几首mp3格式的歌 2.开始 2.1 设计说明 1.包含 上一首.下一首.暂停 ...
- html制作在线视频音乐播放器,用html5制作音乐播放器,这3款就足够了!
用HTML5结合Jquery做一个简易版的音乐播放器 代码展示: 三生草 var sum = 1; function ssss(a) { var s = document.getElementById ...
- 史上最牛逼的音乐播放器—仿网易云音乐(已开源)
前言:音乐播放器倒见过不少,做到几乎和官方网易云音乐安卓版差不多的,还是头第一回见.aa112901 的这款仿网易云音乐安卓版客户端,很多地方值得我们学习.无论是下载模块,还是换肤模块,还是炫丽的UI ...
最新文章
- MySQL_数据库操作语句
- POJ 2778 DNA Sequence [AC自动机 + 矩阵快速幂]
- 从Vuex的Actions中理解JavaScript的解构赋值
- linux script 命令
- yolov4负样本_了解各种挂件--帮助读懂YOLOV4
- 一个Java对象到底占多大内存?(转)
- GraphQL第一个例子
- CDATA and comment
- java实体null值显示_java反射实现前端接收实体对象,去除“null”字符串(示例代码)...
- [vb]利用WScript.Shell对象隐藏cmd命令行运行
- 【window操作系统下Github版本的回滚问题】
- Java面试个人简历
- NXP K60使用IAR烧录教程
- 把手机当电脑的摄像头!推荐一软件DroidCam
- Overload和Override详解
- 360校企培训:安全导论-试卷
- python散点图圆形区域_python – Matplotlib;散点图标记,圆内点
- 知识付费资源变现小程序源码+可开流量主/带教程
- 计算机考研落榜了怎么办,如果,你考研落榜了怎么办?
- 162_apt-cyg安装
热门文章
- 计算机网络nsi,运行 NSI 服务 Svchost.exe 泄漏内存和非页面缓冲池内存泄漏标记 NSpc...
- python3学习(3):ID 遍历爬虫
- 单片机与晶振到底有什么关系?
- 进一步了解系统I/O
- html图片5秒后消失,如何让网页中图片等待5秒再显示_html/css_WEB-ITnose
- java后端开发工程师_后端工程师与 Java 工程师的区别?
- C语言如何给随机数赋变量,C语言产生随机数序列的方法
- Java项目:养老院管理系统(java+SpringBoot+thymeleaf+HTML+Js+mysql)
- SpringBoot 2.x 纯手工打造私人网盘项目
- java教程 invoke_Java中Method的Invoke方法详细介绍