]> jfr.im git - yt-dlp.git/commitdiff
Fix search to not depend on index position for videoRenderer and token items.
authorMatthew <redacted>
Sat, 14 Nov 2020 20:03:40 +0000 (09:03 +1300)
committerMatthew <redacted>
Sat, 14 Nov 2020 20:03:40 +0000 (09:03 +1300)
youtube_dlc/extractor/youtube.py

index 97cc793f9a20a2b864091f55007be2805aaa01f3..76c98ba36f7b84e8f419b1f6bbbd631595d7c8b3 100644 (file)
@@ -3336,10 +3336,33 @@ def _entries(self, query, n):
                 list)
             if not slr_contents:
                 break
-            isr_contents = try_get(
-                slr_contents,
-                lambda x: x[0]['itemSectionRenderer']['contents'],
-                list)
+
+            isr_contents = []
+            continuation_token = None
+            # Youtube sometimes adds promoted content to searches,
+            # changing the index location of videos and token.
+            # So we search through all entries till we find them.
+            for index, isr in enumerate(slr_contents):
+                if len(isr_contents) == 0:
+                    isr_contents = try_get(
+                        slr_contents,
+                        (lambda x: x[index]['itemSectionRenderer']['contents']),
+                        list)
+                    for content in isr_contents:
+                        if content.get('videoRenderer') is not None:
+                            break
+                    else:
+                        isr_contents = []
+
+                if continuation_token is None:
+                    continuation_token = try_get(
+                        slr_contents,
+                        lambda x: x[index]['continuationItemRenderer']['continuationEndpoint']['continuationCommand'][
+                            'token'],
+                        compat_str)
+                if continuation_token is not None and isr_contents != []:
+                    break
+
             if not isr_contents:
                 break
             for content in isr_contents:
@@ -3373,13 +3396,9 @@ def _entries(self, query, n):
                 }
                 if total == n:
                     return
-            token = try_get(
-                slr_contents,
-                lambda x: x[1]['continuationItemRenderer']['continuationEndpoint']['continuationCommand']['token'],
-                compat_str)
-            if not token:
+            if not continuation_token:
                 break
-            data['continuation'] = token
+            data['continuation'] = continuation_token
 
     def _get_n_results(self, query, n):
         """Get a specified number of results for a query"""