使用 find、cat 等...从专辑播放列表生成 M3U 播放列表

使用 find、cat 等...从专辑播放列表生成 M3U 播放列表

我有一个音乐文件夹,每个文件夹中都有选定的播放列表,标题为“playlist.m3u”(也应匹配 *.m3u8)。

我想做的是让 shell 脚本生成一个与所有这些选定曲目连接的播放列表。但为了使播放列表正常工作,必须在歌曲标题之前添加文件夹名称。

这是一个目录结构示例:

Main Folder
 `-> Album 1/
       *.flac
       playlist.m3u
 `-> Album 2/
       *.flac
       playlist.m3u
 `-> Album 3/
       *.mp3
       playlist.m3u

生成的 main-playlist.m3u 文件应如下所示:

Album 1/01. Song1.flac
Album 1/02. Song2.flac
Album 1/03. Song3.flac
Album 1/04. Song4.flac
Album 2/1-01. Song1 (Disc 1).flac
Album 2/1-02. Song2 (Disc 1).flac
Album 2/2-01. Song1 (Disc 2).flac
Album 2/2-02. Song2 (Disc 2).flac
Album 3/001. Song 001.mp3
Album 3/002. Song 002.mp3
Album 3/003. Song 002.mp3
<...>
Album 3/100. Song 100.mp3
Album 3/101. Song 101.mp3

对于最终拥有数千首曲目的歌曲库来说,最好、最有效的方法是什么?

答案1

使用find?例如:

find . -type f -name '*.flac' -or -name '*.mp3'

或者使用绝对路径:

find $PWD -type f -name '*.flac' -or -name '*.mp3'

不区分大小写:

find $PWD -type f -iname '*.flac' -or -iname '*.mp3'

如果您确实想从这些“m3u”文件中提取列表,则可以使用以下方法:

find . -name '*.m3u' -print0 |
while IFS= read -r -d '' plist; do
  len=$(wc -l < "$plist")
  dir=$(dirname "$plist")
  paste -d/ <(yes "$dir" | head -n$len) "$plist"
done

答案2

好吧,我只是发布一个我能够解决这个问题的方法。

#!/bin/sh

for album in */; do
    while read -r track; do
        printf "%s%s\n" "$album" "$track"
    done < "${album}/playlist.m3u"
done > "main-playlist.m3u"

相关内容