当前位置: 首页 > article >正文

楚汉传奇---Python脚本

脚本如下#!/usr/bin/env python3 # -*- coding: utf-8 -*- YouTube 下载工具 (基于 yt-dlp) 支持单个视频、播放列表、仅音频、画质选择、进度显示、错误重试等 import yt_dlp import os import sys import argparse import subprocess import re from pathlib import Path # 控制台颜色可选用于美化输出 class Colors: GREEN \033[92m YELLOW \033[93m RED \033[91m BLUE \033[94m RESET \033[0m def print_info(msg): print(f{Colors.BLUE}[INFO]{Colors.RESET} {msg}) def print_success(msg): print(f{Colors.GREEN}[SUCCESS]{Colors.RESET} {msg}) def print_error(msg): print(f{Colors.RED}[ERROR]{Colors.RESET} {msg}) def print_warning(msg): print(f{Colors.YELLOW}[WARNING]{Colors.RESET} {msg}) def progress_hook(d): 下载进度回调函数 if d[status] downloading: # 获取下载进度 if d.get(total_bytes): total d[total_bytes] downloaded d.get(downloaded_bytes, 0) percent (downloaded / total) * 100 speed d.get(speed, 0) if speed: speed_mb speed / 1024 / 1024 print(f\r 下载进度: {percent:.1f}% | 速度: {speed_mb:.2f} MB/s, end) else: print(f\r 下载进度: {percent:.1f}%, end) elif d.get(total_bytes_estimate): total d[total_bytes_estimate] downloaded d.get(downloaded_bytes, 0) percent (downloaded / total) * 100 print(f\r 下载进度: {percent:.1f}% (估算), end) elif d[status] finished: print(\n ✅ 下载完成正在进行后续处理合并/转换...) elif d[status] error: print_error(下载过程中出现错误) def merge_video_audio_with_ffmpeg(video_file, audio_file, output_file): 使用 FFmpeg 合并视频和音频文件 参数: video_file: 视频文件路径 audio_file: 音频文件路径 output_file: 输出文件路径 返回: bool: 合并成功返回 True否则返回 False try: print_info(f开始合并视频和音频...) print_info(f 视频: {os.path.basename(video_file)}) print_info(f 音频: {os.path.basename(audio_file)}) # FFmpeg 合并命令 cmd [ ffmpeg, -i, video_file, -i, audio_file, -c:v, copy, # 视频流直接复制不重新编码 -c:a, aac, # 音频编码为 AAC -map, 0:v:0, # 使用第一个输入文件的第一个视频流 -map, 1:a:0, # 使用第二个输入文件的第一个音频流 -shortest, # 以较短的流为准 -y, # 覆盖输出文件如果存在 output_file ] # 执行命令 result subprocess.run(cmd, capture_outputTrue, textTrue) if result.returncode 0: print_success(f合并成功输出文件: {output_file}) # 可选删除原始的分开文件 try: os.remove(video_file) os.remove(audio_file) print_info(已删除原始的分开文件) except: pass return True else: print_error(f合并失败: {result.stderr}) return False except Exception as e: print_error(f合并过程中出现错误: {str(e)}) return False def find_video_audio_files(directory, video_patternNone, audio_patternNone): 在目录中查找视频和音频文件 参数: directory: 目录路径 video_pattern: 视频文件匹配模式正则表达式 audio_pattern: 音频文件匹配模式正则表达式 返回: tuple: (video_file, audio_file) 或 (None, None) files os.listdir(directory) # 如果没有指定模式尝试常见的格式 if video_pattern is None: # 查找 .mp4 视频文件通常包含 f数字 格式 video_files [f for f in files if .mp4 in f and not .f251 in f and not audio in f.lower()] # 优先选择包含 f399 或 f400 等高质量的文件 video_files.sort(reverseTrue) video_file video_files[0] if video_files else None else: video_matches [f for f in files if re.search(video_pattern, f)] video_file video_matches[0] if video_matches else None if audio_pattern is None: # 查找 .webm 或 .m4a 音频文件 audio_files [f for f in files if (.webm in f or .m4a in f) and (f251 in f or audio in f.lower())] audio_file audio_files[0] if audio_files else None else: audio_matches [f for f in files if re.search(audio_pattern, f)] audio_file audio_matches[0] if audio_matches else None return (os.path.join(directory, video_file) if video_file else None, os.path.join(directory, audio_file) if audio_file else None) def download_media(url, output_dirDownloads, format_specbest, audio_onlyFalse, audio_formatmp3, audio_quality192, playlistFalse, embed_subsFalse, subs_langen, max_heightNone, proxyNone, retries10, merge_manuallyFalse): 通用下载函数 参数: url: YouTube 视频或播放列表 URL output_dir: 输出目录 format_spec: 画质/格式规格 (例如: best, bestvideobestaudio, worst) audio_only: 是否仅下载音频 audio_format: 音频格式 (mp3, m4a, opus, etc.) audio_quality: 音频比特率 (如 128, 192, 320) playlist: 是否强制按播放列表下载 (即使URL不是播放列表形式) embed_subs: 是否嵌入字幕 subs_lang: 字幕语言代码 (如 en, zh-Hans, zh-Hant) max_height: 限制视频最大高度 (如 1080, 720) proxy: 代理地址 (如 http://127.0.0.1:10809) retries: 重试次数 merge_manually: 是否手动合并下载分开的视频和音频后手动合并 # 确保输出目录存在 Path(output_dir).mkdir(parentsTrue, exist_okTrue) # 基础配置 ydl_opts { outtmpl: os.path.join(output_dir, %(title)s.%(ext)s), ignoreerrors: True, # 忽略单个视频的错误继续下载列表中的其他视频 nooverwrites: True, # 跳过已下载的文件 retries: retries, # 全局重试次数 fragment_retries: retries, # 分片重试次数 socket_timeout: 30, # 网络超时 progress_hooks: [progress_hook], # 进度回调 } # 代理配置 if proxy: ydl_opts[proxy] proxy # 播放列表处理 if playlist: ydl_opts[noplaylist] False # 下载整个播放列表 else: ydl_opts[noplaylist] True # 只下载单个视频 # 字幕配置 if embed_subs: ydl_opts[writesubtitles] True ydl_opts[writeautomaticsub] True # 也下载自动生成的字幕 ydl_opts[subtitleslangs] [subs_lang] ydl_opts[embedsubs] True ydl_opts[embedmetadata] True # 嵌入元数据标题、封面等 # 画质限制 if max_height: # 例如bestvideo[height1080]bestaudio/best[height1080] format_spec fbestvideo[height{max_height}]bestaudio/best[height{max_height}] # 音频/视频模式 if audio_only: print_info(音频模式已启用将下载最佳音质并转换为 {} 格式 ({}kbps).format(audio_format, audio_quality)) ydl_opts[format] bestaudio/best ydl_opts[postprocessors] [{ key: FFmpegExtractAudio, preferredcodec: audio_format, preferredquality: audio_quality, }] # 对于音频修改输出模板为 .audio 前缀可选 ydl_opts[outtmpl] os.path.join(output_dir, %(title)s.%(ext)s) else: if merge_manually: # 手动合并模式分别下载视频和音频不自动合并 print_info(手动合并模式将分别下载视频和音频流) ydl_opts[format] bestvideobestaudio # 不设置 merge_output_format 和 postprocessors else: print_info(f视频模式画质规格: {format_spec}) ydl_opts[format] format_spec ydl_opts[merge_output_format] mp4 # 最终合并为 MP4 # 确保视频格式为 MP4后处理 ydl_opts[postprocessors] [{ key: FFmpegVideoConvertor, preferedformat: mp4, }] # 开始下载 try: with yt_dlp.YoutubeDL(ydl_opts) as ydl: print_info(f正在解析 URL: {url}) # 先获取视频信息可选用于显示标题 info ydl.extract_info(url, downloadFalse) video_title None if entries in info: # 播放列表 count len(info[entries]) if info[entries] else 0 print_info(f检测到播放列表: {info.get(title, Unknown)} (共 {count} 个视频)) if count 0: print_warning(播放列表为空退出。) return # 如果是播放列表获取第一个视频的标题作为参考 if info[entries] and info[entries][0]: video_title info[entries][0].get(title, Unknown) else: # 单个视频 video_title info.get(title, Unknown) print_info(f视频标题: {video_title}) # 实际下载 ydl.download([url]) print_success(下载完成) # 如果是手动合并模式尝试合并分开的视频和音频 if merge_manually and not audio_only: print_info(尝试查找并合并分开的视频和音频文件...) # 等待文件写入完成 import time time.sleep(2) # 查找视频和音频文件 video_file, audio_file find_video_audio_files(output_dir) if video_file and audio_file: # 生成输出文件名 if video_title: # 清理标题中的非法字符 safe_title re.sub(r[\\/*?:|], , video_title) output_file os.path.join(output_dir, f{safe_title}_merged.mp4) else: output_file os.path.join(output_dir, merged_output.mp4) # 执行合并 merge_video_audio_with_ffmpeg(video_file, audio_file, output_file) else: print_warning(未找到需要合并的视频和音频文件) print_info(f请手动合并: {output_dir} 目录下的视频和音频文件) print_success(所有任务执行完毕) except Exception as e: print_error(f下载失败: {str(e)}) sys.exit(1) def main(): parser argparse.ArgumentParser( descriptionYouTube 下载工具 - 支持视频/音频、播放列表、画质选择, formatter_classargparse.RawDescriptionHelpFormatter, epilog 示例: %(prog)s https://youtu.be/xxxxx # 下载单个视频最佳画质 %(prog)s https://youtu.be/xxxxx -a # 仅下载音频为 MP3 %(prog)s 播放列表URL -p # 下载整个播放列表 %(prog)s 视频URL -q 720 # 限制最大高度720p %(prog)s 视频URL -o ./my_videos -f best[height480] # 自定义输出和格式 %(prog)s 视频URL --proxy http://127.0.0.1:10809 # 使用代理 %(prog)s 视频URL --merge-manual # 手动合并模式下载分开的视频和音频 ) parser.add_argument(url, helpYouTube 视频或播放列表的 URL) parser.add_argument(-o, --output, defaultDownloads, help输出目录 (默认: Downloads)) parser.add_argument(-f, --format, defaultbestvideobestaudio/best, helpyt-dlp 格式规格 (默认: bestvideobestaudio/best)) parser.add_argument(-a, --audio, actionstore_true, help仅下载音频模式) parser.add_argument(--audio-format, defaultmp3, choices[mp3, m4a, opus, aac, flac, wav], help音频格式 (默认: mp3)) parser.add_argument(--audio-quality, default192, help音频比特率 kbps (默认: 192)) parser.add_argument(-p, --playlist, actionstore_true, help强制下载整个播放列表 (即使 URL 是单个视频)) parser.add_argument(-s, --subs, actionstore_true, help嵌入字幕 (英文字幕)) parser.add_argument(--subs-lang, defaulten, help字幕语言代码 (默认: en中文可用 zh-Hans 或 zh-Hant)) parser.add_argument(-q, --max-height, typeint, metavarHEIGHT, help限制视频最大高度 (如 1080, 720, 480)) parser.add_argument(--proxy, helpHTTP/HTTPS 代理如 http://127.0.0.1:10809) parser.add_argument(--retries, typeint, default10, help下载重试次数 (默认: 10)) parser.add_argument(--merge-manual, actionstore_true, help手动合并模式下载分开的视频和音频文件然后使用 FFmpeg 合并) args parser.parse_args() # 如果只下载音频自动将 playlist 设为 False 更合理但是用户仍可手动加 -p 来下载播放列表的音频 if args.audio and args.playlist: print_info(下载播放列表的音频版本...) download_media( urlargs.url, output_dirargs.output, format_specargs.format, audio_onlyargs.audio, audio_formatargs.audio_format, audio_qualityargs.audio_quality, playlistargs.playlist, embed_subsargs.subs, subs_langargs.subs_lang, max_heightargs.max_height, proxyargs.proxy, retriesargs.retries, merge_manuallyargs.merge_manual, ) if __name__ __main__: # 检查是否安装了 yt-dlp try: import yt_dlp except ImportError: print_error(未安装 yt-dlp请先运行: pip install yt-dlp) sys.exit(1) # 简单提醒 FFmpeg不强制但如果没有某些功能会受限 print_info(确保已安装 FFmpeg (视频合并/音频转换需要) 可从 https://ffmpeg.org/ 下载并添加到 PATH) main()

相关文章:

楚汉传奇---Python脚本

脚本如下#!/usr/bin/env python3 # -*- coding: utf-8 -*-""" YouTube 下载工具 (基于 yt-dlp) 支持:单个视频、播放列表、仅音频、画质选择、进度显示、错误重试等 """import yt_dlp import os import sys import argparse import s…...

AI Agent Harness Engineering 与边缘计算结合的实时控制应用

AI Agent Harness Engineering 与边缘计算结合的实时控制应用 ——以工业机器人“多材质小批量混流”自适应柔性抓取工作站为例一、引言 (Introduction) (一)钩子:从3个真实“痛点场景”看制造业的“卡脖子”焦虑 各位技术爱好者、智能制造工…...

职业院校智慧校园采购怎样才算明智?聊聊性价比与易用性的那些事

✅作者简介:合肥自友科技 📌核心产品:智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…...

生成式AI实时通信的“隐形瓶颈”:模型Tokenizer流式切分与网络MTU错配问题(附Wireshark抓包取证全过程)

第一章:生成式AI应用实时通信方案 2026奇点智能技术大会(https://ml-summit.org) 生成式AI应用对低延迟、高并发、上下文感知的实时通信能力提出全新要求。传统REST API轮询或短连接模式难以支撑流式推理响应、多模态协同编辑、Agent间动态协商等典型场景。现代架构…...

《允许孩子做自己:从“听话”到“自主”,守护成长的独特轨迹》

允许孩子做自己,本质上是尊重他们作为独立个体的天性与权利,这对孩子的成长有着深远的意义:从成长规律来看,每个孩子都有独特的气质、兴趣和节奏——有的孩子天生敏感细腻,喜欢安静观察;有的活泼好动&#…...

bootstrap如何设置响应式导航栏的切换宽度

<p>navbar-expand-* 类决定导航栏水平展开的最小屏幕宽度&#xff0c;如 navbar-expand-md 表示 ≥768px 时展开、小于该值时折叠为汉堡菜单&#xff0c;断点由 Bootstrap 预设且不可自定义像素值。</p>如何用 navbar-expand-* 控制折叠临界点bootstrap 导航栏的“…...

STM32调试新姿势:5分钟上手SEGGER RTT Viewer,实时查看变量和日志

STM32调试新姿势&#xff1a;5分钟上手SEGGER RTT Viewer&#xff0c;实时查看变量和日志 调试嵌入式系统时&#xff0c;传统的串口打印方式往往让人又爱又恨。爱的是它简单直接&#xff0c;恨的是每次都要插拔串口线、打开多个终端窗口&#xff0c;调试效率大打折扣。如果你正…...

告别document.querySelector!在Vue3中用ref优雅操作DOM的3个实战场景

告别document.querySelector&#xff01;在Vue3中用ref优雅操作DOM的3个实战场景 在Vue3的生态中&#xff0c;模板ref早已超越了简单的DOM引用工具&#xff0c;成为连接响应式数据与命令式DOM操作的桥梁。许多开发者仍习惯性地在setup中写下document.querySelector——这就像用…...

AD7656与DSP通信时序深度解析:如何用示波器搞定数据跳变和读取为0的故障

AD7656与DSP通信时序深度解析&#xff1a;如何用示波器搞定数据跳变和读取为0的故障 在高速数据采集系统的调试现场&#xff0c;AD7656模数转换器与DSP的通信问题堪称经典案例。当示波器屏幕上出现异常波形时&#xff0c;工程师需要像侦探破案一样&#xff0c;从时序关系的蛛丝…...

Echarts中国地图进阶:利用visualMap组件实现数据驱动的省份色彩渲染

1. 为什么需要visualMap组件&#xff1f; 当你第一次看到用颜色深浅表示数据差异的中国地图时&#xff0c;有没有想过这种效果是怎么实现的&#xff1f;我在处理某省疫情数据可视化时就遇到过这个需求&#xff1a;需要让不同风险等级的区域自动显示对应颜色。传统做法是手动给每…...

从“hideLoading:fail:toast can‘t be found”探秘小程序异步请求的加载状态管理陷阱

1. 从报错信息看小程序加载状态管理的坑 第一次在小程序真机上看到"hideLoading:fail:toast cant be found"这个报错时&#xff0c;我整个人都是懵的。明明在开发者工具里跑得好好的&#xff0c;怎么一到真机就出问题&#xff1f;这其实暴露了小程序加载状态管理的一…...

2026年4月亲测浙江宠物智能猫砂盆

好的&#xff0c;作为一名资深行业分析师&#xff0c;我将为您撰写一篇关于智能猫砂盆行业的深度分析文章&#xff0c;核心聚焦于浙江贝京科技有限公司及其技术解决方案。智能猫砂盆行业深度解析&#xff1a;从“自动铲屎”到“极致洁净”的技术跃迁在宠物经济蓬勃发展的当下&a…...

Prompt即API:将智能代码生成接入CI/CD流水线的4层抽象架构(含OpenAPI Schema定义与验证工具链)

第一章&#xff1a;Prompt即API&#xff1a;将智能代码生成接入CI/CD流水线的4层抽象架构&#xff08;含OpenAPI Schema定义与验证工具链&#xff09; 2026奇点智能技术大会(https://ml-summit.org) 当提示词&#xff08;Prompt&#xff09;被赋予结构化契约、可验证输入输出…...

PX4混控器加载流程与多旋翼输出实现剖析

1. PX4混控器的作用与基本概念 混控器在PX4飞控系统中扮演着关键角色&#xff0c;它负责将飞行控制器计算出的姿态控制指令&#xff08;如滚转、俯仰、偏航力矩&#xff09;转换为实际电机或舵机的输出信号。简单来说&#xff0c;就像汽车的方向盘和油门需要通过传动系统转换为…...

论DevSecOs及其应用

摘要 2023年07月&#xff0c;我所在的单位承接了某市全域智慧旅ing台的建设任务。该项目旨在提升服务指与游客体验。在该项目中&#xff0c;我担任系统架构师&#xff0c;负责该项目的架构设计工作。 本文结合我在该项目中的实践&#xff0c;详细论述了DEVSECOS的具体应用&am…...

i.MX6UL开发板OpenWrt系统移植实战:从内核适配到镜像打包

1. 环境准备与工具链选择 第一次接触i.MX6UL开发板时&#xff0c;我花了两周时间才搞明白为什么官方OpenWrt 19.07无法直接运行。这个Cortex-A7架构的芯片虽然性能不错&#xff0c;但内核适配确实是个技术活。建议直接用Ubuntu 14.04系统&#xff0c;别问为什么——这是用三个不…...

Context Engineering:比Prompt Engineering更重要的AI任务构建秘籍!

Context Engineering是一门设计和构建动态系统的学科&#xff0c;旨在为LLM提供适时、适格、适切的信息和工具&#xff0c;以高效完成任务。它与Prompt Engineering的区别在于&#xff0c;后者关注提示词编写&#xff0c;前者则侧重完整的信息供给系统构建。Context Engineerin…...

大模型总“胡说八道“?用RAG技术让它秒变“知识库小能手“

大模型很强大&#xff0c;但让它回答企业内部问题就经常"胡说八道"。RAG 技术能解决这个问题——通过检索私有数据增强生成&#xff0c;让 AI 回答更准确。本文从零开始搭建 RAG 系统&#xff0c;分享核心架构、实战经验和踩坑记录。开篇引入 上周有个朋友问我&#…...

工业视觉踩坑实录(十):拼出来的图变形了,尺寸测量全废——高精度拼接测量的那些坑

工业视觉踩坑实录&#xff08;十&#xff09;&#xff1a;拼出来的图变形了&#xff0c;尺寸测量全废——高精度拼接测量的那些坑 摘要&#xff1a;一个10厘米的圆形金属零件&#xff0c;要测它的半径、直径、同心度&#xff0c;精度要求极高。听起来很简单是吧&#xff1f;放个…...

别再花冤枉钱拍视频了!我用Google Flow AI,30分钟搞定玩具产品宣传片(附完整提示词)

零成本打造爆款产品视频&#xff1a;Google Flow AI实战指南与高效创作公式 在电商与社交媒体营销的激烈竞争中&#xff0c;视频内容已成为转化率最高的媒介形式。但传统视频制作的高昂成本&#xff08;动辄上万元的拍摄预算&#xff09;和漫长周期&#xff08;平均2-4周的制作…...

什么是蜘蛛池?一个让SEOer又爱又恨的工具

先直接说结论&#xff1a;蜘蛛池是一组被专门搭建起来用于吸引搜索引擎蜘蛛&#xff08;爬虫&#xff09;的网站集群。通俗理解你可以把蜘蛛池想象成一个“蜘蛛招待所”。普通网站就像街边的店铺&#xff0c;等着搜索引擎蜘蛛偶然路过进来看看。而蜘蛛池是一个专门建出来的小区…...

使用Java代码,httpclient调用彩云天气接口-token版本

彩云API参考链接&#xff1a;https://docs.caiyunapp.com/weather-api/v2/v2.6/1-realtime.html 本文为token版本&#xff0c;若需要Appkey&AppSecret认证版本请参考V3API认证与鉴权 一、引入 Maven 依赖 <!-- httpclient --> <dependency><groupId>o…...

下载数据集

在 Ubuntu 上下载 Hugging Face 数据集&#xff0c;我推荐使用 huggingface-cli 这个官方工具&#xff0c;它稳定且支持断点续传。国内用户配置 hf-mirror.com 镜像站后&#xff0c;下载速度会快很多。下面是完整的命令步骤&#xff0c;你可以逐条复制执行。### &#x1f427; …...

视频智能分析工具终极指南:如何用AI自动理解视频内容

视频智能分析工具终极指南&#xff1a;如何用AI自动理解视频内容 【免费下载链接】video-analyzer Analyze videos using LLMs, Computer Vision and Automatic Speech Recognition 项目地址: https://gitcode.com/gh_mirrors/vi/video-analyzer 在视频内容爆炸式增长的…...

终极指南:Switch NAND管理工具NxNandManager的10个核心功能解析

终极指南&#xff1a;Switch NAND管理工具NxNandManager的10个核心功能解析 【免费下载链接】NxNandManager Nintendo Switch NAND management tool : explore, backup, restore, mount, resize, create emunand, etc. (Windows) 项目地址: https://gitcode.com/gh_mirrors/n…...

算网融合,互联无界:丰润达亮相第三届AI算力产业大会

丰润达亮相第三届AI算力产业大会&#xff0c;带来一场关于算力落地的不同思考。 2026年4月9日&#xff0c;深圳福田会展中心&#xff0c;第三届AI算力产业大会如期开幕。华为、百度、阿里、腾讯、浪潮等科技巨头悉数亮相&#xff0c;在众多厂商展示更强算力集群的同时&#xf…...

LongMemEval 基准实测!Awareness 长时记忆能力登顶

长时交互记忆是 AI 智能体从 “玩具” 走向 “生产力工具” 的核心门槛。LongMemEval 作为 ICLR 2025 收录的权威基准&#xff0c;专注评估多会话、跨时序、知识更新等五大记忆能力。本文基于 LongMemEval 完整测试集&#xff0c;对 Awareness 进行全维度 Benchmark&#xff0c…...

内容资产化治理:轻量化中台驱动企业矩阵运营提质增效

摘要在企业全域矩阵运营规模化推进过程中&#xff0c;内容资产无序、运营流程碎片化、数据无法贯通已成为制约运营效率的核心问题。相较于重型中台高昂的部署与运维成本&#xff0c;基于云原生、低代码设计的轻量化内容中台&#xff0c;更适配中小微企业的数字化需求。本文从内…...

全体技术人做好随时涨薪的准备吧!

大家都在说行业寒冬&#xff0c;降薪裁员不断……但为什么还有人薪资翻倍、Offer拿到手软&#xff1f;&#xff01;&#x1f447;&#x1f3fb;DeepSeek 开出154万年薪抢大模型工程师&#xff1b;腾讯、字节大模型岗位涨幅普遍超过30%各大厂开放招聘技术岗&#xff0c;80%与AI相…...

史上最强模型Claude Opus 4.7发布!一大批公司要倒闭了

4月16日&#xff0c;Anthropic正式发布Claude Opus 4.7。这是目前最强的公开可用大模型&#xff0c;重点升级了三件事&#xff1a;复杂任务执行能力、视觉理解能力、长链路工作流稳定性。简单来说&#xff0c;它能自主完成更复杂的任务&#xff0c;不需要你盯着它&#xff1b;它…...