使用Youtube-dl嵌入将视频和音频下载为单个文件

时间:2020-03-18 12:35:34

标签: python json python-3.x api youtube-dl

我正在尝试创建一个程序,该程序可以从我的大学网站下载演讲记录。
但是我在生成理想的输出文件时遇到问题。 现在,它会分别下载屏幕录像和音频录像。另外,由于某些原因,屏幕录制持续时间与音频长度不匹配。
但是我想要的是将带有声音的原始视频作为单个文件下载。下载后我尝试合并文件,但似乎不起作用。

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

如您所见,音频与视频是分开的,并且由于某些原因,视频是碎片化的(在网站上显示为单个视频)。

0 个答案:

没有答案