希望增加批量下载不同视频的功能

目前是输入一个视频网址,解析后可以下载封面和视频

批量下载只支持分P视频

希望增加批量下载不同视频的功能

具体来说就是一次性输入大量的视频网址或者BV号,它们每个各占一行

类似这种效果

image

然后选择下载内容(比如1080p、480p、mp3、封面等)


唧唧的文件命名很棒,保留了bv号和分p序号,如果可以支持自定义命名就更棒了
(up主昵称、up主UID、视频bv号、分P序号、视频标题等)

2.0 目前可以用 py 脚本批量创建任务

import os
import time
import requests

totalVideosInfos = {}

# BV2AV
def dec(x):
    if "BV" not in x:
        return int(x[2:])
    table = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'
    tr = {}
    for i in range(len(table)):
        tr[table[i]] = i

    s = [11, 10, 3, 8, 4, 6]
    xor = 177451812
    add = 8728348608
    r = 0
    for i in range(6):
        r += tr[x[s[i]]] * 58**i
    return (r - add) ^ xor


def getVideInfo(avid):
    url = "http://127.0.0.1:64000/bili/1/{}/get_video_info".format(avid)
    try:
        r = requests.get(url=url).json()
        r = r['data']
        if len(r) > 5 and "data" in r:
            r = r.get("data", {})
        result = [(i.get("video_filename",
                         "").strip(), i.get("page_cid",
                                            ""), i.get("page_av", ""))
                  for i in r.get("list")]
        return result
    except:
        print("getVideInfoErr")
        return []


def postTask(taskList, downloadDir):
    for _, task in enumerate(taskList):
        print("\r{0} / {1}".format(_ + 1, len(taskList)), end="")
        if type(task) == str:
            avid = dec(task.split("?")[0].split("/")[-1])
            videos_infos = getVideInfo(avid)
        else:
            videos_infos = task
        for video_info in videos_infos:
            totalVideosInfos[video_info[0]] = video_info
            if (video_info[0] + ".mp4") in os.listdir(downloadDir):
                continue
            try:
                r = requests.post(
                    url="http://127.0.0.1:64000/task/post_new_task",
                    headers={'Content-Type': 'application/json'},
                    json={
                        "avid": video_info[2],
                        "cid": video_info[1],
                        "quality": 1000,
                        "useav": True,
                        "useflv": False,
                        "videocodecs": 1,
                        "videofilename": video_info[0]
                    })
            except:
                pass
            l = len(os.listdir(downloadDir))
            s = time.time()
            while l == len(os.listdir(downloadDir)) and time.time() - s <= 300:
                time.sleep(1)


downloadDir = input("键入下载文件夹路径:\n")
links = []
firstTime = True
while 1:
    link = input("link(结束直接回车):\n" if firstTime else "").replace(" ", "")
    firstTime = False
    if not link:
        break
    else:
        links.append(link)
postTask(links, downloadDir)
# downloadDir = input("\r下载中...\n-->须待下载完毕<-- 后键入下载文件夹路径:\n")
# if not os.path.exists(downloadDir):
#     exit(0)
# files = [f.replace(".mp4", "") for f in os.listdir(downloadDir)]
# tryAgainVideosInfos = []
# for f in totalVideosInfos:
#     if f not in files:
#         tryAgainVideosInfos.append(totalVideosInfos[f])
# postTask(tryAgainVideosInfos, downloadDir)
# print("\r" + ("\n".join(tryAgainVideosInfos)))
# if len(tryAgainVideosInfos):
#     print("上面{0}个文件下载失败正在重试一遍".format(len(tryAgainVideosInfos)))
print("\nEnjoy it !\n回车关闭...")
input("")
1 个赞