import asyncio import aiohttp import json import traceback from urllib.parse import quote from . import asyncdl from . import parser from . import videoinfo from . block import Block from . duplcheck import duplicate_head, duplicate_tail, overwrap from .. import config from .. exceptions import InvalidVideoIdException from .. paramgen import arcparam logger = config.logger(__name__) headers=config.headers class Downloader: def __init__(self, video_id, duration, div, callback): self.video_id = video_id self.duration = duration self.div = div self.blocks = [] self.callback = callback def ready_blocks(self): result = asyncdl.ready_blocks( self.video_id, self.duration, self.div, self.callback) self.blocks = [block for block in result if block] return self def remove_duplicate_head(self): self.blocks = duplicate_head(self.blocks) return self def set_temporary_last(self): for i in range(len(self.blocks)-1): self.blocks[i].temp_last = self.blocks[i+1].first self.blocks[-1].temp_last = -1 return self def remove_overwrap(self): self.blocks = overwrap(self.blocks) return self def download_blocks(self): asyncdl.download_chunk(self.callback, self.blocks) return self def remove_duplicate_tail(self): self.blocks = duplicate_tail(self.blocks) return self def combine(self): ret = [] for block in self.blocks: ret.extend(block.chat_data) return ret def download(self): return ( self.ready_blocks() .remove_duplicate_head() .set_temporary_last() .remove_overwrap() .download_blocks() .remove_duplicate_tail() .combine() ) def download(video_id, div = 20, callback=None, processor = None): duration = 0 try: duration = videoinfo(video_id).get("duration") except InvalidVideoIdException: raise if duration == 0: print("video is live.") return return Downloader(video_id, duration, div, callback).download()