F# Testing against Gracenote API

After using C# to write a metadata enhancement service to enhance VOD packages for Virgin media we decided to try our hand at F# for the first time.

Obviously the code in the screenshot would be refactored for production but for a poc it is enough to show how fast a simple POC can be created in F#.

The equivalent of this in our production C# service requires serialization class plus file/data handlers to parse the same file and produce the output csv however it can be seen in this short snippet what can be achieved with a tiny amount of code in F#.


Note the input CSV contained just 2 columns
1: Provider name such as BBC, ABC etc
2: The Gracenote TMSID (asset id)


This is then parsed a call made to Gracenote, the results parsed and then written out to screen containing the episode/program id or a “Not Mapped” in lieu of missing data.


open System
open FSharp.Data

type ADI = XmlProvider<"D:\\Horizon4_TestDir\\TestData\\ADI.xml">
type GraceNoteProgramMapping = XmlProvider<Schema = "http://developer.tmsapi.com/files/on_update_programmappings_3.0.xsd">

let main argv =
    let inputCSV = CsvFile.Load("D:\\go-pid-paid.csv").Cache()
    let mappingURL = "http://on-api.gracenote.com/v3/ProgramMappings?api_key=YOURAPIKEY&"
    for c_row in inputCSV.Rows do
        let gnUrl = sprintf "%sproviderId=%s%s" mappingURL (c_row.GetColumn(0)) (c_row.GetColumn(1))
        let result = GraceNoteProgramMapping.Parse(Http.RequestString(gnUrl))

        if result.On.Value.ProgramMappings.ProgramMappings.Length > 0 then
            for _tid in result.On.Value.ProgramMappings.ProgramMappings.[0].Ids do
                if (_tid.Type.ToString() = "TMSId") then
                    printf "%s,%s,%s\n" (c_row.GetColumn(0)) (c_row.GetColumn(1)) (_tid.Value)
            printf "%s,%s,%s\n" (c_row.GetColumn(0)) (c_row.GetColumn(1)) "No Mapping"
    0 // return an integer exit code