极简随机音乐播放器

极简随机音乐播放器

说明

主要功能:
1.音乐的在线播放
2.连接到了网易云音乐引擎
软件架构:

  1. 播放器使用PyQt5编写
  2. 音乐接口来自于UomgAPI(https://api.uomg.com/), 连接到了网易云音乐引擎
    主要技术路线:
  3. 通过音乐引擎随机获取音乐
  4. 采用PyQt5对音乐进行播放
  5. 通过窗体对音乐播放进行控制
    主体框架:
  6. python
  7. PyQt5
  8. requests
    工作:
    1.python窗体开发、样式调整
    2.窗体音乐控制: 播放、下一首、进度条展示等
    3.调用音乐接口 ,发送 post 接口请求 获取 音乐链接
    4.调用PyQt5播放方法,播放音乐
    5. 获取音乐播放时长,编写定时器,当播放完毕,获取下一个音乐的播放链接,然后进行播放。

效果

在这里插入图片描述

部分代码

完整代码 下载 去这个链接
https://download.csdn.net/download/qq_35385687/85491514

# coding:utf-8
# 极简随机音乐播放器

from PyQt5 import QtWidgets
from PyQt5 import QtGui
from PyQt5 import QtCore
from PyQt5.QtMultimedia import QMediaContent,QMediaPlayer
# from PySide2 import QtWidgets
# from PySide2 import QtGui
# from PySide2 import QtCore
# from PySide2.QtMultimedia import QMediaContent
# from PySide2.QtMultimedia import QMediaPlayer
import qtawesome as qta
import requests,traceback

class Music(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setFixedSize(400,200)
        self.setWindowTitle("极简随机音乐播放器")
        self.init_ui()
        self.custom_style()
        self.playing = False # 播放状态初始化为否
        self.player = QMediaPlayer(self)

        self.timer = QtCore.QTimer()
        self.timer.setInterval(1000)
        self.timer.start()
        self.timer.timeout.connect(self.check_music_status)

    # 设置样式
    def custom_style(self):
        self.setStyleSheet('''
            #main_widget{
                border-radius:5px;
            }
            #play_btn,#pervious_btn,#next_btn{
                border:none;
            }
            #play_btn:hover,#pervious_btn:hover,#next_btn:hover{
                background:gray;
                border-radius:5px;
                cursor:pointer;
            }
        ''')
        self.close_btn.setStyleSheet('''
            QPushButton{
                background:#F76677;
                border-radius:5px;
                }
            QPushButton:hover{
                background:red;
                }''')
        self.status_label.setStyleSheet('''
            QLabel{
                background:#F7D674;
                border-radius:5px;
                }
        ''')

    # 初始化UI界面
    def init_ui(self):
        # 窗口布局
        self.main_widget = QtWidgets.QWidget()
        self.main_widget.setObjectName("main_widget")
        self.main_layout = QtWidgets.QGridLayout()
        self.main_widget.setLayout(self.main_layout)

        # 标题
        self.title_lable = QtWidgets.QLabel("极简随机音乐播放器")

        # 关闭按钮
        self.close_btn = QtWidgets.QPushButton("")  # 关闭按钮
        self.close_btn.clicked.connect(self.close_btn_event)
        self.close_btn.setFixedSize(15,15)

        # 音乐状态按钮
        self.status_label = QtWidgets.QLabel("")
        # self.swith_btn.clicked.connect(self.swith_background)
        self.status_label.setFixedSize(15,15)

        # 播放按钮
        play_icon = qta.icon("fa.play-circle",)
        self.play_btn = QtWidgets.QPushButton(play_icon,"")
        self.play_btn.setIconSize(QtCore.QSize(80, 80))
        self.play_btn.setFixedSize(82,82)
        self.play_btn.setObjectName("play_btn")
        self.play_btn.clicked.connect(self.play_music)

        # 下一首按钮
        next_icon = qta.icon("fa.play-circle-o")
        self.next_btn = QtWidgets.QPushButton(next_icon,"")
        self.next_btn.setIconSize(QtCore.QSize(80,80))
        self.next_btn.setFixedSize(82,82)
        self.next_btn.setObjectName("next_btn")
        self.next_btn.clicked.connect(self.next_music)

        # 进度条
        self.process_bar = QtWidgets.QProgressBar()
        self.process_value = 0
        self.process_bar.setValue(self.process_value)
        self.process_bar.setFixedHeight(5)
        self.process_bar.setTextVisible(False)

        self.main_layout.addWidget(self.close_btn,0,0,1,1)
        self.main_layout.addWidget(self.title_lable,0,1,1,1)
        self.main_layout.addWidget(self.status_label,1,0,1,1)
        self.main_layout.addWidget(self.play_btn, 1, 1, 1, 1)
        self.main_layout.addWidget(self.next_btn, 1, 2, 1, 1)
        self.main_layout.addWidget(self.process_bar,2,0,1,3)

        self.setCentralWidget(self.main_widget)

        # self.setWindowOpacity(0.9) # 设置窗口透明度
        # self.setAttribute(QtCore.Qt.WA_TranslucentBackground)  # 设置窗口背景透明
        self.setWindowFlag(QtCore.Qt.FramelessWindowHint)  # 隐藏边框

    # 关闭程序
    def close_btn_event(self):
        self.close()

    # 鼠标长按事件
    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            self.m_drag = True
            self.m_DragPosition = event.globalPos() - self.pos()
            event.accept()
            self.setCursor(QtGui.QCursor(QtCore.Qt.OpenHandCursor))

    # 鼠标移动事件
    def mouseMoveEvent(self, QMouseEvent):
        if QtCore.Qt.LeftButton and self.m_drag:
            self.move(QMouseEvent.globalPos() - self.m_DragPosition)
            QMouseEvent.accept()

    # 鼠标释放事件
    def mouseReleaseEvent(self, QMouseEvent):
        self.m_drag = False
        self.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))

    # 播放音乐
    def play_music(self):
        try:
            # 播放音乐
            if self.playing is False:
                self.playing = True # 设置播放状态为是
                self.play_btn.setIcon(qta.icon("fa.pause-circle")) # 设置播放图标
                player_status = self.player.mediaStatus() # 获取播放器状态
                # print("当前播放状态:",player_status)
                if player_status == 6:
                    # 设置状态标签为绿色
                    self.status_label.setStyleSheet('''QLabel{background:#6DDF6D;border-radius:5px;}''')
                    self.player.play()
                else:
                    self.next_music()
            # 暂停音乐
            else:
                # 设置状态为蓝色
                self.status_label.setStyleSheet('''QLabel{background:#0099CC;border-radius:5px;}''')
                self.playing = False
                self.play_btn.setIcon(qta.icon("fa.play-circle"))
                self.player.pause()
        except Exception as e:
            print(repr(e))

    # 下一首音乐
    def next_music(self):
        try:
            # 设置状态为黄色
            self.status_label.setStyleSheet('''
                QLabel{
                    background:#F7D674;
                    border-radius:5px;
                    }
            ''')
            self.playing = True # 设置播放状态为是
            self.play_btn.setIcon(qta.icon("fa.pause-circle")) # 修改播放图标
            self.process_value = 0 # 重置进度值

            # 获取网络歌曲
            self.get_music_thread = GetMusicThread()
            self.get_music_thread.finished_signal.connect(self.init_player)
            self.get_music_thread.start()
        except Exception as e:
            print(traceback.print_exc())

    # 设置播放器
    def init_player(self,url):
        # print("获取到音乐链接:",url)
        content = QMediaContent(QtCore.QUrl(url))
        self.player.setMedia(content)
        self.player.setVolume(50)
        self.player.play()
        self.duration = self.player.duration()  # 音乐的时长
        # 设置状态为绿色
        self.status_label.setStyleSheet('''
            QLabel{
                background:#6DDF6D;
                border-radius:5px;
                }
        ''')

        # 进度条计时器
        self.process_timer = QtCore.QTimer()
        self.process_timer.setInterval(1000)
        self.process_timer.start()
        self.process_timer.timeout.connect(self.process_timer_status)

    # 定时器
    def check_music_status(self):
        player_status = self.player.mediaStatus()
        player_duration = self.player.duration()
        # print("音乐时间:",player_duration)
        # print("当前播放器状态",player_status)
        if player_status == 7:
            self.next_music()

        if player_duration > 0:
            self.duration = player_duration

    # 进度条定时器
    def process_timer_status(self):
        try:
            if self.playing is True:
                self.process_value += (100 / (self.duration/1000))
                # print("当前进度:",self.process_value)
                self.process_bar.setValue(self.process_value)
        except Exception as e:
            print(repr(e))


# 异步子线程获取音乐链接
class GetMusicThread(QtCore.QThread):
    finished_signal = QtCore.pyqtSignal(str)
    # finished_signal = QtCore.Signal(str) # PySide2的使用方法

    def __init__(self,parent=None):
        super().__init__(parent)

    def run(self):
        reps = requests.post("https://api.uomg.com/api/rand.music?format=json")
        # print(reps.json())
        file_url = reps.json()['data']['url']
        self.finished_signal.emit(file_url)


def main():
    import sys
    app = QtWidgets.QApplication(sys.argv)
    gui = Music()
    gui.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
程序最新版请点击:http://blog.putaot.cn/?post=55 功能: 1.可以更换背景图片,并保留 2.可以更换字体颜色,并保留 3.真正实现搜索音乐,搜索到的音乐可以试听,可以添加到列表 4.只要你提供歌曲名和歌手名就可以播放音乐的超级播放器! 5.实现托盘的使用 6.实现文件类型的关联(程序方面还没有做好这个功能,但是可以把歌集文件(.yyu)拉到播放器图标中) 7.实现禁止多开,同时可以让播放器获得焦点 8.可以更换标题 9.更多功能由你发现! 下面是程序的下载地址: http://pan.baidu.com/share/link?shareid=956078571&uk=4161313552 2014-01-19 更新!↓ 1.歌集编辑界面的背景图片同步主界面 更加相称 2.音乐搜索引擎全面更换,更改为搜狗音乐搜索,搜索速度加快 3.主界面去掉头像图片移动歌曲信息的展现位置,界面更加洁 4.修正主界面播放与歌集编辑界面不同步问题! 5.修正主界面和歌集界面已知的bug 6.歌集编辑界面增加对单条歌曲的编辑 7.歌集界面解决单条歌曲无法删除问题 8.歌曲搜索界面完善“添加到歌集”“创建新歌集”功能。 9.歌曲界面删除“下载所选”“播放所选”功能 10.优化程序逻辑,优化利用百度API获得播放地址的模块 11.优化变量传递模式 2014-01-19 随心听.rar 源码下载地址:http://pan.baidu.com/s/1hql2IpQ 程序下载地址:http://pan.baidu.com/s/1hqiKRnY
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳宗德

您的鼓励是我进步的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值