Skip to content

Commit 29b639b

Browse files
committed
Search: add isCorrectedSearch() and fix YoutubeSearchExtractor#getSearchSuggestion()
isCorrectedSearch: see the javadoc getSearchSuggestion: in YoutubeSearchExtractor, it was giving the corrected search query. It now gives the suggested query, as it should
1 parent 665c69b commit 29b639b

11 files changed

Lines changed: 122 additions & 9 deletions

File tree

extractor/src/main/java/org/schabi/newpipe/extractor/search/SearchExtractor.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,15 @@ public SearchQueryHandler getLinkHandler() {
3737
public String getName() {
3838
return getLinkHandler().getSearchString();
3939
}
40+
41+
/**
42+
* When you search on some service, it can give you another and corrected request.
43+
* This method says if it's the case.
44+
* <p>
45+
* Example: on YouTube, if you search for "pewdeipie",
46+
* it will give you results for "pewdiepie", then isCorrectedSearch should return true.
47+
*
48+
* @return whether the results comes from a corrected query or not.
49+
*/
50+
public abstract boolean isCorrectedSearch() throws ParsingException;
4051
}

extractor/src/main/java/org/schabi/newpipe/extractor/search/SearchInfo.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public class SearchInfo extends ListInfo<InfoItem> {
1515

1616
private String searchString;
1717
private String searchSuggestion;
18+
private boolean isCorrectedSearch;
1819

1920
public SearchInfo(int serviceId,
2021
SearchQueryHandler qIHandler,
@@ -46,6 +47,11 @@ public static SearchInfo getInfo(SearchExtractor extractor) throws ExtractionExc
4647
} catch (Exception e) {
4748
info.addError(e);
4849
}
50+
try {
51+
info.isCorrectedSearch = extractor.isCorrectedSearch();
52+
} catch (Exception e) {
53+
info.addError(e);
54+
}
4955

5056
ListExtractor.InfoItemsPage<InfoItem> page = ExtractorHelper.getItemsPageOrLogError(info, extractor);
5157
info.setRelatedItems(page.getItems());
@@ -70,4 +76,8 @@ public String getSearchString() {
7076
public String getSearchSuggestion() {
7177
return searchSuggestion;
7278
}
79+
80+
public boolean isCorrectedSearch() {
81+
return this.isCorrectedSearch;
82+
}
7383
}

extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/MediaCCCSearchExtractor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ public String getSearchSuggestion() {
4747
return null;
4848
}
4949

50+
@Override
51+
public boolean isCorrectedSearch() {
52+
return false;
53+
}
54+
5055
@Nonnull
5156
@Override
5257
public InfoItemsPage<InfoItem> getInitialPage() {

extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeSearchExtractor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ public String getSearchSuggestion() throws ParsingException {
4040
return null;
4141
}
4242

43+
@Override
44+
public boolean isCorrectedSearch() {
45+
return false;
46+
}
47+
4348
@Override
4449
public InfoItemsPage<InfoItem> getInitialPage() throws IOException, ExtractionException {
4550
super.fetchPage();

extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudSearchExtractor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ public String getSearchSuggestion() {
3838
return null;
3939
}
4040

41+
@Override
42+
public boolean isCorrectedSearch() {
43+
return false;
44+
}
45+
4146
@Nonnull
4247
@Override
4348
public InfoItemsPage<InfoItem> getInitialPage() throws IOException, ExtractionException {

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,19 @@ public String getSearchSuggestion() throws ParsingException {
135135
return getTextFromObject(didYouMeanRenderer.getObject("correctedQuery"));
136136
}
137137

138+
@Override
139+
public boolean isCorrectedSearch() {
140+
final JsonObject itemSectionRenderer = initialData.getObject("contents").getObject("sectionListRenderer")
141+
.getArray("contents").getObject(0).getObject("itemSectionRenderer");
142+
if (itemSectionRenderer == null) {
143+
return false;
144+
}
145+
146+
JsonObject showingResultsForRenderer = itemSectionRenderer.getArray("contents").getObject(0)
147+
.getObject("showingResultsForRenderer");
148+
return showingResultsForRenderer != null;
149+
}
150+
138151
@Nonnull
139152
@Override
140153
public InfoItemsPage<InfoItem> getInitialPage() throws ExtractionException, IOException {

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

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.grack.nanojson.JsonArray;
44
import com.grack.nanojson.JsonObject;
5-
65
import org.schabi.newpipe.extractor.InfoItem;
76
import org.schabi.newpipe.extractor.StreamingService;
87
import org.schabi.newpipe.extractor.downloader.Downloader;
@@ -12,10 +11,10 @@
1211
import org.schabi.newpipe.extractor.localization.TimeAgoParser;
1312
import org.schabi.newpipe.extractor.search.InfoItemsSearchCollector;
1413
import org.schabi.newpipe.extractor.search.SearchExtractor;
15-
16-
import java.io.IOException;
14+
import org.schabi.newpipe.extractor.utils.JsonUtils;
1715

1816
import javax.annotation.Nonnull;
17+
import java.io.IOException;
1918

2019
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getJsonResponse;
2120
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getTextFromObject;
@@ -64,15 +63,25 @@ public String getUrl() throws ParsingException {
6463

6564
@Override
6665
public String getSearchSuggestion() throws ParsingException {
67-
final JsonObject showingResultsForRenderer = initialData.getObject("contents")
66+
final JsonObject didYouMeanRenderer = initialData.getObject("contents")
6867
.getObject("twoColumnSearchResultsRenderer").getObject("primaryContents")
6968
.getObject("sectionListRenderer").getArray("contents").getObject(0)
7069
.getObject("itemSectionRenderer").getArray("contents").getObject(0)
71-
.getObject("showingResultsForRenderer");
72-
if (!showingResultsForRenderer.has("correctedQuery")) {
70+
.getObject("didYouMeanRenderer");
71+
if (didYouMeanRenderer == null) {
7372
return "";
7473
}
75-
return getTextFromObject(showingResultsForRenderer.getObject("correctedQuery"));
74+
return JsonUtils.getString(didYouMeanRenderer, "correctedQueryEndpoint.searchEndpoint.query");
75+
}
76+
77+
@Override
78+
public boolean isCorrectedSearch() {
79+
final JsonObject showingResultsForRenderer = initialData.getObject("contents")
80+
.getObject("twoColumnSearchResultsRenderer").getObject("primaryContents")
81+
.getObject("sectionListRenderer").getArray("contents").getObject(0)
82+
.getObject("itemSectionRenderer").getArray("contents").getObject(0)
83+
.getObject("showingResultsForRenderer");
84+
return showingResultsForRenderer != null;
7685
}
7786

7887
@Nonnull

extractor/src/test/java/org/schabi/newpipe/extractor/services/BaseSearchExtractorTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@
44
public interface BaseSearchExtractorTest extends BaseListExtractorTest {
55
void testSearchString() throws Exception;
66
void testSearchSuggestion() throws Exception;
7+
void testSearchCorrected() throws Exception;
78
}

extractor/src/test/java/org/schabi/newpipe/extractor/services/DefaultSearchExtractorTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ public abstract class DefaultSearchExtractorTest extends DefaultListExtractorTes
1515
public abstract String expectedSearchString();
1616
@Nullable public abstract String expectedSearchSuggestion();
1717

18+
public boolean isCorrectedSearch() {
19+
return false;
20+
}
21+
1822
@Test
1923
@Override
2024
public void testSearchString() throws Exception {
@@ -31,4 +35,9 @@ public void testSearchSuggestion() throws Exception {
3135
assertEquals(expectedSearchSuggestion, extractor().getSearchSuggestion());
3236
}
3337
}
38+
39+
@Test
40+
public void testSearchCorrected() throws Exception {
41+
assertEquals(isCorrectedSearch(), extractor().isCorrectedSearch());
42+
}
3443
}

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,4 +150,27 @@ public static void setUp() throws Exception {
150150
@Nullable @Override public String expectedSearchSuggestion() { return "mega man x3"; }
151151
@Override public InfoItem.InfoType expectedInfoItemType() { return InfoItem.InfoType.STREAM; }
152152
}
153+
154+
public static class CorrectedSearch extends DefaultSearchExtractorTest {
155+
private static SearchExtractor extractor;
156+
private static final String QUERY = "duo lipa";
157+
158+
@BeforeClass
159+
public static void setUp() throws Exception {
160+
NewPipe.init(DownloaderTestImpl.getInstance());
161+
extractor = YouTube.getSearchExtractor(QUERY, singletonList(YoutubeSearchQueryHandlerFactory.MUSIC_SONGS), "");
162+
extractor.fetchPage();
163+
}
164+
165+
@Override public SearchExtractor extractor() { return extractor; }
166+
@Override public StreamingService expectedService() { return YouTube; }
167+
@Override public String expectedName() { return QUERY; }
168+
@Override public String expectedId() { return QUERY; }
169+
@Override public String expectedUrlContains() { return "music.youtube.com/search?q=" + URLEncoder.encode(QUERY); }
170+
@Override public String expectedOriginalUrlContains() { return "music.youtube.com/search?q=" + URLEncoder.encode(QUERY); }
171+
@Override public String expectedSearchString() { return QUERY; }
172+
@Nullable @Override public String expectedSearchSuggestion() { return null; }
173+
@Override public InfoItem.InfoType expectedInfoItemType() { return InfoItem.InfoType.STREAM; }
174+
@Override public boolean isCorrectedSearch() { return true; }
175+
}
153176
}

0 commit comments

Comments
 (0)