#!/usr/bin/liquidsoap -d
# где будут логи
set("log.file.path","/tmp/test.log")
# telnet server для использования liGUIdsoap
set("server.telnet", true)
################################
# вход с другой тачки
set("harbor.bind_addr","x.x.x.x")
set("harbor.port",9000)
set("harbor.password","xxx")
# фильтр для микрофона и вход с точки монтирования
live = mic_filter(input.harbor("live.ogg"))
# смена мета-данных при эфире
live=rewrite_metadata([("artist","SV Radio"),
("title","LIVE Stream"),
("comment","http://xx.x")],live)
################################
####################
#ПОСТОЯННЫЕ ФУНКЦИИ
####################
# функция наложения
def crossfade(~start_next,~fade_in,~fade_out,s)
s = fade.in(duration=fade_in,s)
s = fade.out(duration=fade_out,s)
fader = fun (a,b) -> add(normalize=false,[b,a])
cross(fader,s)
end
# функция для воспроизведения джинглов во время проигрывания музыки
def smooth_add(~delay=0.5,~p=0.2,~normal,~special)
d = delay
fade.final = fade.final(duration=d*2.)
fade.initial = fade.initial(duration=d*2.)
q = 1. - p
c = amplify
fallback(track_sensitive=false,
[special,normal],
transitions=[
fun(normal,special)->
add(normalize=false,
[c(p,normal),
c(q,fade.final(type="sin",normal)),
sequence([blank(duration=d),c(q,special)])]),
fun(special,normal)->
add(normalize=false,
[c(p,normal),
c(q,fade.initial(type="sin",normal))])
])
end
####################
#META
####################
# META-данные название песен
def rewrite_metadata(l,~insert_missing=true,s)
def map(m)
def apply(x)
label = fst(x)
meta = snd(x)
if list.mem_assoc(label,l) then
pattern = l[label]
(label,pattern % m)
else
(label,meta)
end
end
m = list.map(apply,m)
def add(m,x)
label = fst(x)
pattern = snd(x)
# If m does not have (label,_), then it was
# not processed previously, we have to
# add it now..
if not list.mem_assoc(label,m) then
list.append(m,[(label,pattern % m)])
else
m
end
end
list.fold(add,m,l)
end
map_metadata(map,insert_missing=insert_missing,s)
end
# к каждому кусочку метаданных прибаляем слово
def append_title(m) =
# берём настоящее название
title = m["title"]
# вставляем новое значение
[("title","#{title} - (((=xx=)))")]
end
####################################
#PLAYLIST
####################################
# загружаем плейлист - папку с *.ogg, выравнивание громкости, обновление содержимого
music = smart_crossfade(normalize(playlist(reload=600, mode="normal", "/home/radio/radio/music")))
music = mksafe(music)
# построение плейлиста с кроссфейдом
#fade_out - затухание предыдущей песни в сек
#fade_in - нарастание следующей песни в сек
radio=crossfade(start_next=1.,fade_out=7.,fade_in=7.,music)
##################здесь не работает#############
output.icecast.vorbis(
mount="Music.ogg",quality=8.,
host="localhost",port=8000,password="xx",genre="xx",
name="xx-Radio", description="xx-Radio", url="http://xx.x",
restart=true,music)
###########################################
# загружаем джинглы - папку с *.ogg
jingles = playlist("/home/radio/radio/jingles")
# остроение листа с джинглами,
# в 00,15,30,45 минут каждого часа
radio = smooth_add(normal=music,special=switch([
({ 00m0s or 15m0s or 30m0s or 45m0s },jingles)]))
# Применить новые мета-данные к названию
radio = map_metadata(append_title, radio)
# добавляем переключение между harbor live и основным плей-листом
live = mic_filter(input.harbor("live.ogg"))
radiolive = mic_filter(fallback(track_sensitive=false,[live,radio]))
#############################
#ВЫХОДЫ
#############################
output.icecast.vorbis(
mount="RadioHQ.ogg",quality=8.,
host="localhost",port=8000,password="xx",genre="xx",
name="xx-Radio", description="xx-Radio", url="http://xx.x",
restart=true,radiolive)
output.icecast.vorbis(
mount="RadioLQ.ogg",quality=2.,
host="localhost",port=8000,password="xx",genre="xx",
name="xx-Radio", description="xx-Radio", url="http://xx.x",
restart=true,radiolive)