Python实用工具--全python制作一个音乐下载器

news2025/1/11 5:52:42

前言

又来展示一下关于Python的实用小技巧了,这次就来分享分享–如何用Python来制作一个音乐下载器

做这个有什么用啊,我只能说,可以免费下载歌曲啊,这样就能每月保住自己钱包咯

请添加图片描述

效果展示

基本界面

图片以及文字都是可以自己更改的

不会更改的可以私信我教你

在这里插入图片描述

下载效果

在这里插入图片描述

在这里插入图片描述

基本代码

所需模块

import os
import re
from urllib import parse
import requests
import sys
from PyQt5.QtGui import QIcon, QPixmap, QTextCursor
from PyQt5 import QtWidgets
from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QDesktopServices
from music import Ui_Form  # 界面

基本界面

class Pyqt5_Music(QtWidgets.QWidget, Ui_Form):
    def __init__(self):
        super(Pyqt5_Music, self).__init__()
        self.setupUi(self)
        self.init()
        self.setWindowTitle("音乐下载器")
        self.setWindowIcon(QIcon('音乐_填充.svg'))
        self.lineEdit.setText("")
        self.lineEdit_2.setText("")
        self.lineEdit_3.setText("")
        pix = QPixmap('源码领取+V')
        self.label_6.setPixmap(pix)
        self.label_6.setScaledContents(True)

    def init(self):
        self.pushButton.clicked.connect(self.song_ok)
        self.pushButton_2.clicked.connect(self.main_exit)
        self.pushButton_3.clicked.connect(self.show_child)

    def song_ok(self):
        music_info_list = self.get_music_info()
        music_data = self.get_purl(music_info_list)
        self.save_music_mp3(music_data)

    def main_exit(self):
        sys.exit(self)

    def show_child(self):
        QDesktopServices.openUrl(QUrl("https://www.***.com/opus/802136240019210264?spm_id_from=333.999.0.0"))

搜索歌曲

    def get_music_info(self):
        music_info_list = []
        name = self.lineEdit.text()
        page = self.lineEdit_2.text()
        num = self.lineEdit_3.text()
        headers['Referer'] = 'http://www.部分网址需要打码,需要的话可以点击文末名片获取.cn/search/list?key=' + parse.quote(name)
        url = f'http:/部分网址需要打码,需要的话可以点击文末名片获取/api/www/search/searchMusicBykeyWord?key={name}&pn={page}&rn={num}'
        response = requests.get(url, headers=headers)
        music_data = response.json()  # 获取到的是字符串
        music_list = music_data['data']['list']
        for music in music_list:
            music_name = music['name']  # 歌曲的名字
            singer_name = music['artist']  # 歌手的名字
            songmid = music['rid']
            media_mid = music['album']
            music_info_list.append((music_name, singer_name, songmid, media_mid))
        return music_info_list

获取歌曲url

    def get_purl(self, a):
        music_data = []
        for music in a:
            music_name = music[0]
            singer_name = music[1]
            songmid = music[2]
            purl = f'https://部分网址需要打码,需要的话可以点击文末名片获取/music/playUrl?mid={songmid}&type=convert_url3&br=320kmp3'
            full_media_url = requests.get(purl, headers=headers).json()['data']['url']
            music_name = re.sub(r'[\/:*?"<>|]', '', music_name)
            music_data.append(
                {
                    'music_name': music_name,
                    'singer_name': singer_name,
                    'full_media_url': full_media_url
                }
            )
        return music_data

保存歌曲

判断是否有歌曲下载文件夹

    def save_music_mp3(self, b):
        if not os.path.exists('歌曲下载'):  

如果没有 创建歌曲下载文件夹

            os.mkdir('歌曲下载')  
        for music in b:
            music_name = music['music_name']
            singer_name = music['singer_name']
            full_url = music['full_media_url']
            music_response = requests.get(full_url).content
            with open('歌曲下载/%s-%s.mp3' % (music_name, singer_name), 'wb')as fp:
                fp.write(music_response)
                print("[%s]保存成功!" % music_name)
                self.textEdit.append("[%s-%s.mp3]保存成功!" % (music_name, singer_name))
                cursor = self.textEdit.textCursor()
                cursor.movePosition(QTextCursor.End)  # 还可以有别的位置
                self.textEdit.setTextCursor(cursor)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    my_show = Pyqt5_Music()
    my_show.show()
    sys.exit(app.exec_())

其他代码

这里包含了一些字体细节代码,还有其他的一些小细节

完整代码获取点击文末名片哦

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(724, 328)
        self.label = QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(80, 100, 101, 16))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(Form)
        self.label_2.setGeometry(QtCore.QRect(80, 130, 101, 16))
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(Form)
        self.label_3.setGeometry(QtCore.QRect(80, 160, 101, 16))
        self.label_3.setObjectName("label_3")
        self.lineEdit = QtWidgets.QLineEdit(Form)
        self.lineEdit.setGeometry(QtCore.QRect(190, 100, 201, 20))
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit_2 = QtWidgets.QLineEdit(Form)
        self.lineEdit_2.setGeometry(QtCore.QRect(190, 130, 201, 20))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.lineEdit_3 = QtWidgets.QLineEdit(Form)
        self.lineEdit_3.setGeometry(QtCore.QRect(190, 160, 201, 20))
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.label_4 = QtWidgets.QLabel(Form)
        self.label_4.setGeometry(QtCore.QRect(140, 30, 151, 20))
        font = QtGui.QFont()
        font.setFamily("幼圆")
        font.setPointSize(10)
        self.label_4.setFont(font)
        self.label_4.setObjectName("label_4")
        self.label_5 = QtWidgets.QLabel(Form)
        self.label_5.setGeometry(QtCore.QRect(240, 70, 101, 16))
        self.label_5.setObjectName("label_5")
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(90, 290, 81, 23))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(Form)
        self.pushButton_2.setGeometry(QtCore.QRect(234, 290, 81, 23))
        self.pushButton_2.setObjectName("pushButton_2")
        self.textEdit = QtWidgets.QTextEdit(Form)
        self.textEdit.setGeometry(QtCore.QRect(60, 190, 361, 91))
        self.textEdit.setObjectName("textEdit")
        self.label_6 = QtWidgets.QLabel(Form)
        self.label_6.setGeometry(QtCore.QRect(470, 70, 200, 200))
        self.label_6.setText("")
        self.label_6.setObjectName("label_6")
        self.pushButton_3 = QtWidgets.QPushButton(Form)
        self.pushButton_3.setGeometry(QtCore.QRect(530, 290, 111, 23))
        self.pushButton_3.setObjectName("pushButton_3")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

最后

今天的分享到这里就结束了,如果需要源码话,看文章末尾名片领取/也可以私信我哈

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/717146.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《动手学深度学习》——线性神经网络

参考资料&#xff1a; 《动手学深度学习》 3.1 线性回归 3.1.1 线性回归的基本元素 样本&#xff1a; n n n 表示样本数&#xff0c; x ( i ) [ x 1 ( i ) , x 2 ( i ) , ⋯ , x d ( i ) ] x^{(i)}[x^{(i)}_1,x^{(i)}_2,\cdots,x^{(i)}_d] x(i)[x1(i)​,x2(i)​,⋯,xd(i)​…

序列化对象

1&#xff1a;对象序列化 以内存为基准&#xff0c;把内存中的对象存储到磁盘文件中去&#xff0c;称为对象序列化。使用到的流是对象字节输出流&#xff1a;ObjectOutputStream 2&#xff1a;对象要序列化&#xff0c;必须实现Serializable序列化接口 2&#xff1a;对象反序…

二十四、HTTPS

文章目录 一、HTTPS&#xff08;一&#xff09;定义&#xff08;二&#xff09;HTTP与HTTPS1.端口不同&#xff0c;是两套服务2.HTTP效率更高&#xff0c;HTTPS更安全 &#xff08;三&#xff09;加密&#xff0c;解密&#xff0c;密钥等概念&#xff08;四&#xff09;为什么要…

【H5】文件下载(javascript)

系列文章 【移动设备】iData 50P 技术规格 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/130604517 【H5】avalon前端数据双向绑定 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/131067187 【H5】安卓自动更新方案&a…

hivesql列转行

原表&#xff1a; 目标表&#xff1a; sql代码&#xff1a; select dp as 日期 ,city_name as 城市, split_part(subject,‘:’,1) as 指标, cast( split_part(subject,‘:’,2) as double ) as 数值 from( select trans_array(2,‘;’,dp,city_name,subject) as (dp,city_na…

探秘高逼格艺术二维码的制作过程-AI绘画文生图

前几天看到几个逼格比较高的二维码&#xff0c;然后自己动手做了一下&#xff0c;给大家看看效果&#xff1a; 1、文生图&#xff08;狮子&#xff09;&#xff1a; 2、文生图&#xff08;城市&#xff09;&#xff1a; 下边将开始介绍怎么做的&#xff0c;有兴趣的可以继续读…

Vault AppRole最佳实现过程

AppRole AppRole身份验证方法允许机器或应用程序使用 Vault 定义的角色进行身份验证。AppRole 的开放式设计支持使用不同的工作流和配置来应对大量应用程序。这种身份验证方法主要是面向自动化工作流程(机器和服务)设计的,对人类操作者不太有用。 “AppRole”代表一组 Vau…

大数据Doris(五十六):RESOTRE数据恢复

文章目录 RESOTRE数据恢复 一、RESTORE数据恢复原理 二、RESTORE 数据恢复语法 三、RESOTRE数据恢复案例 1、在 Doris 集群中创建 mydb_recover 库 2、执行如下命令恢复数据 3、查看 restore 作业的执行情况 四、注意事项 RESOTRE数据恢复 Doris 支持BACKUP方式将当前…

力扣 40. 组合总和 II

题目来源&#xff1a;https://leetcode.cn/problems/combination-sum-ii/description/ C题解&#xff1a; 这道题的难点在于解集中不能包含重复的组合。如果用set去重会造成超时&#xff0c;所以只能在单层递归逻辑中处理。通过识别下一个数与当前数是否相同&#xff0c;来修改…

抖音小程序--开启沙盒模式后一直报,获取白名单失败:您没有权限访问此应用

一. 出现问题 按照抖音开发文档创建沙盒环境&#xff0c;然后替换appid后一直报无权限&#xff0c;如下图&#xff1a; 最后才发现&#xff0c;登录抖音开发工具的账户必须是超级管理员账户&#xff0c;添加的协助开发者&#xff0c;就算给了全部权限&#xff0c;也依然会报上面…

Navicat 入选中国信通院发布的《中国数据库产业图谱(2023)》

7 月 4 日&#xff0c;2023 年可信数据库发展大会主论坛在北京国际会议中心成功召开。会上&#xff0c;中国信息通信研究院正式发布《中国数据库产业图谱&#xff08;2023&#xff09;》。作为中国数据库生态工具供应商&#xff0c;凭借易用、稳定、可靠的产品力&#xff0c;以…

【C++】4.工具:读取yaml配置信息

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍读取yaml配置信息。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&…

web学习1--maven--项目管理工具

写在前面&#xff1a; 这学期搞主攻算法去了&#xff0c;web的知识都快忘了。开始复习学习了。 文章目录 maven介绍功能介绍maven安装jar包搜索仓库 pom文件项目介绍父工程依赖管理属性控制可选依赖构建 依赖管理依赖的传递排除依赖可选依赖 maven生命周期分模块开发模块聚合…

产品的帮助中心怎么建设?关于帮助文档的7个小技巧

用户使用产品的过程中&#xff0c;常常会遇到与产品使用相关的问题。这时候&#xff0c;用户通常会面临三个选择&#xff1a;1.寻找客服的帮助 2.阅读产品帮助文档 3.放弃使用产品。 显然&#xff0c;对于企业而言&#xff0c;当然是希望能够帮助用户解决问题&#xff0c;使其…

shiro入门

1、概述 Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架。借助 Shiro 您可以快速轻松地保护任何应用程序一一从最小的移动应用程序到最大的 Web 和企业应用程序。 作用&#xff1a;Shiro可以帮我们完成 &#xff1a;认证、授权、加密、会话管理、与 Web 集成、…

车载通信,来看看SOA架构通信如何跨系统的

SOA车载跨系统通信 在车载系统中实现跨系统通信时&#xff0c;SOA架构&#xff08;Service-Oriented Architecture&#xff0c;面向服务的架构&#xff09;可以提供一种有效的解决方案。以下是一种基于SOA的车载跨系统通信的概述&#xff1a; 定义服务接口&#xff1a;首先&a…

2023年无线蓝牙耳机排行榜,十款无线蓝牙耳机品牌推荐

蓝牙耳机作为现代生活必备的电子产品之一&#xff0c;我们在选购时的选择就显得尤为重要。随着各大科技公司对蓝牙耳机功能的不断完善&#xff0c;用户对于耳机的期望也越来越高&#xff0c;音质、性能、降噪、舒适度等方面都成为了用户选择蓝牙耳机时考虑的因素。接下来我们一…

从零开始 Spring Boot 57:JPA中的一对多关系

从零开始 Spring Boot 57&#xff1a;JPA中的一对多关系 图源&#xff1a;简书 (jianshu.com) 在上篇文章中我们介绍了如何在 JPA 中实现实体的一对一关系&#xff0c;在关系型数据库设计中&#xff0c;除了一对一关系&#xff0c;还存在一对多关系。本篇文章介绍如何在 JPA 中…

Android仿淘宝、京东、拼多多搜索历史

详情见代码 &#xff1a;https://github.com/yixiaolunhui/FSearchHistory

计算机网络概述(一)

因特网概述 网络&#xff0c;互联网与因特网的区别联系&#xff1a; 以上是使用有线和无线链路连接的两个网络。那么&#xff0c;要让这两个网络连接起来&#xff0c;就需要路由器。若干个网络通过多个路由器互联起来&#xff0c;就称为了互联网。 因特网是当今世界上最大的互…