2020-03-21 07:13:11 +01:00
|
|
|
package org.schabi.newpipe.extractor.services.youtube.search;
|
|
|
|
|
|
|
|
import org.junit.BeforeClass;
|
2021-07-05 19:22:25 +02:00
|
|
|
import org.junit.Ignore;
|
2020-03-21 07:13:11 +01:00
|
|
|
import org.junit.Test;
|
2021-01-17 18:55:37 +01:00
|
|
|
import org.schabi.newpipe.downloader.DownloaderFactory;
|
|
|
|
import org.schabi.newpipe.extractor.InfoItem;
|
|
|
|
import org.schabi.newpipe.extractor.ListExtractor;
|
|
|
|
import org.schabi.newpipe.extractor.MetaInfo;
|
|
|
|
import org.schabi.newpipe.extractor.NewPipe;
|
|
|
|
import org.schabi.newpipe.extractor.StreamingService;
|
2020-03-21 07:13:11 +01:00
|
|
|
import org.schabi.newpipe.extractor.search.SearchExtractor;
|
|
|
|
import org.schabi.newpipe.extractor.services.DefaultSearchExtractorTest;
|
2021-01-17 18:55:37 +01:00
|
|
|
import org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper;
|
2020-12-20 19:54:12 +01:00
|
|
|
import org.schabi.newpipe.extractor.stream.Description;
|
2020-03-21 07:13:11 +01:00
|
|
|
|
2021-01-22 01:44:58 +01:00
|
|
|
import org.schabi.newpipe.extractor.channel.ChannelInfoItem;
|
|
|
|
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
|
|
|
|
|
|
|
import javax.annotation.Nullable;
|
|
|
|
|
|
|
|
import java.io.IOException;
|
2020-12-20 19:54:12 +01:00
|
|
|
import java.net.MalformedURLException;
|
|
|
|
import java.net.URL;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Collections;
|
|
|
|
import java.util.List;
|
2021-04-08 16:36:55 +02:00
|
|
|
import java.util.Random;
|
2020-12-20 19:54:12 +01:00
|
|
|
|
2020-03-21 07:13:11 +01:00
|
|
|
import static java.util.Collections.singletonList;
|
|
|
|
import static junit.framework.TestCase.assertFalse;
|
|
|
|
import static org.junit.Assert.assertEquals;
|
|
|
|
import static org.junit.Assert.assertTrue;
|
|
|
|
import static org.schabi.newpipe.extractor.ExtractorAsserts.assertEmptyErrors;
|
|
|
|
import static org.schabi.newpipe.extractor.ServiceList.YouTube;
|
|
|
|
import static org.schabi.newpipe.extractor.services.DefaultTests.assertNoDuplicatedItems;
|
2020-04-15 14:09:46 +02:00
|
|
|
import static org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeSearchQueryHandlerFactory.CHANNELS;
|
|
|
|
import static org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeSearchQueryHandlerFactory.PLAYLISTS;
|
|
|
|
import static org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeSearchQueryHandlerFactory.VIDEOS;
|
2020-03-21 07:13:11 +01:00
|
|
|
|
|
|
|
public class YoutubeSearchExtractorTest {
|
2021-01-17 18:55:37 +01:00
|
|
|
|
|
|
|
private static final String RESOURCE_PATH = DownloaderFactory.RESOURCE_PATH + "services/youtube/extractor/search/";
|
|
|
|
|
2020-03-21 07:13:11 +01:00
|
|
|
public static class All extends DefaultSearchExtractorTest {
|
|
|
|
private static SearchExtractor extractor;
|
|
|
|
private static final String QUERY = "test";
|
|
|
|
|
|
|
|
@BeforeClass
|
|
|
|
public static void setUp() throws Exception {
|
2021-01-17 18:55:37 +01:00
|
|
|
YoutubeParsingHelper.resetClientVersionAndKey();
|
2021-04-08 16:36:55 +02:00
|
|
|
YoutubeParsingHelper.setNumberGenerator(new Random(1));
|
2021-01-17 18:55:37 +01:00
|
|
|
NewPipe.init(new DownloaderFactory().getDownloader(RESOURCE_PATH + "all"));
|
2020-03-21 07:13:11 +01:00
|
|
|
extractor = YouTube.getSearchExtractor(QUERY);
|
|
|
|
extractor.fetchPage();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override public SearchExtractor extractor() { return extractor; }
|
|
|
|
@Override public StreamingService expectedService() { return YouTube; }
|
|
|
|
@Override public String expectedName() { return QUERY; }
|
|
|
|
@Override public String expectedId() { return QUERY; }
|
|
|
|
@Override public String expectedUrlContains() { return "youtube.com/results?search_query=" + QUERY; }
|
|
|
|
@Override public String expectedOriginalUrlContains() { return "youtube.com/results?search_query=" + QUERY; }
|
|
|
|
@Override public String expectedSearchString() { return QUERY; }
|
|
|
|
@Nullable @Override public String expectedSearchSuggestion() { return null; }
|
|
|
|
}
|
|
|
|
|
|
|
|
public static class Channel extends DefaultSearchExtractorTest {
|
|
|
|
private static SearchExtractor extractor;
|
|
|
|
private static final String QUERY = "test";
|
|
|
|
|
|
|
|
@BeforeClass
|
|
|
|
public static void setUp() throws Exception {
|
2021-01-17 18:55:37 +01:00
|
|
|
YoutubeParsingHelper.resetClientVersionAndKey();
|
2021-04-08 16:36:55 +02:00
|
|
|
YoutubeParsingHelper.setNumberGenerator(new Random(1));
|
2021-01-17 18:55:37 +01:00
|
|
|
NewPipe.init(new DownloaderFactory().getDownloader(RESOURCE_PATH + "channel"));
|
2020-03-21 07:13:11 +01:00
|
|
|
extractor = YouTube.getSearchExtractor(QUERY, singletonList(CHANNELS), "");
|
|
|
|
extractor.fetchPage();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override public SearchExtractor extractor() { return extractor; }
|
|
|
|
@Override public StreamingService expectedService() { return YouTube; }
|
|
|
|
@Override public String expectedName() { return QUERY; }
|
|
|
|
@Override public String expectedId() { return QUERY; }
|
|
|
|
@Override public String expectedUrlContains() { return "youtube.com/results?search_query=" + QUERY; }
|
|
|
|
@Override public String expectedOriginalUrlContains() { return "youtube.com/results?search_query=" + QUERY; }
|
|
|
|
@Override public String expectedSearchString() { return QUERY; }
|
|
|
|
@Nullable @Override public String expectedSearchSuggestion() { return null; }
|
|
|
|
|
|
|
|
@Override public InfoItem.InfoType expectedInfoItemType() { return InfoItem.InfoType.CHANNEL; }
|
|
|
|
}
|
|
|
|
|
|
|
|
public static class Playlists extends DefaultSearchExtractorTest {
|
|
|
|
private static SearchExtractor extractor;
|
|
|
|
private static final String QUERY = "test";
|
|
|
|
|
|
|
|
@BeforeClass
|
|
|
|
public static void setUp() throws Exception {
|
2021-01-17 18:55:37 +01:00
|
|
|
YoutubeParsingHelper.resetClientVersionAndKey();
|
2021-04-08 16:36:55 +02:00
|
|
|
YoutubeParsingHelper.setNumberGenerator(new Random(1));
|
2021-01-17 18:55:37 +01:00
|
|
|
NewPipe.init(new DownloaderFactory().getDownloader(RESOURCE_PATH + "playlist"));
|
2020-03-21 07:13:11 +01:00
|
|
|
extractor = YouTube.getSearchExtractor(QUERY, singletonList(PLAYLISTS), "");
|
|
|
|
extractor.fetchPage();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override public SearchExtractor extractor() { return extractor; }
|
|
|
|
@Override public StreamingService expectedService() { return YouTube; }
|
|
|
|
@Override public String expectedName() { return QUERY; }
|
|
|
|
@Override public String expectedId() { return QUERY; }
|
|
|
|
@Override public String expectedUrlContains() { return "youtube.com/results?search_query=" + QUERY; }
|
|
|
|
@Override public String expectedOriginalUrlContains() { return "youtube.com/results?search_query=" + QUERY; }
|
|
|
|
@Override public String expectedSearchString() { return QUERY; }
|
|
|
|
@Nullable @Override public String expectedSearchSuggestion() { return null; }
|
|
|
|
|
|
|
|
@Override public InfoItem.InfoType expectedInfoItemType() { return InfoItem.InfoType.PLAYLIST; }
|
|
|
|
}
|
|
|
|
|
|
|
|
public static class Videos extends DefaultSearchExtractorTest {
|
|
|
|
private static SearchExtractor extractor;
|
|
|
|
private static final String QUERY = "test";
|
|
|
|
|
|
|
|
@BeforeClass
|
|
|
|
public static void setUp() throws Exception {
|
2021-01-17 18:55:37 +01:00
|
|
|
YoutubeParsingHelper.resetClientVersionAndKey();
|
2021-04-08 16:36:55 +02:00
|
|
|
YoutubeParsingHelper.setNumberGenerator(new Random(1));
|
2021-01-17 18:55:37 +01:00
|
|
|
NewPipe.init(new DownloaderFactory().getDownloader(RESOURCE_PATH + "videos"));
|
2020-03-21 07:13:11 +01:00
|
|
|
extractor = YouTube.getSearchExtractor(QUERY, singletonList(VIDEOS), "");
|
|
|
|
extractor.fetchPage();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override public SearchExtractor extractor() { return extractor; }
|
|
|
|
@Override public StreamingService expectedService() { return YouTube; }
|
|
|
|
@Override public String expectedName() { return QUERY; }
|
|
|
|
@Override public String expectedId() { return QUERY; }
|
|
|
|
@Override public String expectedUrlContains() { return "youtube.com/results?search_query=" + QUERY; }
|
|
|
|
@Override public String expectedOriginalUrlContains() { return "youtube.com/results?search_query=" + QUERY; }
|
|
|
|
@Override public String expectedSearchString() { return QUERY; }
|
|
|
|
@Nullable @Override public String expectedSearchSuggestion() { return null; }
|
|
|
|
|
|
|
|
@Override public InfoItem.InfoType expectedInfoItemType() { return InfoItem.InfoType.STREAM; }
|
|
|
|
}
|
|
|
|
|
|
|
|
public static class Suggestion extends DefaultSearchExtractorTest {
|
|
|
|
private static SearchExtractor extractor;
|
2020-04-11 19:18:08 +02:00
|
|
|
private static final String QUERY = "newpip";
|
|
|
|
private static final String EXPECTED_SUGGESTION = "newpipe";
|
2020-03-21 07:13:11 +01:00
|
|
|
|
|
|
|
@BeforeClass
|
|
|
|
public static void setUp() throws Exception {
|
2021-01-17 18:55:37 +01:00
|
|
|
YoutubeParsingHelper.resetClientVersionAndKey();
|
2021-04-08 16:36:55 +02:00
|
|
|
YoutubeParsingHelper.setNumberGenerator(new Random(1));
|
2021-01-17 18:55:37 +01:00
|
|
|
NewPipe.init(new DownloaderFactory().getDownloader(RESOURCE_PATH + "suggestions"));
|
2020-03-21 07:13:11 +01:00
|
|
|
extractor = YouTube.getSearchExtractor(QUERY, singletonList(VIDEOS), "");
|
|
|
|
extractor.fetchPage();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override public SearchExtractor extractor() { return extractor; }
|
|
|
|
@Override public StreamingService expectedService() { return YouTube; }
|
|
|
|
@Override public String expectedName() { return QUERY; }
|
|
|
|
@Override public String expectedId() { return QUERY; }
|
|
|
|
@Override public String expectedUrlContains() { return "youtube.com/results?search_query=" + QUERY; }
|
|
|
|
@Override public String expectedOriginalUrlContains() { return "youtube.com/results?search_query=" + QUERY; }
|
|
|
|
@Override public String expectedSearchString() { return QUERY; }
|
|
|
|
@Nullable @Override public String expectedSearchSuggestion() { return EXPECTED_SUGGESTION; }
|
2020-04-11 19:18:08 +02:00
|
|
|
@Override public InfoItem.InfoType expectedInfoItemType() { return InfoItem.InfoType.STREAM; }
|
|
|
|
}
|
|
|
|
|
|
|
|
public static class CorrectedSearch extends DefaultSearchExtractorTest {
|
2020-03-21 07:13:11 +01:00
|
|
|
private static SearchExtractor extractor;
|
|
|
|
private static final String QUERY = "pewdeipie";
|
|
|
|
private static final String EXPECTED_SUGGESTION = "pewdiepie";
|
|
|
|
|
|
|
|
@BeforeClass
|
|
|
|
public static void setUp() throws Exception {
|
2021-01-17 18:55:37 +01:00
|
|
|
YoutubeParsingHelper.resetClientVersionAndKey();
|
2021-04-08 16:36:55 +02:00
|
|
|
YoutubeParsingHelper.setNumberGenerator(new Random(1));
|
2021-01-17 18:55:37 +01:00
|
|
|
NewPipe.init(new DownloaderFactory().getDownloader(RESOURCE_PATH + "corrected"));
|
2020-03-21 07:13:11 +01:00
|
|
|
extractor = YouTube.getSearchExtractor(QUERY, singletonList(VIDEOS), "");
|
|
|
|
extractor.fetchPage();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override public SearchExtractor extractor() { return extractor; }
|
|
|
|
@Override public StreamingService expectedService() { return YouTube; }
|
|
|
|
@Override public String expectedName() { return QUERY; }
|
|
|
|
@Override public String expectedId() { return QUERY; }
|
|
|
|
@Override public String expectedUrlContains() { return "youtube.com/results?search_query=" + QUERY; }
|
|
|
|
@Override public String expectedOriginalUrlContains() { return "youtube.com/results?search_query=" + QUERY; }
|
|
|
|
@Override public String expectedSearchString() { return QUERY; }
|
|
|
|
@Nullable @Override public String expectedSearchSuggestion() { return EXPECTED_SUGGESTION; }
|
|
|
|
@Override public InfoItem.InfoType expectedInfoItemType() { return InfoItem.InfoType.STREAM; }
|
2020-04-11 19:18:08 +02:00
|
|
|
@Override public boolean isCorrectedSearch() { return true; }
|
2020-03-21 07:13:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public static class RandomQueryNoMorePages extends DefaultSearchExtractorTest {
|
|
|
|
private static SearchExtractor extractor;
|
|
|
|
private static final String QUERY = "UCO6AK";
|
|
|
|
|
|
|
|
@BeforeClass
|
|
|
|
public static void setUp() throws Exception {
|
2021-01-17 18:55:37 +01:00
|
|
|
YoutubeParsingHelper.resetClientVersionAndKey();
|
2021-04-08 16:36:55 +02:00
|
|
|
YoutubeParsingHelper.setNumberGenerator(new Random(1));
|
2021-01-17 18:55:37 +01:00
|
|
|
NewPipe.init(new DownloaderFactory().getDownloader(RESOURCE_PATH + "random"));
|
2020-03-21 07:13:11 +01:00
|
|
|
extractor = YouTube.getSearchExtractor(QUERY);
|
|
|
|
extractor.fetchPage();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override public SearchExtractor extractor() { return extractor; }
|
|
|
|
@Override public StreamingService expectedService() { return YouTube; }
|
|
|
|
@Override public String expectedName() { return QUERY; }
|
|
|
|
@Override public String expectedId() { return QUERY; }
|
|
|
|
@Override public String expectedUrlContains() { return "youtube.com/results?search_query=" + QUERY; }
|
|
|
|
@Override public String expectedOriginalUrlContains() { return "youtube.com/results?search_query=" + QUERY; }
|
|
|
|
@Override public String expectedSearchString() { return QUERY; }
|
|
|
|
@Nullable @Override public String expectedSearchSuggestion() { return null; }
|
|
|
|
|
|
|
|
/*//////////////////////////////////////////////////////////////////////////
|
|
|
|
// Test Overrides
|
|
|
|
//////////////////////////////////////////////////////////////////////////*/
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void testMoreRelatedItems() throws Exception {
|
2020-04-10 10:25:53 +02:00
|
|
|
final ListExtractor.InfoItemsPage<InfoItem> initialPage = extractor().getInitialPage();
|
2020-03-21 07:13:11 +01:00
|
|
|
// YouTube actually gives us an empty next page, but after that, no more pages.
|
2020-04-10 10:25:53 +02:00
|
|
|
assertTrue(initialPage.hasNextPage());
|
2020-04-15 14:09:46 +02:00
|
|
|
final ListExtractor.InfoItemsPage<InfoItem> nextEmptyPage = extractor.getPage(initialPage.getNextPage());
|
2020-03-21 07:13:11 +01:00
|
|
|
assertEquals(0, nextEmptyPage.getItems().size());
|
|
|
|
assertEmptyErrors("Empty page has errors", nextEmptyPage.getErrors());
|
|
|
|
|
|
|
|
assertFalse("More items available when it shouldn't", nextEmptyPage.hasNextPage());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static class PagingTest {
|
|
|
|
@Test
|
|
|
|
public void duplicatedItemsCheck() throws Exception {
|
2021-01-17 18:55:37 +01:00
|
|
|
YoutubeParsingHelper.resetClientVersionAndKey();
|
2021-04-08 16:36:55 +02:00
|
|
|
YoutubeParsingHelper.setNumberGenerator(new Random(1));
|
2021-01-17 18:55:37 +01:00
|
|
|
NewPipe.init(new DownloaderFactory().getDownloader(RESOURCE_PATH + "paging"));
|
2020-03-21 07:13:11 +01:00
|
|
|
final SearchExtractor extractor = YouTube.getSearchExtractor("cirque du soleil", singletonList(VIDEOS), "");
|
|
|
|
extractor.fetchPage();
|
|
|
|
|
|
|
|
final ListExtractor.InfoItemsPage<InfoItem> page1 = extractor.getInitialPage();
|
2020-04-15 14:09:46 +02:00
|
|
|
final ListExtractor.InfoItemsPage<InfoItem> page2 = extractor.getPage(page1.getNextPage());
|
2020-03-21 07:13:11 +01:00
|
|
|
|
|
|
|
assertNoDuplicatedItems(YouTube, page1, page2);
|
|
|
|
}
|
|
|
|
}
|
2020-12-20 19:54:12 +01:00
|
|
|
|
|
|
|
public static class MetaInfoTest extends DefaultSearchExtractorTest {
|
|
|
|
private static SearchExtractor extractor;
|
|
|
|
private static final String QUERY = "Covid";
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void clarificationTest() throws Exception {
|
2021-01-17 18:55:37 +01:00
|
|
|
YoutubeParsingHelper.resetClientVersionAndKey();
|
2021-04-08 16:36:55 +02:00
|
|
|
YoutubeParsingHelper.setNumberGenerator(new Random(1));
|
2021-01-17 18:55:37 +01:00
|
|
|
NewPipe.init(new DownloaderFactory().getDownloader(RESOURCE_PATH + "metaInfo"));
|
2020-12-20 19:54:12 +01:00
|
|
|
extractor = YouTube.getSearchExtractor(QUERY, singletonList(VIDEOS), "");
|
|
|
|
extractor.fetchPage();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override public String expectedSearchString() { return QUERY; }
|
|
|
|
@Override public String expectedSearchSuggestion() { return null; }
|
|
|
|
@Override public List<MetaInfo> expectedMetaInfo() throws MalformedURLException {
|
|
|
|
final List<URL> urls = new ArrayList<>();
|
|
|
|
urls.add(new URL("https://www.who.int/emergencies/diseases/novel-coronavirus-2019"));
|
|
|
|
final List<String> urlTexts = new ArrayList<>();
|
|
|
|
urlTexts.add("LEARN MORE");
|
|
|
|
return Collections.singletonList(new MetaInfo(
|
|
|
|
"COVID-19",
|
|
|
|
new Description("Get the latest information from the WHO about coronavirus.", Description.PLAIN_TEXT),
|
|
|
|
urls,
|
|
|
|
urlTexts
|
|
|
|
));
|
|
|
|
}
|
2021-07-05 19:22:25 +02:00
|
|
|
// testMoreRelatedItems is broken because a video has no duration shown
|
|
|
|
@Override public void testMoreRelatedItems() { }
|
2020-12-20 19:54:12 +01:00
|
|
|
@Override public SearchExtractor extractor() { return extractor; }
|
|
|
|
@Override public StreamingService expectedService() { return YouTube; }
|
|
|
|
@Override public String expectedName() { return QUERY; }
|
|
|
|
@Override public String expectedId() { return QUERY; }
|
|
|
|
@Override public String expectedUrlContains() { return "youtube.com/results?search_query=" + QUERY; }
|
|
|
|
@Override public String expectedOriginalUrlContains() throws Exception { return "youtube.com/results?search_query=" + QUERY; }
|
|
|
|
}
|
2021-01-22 01:44:58 +01:00
|
|
|
|
|
|
|
public static class ChannelVerified extends DefaultSearchExtractorTest {
|
|
|
|
private static SearchExtractor extractor;
|
|
|
|
private static final String QUERY = "bbc";
|
|
|
|
|
|
|
|
@BeforeClass
|
|
|
|
public static void setUp() throws Exception {
|
2021-02-20 11:31:12 +01:00
|
|
|
YoutubeParsingHelper.resetClientVersionAndKey();
|
2021-04-08 16:36:55 +02:00
|
|
|
YoutubeParsingHelper.setNumberGenerator(new Random(1));
|
2021-02-20 11:31:12 +01:00
|
|
|
NewPipe.init(new DownloaderFactory().getDownloader(RESOURCE_PATH + "verified"));
|
2021-01-22 01:44:58 +01:00
|
|
|
extractor = YouTube.getSearchExtractor(QUERY, singletonList(CHANNELS), "");
|
|
|
|
extractor.fetchPage();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override public SearchExtractor extractor() { return extractor; }
|
|
|
|
@Override public StreamingService expectedService() { return YouTube; }
|
|
|
|
@Override public String expectedName() { return QUERY; }
|
|
|
|
@Override public String expectedId() { return QUERY; }
|
|
|
|
@Override public String expectedUrlContains() { return "youtube.com/results?search_query=" + QUERY; }
|
|
|
|
@Override public String expectedOriginalUrlContains() { return "youtube.com/results?search_query=" + QUERY; }
|
|
|
|
@Override public String expectedSearchString() { return QUERY; }
|
|
|
|
@Nullable @Override public String expectedSearchSuggestion() { return null; }
|
|
|
|
@Override public InfoItem.InfoType expectedInfoItemType() { return InfoItem.InfoType.CHANNEL; }
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void testAtLeastOneVerified() throws IOException, ExtractionException {
|
|
|
|
final List<InfoItem> items = extractor.getInitialPage().getItems();
|
|
|
|
boolean verified = false;
|
|
|
|
for (InfoItem item : items) {
|
|
|
|
if (((ChannelInfoItem) item).isVerified()) {
|
|
|
|
verified = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
assertTrue(verified);
|
|
|
|
}
|
|
|
|
}
|
2020-03-21 07:13:11 +01:00
|
|
|
}
|