Сайт | Скачать | Видео | Wiki

Автор Тема: Простое радио для консоли.  (Прочитано 31352 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 899
  • Репутация: +24/-0
  • Автор темы
Re: Простое радио для консоли.
« Ответ #180 : 17 Август 2023, 11:39:33 »
докрутил вроде, но теперь в этом скрипте wget останавливается и затем перезапускается только в случае, если изменяется имя трека. Как только скрипт обнаруживает, что новое имя трека отличается от текущего, он останавливает предыдущий процесс wget, а затем запускает новый процесс wget для скачивания нового трека. Остановить процесс записи нажатием на Ctrl+c
Код
#!/bin/bash
#set -x
cd $HOME/Music/streams/
link=$(cat $HOME/r_di_011/playlist/.l.txt)
current_trackname=""

# Получаем начальное имя трека
rm ./stream_metadata.txt
ffmpeg -i "$link" -f ffmetadata -loglevel error -hide_banner stream_metadata.txt
sed -i 's/StreamTitle=//g' ./stream_metadata.txt
sed -i '/;FFMETADATA1/d' stream_metadata.txt
sed -i '/icy/d' stream_metadata.txt
sed -i '/encoder/d' stream_metadata.txt
current_trackname=$(cat stream_metadata.txt)

# Запускаем wget в фоновом режиме
wget -O "$current_trackname".mp3 "$link" &

while true; do
    # Получаем новое имя трека
    rm ./stream_metadata.txt
    ffmpeg -i "$link" -f ffmetadata -loglevel error -hide_banner stream_metadata.txt
    sed -i 's/StreamTitle=//g' ./stream_metadata.txt
    sed -i '/;FFMETADATA1/d' stream_metadata.txt
    sed -i '/icy/d' stream_metadata.txt
    sed -i '/encoder/d' stream_metadata.txt
    new_trackname=$(cat stream_metadata.txt)

    if [ "$new_trackname" != "$current_trackname" ]; then
        echo "Track name changed. Stopping wget..."
        killall -9 "wget -O $current_trackname.mp3"  # Останавливаем предыдущий wget
        wget -O "$new_trackname".mp3 "$link" &  # Запускаем новый wget
        current_trackname="$new_trackname"
    fi

    sleep 5
done

... не могу понять почему перестал работать pkill -f , это на моих системах (Debian)  так, или это перестало работать у всех?
« Последнее редактирование: 17 Август 2023, 11:41:49 от totiks2012 »

Оффлайн imp

  • cat /dev/ass > /dev/head
  • Ветеран
  • *****
  • Сообщений: 1725
  • Репутация: +49/-1
  • /dev/hands < /dev/ass
Re: Простое радио для консоли.
« Ответ #181 : 17 Август 2023, 20:59:14 »
М-дэ, вы немного меня не так поняли... Есть .l.txt? Чтобы потестить свой еще не рожденный вариант?
И в конце концов - где пакет? На кофейной гуще гадать, что-ли?)
-------------------------------------------
Разобрался
« Последнее редактирование: 17 Август 2023, 22:12:52 от imp »
Компьютер имеет то преимущество перед мозгом, что им пользуются.

Оффлайн imp

  • cat /dev/ass > /dev/head
  • Ветеран
  • *****
  • Сообщений: 1725
  • Репутация: +49/-1
  • /dev/hands < /dev/ass
Re: Простое радио для консоли.
« Ответ #182 : 18 Август 2023, 00:45:37 »
Код
#!/bin/bash

link=$(cat link.txt)
destdir=$HOME/Music/streams/
current_trackname=""
tempfile=/tmp/stream_metadata.txt

download() {
    ffmpeg -i "$link" -f ffmetadata -loglevel error -hide_banner $tempfile -y
    sleep 1
    new_trackname=$(grep "StreamTitle" $tempfile | cut -f2 -d'=' | tr ';' ' ')

    if [ "$new_trackname" != "$current_trackname" ]; then
        kill -9 $! 2&1>/dev/null
        wget -O "$destdir$new_trackname".mp3 "$link" &
        current_trackname="$new_trackname"
    fi
}

while [ 1 ]
do
download
read -t 1 -n 1 key
[ "$key" = "q" ] || [ "$key" = "Q" ] && kill -9 $! && kill -9 $$
done

Как-то так. Лучше выходить не ctrl+c, а по q/Q
Тогда глушится и скрипт (kill -9 $$) и дочерний процесс wget (kill -9 $!).
А по ctrl+c - что в вашем, что в моем примере останется запущенный wget.
« Последнее редактирование: 18 Август 2023, 00:55:54 от imp »
Компьютер имеет то преимущество перед мозгом, что им пользуются.

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 899
  • Репутация: +24/-0
  • Автор темы
Re: Простое радио для консоли.
« Ответ #183 : 18 Август 2023, 15:07:10 »
М-дэ, вы немного меня не так поняли... Есть .l.txt? Чтобы потестить свой еще не рожденный вариант?
И в конце концов - где пакет? На кофейной гуще гадать, что-ли?)
-------------------------------------------
Разобрался
да в .l.txt находится линк радиостанции, идея в том что когда играет радио, извлечь линк текущего радио, ну и из линка извлечь метаданые для имени.

Оффлайн imp

  • cat /dev/ass > /dev/head
  • Ветеран
  • *****
  • Сообщений: 1725
  • Репутация: +49/-1
  • /dev/hands < /dev/ass
Re: Простое радио для консоли.
« Ответ #184 : 18 Август 2023, 20:26:18 »
Было бы неплохо предлагать выбор m3u-шки, а не жестко прописывать ссылку. Но тогда придется доработать.
Компьютер имеет то преимущество перед мозгом, что им пользуются.

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 899
  • Репутация: +24/-0
  • Автор темы
Re: Простое радио для консоли.
« Ответ #185 : 19 Август 2023, 17:35:56 »
Было бы неплохо предлагать выбор m3u-шки
если речь про радио, то скрипт читает все файлы m3u которые находятся в каталоге ~/r_di_011/playlist/ и кидает их содержимое в общий список, ... я вообще на днях переписал это радио с dialog на peco, и переделал под использование с peco плейлист  вот пример
#EXTINF:-1,Новостные--Вести_FM
ссылка
#EXTINF:-1,Новостные--Радио_Sputnik
ссылка
и теперь достаточно набрать (к примеру Новост) в поисковой строке peco , и peco отфильтровывает те имена радиостанций которые относятся к жанру Новостные, и если список будет создан из нескольких плейлистов, несмотря на то что жанры будут разбросаны по списку, peco их отфильтрует и соберет все вместе, очень удобно получилось, если надо кому, выложу, а если нет то нет. Я просто не знаю, я тут просто осознал что то что доступно мне доступно всем, и люди наверно сами пишут себе эти скрипты, не знаю нужно это выкладывать или не нужно. (Но думаю нужно ибо заметил что от этого выигрывают все... заинтересованые.) Мне peco так понравился что я его стал использовать на регулярной основе.
---------------------
на всякий случай поясню файл  .l.txt  генерируется при запуске радио, в него попадает линк текущей радиостанции ,что это нам даёт , слушаю я значит радио, и тут заиграл трек который нравится, я жму конбин. клавиш super+s и паралельно трек начинает записыватся, при этом не прерывая воспроизведение , пользоватся стало прям удобно.
« Последнее редактирование: 20 Август 2023, 11:01:15 от totiks2012 »

Оффлайн imp

  • cat /dev/ass > /dev/head
  • Ветеран
  • *****
  • Сообщений: 1725
  • Репутация: +49/-1
  • /dev/hands < /dev/ass
Re: Простое радио для консоли.
« Ответ #186 : 20 Август 2023, 20:18:11 »
Я просто не знаю, я тут просто осознал что то что доступно мне доступно всем, и люди наверно сами пишут себе эти скрипты, не знаю нужно это выкладывать или не нужно
Иногда люди могут не знать. И разный опыт всегда пригождается. Кроме того, есть побочки, решение которых тоже может быть полезным. Так, что выкладывайте.
Компьютер имеет то преимущество перед мозгом, что им пользуются.

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 899
  • Репутация: +24/-0
  • Автор темы
Re: Простое радио для консоли.
« Ответ #187 : 21 Август 2023, 08:32:05 »
Так, что выкладывайте.
Код Radio_Peco практически идентичен  Radio_dialog, разница лишь как видно  из названия что движок предоставляющий диалог выбора радиостанции заменён с dialog на peco, как говорил выше peco позволяет в поисковой строке задавать жанр радиостанции,и если плейлист правильно подготовлен, группировать радиостанции по жанрам, то есть peco отфильтрует  выведет все имена относящиеся к этому жанру.
Пример, как нужно оформлять плейлисты, в каталоге  ~/r_pe_012/playlist/ , чтоб выбрать имя радиостанции после использования фильтра peco, стрелками вверх ,вниз, выбор по вводу, выход из mpv по Q , из программы по клавиши ESC, оформление и функционал peco мне кажется красивее и мощнее чем у dialog. Прошу прощение но код выложу ссылкой, ибо  пользователю будет удобнее распаковать в домашний архив, и запустить из него скрипт, скачать тут https://disk.yandex.ru/d/LCEtx9FwIbdoxQ , если пользователи захотят использовать дополнение для записи треков то в скрипте дополнения необходимо будет скоректировать строку на путь к  .l.txt , то есть с link=$(cat $HOME/r_di_011/playlist/.l.txt) на link=$(cat $HOME/r_pe_012/playlist/.l.txt) вероятней я выложу опять код этого дополнения но уже для r_pe_012

upd:--маленький анонс--  на днях выложу код скрипта который реализует удобное прослушивание аудиокниг из консоли, в качестве интерфеса выбора использует так же peco, для воспроизведения mpv, код простенький, но там я изощрился, ибо пришлось обойти несколько ограничений
« Последнее редактирование: 14 Октябрь 2023, 07:10:26 от totiks2012 »

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 899
  • Репутация: +24/-0
  • Автор темы
Re: Простое радио для консоли.
« Ответ #188 : 21 Декабрь 2023, 09:48:10 »
Упростил до самого возможного код. Убрал лишние промежуточные текстовые файлы, имя станции и url теперь присваиваю переменым, и потому код стал более читаем проще но хитрее. Сохранил возможность получения url в промежуточный текстовой файл, для использование его со скриптом записи трека радио на лету, код взял тот что предоставил imp, слегка доработав под себя (ещё раз спасибо ему). Изменил структуру плейлиста теперь он перестал быть совместимым с другими плеерами (мне оно не нужно), но в коде есть закоментирование строчки которые позволяют на лету конвертировать универсальный плейлист в в плелист формата peco_radio
у плелиста теперь  такая структур
Код
ns-Имя_станции
http://url_strim
(нижним подчеркиванием или тире решаем проблему пробелов, кавычки иногда не помогают)
Ниже код плеера
Код
#!/bin/bash
cd ~/peco_radio2/
#set -x
#cat ./c_r.m3u >./c_r2.m3u
# Замена маркера в файле
#sed -i 's/^#EXTINF:-1,/ns-/' c_r2.m3u

while true; do

  # Получение списка станций
  mapfile -t stations < <(grep -E 'ns-.*' c_r2.m3u)

  # Проверка, есть ли станции
  if [ "${#stations[@]}" -eq 0 ]; then
    echo "Нет данных о радиостанциях"
    break
  fi

  # Выбор станции
  selected_station="$(printf "%s\n" "${stations[@]}" | peco | awk '{print $1}' || echo)"

  # Выход по Esc
  if [ -z "$selected_station" ]; then
    break
  fi
echo "$selected_station"
  # Получение ссылки 
  selected_url="$(grep -A1 -m1 "$selected_station" c_r2.m3u | grep -o 'http.*')"
  echo "$selected_url" >./.l.txt
 
  # Воспроизведение
  mpv --volume=70 "$selected_url"
clear
done

echo "Выход"



во вложение архив со скриптом и плейлистом радиостанций
upd: только что отредактировал скрипт, и можно сделать так чтоб он читал и стандартные плей лист достаточно изменить строку
 
Код
mapfile -t stations < <(grep -E 'ns-.*' c_r2.m3u
на
 
Код
  mapfile -t stations < <(grep '#EXTINF:-1,' c_r2.m3u | sed 's/#EXTINF:-1,//')
соответсвено плейлист должен иметь стандартную структуру
например
 
Код
#EXTINF:-1,JazzRadio--Джазз
http://jazz128.streamr.ru/
« Последнее редактирование: 21 Декабрь 2023, 10:47:57 от totiks2012 »