python将下载到本地m3u8视频合成MP4

标签: 日常

import os
import requests
import datetime
from Crypto.Cipher import AES

def decode_key_file(key_file_name):
    with open(key_file_name,"r") as f:
        data=f.read()
    return data
def decode_m_file(m_file_name):
    with open(m_file_name,"r") as f:
        data=f.read()
    return data.split("\n")[6::2]

def decode_video(filename):
    data_list=[[],[],[]]
    file_list=os.listdir(filename)
    for one_file_name in file_list:
        if "m3u8" in one_file_name:
            data_list[0].append(filename+"/"+one_file_name)
        elif "key" in one_file_name:
            data_list[1].append(filename + "/" + one_file_name)
        else:
            data_list[2].append(filename + "/" + one_file_name)
    key=decode_key_file(data_list[1][0])
    name_list=decode_m_file(data_list[0][0])

    for one_name in name_list:
        for path_name in data_list[2]:
            if one_name in path_name:
                with open(path_name,"rb") as f:
                    data_name=f.read()

                if len(key):  # AES 解密
                    cryptor = AES.new(key, AES.MODE_CBC, key)
                    with open(key + ".mp4", 'ab') as f:
                        f.write(cryptor.decrypt(data_name))


if __name__ == '__main__':
    decode_video("./data")

视频下载下来如下图所示

在这里插入图片描述

https://ngmov.me/?channelCode=ngdl50
这个应用下载下来的视频就是这样的解法

在这里插入图片描述

改进版本

def decode_key_file(key_file_name):
    with open(key_file_name, "r") as f:
        data = f.read()
    return data


def decode_m_file(m_file_name):
    with open(m_file_name, "r") as f:
        data = f.read()
    return data.split("\n")[6::2]


def decode_video(filename):
    data_list = [[], [], []]
    file_list = os.listdir(filename)
    for one_file_name in file_list:
        if "m3u8" in one_file_name:
            data_list[0].append(filename + "/" + one_file_name)
        elif "key" in one_file_name:
            data_list[1].append(filename + "/" + one_file_name)
        else:
            data_list[2].append(filename + "/" + one_file_name)
    try:
        key = decode_key_file(data_list[1][0])
    except:
        key = one_file_name
    name_list = decode_m_file(data_list[0][0])

    for one_name in name_list:
        for path_name in data_list[2]:
            if one_name in path_name:
                with open(path_name, "rb") as f:
                    data_name = f.read()

                if len(key):  # AES 解密
                    cryptor = AES.new(key, AES.MODE_CBC, key)
                    with open(key + ".mp4", 'ab') as f:
                        f.write(cryptor.decrypt(data_name))
                else:
                    with open(key + ".mp4", 'ab') as f:
                        f.write(data_name)
                        f.flush()


if __name__ == '__main__':
    data_list = os.listdir("/home/dfy/Videos/Download")
    index=0
    for path_one in data_list:
        index+=1
        if index<18:
            continue
        decode_video("/home/dfy/Videos/Download" + "/" + path_one)
版权声明:本文为weixin_32759777原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_32759777/article/details/105588190

智能推荐

【Python网络爬虫实战篇】在各大主流视频网站下载高清源视频:爬取m3u8链接解析为ts视频合并成mp4视频分析实战

        这两天博主在摸鱼时,偶然间接触到了流媒体的概念,一时间来了兴致。再加上之前博主有着七、八年的视频制作经验,深知视频素材获取的不易。因此,打算利用自己所学的python网络爬虫的知识,通过编写代码实现获取视频解析m3u8链接完成视频的下载功能。 目录 流媒体 流媒体的介绍 流媒体的分类 分析实战 编码过程...

使用ffmpeg从m3u8地址下载mp4视频文件-linux脚本(bash)

1.使用说明 如图: 2.脚本如下: 注意: 将第一行#!/usr/bin/env bash修改为你的bash的绝对路径. 在线m3u8播放器 参考:m3u8_download...

论如何下载一个在线的 m3u8 文件到本地成为一个 mp4!

正文共: 2381字 7图 预计阅读时间: 6分钟 一、前言 现在比较常见的视频流媒体,大部分都是 m3u8 格式的,而对于 m3u8 格式的视频而言,如果你下载过,你会发现它就是一个文本文件,大概也就只有几十 kb,从磁盘大小来看,应该也知道它并不是一个直接的视频文件。 而假如我们想要下载对应的视频文件,直接下载 m3u8,当然是达不到目的的,那么本文就来说说,如何...

33行代码 超级简单下载/批量下载m3u8为mp4(使用Python和ffmpeg)

本代码直接复制可用,前提是要先安装ffmpeg!要先安装ffmpeg!要先安装ffmpeg!ffmpeg非常好用,装了不后悔。   使用方式:先将以下代码保存为down_load_m3u8.py,然后在cmd窗口中执行"python down_load_m3u8.py m3u8链接/有m3u8列表的文件路径"。   比如: 1.直接下载链接:python d...

web安全简易规范123

web安全,大公司往往有专门的安全开发流程去保证,有专门的安全团队去维护,而对于中小网络公司,本身体量小,开发同时兼带运维工作,时间精力有限,但是,同样需要做一些力所能及的必要的事情。有时候,安全威胁并不是因为你的防盗窗被人撬开了,而是你晚上睡觉的时候忘了关门,而关上门对开发来说也许只是举手之劳。 1、不要用root,确定使用的中间件和框架是否默认打开了后门 我们总会在线上使用部署一些中间件、开源...

猜你喜欢

css弹性盒模型详解----justify-content

本篇文章详细介绍justify-content 效果演示如下: 效果演示如下: 效果演示如下: 效果演示如下: 效果演示如下...

html5拖放--15行js代码实现两个div内容互换

本文首发于我的个人博客:http://cherryblog.site/ ,欢迎大家前去参观 本文项目地址,sortable插件地址:https://github.com/sunshine940326/sortable demo地址:https://github.com/sunshine940326/drag 在写我们后台的管理程序中需要有一个拖放的功能,然后我们有一个这样的功能,实现11个固定且大...

git切换分支报错,不管什么标题名字,都报非法字符,所以就不起名字了。

切换分支的时候,报了标题这么个错误,error: ”xxx did not match any file(s) known to git. 看见不能切换分支,我首先 git status 查看了一下当前状态,如下图 然后,就会发现,其实我的这个错误非常明显,就是在我的 beat 分支下有文件修改,所以切换不了。ok,解决方法: 1. 如果修改的这些文件没什么用,完全可以删除。(我这儿的...

Oracle分析函数之LEAD和LAG实际应用

Oracle分析函数之LEAD和LAG实际应用 在前几天的工作中按照客户的需求,需要对客户信息进行数据分析,即某人存在多个状态的账号,将客户信息账号状态分析出结果,和客户确认汇报,根据保留规则,保留唯一账号,以保证程序可用性。起初,根据聚合函数进行查询分析,需要写一大串的SQL,即不美观又复杂,很容易产生错误。后续想到Oracle分析函数中的lead和lag,SQL简洁了很多且容易产生报告数据。 ...

小知识积累(不断更新中)

判断变量的类型(数组,对象) tyopof:不推荐,因为无法区别数组与对象,数组是对象的子对象 instanceof:可以使用 还可以用来判断是否属于函数 Object.prototype.toString.call():最兼容,推荐使用 定时器的执行顺序或机制 js是单线程的,浏览器遇到setTimeout或者setInterval会把定时器推入浏览器的待执行事件队列里面但是不执行,先执行完当前...