Skip to content

Commit 8347e14

Browse files
committed
[YouTube] Fix playlist continuations extraction
1 parent 6701b0f commit 8347e14

2 files changed

Lines changed: 28 additions & 13 deletions

File tree

extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubePlaylistExtractor.java

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,10 @@ public InfoItemsPage<StreamInfoItem> getInitialPage() {
190190
return new InfoItemsPage<>(collector, null);
191191
} else if (contents.getObject(0).has("playlistVideoListRenderer")) {
192192
final JsonObject videos = contents.getObject(0).getObject("playlistVideoListRenderer");
193-
collectStreamsFrom(collector, videos.getArray("contents"));
193+
final JsonArray videosArray = videos.getArray("contents");
194+
collectStreamsFrom(collector, videosArray);
194195

195-
nextPage = getNextPageFrom(videos.getArray("continuations"));
196+
nextPage = getNextPageFrom(videosArray);
196197
}
197198

198199
return new InfoItemsPage<>(collector, nextPage);
@@ -207,24 +208,29 @@ public InfoItemsPage<StreamInfoItem> getPage(final Page page) throws IOException
207208
final StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId());
208209
final JsonArray ajaxJson = getJsonResponse(page.getUrl(), getExtractorLocalization());
209210

210-
final JsonObject sectionListContinuation = ajaxJson.getObject(1).getObject("response")
211-
.getObject("continuationContents").getObject("playlistVideoListContinuation");
211+
final JsonArray continuation = ajaxJson.getObject(1)
212+
.getObject("response")
213+
.getArray("onResponseReceivedActions")
214+
.getObject(0)
215+
.getObject("appendContinuationItemsAction")
216+
.getArray("continuationItems");
212217

213-
collectStreamsFrom(collector, sectionListContinuation.getArray("contents"));
218+
collectStreamsFrom(collector, continuation);
214219

215-
return new InfoItemsPage<>(collector, getNextPageFrom(sectionListContinuation.getArray("continuations")));
220+
return new InfoItemsPage<>(collector, getNextPageFrom(continuation));
216221
}
217222

218-
private Page getNextPageFrom(final JsonArray continuations) {
219-
if (isNullOrEmpty(continuations)) {
223+
private Page getNextPageFrom(final JsonArray contents) {
224+
if (isNullOrEmpty(contents)) {
220225
return null;
221226
}
222227

223-
final JsonObject nextContinuationData = continuations.getObject(0).getObject("nextContinuationData");
224-
final String continuation = nextContinuationData.getString("continuation");
225-
final String clickTrackingParams = nextContinuationData.getString("clickTrackingParams");
226-
return new Page("https://www.youtube.com/browse_ajax?ctoken=" + continuation + "&continuation=" + continuation
227-
+ "&itct=" + clickTrackingParams);
228+
final String continuation = contents.getObject(contents.size() - 1)
229+
.getObject("continuationItemRenderer")
230+
.getObject("continuationEndpoint")
231+
.getObject("continuationCommand")
232+
.getString("token");
233+
return new Page("https://www.youtube.com/browse_ajax?continuation=" + continuation);
228234
}
229235

230236
private void collectStreamsFrom(final StreamInfoItemsCollector collector, final JsonArray videos) {

extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubePlaylistExtractorTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
import org.junit.BeforeClass;
44
import org.junit.Ignore;
55
import org.junit.Test;
6+
import org.junit.runner.RunWith;
7+
import org.junit.runners.Suite;
8+
import org.junit.runners.Suite.SuiteClasses;
69
import org.schabi.newpipe.DownloaderTestImpl;
710
import org.schabi.newpipe.extractor.ListExtractor;
811
import org.schabi.newpipe.extractor.NewPipe;
@@ -11,6 +14,10 @@
1114
import org.schabi.newpipe.extractor.exceptions.ParsingException;
1215
import org.schabi.newpipe.extractor.playlist.PlaylistExtractor;
1316
import org.schabi.newpipe.extractor.services.BasePlaylistExtractorTest;
17+
import org.schabi.newpipe.extractor.services.youtube.YoutubePlaylistExtractorTest.HugePlaylist;
18+
import org.schabi.newpipe.extractor.services.youtube.YoutubePlaylistExtractorTest.LearningPlaylist;
19+
import org.schabi.newpipe.extractor.services.youtube.YoutubePlaylistExtractorTest.NotAvailable;
20+
import org.schabi.newpipe.extractor.services.youtube.YoutubePlaylistExtractorTest.TimelessPopHits;
1421
import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubePlaylistExtractor;
1522
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
1623

@@ -23,6 +30,8 @@
2330
/**
2431
* Test for {@link YoutubePlaylistExtractor}
2532
*/
33+
@RunWith(Suite.class)
34+
@SuiteClasses({NotAvailable.class, TimelessPopHits.class, HugePlaylist.class, LearningPlaylist.class})
2635
public class YoutubePlaylistExtractorTest {
2736

2837
public static class NotAvailable {

0 commit comments

Comments
 (0)