Smail_的gravatar头像
Smail_ 2017-10-28 11:39:37
开源一段python下载m3u8文件分片的mp4文件的算法

既然是开源,就先上代码,再讲为啥要这么做!

def download_ts_file(m3u8, channel_id, path):
    if not m3u8:
        return None

    if len(m3u8) < 20:
        return None

    m3u8 = mytool.get_real_url(m3u8)

    domain = m3u8.split(".m3u8")[0]

    m3u8_content = mytool.get_page(m3u8)

    if not m3u8_content or not m3u8_content.startswith("#"):
        return None

    segments = m3u8_content.split("\n")

    valid_segment = None

    for segment in segments:
        if not segment or segment.startswith("#"):
            continue
        valid_segment = segment.replace("\r", "").replace("../", "").strip()
        break

    if valid_segment:
        if valid_segment.find('.m3u8') > 0 and valid_segment.find('.ts') < 0:
            if valid_segment.find("http:") < 0:
                elements = domain.split('/')
                for i in range(0, len(elements)):
                    link = '/'.join(elements[0: len(elements) - i]) + '/' + valid_segment
                    content = mytool.get_page(link)
                    if content:
                        return download_ts_file(link, channel_id, path)
            return download_ts_file(valid_segment, channel_id, path)
        else:
            if valid_segment.find("http:") < 0:
                elements = domain.split('/')
                for i in range(0, len(elements)):
                    link = '/'.join(elements[0: len(elements) - i]) + '/' + valid_segment
                    file_name = mytool.download_file(link, path + "live.mp4")
                    if file_name:
                        return file_name
            file_name = mytool.download_file(valid_segment, path + "live.mp4")
            if file_name:
                return file_name
    return None

1.请君自行确定你的m3u8地址是确实可用的

2.m3u8 = mytool.get_real_url(m3u8),回溯真实的m3u8地址,你拿到的可能只是一个302或301地址,301或302地址上是没有ts文件的,所以必须要拿到最终地址

3.解析m3u8文件,m3u8文件参差不齐,缺标签的情况十之八九甚至m3u8里面还是一个m3u8,所以用递归去取真实的m3u8内容

4.下载

5.注意:开源出来的代码是我项目中用的代码,我的需求是只取第一个ts文件,君拿过去需要修改一下,不要只在第一个ts就归入到valid_segment里面,谨记!

6.完毕


打赏

已有1人打赏

最代码官方的gravatar头像
最近浏览
wang_shao  LV4 2019年8月12日
zhuohongxiang 2019年7月24日
暂无贡献等级
11ccvvbb  LV6 2019年5月25日
yufan  LV2 2019年5月15日
cs383450139 2019年3月22日
暂无贡献等级
dajiaman 2019年1月2日
暂无贡献等级
877801131 2018年10月27日
暂无贡献等级
牛大爷  LV11 2018年9月21日
glgugk 2018年8月21日
暂无贡献等级
chinaxc 2018年7月26日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友