打造自己的音乐下载器:一键获取喜爱音乐的便捷工具

音乐是生活的一部分

音乐伴随着我们的生活,成为我们生命中不可或缺的一部分。无论是欢乐的时刻,还是寂寞的时候,音乐都能陪伴我们度过。然而,在享受音乐的同时,我们是否曾经遇到过这样的问题:想要下载自己喜欢的音乐,却不知道如何获取高质量的音乐文件?如果是的话,本教程将带你一窥如何使用Python创建自己的音乐下载器,让你轻松获取喜欢的音乐!

步骤 1:准备工作

在开始之前,确保你已经完成以下准备工作:

  • 安装了Python编程环境。
  • 安装了所需的Python库,包括TkinterRequestsBeautiful Soup、tkinter.messagebox、PySimpleGUI以及retrying。你可以使用以下命令来安装它们:
pip install tkinter requests beautifulsoup4 PySimpleGUI retrying

步骤 2:创建音乐下载器界面

我们首先需要创建一个简单而实用的用户界面,用于输入音乐搜索关键词并显示搜索结果。以下是界面的主要组成部分:

  • 音乐搜索通道选择:你可以选择不同的音乐搜索通道,例如酷我、网易云、QQ音乐、酷狗等。

  • 搜索框:你可以在搜索框中输入歌曲名或歌手,然后点击搜索按钮。

  • 搜索结果表格:搜索结果将以表格形式显示,包括序号、歌手、歌曲和专辑等信息。

  • 下载按钮:你可以选择要下载的音乐,并点击下载按钮将音乐保存到本地。

以下是Python代码中界面的创建部分:

import tkinter as tk
from tkinter import ttk
import tkinter.messagebox as mes_box
import webbrowser
import requests
from bs4 import BeautifulSoup
from retrying import retry

class MusicDownloader:
    def __init__(self, width=1000, height=600):
        self.ui_weight = width
        self.ui_height = height
        self.title = "音乐下载器"
        self.ui_root = tk.Tk(className=self.title)
        self.ui_url = tk.StringVar()
        self.ui_var = tk.IntVar()
        self.ui_var.set(1)
        self.show_result = None
        self.song_num = None
        self.response_data = None
        self.song_url = None
        self.song_name = None
        self.song_author = None

    def create_ui(self):
        # 创建UI界面的代码在这里
        pass

    def center_ui(self):
        # 窗口居中显示的代码在这里
        pass

    def main_loop(self):
        # 主循环的代码在这里
        pass

if __name__ == '__main__':
    downloader = MusicDownloader()
    downloader.main_loop()

在接下来的步骤中,我们将逐步填充这些方法,创建完整的音乐下载器界面。

步骤 3:实现界面布局

在这一步,我们将填充create_ui方法,实现界面的布局和各个控件的功能。以下是界面布局的代码:

def create_ui(self):
    # 创建Frame空间
    frame_1 = tk.Frame(self.ui_root)
    frame_2 = tk.Frame(self.ui_root)
    frame_3 = tk.Frame(self.ui_root)
    frame_4 = tk.Frame(self.ui_root)

    # 创建菜单
    ui_menu = tk.Menu(self.ui_root)
    self.ui_root.config(menu=ui_menu)
    file_menu = tk.Menu(ui_menu, tearoff=0)
    ui_menu.add_cascade(label='菜单', menu=file_menu)
    file_menu.add_command(label='使用说明', command=lambda: webbrowser.open('www.baidu.com'))
    file_menu.add_command(label='关于作者', command=lambda: webbrowser.open('www.baidu.com'))
    file_menu.add_command(label='退出', command=self.ui_root.quit)

    # 创建控件
    choice_passageway = tk.Label(frame_1, text='请选择音乐搜索通道:', padx=10, pady=10)
    passageway_button_1 = tk.Radiobutton(frame_1, text='酷我', variable=self.ui_var, value=1, width=10, height=3)
    passageway_button_2 = tk.Radiobutton(frame_1, text='网易云', variable=self.ui_var, value=2, width=10, height=3)
    passageway_button_3 = tk.Radiobutton(frame_1, text='QQ音乐', variable=self.ui_var, value=3, width=10, height=3)
    passageway_button_4 = tk.Radiobutton(frame_1, text='酷狗', variable=self.ui_var, value=4, width=10, height=3)
    input_label = tk.Label(frame_2, text="请输入歌曲名或歌手:")
    entry_style = tk.Entry(frame_2, textvariable=self.ui_url, highlightcolor='Fuchsia', highlightthickness=1, width=35)
    label2 = tk.Label(frame_2, text=" ")
    search_button = tk.Button(frame_2, text="搜索", font=('楷体', 11), fg='Purple', width=2, height=1, command=self.search_music)
    label3 = tk.Label(frame_2, text=" ")
    columns = ("序号", "歌手", "歌曲", "专辑")
    self.show_result = ttk.Treeview(frame_3, height=20, show="headings", columns=columns)
    download_button = tk.Button(frame_4, text="下载", font=('楷体', 11), fg='Purple', width=6, height=1, padx=5, pady=5, command=self.download_music)

    # 布局控件
    frame_1.pack()
    frame_2.pack()
    frame_3.pack()
    frame_4.pack()
    choice_passageway.grid(row=0, column=0)

    passageway_button_1.grid(row=0, column=1)
    passageway_button_2.grid(row=0, column=2)
    passageway_button_3.grid(row=0, column=3)
    passageway_button_4.grid(row=0, column=4)
    input_label.grid(row=0, column=0)
    entry_style.grid(row=0, column=1)
    label2.grid(row=0, column=2)
    search_button.grid(row=0, column=3, ipadx=10, ipady=10)
    label3.grid(row=0, column=4)
    self.show_result.grid(row=0, column=4)
    download_button.grid(row=0, column=5)

    # 设置表头
    self.show_result.heading("序号", text="序号")
    self.show_result.heading("歌手", text="歌手")
    self.show_result.heading("歌曲", text="歌曲")
    self.show_result.heading("专辑", text="专辑")

    # 设置列
    self.show_result.column("序号", width=100, anchor='center')
    self.show_result.column("歌手", width=200, anchor='center')
    self.show_result.column("歌曲", width=200, anchor='center')
    self.show_result.column("专辑", width=300, anchor='center')

以上代码中,我们使用tkinter库创建了一个用户界面,包括选择音乐搜索通道、输入搜索关键词、点击搜索按钮、显示搜索结果、以及下载音乐等功能。

步骤 4:搜索音乐

在这一步中,我们将填充search_music方法,实现搜索音乐的功能。根据用户选择的音乐搜索通道,我们将发送HTTP请求获取搜索结果,并在界面中显示搜索结果。以下是搜索音乐的代码:

@retry(stop_max_attempt_number=5)
def search_music(self):
    for item in self.show_result.get_children():
        self.show_result.delete(item)
    headers = {
        'accept': 'application/json, text/plain, */*',
        'accept-encoding': 'gzip, deflate',
        'accept-language': 'zh-CN, zh;q=0.9',
        'cache-control': 'no-cache',
        'Connection': 'keep-alive',
        'csrf': 'HH3GHIQ0RYM',
        'Referer': 'http://www.kuwo.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6',
        'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36',
        'Cookie': '_ga=GA1.2.218753071.1648798611; _gid=GA1.2.144187149.1648798611; _gat=1; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1648798611; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1648798611; kw_token=HH3GHIQ0RYM'
    }
    search_input = self.ui_url.get()
    if len(search_input) > 0:
        search_url = 'http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?'
        search_data = {
            'key': search_input,
            'pn': '1',
            'rn': '80',
            'httpsStatus': '1',
            'reqId': '858597c1-b18e-11ec-83e4-9d53d2ff08ff'
        }
        try:
            self.response_data = requests.get(search_url, params=search_data, headers=headers, timeout=20).json()
            songs_data = self.response_data['data']['list']
            if int(self.response_data['data']['total']) <= 0:
                mes_box.showerror(title='错误', message='搜索: {} 不存在.'.format(search_input))
            else:
                for i in range(len(songs_data)):
                    self.show_result.insert('', i, values=(i + 1, songs_data[i]['artist'], songs_data[i]['name'], songs_data[i]['album']))
        except TimeoutError:
            mes_box.showerror(title='错误', message='搜索超时,请重新输入后再搜索!')
    else:
        mes_box.showerror(title='错误', message='未输入需查询的歌曲或歌手,请输入后搜索!')

在这段代码中,我们使用requests库发送HTTP请求,获取音乐搜索结果,并将搜索结果显示在界面的表格中。

步骤 5:获取下载链接

一旦用户选择了要下载的音乐,我们需要获取下载链接,以便下载音乐文件。在这一步中,我们将填充get_song_url方法,实现获取下载链接的功能。以下是获取下载链接的代码:

def get_song_url(self, event):
    for item in self.show_result.selection():
        item_text = self.show_result.item(item, "values")
        self.song_num = int(item_text[0])
    if self.song_num is not None:
        songs_data = self.response_data['data']['list']
        songs_req_id = self.response_data['reqId']
        song_rid = songs_data[self.song_num - 1]['rid']
        music_url = 'http://www.kuwo.cn/api/v1/www/music/playUrl?mid={}&type=convert_url3&httpsStatus=1&reqId={}'.format(song_rid, songs_req_id)
        response_data = requests.get(music_url).json()
        self.song_url = response_data['data'].get('url')
        self.song_name = songs_data[self.song_num - 1]['name']
        self.song_author = songs_data[self.song_num - 1]['artist']
    else:
        mes_box.showerror(title='错误', message='未选择要下载的歌曲,请选择')

在这段代码中,我们解析用户在界面中选择的音乐,并通过HTTP请求获取下载链接。

步骤 6:下载音乐

最后一步是实现下载音乐的功能。在这一步中,我们将填充download_music方法,实现将音乐文件下载到本地的功能。以下是下载音乐的代码:

def download_music(self):
    if not os.path.exists('./music'):
        os.mkdir("./music/")
    if self.song_num is not None:
        song_name = self.song_name + '--' + self.song_author + ".mp3"
        try:
            save_path = os.path.join('./music/

{}'.format(song_name)).replace('\\', '/')
            true_path = os.path.abspath(save_path)
            resp = requests.get(self.song_url)
            with open(save_path, 'wb') as file:
                file.write(resp.content)
                mes_box.showinfo(title='下载成功', message='歌曲:%s,保存地址为%s' % (self.song_name, true_path))
        except Exception:
            mes_box.showerror(title='错误', message='未找到存放歌曲的文件夹')
    else:
        mes_box.showerror(title='错误', message='未选择要下载的歌曲,请选择后下载')

这段代码会将选择的音乐下载到名为./music/的文件夹中,并在下载完成后显示下载成功的提示信息。

步骤 7:运行音乐下载器

一切准备就绪,现在可以运行我们的音乐下载器了。运行以下代码:

if __name__ == '__main__':
    downloader = MusicDownloader()
    downloader.main_loop()

你将看到一个漂亮的音乐下载器界面,可以用它来搜索、选择并下载你喜欢的音乐。

结语

通过这个简单的音乐下载器,你可以方便地搜索、选择和下载你喜欢的音乐,而不必费心去寻找下载链接。这个项目还有很大的扩展空间,你可以进一步优化界面、增加更多音乐搜索通道、支持批量下载等功能。希望这个项目能够帮助你更好地享受音乐!

本文由作者 王大神 原创发布于 大神网的AI博客。

转载请注明作者:王大神

原文出处:打造自己的音乐下载器:一键获取喜爱音乐的便捷工具

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 2023年9月21日
下一篇 2023年9月21日

相关推荐

  • 如何使用情感分析和Python分析虚拟货币市场情绪

    虚拟货币市场一直以来都是一个充满波动和不确定性的领域。在这个市场中,情感和市场情绪可以对价格产生重大影响。因此,了解如何使用情感分析工具和Python来分析虚拟货币市场情绪变得至关重要。本教程将向您介绍如…

    2023年12月28日
    00
  • 准时到达目的地:列车最小时速计算详解

    在快节奏的现代生活中,时间管理变得尤为重要。想象一下,你每天上班需要乘坐多趟列车,每趟列车都有固定的行驶距离和发车时间。如何计算出一个最合理的时速,以确保你准时到达办公室呢?这不仅是一个关于时间和速…

    2023年11月25日
    00
  • 教程:使用Python自动分类整理照片

    作为一个热爱摄影的摄影师或者只是一个热爱拍照的普通人,你的电脑可能积累了大量的照片。这些照片散落在各个文件夹中,有时候你可能会感到疑惑,不知道应该如何将它们有序地整理起来。手动分类和整理这些照片是一…

    2023年9月21日
    00
  • 教程:使用Python批量注册自建邮箱账户

    有时候,我们可能需要大量的邮箱账户,用于各种目的,比如测试、订阅、或者是其他项目。在这种情况下,手动一个一个注册邮箱账户会非常繁琐和耗时。但幸运的是,我们可以利用Python编写脚本来自动化这个过程,而且…

    2023年11月2日
    00
  • 打造高效客户管理系统 – 从需求到实现

    在现代商业世界中,客户是企业最宝贵的资产之一。建立一个高效的客户管理系统可以帮助你更好地理解、满足和维护你的客户。在本文中,我们将探讨如何使用Python创建一个简单而功能强大的客户管理系统。我们将从需求…

    2023年9月10日
    00
  • 打造你的AI游戏伙伴:训练人工智能玩游戏

    嗨,亲爱的游戏爱好者!你是否曾想过拥有一个强大的游戏伙伴,一个能够与你一同征战虚拟世界的AI助手?或许你在某个游戏关卡卡住了,需要一个精湛的合作伙伴来帮助你度过难关。那么,不妨让我告诉你,这个梦想可以…

    2023年9月25日
    00
  • 探索Python编程:从入门到精通的完全指南

    故事时间:曾经,有一位朋友问我:“Python编程是什么?怎么学习它?我应该从哪里下载Python?有没有一些实用的代码示例?还有,有线上培训班吗?”这让我回想起了自己刚开始学习Python编程的时候,充满了好奇和渴望…

    2023年10月15日
    00
  • Python HTTP 请求的 SSL 与代理问题:一次全面的解读

    在日常开发中,HTTP 请求作为信息交互的基础,其稳定性和正确性至关重要。然而,当李华试图用 Python 发送一个 HTTP 请求时,他遇到了一个棘手的问题:经常出现的 SSL 错误和超时问题。作为一个热衷于开发的工程师…

    2023年10月9日
    00
  • 如何通过Python实现Web服务实时显示多线程产生的日志信息

    假设你正在开发一个多线程的Python应用程序,每个线程都会产生大量的日志信息,你想要实时查看这些日志信息以了解应用程序的运行状态。你不想简单地将日志输出到控制台,而是希望通过一个Web服务的方式,能够在浏览…

    2023年10月10日
    00
  • 使用OpenAI API创建文本生成教程

    在本教程中,我们将介绍如何使用OpenAI API来生成自然语言文本。OpenAI API提供了强大的自然语言处理能力,可以用于各种应用,如智能助手、内容生成、语言理解等。通过本教程,你将学会如何使用Python代码调用OpenA…

    2024年3月11日
    00