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

liquidsoap

 

382
Grigorij @gyurgin_1
Так будет работать default = fallback(
[switch ([
({12h00-12h01 or 13h00-13h01 or 14h00-14h01 or 15h00-15h01 or 16h00-16h01 or 17h00-17h01 or 18h00-18h01}, mus_pr),
({6h-22h}, mus_da),
({22h-6h}, mus_ni)
]), mus_sc
])

Мысль надеюсь уловили.

10
oprst @oprst
gyurgin_1 пишет:

Так будет работать default = fallback(
[switch ([
({12h00-12h01 or 13h00-13h01 or 14h00-14h01 or 15h00-15h01 or 16h00-16h01 or 17h00-17h01 or 18h00-18h01}, mus_pr),
({6h-22h}, mus_da),
({22h-6h}, mus_ni)
]), mus_sc
])

Мысль надеюсь уловили.


Мысль ясна :) ну надо понимать, что промо может быть и 2 минуты и 5 минут. Они рандомно берутся из папки определенной и в данном случае, такой вариант, мало пригоден. И опять же, даже если допустить, что нам известно какой трек долежн играть в какое время, то этот способ не меняет смысл того, что написано у меня.

131
Enzo @enzO
Privet vsem opat :) Nuzna pomash kak realizirovat nakladku sireni kazdij cas .naprimer igrajit muzika i rovna kazdij cas po verhu muziki nakladivaitsa naprimer alarm.mp3.

382
Grigorij @gyurgin_1
oprst пишет:

gyurgin_1 пишет:

Так будет работать default = fallback(
[switch ([
({12h00-12h01 or 13h00-13h01 or 14h00-14h01 or 15h00-15h01 or 16h00-16h01 or 17h00-17h01 or 18h00-18h01}, mus_pr),
({6h-22h}, mus_da),
({22h-6h}, mus_ni)
]), mus_sc
])

Мысль надеюсь уловили.


Мысль ясна :) ну надо понимать, что промо может быть и 2 минуты и 5 минут. Они рандомно берутся из папки определенной и в данном случае, такой вариант, мало пригоден. И опять же, даже если допустить, что нам известно какой трек долежн играть в какое время, то этот способ не меняет смысл того, что написано у меня.

А вот и не поняли, хотя бы попробовали чтоли... В данном примере задан период минута, а на самом деле при track_sensitive = true (это по умолчанию, поэтому не обязательно указывать) спокойно проиграет рандомный трек из промо и после него вернется к обычным плейлистам.

10
oprst @oprst
gyurgin_1 пишет:

oprst пишет:

gyurgin_1 пишет:

Так будет работать default = fallback(
[switch ([
({12h00-12h01 or 13h00-13h01 or 14h00-14h01 or 15h00-15h01 or 16h00-16h01 or 17h00-17h01 or 18h00-18h01}, mus_pr),
({6h-22h}, mus_da),
({22h-6h}, mus_ni)
]), mus_sc
])

Мысль надеюсь уловили.


Мысль ясна :) ну надо понимать, что промо может быть и 2 минуты и 5 минут. Они рандомно берутся из папки определенной и в данном случае, такой вариант, мало пригоден. И опять же, даже если допустить, что нам известно какой трек долежн играть в какое время, то этот способ не меняет смысл того, что написано у меня.

А вот и не поняли, хотя бы попробовали чтоли... В данном примере задан период минута, а на самом деле при track_sensitive = true (это по умолчанию, поэтому не обязательно указывать) спокойно проиграет рандомный трек из промо и после него вернется к обычным плейлистам.


Воот. Точно. работает :) Хотите маленький нюанс при данном варианте еще? Знаете, почему я думал, что при track_sensitive = true якобы он игнорировал время? Вот мы указываем в вашем варианте интервал в минуту. А теперь такая фишка - условно трек из основного плейлиста начал играть в 11:59... , промка должна заиграть в интервал с 12:00 до 12:01 и разумеется, трек который начал играть в 11:59 не успевает закончится до 12:01 - поэтому плейлист продолжает играть без промо...

Спасибо большое за помощь - мне теперь все понятно в этом вопросе. :)

Отредактировано oprst - 24.03.2015
382
Grigorij @gyurgin_1
Мда, нюанс такой есть, но тут похоже ничего не придумать. Хотя... используйте request.dynamic и все будет как надо. Вот набросал для Вас пример, будет желание - пробуйте, конфиг будет выглядеть так:
#!/usr/bin/liquidsoap
set("log.file.path","/var/log/liquidsoap/radio.log")
set("log.level", 3)
set("log.file",true)
set("log.stdout",false)
sc = "/srv/music/sec"
def get_request() =
uri = get_process_output("php КАКОЙ_ВАМ_УДОБНО_ПУТЬ/switch.php")
request.create(uri)
end
mus_sc = mksafe(playlist("#{sc}"))
main_ef = request.dynamic(id="main_playlist",get_request)
default = fallback(track_sensitive=false,[mksafe(main_ef),mus_sc])
default = crossfade(start_next=1., fade_out=3., fade_in=1., default)
default = compress(attack=2., ratio=2., knee=6., gain=-1., threshold=-4.64, release=50.,default)
default = ladspa.tap_equalizer(band_7_freq=16., band_7_gain=3., default)
default = ladspa.tap_limiter(output_volume=-1., limit_level=1., default)
output.alsa(default)
кстати, если будут проблемы со звуком, то можно попробовать output.alsa(bufferize=true,mksafe(buffer(default))), ну и скрипт switch.php: <?php
error_reporting(0);
$mus_ni = "/srv/music/playlist/night";
$mus_da = "/srv/music/playlist/day";
$mus_pr = "/srv/music/playlist/promo";
$promo_state_file = "/srv/music/playlist/promo/promo_state.txt"; // По этому файлу будем проверять играло уже промо в этом часе или нет
function scanDirectory($rootDir, $allData = array())
{
$FilesExt = array(
"ogg",
"mp3",
"wav"
);
$invisibleFileNames = array(
".",
"..",
"promo_state.txt"
);
$dirContent = scandir($rootDir);
foreach ($dirContent as $key => $content) {
$path = $rootDir . '/' . $content;
$ext_arr = explode(".", $content);
$ext = strtolower(array_pop($ext_arr));
if (!in_array($content, $invisibleFileNames)) {
if (is_file($path) && is_readable($path)) {
if (in_array($ext, $FilesExt)) {
$allData[] = $path;
}
} elseif (is_dir($path) && is_readable($path)) {
$allData = scanDirectory($path, $allData);
}
}
}
return $allData;
}
$file_promo_state = fopen($promo_state_file, "a+") or die("File promo_state does not exist!");
$promo_state = fread($file_promo_state, filesize($promo_state_file));
fclose($file_promo_state);
if ((date('G') >= 6) and (date('G') <= 22)) {
$directory = $mus_da;
} else {
$directory = $mus_ni;
}
if ((date('i') >= 0) and (date('i') <= 10) and ($promo_state !== date('G'))) {
$directory = $mus_pr;
$file_promo_state = fopen($promo_state_file, "w+");
fwrite($file_promo_state, date('G'));
fclose($file_promo_state);
}
$mp3_files = scanDirectory($directory);
$rand = mt_rand(0, count($mp3_files) - 1);
$next_track = $mp3_files[$rand];
if (file_exists($next_track)) {
echo $next_track;
}
?>
Скажем так - вариант довольно глупый, но нужные функции выполнит.

10
oprst @oprst
gyurgin_1 пишет:

Мда, нюанс такой есть, но тут похоже ничего не придумать. Хотя... используйте request.dynamic и все будет как надо. Вот набросал для Вас пример, будет желание - пробуйте, конфиг будет выглядеть так:
#!/usr/bin/liquidsoap
set("log.file.path","/var/log/liquidsoap/radio.log")
set("log.level", 3)
set("log.file",true)
set("log.stdout",false)
sc = "/srv/music/sec"
def get_request() =
uri = get_process_output("php КАКОЙ_ВАМ_УДОБНО_ПУТЬ/switch.php")
request.create(uri)
end
mus_sc = mksafe(playlist("#{sc}"))
main_ef = request.dynamic(id="main_playlist",get_request)
default = fallback(track_sensitive=false,[mksafe(main_ef),mus_sc])
default = crossfade(start_next=1., fade_out=3., fade_in=1., default)
default = compress(attack=2., ratio=2., knee=6., gain=-1., threshold=-4.64, release=50.,default)
default = ladspa.tap_equalizer(band_7_freq=16., band_7_gain=3., default)
default = ladspa.tap_limiter(output_volume=-1., limit_level=1., default)
output.alsa(default)
кстати, если будут проблемы со звуком, то можно попробовать output.alsa(bufferize=true,mksafe(buffer(default))), ну и скрипт switch.php: <?php
error_reporting(0);
$mus_ni = "/srv/music/playlist/night";
$mus_da = "/srv/music/playlist/day";
$mus_pr = "/srv/music/playlist/promo";
$promo_state_file = "/srv/music/playlist/promo/promo_state.txt"; // По этому файлу будем проверять играло уже промо в этом часе или нет
function scanDirectory($rootDir, $allData = array())
{
$FilesExt = array(
"ogg",
"mp3",
"wav"
);
$invisibleFileNames = array(
".",
"..",
"promo_state.txt"
);
$dirContent = scandir($rootDir);
foreach ($dirContent as $key => $content) {
$path = $rootDir . '/' . $content;
$ext_arr = explode(".", $content);
$ext = strtolower(array_pop($ext_arr));
if (!in_array($content, $invisibleFileNames)) {
if (is_file($path) && is_readable($path)) {
if (in_array($ext, $FilesExt)) {
$allData[] = $path;
}
} elseif (is_dir($path) && is_readable($path)) {
$allData = scanDirectory($path, $allData);
}
}
}
return $allData;
}
$file_promo_state = fopen($promo_state_file, "a+") or die("File promo_state does not exist!");
$promo_state = fread($file_promo_state, filesize($promo_state_file));
fclose($file_promo_state);
if ((date('G') >= 6) and (date('G') <= 22)) {
$directory = $mus_da;
} else {
$directory = $mus_ni;
}
if ((date('i') >= 0) and (date('i') <= 10) and ($promo_state !== date('G'))) {
$directory = $mus_pr;
$file_promo_state = fopen($promo_state_file, "w+");
fwrite($file_promo_state, date('G'));
fclose($file_promo_state);
}
$mp3_files = scanDirectory($directory);
$rand = mt_rand(0, count($mp3_files) - 1);
$next_track = $mp3_files[$rand];
if (file_exists($next_track)) {
echo $next_track;
}
?>
Скажем так - вариант довольно глупый, но нужные функции выполнит.


Спасибо Вам огромное. Я обязательно погоняю данный скрипт. :)

10
oprst @oprst
Позвольте попросить о помощи еще в одном моменте.
music = fallback ([
switch (track_sensitive = false,[
({16h28m}, promo_15),
({18h-1h}, mus_ni),
({08h-18h}, mus_da)
]), security
])
Все бы просто - в 16h28m - все отрабатывает, кроссфедится и играет. НО promo_15 = это 10ти секундный ролик и почему то он продолжает играть целую минуту (ну или раз 5-6 точно) один и тот же ролик. По идеи - отъиграл один раз и играешь основной плейлист дальше, ну как я понимаю. Задача в целом такая, как писал ранее, сделать в начале каждого часа промки - для каждого часа свою. Что я делаю не правильно ?
Заранее благодарю за помощь.

Отредактировано oprst - 24.03.2015
382
Grigorij @gyurgin_1
Что - то в таком роде должно быть: promo_15 = once(single(some_file.mp3)). Тогда точно проиграет всего один раз.

10
oprst @oprst
gyurgin_1 пишет:

Что - то в таком роде должно быть: promo_15 = once(single(some_file.mp3)). Тогда точно проиграет всего один раз.


yeeeessss. Точно. Все работает теперь как нада :) Спасибо большое.

131
Enzo @enzO
POMAGITE ZAMU4ELSA !!! nuzna 4 playlist vraznoe vrema.Uze zaparilsa nu nepalucaitsa gde osibvka? kak izpravit aaaaaaaaaaaaaaaaaa nervi uze nekuda negodni.

moi config.

evening = mksafe(audio_to_stereo(playlist(reload=3600, '/home/liquidsoap/playlists/evening.m3u')))
afternoon = mksafe(audio_to_stereo(playlist(reload=3600, '/home/liquidsoap/playlists/afternoon.m3u')))
morning = mksafe(audio_to_stereo(playlist(reload=3600, '/home/liquidsoap/playlists/morning.m3u')))
day = mksafe(audio_to_stereo(playlist(reload=3600, '/home/liquidsoap/playlists/day.m3u')))
night = mksafe(audio_to_stereo(playlist(reload=3600, '/home/liquidsoap/playlists/night.m3u')))

myplaylist = switch([({7h-12h}, morning), ({12h-18h}, afternoon), ({18h-24h}, evening), ({0h-7h}, night)])
radio = myplaylist


jingles = mksafe(audio_to_stereo(playlist(reload=3600, '/home/liquidsoap/playlists/jingles.m3u')))

clock = audio_to_stereo(single("/home/liquidsoap/clock/clock.ogg"))



radio = random(weights = [1, 4],[jingles, radio])

radio = add([radio, switch([({0m0s},clock)])])
radio = crossfade(start_next=6.0, fade_out=3.0, fade_in=3.0, radio)
radio = mksafe(fallback(track_sensitive=false, [live, radio]))

31
Сергей @meloman197
Ребята, прошу помощи в следующем вопросе: установлен liquidsoap и Icecast 2.3.2. Конфиг liquidsoap:
#!/usr/bin/liquidsoap -d
set("init.daemon",true)
set("init.daemon.pidfile",false)
set("log.file.path","/var/log/liquidsoap/basic.log")
set("log.stdout",true)
set("log.level",3)
set("server.telnet.bind_addr","127.0.0.1")
set("server.telnet",true)
myplaylist = mksafe(playlist(mode='normal', '/home/users/kaster1980/autodj/playlist.txt', reload=360 ))
radio = myplaylist
radio = mksafe(radio)
radio = crossfade(start_next=6.0, fade_out=3.0, fade_in=3.0, radio)
output.icecast(%mp3(bitrate=192),
mount = "/live.mp3", radio,
host = "localhost", port = 8000, password = "",
genre="",
name="",
url="",
description="")
output.icecast(%mp3(bitrate=96),
mount = "/live2.mp3", radio,
host = "localhost", port = 8000, password = "",
genre="",
name="",
url="",
description=""]


Также имеется файл плейлиста - playlist.txt. При такой конфигурации автообновление плейлиста происходит без проблем, однако постоянно проигрывается первый трек плейлиста (в плейлисте их всего около 10 треков). При выполнении команды по telnet - playlist(dot)txt.next показываются все файлы данного плейлиста. Если во время постоянно звучащего трека (№1 в плейлисте) по телнет выполнить команду (dot)mp3.skip то без проблем начинают проигрываться следующие файлы плейлиста, а без применения данной команды, как я уже описывал выше, постоянно звучит один трек. Если из конфига убираю reload=360, проигрываются все файлы и в той же последовательности как и в плейлисте, однако не происходит автообновления плейлиста.
Ребята, огромная просьба помочь в данной проблеме. Хочу добиться воспроиведения треков плейлиста в заданной последовательности вместе с автообновлением. Заранее благодарен всем откликнувшимся!

Отредактировано meloman197 - 18.04.2015
31
Сергей @meloman197
Может еще кто - нибудь приведет пример как прописать в конфиге liquidsoap mp3.metadata чтобы через файл php используя телнет выдернуть последние проигранные треки в формате: Исполнитель - Трек. Заранее благодарен!

89
Ok_go_love @Ok_go_love
meloman197 пишет:

Может еще кто - нибудь приведет пример как прописать в конфиге liquidsoap mp3.metadata чтобы через файл php используя телнет выдернуть последние проигранные треки в формате: Исполнитель - Трек. Заранее благодарен!

Пилю свой конфиг полностью, из него можете подчерпнуть идею, telnet там не используется, ибо нечего лишний раз телнетом дергать сию информацию.

#!/usr/bin/liquidsoap
set("init.daemon.pidfile",true)
#set("init.daemon.pidfile.path","/var/run/liquidsoap.pid")
set("server.telnet",true)
set("server.timeout",-10.)
set("encoder.encoder.export",["artist","title"])
set("init.daemon",true)
set("log.file.path","/radio/logs/liquidsoap.log")
set("harbor.bind_addr","0.0.0.0")

def startcast(pls)
output.icecast(%mp3(samplerate = 44100, bitrate = 192),
fallible = true,
host = "localhost", port = 8180,
url = "http://radio.ru",
password = "coolpass",
mount = "/autoplay",
pls)
end

#Функция для подпихивания liquidsoap треков
def my_request_function() =
#Пишем информацию в лог с тэгом "rotator"
log = log(label="rotator")
log("Getting song")
result =
list.hd(
get_process_lines("php /radio/scripts/rotation.php"))
log("Got answer: #{result}")
#Возвращаем запрос на трек в liquidsoap
request.create(result)
end


def change_metadata_to_scr(m) =
title = m["title"]
artist = m["artist"]
[("song","#{artist} - #{title}")]
end

#Функция для загрузки информации на lastfm.ru
def lastfm(m) =
#Пишем информацию в лог с тэгом "LastFM"
log = log(label="LastFM")
log("#{m['song']}")
#Запускаем python-скрипт для скробблинга
system("/radio/scripts/scrobbler.py #{quote(m['song'])} 300 & >/dev/null")
end

#Функция для загрузки информации о проигранном треке в базу данных
def info2db(m)=
#Запускаем python-скрипт для апдейта информации в базе данных
system("/radio/scripts/db_played.py #{quote(m['song'])} #{quote(m['type'])}")
end

#Организуем harbor
live = input.harbor(id="live", "play", port=9000, password="aga")
#Меняем метаданные для живого вещания (type -> live)
live = rewrite_metadata([("type","live")], live)

#Плейлист у нас динамический - подсовываем треки, возвращаемые скриптом
playlist = request.dynamic(id="playlist", my_request_function)
#Меняем метаданные для обычных треков (type -> music)
playlist = map_metadata(change_metadata_to_scr, playlist)
playlist = rewrite_metadata([("type","music")], playlist)

#Организуем заказы
queue = request.queue(id="queue")
#Меняем метаданные для заказов (type -> queue)
queue = map_metadata(change_metadata_to_scr, queue)
queue = rewrite_metadata([("type","request")], queue)

#Настраиваем фоллбеки (обособленно, т.к. нас необходима опция track_sensitive для пары queue <-> playlist, а вот live у нас должен включаться сразу)
playlist = fallback(replay_metadata=false,track_sensitive=true,[queue,playlist])
playlist = fallback(replay_metadata=false,track_sensitive=false,([fallback.skip(input=live,playlist)]))

#При изменении метаданных запускаем работу двух скриптов: обновления базы проигранных ранее треков и скробблинга
playlist = on_metadata(info2db, playlist)
playlist = on_metadata(lastfm, playlist)
startcast(playlist)


Отредактировано Ok_go_love - 20.04.2015
382
Grigorij @gyurgin_1
Я в шоке
#Плейлист у нас динамический - подсовываем треки, возвращаемые скриптом
А всю работу по метаданным, скробблингу, чему там еще... Почему одному скрипту который отдает треки не делать?

31
Сергей @meloman197
myplaylist = mksafe(playlist(mode='normal', '/home/users/kaster1980/autodj/playlist.txt', reload=360 ))

Ребята, прошу разъяснить: в данной ситуации reload=360 должен просто перечитывать плейлист и если он не изменился продолжать воспроизведение в той последовательности, которая в самом плейлисте либо в любом случае после истечения 360 с плейлист будет перегружен и воспроизведение начнется с первого трека данного листа? Заранее благодарен за помощь!

89
Ok_go_love @Ok_go_love
gyurgin_1 пишет:

Я в шоке
#Плейлист у нас динамический - подсовываем треки, возвращаемые скриптом
А всю работу по метаданным, скробблингу, чему там еще... Почему одному скрипту который отдает треки не делать?

Как говорится - "Нет ничего более постоянного, чем временное".
Как было изначально наговнокожено, так и осталось, руки переделать не доходят.
К тому же были какие-то проблемы с метаданными (по-моему с типом файла, сейчас уже не вспомню), вследствие чего пришлось пилить отдельный скрипт.

Отредактировано Ok_go_love - 22.04.2015
31
Сергей @meloman197
Ребята, подскажите пожалуйста какую стабильную и проверенную версию Icecast2 лучше ставить: последнюю 2.4.1 с официального сайта **********, версию trunk отсюда ********** либо вообще KH 2.3.1? Заранее благодарен!

Отредактировано meloman197 - 23.04.2015
382
Grigorij @gyurgin_1
meloman197 пишет:

Ребята, подскажите пожалуйста какую стабильную и проверенную версию Icecast2 лучше ставить: последнюю 2.4.1 с официального сайта **********, версию trunk отсюда ********** либо вообще KH 2.3.1? Заранее благодарен!

Если не надо aac+ играть в браузере ставьте с офсайта, если надо - KH.

31
Сергей @meloman197
Спасибо, будем действовать.