找回密码
  注册[Register]
查看: 363|回复: 8

[python] 带界面的无损高清音乐下载器

[复制链接]
发表于 2021-6-21 15:54 | 显示全部楼层 |阅读模式
禁止求评分、诱导评分、互刷评分、互刷悬赏值,违规者封号处理。
禁止发布推广、邀请码、邀请链接、二维码或者有利益相关的任何推广行为。
所有非原创软件请发布在【精品软件区】,发帖必须按照本版块版规格式发帖。

论坛里音乐下载的好像没有界面,我试着用pyqt5作个界面,看好不好用

[Python] 纯文本查看 复制代码
from mp30620 import Ui_MainWindow
import sys
import os
from PyQt5 import QtCore
from PyQt5.QtCore import QThread, pyqtSignal,QCoreApplication
import requests
import json
 
import random
from PyQt5.QtWidgets import QDesktopWidget, QApplication, QFileDialog, QMessageBox, QTableWidgetItem
from PyQt5 import QtWidgets
 
 
def random_user():
    user1 = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
    user2 = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"
    user3 = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"
    user4 = "Mozilla/5.0 (Windows NT 6.1; rv,2.0.1) Gecko/20100101 Firefox/4.0.1"
    user5 = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)"
    user6 = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)"
    user7 = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"
    user8 = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)"
    user = [user1, user2, user3, user4, user5, user6, user7, user8]
    user = random.choice(user)
    header = {"User-Agent": user}
    return header
 
 
class BackendThread(QThread):
    updata_data = pyqtSignal(str, int)
 
    def __init__(self, parent=None):
        super(BackendThread, self).__init__(parent)
 
    def run_(self, url, muc_name, count):
        self.url = url
 
        self.muc_name = muc_name
        self.count = count
 
    def run(self):
        reponse = requests.get(self.url, headers=random_user())
        try:
            if reponse.status_code == 200:
                with open(self.muc_name, 'wb') as f:
                    for chunk in reponse.iter_content(chunk_size=512):
                        if chunk:
                            f.write(chunk)
                cc=os.path.getsize(self.muc_name)
 
                if cc<=970000:
                    os.remove(self.muc_name)
                    os.remove(self.muc_name.split('.')[-2]+'.lrc')
                    self.updata_data.emit('文件太小,下载失败!', self.count)
                else:
                    self.updata_data.emit('下载成功!', self.count)
 
        except:
            self.updata_data.emit('下载失败!', self.count)
 
 
class firstfrom(QtWidgets.QMainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.radioButton.setChecked(True)
        self.ui.pushButton.clicked.connect(self.star_find)
        self.ui.pushButton_4.clicked.connect(self.down)
        self.ui.pushButton_2.clicked.connect(self.change_dir)
        self.ui.checkBox.clicked.connect(self.check)
        self.ui.pushButton_5.clicked.connect(QCoreApplication.instance().quit)
 
    def check(self):
        if self.ui.tableWidget.rowCount() != 0:
            for i in range(0, self.ui.tableWidget.rowCount()):
                self.ui.tableWidget.item(i, 0).setCheckState(self.ui.checkBox.checkState())
 
    def change_dir(self):
        dir_ = QFileDialog.getExistingDirectory(self, '选择文件夹', '/')
        if dir_ != '':
            self.ui.label_2.setText(dir_)
        else:
            self.ui.label_2.setText('./mp3')
 
    def text_write(self, wrd, cont):
        new_item = QTableWidgetItem(wrd)
        new_item.setTextAlignment(QtCore.Qt.AlignCenter)
        self.ui.tableWidget.setItem(cont, 4, new_item)
 
    def down(self):
        if self.ui.tableWidget.rowCount() == 0:
            msg_box = QMessageBox(QMessageBox.Warning, '警告', '请先搜索歌曲!')
            msg_box.exec_()
        else:
            if not os.path.exists(self.ui.label_2.text()):
                os.mkdir(self.ui.label_2.text())
            kk = self.ui.tableWidget.rowCount()
            for num in range(0, kk):
                if self.ui.tableWidget.item(num, 0).checkState() == 2:
                    new_item = QTableWidgetItem('正在下载')
                    new_item.setTextAlignment(QtCore.Qt.AlignCenter)
                    self.ui.tableWidget.setItem(num, 4, new_item )
                    muc_url = self.ui.tableWidget.item(num, 5).text()
                    muc_lrc = self.ui.tableWidget.item(num, 6).text().encode('utf-8')
                    muc_name = self.ui.label_2.text() + '/' + self.ui.tableWidget.item(num,
                                                                                       0).text() + '_' + self.ui.tableWidget.item(
                        num, 1).text() + '.' + muc_url.split('.')[-1]
                    count = num
                    if muc_lrc != '':
                        lrc_name = self.ui.label_2.text() + '/' + self.ui.tableWidget.item(num,
                                                                                           0).text() + '_' + self.ui.tableWidget.item(
                            num, 1).text() + '.lrc'
                        with open(lrc_name, 'wb') as f:
                            f.write(muc_lrc)
                    self.backend = BackendThread()
                    self.backend.run_(muc_url, muc_name, count)
                    self.backend.start()
                    self.backend.updata_data.connect(self.text_write)
 
    def star_find(self):
        if self.ui.lineEdit.text() == '':
            msg_box = QMessageBox(QMessageBox.Warning, '警告', '请输入要搜索的关键词')
            msg_box.exec_()
        else:
            self.ui.tableWidget.clear()
            self.ui.tableWidget.setColumnCount(7)
 
            self.ui.tableWidget.setColumnWidth(0, 250)
            self.ui.tableWidget.setColumnWidth(1, 150)
            self.ui.tableWidget.setColumnWidth(2, 100)
            self.ui.tableWidget.setColumnWidth(3, 120)
            self.ui.tableWidget.setColumnWidth(4, 120)
            self.ui.tableWidget.setColumnWidth(5, 0)
            self.ui.tableWidget.setColumnWidth(6, 0)
            # self.ui.tableWidget.setRowCount(30)
 
            self.ui.tableWidget.setHorizontalHeaderLabels(['歌曲名', '歌手信息', '歌曲时长', '歌曲尺寸', '下载状态'])
            key_word = self.ui.lineEdit.text()
            url = 'https://songsearch.kugou.com/song_search_v2?callback=jQuery112404852453033521309_1585374178035&keyword={}&page=1&pagesize=100&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1585374178039'.format(
                key_word)
 
            r = requests.get(url, headers=random_user())
            r.encoding = r.apparent_encoding
            JsonText = json.loads(str(r.text).strip('jQuery112404852453033521309_1585374178035(')[:-2])
 
            m = 0
            for i in JsonText["data"]["lists"]:
                if self.ui.radioButton.isChecked() == True:
                    FileHash = i['SQFileHash']
                elif self.ui.radioButton_2.isChecked() == True:
                    FileHash = i['FileHash']
 
                AlbumID = i['AlbumID']
                downurl = 'https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery191012215974743400859_1585619590127&hash={}&album_id={}&dfid=0zI24KbQfP0cPOWD2MSu40&mid=415d42b77b039a48daf4f63d5b411ceb&platid=4&_=1585619590128'.format(
                    FileHash, AlbumID)
                response = requests.get(downurl, headers=random_user())
                if 'play_url' in response.text:
 
                    json_TEXt = json.loads(str(response.text).strip("jQuery19108584376284926096_1585328784250(")[:-2])[
                        'data']
                    url = json_TEXt['play_url']
                    if url != '':
                        m += 1
                        self.ui.tableWidget.setRowCount(m)
                        music_mane = json_TEXt['song_name']
                        singer = json_TEXt['author_name']
                        lyr = json_TEXt['lyrics']
                        music_time = str(int(json_TEXt['timelength']) // 60000) + '分' + str(
                            int(json_TEXt['timelength'] / 1000) % 60) + '秒'
                        music_size = round(int(json_TEXt['filesize']) / 1024 / 1024, 2)
                        new_item1 = QTableWidgetItem(music_mane)
                        new_item1.setTextAlignment(QtCore.Qt.AlignCenter)
                        new_item2 = QTableWidgetItem(singer)
                        new_item2.setTextAlignment(QtCore.Qt.AlignCenter)
                        new_item3 = QTableWidgetItem(music_time)
                        new_item3.setTextAlignment(QtCore.Qt.AlignCenter)
                        new_item4 = QTableWidgetItem(str(music_size) + 'MB')
                        new_item4.setTextAlignment(QtCore.Qt.AlignCenter)
                        new_item6 = QTableWidgetItem(url)
                        new_item6.setTextAlignment(QtCore.Qt.AlignCenter)
                        new_item7 = QTableWidgetItem(lyr)
                        new_item7.setTextAlignment(QtCore.Qt.AlignCenter)
 
                        self.ui.tableWidget.setItem(m-1, 0, QTableWidgetItem(new_item1))
                        self.ui.tableWidget.item(m-1, 0).setCheckState(0)
                        self.ui.tableWidget.setItem(m-1, 1, QTableWidgetItem(new_item2))
                        self.ui.tableWidget.setItem(m-1, 2, QTableWidgetItem(new_item3))
                        self.ui.tableWidget.setItem(m-1, 3, QTableWidgetItem(new_item4))
                        self.ui.tableWidget.setItem(m-1, 5, QTableWidgetItem(new_item6))
                        self.ui.tableWidget.setItem(m-1, 6, QTableWidgetItem(new_item7))
                        QApplication.processEvents()
 
 
 
 
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = firstfrom()
    screen = QDesktopWidget().screenGeometry()
    size = w.geometry()
    w.setWindowTitle('全网音乐下载器')
    left = (screen.width() - size.width()) / 2
    hight = (screen.height() - size.height()) / 2
    w.move(left, hight)
    w.show()
    sys.exit(app.exec_())



上面的是主程序代码,下面是界面的代码


[Python] 纯文本查看 复制代码
# -*- coding: utf-8 -*-
 
# Form implementation generated from reading ui file '0501mp3.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.
 
 
from PyQt5 import QtCore, QtGui, QtWidgets
 
 
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(772, 528)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.setGeometry(QtCore.QRect(0, 160, 791, 351))
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(0)
        self.tableWidget.setRowCount(0)
        self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox.setGeometry(QtCore.QRect(550, 20, 201, 121))
        self.groupBox.setObjectName("groupBox")
        self.layoutWidget = QtWidgets.QWidget(self.groupBox)
        self.layoutWidget.setGeometry(QtCore.QRect(20, 20, 161, 101))
        self.layoutWidget.setObjectName("layoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.layoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.radioButton = QtWidgets.QRadioButton(self.layoutWidget)
        font = QtGui.QFont()
        font.setFamily("楷体")
        font.setPointSize(18)
        self.radioButton.setFont(font)
        self.radioButton.setObjectName("radioButton")
        self.verticalLayout.addWidget(self.radioButton)
        self.radioButton_2 = QtWidgets.QRadioButton(self.layoutWidget)
        font = QtGui.QFont()
        font.setFamily("楷体")
        font.setPointSize(18)
        self.radioButton_2.setFont(font)
        self.radioButton_2.setObjectName("radioButton_2")
        self.verticalLayout.addWidget(self.radioButton_2)
        self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox.setGeometry(QtCore.QRect(350, 110, 191, 31))
        font = QtGui.QFont()
        font.setFamily("楷体")
        font.setPointSize(18)
        self.checkBox.setFont(font)
        self.checkBox.setObjectName("checkBox")
        self.layoutWidget1 = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget1.setGeometry(QtCore.QRect(10, 10, 521, 34))
        self.layoutWidget1.setObjectName("layoutWidget1")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.layoutWidget1)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label = QtWidgets.QLabel(self.layoutWidget1)
        font = QtGui.QFont()
        font.setFamily("楷体")
        font.setPointSize(16)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)
        self.lineEdit = QtWidgets.QLineEdit(self.layoutWidget1)
        self.lineEdit.setObjectName("lineEdit")
        self.horizontalLayout.addWidget(self.lineEdit)
        self.pushButton = QtWidgets.QPushButton(self.layoutWidget1)
        font = QtGui.QFont()
        font.setFamily("楷体")
        font.setPointSize(18)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout.addWidget(self.pushButton)
        self.layoutWidget2 = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget2.setGeometry(QtCore.QRect(10, 60, 521, 31))
        self.layoutWidget2.setObjectName("layoutWidget2")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.layoutWidget2)
        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.pushButton_2 = QtWidgets.QPushButton(self.layoutWidget2)
        font = QtGui.QFont()
        font.setFamily("楷体")
        font.setPointSize(16)
        self.pushButton_2.setFont(font)
        self.pushButton_2.setObjectName("pushButton_2")
        self.horizontalLayout_2.addWidget(self.pushButton_2)
        self.label_2 = QtWidgets.QLabel(self.layoutWidget2)
        font = QtGui.QFont()
        font.setFamily("楷体")
        font.setPointSize(18)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.horizontalLayout_2.addWidget(self.label_2)
        self.layoutWidget3 = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget3.setGeometry(QtCore.QRect(10, 110, 306, 33))
        self.layoutWidget3.setObjectName("layoutWidget3")
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.layoutWidget3)
        self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.pushButton_4 = QtWidgets.QPushButton(self.layoutWidget3)
        font = QtGui.QFont()
        font.setFamily("楷体")
        font.setPointSize(16)
        self.pushButton_4.setFont(font)
        self.pushButton_4.setObjectName("pushButton_4")
        self.horizontalLayout_3.addWidget(self.pushButton_4)
        self.pushButton_5 = QtWidgets.QPushButton(self.layoutWidget3)
        font = QtGui.QFont()
        font.setFamily("楷体")
        font.setPointSize(16)
        self.pushButton_5.setFont(font)
        self.pushButton_5.setObjectName("pushButton_5")
        self.horizontalLayout_3.addWidget(self.pushButton_5)
        self.horizontalLayout_4.addLayout(self.horizontalLayout_3)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
 
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
 
    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.groupBox.setTitle(_translate("MainWindow", "歌曲音质:"))
        self.radioButton.setText(_translate("MainWindow", "无损音质"))
        self.radioButton_2.setText(_translate("MainWindow", "高清音质"))
        self.checkBox.setText(_translate("MainWindow", "全选/全不选"))
        self.label.setText(_translate("MainWindow", "请输入要搜索的歌曲"))
        self.pushButton.setText(_translate("MainWindow", "搜索"))
        self.pushButton_2.setText(_translate("MainWindow", "保存路径选择"))
        self.label_2.setText(_translate("MainWindow", "./mp3"))
        self.pushButton_4.setText(_translate("MainWindow", "下载"))
        self.pushButton_5.setText(_translate("MainWindow", "退出"))



都是在刚学习状态,大伙多多指教。下面是成品链接:
无损高清MP3下载
https://wws.lanzoui.com/ilMe0qjszdg

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2021-6-21 15:54 | 显示全部楼层

支持楼主,谢谢分享。
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-6-21 16:09 | 显示全部楼层
谢谢大牛
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-6-21 18:16 来自手机 | 显示全部楼层
感谢大佬分享,大佬666666
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-6-21 19:43 | 显示全部楼层
6666666666
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-6-21 20:08 | 显示全部楼层
小白表示看不懂。
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-6-21 20:09 | 显示全部楼层
多谢楼主分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-6-21 20:11 | 显示全部楼层
感谢楼主分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2021-6-22 11:22 | 显示全部楼层
谢谢大佬分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

RSS订阅|手机版|小黑屋|广告投放|大牛论坛

GMT+8, 2024-5-12 22:57 , Processed in 0.043458 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表