m3u8视频下载器

2023-11-18


前言

有的时候看个视频太卡了,就想把视频搞下来,一些网站吧,它不让下载,而且还是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和代码文件的私信领取哦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

m3u8视频下载器 的相关文章

随机推荐

  • 2min搞定 mac pycharm新建&导入python项目

    mac pycharm新建和导入python项目 虚拟环境配置 下载类库 一 通用设置 step1 通过自定义配置 指定默认虚拟环境变量 step2 设置虚拟环境和指定默认工作空间 step3 导入或者新建python项目 二 pychar
  • 杰里之蓝牙耳机距离及 天线匹配 调试方法篇

    一 t PCB layout 注意事项 1 1 保证 信号完整性 芯片 VMCU VDDIO BTAVDD RTCVDD 退偶电容地线回路要尽量短 SW BTAVDD 回路尽量短 地线完整 电 源线要尽量粗 一般 0 3MM 以上 请参考例
  • R语言与机器学习中的回归方法学习笔记

    来源 http blog sina com cn s blog 62b37bfe0101hom5 html key word lars rpart randomForest cp svm data diabetes prune boosti
  • BES系列蓝牙开发总结

    博文索引 框架 BES2300X BES2500X 框架解析 一 UI及外围功能模块 BES2300X BES2500X UI 按键 提示音 指示灯 BES2300X BES2500X UI 电池管理模块 蓝牙操作及协议连接 数据流及数据编
  • 使用jq实现手机上的touchmove效果

    Touch事件简介 pc上的web页面鼠 标会产生onmousedown onmouseup onmouseout onmouseover onmousemove的事件 但是在移动终端如 iphone ipod Touch ipad上的we
  • python pycharts模块词云

    from pyecharts import WordCloud import pandas as pd 读取文件 data pd read csv word csv names word count sep data data groupb
  • Java连接Mysql数据库详细代码

    数据库连接类 package util import java sql TODO author date 2020 12 10 9 07 public class DBUtil private final static String DRI
  • n个学生围成圈,报到3的学生被淘汰,最后剩下的学生编号是几号?

    include
  • Python的数据类型——字典(dict)

    目录 1 Python的数据类型 2 什么是字典 3 字典存储的数据 4 字典的语法 5 新建字典 1 用 新建一个空字典 2 新建一个存储城
  • list转json字符串

    使用Gson把list转成json字符串 com google gson Gson GetMapping valueTest public String valueTest List
  • 2021-08-03PHP面试笔试题记录

    1 一张表中有id pid name三个字段 用来表示无限级联动 pid表示父级id 如无父级 则pid为0 现已将表中数据全部查出 请封装函数 实现将该数据转换成树状结构 原始数据 menu datas id gt 1 pid gt 0
  • RGB三原色的简单理解

    RGB是什么 RGB是一种颜色表示系统 它由国际照明委员会 EIC 定义 选择红色 波长 700 00nm 绿色 波长 546 1nm 蓝色 波长 438 8nm 三种单色光作为表色系统的三基色 其中R red G Green B Blue
  • SpringSecurity学习笔记(七)密码加密

    参考视频 编程不良人 为什么要进行密码加密 如果密码直接存储到数据库不进行加密 一旦被黑客攻破就会导致用户的密码泄露 而且一般用户的密码是多个网站或者app用的同一个 这就导致了很大的安全隐患 所以一般数据库都不会直接存储用户的明文密码 都
  • java类型转换小细节之BigDecimal转String

    public static void main String args 浮点数的打印 System out println new BigDecimal 10000000000 toString 普通的数字字符串 System out pr
  • linux配置虚拟IP地址方法

    linux配置虚拟IP地址方法 在日常linux管理工作中 需要为应用配置单独的IP地址 以达到主机与应用的分离 在应用切换与迁移过程中可以做到动态切换 特别是在使用HA的时候 这种方案可以保证主机与应用的隔离 对日常的运维有很大的益处 但
  • DDL与DML的区别

    DML Data Manipulation Language 数据操纵语言 适用范围 对数据库中的数据进行一些简单操作 如insert delete update select等 DDL Data Definition Language 数
  • 如何排查 Electron V8 引发的内存 OOM 问题

    经过长达大半年时间的崩溃治理后 基于 Electron 框架开发的新版 PC 淘宝直播推流客户端的稳定性终于赶超基于QT 框架开发的旧版本了 剩下的崩溃问题中有 40 是跟内存 OOM 有关 其中 V8FatalErrorCallback
  • 堆栈常量池

    堆栈常量池详解 例子 转自 http www iteye com topic 634530 一 概述 寄存器 最快的存储区 由编译器根据需求进行分配 我们在程序中无法控制 栈 stack 存放基本类型的变量数据和对象的引用 但对象本身不存放
  • 在myeclipse拷贝项目时候经常遇到的问题

    我们有事为了省事 在myeclipse中拷贝一个web项目 然后复制下来 改改里面的内容就直接放到tomcat中运行 会发现找不到路径 然而地址栏什么的都正确 这是为什么那 仔细找找你会发现原来是 这个项目的入口没有改 你用的还是上一个项目
  • m3u8视频下载器

    文章目录 前言 一 获取网站的m3u8文件url 二 使用步骤 1 修改配置文件 2 运行py或者exe 总结 前言 有的时候看个视频太卡了 就想把视频搞下来 一些网站吧 它不让下载 而且还是ts流视频 于是就做了个m3u8视频下载器第一版