[i=s] 本帖最后由 哈哈_Gh3c1 于 2024-12-26 23:10 编辑 [/i]<br />
<br />
1.歌单导入
m3u格式的歌单放在navidrome歌曲目录中可以自动识别导入,所以在歌曲目录下创建playlists专门放m3u歌单

由于歌曲数量庞大,手动编辑太麻烦

2.使用GPT编写了一个歌单生成脚本,歌单名称使用文件夹名
#!/bin/bash
# 支持的音频文件扩展名
SUPPORTED_EXTENSIONS=("flac" "wav" "dts" "aiff" "m4a" "ape" "aac" "mp3" "ogg" "wma")
# 打印帮助信息
function print_help {
echo "Usage: $0 <source_directory> <playlist_directory>"
echo ""
echo "Arguments:"
echo " <source_directory> 指定需要扫描的源目录(包括子目录)"
echo " <playlist_directory> 指定歌单文件生成的目标目录"
echo ""
echo "Description:"
echo " 遍历指定目录及其子目录,生成 .m3u 歌单文件,歌单文件名根据文件夹名生成。"
}
# 获取文件扩展名
function get_extension {
local filename="$1"
echo "${filename##*.}" | tr '[:upper:]' '[:lower:]'
}
# 创建歌单文件
function create_playlist {
local folder_path="$1"
local playlist_dir="$2"
# 获取当前文件夹名和父文件夹名
local folder_name=$(basename "$folder_path")
local parent_folder_name=$(basename "$(dirname "$folder_path")")
# 检查是否需要为歌单名追加父文件夹名以避免冲突
local playlist_name="$folder_name.m3u"
if [[ -f "$playlist_dir/$playlist_name" ]]; then
playlist_name="${parent_folder_name}_$folder_name.m3u"
fi
# 歌单完整路径
local playlist_path="$playlist_dir/$playlist_name"
# 写入歌单文件头(只包含歌单名称)
echo "#EXTM3U" > "$playlist_path"
echo "#PLAYLIST:$folder_name" >> "$playlist_path"
# 遍历当前文件夹中的音频文件
find "$folder_path" -type f | while IFS= read -r file; do
local extension=$(get_extension "$file")
if [[ " ${SUPPORTED_EXTENSIONS[@]} " =~ " ${extension} " ]]; then
# 添加音频文件路径到歌单
echo "$file" >> "$playlist_path"
fi
done
echo "歌单已生成: $playlist_path"
}
# 主函数
function main {
local source_dir=""
local playlist_dir=""
# 检查参数
if [[ $# -lt 2 ]]; then
print_help
exit 1
fi
source_dir="$1"
playlist_dir="$2"
# 检查源目录和目标目录
if [[ ! -d "$source_dir" ]]; then
echo "错误:源目录不存在:$source_dir"
exit 1
fi
mkdir -p "$playlist_dir"
# 导出函数以便 parallel 调用
export -f create_playlist get_extension
# 使用 parallel 调用 create_playlist
find "$source_dir" -type d | parallel -j "$(nproc)" create_playlist {} "$playlist_dir"
}
main "$@"
功能详解
- 扫描文件夹:
- 使用
find 遍历源目录及其子目录,找到所有子文件夹。
- 生成歌单文件:
- 歌单名称格式为
文件夹名.m3u ,如果有重名文件夹,则在歌单名中追加父文件夹名称。
- 歌单文件开头会包含:
#EXTM3U
#PLAYLIST:<歌单名称>
- 列出当前文件夹下所有支持的音频文件的路径。
- 多线程优化:
- 使用
parallel 并发处理多个文件夹,提升处理效率。
- 支持的音频文件格式:
SUPPORTED_EXTENSIONS 列表定义了支持的文件扩展名。
依赖工具
- GNU Parallel:
- 用于多线程并发执行。
- 安装命令(Debian/Ubuntu):
sudo apt install parallel
- Sox:
- 用于获取音频文件的时长。
- 安装命令(Debian/Ubuntu):
sudo apt install sox
使用方法
脚本运行
假设脚本保存为 generate_m3u.sh :
./generate_m3u.sh /path/to/source_directory /path/to/playlist_directory
参数说明:
/path/to/source_directory :扫描的根目录。
/path/to/playlist_directory :生成的 .m3u 歌单文件存放目录。

|