收起左侧

Navidrome歌单导入以及批量自动生成m3u歌单脚本

11
回复
2694
查看
[ 复制链接 ]

0

主题

1

回帖

0

牛值

江湖小虾

2024-12-26 23:03:23 显示全部楼层 阅读模式

[i=s] 本帖最后由 哈哈_Gh3c1 于 2024-12-26 23:10 编辑 [/i]<br /> <br />

1.歌单导入

m3u格式的歌单放在navidrome歌曲目录中可以自动识别导入,所以在歌曲目录下创建playlists专门放m3u歌单截屏2024-12-2622.49.49.png

截屏2024-12-2622.52.09.png

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

截屏2024-12-2622.55.47.png

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 "$@"

功能详解

  1. 扫描文件夹
    • 使用 find 遍历源目录及其子目录,找到所有子文件夹。
  2. 生成歌单文件
    • 歌单名称格式为 文件夹名.m3u,如果有重名文件夹,则在歌单名中追加父文件夹名称。
    • 歌单文件开头会包含:
      #EXTM3U
      #PLAYLIST:<歌单名称>
    • 列出当前文件夹下所有支持的音频文件的路径。
  3. 多线程优化
    • 使用 parallel 并发处理多个文件夹,提升处理效率。
  4. 支持的音频文件格式
    • SUPPORTED_EXTENSIONS 列表定义了支持的文件扩展名。

依赖工具

  1. GNU Parallel
    • 用于多线程并发执行。
    • 安装命令(Debian/Ubuntu):sudo apt install parallel
  2. 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 歌单文件存放目录。

截屏2024-12-2622.59.38.png

收藏
送赞 3
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

2

主题

29

回帖

0

牛值

江湖小虾

2024-12-27 10:01:35 显示全部楼层
navidrome可以进行相同歌曲不同品质音乐的切换吗?  比如有一首歌, 我以歌手和歌名创建文件夹后里面尤  歌名-歌手.320.mp3  、歌名-歌手.128.mp3、歌名-歌手.flac、  歌名-歌手.lrc,   这种数据 他会识别成1首歌还是3首歌?  能像酷狗一样 当存在不同品质的歌曲时 可以切换 320的或者128的或者无损的歌吗
Navidrome 会将同一首歌的不同音质版本识别为多首歌曲,而无法提供音质切换功能。如果你需要这一功能,建议切换到更强大的音乐管理平台如 Plex 或 Jellyfin,或者手动整理音乐库。  详情 回复
2024-12-27 17:17

0

主题

1

回帖

0

牛值

江湖小虾

2024-12-27 17:17:20 楼主 显示全部楼层
Navidrome 会将同一首歌的不同音质版本识别为多首歌曲,而无法提供音质切换功能。如果你需要这一功能,建议切换到更强大的音乐管理平台如 Plex 或 Jellyfin,或者手动整理音乐库。
非常感谢  详情 回复
2024-12-30 09:38

0

主题

2

回帖

0

牛值

江湖小虾

2024-12-29 22:28:23 显示全部楼层
Navidrome感觉不是很好用。要么是扫不全歌曲,要么就是格式不支持,无损格式没解码。 一直想找一个像影音搜刮功能的音乐工具,一个影音,一个音乐,够用了。
确实如此,目前的方案,就只有手动去解决编码问题,统一过一遍类似foobar2000的转码工具,尽量做到无损、兼容  详情 回复
2024-12-29 23:22

14

主题

54

回帖

30

牛值

社区共建团

社区上线纪念勋章社区共建团荣誉勋章

2024-12-29 23:22:20 显示全部楼层
确实如此,目前的方案,就只有手动去解决编码问题,统一过一遍类似foobar2000的转码工具,尽量做到无损、兼容

2

主题

29

回帖

0

牛值

江湖小虾

2024-12-30 09:38:54 显示全部楼层
哈哈_Gh3c1 发表于 2024-12-27 17:17
Navidrome 会将同一首歌的不同音质版本识别为多首歌曲,而无法提供音质切换功能。如果你需要这一功能,建议 ...

非常感谢

0

主题

3

回帖

0

牛值

江湖小虾

2025-2-18 11:56:47 显示全部楼层
我跑脚本的时候, 下面这个位置获取不到 $SUPPORTED_EXTENSIONS 这个变量呢, `echo $SUPPORTED_EXTENSIONS ` 输出是空的
```sh
    # 遍历当前文件夹中的音频文件
    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
```

0

主题

3

回帖

0

牛值

江湖小虾

2025-2-18 12:18:44 显示全部楼层
本帖最后由 stan_zeng 于 2025-2-18 12:21 编辑

找到一个可以自动更新的方式 (参考链接: https://github.com/navidrome/navidrome/issues/1417), 歌曲目录中放一个 王菲.nsp 文件, 内容如下:

  1. {
  2. "all": [
  3. {"contains": {"filepath":"/vol2/1000/Music/王菲"}}
  4. ],
  5. "sort": "dateadded",
  6. "order": "desc"
  7. }
复制代码
提示:Auto-imported from 'fav.nsp' 没有歌,怎么肥事……?  详情 回复
2025-3-29 12:08

5

主题

19

回帖

0

牛值

江湖小虾

2025-3-29 12:08:08 显示全部楼层
stan_zeng 发表于 2025-2-18 12:18
找到一个可以自动更新的方式 (参考链接: https://github.com/navidrome/navidrome/issues/1417), 歌曲目录 ...

提示:Auto-imported from 'fav.nsp'
没有歌,怎么肥事……?
如果是从docker中安装的(不是商店安装),映射正确可以尝试删除前路径(/music/) { "all": [ {"contains": {"filepath": "王菲"}} ], "sort": "dateadded", "order": "desc" }  详情 回复
2025-4-13 12:39

1

主题

5

回帖

0

牛值

江湖小虾

2025-3-31 04:27:35 显示全部楼层
大神,请把我嘴巴撬开喂一下,看不懂- -。。

1

主题

5

回帖

0

牛值

江湖小虾

2025-3-31 04:28:48 显示全部楼层
可以稍微详细一点吗,照顾一下小虾米

0

主题

2

回帖

0

牛值

江湖小虾

2025-4-13 12:39:28 显示全部楼层
野猪佩奇 发表于 2025-3-29 12:08
提示:Auto-imported from 'fav.nsp'
没有歌,怎么肥事……?

如果是从docker中安装的(不是商店安装),映射正确可以尝试删除前路径(/music/)
{
  "all": [
    {"contains": {"filepath": "王菲"}}
  ],
  "sort": "dateadded",
  "order": "desc"
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则