I am trying to create a program that downloads lecture recordings from my university website.
But I have a problem with generating a desirable output file.
Right now, it downloads screen recording and audio recordings separately. Plus for some reason, screen recording duration does not match the audio length.
But what I want is to download the original video with sound as a single file. I tried merging files after downloading but it does not seem to work.
import requests
import json
import os
import youtube_dl
PANOPTO_BASE = "https://surrey.cloud.panopto.eu"
TOKEN = "..." #here I insert my .auspxauth
headers = requests.utils.default_headers()
headers['User-Agent'] = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
s = requests.session()
s.cookies = requests.utils.cookiejar_from_dict({".ASPXAUTH": TOKEN})
def json_api(endpoint, params=dict(), post=False, paramtype="params"):
if post:
r = s.post(PANOPTO_BASE + endpoint, **{paramtype: params}, headers=headers)
else:
r = s.get(PANOPTO_BASE + endpoint, **{paramtype: params}, headers=headers)
if not r.ok:
print(r.text)
return json.loads(r.text)
def name_normalize(name):
return name.replace("/", "-")
def dl_session(session):
dest_dir = os.path.join(
"downloads",
name_normalize(session["FolderName"]),
name_normalize(session["SessionName"])
)
if not os.path.exists(dest_dir):
os.makedirs(dest_dir)
delivery_info = json_api("/Panopto/Pages/Viewer/DeliveryInfo.aspx", {
"deliveryId": session["DeliveryID"],
"responseType": "json"
}, True, "data")
streams = delivery_info["Delivery"]["Streams"]
for i in range(len(streams)):
filename = "{:02d}_{}.mp4".format(i, streams[i]["Tag"])
dest_filename = os.path.join(dest_dir, filename)
print("Downloading:", dest_filename)
ydl_opts = {
"outtmpl": dest_filename,
"quiet": True,
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download([streams[i]["StreamUrl"]])
def dl_folder(folder):
sessions = json_api("/Panopto/Services/Data.svc/GetSessions", {
"queryParameters": {
"folderID": folder["Id"],
}
}, True, "json")["d"]["Results"]
for session in sessions:
dl_session(session)
folders = json_api("/Panopto/Api/v1.0-beta/Folders", {
"parentId": "null",
"folderSet": 1
})
for folder in folders:
if folder["Name"].startswith("My_Folder_Name"):
dl_folder(folder)
EDIT:
Folder contents for each session (lecture) in the main output folder ("downloads") look something like this:

As you can see, audio is separate from video & for some reason, videos are fragmented (while on the website it is shown as a single video).