users_radiopi.liq
#!/usr/bin/liquidsoap # === Settings === set("log.file.path","/var/log/liquidsoap/pi.log") set("init.daemon",true) set("init.daemon.pidfile.path","/var/run/liquidsoap/pi.pid") set("server.telnet",true) set("harbor.bind_addr","0.0.0.0") set("harbor.port",8000) set("harbor.password","xxxxxx") set("log.level",4) set("scheduler.event_queues",4) set("scheduler.log",false) scripts = "/path/to/scripts/" pass = "xxxxxx" ice_host = "host" descr = "Radio Piston" url = "http://radiopi.org" # === Live relays === def live_start() = log("got live source, starting relays..") ignore(execute("stream_relay.start")) ignore(execute("archives.start")) end def live_stop() = log("live source has gone, stoping relays..") ignore(execute("stream_relay.stop")) ignore(execute("archives.stop")) end # Live source through harbor live = input.harbor(id="live",on_connect=live_start,on_disconnect=live_stop,"live.ogg") live_safe = mksafe(live) # Live relay to secondary encoder output.icecast.vorbis(id="stream_relay",start=false,restart=true,host="1.2.3.4",port=8005,password="xxxx",mount="live.ogg",live_safe) # File source for archiving title = '$(if $(title),"$(title)","Emission inconnue")$(if $(artist), " par $(artist)") - %m-%d-%Y, %H:%M:%S' output.file.vorbis(id="archives",start=false,reopen_on_metadata=true,"/path/to/archives/" ^ title ^ ".ogg",live_safe) # === Main script === # Specialize the output functions by partial application output.icecast = output.icecast.mp3(restart=true,description=descr, url=url) out = output.icecast(host=ice_host,port=8080,password=pass) # A file for playing during failures interlude = single("/path/to/failure.mp3") def fallback.transition(previous,next) add([fade.in(next),fade.final(duration=5.,previous)]) end # === Channels === # Lastfm submission def lastfm (m) = # Only submit songs of type "chansons" (got type using annotate..) if (m["type"] == "chansons") then canal = m["canal"] user = "radiopi-" ^ canal lastfm.submit(user=user,password="xxxxxx",m) end end # To create a channel from a basic source, add: # - a new-track notification for radiopilote # - metadata rewriting # - the live shows # - the failsafe 'interlude' source to channels # - blank detection def mklive(source) # Add lastfm submission source = on_metadata(lastfm,source) # Feedback the system source = on_metadata(fun (meta) -> system(scripts ^ "radiopilote-feedback " ^quote(meta["canal"])^" " ^quote(meta["file_id"])), source) # Rewrite metadata to add channel name and mode.. # Got data from annotate.. rewrite_metadata( [("artist",'$(if $(display_artist),"$(display_artist)","$(artist)")'), ("comment",""), ("title", '$(if $(display_title),"$(display_title)","$(title)")'), ("album", '$(if $(display_album),"$(display_album)","$(album)")')], # Default fallback fallback(track_sensitive=false,[ # Strip blank to avoid live streaming only blank.. strip_blank(live, length=10., threshold=-50.), source, interlude ]) ) end # === Basic sources === # Create a radiopilote-driven source def channel_radiopilote(~skip=true,name) log("Creating canal #{name}") # Request function def request () = log("Request for #{name}") request.create(audio=true, get_process_output(scripts ^ "radiopilote-getnext " ^ quote(name))) end # Basic source source = request.dynamic( id="dyn_"^name,request) # Add smart crossfading source = smart_crossfade(source) # Only skip some channels if skip then skip_blank(source, length=10., threshold=-40.) else source end end # Channels encoded here reggae = channel_radiopilote("reggae") jazz = channel_radiopilote("jazz") discoqueen = channel_radiopilote("discoqueen") # Avoid skiping blank with classic music !! classique = channel_radiopilote(skip=false,"classique") That70Sound = channel_radiopilote("That70Sound") # Create a channel using mklive(), encode and output it to icecast. def mkoutput(mount,source,name,genre) out(mount=mount,name=name,genre=genre, mklive(source)) end # === Outputs === # These channels are encoded on this machine reggae = mkoutput("reggae", reggae, "RadioPi - Canal Reggae","reggae") jazz = mkoutput("jazz", jazz, "RadioPi - Canal Jazz","jazz") discoqueen = mkoutput("discoqueen", discoqueen, "RadioPi - Canal DiscoQueen","discoqueen") classique = mkoutput("classique", classique, "RadioPi - Canal Classique","classique") That70Sound = mkoutput("That70Sound", That70Sound, "RadioPi - Canal That70Sound","That70Sound") # Channels from the other encoder: def get_channel(mount) input.http(autostart=true,id="input_"^mount,"http://host:8080/"^mount) end metal = get_channel("metal") electro = get_channel("electro") hiphop = get_channel("hiphop") # Finally the web channel, and its mp3 version web = out(mount="radioPi",name="RadioPi - www.radiopi.org", fallback([ switch(track_sensitive=false, [ ( { 6h-12h }, reggae ), ( { 12h-14h }, discoqueen ), ( { 14h-16h }, electro ), ( { 16h-19h }, reggae ), ( { 19h-20h }, That70Sound ), ( { 20h-22h }, metal ), ( { 22h-0h }, reggae ), ( { 0h-6h }, jazz ), ]), interlude ]))Download