Skip to content

Commit dc29d87

Browse files
committed
Extract YouTube search suggestions
1 parent c852b13 commit dc29d87

2 files changed

Lines changed: 38 additions & 17 deletions

File tree

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

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -174,16 +174,19 @@ public String getUrl() throws ParsingException {
174174

175175
@Override
176176
public String getSearchSuggestion() throws ParsingException {
177-
if (isMusicSearch()) return "";
178-
179-
JsonObject showingResultsForRenderer = initialData.getObject("contents")
180-
.getObject("twoColumnSearchResultsRenderer").getObject("primaryContents")
181-
.getObject("sectionListRenderer").getArray("contents").getObject(0)
182-
.getObject("itemSectionRenderer").getArray("contents").getObject(0)
183-
.getObject("showingResultsForRenderer");
184-
if (showingResultsForRenderer == null) {
185-
return "";
177+
if (isMusicSearch()) {
178+
final JsonObject itemSectionRenderer = initialData.getObject("contents").getObject("sectionListRenderer")
179+
.getArray("contents").getObject(0).getObject("itemSectionRenderer");
180+
if (itemSectionRenderer == null) return "";
181+
return getTextFromObject(itemSectionRenderer.getArray("contents").getObject(0)
182+
.getObject("didYouMeanRenderer").getObject("correctedQuery"));
186183
} else {
184+
JsonObject showingResultsForRenderer = initialData.getObject("contents")
185+
.getObject("twoColumnSearchResultsRenderer").getObject("primaryContents")
186+
.getObject("sectionListRenderer").getArray("contents").getObject(0)
187+
.getObject("itemSectionRenderer").getArray("contents").getObject(0)
188+
.getObject("showingResultsForRenderer");
189+
if (showingResultsForRenderer == null) return "";
187190
return getTextFromObject(showingResultsForRenderer.getObject("correctedQuery"));
188191
}
189192
}
@@ -194,10 +197,13 @@ public InfoItemsPage<InfoItem> getInitialPage() throws ExtractionException, IOEx
194197
final InfoItemsSearchCollector collector = new InfoItemsSearchCollector(getServiceId());
195198

196199
if (isMusicSearch()) {
197-
JsonArray sections = initialData.getObject("contents").getObject("sectionListRenderer")
198-
.getArray("contents").getObject(0).getObject("musicShelfRenderer").getArray("contents");
200+
final JsonArray contents = initialData.getObject("contents").getObject("sectionListRenderer").getArray("contents");
199201

200-
collectMusicStreamsFrom(collector, sections);
202+
for (Object content : contents) {
203+
if (((JsonObject) content).getObject("musicShelfRenderer") != null) {
204+
collectMusicStreamsFrom(collector, ((JsonObject) content).getObject("musicShelfRenderer").getArray("contents"));
205+
}
206+
}
201207
} else {
202208
JsonArray sections = initialData.getObject("contents").getObject("twoColumnSearchResultsRenderer")
203209
.getObject("primaryContents").getObject("sectionListRenderer").getArray("contents");
@@ -213,8 +219,15 @@ public InfoItemsPage<InfoItem> getInitialPage() throws ExtractionException, IOEx
213219
@Override
214220
public String getNextPageUrl() throws ExtractionException, IOException {
215221
if (isMusicSearch()) {
216-
return getNextPageUrlFrom(initialData.getObject("contents").getObject("sectionListRenderer")
217-
.getArray("contents").getObject(0).getObject("musicShelfRenderer").getArray("continuations"));
222+
final JsonArray contents = initialData.getObject("contents").getObject("sectionListRenderer").getArray("contents");
223+
224+
for (Object content : contents) {
225+
if (((JsonObject) content).getObject("musicShelfRenderer") != null) {
226+
return getNextPageUrlFrom(((JsonObject) content).getObject("musicShelfRenderer").getArray("continuations"));
227+
}
228+
}
229+
230+
return "";
218231
} else {
219232
return getNextPageUrlFrom(initialData.getObject("contents").getObject("twoColumnSearchResultsRenderer")
220233
.getObject("primaryContents").getObject("sectionListRenderer").getArray("contents")
@@ -517,9 +530,7 @@ public long getStreamCount() throws ParsingException {
517530
}
518531

519532
private String getNextPageUrlFrom(JsonArray continuations) throws ParsingException, IOException, ReCaptchaException {
520-
if (continuations == null) {
521-
return "";
522-
}
533+
if (continuations == null) return "";
523534

524535
JsonObject nextContinuationData = continuations.getObject(0).getObject("nextContinuationData");
525536
String continuation = nextContinuationData.getString("continuation");

extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/search/YoutubeSearchExtractorMusicTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,14 @@ public void testGetSecondPageUrl() throws Exception {
7676
assertEquals("json", queryPairs.get("alt"));
7777
assertTrue(queryPairs.get("key").length() > 5);
7878
}
79+
80+
@Test
81+
public void testSuggestions() throws Exception {
82+
YoutubeSearchExtractor newExtractor = (YoutubeSearchExtractor) YouTube.getSearchExtractor("megaman x3",
83+
asList(YoutubeSearchQueryHandlerFactory.MUSIC_SONGS), null);
84+
newExtractor.fetchPage();
85+
86+
assertTrue(newExtractor.getInitialPage().getItems().size() > 10);
87+
assertEquals("mega man x3", newExtractor.getSearchSuggestion());
88+
}
7989
}

0 commit comments

Comments
 (0)