基于 Python 与 mxget 的音乐下载器

需求

实现一个音乐下载小工具,搜索歌曲名或演唱者名找到相关联的几首歌曲,选择序号,下载歌曲。支持下载歌词、选择下载路径、选择下载平台。

环境

  • Windows 10
  • Python 3.8
  • mxget 1.1.2
  • PySide6 6.2.1

mxget

通过命令行在线搜索你喜欢的音乐,下载并试听。

这里是它的 Github 地址 Github:mxget,有详细的使用说明,我这里就不多介绍了。不过这个 repository 是它的 Go 语言实现。至于 Python 版本的 mxget,可以去 Github 上找一找,看看是否有人 forked。

至于下载,可以直接通过命令 pip install mxget 安装包,如果无法找到包,可以尝试切换镜像源(如:清华大学、阿里云、豆瓣等)安装。

PySide6

Pyside6 是一个开发 GUI 的库,基于 Qt 框架,与 PyQt 同出一个 API 接口,用法几乎一致。以下是 Qt for Python 的 官方文档: Qt for Python。

实现

首先需要完成的是界面设计。如图:

第一行,输入框填入搜索的关键词,button 用于搜索。第二行,显示框输出搜索到的歌曲信息。第三行,下载完成的输出提示。第四行,选择对应的歌曲 id,是否下载歌词,以及下载平台。第五行,选择歌曲下载的路径。第六行,下载按钮。

接下来就是具体的代码实现。如下:

import os
import re
import sys
import subprocess
from PySide6 import QtWidgets, QtGui
from PySide6.QtWidgets import QFileDialogFONT_SIZE = 'font: 12px;'
BASE_DIR = os.path.dirname(__file__)class Window(QtWidgets.QWidget):def __init__(self, parent=None):super(Window, self).__init__(parent)self.init_ui(self)self.song_id_dict = {}  # 歌曲编号与对应的 idself.song_name_dict = {}  # 歌曲编号与对应的 nameself.song_name_and_singer_dict = {}  # 歌曲编号与对应的 name 和 singerdef init_ui(self, window):window.setWindowTitle('DownloadMusic')window.setFixedSize(660, 640)window.setWindowIcon(QtGui.QIcon(BASE_DIR + '/mico.ico'))# row 1song_title_label = QtWidgets.QLabel(window)  # 标题song_title_label.setText('Song Title')song_title_label.setGeometry(10, 10, 90, 25)song_title_label.setStyleSheet(FONT_SIZE)self.song_title_editor = QtWidgets.QLineEdit(window)  # 输入框self.song_title_editor.setGeometry(100, 10, 450, 25)self.song_title_editor.setStyleSheet(FONT_SIZE)query_btn = QtWidgets.QPushButton(window)  # 查询query_btn.setText('Query')query_btn.setGeometry(560, 10, 70, 25)query_btn.setStyleSheet(FONT_SIZE)query_btn.clicked.connect(lambda: self.search())# row 2song_list_label = QtWidgets.QLabel(window)song_list_label.setText('Song List')song_list_label.setGeometry(10, 150, 90, 25)song_list_label.setStyleSheet(FONT_SIZE)self.show_song_list = QtWidgets.QTextBrowser(window)  # 显示歌曲列表self.show_song_list.setGeometry(100, 45, 450, 300)self.show_song_list.setStyleSheet(FONT_SIZE)# row 3download_label = QtWidgets.QLabel(window)download_label.setText('Download Msg')download_label.setGeometry(10, 400, 90, 25)download_label.setStyleSheet(FONT_SIZE)self.show_download_msg = QtWidgets.QTextBrowser(window)  # 下载信息列表self.show_download_msg.setGeometry(100, 350, 450, 140)self.show_download_msg.setStyleSheet(FONT_SIZE)# row 4self.song_numbers = tuple(str(i).zfill(2) for i in range(1, 10))self.song_id_list = QtWidgets.QComboBox(window)self.song_id_list.addItems(self.song_numbers)self.song_id_list.setCurrentIndex(0)self.song_id_list.setGeometry(100, 500, 50, 25)self.song_id_list.setStyleSheet(FONT_SIZE)self.is_download_lyric_cbx = QtWidgets.QCheckBox(window)self.is_download_lyric_cbx.setText('Download Lyric')self.is_download_lyric_cbx.setGeometry(200, 500, 140, 25)self.is_download_lyric_cbx.setStyleSheet('background: rgba(216,216,216,.3);''border: 1px solid rgba(112,112,112,0.8);''border-radius: 2px;''padding-left: 5px;''font: 14px')self.music_platforms_dict = {'NeteaseCloud': 'nc', 'QQ': 'qq', 'KuWo': 'kw', "MiGu": 'mg'}self.music_platforms = ('NeteaseCloud', 'QQ', 'KuWo', 'MiGu')self.change_music_platform = QtWidgets.QComboBox(window)self.change_music_platform.addItems(self.music_platforms)self.change_music_platform.setCurrentIndex(0)self.change_music_platform.setGeometry(350, 500, 110, 25)self.change_music_platform.setStyleSheet(FONT_SIZE)os.system(r'mxget config --from ' + 'nc')# row 5self.select_path_btn = QtWidgets.QPushButton(window)self.select_path_btn.setText('Select Path')self.select_path_btn.setGeometry(100, 535, 90, 25)self.select_path_btn.setStyleSheet(FONT_SIZE)self.select_path_btn.clicked.connect(lambda: self.set_download_path())default_save_to = (os.path.expanduser('~') + '\\Downloads')self.save_path = QtWidgets.QTextBrowser(window)self.save_path.setGeometry(200, 535, 350, 27)self.save_path.setStyleSheet(FONT_SIZE)self.save_path.setText(default_save_to)os.system(r'mxget config --dir ' + default_save_to)# row 5self.download_btn = QtWidgets.QPushButton(window)self.download_btn.setText('Download')self.download_btn.setGeometry(100, 570, 90, 25)self.download_btn.setStyleSheet(FONT_SIZE)self.download_btn.clicked.connect(lambda: self.download())def set_download_path(self):""" 选择下载路径 """dialog = QFileDialog()dialog.setFileMode(QFileDialog.Directory)path = dialog.getExistingDirectory(self, 'select path', 'C:\\', QFileDialog.ShowDirsOnly | QFileDialog.DontResolveSymlinks)if path:self.save_path.setText(path.replace("/", os.sep))os.system(f'mxget config --dir {path}')def set_music_platform(self):""" 设置下载平台 """platform = self.music_platforms[self.change_music_platform.currentIndex()]if not platform == 'NeteaseCloud':platform_no = self.music_platforms_dict[platform]os.system(f'mxget config --from {platform_no}')def search(self):""" 查询关键词歌曲 """self.set_music_platform()song_title = self.song_title_editor.text()  # 获取输入的歌曲名if not song_title:  # 没有输入歌名就查询,会出现弹窗警告info_msg_box = QtWidgets.QMessageBox()info_msg_box.information(QtWidgets.QMainWindow(), 'Info', 'Please input song title...')returntry:songs_data = subprocess.run(f'mxget search -k "{song_title}"', stdout=subprocess.PIPE, encoding='gbk')songs_list = re.findall(r'\[\d{2}.*', songs_data.stdout.replace(' ', ' ').replace('/nbsp;', ' ').replace('/', '&').replace(''', "' "))[:len(self.song_numbers)]if songs_list:display_songs = []for song in songs_list:single_song_info = song.strip().split('-')self.song_id_dict[single_song_info[0][1:3]] = single_song_info[-1]  # 序号和id对应self.song_name_dict[single_song_info[0][1:3]] = single_song_info[0]  # 序号和name对应self.song_name_and_singer_dict[single_song_info[0][1:3]] = (single_song_info[1]+ '-' +single_song_info[0][4:]).strip() + '.mp3'display_songs.append('  -  '.join(single_song_info[:-1]))self.show_song_list.setText('\n' + '\n\n'.join(display_songs[:len(self.song_numbers)]))else:self.song_id_dict = {}self.show_song_list.setText(f'\n Not found songs about {song_title}...')except Exception as e:self.show_song_list.setText(f'\n Not found songs about {song_title}....')raise edef download(self):""" 下载歌曲 """self.set_music_platform()song_number = self.song_numbers[self.song_id_list.currentIndex()]song_id = self.song_id_dict.get(song_number, False)if song_id:download_lyric = ''if self.is_download_lyric_cbx.isChecked():download_lyric = '--lyric --force'subprocess.run(f'mxget song --id {song_id} {download_lyric}')  # 同时下载歌词,格式 lrcconfig_data = subprocess.run('mxget config --show', stdout=subprocess.PIPE, encoding='utf8')download_dir = re.search(r'->.*?\n', config_data.stdout).group().replace('->', '').replace('music', '').strip()if os.path.exists(os.path.join(download_dir, self.song_name_and_singer_dict[song_number])):self.show_download_msg.insertPlainText('\n' + self.song_name_dict[song_number] + ' - ' + 'Downloaded...\n')else:self.show_download_msg.insertPlainText('\n' + self.song_name_dict[song_number] + ' - ' + 'Unavailable...\n')self.show_download_msg.moveCursor(QtGui.QTextCursor.Start)else:info_msg_box = QtWidgets.QMessageBox()info_msg_box.information(QtWidgets.QMainWindow(), 'Info', 'Please get valid song info...')if __name__ == "__main__":app = QtWidgets.QApplication()window = Window()window.show()sys.exit(app.exec())

对于代码说明一下,mxget 是个命令行工具,这里二次封装成 GUI 工具。代码中需要执行 mxget 命令,直接想到的就是 os.system(),不过 os.system() 没有返回值,而代码需要返回搜索信息,筛选后展示,所以无法使用 os.system()。调查后,锁定 subprocess 模块,Python 3.5 以后,可以选择 subprocess 模块中的 run 方法来执行命令,似乎更简单一些。

以下是效果图:


总结

本文介绍了,如何使用 PySide6 创建一个 GUI 应用,实现 mxget 下载单首音乐界面化。所以代码还有很多的优化空间,比如搜索后,增加选择展示多少首歌曲的切换功能,增加一次下载多首歌曲的功能,以及下载专辑的功能等等。在写作此文章之时,存在部分平台不可用,存在部分平台的音乐不可下载。如,作者之前用的 kuwo,现部分音乐不可下载。请读者自行尝试。

源代码在此处:Download Music,此外还有其他几个版本,基于 tkinter 和 PySide2。

基于 Python 与 mxget 的音乐下载器相关推荐

  1. 基于Python的多平台音乐下载器(附源码软件)

    写在前面 本软件所有功能均由Python实现 本软件由本人原创,所用的图标来自iconfont.cn 本软件仅供大家参考与学习,请支持正版音乐! 软件下载: https://wwx.lanzoux.c ...

  2. 【趣味编程】第1期。用python做简易版音乐下载器

    目录 前言 爬虫部分 完整代码 前言 那废话不多说,先了解准备工作. 1.先下载python,可以搜索python官网,到官网里面下载 2.下载外置模块 第一种方法,按win+R,输入cmd,然后输入 ...

  3. python制作一个网易音乐下载器

    你只需要在代码同级目录新建一个文件夹mp3即可.代码可复制粘贴. 第一次思路如下,该效果只能一次下载单个音乐: #coding=gbk """ 描述:传参id即可下载音乐 ...

  4. python音乐下载器交互界面设计_用python实现的百度音乐下载器-python-pyqt-改进版...

    之前写过一个用python实现的百度新歌榜.热歌榜下载器的博文,实现了百度新歌.热门歌曲的爬取与下载.但那个采用的是单线程,网络状况一般的情况下,扫描前100首歌的时间大概得到40来秒.而且用Pyqt ...

  5. 基于Python+tkinter+pygame的音乐播放器完整源码

    import os import tkinter import tkinter.filedialog import random import time import threading import ...

  6. 网页mp3提取器_用Python写一个酷狗音乐下载器!

    [这就是标题] 距离上一次发推送差不多有一个月了ヽ(ー_ー)ノ 做了一个小的酷狗音乐下载器,公众号内回复704就可以收到下载链接. 长下面这样. 双击打开,会提示让输入你要搜索的歌曲. 这里输入去流浪 ...

  7. Python GUI:PyQT5+爬虫实现简单音乐下载器

    此文章学习心得:教学视频为B站up主(Python编程语言),视频地址为:https://www.bilibili.com/video/BV1BD4y1S7iP 一部分: 用pyqt5-tool工具生 ...

  8. python音乐下载器安装_python实现音乐下载器

    本文实例为大家分享了python音乐下载器的具体代码,供大家参考,具体内容如下 import requests import urllib import json from tkinter impor ...

  9. 【Python】音乐下载器(for QQ music)

    之前学习Python时,在GitHub上发现这个很有意思的下载器(虽然界面很丑陋hhhh)... 就是现在还不会爬虫,自己不会写(菜哭) 界面是这样的:  这是代码-- # -*- coding: u ...

  10. Python自制音乐下载器,实现听歌自由

    前言 今天发的就是最实用的文章–让你用Python实现听歌自由,不用再担心自己的钱包了 文章末尾名片可直接领取代码 代码实现 导入模块 import os import re from urllib ...

最新文章

  1. Tomcat(一):背景知识和安装tomcat
  2. 使用富文本时修改时怎么回显数据_数据分析步骤繁琐?选对好工具,几步带你玩转数据分析...
  3. 用ruby的net/ssh链接远程的服务器
  4. windows 7硬盘安装Ubuntu 12.04 后出现grub,无法进入系统解决办法
  5. 与姬十三探讨如何42天搞定2500万美金投资,创业秘密都在这里
  6. qt show widget_Qt中show()与exec()
  7. win10 mysql 远程连接_win10 docker部署mysql并启动远程连接
  8. 谁说菜鸟不会数据分析--读书笔记
  9. Linux——VIM学习选取多行(转)
  10. kafka常见疑难问题
  11. android activity滑动切换,Android 向右滑动切换Activity, 随着手势的滑动而滑动的效果...
  12. 从数据仓库双集群系统模式探讨,看GaussDB(DWS)的容灾设计
  13. centos7 删除zabbix_Zabbix服务器端运行中显示为“不”的解决方式
  14. 浏览器渲染过程与性能优化
  15. 使用框架建立富联网应用
  16. 使用proteus8.9进行跑马灯程序仿真
  17. python绘制箱线图-python绘制箱线图
  18. MATLAB制作歌曲
  19. 为大家推荐一个全新的跨平台app软件开发工具——Lae软件开发平台
  20. 51cto python数据分析系列课程 55g_Python 3 数据分析与挖掘系列课程完整版

热门文章

  1. Popclip插件:任务自动添加进 Microsoft ToDo的任务列表
  2. Consul注册中心删除某个服务
  3. 华为java安全编程规范考试答案
  4. 我的世界联机侠服务器文件夹,我的世界联机侠空岛服务器怎么建 | 手游网游页游攻略大全...
  5. 大数据ETL开发之图解Kettle工具(入门到精通)
  6. 2020年中国微特电机行业现状、竞争格局及未来发展趋势分析,我国产量达全球70%,技术与发达国家仍有差距「图」
  7. ThinkPHP商城分类无限分类遍历数据
  8. c# gerber文件读取_gerber大文本文件打开工具|gerber文件打开工具(gerbview) v7.71 免费版 - 软件下载 - 绿茶软件园|33LC.com...
  9. 计算机考研英语复试如何准备,如何准备考研英语复试听力?
  10. ps制作计算机考试证件照,证件照电子版怎么弄-利用PS制作证件照的简单小教程,可以直接拿去打印了...