使用 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 以秒或其他格式查找视频文件的持续时间?