在观看网络视频时,有时想下载一些视频中的精彩片段。但是整个视频有时会很大,下载起来费时费力。于是我就写了这个快捷命令。只下载自己指定的片段,既精准又快速。
注意:这个工具如果能配合谷歌商店的“猫抓”浏览器插件以及这个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)