ps:本文前提是获取m3u8_url,url未加密。单线程序下载importrequestsimportos#fromsubprocessimportrun#创建相关的文件夹ifnotos.path.exists('download'):os.mkdir('download')ifnotos.path.exists('download/m3u8'):os.mkdir('download/m3u8')如果不是os.path.exists('download/temp'):os.mkdir('download/temp')def下载(medianame,m3u8_url):headers={'user-agent':'Mozilla/5.0(Macintosh;IntelMacOSX10_15_3)AppleWebKit/537.36(KHTML,likeGecko)Chrome/80.0.3987.116Safari/537.36'}url='/'.join(m3u8_url.split('/')[:-1])+'/'withopen('download/m3u8/'+medianame+'.m3u8','wb')asf:r=requests.get(m3u8_url,headers=headers)f.write(r.content)line=[]foriinopen('download/m3u8/'+medianame+'.m3u8','r'):if'#'ini:continueline.append(i.replace('\r','').replace('\n',''))print('开始下载!')withopen('download/'+medianame+'.ts','wb')asf:foriintqdm(line):#print(url+i)r=requests.get(url+i)f.write(r.content)#print('开始转码,请等候~')#run([#'ffmpeg/bin/ffmpeg.exe','-i','download/'+medianame+'.ts','-c:v',#'copy','-c:a','copy','download/'+medianame+'.mp4'#])#os.remove('download/'+medianame+'.ts')os.remove('download/m3u8/'+medianame+'.m3u8')多线程序下载importaiohttpimportasyncioimportos#fromsubprocessimportrundef结合(临时,文件):与开放(文件,'wb')作为f:list=os.listdir(temp)list.sort()foriinlist:withopen(os.path.join(temp,i),'rb')ast:f.write(t.read())asyncdefreq(client,url,filename,sem):asyncwithsem:response=awaitclient.get(url)withopen(filename,'wb')asf:f.write(awaitresponse.content.read())asyncdefdownload_async(medianame,m3u8_url,sem_num):ifint(sem_num)inrange(2,13):sem=asyncio.Semaphore(int(sem_num))print('以%s进行下载'%sem_num)else:print('输入不符合格式,以6进行下载')sem=asyncio.Semaphore(6)asyncwithaiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=False))assession:headers={'user-agent':'Mozilla/5.0(Macintosh;IntelMacOSX10_15_3)AppleWebKit/537.36(KHTML,likeGecko)Chrome/80.0.3987.116Safari/537.36'}url='/'.join(m3u8_url.split('/')[:-1])+'/'withopen('download/m3u8/'+medianame+'.m3u8','wb')asf:r=requests.get(m3u8_url,headers=headers)f.write(r.content)urls=[]foriinopen('download/m3u8/'+medianame+'.m3u8','r'):如果'#'ini:如果不是os.path.exists('download/temp/'+medianame):os.mkdir('download/temp/'+medianame)task_list=[]forts_URL中的名称:文件名='download/temp/'+medianame+'/'+ts_nametask=asyncio.create_task(req(session,url+ts_name,filename,sem))task_list.append(task)responses=[awaitfforfintqdm(asyncio.as_completed(task_list),total=len(task_list))]combine('download/temp/'+medianame,'download/'+medianame+'.ts')#run([#'ffmpeg/bin/ffmpeg.exe','-i','download/'+medianame+'.ts','-c:v',#'copy','-c:a','copy','download/'+medianame+'.mp4'#])#shutil.rmtree('download/temp/'+medianame)#os.remove('download/'+medianame+'.ts')os.remove('download/m3u8/'+medianame+'.m3u8')loop=asyncio.get_event_loop()loop.run_until_complete(download_async(mediaName,m3u8_url,sem_num))转码成mp4取消注释代码,修改ffmpeg路径为你的ffmpeg路径,即可自动转换成mp4
