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(
                            default="",
                            get_process_lines(
                           "wget -q http://www.novaplanet.com -O - | grep 'scroll_play'"))
                      s = string.extract(pattern='scroll_play\("([^"]*)",\s*"([^"]*)"',s)
                      (cap(list.assoc(default="","1",s)),cap(list.assoc(default="","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_artist != new_artist 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)