昨天想下一下油管上面的视频,找了半天工具发现一个比一个难用,尤其是网页上各种网页下载,不是打不开就是需要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官网:https://github.com/yt-dlp/yt-dlp,打不开的小伙伴文末获取下载链接。
原本是打算用lux
呢,但下载油管视频得需要登录,用lux的cookie一直有问题,于是就换成了yt-dlp
使用方式
介绍使用之前,先介绍下怎么安装吧。
window用户去github下载release版,记得要配置环境变量。
这俩下载哪一个都可以。
Mac用户直接用brew install yt-dlp
命令行来安装。
装完yt-dlp之后还要装一下ffmpeg
,这主要用来合成视频的。
官网下载地址:https://ffmpeg.org/download.html
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
本文由橙心同步助手提供同步支持
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。