Mystery0の小站

Mystery0の小站

倒序修改时间音乐播放列表生成脚本

2023-12-26
#!/bin/bash

p() {
    filePath=$1
    if [[ "$filePath" == *.jpg ]]; then
        return
    fi
    if [[ "$filePath" == *.lrc ]]; then
        return
    fi
    local duration=$(ffprobe -i "$filePath" -show_entries format=duration -v quiet -of csv="p=0")
    local d=${duration%.*}
    local fileName=$(basename "$filePath")
    local musicName1=${fileName%.*}
    local musicName=${musicName1#*- }
    echo "#EXTINF:$d,$musicName"
    echo "CloudMusic/$fileName"
}

ls -t /OneDrive/CloudMusic/* > temp

echo '#EXTM3U'

while read line
do
    p "$line"
done < temp
rm temp

使用上面的脚本可以生成一个m3u8格式的内容,将输出重定向到文件中即可得到根据文件修改时间倒序的音乐播放列表。

脚本内容:

  1. 使用修改时间倒序遍历指定目录获取到文件列表,使用临时文件中转是为了按行分隔,因为音乐标题可能包含空格

  2. 遍历临时文件,按行分隔,每一个文件调用ffmpeg的命令获取音频时长,然后使用相对路径输出

  3. 遍历文件时候排除调jpg和lrc文件(我这里只会有mp3、flac、jpg、lrc文件)

附上GPT4的解释:

这个脚本是一个 Bash 脚本,用来生成一个 .m3u 格式的播放列表文件,其中包含了指定目录中音乐文件的信息。

让我来逐行解释这个脚本:

  1. #!/bin/bash: 这是一个 shebang,指明了这个脚本需要使用 bash 来解释执行。

  2. p() { ... }: 这是一个函数定义,名字为 p,用来处理每个音乐文件。

  3. filePath=$1: 定义了一个局部变量 filePath,用来存储传入函数的第一个参数,即文件路径。

  4. if [[ "$filePath" == *.jpg ]]; then ... fi: 检查文件路径是否以 .jpg 结尾,如果是,则直接返回,不做处理。

  5. if [[ "$filePath" == *.lrc ]]; then ... fi: 检查文件路径是否以 .lrc 结尾,如果是,则直接返回,不做处理。

  6. local duration=$(ffprobe -i "$filePath" -show_entries format=duration -v quiet -of csv="p=0"): 使用 ffprobe 命令获取音频文件的时长,并将结果存储在局部变量 duration 中。

  7. local d=${duration%.*}: 将时长转换为整数,去掉小数部分。

  8. local fileName=$(basename "$filePath"): 获取文件路径中的文件名部分,存储在局部变量 fileName 中。

  9. local musicName1=${fileName%.*}: 去掉文件名中最后一个 . 后面的部分,存储在 musicName1 中。

  10. local musicName=${musicName1#*- }: 去掉 musicName1 中第一个出现的 "- " 字符串,得到最终的音乐名称,存储在 musicName 中。

  11. echo "#EXTINF:$d,$musicName": 输出 .m3u 文件格式中的一行信息,包括音乐时长和名称。

  12. echo "CloudMusic/$fileName": 输出 .m3u 文件格式中的一行音乐文件相对路径。

  13. ls -t /Users/mystery0/OneDrive/CloudMusic/* > temp: 将指定目录下的所有文件按修改时间排序后输出到一个临时文件 temp 中。

  14. echo '#EXTM3U': 输出 .m3u 文件格式的头部信息。

  15. while read line; do ... done < temp: 逐行读取临时文件 temp 中的内容,并对每一行执行 p 函数。

  16. rm temp: 删除临时文件 temp

总体来说,这个脚本的功能是扫描指定目录中的音乐文件,提取它们的时长和名称,然后按照 .m3u 文件格式输出播放列表信息。