Задача.
Хочу устроить караоке party. У меня есть n-ное количество DVD караоке образов (iso). Хочу с помощью плей листа и mplayer проигрывать отдельные (выбранные участниками) песни с разных дисков не открывая каждый раз меню диска (dvdnav://)
Задача в целом выполнена. Скрипт проигрывания отдельных треков готов и обкатан. (листинг ниже). Проблема как раз в маленьком дополнительном скрипте, который считывает файл плейлиста и в цикле вызывает скрипт проигрывания и подставляет два параметра из файла плейлиста - номер диска и номер песни.
Исходные данные.
- Операционка OpenSUSE 12.2 (ядро стоковое, ничего не пересобирал)
- Есть образы (iso) DVD караоке дисков.
- Mplayer установлен из официальных репов SUSE.
- Файлы образов расположены в одном каталоге и названы 1-хх.iso 2-хх.iso... пронумерованы для удобства
- Структура DVD караоке такова:
Один или несколько title (почему не один title не знаю, не я ихмо делал) и куча chapter. Каждый chapter это отдельная песня. Причем, может быль 2 title: на 1-ом (title 1) 89 чаптеров, а на 2-ом (title 2) 31 чаптер, а если обратиться к меню диска или обложке, то там нумерация песен сквозная т.е. от 1 до 120 (89+31=120). Т.е. например песня под номером 101 это фактически title 2 / chapter 12 (101-89=12). Соответственно пришлось немного повозиться чтобы вычислить нужный title и chapter. Еще одна особенность - там может быть и title 3 с 1-2-мя чаптерами на которых фактически меню диска.
Такой title исключаю проверкой количества чаптеров.
Вот листинг скрипта проигрывания отдельных песен
(/usr/sbin/karaoke)#!/bin/sh pth=/run/media/michael/WD_Disk/Караоке/ song=$2 ARGS=2 E_BADARGS=65 if [ $# -ne "$ARGS" ] ; then echo "Порядок использования: `basename $0` имя(номер)-диска номер-песни" exit $E_BADARGS fi name=`ls $pth | grep -m 1 ^$1` if [ -z "$name" ] ; then echo "Файл DVD не найден" exit 0 fi name=$pth$name title=$(lsdvd -v "$name" 2>/dev/null | grep ^Title | awk '{print $4}' | wc -l) total=0 for ((i=1; i <= title; i++)) do chapter=$(lsdvd -t $i -v "$name" 2>/dev/null | grep ^Title | awk '{print $6}' | sed 's/,//g' | sed 's/^0//') if [ "$chapter" -gt 2 ] ; then chapter[$i]=$chapter total=$((total+chapter[$i])) else title=$((title-1)) fi done if [ "$song" -gt "$total" ] ; then echo "Нет такого номера песни на этом диске" exit 0 fi for ((index=1; song > chapter[$index] && index <= title; index++)) do song=$((song-chapter[$index])) done # DVD angle recognizer angle=$(mplayer dvd://$index -dvd-device "$name" -nosound -vo null -frames 0 2>/dev/null | grep -E -w -o '[0-9]{1,2}\sangles' | sed 's/\sangles//') # Play video mplayer dvd://$index -dvd-device "$name" -chapter $song-$song -vo x11 -ao alsa -alang ru -dvdangle $angle -fs -zoom -framedrop -cache 2000 -really-quiet -stop-xscreensaver
А вот скриптик проигрывания плей листа (который НЕ работает) Файл плейлиста считывается и передает два параметра (номер диска и номер песни) в вышеуказанный скрипт, но почему то на mplayer вываливается. Башку уже сломал. А еще ниже скрипт который работает, но кривой и не кошерный (не могу я так).
#!/bin/sh while read line ; do /usr/sbin/karaoke $line sleep 3 done <playlist
А вот так работает!!!!
#!/bin/sh index=1 while read line ; do song[$index]=$line index=$((index+1)) done <playlist for ((i=1; i<index; i++)) ; do /usr/sbin/karaoke ${song[$i]} sleep 3 done
Вот файл плейлиста (cat playlist). Первый параметр в нем, например 1-2- это начало имени файла (Например 1-2-песни из кино.iso), второй номер песни.
1-2- 13 2- 29 10- 4 11- 27 1-1 101 22- 12 24- 73 15- 66 1-1- 102
Ребята, не посылайте только в google - я там уже был )). Не могу реально понять в чем дело. Ну должен же скриптик тот маленький работать. Просто обязан. Уперся в стену и никак не могу сдвинуться. Понимаю, что дело в какой то ерунде, но никак не пойму в какой!