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)  # 启动或重新启动定时器

这里可以看到
这里注意我注释了很多代码,他们都是不能正常之执行的。

我的本意是设置定时,歌曲播放完成后自动播放下一曲。那么有以下方法:

  1. sleep睡眠机制,很显然是行不通的,程序睡眠,歌曲也就不能播放。
  2. 多线程机制sleep单个线程,pyqt是不允许多线程机制的,我百度了下早期的python会直接报错,但是我这里没有报错,即使不用sleep睡眠,程序也会直接卡死。但是创建的子线程能够正常输出结果。
  3. threading定时器,这个定时器的原理也是创建一个子线程,所以它仍然不可用。
  4. 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实现在线音乐播放器(懒皮鼠音乐)相关推荐

  1. android 音乐播放器设计,基于Android音乐播放器设计的实现毕业论文.pdf

    摘要 随着手机的智能化以及网络的普及和应用,人类将进入移动互联 网的新时代.在国内,随着4G牌照的下发,三大运行商也在加紧抢 占移动互联网领域的制高点.在此过程中,人们对新一代移动互联终 端设备的功能 ...

  2. 单片机音乐播放器课程设计C语言,单片机音乐播放器课程设计中音乐代码怎么弄...

    单片机音乐播放器课程设计中音乐代码怎么弄 答案:2  信息版本:手机版 解决时间 2019-10-06 13:16 已解决 2019-10-06 02:07 单片机音乐播放器课程设计中音乐代码怎么弄 ...

  3. 开源音乐播放器_使用开源音乐播放器设计生活中的配乐

    开源音乐播放器 我们围绕着自己的个人配乐. 我们的音乐让我们想起了人生中最重要的时刻,并帮助我们塑造了自己的感受和看法. 让音乐播放器支持自由选择音乐的播放方式,同时又不影响播放质量非常重要,而且我一 ...

  4. android 音乐播放器ui界面设计音乐播放器毕业设计。Android studio编译,项目有源码和apk

    使用Android Studio开发一个简易的音乐播放器 界面图: 视频展示: android 音乐播放器ui界面设计音乐播放器毕业设计.Android studio编译 项目下载: android音 ...

  5. 有界面的python音乐播放器(可下载音乐)

    tkinter+pygame+spider实现音乐播放器 1.确定页面 SongSheet ------ 显示歌单 MusicCtrl ------显示音乐一些控件(播放,跳转,音量调节) Searc ...

  6. Android音乐播放器歌手分类,本地音乐:歌曲分类模式比较_软件资讯软件评测-中关村在线...

    ■歌曲分类模式比较 用户需要在平板电脑本地存取歌曲,当歌曲的数量达到一个比较大的量级之后,如果没有针对本地音乐较大数量级的歌曲进行有效的分类,那么在您需要寻找一首特定歌曲的时候,您可能会遇到很大的麻烦 ...

  7. python音乐播放器代码_pygame编写音乐播放器的实现代码示例

    1.准备工作 ide:pycharm python:3.7 三方包:pygame.pyinstaller.mutagen 几首mp3格式的歌 2.开始 2.1 设计说明 1.包含 上一首.下一首.暂停 ...

  8. html制作在线视频音乐播放器,用html5制作音乐播放器,这3款就足够了!

    用HTML5结合Jquery做一个简易版的音乐播放器 代码展示: 三生草 var sum = 1; function ssss(a) { var s = document.getElementById ...

  9. 史上最牛逼的音乐播放器—仿网易云音乐(已开源)

    前言:音乐播放器倒见过不少,做到几乎和官方网易云音乐安卓版差不多的,还是头第一回见.aa112901 的这款仿网易云音乐安卓版客户端,很多地方值得我们学习.无论是下载模块,还是换肤模块,还是炫丽的UI ...

最新文章

  1. MySQL_数据库操作语句
  2. POJ 2778 DNA Sequence [AC自动机 + 矩阵快速幂]
  3. 从Vuex的Actions中理解JavaScript的解构赋值
  4. linux script 命令
  5. yolov4负样本_了解各种挂件--帮助读懂YOLOV4
  6. 一个Java对象到底占多大内存?(转)
  7. GraphQL第一个例子
  8. CDATA and comment
  9. java实体null值显示_java反射实现前端接收实体对象,去除“null”字符串(示例代码)...
  10. [vb]利用WScript.Shell对象隐藏cmd命令行运行
  11. 【window操作系统下Github版本的回滚问题】
  12. Java面试个人简历
  13. NXP K60使用IAR烧录教程
  14. 把手机当电脑的摄像头!推荐一软件DroidCam
  15. Overload和Override详解
  16. 360校企培训:安全导论-试卷
  17. python散点图圆形区域_python – Matplotlib;散点图标记,圆内点
  18. 知识付费资源变现小程序源码+可开流量主/带教程
  19. 计算机考研落榜了怎么办,如果,你考研落榜了怎么办?
  20. 162_apt-cyg安装

热门文章

  1. 计算机网络nsi,运行 NSI 服务 Svchost.exe 泄漏内存和非页面缓冲池内存泄漏标记 NSpc...
  2. python3学习(3):ID 遍历爬虫
  3. 单片机与晶振到底有什么关系?
  4. 进一步了解系统I/O
  5. html图片5秒后消失,如何让网页中图片等待5秒再显示_html/css_WEB-ITnose
  6. java后端开发工程师_后端工程师与 Java 工程师的区别?
  7. C语言如何给随机数赋变量,C语言产生随机数序列的方法
  8. Java项目:养老院管理系统(java+SpringBoot+thymeleaf+HTML+Js+mysql)
  9. SpringBoot 2.x 纯手工打造私人网盘项目
  10. java教程 invoke_Java中Method的Invoke方法详细介绍