昨天想下一下油管上面的视频,找了半天工具发现一个比一个难用,尤其是网页上各种网页下载,不是打不开就是需要money(/= _ =)/~┴┴
不过好在功夫不负有心人,在经过漫长的Github搜寻,总算是找到了。
yt-dtp
yt-dlp是一款基于Python开发的免费、开源、跨平台命令行工具,旨在帮助用户下载来自多种在线视频平台的音视频内容。它支持超过1800个网站,包括主流的国内外平台,如YouTube、B站、微博、爱奇艺、优酷、小红书、喜马拉雅FM、CCTV央视网、Facebook、Instagram、Reddit、Twitter、TikTok等。
yt-dlp的功能十分强大,支持包括断点续传、视频格式转换(依赖于FFmpeg)、自动跳过广告的SponsorBlock功能、Cookie支持、视频章节分割等众多特性。用户还可以通过安装插件来扩展更多功能,如YouTube Agegate Bypass和YouTube nsig Proxy等。此外,它还支持后期处理,如合并、分割、添加元数据或转换视频格式。
GitHub官网:github.com/yt-dlp/yt-d…,打不开的小伙伴文末获取下载链接。
原本是打算用lux呢,但下载油管视频得需要登录,用lux的cookie一直有问题,于是就换成了yt-dlp
使用方式
介绍使用之前,先介绍下怎么安装吧。
window用户去github下载release版,记得要配置环境变量。
这俩下载哪一个都可以。
Mac用户直接用brew install yt-dlp命令行来安装。
装完yt-dlp之后还要装一下ffmpeg,这主要用来合成视频的。
官网下载地址:ffmpeg.org/download.ht…
windows用户就选择中间那个下载就可以了,Mac用户用brew install ffmpeg一键下载即可。
注意:再次提醒一下,windows用户这两个下载完后,记得陪一下环境变量,不然用得有点麻烦(如何配置自己搜,网上教程很多)
通常情况下用yt-dlp "视频URL"就能下载视频了,不过现在平台都需要登录后才能看高清视频,比如B站。
所以使用的时候最好指定cookie,yt-dlp --merge-output-format mp4 --cookies-from-browser chrome 视频url,这个命令就是我经常用的了。
--merge-out-format:这个参数用来指定视频输出格式,大部分平台都支持上传MP4格式,如果你是搬运的话用MP4就可以了。
--cookies-from-browser:这个参数就是用于从哪里获取cookie,chrome代表去默认安装路径下找chrome浏览器,如果你安装浏览器的时候改了安装位置,这就需要手动指定本级chrome浏览器位置了。
这基本上能应付80%的下载需求了,如果你要下载外面的视频,记得全局开着科技。
工具的其他参数使用yt-dlp --help查看,这里就不过多介绍了。
自用分享
最后分享下自己懒省事写的小玩意,改一下代码里面的视频链接就能下载,改视频md5一条龙全做了,实在是搬运视频懒人大法。
func main() { video := "https://www.youtube.com/watch?v=tSR1-tHSQRg" cmd := exec.Command("yt-dlp", "--merge-output-format", "mp4", "--cookies-from-browser", "chrome", video) output, err := cmd.Output() if err != nil { fmt.Printf("执行命令出错: %v\n", err) return } // 解析输出 videoFileName := "" lines := strings.Split(string(output), "\n") for _, line := range lines { // 其他解析保持不变 if strings.Contains(line, "[Merger]") { re := regexp.MustCompile(`\[Merger\] Merging formats into "(.+?)"`) matches := re.FindStringSubmatch(line) if len(matches) > 1 { videoFileName = matches[1] fmt.Printf("视频文件名: %s\n", videoFileName) break } } } videoPath := videoFileName // 替换为你的视频文件路径 // 计算原始MD5 originalMD5, err := calculateMD5(videoPath) if err != nil { fmt.Printf("计算原始MD5失败: %v\n", err) return } fmt.Printf("原始文件MD5: %s\n", originalMD5) // 修改文件MD5 err = modifyVideoMD5(videoPath) if err != nil { fmt.Printf("修改文件MD5失败: %v\n", err) return } // 计算新的MD5 newMD5, err := calculateMD5(videoPath) if err != nil { fmt.Printf("计算新MD5失败: %v\n", err) return } fmt.Printf("修改后文件MD5: %s\n", newMD5)}func modifyVideoMD5(filePath string) error { // 打开视频文件 file, err := os.OpenFile(filePath, os.O_APPEND|os.O_WRONLY, 0644) if err != nil { return fmt.Errorf("打开文件失败: %v", err) } defer file.Close() // 生成随机字节 rand.Seed(time.Now().UnixNano()) randomByte := []byte{byte(rand.Intn(256))} // 在文件末尾添加随机字节 _, err = file.Write(randomByte) if err != nil { return fmt.Errorf("写入文件失败: %v", err) } return nil}func calculateMD5(filePath string) (string, error) { // 打开文件 file, err := os.Open(filePath) if err != nil { return "", fmt.Errorf("打开文件失败: %v", err) } defer file.Close() // 创建MD5 hash hash := md5.New() // 将文件内容复制到hash if _, err := io.Copy(hash, file); err != nil { return "", fmt.Errorf("计算MD5失败: %v", err) } // 获取MD5值并转换为十六进制字符串 return fmt.Sprintf("%x", hash.Sum(nil)), nil}
本期资源
yt-dlp和ffmpeg安装包:pan.quark.cn/s/1d019c5d6…
闲聊
以后程序得好好自测了,差点背锅。。。
本文由橙心同步助手提供同步支持