[ie/niconico] Apply suggestions: info_dict, protocols and downloaders

- Use "downloader_options" to pass options used by the downloader.
- Combine the two downloaders into one.
- Don't inherit from "HlsFD".

Co-authored-by: pukkandan <pukkandan.ytdlp@gmail.com>
This commit is contained in:
Mozi 2024-03-12 05:06:28 +00:00
parent 7398a7cb2f
commit 972a2d51ad
3 changed files with 20 additions and 28 deletions

View File

@ -30,7 +30,7 @@ def get_suitable_downloader(info_dict, params={}, default=NO_DEFAULT, protocol=N
from .http import HttpFD
from .ism import IsmFD
from .mhtml import MhtmlFD
from .niconico import NiconicoDmcFD, NiconicoLiveFD, NiconicoLiveTimeshiftFD
from .niconico import NiconicoDmcFD, NiconicoLiveFD
from .rtmp import RtmpFD
from .rtsp import RtspFD
from .websocket import WebSocketFragmentFD
@ -51,7 +51,6 @@ def get_suitable_downloader(info_dict, params={}, default=NO_DEFAULT, protocol=N
'mhtml': MhtmlFD,
'niconico_dmc': NiconicoDmcFD,
'm3u8_niconico_live': NiconicoLiveFD,
'm3u8_niconico_live_timeshift': NiconicoLiveTimeshiftFD,
'fc2_live': FC2LiveFD,
'websocket_frag': WebSocketFragmentFD,
'youtube_live_chat': YoutubeLiveChatFD,

View File

@ -7,7 +7,7 @@
from . import get_suitable_downloader
from .common import FileDownloader
from .external import FFmpegFD
from ..downloader.hls import HlsFD
from ..downloader.fragment import FragmentFD
from ..networking import Request
from ..networking.exceptions import network_exceptions
from ..utils import (
@ -67,7 +67,10 @@ def heartbeat():
return success
class NiconicoLiveBaseFD(FileDownloader):
class NiconicoLiveFD(FragmentFD):
""" Downloads niconico live/timeshift VOD """
_PER_FRAGMENT_DOWNLOAD_RATIO = 0.1
_WEBSOCKET_RECONNECT_DELAY = 10
@contextlib.contextmanager
@ -75,8 +78,8 @@ def _ws_context(self, info_dict):
""" Hold a WebSocket object and release it when leaving """
video_id = info_dict['id']
live_latency = info_dict['live_latency']
self.ws = info_dict['__ws']
live_latency = info_dict['downloader_options']['live_latency']
self.ws = info_dict['downloader_options']['ws']
self.m3u8_lock = threading.Event()
self.m3u8_url = info_dict['manifest_url']
@ -167,27 +170,15 @@ def _master_m3u8_url(self):
self.m3u8_lock.wait()
return self.m3u8_url
class NiconicoLiveFD(NiconicoLiveBaseFD):
""" Downloads niconico live without being stopped """
def real_download(self, filename, info_dict):
with self._ws_context(info_dict):
new_info_dict = info_dict.copy()
new_info_dict.update({
'protocol': 'm3u8',
})
return FFmpegFD(self.ydl, self.params or {}).download(filename, new_info_dict)
class NiconicoLiveTimeshiftFD(NiconicoLiveBaseFD, HlsFD):
""" Downloads niconico live timeshift VOD """
_PER_FRAGMENT_DOWNLOAD_RATIO = 0.1
def real_download(self, filename, info_dict):
with self._ws_context(info_dict) as ws_context:
# live
if info_dict.get('is_live'):
info_dict = info_dict.copy()
info_dict['protocol'] = 'm3u8'
return FFmpegFD(self.ydl, self.params or {}).download(filename, info_dict)
# timeshift VOD
from ..extractor.niconico import NiconicoIE
ie = NiconicoIE(self.ydl)

View File

@ -1002,7 +1002,7 @@ def _yield_formats(self, ws, video_id, latency, is_live):
for fmt, q in zip(formats, reversed(qualities[1:])):
fmt.update({
'format_id': q,
'protocol': 'm3u8_niconico_live' if is_live else 'm3u8_niconico_live_timeshift',
'protocol': 'm3u8_niconico_live',
})
yield fmt
@ -1075,7 +1075,9 @@ def _real_extract(self, url):
'live_status': live_status,
'thumbnails': thumbnails,
'formats': [*self._yield_formats(ws, video_id, latency, live_status == 'is_live')] if ws else None,
'live_latency': latency,
'http_headers': headers,
'__ws': ws,
'downloader_options': {
'live_latency': latency,
'ws': ws,
},
}