admin管理员组

文章数量:1442344

开发一款全平台视频下载的工具软件: 支持哔哩哔哩(B站)、YouTube(油管)等等

核心实现方案

方案一:纯Python模块实现

代码语言:javascript代码运行次数:0运行复制
import yt_dlp
import importlib

def video_downloader(url, quality='best'):
    """
    视频下载核心函数
    :param url: 视频链接
    :param quality: 画质选择(best/worst/自定义格式)
    :return: 下载状态
    """
    ydl_opts = {
        'format': quality,
        'outtmpl': '%(title)s.%(ext)s',
        'quiet': True,
        'no_warnings': True
    }
    
    try:
        with yt_dlp.YoutubeDL(ydl_opts) as ydl:
            ydl.download([url])
        return True
    except Exception as e:
        print(f"下载失败: {str(e)}")
        return False
技术特点:
  1. 基于yt-dlp模块实现
  2. 支持自动格式选择
  3. 完善的错误处理机制
  4. 可扩展的配置选项

方案二:独立进程调用实现

代码语言:javascript代码运行次数:0运行复制
import subprocess
import sys
import os

def get_executable_path():
    """获取可执行文件路径(适配打包环境)"""
    if getattr(sys, 'frozen', False):
        base_path = sys._MEIPASS if hasattr(sys, '_MEIPASS') else os.path.dirname(sys.executable)
    else:
        base_path = os.path.dirname(__file__)
    return os.path.join(base_path, 'yt-dlp.exe')

def download_with_subprocess(url):
    """通过子进程调用实现"""
    try:
        subprocess.run([get_executable_path(), url], check=True)
        return True
    except subprocess.CalledProcessError as e:
        print(f"进程调用失败: {e}")
        return False

自动更新机制

代码语言:javascript代码运行次数:0运行复制
def check_and_update():
    """模块热更新实现"""
    try:
        import requests
        from packaging import version
        
        # 获取当前版本
        current_ver = yt_dlp.version.__version__
        
        # 获取最新版本
        resp = requests.get(
            ";,
            timeout=5
        )
        latest_ver = resp.json()["tag_name"].strip("v")
        
        if version.parse(current_ver) < version.parse(latest_ver):
            # 执行静默更新
            original_stdout = sys.stdout
            sys.stdout = open(os.devnull, 'w')
            try:
                yt_dlp.YoutubeDL({'quiet': True}).update()
                importlib.reload(yt_dlp)
                return True
            finally:
                sys.stdout = original_stdout
        return False
    except Exception:
        return False

性能优化建议

  1. 连接池管理
代码语言:javascript代码运行次数:0运行复制
import urllib3
http = urllib3.PoolManager(maxsize=10)
  1. 多线程下载
代码语言:javascript代码运行次数:0运行复制
from concurrent.futures import ThreadPoolExecutor

def batch_download(urls):
    with ThreadPoolExecutor(max_workers=4) as executor:
        results = executor.map(video_downloader, urls)
    return all(results)
  1. 缓存机制
代码语言:javascript代码运行次数:0运行复制
from functools import lru_cache

@lru_cache(maxsize=128)
def get_video_info(url):
    with yt_dlp.YoutubeDL({'quiet': True}) as ydl:
        return ydl.extract_info(url, download=False)

部署方案

PyInstaller打包配置

代码语言:javascript代码运行次数:0运行复制
# -*- mode: python ; coding: utf-8 -*-
from PyInstaller.utils.hooks import collect_data_files

datas = collect_data_files('yt_dlp') + collect_data_files('certifi')

a = Analysis(
    ['main.py'],
    pathex=[],
    binaries=[],
    datas=datas,
    hiddenimports=['yt_dlp', 'urllib3'],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
    optimize=1
)

本文标签: 开发一款全平台视频下载的工具软件 支持哔哩哔哩(B站)YouTube(油管)等等