Skip to main content

New API for Hackdays 2021 open Archive SRF and RTR

As SRGSSR, we always try new technologies for providing state-of-the-art experience for both internal and external developers. With the Publication Data Platform (PDP), we collect and correlate publication relevant metadata from various systems like EPG, CMS, archives and online media channels (e.g. Play). We provide access to these vast amount of metadata through our new PDP API as a GraphQL interface. Although the API is in early stage, we want you to try it out as one of the very first and give feedback! For the Hackdays, we have included SRF and RTR archive data with the access point described below. The API will be released on the SRG Developer Portal in the near future.

Feel free to give me feedback on whether you want to see more of this approach to access data from SRGSSR and also on how to improve.

Have fun,

Romain Haenni, Product Owner, romain.haenni@srgssr.ch 

 

Usage

Basic authentication

Credentials will be revoked soon after the SRG Hackdays:

user: hackdays_2021

password: PRM2cgg99SbGtQwnZHl0deVET9uwzH

 

 

 

Access with curl

curl --header "Content-Type: application/json" \

         --user hackdays_2021:PRM2cgg99SbGtQwnZHl0deVET9uwzH \

         --request POST \

         --data '{"query":"{faroItems(first: 3) { edges { title }} }"}' \

         https://graphql-api.pdp.dev.srgssr.ch/graphql

 

Example Queries

Simple Query

{

  faroItems(first: 3) {

    edges {

      title

    }

  }

}

 

Query for fetching items

query {

  faroItems(first: 10, after: "MDAwMDM1NjUtMzczMy00ZjY3LTgwOTUtZDExNTZjNmM4OWYw") {

    edges {

      program {

        businessUnit

        mediaType

        showName

        date

        moderators {

          firstName

          lastName

        }

      }

      title

      description

      playLinks

      persons {

        firstName

        lastName

        role

      }

      descriptorPaths

    }

    cursor

  }

}

 

Curl Example

curl --header "Content-Type: application/json" \

     --user hackdays_2021:PRM2cgg99SbGtQwnZHl0deVET9uwzH \

     --request POST \

     --data '{"query":"{faroItems(first: 3) { edges { title } cursor }}"}' \

     https://graphql-api.pdp.dev.srgssr.ch/graphql

 

result:

{

  "data": {

    "faroItems": {

      "edges": [

        {

          "title""EW Ferrera"

        },

        {

          "title""Gotthard-Basistunnel als Bauwerk der Superlative"

        },

        {

          "title""Wahl Leuenberger"

        }

      ],

      "cursor""MDAwMDU0MTYtODdhYy00ZDNmLWE1YTctZTQ4MjJlYzkyOWQ0"

    }

  }

}

 

Paginating with Cursors

curl --header "Content-Type: application/json" \

     --user hackdays_2021:PRM2cgg99SbGtQwnZHl0deVET9uwzH \

     --request POST \

     --data '{"query":"{faroItems(first: 3, after: \"MDAwMDU0MTYtODdhYy00ZDNmLWE1YTctZTQ4MjJlYzkyOWQ0\") { edges { title } cursor }}"}' \

     https://graphql-api.pdp.dev.srgssr.ch/graphql

 

result:

{

  "data": {

    "faroItems": {

      "edges": [

        {

          "title""Nationalpark-Serie \\\"Il parc naziunal svizzer\\\" (1)"

        },

        {

          "title""Puls-mix"

        },

        {

          "title""Seeland Bank"

        }

      ],

      "cursor""MDAwMTkwYTctNmM2Ni00MjlmLWI3Y2EtN2NlNDUxNThiOWQ3"

    }

  }

}

 

Schema

type FaroItem {

  id: String!

  programId: String!

  itemNr: Int!

  mediaUrns: [String!]!

  playLinks: [String!]!

  descriptorPaths: [String!]!

  program: FaroProgram

  title: String

  producer: String

  description: String

  descriptor: String

  sportDoc: FaroSportDoc!

  persons: [Person!]!

}

 

type FaroItemPage {

  edges: [FaroItem!]!

  cursor: String

}

 

type FaroModerator {

  firstName: String

  lastName: String

}

 

type FaroProgram {

  id: String!

  businessUnit: String

  mediaType: String

  episodeIds: [String!]!

  date: String

  showName: String

  title: String

  seriesNr: Int

  moderators: [FaroModerator!]!

}

 

type FaroSportDoc {

  season: String

  sportEventPaths: [String!]!

  sportPaths: [String!]!

}

 

type Person {

  firstName: String

  lastName: String

  aliasFirstName: String

  aliasLastName: String

  role: String

}

 

type Query {

  faroItems(first: Int!, after: String): FaroItemPage!

}

 

Access with PDP python library

pip install srgssr-publication-data-api

 

Authentication

 

from sgqlc.types import Variable, non_null

from srgssr_publication_data_api import PublicationDataApi

 

# replace url, username, password with real values

client = PublicationDataApi('https://graphql-api.pdp.dev.srgssr.ch/graphql', hackdays_2021', 'PRM2cgg99SbGtQwnZHl0deVET9uwzH')

 

op = client.query_op()

 

# to restrict fields to just title and cursor (for pagination):

selector = op.faro_items(first=5)

selector.edges().title()

selector.cursor()

 

# if you just want to see the schema, just remove the selector.

 

result = client.run_query(op)

print(result)

 

 

Set the user environment variables:

export PDP_API=https://graphql-api.pdp.dev.srgssr.ch/graphql

export USER_NAME=hackdays_2021

export USER_PASSWORD=PRM2cgg99SbGtQwnZHl0deVET9uwzH

Then you can query the data like in the following code sample:

Sample Usage

# Needed imports

from sgqlc.types import Variable, non_null

from sgqlc.operation import Operation

from srgssr_publication_data_api import client, pdp_schema as schema

 

op = Operation(schema.Query, name='faroItems', variables={'first':non_null(int), 'after':str})

 

# to restrict fields to just title and cursor (for pagination):

selector = op.faro_items(first=Variable('first'), after=Variable('after'))

selector.edges.title()

selector.cursor()

 

# if you just want to see the schema, just remove the selector.

 

print(client.run_query(op, {'first'100})['data'])

Or check the following jupyter example: ...

About us

The SRG SSR API team is proud to share our data for the friends, community, customer and partners.