【问题标题】:Set metadata based on the output filename in yt-dlp根据 yt-dlp 中的输出文件名设置元数据
【发布时间】:2022-11-11 14:03:38
【问题描述】:

我可以从视频中提取音频:

yt-dlp -x --audio-format vorbis --audio-quality 256k --embed-thumbnail -P ~/Music -o "John Doe - Cool song.%(ext)s" tubelink.kom

现在,我想嵌入基于文件名格式输出的元数据,可能吗?在我的示例代码中,艺术家 John Doe 和歌曲名称为 Cool song。 谢谢。

【问题讨论】:

    标签: youtube-dl yt-dlp


    【解决方案1】:

    我主要使用yt-dlp 来保存技术教程等的离线副本,因此可能需要根据您的用例进行调整。我喜欢捕捉很多非标准指标,例如#likes/#views/我下载视频的日期,因为当我下载了 4 或 5 个教程并想看看哪个教程最受欢迎时,我发现这些信息很有用在我下载它们的时候(帮助我选择第一个观看)。 link in the other answer一个很好的参考。但是由于(目前唯一的)其他答案没有试图非常彻底地解释细节或提供任何具体的例子,我决定也尝试根据我自己的经验添加一个。

    我使用了一个大型包装函数,其中很多实际上是由我的设置中的变量/函数参数控制的,但是如果我想以 480p 下载特定的视频格式(通常在屏幕文本命令上),这里是一个生成的命令示例在较低的分辨率下变得难以阅读,而高分辨率会占用更多的磁盘空间)。

    这是来自 Linux 上的 bash shell 函数,但除了我如何使用变量之外,yt-dlp 本身的所有内容都应该是跨平台的。显然,您不需要我使用的所有选项。我只是想提供一个完整的例子。相关选项在 sn-p 下方解释。

    local downloadTimestamp="$(date +'%F %T %Z')";
    # double-escape any colons ONCE to prevent them being interpretted by --parse-metadata
    downloadTimestamp="${downloadTimestamp//:/\:}";
    
    yt-dlp -f "bestvideo+bestaudio/best" 
    --format-sort res:480,+size,+br,codec  
    -o "%(uploader)s_-_%(title)s.%(ext)s" 
    --parse-metadata "${downloadTimestamp}:%(meta_download_date)s" 
    --parse-metadata "%(like_count)s:%(meta_likes)s" 
    --parse-metadata "%(dislike_count)s:%(meta_dislikes)s" 
    --parse-metadata "%(view_count)s:%(meta_views)s" 
    --parse-metadata "%(average_rating)s:%(meta_rating)s" 
    --parse-metadata "%(release_date>%Y-%m-%d,upload_date>%Y-%m-%d)s:%(meta_publish_date)s" 
    --restrict-filenames --windows-filenames 
    --quiet --no-warnings 
    --ignore-errors --prefer-free-formats 
    --xattrs --no-overwrites 
    --sub-lang en --embed-subs --add-metadata --merge-output-format mkv
    --write-auto-subs --embed-metadata --embed-thumbnail 
    "${url}"
    

    --parse-metadata 具有 TO:FROM 参数语法。如果您的目标是从页面捕获某种元数据并将其嵌入下载的文件中,尽管名称不是最直观的,但这是您需要用于映射值的最相关选项。 --embed-metadata 选项对于将元数据嵌入音频/视频文件而不是作为第二个文件也很重要。

    --parse-metadata 参数的TO 部分可以是字符串文字或从脚本中的变量扩展而来的一些文本。或者它可以是另一个yt-dlp 格式字符串,如%(artist)s%(title)s。格式字符串也可以自定义,如%(release_date>%Y-%m-%d)s。如果第一个字段为空(例如%(release_date>%Y-%m-%d,upload_date>%Y-%m-%d)s:%(meta_publishdate)s),您甚至可以使用自定义格式字符串回退到辅助字段。如果要从变量中添加字符串文字或值,请务必确保不存在冒号 (:),或者使用反斜杠转义任何打算作为值一部分的冒号,就像我对downloadTimestamp 在上面。例如:

    --parse-metadata "Tutorial\:Intro to parse-metadata:%(meta_dummy)s"
    

    或者

    --parse-metadata 'Foo:Bar:%(meta_dummy)s"
    

    --parse-metadata 参数的FROM 部分基本上是单词“元”,后跟下划线和现有或新元数据字段的名称。字段名称在--parse-metadata 中指定为小写,但在实际文件中似乎全部大写。我在上面 sn-p 中引用的所有字段都是我编写的自定义字段。

    然后我可以稍后使用mediainfo 或类似工具在下载的文件中查看它们。例如,在 Linux 上,我可以这样做(注意:mediainfo 是跨平台的,并且如果您对终端不满意,请使用 GUI):

    $ mediainfo --Language=raw --Full --Inform="General;%LIKES%" "${filePath}"
    3
     
    $ mediainfo --Language=raw --Full --Inform="General;%VIEWS%" "${filePath}"
    95
     
    $ mediainfo --Language=raw --Full --Inform="General;%PUBLISH_DATE%" "${filePath}"
    2022-04-05
     
    $ mediainfo --Language=raw --Full --Inform="General;%DISLIKES%" "${filePath}"
    NA
    

    如果从未捕获到 DISLIKES 字段,您将获得 NA。例如,如果您从没有评级/不喜欢系统的网站获取视频,就会发生这种情况。或者,特别是对于 youtube,如果您尝试捕获不启用不喜欢的频道/视频的元数据(这是当今的默认设置)。

    【讨论】:

      【解决方案2】:

      在文档中查找“元数据”。

      https://github.com/yt-dlp/yt-dlp#modifying-metadata-examples

      # Interpret the title as "Artist - Title"

      yt-dlp --parse-metadata "title:%(artist)s - %(title)s"

      【讨论】:

      • 您发布的示例使用视频信息,而不是来自输出模板。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 2021-10-27
      • 1970-01-01
      • 2022-07-30
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      相关资源
      最近更新 更多