ОсновноеRadiotalkПользовательское
Технологии вещания, софт, скрипты
3   •   Посмотреть все темы

liquidsoap

 

6245
Тарас @tarasian666
Соотношение не означает порядок, если посчитать общее кол-во треков и джинглов и сопоставить с количеством отигравших треков и джинглов то все сходится. 1 джингл на 4 песни = 10 джинглов на 40 песен, то есть может отиграть 10 джинглов подряд а потом 40 песен и тд

вот поэтому у меня за ротацию отвечает внешний скрипт и все треки внесены в базу с датой и временем когда отиграло чтоб знать сколько времени еще не пускать в эфир

68
Алексей @features
tarasian666 пишет:

Соотношение не означает порядок, если посчитать общее кол-во треков и джинглов и сопоставить с количеством отигравших треков и джинглов то все сходится. 1 джингл на 4 песни = 10 джинглов на 40 песен, то есть может отиграть 10 джинглов подряд а потом 40 песен и тд

вот поэтому у меня за ротацию отвечает внешний скрипт и все треки внесены в базу с датой и временем когда отиграло чтоб знать сколько времени еще не пускать в эфир


У меня все треки тоже в базе. Джинглы лежат, пока что, просто статично. 2 перловых скрипта, один на джинглы, другой на треки. Просто думал что можно их смешивать средствами встроенными в liquidsoap. Но видидо придётся делать один скрипт, который будет отвечать за выпуск джинглов и треков в эфир.

Кстати, по поводу add я ложанулся, он, вроде, сливает 2 трека в один. Но это надо проверить. Вместо random, можно использовать **********. Динамическую ротацию можно попробоваьт сделать так:

rotate(weights=[1,3,1,4], [jingles, music,jingles,music])

Но попробовать ещё не успел.

67
nivs @nivs
Sasha.Yohan пишет:

а можно как то обновить конфиг не выключая liquidsoap?
по типу как kill -hup в icecast
чтобы радио не выключать и снова включать

**********
def restart(_)
restart()
"Done!"
end

server.register(namespace="usr",
description="Restart the application.",
usage="restart",
"restart",
restart)


Нужно только подкрутить ещё ожидание конца трека, его плавное затухание в течение 0.5-1 секунды, сразу после затухания restart(), а затем первое появление с возрастанием громкости, должно получиться хорошо, не пробовал реализовать пока что.

VLC не рвёт таким образом рестарченный liquidsoap, а вот <audio> на странице IceCast'а рвётся. Но это лучше, чем ничего. Советую быть осторожным при таком рестарте с изменением кодеков и их свойств у существующих потоков (var ogg меняется плохо, const mp3 хорошо), с JACK тоже аккуратно, но мои запросы удовлетворяет.

Отредактировано nivs - 03.06.2014
20
Marko @namikiri
Вновь здравствуйте, вновь прошу помощи у вас, радиолюбители.
Имеется сервер со стандартной связкой Liquidsoap+Icecast2, всё работает прекрасно, однако есть одна проблема — не во всех файлах указаны тэги, в итоге самым популярным треком у нас на радио является Unknown.
Однако, имена у файлов вполне себе информативные, и из них можно извлечь нужную информацию об исполнителе.
Вопрос: как это сделать средствами Liquidsoap? Как заставить его проверять, что, если нет мета-тегов, брать имя файла?
Подскажите, пожалуйста. Поиском по форуму пользовался, по запросу "liquidsoap unknown" ничего толкового не выдало, а в документации по жидкому мылу есть только пример подстановки тэгов с названием радио. Ну или я неправильно читал или не там.
В общем, прошу, скажите пожалуйста, можно ли в отдельных случаях использовать имена файлов в качестве Title в случае, если ID3 отсутствует?

Отредактировано namikiri - 08.06.2014
6245
Тарас @tarasian666
вот у меня завалялось, может надо подправить, правда вместо имени файла берет тег из скрипта

# The title metadata
title = m["title"]
# Our addition
content = list.hd(get_process_lines("/home/taras/ls/history-title.py"))


def update_title(m) =
# If title is empty
if title == "" then
[("artist - title",content)]

# Otherwise
else
[("title","#{title} on #{content}")]
end
end

radio = map_metadata(update_title,radio)



20
Marko @namikiri
tarasian666 пишет:


title = m["title"]



Откуда взялась переменная m? Что в ней?

И, да, я так и не нашёл, как спросить у мыла текущий трек.
Весь API на тему Input и Source.Track прочитал, нет там такого.
Гуглил запросы "liquidsoap current track filename" и "liquidsoap current playlist position", ничего путного не даёт.

Отредактировано namikiri - 15.06.2014
6245
Тарас @tarasian666
вот откуда m
update_title(m)

ей присвоена переменная radio
radio = map_metadata(update_title,radio)

а radio это сгенерированый ранее плейлист или трек или что там

название трека можно взять через ту же m
title = m["filename"]

20
Marko @namikiri
И вновь спасибо tarasian666 за помощь, я наконец-то сделал то, что хотел.
Код, правда, пришлось немного изменить, потому что в жидком мыле нет некоторых, казалось бы, жизненно важных функций.
Привожу свою версию:

def update_title(m) =
title = m["title"]
# Если тэга нет или там "Unknown"
if title == "" or title == "Unknown" then

# Получаем имя файла
content = m["filename"]

# Вырезаем имя файла из пути...
content = basename (content)

# ...но там осталось ".mp3", что нехорошо.
# Как назло, в Liquidsoap нет функции substr(),
# поэтому извращаемся и вырезаем расширение средствами bash:
content = get_process_output("STR=\""^content^"\"; echo ${STR%.mp3*}")

# Задаём новые метаданные
[("title", content)]
else
# Ну а иначе просто посылаем тэг
[("title","#{title}")]
end
end


# Применяем изменения к нашему потоку
radio = map_metadata(update_title,radio)

25
djgelius @djgelius
Здравствуйте!
У меня накопилось много вопросов по поводу liquidsoap:
все таки в каком формате сохранять конфиг, где его сохранять?
Как запустить и перезапустить liquidsoap
читаю эту тему: **********
нифига не пойму

6245
Тарас @tarasian666
1. в любом (текстовом), можно и без расширения, сохранять где-угодно
2. запустить конфиг как исполняемый файл, перезапустить - убить процес и запустить наново или **********


читаю эту тему: **********
нифига не пойму

вот там и задавайте вопросы

25
djgelius @djgelius
создал файл retranslator.liq почитал на официальном сайте что это liq формат конфига

запускаю через терминал:

liquidsoap /etc/icecast2/retranslator.liq

Ответ терминала:

init: security exit, root euid (user).


конфиг


# Input the stream,
# from an Icecast server or any other source
url = "ссылка на поток в виде локалхост:8000/маунт"
input = mksafe(input.http(url))

# First transcoder: MP3 192 kbps
# We also degrade the samplerate, and encode in mono
# Accordingly, a mono conversion is performed on the input stream
output.icecast(
%mp3(bitrate=128),
mount="/128k",
host="localhost", port=8000, password="пароль",
input)

output.icecast(
%aacplus(bitrate=32),
mount="/32k_aacplus",
host="localhost", port=8000, password="пароль",
input)



Установнена поддержка ААСplus

apt-get install libaacplus-ocaml-dynlink

Конфиг сделан на основе этой статьи: savonet.sourceforge.net/doc-svn/cookbook.html

Подскажите пожалуйста в чем косяк?

Отредактировано djgelius - 30.06.2014
6245
Тарас @tarasian666
Нужен еще сам aac+ не ocaml

25
djgelius @djgelius
tarasian666 пишет:

Нужен еще сам aac+ не ocaml

создал пользователя получилось ввести команду ответ:
sh: 0: Can't open liquidsoap

при установке аас+:

apt-get install libaacplus2

Reading package lists... Done
Building dependency tree
Reading state information... Done
libaacplus2 is already the newest version.
libaacplus2 set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 10 not upgraded.

Отредактировано djgelius - 30.06.2014
25
djgelius @djgelius
djgelius пишет:

tarasian666 пишет:

Нужен еще сам aac+ не ocaml

создал пользователя получилось ввести команду ответ:
sh: 0: Can't open liquidsoap

при установке аас+:

apt-get install libaacplus2

Reading package lists... Done
Building dependency tree
Reading state information... Done
libaacplus2 is already the newest version.
libaacplus2 set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 10 not upgraded.


чуть позже поставил libaacplus-dev такая же ошибка

6245
Тарас @tarasian666
init: security exit, root euid (user).

от рута запускать нельзя

25
djgelius @djgelius
tarasian666 пишет:

init: security exit, root euid (user).

от рута запускать нельзя

это уже давно решил! Вот теперь проблема:

sh: 0: Can't open liquidsoap

89
Ok_go_love @Ok_go_love
djgelius пишет:

tarasian666 пишет:

init: security exit, root euid (user).

от рута запускать нельзя

это уже давно решил! Вот теперь проблема:

sh: 0: Can't open liquidsoap

Через bash-скрипт запускаете?
А если просто liquidsoap liquidsoap-config.liq?

25
djgelius @djgelius
запустил так:
su логин_юзера /etc/icecast2/start_silver.sh

потом ввел пароль и опа!

25
djgelius @djgelius
как остановить liquidsoap или перезапустить чтобы потоки лишние в конфиге убрать?

и где данные меняются в маунте? у меня вот такое:

Mount Point /128

M3UXSPF
Stream Title: /128
Stream Description: Liquidsoap Radio!
Content Type: audio/mpeg
Mount started: Tue, 01 Jul 2014 22:01:45 +0400
Bitrate: 128
Current Listeners: 0
Peak Listeners: 1
Stream Genre: Misc
Stream URL: **********
Current Song: Denis Shapovalov - Night Shift # 21

Отредактировано djgelius - 01.07.2014
89
Ok_go_love @Ok_go_love
djgelius пишет:

как остановить liquidsoap или перезапустить чтобы потоки лишние в конфиге убрать?

и где данные меняются в маунте? у меня вот такое:

Mount Point /128

M3UXSPF
Stream Title: /128
Stream Description: Liquidsoap Radio!
Content Type: audio/mpeg
Mount started: Tue, 01 Jul 2014 22:01:45 +0400
Bitrate: 128
Current Listeners: 0
Peak Listeners: 1
Stream Genre: Misc
Stream URL: **********
Current Song: Denis Shapovalov - Night Shift # 21


Самый тупой вариант это сделать ps -A | grep liquidsoap, найти номер процесса, а потом отправить процессу kill
То же самое можно написать на bash.


Метаданные проще всего править прямо в конфиге айскаста, например
<mount-name>/musicc.ogg</mount-name>
<password>hackme</password>
<stream-name>My super stream</stream-name>
<stream-description>Bla-bla</stream-description>
<stream-url>http://domain.com</stream-url>
<charset>UTF8</charset>

Почитайте доку к айскасту **********

Отредактировано Ok_go_love - 02.07.2014