倒序修改时间音乐播放列表生成脚本
编辑#!/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格式的内容,将输出重定向到文件中即可得到根据文件修改时间倒序的音乐播放列表。
脚本内容:
使用修改时间倒序遍历指定目录获取到文件列表,使用临时文件中转是为了按行分隔,因为音乐标题可能包含空格
遍历临时文件,按行分隔,每一个文件调用ffmpeg的命令获取音频时长,然后使用相对路径输出
遍历文件时候排除调jpg和lrc文件(我这里只会有mp3、flac、jpg、lrc文件)
附上GPT4的解释:
这个脚本是一个 Bash 脚本,用来生成一个 .m3u 格式的播放列表文件,其中包含了指定目录中音乐文件的信息。
让我来逐行解释这个脚本:
#!/bin/bash
: 这是一个 shebang,指明了这个脚本需要使用 bash 来解释执行。
p() { ... }
: 这是一个函数定义,名字为p
,用来处理每个音乐文件。
filePath=$1
: 定义了一个局部变量filePath
,用来存储传入函数的第一个参数,即文件路径。
if [[ "$filePath" == *.jpg ]]; then ... fi
: 检查文件路径是否以 .jpg 结尾,如果是,则直接返回,不做处理。
if [[ "$filePath" == *.lrc ]]; then ... fi
: 检查文件路径是否以 .lrc 结尾,如果是,则直接返回,不做处理。
local duration=$(ffprobe -i "$filePath" -show_entries format=duration -v quiet -of csv="p=0")
: 使用 ffprobe 命令获取音频文件的时长,并将结果存储在局部变量duration
中。
local d=${duration%.*}
: 将时长转换为整数,去掉小数部分。
local fileName=$(basename "$filePath")
: 获取文件路径中的文件名部分,存储在局部变量fileName
中。
local musicName1=${fileName%.*}
: 去掉文件名中最后一个 . 后面的部分,存储在musicName1
中。
local musicName=${musicName1#*- }
: 去掉musicName1
中第一个出现的 "- " 字符串,得到最终的音乐名称,存储在musicName
中。
echo "#EXTINF:$d,$musicName"
: 输出 .m3u 文件格式中的一行信息,包括音乐时长和名称。
echo "CloudMusic/$fileName"
: 输出 .m3u 文件格式中的一行音乐文件相对路径。
ls -t /Users/mystery0/OneDrive/CloudMusic/* > temp
: 将指定目录下的所有文件按修改时间排序后输出到一个临时文件temp
中。
echo '#EXTM3U'
: 输出 .m3u 文件格式的头部信息。
while read line; do ... done < temp
: 逐行读取临时文件temp
中的内容,并对每一行执行p
函数。
rm temp
: 删除临时文件temp
。总体来说,这个脚本的功能是扫描指定目录中的音乐文件,提取它们的时长和名称,然后按照 .m3u 文件格式输出播放列表信息。
- 0
- 0
-
分享