如何用youtube-dl/yt-dlp备份YouTube教育频道:视频+播放列表脚本
使用PowerShell + yt-dlp备份YouTube教育频道并生成共享视频的M3U播放列表
完全可以实现你的需求,以下是针对性的PowerShell脚本方案,通过yt-dlp(youtube-dl的活跃分支)完成频道备份,同时避免重复下载共享视频,最终生成对应播放列表的M3U文件。
前置准备
- 安装yt-dlp:可通过
winget install yt-dlp命令安装,或下载可执行文件放到脚本同目录 - 安装ffmpeg:yt-dlp依赖它处理音视频合并,同样可用
winget install ffmpeg安装
完整脚本
# 替换为目标教育频道的URL(支持@用户名/频道ID/自定义URL格式) $channelUrl = "https://www.youtube.com/@YourEducationChannel" # 1. 创建videos和playlist文件夹 $videosDir = Join-Path $PSScriptRoot "videos" $playlistsDir = Join-Path $PSScriptRoot "playlist" New-Item -ItemType Directory -Path $videosDir -Force | Out-Null New-Item -ItemType Directory -Path $playlistsDir -Force | Out-Null # 2. 下载频道所有视频到videos文件夹,用视频ID命名避免重复 yt-dlp ` -o "$videosDir/%(id)s.%(ext)s" ` --download-archive "$videosDir/downloaded.txt" ` $channelUrl # 3. 获取频道下所有播放列表的元数据(ID和标题) $playlists = yt-dlp -j --flat-playlist $channelUrl | ConvertFrom-Json | Where-Object { $_._type -eq "playlist" } # 4. 遍历每个播放列表,生成对应M3U文件 foreach ($playlist in $playlists) { $playlistId = $playlist.id # 替换标题中的非法文件名字符 $safePlaylistTitle = $playlist.title -replace '[\\/:*?"<>|]', '_' $m3uFilePath = Join-Path $playlistsDir "$safePlaylistTitle.m3u" # 获取当前播放列表内所有视频的元数据 $playlistVideos = yt-dlp -j --flat-playlist "https://www.youtube.com/playlist?list=$playlistId" | ConvertFrom-Json # 写入M3U文件头 @" #EXTM3U "@ | Out-File $m3uFilePath -Encoding UTF8 # 遍历播放列表视频,匹配已下载的文件并写入M3U foreach ($video in $playlistVideos) { $videoId = $video.id $matchedFile = Get-ChildItem -Path $videosDir -Filter "$videoId.*" -ErrorAction SilentlyContinue if ($matchedFile) { $relativePath = "./videos/$($matchedFile.Name)" @" #EXTINF:-1,$($video.title) $relativePath "@ | Out-File $m3uFilePath -Encoding UTF8 -Append } } Write-Host "已生成播放列表: $m3uFilePath" } Write-Host "频道备份与播放列表生成完成!"
关键细节说明
- 避免重复下载:使用
--download-archive参数记录已下载视频ID,后续运行脚本仅下载新增视频;同时用视频ID作为文件名,彻底规避共享视频的重复存储问题 - 高效获取元数据:
--flat-playlist参数仅拉取播放列表/视频的元数据,无需下载内容,大幅提升处理速度 - 兼容性处理:自动替换播放列表标题中的非法字符,避免生成文件时出错;过滤播放列表中未下载的外部视频(如频道引用的其他作者视频)
- 可定制化:可添加yt-dlp参数调整下载画质(如
-f bestvideo+bestaudio/best)、字幕(如--write-sub)等需求
内容的提问来源于stack exchange,提问作者Araneus0390
相关产品推荐
相关产品推荐

