m3u8视频下载器


前言

有的时候看个视频太卡了,就想把视频搞下来,一些网站吧,它不让下载,而且还是ts流视频,于是就做了个m3u8视频下载器第一版本,如果大家使用的时候有问题,欢迎在评论区留言哦。


一、获取网站的m3u8文件url

打开想看的视频,然后F12打开控制台,找网络,里边搜索m3u8,然后刷新页面
在这里插入图片描述
将url复制出来,后续用。

二、使用步骤

1.修改配置文件

在这里插入图片描述

2.运行py或者exe

# -*- coding: utf-8 -*-
import os
import re
from concurrent.futures import ThreadPoolExecutor, as_completed
from configparser import ConfigParser
import requests
from Crypto.Cipher import AES
import subprocess

tPool = ThreadPoolExecutor(max_workers=30)
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42',
    'Connection': 'close'
}
cryptor = None
tasks = []


def build_mk_ts():
    mk_ts_path = os.getcwd() + r'\ts'
    if not os.path.exists(mk_ts_path):
        os.mkdir(mk_ts_path)


def set_file_name(file_name):
    illegal_char = ['\\', '/', ':', '*', '?', '"', '<', '>', '|']
    for char in illegal_char:
        file_name = file_name.replace(char, '-')
    return file_name


def read_config():
    config = ConfigParser()
    config_path = os.getcwd() + r'\config.ini'
    config.read(config_path, encoding='utf-8')
    return config


def m3u8_down(m3u8_url):
    resp = requests.get(m3u8_url, headers=headers)
    resp.raise_for_status()
    m3u8_text = resp.text
    return m3u8_text


def url_merge(m3u8_url, url):
    m3u8_url_li = m3u8_url.split('/')
    url_li = url.split('/')
    for _ in url_li:
        if len(_) != 0:
            if _ in m3u8_url_li:
                index = m3u8_url_li.index(_)
                url_head = ('/').join(m3u8_url_li[:index])
            else:
                url_head = ('/').join(m3u8_url_li[:-1])
            break
    if url[0] == '/':
        return url_head + url
    else:
        if len(url_head) != 0:
            return url_head + '/' + url
        else:
            return url_head + url


def m3u8_analysis(m3u8_url, m3u8_text):
    global cryptor
    if "#EXT-X-KEY:METHOD=" in m3u8_text:
        key_url = re.findall('URI="(.*?)"', m3u8_text)[0]
        key_url = url_merge(m3u8_url, key_url)
        resp = requests.get(key_url, headers=headers)
        resp.raise_for_status()
        key = resp.content
        cryptor = AES.new(key, AES.MODE_CBC, key)
    ts_url_li = re.findall('#EXTINF.*?,\n(.*)', m3u8_text)
    return ts_url_li


def ts_down(index, ts_url, m3u8_url):
    ts_url = url_merge(m3u8_url, ts_url)
    resp = requests.get(ts_url, headers=headers, timeout=5)
    resp.raise_for_status()
    by = resp.content
    if cryptor:
        by = cryptor.decrypt(by)
    with open(f'{os.getcwd()}\\ts/{str(index).zfill(5)}.ts', 'wb') as f:
        f.write(by)


def ts_merge(mp4_name):
    mp4_name = set_file_name(mp4_name)
    if 'mp4' not in mp4_name.lower():
        mp4_name += '.mp4'

    cmd = rf'copy /b {os.getcwd()}\ts\*.ts {os.getcwd()}\ts\{mp4_name}'
    subprocess.run(cmd, shell=True)
    del_cmd = rf'del /Q {os.getcwd()}\ts\*.ts'
    subprocess.run(del_cmd, shell=True)


def run():
    try:
        build_mk_ts()
        config = read_config()
        m3u8_url = config.get('api', 'm3u8_url')
        m3u8_text = m3u8_down(m3u8_url)
        ts_url_li = m3u8_analysis(m3u8_url, m3u8_text)
        for index, ts_url in enumerate(ts_url_li):
            task = tPool.submit(ts_down, index, ts_url, m3u8_url)
            tasks.append(task)
        count = 0
        for _ in as_completed(tasks, timeout=60 * 2):
            count += 1
            print(f'\r爬取进度:{int(count / len(tasks) * 100)}%', end='')
        print('\n爬取完毕')

        ts_merge(config.get('api', 'mp4_name'))
        print('合并完成!')
    except Exception as e:
        print(e)
    finally:
        input('请手动关闭!')


if __name__ == '__main__':
    run()


总结

代码中用到的aes的解密,这个兼容了需要解密的和不需要解密的,都可以使用,想直接用exe和代码文件的私信领取哦。

支持下载 m3u8 链接或文件为 mp4 或 ts 格式,并提供丰富的命令行选项。m3u8 downloader 开源的命令行 m3u8/HLS/dash 下载器,支持普通 AES-128-CBC 解密,多线程,自定义请求头等。支持简体中文,繁体中文和英文,完全免费。 开源免费 m3u8 下载工具 m3u8 downloader 中文版开源免费 m3u8 下载工具 m3u8 downloader 中文版 m3u8 downloader 特色: 不支持优酷视频解密 支持AES-128-CBC加密自动解密 支持多线程下载 支持下载限速 支持断点续传 支持Master List 支持直播流录制(BETA) 支持自定义HTTP Headers 支持自动合并 (二进制合并或使用ffmpeg合并) 支持选择下载m3u8中的指定时间段/分片内容 支持下载路径为网络驱动器的情况 支持下载外挂字幕轨道、音频轨道 支持仅合并为音频 自动使用系统代理(可禁止) 提供SimpleG简易的GUI生成常用参数 命令行选项 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 N_m3u8DL-CLI.exe [OPTIONS] --workDir Directory 设定程序工作目录 --saveName Filename 设定存储文件名(不包括后缀) --baseUrl BaseUrl 设定Baseurl --headers headers 设定请求头,格式 key:value 使用|分割不同的key&value --maxThreads Thread 设定程序的最大线程数(默认为32) --minThreads Thread 设定程序的最小线程数(默认为16) --retryCount Count 设定程序的重试次数(默认为15) --timeOut Sec 设定程序网络请求的超时时间(单位为秒,默认为10秒) --muxSetJson File 使用外部json文件定义混流选项 --useKeyFile File 使用外部16字节文件定义AES-128解密KEY --useKeyBase64 Base64String 使用Base64字符串定义AES-128解密KEY --useKeyIV HEXString 使用HEX字符串定义AES-128解密IV --downloadRange Range 仅下载视频的一部分分片或长度 --liveRecDur HH:MM:SS 直播录制时,达到此长度自动退出软件 --stopSpeed Number 当速度低于此值时,重试(单位为KB/s) --maxSpeed Number 设置下载速度上限(单位为KB/s) --enableDelAfterDone 开启下载后删除临时文件夹的功能 --enableMuxFastStart 开启混流mp4的FastStart特性 --enableBinaryMerge 开启二进制合并分片 --enableParseOnly 开启仅解析模式(程序只进行到meta.json) --enableAudioOnly 合并时仅封装音频轨道 --disableDateInfo 关闭混流中的日期写入 --noMerge 禁用自动合并 --noProxy 不自动使用系统代理 --disableIntegrityCheck 不检测分片数量是否完整 m3u8 downloader 是一款由 .Net 开发的一个简单易用的 m3u8 下载器,现在很多视频网站的视频都分割成了小片段,其 m3u8 就是来记录这一堆地址的文件,使用本下载器可以快速的下载并合并成一个完整的视频文件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值