Загрузка видео и аудио в виде одного файла с использованием YouTube-dl embed - PullRequest
1 голос
/ 18 марта 2020

Я пытаюсь создать программу, которая загружает записи лекций с моего университетского веб-сайта.
Но у меня проблема с генерацией желаемого выходного файла. Прямо сейчас он загружает записи экрана и аудиозаписи отдельно. Плюс по какой-то причине длительность записи экрана не соответствует длине звука.
Но я хочу загрузить оригинальное видео со звуком в виде одного файла. Я попытался объединить файлы после загрузки, но, похоже, это не работает.

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)

РЕДАКТИРОВАТЬ: содержимое папки для каждого сеанса (лекции) в основной выходной папке («загрузки») выглядит примерно так: enter image description here

Как видите, аудио отделено от видео и по какой-то причине видео фрагментировано (хотя на веб-сайте оно отображается как одно видео).

...