Генерация *.m3u плейлиста из консоли


ooTync аватар

ooTync - Posted on 02 Август 2010

Сделал скрипт, генерирующий полноценный M3U-плейлист и выбирающий метаинформацию из тегов файлов. Поддерживаются форматы: mp3, ogg, flac.
Пример работы:

ootync@rtfm:/var/OOTYNC/MP3$ m3u-gen .
#EXTM3U
#EXTINF:311,Manowar — Number 1
Rock/Manowar/1996 - Louder Than Hell/05-Number 1.flac
#EXTINF:249,Manowar — The Power
Rock/Manowar/1996 - Louder Than Hell/10-The Power.flac
...
#!/usr/bin/env bash
 
#=== WELCOME
 
# Check binaries
requires="soxi mid3v2 vorbiscomment metaflac"
which $requires > /dev/null || { echo "E: These binaries are required: $requires" >&2 ; exit 1; }
 
# Help
function display_help(){
		cat <<-HELP
		Recursive M3U playlist generator with tag-reading.
		Usage: $(basename "$0") dir [dir]... > dir/playlist.m3u
		(c) o_O Tync, ICQ# 1227-700, Enjoy!
		HELP
		exit 0
}
[ $# -eq 0 ] && { display_help ; exit 0; }
 
#=== PROCESS
 
# Header
echo "#EXTM3U"
SED_KEYVAL='s~^([^=]+)=(.*)$~\1=\"\2\"~p'
 
# List all files
find $@ -regextype posix-extended -iregex ".*\.(mp3|flac|ogg)" \
	| while read file ; do
		declare -u ext
		ext=${file##*.}
		case "$ext" in
			"MP3")
				eval "$(mid3v2 "$file" | sed -rne "$SED_KEYVAL")"
				ARTIST="$TPE1"
				TITLE="$TIT2"
				;;
			"OGG")
				eval "$(vorbiscomment -l "$file" | sed -rne "$SED_KEYVAL")"
				;;
			"FLAC")
				eval "$(metaflac --export-tags-to='-' "$file" | sed -rne "$SED_KEYVAL")"
				;;
		esac
		length="$(soxi -D "$file" | cut -d . -f 1)"
		echo "#EXTINF:$length,$ARTIST — $TITLE"
		echo "$file"
	done
4.666665
Ваша оценка: Ничего Рейтинг: 4.7 (3 голоса)

А что такое declare -u? В man bash нет.

$ bash --version
GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
$ declare -u ext
bash: declare: -u: invalid option
declare: usage: declare [-afFirtx] [-p] [name[=value] ...]

Что касается кода, то в принципе достаточно одного exit 0, либо внутри display_help, либо после вызова {display_help; exit 0;}

'exit'ов два — чтобы уж наверняка! .. да, действительно он лишний :)

declare -u есть в bash v4.x. Это устанавливает переменной атрибут "при присвоении значения перевести все символы в верхний регистр". Можно сделать так:

- declare -u ext
  ext=${file##*.}
+ ext="${ext^^}"

Здоровский скрипт. Написан хорошо, приятно читать

для того что бы работал soxi в debian, нужно поставить libsox-fmt-mp3, libsox-fmt-ogg, libsox-fmt-flac. Это рекомендованные пакеты, но не обязательные и их может не быть.

soxi FAIL formats: no handler for file extension `mp3'

Отличный скрипт, спасибо! Уже поселился в /usr/local/bin/ на пмж. Но уважаемый автор не находит, что использование env для приложения, которое заведомо в /bin/ по LSB это, эм, несколько излишняя перестраховка?

во freebsd bash живет в /usr/local/bin например

requires="soxi mid3v2 vorbiscomment metaflac"
which $requires || exit 1

это хороший прикол, надо запомнить. только в данном случае не подходит, так как мне всегда нужен по сути только mid3v2, остальные не нужны.. да и врядли что бы всем нужен был весь набор.

Согласен. Была мысль предварительно просканировать коллекцию, но имхо для такого скрипта это слишком :)

да, сканировать два раза это не выход Ж:-)
можно просто проверять на наличие при первом попадании в case. и если программа не найдена - выводить в самом конце в поток ошибок "Внимание: был найден .mp3, так что нужна такая то программа"

m3u: line 48: ошибка синтаксиса: неожиданный конец файла

попробуй еще раз скопировать. это моя вина, когда публиковал совет, один ; съелся.

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.