使用 Python编程: 下载 YouTube 音频的桌面应用程序

最近我开发了一个使用 Python 编写的桌面应用程序,可以方便地下载 YouTube 音频。该应用程序使用了 wxPython、yt_dlp 和 tqdm 库,提供了一个简单直观的用户界面,并具备高效的下载功能。
C:\pythoncode\new\youtube-dl-audio.py
在这里插入图片描述

程序介绍

这个应用程序基于 Python 编程语言开发,使用了以下库和模块:

  • os:用于处理文件路径和操作系统相关的功能。
  • wx:wxPython 库,用于创建桌面应用程序的 GUI。
  • yt_dlp:yt_dlp 模块,是一个功能更强大的 YouTube-DL 的分支,用于下载 YouTube 视频和音频。
  • tqdm:用于在命令行界面中显示进度条。

功能特点

该应用程序具备以下特点和功能:

  1. 用户友好的界面:应用程序提供了一个简单直观的界面,用户可以轻松输入 YouTube 视频的 URL,并选择音频文件的输出文件夹。

  2. 高效的下载功能:应用程序使用 yt_dlp 模块来下载 YouTube 音频,具备快速、稳定的下载能力。下载过程中,应用程序会显示实时的下载进度条,让用户清晰了解下载进展。

  3. 多线程支持:应用程序使用多线程来执行下载操作,保证下载过程不会阻塞主界面的响应,提升用户体验。

如何使用

使用该应用程序非常简单:

  1. 在 “YouTube URL” 输入框中,粘贴或输入要下载的 YouTube 视频的 URL。

  2. 点击 “Output Folder” 旁边的文件夹图标,选择音频文件的输出文件夹。

  3. 点击 “Start Download” 按钮,应用程序将开始下载音频,并在进度条中显示下载进度。

  4. 下载完成后,您可以在指定的输出文件夹中找到下载的音频文件。

代码解析

如果你对该应用程序的实现感兴趣,下面是关键代码的解析:

# 导入所需的库和模块
import os
import wx
import yt_dlp
from tqdm import tqdm
from threading import Thread

# 创建下载窗口类 DownloadFrame
class DownloadFrame(wx.Frame):
    def __init__(self):
        super().__init__(None, title='YouTube Audio Downloader', size=(400, 200))
        # 窗口布局和组件创建代码...

    def on_start_button_click(self, event):
        # 获取输入的 URL 和输出文件夹路径
        url = self.url_input.GetValue()
        output_dir = self.output_input.GetPath()

        # 创建下载线程并启动
        download_thread = Thread(target=self.download_audio, args=(url, output_dir))
        download_thread.start()

    def download_audio(self, url, output_dir):
        # 设置下载选项
        ydl_opts = {
            'format': 'bestaudio/best',
            'outtmpl': os.path.join(output_dir, '%(title)s.%(ext)s'),
            'progress_hooks': [self.progress_hook],
        }

        with yt_dlp.YoutubeDL(ydl_opts) as ydl:
            ydl.download([url])

    def progress_hook(self, progress):
        if progress['status'] == 'downloading':
            self.progress_bar.SetValue(int(progress['downloaded_bytes'] * 100 / progress['total_bytes']))

# 主程序入口
if __name__ == '__main__':
    app = wx.App()
    frame = DownloadFrame()
    frame.Show()
    app.MainLoop()

以上代码是应用程序的核心部分,通过 wxPython 创建了一个下载窗口的类 DownloadFrame,其中包含了界面的布局和下载逻辑的实现。

具体而言,DownloadFrame 类的构造函数 __init__ 初始化了窗口的大小和标题,并创建了界面的各个组件,如输入框、文件夹选择器和进度条。在点击 “Start Download” 按钮时,会触发 on_start_button_click 方法,该方法获取输入的 URL 和输出文件夹路径,并创建一个新的线程来执行下载操作。

download_audio 方法定义了实际的下载逻辑,使用了 yt_dlp 模块来下载 YouTube 音频。通过设置下载选项,包括音频格式、输出文件名模板和进度回调函数,在指定的输出文件夹中下载音频。

progress_hook 方法是一个回调函数,用于更新下载进度条。在下载过程中,它会根据已下载的字节数和总字节数的比例来更新进度条的值。

最后,在主程序的入口点,创建了一个应用程序对象 app、下载窗口对象 frame,并运行应用程序的主循环,使程序保持运行状态。

全部代码

import os
import wx
import yt_dlp
from tqdm import tqdm
from threading import Thread

class DownloadFrame(wx.Frame):
    def __init__(self):
        super().__init__(None, title='YouTube Audio Downloader', size=(400, 200))
        
        panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)

        url_label = wx.StaticText(panel, label="YouTube URL:")
        self.url_input = wx.TextCtrl(panel)

        output_label = wx.StaticText(panel, label="Output Folder:")
        self.output_input = wx.DirPickerCtrl(panel)

        self.progress_bar = wx.Gauge(panel, range=100)

        start_button = wx.Button(panel, label="Start Download")
        start_button.Bind(wx.EVT_BUTTON, self.on_start_button_click)

        vbox.Add(url_label, flag=wx.ALL, border=10)
        vbox.Add(self.url_input, flag=wx.EXPAND | wx.ALL, border=10)
        vbox.Add(output_label, flag=wx.ALL, border=10)
        vbox.Add(self.output_input, flag=wx.EXPAND | wx.ALL, border=10)
        vbox.Add(self.progress_bar, flag=wx.EXPAND | wx.ALL, border=10)
        vbox.Add(start_button, flag=wx.ALIGN_CENTER | wx.ALL, border=10)

        panel.SetSizer(vbox)

    def on_start_button_click(self, event):
        url = self.url_input.GetValue()
        output_dir = self.output_input.GetPath()

        download_thread = Thread(target=self.download_audio, args=(url, output_dir))
        download_thread.start()

    def download_audio(self, url, output_dir):
        ydl_opts = {
            'format': 'bestaudio/best',
            'outtmpl': os.path.join(output_dir, '%(title)s.%(ext)s'),
            'progress_hooks': [self.progress_hook],
        }

        with yt_dlp.YoutubeDL(ydl_opts) as ydl:
            ydl.download([url])

    def progress_hook(self, progress):
        if progress['status'] == 'downloading':
            self.progress_bar.SetValue(int(progress['downloaded_bytes'] * 100 / progress['total_bytes']))

if __name__ == '__main__':
    app = wx.App()
    frame = DownloadFrame()
    frame.Show()
    app.MainLoop()

总结

通过这个简单的应用程序示例,我们学习了如何使用 Python 和相关库来开发一个实用的桌面应用程序。该应用程序利用 wxPython 创建了一个用户友好的界面,结合 yt_dlp 和 tqdm 库实现了高效的 YouTube 音频下载功能。你可以根据自己的需求进行修改和扩展,以开发更加强大和个性化的应用程序。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java实现根据关键词搜索当当商品列表数据方法,当当API接口申请指南

要通过当当网的API获取商品列表数据,您可以使用当当开放平台提供的接口来实现。以下是一种使用Java编程语言实现的示例,展示如何通过当当开放平台API获取商品列表: 首先,确保您已注册成为当当开放平台的开发者,并创建…

Ansible学习笔记10

1、在group1的被管理机里的mariadb里创建一个abc库; 1) 然后我们到agent主机上进行检查: 可以看到数据库已经创建成功。 再看几个其他命令: #a组主机重启mysql,并设置开机自启 ansible a -m service -a "namemy…

Hive-启动与操作(2)

🥇🥇【大数据学习记录篇】-持续更新中~🥇🥇 个人主页:beixi 本文章收录于专栏(点击传送):【大数据学习】 💓💓持续更新中,感谢各位前辈朋友们支持…

初始react和使用——事件处理、样式处理和组件

一、react官网 1、官网下载 官网分别有中英文两种: 中文官网:React 官方中文文档 – 用于构建用户界面的 JavaScript 库 英文官网:https://reactjs.org/ 2、react简介 react是用于构建用户界面的JavaScript库,起源于Facebook的…

【【STM32分析IO该设置什么模式的问题】】

STM32分析IO该设置什么模式的问题 我们分析而言 我们对于PA0 的设计就从此而来 对于边沿触发的选择我们已经有所了解了 我们下拉,但是当我们摁下开关的时候 从0到1 导通了 所以这个是下拉 上升沿触发 而对于KEY0 我们摁下是使得电路从原来悬空高阻态到地就是0 所以…

WordPress(3)会员插件安装

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、服务器中上传插件二、使用步骤1.启动插件前言 提示:会员插件的安装不能在网站后台插件中心中直接安装原因我还没有排查 原因:会导致网站停止运行 一、服务器中上传插件 二、使用步骤 …

Servlet的使用(JavaEE初阶系列17)

目录 前言: 1.Servlet API的使用 1.1HttpServlet 1.2HttpServletRequest 1.3HttpServletResponse 2.表白墙的更新 2.1表白墙存在的问题 2.2前后端交互接口 2.3环境准备 2.4代码的编写 2.5数据的持久化 2.5.1引入JDBC依赖 2.5.2创建数据库 2.5.3编写数…

根据身高重建队列【贪心算法】

根据身高重建队列 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返…

设计模式的使用——模板方法模式+动态代理模式

一、需求介绍 现有自己写的的一套审批流程逻辑,由于代码重构,需要把以前的很多业务加上审批的功能,再执行完审批与原有业务之后,生成一个任务,然后再统一处理一个任务(本来是通过数据库作业去处理的&#x…

项目开发尺寸像素问题

一般来说 项目开发开始会固定页面尺寸 一般都是1920x1080像素 那这样开发是最简单的我们直接用设计图的像素来开发就行 不用管有什么滚动条 一般浏览器都会有边框什么的 所以会出现滚动条 当我们全屏状态下其实才是我们想要页面结果 如果我们想没有滚动条开发 首先我们要知道…

rke安装k8s

1、修改集群中各物理机主机名hostname文件 # 查看 cat /etc/hostname # 命令修改 hostnamectl set-hostname k8s-master2、实现主机名与ip地址解析 # 查看cat /etc/hosts # 修改 vi /etc/hosts3、配置ip_forward过滤机制 # 修改 vi /etc/sysctl.conf net.ipv4.ip_forward1…

使用element-ui中的el-table回显已选中数据时toggleRowSelection报错

最近在写一个后台&#xff0c;需要在表格中多选&#xff0c;然后点击编辑按钮的时候&#xff0c;需要回显已经选中的表单项 <el-table v-loading"loading" :data"discountList" :row-key"(row) > row.id" refmultipleTable selection-cha…

【pyqt5界面化工具开发-11】界面化显示检测信息

目录 0x00 前言&#xff1a; 一、布局的设置 二、消息的显示 0x00 前言&#xff1a; 我们在10讲的基础上&#xff0c;需要将其输出到界面上 思路&#xff1a; 1、消息的传递 2、布局的设置 先考虑好消息的传递&#xff0c;再来完善布局 其实先完善布局&#xff0c;再来设置消…

树多选搜索查询,搜索后选中状态仍保留

<template><div class"half-transfer"><div class"el-transfer-panel"><div><el-checkbox v-model"selectAll" change"handleSelectAll">全部</el-checkbox></div><el-input v-model&qu…

Breakpad交叉编译aarch64

原本是在mac os上编译的&#xff0c;但是会出现一些问题&#xff0c;因此还是开了台linux容器进行编译&#xff0c;本文可结合之前的linux下编译breakpad共同查看。 Linux下Breakpad编译_Edward.W的博客-CSDN博客https://blog.csdn.net/u013379032/article/details/130754480?…

北京985学校,交叉学科考英一数三408

北京师范大学(B) 考研难度&#xff08;☆☆☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1096字&#xff0c;预计阅读&#xff1a;3分钟 2023考情概况 北…

Gradio使用介绍

与他人分享你的机器学习模型、API或数据科学工作流的最佳方式之一&#xff0c;就是创建一个交互式应用程序&#xff0c;让用户或同事可以在他们的浏览器中尝试演示,Gradio是创建提供了用非常方便的方式快速创建一个前端交互应用&#xff0c;那如何使用Gradio呢&#xff1f;因为…

OLED透明屏显示技术:未来显示科技的领航者

OLED透明屏显示技术是一种创新性的显示技术&#xff0c;它的特殊性质使其成为未来显示科技的领航者。 OLED透明屏具有高对比度、快速响应时间、广视角和低功耗等优势&#xff0c;同时&#xff0c;其透明度、柔性和薄型设计使其成为创新设计的理想选择。 本文将深入探讨OLED透…

YII项目在Docker中运行缓慢

缓慢问题分析 请求YII的api时间请求原生查询时间win10 上运行docker上的php api异常慢ubuntu 中拉代码git报错 请求YII的api时间 请求原生查询时间 win10 上运行docker上的php api异常慢 链接阿里数据的 入口直接返回的 网上有说是docker的dns解析慢&#xff1b; 也有说是…

【报错记录】疯狂踩坑之RockyLinux创建Raid1镜像分区,Raid分区在重启后消失了!外加华硕主板使用Raid模式后,硬盘在系统中无法找到问题

前言 为了摆脱对于专业NAS的依赖&#xff0c;我决定专门使用一台Linux服务器安装NAS程序的方式实现NAS功能&#xff0c;这里就需要用到Raid功能&#xff0c;由于目前我只有3块SSD&#xff08;256G500G500G&#xff09;&#xff0c;在ChatGPT的推荐下还是使用一个256G系统盘2块…