# Liquidsoap

## audio stream generation

### KUBE Radio

Keele University Broadcasting Enterprise (KUBE) is an award winning student run radio station based at Keele University in Staffordshire, UK.

### Production script

    #!/usr/bin/liquidsoap
    #                    .
    #     .  ....   ~DMMMM$ .
    #     8MMMMMMMMMMMMMMMMMMMD. ..
    #  .MMMMMMMMMMMMMMMMMMMMMMMMMM~ ..
    # ..$MMMMMMMMMMMMMMMMMMMMMMMMM88M.
    #  . MMMMM$MMMMMMMMMMMM?MMMMMMMMM
    #   .MMMMMMM$MMM$MMMMMMMMMMMMMMM8.
    #   .MMMMMMMMMMMMMMMMMMMMMMMMMMM?...  . ..   ...  ... . . .
    #    MMMMMMMMMMMMMMMMM. MMMM:~MM.D$   .MM..888M$ ..88D8888.
    #    MMMMMMMM8MMMMMMMM  MM$.MMMM.M$   .MM..M.. ~M. MM  .  ..
    #   .MMMMMMMM$MMMMMMMM. M .MMMMM M?.   MM..M. . M. MM.
    #    ~MMMMMMM$MMMMMMMM.. MMMMMMM.M?.  .MM .MMMMM:  MMMMMMM..
    #   ..MMMMMMM$MMMMMMMM. M.?MMMMM.M$.   MM..M .. M8.MM .    .
    #     MMMMMMM$MMMMMMMM .MM  MMM$ MM..  M8  M.  .$M.MM.   .
    #   ...MMMMMM$MMMMMMMM  MMM. MM . MM ~MM. .M$$8MM .MM88888.
    #       MMMMM8MMMMMMMMMMMMMMMMM..   ~~ ..... . ..   .     .
    #       .~MMMMMMMMMMMMMMMMMM$ .       . . .     . .     ..
    #         .MMMMMMMMMMMMMM..
    #           MMMMMMMMM ....
    #          ..MMM?....
    #           . ...
    #
    #       KUBERadio.com
    set("log.file.path","/home/liquidsoap/logs/main.log")
    set("frame.size",4704)

    ################
    # Sources
    studioInput = input.alsa(id="studioInput",bufferize=false)
    sustainList = playlist("/home/kube/kube-music/sustain/play.m3u")
    ###############

    ################
    # KUBE Settings
    kubeHost="localhost"
    kubePort=8000
    kubeUser="source"
    kubePassword="OMITTED FOR SECURITY"
    kubeGenre="Student radio"
    kubeUrl="kuberadio.com"
    kubeDesc="Keele University student radio"
    #################

    studioInput=rewrite_metadata([("artist", "KUBE Radio"),
                            ("title","LIVE Stream,TEXT the studio from kuberadio.com OR TXT KUBE followed by your message to 60300")],studioInput)

    #################
    # Processing
    sustain = nrj(sustainList)

    radio = fallback.skip(strip_blank(threshold=-35.,length=15.,studioInput),sustain)
    radio=mksafe(radio)

    ################

    #################
    # ICECAST MOUNTS
    output.icecast(%mp3,radio,mount="kube",id="kubeMP3",name="KUBE Radio HIGH bandwidth",quality=8,bitrate=128,
                        host=kubeHost,port=kubePort,user=kubeUser,password=kubePassword,genre=kubeGenre,url=kubeUrl,description=kubeDesc)
    output.icecast(%mp3,radio,mount="kube-low",id="kubeMP3Low",name="KUBE Radio LOW bandwidth",quality=5,bitrate=64,
                    host=kubeHost,port=kubePort,user=kubeUser,password=kubePassword,genre=kubeGenre,url=kubeUrl,description=kubeDesc)
    output.icecast(%vorbis, radio,mount="kube-low.ogg",id="kubeOggLow",name="KUBE Radio LOW bandwidth",quality=2.,
                        host=kubeHost,port=kubePort,user=kubeUser,password=kubePassword,genre=kubeGenre,url=kubeUrl,description=kubeDesc)
    output.icecast(%vorbis, radio,mount="kube.ogg",id="kubeOggHigh",name="KUBE Radio HIGH bandwidth",quality=8.,
                        host=kubeHost,port=kubePort,user=kubeUser,password=kubePassword,genre=kubeGenre,url=kubeUrl,description=kubeDesc)
    output.icecast(%vorbis, radio,mount="kube-archive.ogg",id="kubeOggLow",name="KUBE Radio Archive stream",quality=10.,public=false,
                        host=kubeHost,port=kubePort,user=kubeUser,password=kubePassword,genre=kubeGenre,url=kubeUrl,description=kubeDesc)
    #################

    output.alsa(id="officeOutput",bufferize=false,device="hw:0")

### Development script

    #!/usr/bin/liquidsoap
    # KUBERadio.com script

    set("frame.size",4704)
    set("log.file.path","/home/liquidsoap/new/log/kube.log")

    ###########################################
    # SOURCES
    jingle = single("/home/liquidsoap/new/media/jingles/main.mp3")
    news = single("/home/liquidsoap/new/media/news/news-01.mp3")
    jingleTop=single("/home/liquidsoap/new/media/jingles/top/week1.mp3")
    advertFirst=single("/home/liquidsoap/new/media/adverts/firstBuses.mp3")
    sustainList = playlist("/home/kube/kube-music/sustain/play.m3u")
    input=input.alsa(bufferize=false)
    input=rewrite_metadata([("artist","KUBE Radio"),
                                ("title","LIVE Stream"),
                            ("comment","http://kuberadio.com")],input)
    news=rewrite_metadata([
                        ("artist","KUBE Radio"),
                        ("title","NEWS")
                        ],news)
    topOfTheHour=sequence(merge=true,[
                                news,
                                advertFirst,
                                jingleTop
                        ])
    sustain=sequence(merge=true,[
                            jingle,
                            sustainList
                    ])
    ####

    ###########################################
    # PROCESSING
    topOfTheHour=smart_crossfade(fade_out=0.5,fade_in=0.5,topOfTheHour)
    sustain=nrj(sustain)
    #####

    ##########################################
    # TRIGGERS

    def isTopOfHour ()
                if 59m30s then
                        system("date >> /home/liquidsoap/new/triggers/topOfHour")
                        true
                else
                        false
                end
    end

    ##########################################

    inputTrigger=input
    sustainTrigger=sustain

    main=fallback.skip(
            strip_blank(threshold=-35.,length=15.,inputTrigger),
                    sustainTrigger
    )

    def getTop()
            add([
            sequence(merge=true,
                    [
                            blank(duration=30.),
                            topOfTheHour
                    ]
            )])
    end

    altSw=switch(track_sensitive=true,[(isTopOfHour,getTop())])
    radio = fallback.skip(
                            strip_blank(threshold=-35.,length=0.2,altSw)
                            ,main)
    radio = mksafe(radio)
    ##Outputs omitted for security