This video page has the ID 244, which is passed to the API:

URL = "https://sametinget.kommunetv.no/api/streams?streamType=1&id=244"
import requests

request = requests.get(URL)
assert request.status_code == 200

I already know that this is JSON

import json
streams = json.loads(request.text)
streams.keys()
dict_keys(['stream', 'bookmarks', 'speakerEntries', 'messages', 'playlist', 'proposals', 'references'])

'stream' has some useful metadata that I'm not looking at now:

streams['stream'].keys()
dict_keys(['assetId', 'assetCopyrightText', 'attachments', 'availableFrom', 'availableTo', 'categoryId', 'description', 'id', 'imageUrl', 'publishDate', 'streamType', 'title', 'tupleId', 'views', 'voting', 'externalCode', 'movieConfiguration', 'hidden', 'allowQuestionForm', 'likes', 'dislikes'])
streams['stream']['title']
'Direktesending - Sametingets plenum 05.06.2025'
streams['stream']['description']
'<p>Plenumsm&oslash;tet starter tirsdag 3. juni kl. 09.00 og avsluttes fredag 6. juni innen kl. 10.00. Se saksliste og program:&nbsp;https://sametinget.no/Kalender/CalendarEvent.aspx?Id=1494&amp;MId1=7</p>'

...but 'playlist' is where the video files are ultimately retrieved from:

streams['playlist'][0].keys()
dict_keys(['tupleId', 'id', 'streamType', 'started', 'duration', 'cameraId', 'cameraName', 'sortOrder', 'playlist', 'lf', 'll', 'mainCamera'])
streams['playlist'][0]['started']
'2025-06-04T22:00:00Z'
streams['playlist'][0]['playlist'][0].keys()
dict_keys(['bookmarkId', 'description', 'file', 'image', 'startTime', 'title'])
streams['playlist'][0]['playlist'][0]['file']
'https://apollowms.aventia.no/arkivh/_definst_/sametinget/arkiv/244_97.smil/playlist.m3u8?wowzaplaystart=1155000&wowzaplayduration=5437000'

playlist.m3u8 is basically a default filename, something like index.html on a webserver.

smilreq = requests.get(streams['playlist'][0]['playlist'][0]['file'])
print(smilreq.text)
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=1572536,RESOLUTION=1280x720
chunklist_w873789732_b1572536_ps1155000_pd5437000.m3u8

It's possible to have multiple playlists within a playlist, so this function aims at that:

def get_m3u(text):
    res = []
    for line in text.split("\n"):
        if line.startswith("#"):
            continue
        if "m3u8" in line:
            res.append(line)
    return res
get_m3u(smilreq.text)
['chunklist_w873789732_b1572536_ps1155000_pd5437000.m3u8']
m3u_list = get_m3u(smilreq.text)

That it contains just a filename (instead of a full URL) implies that it's relative to the URL of the playlist:

def get_base_url(url):
    last_slash = url.rfind("/")
    return url[:last_slash + 1]
get_base_url(streams['playlist'][0]['playlist'][0]['file'])
'https://apollowms.aventia.no/arkivh/_definst_/sametinget/arkiv/244_97.smil/'
base = get_base_url(streams['playlist'][0]['playlist'][0]['file'])
urls = [base + x for x in m3u_list]
m3u_req = requests.get(urls[0])
m3u_req.status_code
200
print(m3u_req.text)

I won't include this output: essentially, this is a sequence of .ts files, which contain an individual chunk of the stream. They need to be concatenated to create a full video (ffmpeg can do this).