Skip to content

Commit 1c0a5db

Browse files
authored
Merge pull request #215 from gzsombor/fix-search-paging
Fix search result paging
2 parents 0a3422a + 0b6e37e commit 1c0a5db

4 files changed

Lines changed: 74 additions & 0 deletions

File tree

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public String getSearchSuggestion() throws ParsingException {
4848
@Override
4949
public InfoItemsPage<InfoItem> getInitialPage() throws IOException, ExtractionException {
5050
InfoItemsSearchCollector searchItems = getInfoItemSearchCollector();
51+
searchItems.reset();
5152

5253
if(getLinkHandler().getContentFilters().contains(CONFERENCES)
5354
|| getLinkHandler().getContentFilters().contains(ALL)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ public void onFetchPage(@Nonnull Downloader downloader) throws IOException, Extr
7676

7777
private InfoItemsCollector<InfoItem, InfoItemExtractor> collectItems(JsonArray searchCollection) {
7878
final InfoItemsSearchCollector collector = getInfoItemSearchCollector();
79+
collector.reset();
7980

8081
for (Object result : searchCollection) {
8182
if (!(result instanceof JsonObject)) continue;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ private String getNextPageUrlFromCurrentUrl(String currentUrl)
106106

107107
private InfoItemsSearchCollector collectItems(Document doc) throws NothingFoundException {
108108
InfoItemsSearchCollector collector = getInfoItemSearchCollector();
109+
collector.reset();
109110

110111
Element list = doc.select("ol[class=\"item-section\"]").first();
111112
final TimeAgoParser timeAgoParser = getTimeAgoParser();
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package org.schabi.newpipe.extractor.services.youtube.search;
2+
3+
import static java.util.Collections.singletonList;
4+
import static org.junit.Assert.assertEquals;
5+
import static org.junit.Assert.assertNotNull;
6+
import static org.junit.Assert.assertTrue;
7+
import static org.schabi.newpipe.extractor.ServiceList.YouTube;
8+
9+
import java.util.HashSet;
10+
import java.util.List;
11+
import java.util.Set;
12+
13+
import org.junit.BeforeClass;
14+
import org.junit.Test;
15+
import org.schabi.newpipe.DownloaderTestImpl;
16+
import org.schabi.newpipe.extractor.InfoItem;
17+
import org.schabi.newpipe.extractor.ListExtractor;
18+
import org.schabi.newpipe.extractor.NewPipe;
19+
import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeSearchExtractor;
20+
import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeSearchQueryHandlerFactory;
21+
22+
public class YoutubeSearchPagingTest {
23+
private static ListExtractor.InfoItemsPage<InfoItem> page1;
24+
private static ListExtractor.InfoItemsPage<InfoItem> page2;
25+
private static Set<String> urlList1;
26+
private static Set<String> urlList2;
27+
private static int page1Size;
28+
private static int page2Size;
29+
30+
@BeforeClass
31+
public static void setUpClass() throws Exception {
32+
NewPipe.init(DownloaderTestImpl.getInstance());
33+
34+
YoutubeSearchExtractor extractor = (YoutubeSearchExtractor) YouTube.getSearchExtractor("cirque du soleil",
35+
singletonList(YoutubeSearchQueryHandlerFactory.VIDEOS), null);
36+
37+
extractor.fetchPage();
38+
page1 = extractor.getInitialPage();
39+
urlList1 = extractUrls(page1.getItems());
40+
assertTrue("failed to load search result page one: too few items", 15 < page1.getItems().size());
41+
page1Size = page1.getItems().size();
42+
assertEquals("duplicated items in search result on page one", page1Size, urlList1.size());
43+
44+
assertTrue("search result has no second page", page1.hasNextPage());
45+
assertNotNull("next page url is null", page1.getNextPageUrl());
46+
page2 = extractor.getPage(page1.getNextPageUrl());
47+
urlList2 = extractUrls(page2.getItems());
48+
page2Size = page2.getItems().size();
49+
}
50+
51+
private static Set<String> extractUrls(List<InfoItem> list) {
52+
Set<String> result = new HashSet<>();
53+
for (InfoItem item : list) {
54+
result.add(item.getUrl());
55+
}
56+
return result;
57+
}
58+
59+
@Test
60+
public void secondPageUniqueVideos() {
61+
assertEquals("Second search result page has duplicated items", page2Size, urlList2.size());
62+
}
63+
64+
@Test
65+
public void noRepeatingVideosInPages() {
66+
Set<String> intersection = new HashSet<>(urlList2);
67+
intersection.retainAll(urlList1);
68+
assertEquals("Found the same item on first AND second search page", 0, intersection.size());
69+
}
70+
71+
}

0 commit comments

Comments
 (0)