OTT Unified Measurement - Basic Template

API updates and articles

#/venv/bin/python3
import http.client, json, csv, requests
import pandas as pd
from pandas import json_normalize

 

# Replace placeholder values with your API credentials
client_id = 'YOUR_CLIENT_ID'
client_secret = 'YOUR_CLIENT_SECRET'

def get_token():
    conn = http.client.HTTPSConnection("api.ispot.tv")
    payload = "client_id={CLIENT_ID}&client_secret={CLIENT_SECRET}&grant_type=client_credentials".format(CLIENT_ID=client_id, CLIENT_SECRET=client_secret)
    headers = { 'content-type': "application/x-www-form-urlencoded" }
    conn.request("POST", "/v4/oauth2/token", payload, headers)

    res = conn.getresponse()
    token_raw = res.read()
    data_parsed = json.loads(token_raw.decode("utf-8"))

    access_token = data_parsed['access_token']
    conn.close()
    return (access_token)

conn = http.client.HTTPSConnection("api.ispot.tv")
payload = ""
headers = {'Authorization': "Bearer {TOKEN}".format(TOKEN=str(get_token())), }

#######
## Set filters, parameters and define the api request.

endpoint = '/v4/metrics/audience/airings?'
page_size = '&page[size]=10000' # Do not alter
page_number = '&page[number]=1' # Do not alter
start_date = 'filter[start_date]=2022-01-01'
end_date = '&filter[end_date]=2022-02-01'
filters = '&filter[airing_type]=N,R&filter[national_only]=1'
includes = '&include=brand,parent_brand,spot,creative,day_of_week,day_part,episode,industry,network,genre,sub_genre,show,product'
params = start_date + end_date + filters + includes
api_request = endpoint + params + page_size

conn.request("GET", api_request + page_number, payload, headers, )
res = conn.getresponse()
request_id = res.headers.get('X-Request-ID')
request_datetime = res.headers.get('Date')
print('\r\nRequest ID: {REQUEST_ID}\r\nDatetime: {REQUEST_DATETIME}\r\nStatus: {STATUS}'.format(REQUEST_ID=request_id,REQUEST_DATETIME=request_datetime,STATUS=res.status))
final = res.read()
jsonResponse = json.loads(final.decode('utf-8'))

########
# Determine results and page data. JSON normalize converts all keys into headers for csv output

p = 0
p_total = jsonResponse.get('meta')['pagination']['total_pages']
total_values = jsonResponse.get('meta')['pagination']['total']
current_page = jsonResponse.get('meta')['pagination']['current_page']
print('\r\n{NRESULTS} results across {PAGE_NUM} pages\r\n'.format(NRESULTS=total_values, PAGE_NUM=p_total))
print('Completed: ' + api_request + page_number)

jsonResponse = jsonResponse['data']
json_norm = json_normalize(jsonResponse, sep='_')

if p == 0:
    json_norm.to_csv('output.csv', mode='w', sep=',', header=True, index=False)
else:
    json_norm.to_csv('output.csv', mode='a', sep=',', header=False, index=False)

while p < (p_total + 1):
    try:
        p += 1
        conn.request("GET", api_request + "&page[number]=" + str(int(current_page + 1)), payload, headers, )
        res = conn.getresponse()
        final = res.read()
        jsonResponse = json.loads(final.decode('utf-8'))
        jsonResponse = jsonResponse['data']
        json_norm = json_normalize(jsonResponse, sep='_')
        json_norm.to_csv('output.csv', mode='a', sep=',', header=False, index=False)
        print('Completed: https://api.ispot.tv{ENDPOINT}&page[number]={CURRENT}'.format(ENDPOINT=api_request,CURRENT=str(int(current_page + 1))))
        current_page += 1
    except Exception:
        pass
else:
    pass