Files
pytchat-fork/pytchat/tool/downloader.py
2020-02-02 00:38:22 +09:00

81 lines
2.2 KiB
Python

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()