Я пытаюсь создать программу, которая загружает записи лекций с моего университетского веб-сайта.
Но у меня проблема с генерацией желаемого выходного файла. Прямо сейчас он загружает записи экрана и аудиозаписи отдельно. Плюс по какой-то причине длительность записи экрана не соответствует длине звука.
Но я хочу загрузить оригинальное видео со звуком в виде одного файла. Я попытался объединить файлы после загрузки, но, похоже, это не работает.
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)
РЕДАКТИРОВАТЬ: содержимое папки для каждого сеанса (лекции) в основной выходной папке («загрузки») выглядит примерно так:
Как видите, аудио отделено от видео и по какой-то причине видео фрагментировано (хотя на веб-сайте оно отображается как одно видео).