yt-dlc/youtube_dlc/heartbeat.py

59 lines
1.7 KiB
Python
Raw Normal View History

2020-10-31 22:58:53 +00:00
# coding: utf-8
from __future__ import unicode_literals
2020-10-31 22:18:40 +00:00
import threading
import traceback
from .utils import (
2020-11-02 23:22:17 +00:00
compat_str,
encode_compat_str,
2020-10-31 22:18:40 +00:00
sanitized_Request
)
class Heartbeat(object):
def __init__(self, ydl, params):
self.ydl = ydl
data = params.get('data')
2020-11-02 23:22:17 +00:00
if isinstance(data, compat_str):
2020-10-31 22:18:40 +00:00
data = data.encode()
# Python 2 does not allow us to set HTTP method
# it is POST if Request has data, otherwise GET
2020-10-31 22:18:40 +00:00
self.request = sanitized_Request(
params.get('url'),
data=data,
headers=params.get('headers', {})
2020-10-31 22:18:40 +00:00
)
self.interval = params.get('interval', 30)
2020-11-01 12:23:39 +00:00
self.cancelled = False
self.parent_thread = threading.current_thread()
self.thread = threading.Thread(target=self.__heartbeat)
2020-10-31 22:18:40 +00:00
def start(self):
self.ydl.to_screen('[heartbeat] Heartbeat every %s seconds' % self.interval)
2020-10-31 22:18:40 +00:00
self.thread.start()
2020-11-01 12:23:39 +00:00
def cancel(self):
self.cancelled = True
2020-10-31 22:18:40 +00:00
def check_download_status(self, progress):
status = progress.get('status')
if status == 'finished' or status == 'error':
2020-11-01 12:23:39 +00:00
self.cancel()
2020-10-31 22:18:40 +00:00
def __heartbeat(self):
2020-11-01 12:23:39 +00:00
while not self.cancelled:
2020-10-31 22:18:40 +00:00
try:
if self.ydl.params.get('verbose'):
self.ydl.to_screen('[heartbeat]')
self.ydl.urlopen(self.request)
except Exception:
self.ydl.report_warning("Heartbeat failed")
2020-10-31 22:18:40 +00:00
if self.ydl.params.get('verbose'):
self.ydl.to_stderr(encode_compat_str(traceback.format_exc()))
self.parent_thread.join(self.interval)
if not self.parent_thread.is_alive():
break