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

昨天想下一下油管上面的视频,找了半天工具发现一个比一个难用,尤其是网页上各种网页下载,不是打不开就是需要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
}

闲聊

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

原创文章,作者:小刘,如若转载,请注明出处:https://kjsay.com/archives/173

(0)
上一篇 2025年3月3日 下午8:05
下一篇 2025年3月11日 下午7:52

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

分享本页
返回顶部