# Liquidsoap

## audio stream generation

### An advanced script to listen to radio nova.

#### Introduction

Radio Nova is a french eclectic radio that provides a mp3 stream via Icecast. However, they don't include the metadata (probably to avoid rippers..).

Still, these metadata are available on their webpage:

    14:29 toots@leonard /tmp% wget -q http://www.novaplanet.com -O - | grep 'scroll_play'
       scroll_play("ESTHER PHILLIPS","DISPOSABLE SOCIETY", 'playing_now', '0');

Hence, it would be nice to dynamically grab these metadata and insert it in the stream. The following script will perform this.

#### The script

    #!/usr/bin/liquidsoap
    # Liquidsoap script to listen to radio nova, grabbing metadata
    # on the webpage.

    # Disable file log, enable stdout log
    set("log.file",false)
    set("log.stdout",true)

    # Initial input.http source
    nova = input.http("http://broadcast.infomaniak.net:80/radionova-high.mp3")
    # Remove metadata, add a hook to insert new metadata
    nova = insert_metadata(id="nova",
             clear_metadata(nova))

    # This string references will be used to keed track
    # of previous metadata
    title = ref "unknown title"
    artist = ref "unknown artist"

    # Capitalize and lowercase
    def cap(s)
      string.capitalize(string.case(s))
    end

    # Process to grab metadata on the webpage
    # Returns "artist","title"
    def metas() =
      s = list.hd(
            get_process_lines(
    	   "wget -q http://www.novaplanet.com -O - | grep 'scroll_play'"))
      s = string.extract(pattern='scroll_play\("([^"]*)",\s*"([^"]*)"',s)
      (cap(list.assoc("1",s)),cap(list.assoc("2",s)))
    end

    # Process that inserts grabbed metadata
    # to the stream
    def add_meta_nova()
      log = log(level=4)
      log("Checking for metas")
      x = metas()
      new_artist = fst(x)
      new_title = snd(x)
      old_title = !title
      old_artist = !artist
      if (old_title != new_title or old_title != new_title) and
         (new_title != "" or new_artist != "")
      then
        log("Got new metas: #{new_artist} -- #{new_title}")
        ignore(
          server.execute(
            'nova.insert artist="#{new_artist}",title="#{new_title}"'))
        title := new_title
        artist := new_artist
      else
        log("Keeping old metas")
      end
      0.2
    end

    # Schedule the insert process every 0.2 second
    add_timeout(fast=false,0.2,add_meta_nova)

    # function to display new metadatas
    def print_meta(m) =
      def print(z) =
        label = fst(z)
        value = snd(z)
        log("Metadata: #{label}=#{value}")
      end
      list.iter(print,m)
    end

    # Hook the previous function on the stream
    nova = on_metadata(print_meta,nova)

    # Play the stream !
    out(nova)