python中使用yt-dlp模块实现带进程条下载音视频

news2024/12/25 9:03:48

当代的互联网时代,视频内容的流行无疑是其中的重要组成部分。作为全球最大的视频分享平台,每天吸引着数以亿计的用户观看各种各样的视频内容。有时候,我们可能希望将某些喜欢的视频保存到本地进行观看,或者将它们用于其他用途。在本文中,我们将介绍如何使用 Python 和 wxPython 库编写一个简单的 视频下载程序。

首先,我们需要安装两个必要的库:wxPython 和 yt-dlp。你可以使用以下命令来安装它们:

pip install wxPython yt-dlp

安装完成后,我们就可以开始编写程序了。下面是完整的代码示例:

import wx
import yt_dlp
import threading
import urllib.parse

class YouTubeDownloaderFrame(wx.Frame):
    def __init__(self):
        super().__init__(None, title="YouTube Downloader", size=(400, 300))
        
        self.panel = wx.Panel(self)
        
        self.url_label = wx.StaticText(self.panel, label="Video URL:")
        self.url_text = wx.TextCtrl(self.panel)
        
        self.folder_label = wx.StaticText(self.panel, label="Save Folder:")
        self.folder_text = wx.TextCtrl(self.panel)
        self.folder_btn = wx.Button(self.panel, label="Browse...")
        self.folder_btn.Bind(wx.EVT_BUTTON, self.on_browse)
        
        self.start_btn = wx.Button(self.panel, label="Start Download")
        self.start_btn.Bind(wx.EVT_BUTTON, self.on_start)
        
        self.progress_label = wx.StaticText(self.panel, label="Progress:")
        self.progress_bar = wx.Gauge(self.panel, range=100)
        
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.url_label, 0, wx.ALL, 5)
        self.sizer.Add(self.url_text, 0, wx.EXPAND|wx.ALL, 5)
        self.sizer.Add(self.folder_label, 0, wx.ALL, 5)
        self.sizer.Add(self.folder_text, 0, wx.EXPAND|wx.ALL, 5)
        self.sizer.Add(self.folder_btn, 0, wx.ALL, 5)
        self.sizer.Add(self.start_btn, 0, wx.ALL, 5)
        self.sizer.Add(self.progress_label, 0, wx.ALL, 5)
        self.sizer.Add(self.progress_bar, 0, wx.EXPAND|wx.ALL, 5)
        
        self.panel.SetSizer(self.sizer)
        self.Show()
    
    def on_browse(self, event):
        dlg = wx.DirDialog(self, "Choose a directory", style=wx.DD_DEFAULT_STYLE)
        if dlg.ShowModal() == wx.ID_OK:
            self.folder_text.SetValue(dlg.GetPath())
        dlg.Destroy()
    
    def on_start(self, event):
        url = self.url_text.GetValue()
        save_folder = self.folder_text.GetValue()

        download_thread = threading.Thread(target=self.download_video, args=(url, save_folder))
        download_thread.start()
    
    def download_video(self, url, save_folder):
        try:
            options = {
                'outtmpl': save_folder + '/%(title)s.%(ext)s',
                'progress_hooks': [self.update_progress],
            }
            with yt_dlp.YoutubeDL(options) as ydl:
                video_info = ydl.extract_info(url, download=False)
                if 'uploader' in video_info and 'youtube' in urllib.parse.urlparse(url).netloc:
                    options['progress_hooks'] = [self.update_progress]
                    ydl.download([url])
                else:
                    ydl.download([url])
            wx.CallAfter(wx.MessageBox, 'Download completed!', 'Info', wx.OK | wx.ICON_INFORMATION)
        
        except Exception as e:
            wx.CallAfter(wx.MessageBox, f'Download error occurred: {str(e)}', 'Error', wx.OK | wx.ICON_ERROR)
    
    def update_progress(self, progress):
        if 'total_bytes' in progress and 'downloaded_bytes' in progress:
            percentage = int(progress['downloaded_bytes'] * 100 / progress['total_bytes'])
            wx.CallAfter(self.progress_bar.SetValue, percentage)

app = wx.App()
frame = YouTubeDownloaderFrame()
app.MainLoop()

在这个程序中,我们使用了 wxPython 库来创建一个简单的图形用户界面(GUI)。用户可以在界面上输入 视频的地址,并选择保存视频的文件夹。当用户点击"开始下载"按钮后,程序将使用 yt-dlp 库开始下载视频。同时,我们还添加了一个进度条来显示下载进度。

程序的主要逻辑位于 YouTubeDownloaderFrame 类中。在类的初始化方法中,我们创建了界面上的各个控件,如文本标签、文本输入框、按钮和进度条。通过绑定按钮的事件处理函数,我们可以在用户点击按钮时执行相应的操作。

下载视频的过程是在一个单独的线程中进行的,以避免阻塞用户界面。在 download_video 方法中,我们使用 yt-dlp 库来下载视频。我们配置了一些下载选项,如输出模板和进度钩子函数。下载过程中,进度钩子函数将被调用,并更新进度条的值。

下载完成后,我们使用 wx.CallAfter 方法来确保在主线程中显示下载完成的消息框,以避免线程间的竞争条件。

通过以上的代码示例,我们实现了一个简单的 视频下载程序。用户可以方便地输入视频地址、选择保存文件夹,并通过点击按钮开始下载。程序还提供了一个进度条,以显示下载进度。这个程序可以作为一个基础框架,你可以根据需要进行进一步的定制和扩展。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

406 · 和大于S的最小子数组

链接:LintCode 炼码 - ChatGPT!更高效的学习体验! 题解:同向双指针 九章算法 - 帮助更多程序员找到好工作,硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧 class Solution { public:/*** param nums: an array …

任务12、Quality指令加持,Midjourney生成电影级数码作品

12.1 任务概述 本次实验任务旨在帮助你掌握Midjourney AI绘画中的Quality指令。通过深入介绍Quality指令的概念和作用,我们将解释为什么它在绘画中至关重要。通过测试不同的Quality参数对绘画效果的影响,并提供实战演示,你将学会如何在Midjourney中设置Quality参数以达到更…

Spring 事务详解(注解方式)

目 录 序言 1、编程式事务 2、配置声明式事务 2.1 基于TransactionProxyFactoryBean的方式(不常用,因为要为每一个类配置TransactionProxyFactoryBean) 2.2 基于AspectJ的XML方式(常用,可配置在某些类下的所有子…

⛳ StringBuffer and StringBuilder 处理字符串

目录 ⛳ StringBuffer and StringBuilder 处理字符串🎨 一,简介🏭 二,常用方法🚜 三 ,StringBugger🐾 四,StringBuilder⭐ 五,StringBuffer和StringBuilder面试 ⛳ Strin…

【李宏毅机器学习·学习笔记】Tips for Training: Adaptive Learning Rate

本节课主要介绍了Adaptive Learning Rate的基本思想和方法。通过使用Adaptive Learning Rate的策略,在训练深度神经网络时程序能实现在不同参数、不同iteration中,学习率不同。 本节课涉及到的算法或策略有:Adgrad、RMSProp、Adam、Learning …

Qt应用开发(基础篇)——时间微调输入框QDateTimeEdit、QDateEdit、QTimeEdit

一、前言 QAbstractSpinBox是全部微调输入框的父类,这是一种允许用户通过点击上下箭头按钮或输入数字来调整数值的图形用户界面控件,父类提供了当前值text、对齐方式align、只读readOnly等通用属性和方法。在上一篇数值微调输入框中有详细介绍。 QDateTi…

【雕爷学编程】Arduino动手做(186)---WeMos ESP32开发板4

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…

PyTorch深度学习实战(9)——学习率优化

PyTorch深度学习实战(9)——学习率优化 0. 前言1. 学习率简介2. 梯度值、学习率和权重之间的相互作用3. 学习率优化实战3.1 学习率对缩放后的数据集的影响3.2 学习率对未缩放数据集的影响 小结系列链接 0. 前言 学习率( learning rate )是神经网络训练中…

(十二)大数据实战——hadoop集群之HDFS高可用自动故障转移

前言 本节内容主要介绍一下hadoop集群下实现HDFS高可用的自动故障转移,HDFS高可用的自动故障转移主要通过zookeeper实现故障的监控和主节点的切换。自动故障转移为 HDFS 部署增加了两个新组件:ZooKeeper 和 ZKFailoverController (ZKFC&…

【笔记】湖仓一体架构演进与发展

https://www.bilibili.com/video/BV1oF411F7rQ/?spm_id_from333.788.recommend_more_video.0&vd_sourcefa36a95b3c3fa4f32dd400f8cabddeaf

Linux中的firewall-cmd

2023年8月4日,周五上午 目录 打开端口关闭端口查看某个端口是否打开查看当前防火墙设置firewall-cmd中的服务在防火墙中什么是服务?为什么会有服务?打开或关闭服务查看某个服务是否打开firewall-cmd中的 zones查看所有可用的zones&#xff0…

elementui Cascader 级联选择使用心得

相信大家对于elementui并不陌生,作为适配Vue的优秀UI框架之一,一直被所有的开发者痛并快乐着。今天要记录的就是里边的主角之一Cascader。 首先先介绍一下Cascader ---> 当一个数据集合有清晰的层级结构时,可通过级联选择器逐级查看并选择…

OBS视频视频人物实时扣图方法(四种方式)

图片擦除一些杂乱图像 参考:https://www.bilibili.com/video/BV1va411G7be https://github.com/Sanster/lama-cleaner第一种:色度键选项 第二种:浏览器建立窗口选项 参考视频:https://www.bilibili.com/video/BV1WS4y1C7QY http…

Java8 list多属性去重

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。 在 Java 开发中,我们经常会面临对 List 中的对象属性去重的需求。然而,当需要根据多个属性来进行去重时,情况会稍微复杂一些。本篇…

js实现原型链污染,沙箱绕过

一、沙箱绕过 1.概念 沙箱绕过"是指攻击者利用各种方法和技术来规避或绕过应用程序或系统中的沙箱(sandbox)。沙箱是一种安全机制,用于隔离和限制应用程序的执行环境,从而防止恶意代码对系统造成损害。它常被用于隔离不受信…

开放式耳机的音质不如入耳式耳机吗?开放式耳机的优缺点?

​开放式耳机的音质不一定不如入耳式耳机。音质取决于多种因素,包括耳机的设计、音频技术和材料质量等。因此,不能简单地将开放式耳机和入耳式耳机进行比较,并得出开放式耳机的音质不如入耳式的结论。不同的耳机类型都有各自的优势和劣势&…

常用HTML标签大全

🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 文章目录 一.HTML介绍二.HTML使用2.1.…

嵌入式开发学习(STC51-15-红外遥控)

内容 使用外部中断功能,使按下红外遥控器,将对应键值编码数据解码后通过数码管显示 红外遥控介绍 红外线简介 人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫; 其中红光的波长范围为 0.62&…

读发布!设计与部署稳定的分布式系统(第2版)笔记28_控制层上

1. 控制层囊括所有在后台运行的成功处理生产负载的软件和服务 1.1. 处理用户生产数据的那些软件,就是生产软件 1.2. 主要工作是管理其他软件的软件,就是控制层 1.3. 工具和问题之间存在着重叠和空白,并不是每个工具组合都能协同工作&#…

LeetCode 28题:找出字符串中第一个匹配项的下标

题目 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 示例 1: 输入:haystac…