-
-
Save feryandi/3a9fd566247d936e0e4b86f0da3e19d8 to your computer and use it in GitHub Desktop.
Panopto video downloader
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import requests | |
import json | |
import os | |
import youtube_dl | |
PANOPTO_BASE = "https://cardiff.cloud.panopto.eu" | |
""" | |
Place the value of your .ASPXAUTH token in the following variable | |
""" | |
TOKEN = "PUT_YOUR_AUTH_TOKEN_HERE" | |
s = requests.session() # cheeky global variable | |
s.cookies = requests.utils.cookiejar_from_dict({".ASPXAUTH": TOKEN}) | |
# WHYYYY does panopto use at least 3 different types of API!?!?!? | |
def json_api(endpoint, params=dict(), post=False, paramtype="params"): | |
if post: | |
r = s.post(PANOPTO_BASE + endpoint, **{paramtype: params}) | |
else: | |
r = s.get(PANOPTO_BASE + endpoint, **{paramtype: params}) | |
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: | |
""" | |
Put an if statement here based on folder["Name"] if you just want a certain | |
module or year etc. | |
e.g.: | |
""" | |
if folder["Name"].startswith("1819"): | |
dl_folder(folder) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment