123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- import hashlib
- import random
- import threading
- from .common import FileDownloader
- from . import HlsFD
- from ..networking import Request
- from ..networking.exceptions import network_exceptions
- class BunnyCdnFD(FileDownloader):
- """
- Downloads from BunnyCDN with required pings
- Note, this is not a part of public API, and will be removed without notice.
- DO NOT USE
- """
- def real_download(self, filename, info_dict):
- self.to_screen(f'[{self.FD_NAME}] Downloading from BunnyCDN')
- fd = HlsFD(self.ydl, self.params)
- stop_event = threading.Event()
- ping_thread = threading.Thread(target=self.ping_thread, args=(stop_event,), kwargs=info_dict['_bunnycdn_ping_data'])
- ping_thread.start()
- try:
- return fd.real_download(filename, info_dict)
- finally:
- stop_event.set()
- def ping_thread(self, stop_event, url, headers, secret, context_id):
- # Site sends ping every 4 seconds, but this throttles the download. Pinging every 2 seconds seems to work.
- ping_interval = 2
- # Hard coded resolution as it doesn't seem to matter
- res = 1080
- paused = 'false'
- current_time = 0
- while not stop_event.wait(ping_interval):
- current_time += ping_interval
- time = current_time + round(random.random(), 6)
- md5_hash = hashlib.md5(f'{secret}_{context_id}_{time}_{paused}_{res}'.encode()).hexdigest()
- ping_url = f'{url}?hash={md5_hash}&time={time}&paused={paused}&resolution={res}'
- try:
- self.ydl.urlopen(Request(ping_url, headers=headers)).read()
- except network_exceptions as e:
- self.to_screen(f'[{self.FD_NAME}] Ping failed: {e}')
|