头图

昨天想下一下油管上面的视频,找了半天工具发现一个比一个难用,尤其是网页上各种网页下载,不是打不开就是需要money(/= \_ =)/~┴┴

1

不过好在功夫不负有心人,在经过漫长的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官网:https://github.com/yt-dlp/yt-dlp,打不开的小伙伴文末获取下载链接。

2

原本是打算用lux呢,但下载油管视频得需要登录,用lux的cookie一直有问题,于是就换成了yt-dlp

使用方式

介绍使用之前,先介绍下怎么安装吧。

window用户去github下载release版,记得要配置环境变量。

3

这俩下载哪一个都可以。

Mac用户直接用brew install yt-dlp命令行来安装。

装完yt-dlp之后还要装一下ffmpeg,这主要用来合成视频的。

官网下载地址:https://ffmpeg.org/download.html

4

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安装包:https://pan.quark.cn/s/1d019c5d6e2b

闲聊

以后程序得好好自测了,差点背锅。。。

原文链接:https://kjsay.com/archives/173

本文由橙心同步助手提供同步支持


不爱加班的小刘
1 声望0 粉丝