m3u8视频下载
import aiohttp
import asyncio
from urllib import parse
import re
from Crypto.Cipher import AES
pattern = re.compile('.*?\.ts')
pattern_key = re.compile('URI="(.*?)"')
async def get_url(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
text = await response.text()
key = pattern_key.findall(text)
aes = ''
if key:
key_url = parse.urljoin(url, key[0])
key_content = await get_key(session, key_url)
aes = AES.new(key_content, AES.MODE_CBC, key_content)
ts_list = pattern.findall(text)
ts_url_list = [parse.urljoin(url, ts) for ts in ts_list]
await asyncio.gather(*[get_ts_len(session, ts_url, aes, i) for i, ts_url in enumerate(ts_url_list)])
async def get_key(session, key_url):
async with session.get(key_url) as response:
return await response.text()
async def get_ts(session, ts_url, aes, i):
async with session.get(ts_url) as response:
con = await response.read()
if aes:
con = aes.decrypt(con)
with open(f'./{i}.ts', 'wb') as f:
print(i)
f.write(con)
def main(url):
asyncio.run(get_url(url))
if __name__ == '__main__':
url = ''
main(url)