懒人搬运大法,一键下载视频并修改md5值

371 阅读4分钟

昨天想下一下油管上面的视频,找了半天工具发现一个比一个难用,尤其是网页上各种网页下载,不是打不开就是需要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官网:github.com/yt-dlp/yt-d…,打不开的小伙伴文末获取下载链接。

2

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

使用方式

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

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

3

这俩下载哪一个都可以。

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

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

官网下载地址:ffmpeg.org/download.ht…

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

闲聊

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

原文链接:kjsay.com/archives/17…

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