| [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 parallelSox:
用于获取音频文件的时长。安装命令(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歌单文件存放目录。 
 |