]> jfr.im git - yt-dlp.git/commitdiff
[youtube,twitch] Allow waiting for channels to become live
authorpukkandan <redacted>
Tue, 26 Jul 2022 03:53:10 +0000 (09:23 +0530)
committerpukkandan <redacted>
Tue, 26 Jul 2022 04:03:19 +0000 (09:33 +0530)
Closes #2597

yt_dlp/YoutubeDL.py
yt_dlp/extractor/twitch.py
yt_dlp/extractor/youtube.py
yt_dlp/utils.py

index 5094920b9b2a9b1fc361464934add344630a16f0..aef348a4401abb72dc9e9676802ac4253e35555d 100644 (file)
@@ -80,6 +80,7 @@
     RejectedVideoReached,
     SameFileError,
     UnavailableVideoError,
+    UserNotLive,
     YoutubeDLCookieProcessor,
     YoutubeDLHandler,
     YoutubeDLRedirectHandler,
@@ -1456,7 +1457,7 @@ def wrapper(self, *args, **kwargs):
                 break
         return wrapper
 
-    def _wait_for_video(self, ie_result):
+    def _wait_for_video(self, ie_result={}):
         if (not self.params.get('wait_for_video')
                 or ie_result.get('_type', 'video') != 'video'
                 or ie_result.get('formats') or ie_result.get('url')):
@@ -1480,7 +1481,7 @@ def progress(msg):
         if diff is None and ie_result.get('live_status') == 'is_upcoming':
             diff = round(random.uniform(min_wait, max_wait) if (max_wait and min_wait) else (max_wait or min_wait), 0)
             self.report_warning('Release time of video is not known')
-        elif (diff or 0) <= 0:
+        elif ie_result and (diff or 0) <= 0:
             self.report_warning('Video should already be available according to extracted info')
         diff = min(max(diff or 0, min_wait or 0), max_wait or float('inf'))
         self.to_screen(f'[wait] Waiting for {format_dur(diff)} - Press Ctrl+C to try now')
@@ -1504,7 +1505,14 @@ def progress(msg):
 
     @_handle_extraction_exceptions
     def __extract_info(self, url, ie, download, extra_info, process):
-        ie_result = ie.extract(url)
+        try:
+            ie_result = ie.extract(url)
+        except UserNotLive as e:
+            if process:
+                if self.params.get('wait_for_video'):
+                    self.report_warning(e)
+                self._wait_for_video()
+            raise
         if ie_result is None:  # Finished already (backwards compatibility; listformats and friends should be moved here)
             self.report_warning(f'Extractor {ie.IE_NAME} returned nothing{bug_reports_message()}')
             return
index a0cb0be0266869812dc2da93c63be7875c917f83..32cfd8a08d5324e7ab37f31f616cfd795163cdbe 100644 (file)
     compat_urllib_parse_urlparse,
 )
 from ..utils import (
+    ExtractorError,
+    UserNotLive,
     base_url,
     clean_html,
     dict_get,
-    ExtractorError,
     float_or_none,
     int_or_none,
     parse_duration,
@@ -940,7 +941,7 @@ def _real_extract(self, url):
         stream = user['stream']
 
         if not stream:
-            raise ExtractorError('%s is offline' % channel_name, expected=True)
+            raise UserNotLive(video_id=channel_name)
 
         access_token = self._download_access_token(
             channel_name, 'stream', 'channelName')
index 09e2127e3250ee2d9b3e88fc5e0a69d32e59cb3a..c60e5ca53385de153d950bf33b34a7c23505e7a5 100644 (file)
@@ -22,6 +22,7 @@
 from ..utils import (
     NO_DEFAULT,
     ExtractorError,
+    UserNotLive,
     bug_reports_message,
     classproperty,
     clean_html,
@@ -5383,9 +5384,8 @@ def get_mobj(url):
                 selected_tab_name = 'featured'
             requested_tab_name = mobj['tab'][1:]
             if 'no-youtube-channel-redirect' not in compat_opts:
-                if requested_tab_name == 'live':
-                    # Live tab should have redirected to the video
-                    raise ExtractorError('The channel is not currently live', expected=True)
+                if requested_tab_name == 'live':  # Live tab should have redirected to the video
+                    raise UserNotLive(video_id=mobj['id'])
                 if requested_tab_name not in ('', selected_tab_name):
                     redirect_warning = f'The channel does not have a {requested_tab_name} tab'
                     if not original_tab_name:
index f522c2102c3d42fa09cab849ba7d8ca411d0a97f..ca39e96ac9e329188c428ad4ec43166251547c5c 100644 (file)
@@ -1072,6 +1072,14 @@ def __init__(self, msg, countries=None, **kwargs):
         self.countries = countries
 
 
+class UserNotLive(ExtractorError):
+    """Error when a channel/user is not live"""
+
+    def __init__(self, msg=None, **kwargs):
+        kwargs['expected'] = True
+        super().__init__(msg or 'The channel is not currently live', **kwargs)
+
+
 class DownloadError(YoutubeDLError):
     """Download Error exception.