m3u8片段下载

在观看网络视频时,有时想下载一些视频中的精彩片段。但是整个视频有时会很大,下载起来费时费力。于是我就写了这个快捷命令。只下载自己指定的片段,既精准又快速。
注意:这个工具如果能配合谷歌商店的“猫抓”浏览器插件以及这个m3u8下载器,食用效果不要太美味!
使用:通过猫抓插件搞到视频m3u8文件链接,接着运行本命令,按提示输入截取的开始结束时间(支持一次截取多段)。运行后我们就能得到下载分段视频文件的m3u8文件。只需要将这些m3u8文件拖入下载器下载即可。
猫抓:
在这里插入图片描述
下载器:
m3u8片段下载_第1张图片
完整代码:

import os
from su_util import su_media_util, su_webutil


def get_final_body(bodyArr, begin_time, end_time, slice_lenth):
    #起始结束时间相同时,截取视频全长
    if begin_time == end_time:
        begin_slice_index = 0
        end_slice_index = int(len(bodyArr) / 2)
    else:
        begin_slice_index = int(begin_time / slice_lenth)
        end_slice_index = int(end_time / slice_lenth)
    final_Str = ''
    for i in range(begin_slice_index, end_slice_index):
        final_Str += bodyArr[i*2] + '\n'
        final_Str += bodyArr[i*2 + 1] + '\n'
    return final_Str


def save_m3u8file(m3u8_str, filepath, begin, end):
    filename = os.path.basename(filepath)
    filename_noex = os.path.splitext(filename)[0]
    newfilename_noex = '%s_%s_%s' % (filename_noex, str(begin), str(end))
    outfilepath = filepath.replace(filename_noex, newfilename_noex)
    with open(outfilepath, 'w') as fp:
        fp.write(m3u8_str)
    print(outfilepath)


m3u8_url = r'{
     {ClipText}}'
print(m3u8_url)
print('以下输入如果直接回车,则表示默认')

filepath = input('m3u8文件保存路径:') or 'D:/temp.m3u8'
success = su_webutil.save_link(m3u8_url, filepath)
if not success:
    os.system('exit')
basepath = input('域名(一般默认就行,如果出错再填):') or m3u8_url[0:m3u8_url.rindex('hls')]

final_str = ''
periodtime = []
with open(filepath, 'r') as fp:
    content = fp.read()
    body_begin_index = content.index('#EXTINF')
    body_end_index = content.rindex('#EXT-X-ENDLIST')

    headStr = content[0:body_begin_index]
    headArr = headStr.split('\n')
    head_finalStr = headArr[0] + '\n#YUMING|%s' % basepath
    for i in range(1, len(headArr)):
        head_finalStr += '\n%s' % headArr[i]
    # print(head_finalStr)

    bodyStr = content[body_begin_index:body_end_index]
    bodyArr = bodyStr.split('\n')

    exinf_str = bodyArr[2]
    slice_str = exinf_str.split(':')[1]
    slice_lenth = float(slice_str[0:len(slice_str)-3])
    print(slice_str)

    input_p = 'y'
    begin_time = '00:00:00'
    end_time = '00:01:00'
    while input_p == 'y':
        begin_time = su_media_util.timestr_clock2second(
            input('开始时间(格式:xx:xx:xx 默认:0):') or '00:00:00')
        end_time = su_media_util.timestr_clock2second(
            input('结束时间(格式:xx:xx:xx 默认:视频总长):') or '00:00:00')
        periodtime.append({
     'begin': begin_time, 'end': end_time})
        input_p = input("继续添加时间段?y/n default:n :") or 'n'
    print(periodtime)

    for obj in periodtime:
        begin = obj['begin']
        end = obj['end']
        final_bodyStr = get_final_body(bodyArr, begin, end, slice_lenth)
        endStr = content[body_end_index:len(content)-1]
        final_str = head_finalStr + final_bodyStr + endStr
        # print(final_str)

        save_m3u8file(final_str, filepath, begin, end)

#打开输出目录
dirname = os.path.dirname(filepath)
os.startfile(dirname)

你可能感兴趣的:(我的原创Utools工具集,python)