2022-02-25 02:16:23 +00:00
|
|
|
import threading
|
|
|
|
|
|
|
|
from .common import FileDownloader
|
|
|
|
from .external import FFmpegFD
|
|
|
|
|
|
|
|
|
|
|
|
class FC2LiveFD(FileDownloader):
|
|
|
|
"""
|
|
|
|
Downloads FC2 live without being stopped. <br>
|
|
|
|
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):
|
|
|
|
ws = info_dict['ws']
|
|
|
|
|
|
|
|
heartbeat_lock = threading.Lock()
|
|
|
|
heartbeat_state = [None, 1]
|
|
|
|
|
|
|
|
def heartbeat():
|
2022-04-24 15:45:19 +00:00
|
|
|
if heartbeat_state[1] < 0:
|
|
|
|
return
|
|
|
|
|
2022-02-25 02:16:23 +00:00
|
|
|
try:
|
|
|
|
heartbeat_state[1] += 1
|
|
|
|
ws.send('{"name":"heartbeat","arguments":{},"id":%d}' % heartbeat_state[1])
|
|
|
|
except Exception:
|
|
|
|
self.to_screen('[fc2:live] Heartbeat failed')
|
|
|
|
|
|
|
|
with heartbeat_lock:
|
|
|
|
heartbeat_state[0] = threading.Timer(30, heartbeat)
|
|
|
|
heartbeat_state[0]._daemonic = True
|
|
|
|
heartbeat_state[0].start()
|
|
|
|
|
|
|
|
heartbeat()
|
|
|
|
|
|
|
|
new_info_dict = info_dict.copy()
|
|
|
|
new_info_dict.update({
|
|
|
|
'ws': None,
|
|
|
|
'protocol': 'live_ffmpeg',
|
|
|
|
})
|
2022-04-24 15:45:19 +00:00
|
|
|
try:
|
|
|
|
return FFmpegFD(self.ydl, self.params or {}).download(filename, new_info_dict)
|
|
|
|
finally:
|
|
|
|
# stop heartbeating
|
|
|
|
heartbeat_state[1] = -1
|