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

liquidsoap

 

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

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

0
10
oprst @oprst
gyurgin_1 пишет:

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

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


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

0
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.

0
382
Grigorij @gyurgin_1
oprst пишет:

gyurgin_1 пишет:

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

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


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

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

0
10
oprst @oprst
gyurgin_1 пишет:

oprst пишет:

gyurgin_1 пишет:

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

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


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

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


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

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

Отредактировано oprst - 24.03.2015
0
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)
кстати, если будут проблемы со звуком, то можно попробовать
  1. output.alsa(bufferize=true,mksafe(buffer(default)))
, ну и скрипт switch.php:
  1. <?php
  2. error_reporting(0);
  3. $mus_ni = "/srv/music/playlist/night";
  4. $mus_da = "/srv/music/playlist/day";
  5. $mus_pr = "/srv/music/playlist/promo";
  6. $promo_state_file = "/srv/music/playlist/promo/promo_state.txt"; // По этому файлу будем проверять играло уже промо в этом часе или нет
  7. function scanDirectory($rootDir, $allData = array())
  8. {
  9. $FilesExt = array(
  10. "ogg",
  11. "mp3",
  12. "wav"
  13. );
  14. $invisibleFileNames = array(
  15. ".",
  16. "..",
  17. "promo_state.txt"
  18. );
  19. $dirContent = scandir($rootDir);
  20. foreach ($dirContent as $key => $content) {
  21. $path = $rootDir . '/' . $content;
  22. $ext_arr = explode(".", $content);
  23. $ext = strtolower(array_pop($ext_arr));
  24. if (!in_array($content, $invisibleFileNames)) {
  25. if (is_file($path) && is_readable($path)) {
  26. if (in_array($ext, $FilesExt)) {
  27. $allData[] = $path;
  28. }
  29. } elseif (is_dir($path) && is_readable($path)) {
  30. $allData = scanDirectory($path, $allData);
  31. }
  32. }
  33. }
  34. return $allData;
  35. }
  36. $file_promo_state = fopen($promo_state_file, "a+") or die("File promo_state does not exist!");
  37. $promo_state = fread($file_promo_state, filesize($promo_state_file));
  38. fclose($file_promo_state);
  39. if ((date('G') >= 6) and (date('G') <= 22)) {
  40. $directory = $mus_da;
  41. } else {
  42. $directory = $mus_ni;
  43. }
  44. if ((date('i') >= 0) and (date('i') <= 10) and ($promo_state !== date('G'))) {
  45. $directory = $mus_pr;
  46. $file_promo_state = fopen($promo_state_file, "w+");
  47. fwrite($file_promo_state, date('G'));
  48. fclose($file_promo_state);
  49. }
  50. $mp3_files = scanDirectory($directory);
  51. $rand = mt_rand(0, count($mp3_files) - 1);
  52. $next_track = $mp3_files[$rand];
  53. if (file_exists($next_track)) {
  54. echo $next_track;
  55. }
  56. ?>
Скажем так - вариант довольно глупый, но нужные функции выполнит.

0
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)
кстати, если будут проблемы со звуком, то можно попробовать
  1. output.alsa(bufferize=true,mksafe(buffer(default)))
, ну и скрипт switch.php:
  1. <?php
  2. error_reporting(0);
  3. $mus_ni = "/srv/music/playlist/night";
  4. $mus_da = "/srv/music/playlist/day";
  5. $mus_pr = "/srv/music/playlist/promo";
  6. $promo_state_file = "/srv/music/playlist/promo/promo_state.txt"; // По этому файлу будем проверять играло уже промо в этом часе или нет
  7. function scanDirectory($rootDir, $allData = array())
  8. {
  9. $FilesExt = array(
  10. "ogg",
  11. "mp3",
  12. "wav"
  13. );
  14. $invisibleFileNames = array(
  15. ".",
  16. "..",
  17. "promo_state.txt"
  18. );
  19. $dirContent = scandir($rootDir);
  20. foreach ($dirContent as $key => $content) {
  21. $path = $rootDir . '/' . $content;
  22. $ext_arr = explode(".", $content);
  23. $ext = strtolower(array_pop($ext_arr));
  24. if (!in_array($content, $invisibleFileNames)) {
  25. if (is_file($path) && is_readable($path)) {
  26. if (in_array($ext, $FilesExt)) {
  27. $allData[] = $path;
  28. }
  29. } elseif (is_dir($path) && is_readable($path)) {
  30. $allData = scanDirectory($path, $allData);
  31. }
  32. }
  33. }
  34. return $allData;
  35. }
  36. $file_promo_state = fopen($promo_state_file, "a+") or die("File promo_state does not exist!");
  37. $promo_state = fread($file_promo_state, filesize($promo_state_file));
  38. fclose($file_promo_state);
  39. if ((date('G') >= 6) and (date('G') <= 22)) {
  40. $directory = $mus_da;
  41. } else {
  42. $directory = $mus_ni;
  43. }
  44. if ((date('i') >= 0) and (date('i') <= 10) and ($promo_state !== date('G'))) {
  45. $directory = $mus_pr;
  46. $file_promo_state = fopen($promo_state_file, "w+");
  47. fwrite($file_promo_state, date('G'));
  48. fclose($file_promo_state);
  49. }
  50. $mp3_files = scanDirectory($directory);
  51. $rand = mt_rand(0, count($mp3_files) - 1);
  52. $next_track = $mp3_files[$rand];
  53. if (file_exists($next_track)) {
  54. echo $next_track;
  55. }
  56. ?>
Скажем так - вариант довольно глупый, но нужные функции выполнит.


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

0
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
0
382
Grigorij @gyurgin_1
Что - то в таком роде должно быть:
  1. promo_15 = once(single(some_file.mp3))
. Тогда точно проиграет всего один раз.

0
10
oprst @oprst
gyurgin_1 пишет:

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


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

0
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]))

0
31
Сергей @meloman197
Ребята, прошу помощи в следующем вопросе: установлен liquidsoap и Icecast 2.3.2. Конфиг liquidsoap:
  1. #!/usr/bin/liquidsoap -d
  2. set("init.daemon",true)
  3. set("init.daemon.pidfile",false)
  4. set("log.file.path","/var/log/liquidsoap/basic.log")
  5. set("log.stdout",true)
  6. set("log.level",3)
  7. set("server.telnet.bind_addr","127.0.0.1")
  8. set("server.telnet",true)
  9. myplaylist = mksafe(playlist(mode='normal', '/home/users/kaster1980/autodj/playlist.txt', reload=360 ))
  10. radio = myplaylist
  11. radio = mksafe(radio)
  12. radio = crossfade(start_next=6.0, fade_out=3.0, fade_in=3.0, radio)
  13. output.icecast(%mp3(bitrate=192),
  14. mount = "/live.mp3", radio,
  15. host = "localhost", port = 8000, password = "",
  16. genre="",
  17. name="",
  18. url="",
  19. description="")
  20. output.icecast(%mp3(bitrate=96),
  21. mount = "/live2.mp3", radio,
  22. host = "localhost", port = 8000, password = "",
  23. genre="",
  24. name="",
  25. url="",
  26. description=""]


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

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

0
89
Ok_go_love @Ok_go_love
meloman197 пишет:

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

Пилю свой конфиг полностью, из него можете подчерпнуть идею, telnet там не используется, ибо нечего лишний раз телнетом дергать сию информацию.
  1. #!/usr/bin/liquidsoap
  2. set("init.daemon.pidfile",true)
  3. #set("init.daemon.pidfile.path","/var/run/liquidsoap.pid")
  4. set("server.telnet",true)
  5. set("server.timeout",-10.)
  6. set("encoder.encoder.export",["artist","title"])
  7. set("init.daemon",true)
  8. set("log.file.path","/radio/logs/liquidsoap.log")
  9. set("harbor.bind_addr","0.0.0.0")
  10. def startcast(pls)
  11. output.icecast(%mp3(samplerate = 44100, bitrate = 192),
  12. fallible = true,
  13. host = "localhost", port = 8180,
  14. url = "http://radio.ru",
  15. password = "coolpass",
  16. mount = "/autoplay",
  17. pls)
  18. end
  19. #Функция для подпихивания liquidsoap треков
  20. def my_request_function() =
  21. #Пишем информацию в лог с тэгом "rotator"
  22. log = log(label="rotator")
  23. log("Getting song")
  24. result =
  25. list.hd(
  26. get_process_lines("php /radio/scripts/rotation.php"))
  27. log("Got answer: #{result}")
  28. #Возвращаем запрос на трек в liquidsoap
  29. request.create(result)
  30. end
  31. def change_metadata_to_scr(m) =
  32. title = m["title"]
  33. artist = m["artist"]
  34. [("song","#{artist} - #{title}")]
  35. end
  36. #Функция для загрузки информации на lastfm.ru
  37. def lastfm(m) =
  38. #Пишем информацию в лог с тэгом "LastFM"
  39. log = log(label="LastFM")
  40. log("#{m['song']}")
  41. #Запускаем python-скрипт для скробблинга
  42. system("/radio/scripts/scrobbler.py #{quote(m['song'])} 300 & >/dev/null")
  43. end
  44. #Функция для загрузки информации о проигранном треке в базу данных
  45. def info2db(m)=
  46. #Запускаем python-скрипт для апдейта информации в базе данных
  47. system("/radio/scripts/db_played.py #{quote(m['song'])} #{quote(m['type'])}")
  48. end
  49. #Организуем harbor
  50. live = input.harbor(id="live", "play", port=9000, password="aga")
  51. #Меняем метаданные для живого вещания (type -> live)
  52. live = rewrite_metadata([("type","live")], live)
  53. #Плейлист у нас динамический - подсовываем треки, возвращаемые скриптом
  54. playlist = request.dynamic(id="playlist", my_request_function)
  55. #Меняем метаданные для обычных треков (type -> music)
  56. playlist = map_metadata(change_metadata_to_scr, playlist)
  57. playlist = rewrite_metadata([("type","music")], playlist)
  58. #Организуем заказы
  59. queue = request.queue(id="queue")
  60. #Меняем метаданные для заказов (type -> queue)
  61. queue = map_metadata(change_metadata_to_scr, queue)
  62. queue = rewrite_metadata([("type","request")], queue)
  63. #Настраиваем фоллбеки (обособленно, т.к. нас необходима опция track_sensitive для пары queue <-> playlist, а вот live у нас должен включаться сразу)
  64. playlist = fallback(replay_metadata=false,track_sensitive=true,[queue,playlist])
  65. playlist = fallback(replay_metadata=false,track_sensitive=false,([fallback.skip(input=live,playlist)]))
  66. #При изменении метаданных запускаем работу двух скриптов: обновления базы проигранных ранее треков и скробблинга
  67. playlist = on_metadata(info2db, playlist)
  68. playlist = on_metadata(lastfm, playlist)
  69. startcast(playlist)

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

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

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

0
89
Ok_go_love @Ok_go_love
gyurgin_1 пишет:

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

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

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

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

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

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

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

0





Согласие на обработку данных на нашем сайте

Продолжая просматривать страницу, вы соглашаетесь с использованием файлов «Cookie» и с Политикой конфиденциальности «Privacy».
Наверху или внизу страницы вы можете изменить валюту и язык по умолчанию. Английская версия сайта ещё находится в доработке и доступна не полностью.