吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 22456|回复: 116
收起左侧

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

   关闭 [复制链接]
cjs25 发表于 2021-6-21 12:16
本帖最后由 cjs25 于 2021-6-28 17:33 编辑

论坛里音乐下载的好像没有界面,我试着用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 time
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,muc_lrc, count):
        self.url = url
        self.muc_lrc=muc_lrc
        self.muc_name = muc_name
        self.count = count

    def run(self):

        try:
            reponse = requests.get(self.url, headers=random_user())
            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)
                    self.updata_data.emit('文件太小,下载失败!', self.count)
                else:
                    if self.muc_lrc != '':
                        lrc_name = self.muc_name.split('.')[-2]+'.lrc'
                        with open(lrc_name, 'wb') as f:
                            f.write(self.muc_lrc)
                    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)
        self.backend = BackendThread()

    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

                    time.sleep(1)

                    self.backend.run_(muc_url, muc_name,muc_lrc, 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)
            try:
                r = requests.get(url, headers=random_user())

                r.encoding = r.apparent_encoding
                JsonText = json.loads(str(r.text).strip('jQuery112404852453033521309_1585374178035(')[:-2])
            except:
                msg_box = QMessageBox(QMessageBox.Warning, '警告', '网站有点卡,你再试试看')
                msg_box.exec_()
            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)
                try:
                    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()
                except:
                    continue




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/iAnIRqqp10d
密码:3xmu

免费评分

参与人数 29吾爱币 +33 热心值 +27 收起 理由
霸世唐皇 + 1 + 1 谢谢@Thanks!
ulti2019 + 1 + 1 我很赞同!
wo嘉康花园 + 1 + 1 谢谢@Thanks!
ylyubd + 1 + 1 谢谢@Thanks!
sailorTT + 1 + 1 谢谢@Thanks!
xdxf2000 + 1 + 1 热心回复!
do4family + 1 + 1 谢谢@Thanks!
jcl123 + 1 + 1 我很赞同!
小小的石头13 + 1 + 1 我很赞同!
lycronald100 + 1 我很赞同!
玛里狗斯 + 1 谢谢@Thanks!
电脑清洁圆 + 1 + 1 谢谢@Thanks!
hebiao0307 + 1 我很赞同!
RubyYoung + 1 + 1 谢谢@Thanks!
yinpasha + 1 + 1 谢谢@Thanks!
丨一灬一丨 + 1 + 1 加油!
SaberKnight + 1 谢谢@Thanks!
ik2000 + 1 + 1 谢谢@Thanks!
daimaduan + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
aaron899 + 1 + 1 谢谢@Thanks!
vane1202 + 1 + 1 谢谢@Thanks!
hj170520 + 1 + 1 热心回复!
lmx288 + 1 + 1 谢谢@Thanks!
追梦赤子 + 2 + 1 不错的软件!
苏紫方璇 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
风雪庙 + 1 + 1 谢谢@Thanks!
千翼 + 1 + 1 我很赞同!
小麦麦早 + 1 + 1 有界面方便多了
不爱哭 + 1 热心回复!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| cjs25 发表于 2021-6-21 12:57
不爱哭 发表于 2021-6-21 12:32
界面搜索“周华健” ,无损音质, 等待快2分钟,出来8首歌,搜索界面出现反复搜索现象。

无损的只有8首,感觉封装出了问题,封装后好像只要多选几首下载就会闪退,在pycharm里运行都没有问题,我也不知道哪儿出了问题,下午再试下封装参数
yf668888 发表于 2021-6-21 13:53
nanaqilin 发表于 2021-6-21 12:57
方木 发表于 2021-6-21 12:18
兄嘚,你要不要看看你的链接在哪里
不爱哭 发表于 2021-6-21 12:27
鼓励一下楼主佳作,我先试试。
sohuso 发表于 2021-6-21 12:27
谢谢分享哈
sohuso 发表于 2021-6-21 12:31
无法启动。。。
360截图20210621123018143.jpg
不爱哭 发表于 2021-6-21 12:32
不爱哭 发表于 2021-6-21 12:27
鼓励一下楼主佳作,我先试试。

界面搜索“周华健” ,无损音质, 等待快2分钟,出来8首歌,搜索界面出现反复搜索现象。
sjp1ysf01 发表于 2021-6-21 12:37
可以下载那些网站的音乐?谢谢
sc9760 发表于 2021-6-21 12:54
正好准备下载些歌曲
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-26 17:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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