Как я могу создать список воспроизведения M3U (формат http URL) из терминала?

11

Я хотел бы создать список воспроизведения M3U для каталога, содержащего mp3-файлы на моем сервере из терминала. Поскольку я хотел бы убедиться, что каждый проигрыватель сможет передавать эти файлы, я бы хотел добавить к каждой записи файла префикс с абсолютным URL-адресом этого каталога, например:

http://server.com/dir/file1.mp3
http://server.com/dir/file2.mp3
...

Так что, к сожалению, просто делать ls -1 *.mp3 > play.m3uнедостаточно. Есть ли один вкладыш для достижения этого?

3k-
источник

Ответы:

8

Я думаю, что следующий однострочный должен работать:

for f in *.mp3; do echo "http://..../$f" >> play.m3u; done

chronitis
источник
7

Это ответ @chronitis с некоторыми улучшениями:

  • сохраняет имя файла в переменной $ playlist для последующего использования
  • удалит файл, если он существует ранее
  • записывает полный путь к файлу в плейлисте

Команда

playlist='play.m3u' ; if [ -f $playlist ]; then rm $playlist ; fi ; for f in *.mp3; do echo "$(pwd)/$f" >> "$playlist"; done

Чтобы играть с mplayer в командной строке также

mplayer -playlist play.m3u
bistoco
источник
Я не знаю, почему кто-то отклонил этот ответ. Это единственное решение, которое, кажется, работает прямо из коробки и должно быть принято или, по крайней мере, продвигаться. Большое спасибо!
Geppettvs D'Constanzo
Что делать, если я хочу добавить несколько форматов файлов в эту команду?
Sumeet Дешмук
4

Вы изначально просили создать каждую запись в виде строки в формате веб-URL. В дополнение к замене локального пути на http: // ... вам также необходимо заменить пробелы на «% 20». Итак, длинная очередь, но здесь вы идете:

find /path/to/mp3s/ -name "*.mp3" | sed 's/ /%20/g' | sed 's|/path/to/mp3s/|http://www.server.com/serverpath/|g' > playlist.m3u
jokono
источник
отличная идея! использование знака «плюс» (+) вместо этого приведет к более удобочитаемому URL-адресу
3k-
2

Этот скрипт bash может сделать эту работу:

rawurlencode() {
  local string="${1}"
  local strlen=${#string}
  local encoded=""
  local pos c o

  for (( pos=0 ; pos<strlen ; pos++ )); do
     c=${string:$pos:1}
     case "$c" in
        [-_.~a-zA-Z0-9] ) o="${c}" ;;
        * )               printf -v o '%%%02x' "'$c"
     esac
     encoded+="${o}"
  done
  echo "${encoded}"
}

rm -rf p.m3u
for f in *.mkv; do echo "#EXTINF:-1,SR:$f
  http://10.0.0.144/tvtmp/"$(rawurlencode $f) >> p.m3u; 
done
sed -i '1s/^/#EXTM3U\n/' p.m3u
rm -rf l.m3u
for f in *.mkv; do echo "#EXTINF:-1,SR:$f
  http://127.0.0.1/tvtmp/$f" >> l.m3u; 
done
sed -i '1s/^/#EXTM3U\n/' l.m3u

Чуть более развитая версия. URL закодирован в правильном .m3uстиле.

krizoek
источник