在观看网络视频时,有时想下载一些视频中的精彩片段。但是整个视频有时会很大,下载起来费时费力。于是我就写了这个快捷命令。只下载自己指定的片段,既精准又快速。

注意:这个工具如果能配合谷歌商店的“猫抓”浏览器插件以及这个m3u8下载器,食用效果不要太美味!

使用:通过猫抓插件搞到视频m3u8文件链接,接着运行本命令,按提示输入截取的开始结束时间(支持一次截取多段)。运行后我们就能得到下载分段视频文件的m3u8文件。只需要将这些m3u8文件拖入下载器下载即可。

猫抓:

下载器:

完整代码:

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)