使用 MediaInfo 命令行和 jq 从文件目录构建有效的 JSON 播放列表

Posted

技术标签:

【中文标题】使用 MediaInfo 命令行和 jq 从文件目录构建有效的 JSON 播放列表【英文标题】:Building valid JSON playlist from directory of files using MediaInfo Command Line and jq 【发布时间】:2019-02-06 16:02:37 【问题描述】:

我在 ubuntu 上使用 MediaInfo 命令行 v18.08 来解析目录中的多个文件并输出 JSON,如下所示:mediainfo * --output=JSON

为每个文件输出以下 JSON(稍微修剪一下)


    "media": 
        "@ref": "openingmusic.mp3",
        "track": [
            
                "@type": "General",
                "Duration": "17.789",
                "Encoded_Library": "LAME3.98r"
            ,
            
                "@type": "Audio",
                "Format": "MPEG Audio",
                "Encoded_Library_Settings": "-m s -V 2 -q 3 -lowpass 18.6 --vbr-old -b 32"
            
        ]
    

但我只想要那个 JSON 的一个子集,所以我使用了 jq-1.5-1

mediainfo *.mp3 --output=JSON | jq '. | duration: .media.track[0].Duration, pubDate: .media.track[0].File_Modified_Date_Local, url: .media."@ref"'

很好,除了元素之间没有,,整个部分都没有包含在 [] 中,当然,虽然我可以捏造那部分,但如果我加入输出,我会得到一个尾随逗号。

请问,jq 的正确做法是什么?

【问题讨论】:

看来mediainfo 正在为每个 mp3 文件输出 json。它们是独立且不同的对象。如果要将输出视为单个数组(或将 inputs 收集到数组中),则必须首先输入输入。然后,您可以绘制属性。 (***.com/questions/29404575) 感谢@JeffMercado - 似乎在我发布此问题后不久发布的 mediainfo 版本(通过 apt upgrade 更新的 18.08-1)现在将“*.mp3”的结果包装在一个 JSON 对象,因此可以“按原样”使用 【参考方案1】:

您可以使用--slurp 选项:

--slurp/-s: 不要为输入中的每个 JSON 对象运行过滤器,而是将整个输入流读入一个大数组并只运行一次过滤器。

结合map 对数组的每个元素运行过滤器:jq -s 'map(duration: .media.track[0].Duration, pubDate: .media.track[0].File_Modified_Date_Local, url: .media."@ref")'

那么输出仍然是一个数组。

【讨论】:

嗯,非常感谢 - 效果很好,大约 20 分钟!然后一切,包括我的原始代码,都停止了工作。似乎今天刚刚更新的 mediainfo 版本(通过 apt upgrade 更新的 18.08-1)现在将“*.mp3”的结果包装在 JSON 对象中,因此可以“按原样”使用。虽然,我至少知道这可以通过 jq “展开”。再次感谢。

以上是关于使用 MediaInfo 命令行和 jq 从文件目录构建有效的 JSON 播放列表的主要内容,如果未能解决你的问题,请参考以下文章

在另一个命令中使用 mediainfo 的输出作为变量

在 python 中使用 mediainfo 提取电影名称

《自拍教程21》mediainfo_多媒体文件查看工具

如何使用 mediainfo 以秒或其他格式查找视频文件的持续时间?

Bash:无法通过 mediainfo 浏览目录中的所有文件

具有立体声或多个音频流的媒体流的音频持续时间的特定 mediainfo 命令