|
| 1 | +package org.schabi.newpipe.extractor.services.youtube.stream; |
| 2 | + |
| 3 | +import static org.junit.jupiter.api.Assertions.assertEquals; |
| 4 | +import static org.junit.jupiter.api.Assertions.assertNotEquals; |
| 5 | +import static org.junit.jupiter.api.Assertions.assertSame; |
| 6 | +import static org.schabi.newpipe.extractor.ExtractorAsserts.assertContains; |
| 7 | +import static org.schabi.newpipe.extractor.ExtractorAsserts.assertIsSecureUrl; |
| 8 | +import static org.schabi.newpipe.extractor.ServiceList.YouTube; |
| 9 | +import static org.schabi.newpipe.extractor.services.youtube.stream.YoutubeStreamExtractorDefaultTest.YOUTUBE_LICENCE; |
| 10 | + |
| 11 | +import org.junit.jupiter.api.BeforeAll; |
| 12 | +import org.junit.jupiter.api.Test; |
| 13 | +import org.schabi.newpipe.downloader.DownloaderFactory; |
| 14 | +import org.schabi.newpipe.extractor.InfoItem; |
| 15 | +import org.schabi.newpipe.extractor.NewPipe; |
| 16 | +import org.schabi.newpipe.extractor.StreamingService; |
| 17 | +import org.schabi.newpipe.extractor.playlist.PlaylistInfo.PlaylistType; |
| 18 | +import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem; |
| 19 | +import org.schabi.newpipe.extractor.services.DefaultStreamExtractorTest; |
| 20 | +import org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper; |
| 21 | +import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor; |
| 22 | +import org.schabi.newpipe.extractor.stream.StreamExtractor; |
| 23 | +import org.schabi.newpipe.extractor.stream.StreamType; |
| 24 | + |
| 25 | +import java.util.Arrays; |
| 26 | +import java.util.List; |
| 27 | +import java.util.Objects; |
| 28 | +import java.util.Random; |
| 29 | +import java.util.stream.Collectors; |
| 30 | + |
| 31 | +import javax.annotation.Nullable; |
| 32 | + |
| 33 | +public class YoutubeStreamExtractorRelatedMixTest extends DefaultStreamExtractorTest { |
| 34 | + private static final String RESOURCE_PATH = DownloaderFactory.RESOURCE_PATH + "services/youtube/extractor/stream/"; |
| 35 | + static final String ID = "K4DyBUG242c"; |
| 36 | + static final String URL = YoutubeStreamExtractorDefaultTest.BASE_URL + ID; |
| 37 | + static final String TITLE = "Cartoon - On & On (feat. Daniel Levi) [NCS Release]"; |
| 38 | + private static StreamExtractor extractor; |
| 39 | + |
| 40 | + @BeforeAll |
| 41 | + public static void setUp() throws Exception { |
| 42 | + YoutubeParsingHelper.resetClientVersionAndKey(); |
| 43 | + YoutubeParsingHelper.setNumberGenerator(new Random(1)); |
| 44 | + YoutubeStreamExtractor.resetDeobfuscationCode(); |
| 45 | + NewPipe.init(new DownloaderFactory().getDownloader(RESOURCE_PATH + "relatedMix")); |
| 46 | + extractor = YouTube.getStreamExtractor(URL); |
| 47 | + extractor.fetchPage(); |
| 48 | + } |
| 49 | + |
| 50 | + // @formatter:off |
| 51 | + @Override public StreamExtractor extractor() { return extractor; } |
| 52 | + @Override public StreamingService expectedService() { return YouTube; } |
| 53 | + @Override public String expectedName() { return TITLE; } |
| 54 | + @Override public String expectedId() { return ID; } |
| 55 | + @Override public String expectedUrlContains() { return URL; } |
| 56 | + @Override public String expectedOriginalUrlContains() { return URL; } |
| 57 | + |
| 58 | + @Override public StreamType expectedStreamType() { return StreamType.VIDEO_STREAM; } |
| 59 | + @Override public String expectedUploaderName() { return "NoCopyrightSounds"; } |
| 60 | + @Override public String expectedUploaderUrl() { return "https://www.youtube.com/channel/UC_aEa8K-EOJ3D6gOs7HcyNg"; } |
| 61 | + @Override public List<String> expectedDescriptionContains() { |
| 62 | + return Arrays.asList("https://www.youtube.com/user/danielleviband/", "©"); |
| 63 | + } |
| 64 | + @Override public boolean expectedUploaderVerified() { return true; } |
| 65 | + @Override public long expectedLength() { return 208; } |
| 66 | + @Override public long expectedTimestamp() { return 0; } |
| 67 | + @Override public long expectedViewCountAtLeast() { return 449_000_000; } |
| 68 | + @Nullable @Override public String expectedUploadDate() { return "2015-07-09 00:00:00.000"; } |
| 69 | + @Nullable @Override public String expectedTextualUploadDate() { return "2015-07-09"; } |
| 70 | + @Override public long expectedLikeCountAtLeast() { return 6_400_000; } |
| 71 | + @Override public long expectedDislikeCountAtLeast() { return -1; } |
| 72 | + @Override public boolean expectedHasSubtitles() { return true; } |
| 73 | + @Override public int expectedStreamSegmentsCount() { return 0; } |
| 74 | + @Override public String expectedLicence() { return YOUTUBE_LICENCE; } |
| 75 | + @Override public String expectedCategory() { return "Music"; } |
| 76 | + @Override public List<String> expectedTags() { |
| 77 | + return Arrays.asList("Cartoon", "Cartoon - On & On", "Cartoon Baboon", |
| 78 | + "Cartoon NCS Release", "Cartoon On & On (feat. Daniel Levi)", "Cartoon best songs", |
| 79 | + "Copyright Free Music", "Daniel Levi", "NCS", "NCS Best Songs", |
| 80 | + "NCS Cartoon Daniel Levi", "NCS Cartoon On & On", "NCS On & On", "NCS On and On", |
| 81 | + "NCS Release", "NCS Release Daniel Levi", "NCS release Cartoon", "Official", |
| 82 | + "On & On", "On & On NCS", "On and on", "Royalty Free Cartoon", "Royalty Free Music", |
| 83 | + "electronic", "no copyright sounds", "nocopyrightsounds", "on & on lyrics", |
| 84 | + "on and on lyrics"); |
| 85 | + } |
| 86 | + // @formatter:on |
| 87 | + |
| 88 | + @Test |
| 89 | + @Override |
| 90 | + public void testRelatedItems() throws Exception { |
| 91 | + super.testRelatedItems(); |
| 92 | + |
| 93 | + final List<PlaylistInfoItem> playlists = Objects.requireNonNull(extractor.getRelatedItems()) |
| 94 | + .getItems() |
| 95 | + .stream() |
| 96 | + .filter(PlaylistInfoItem.class::isInstance) |
| 97 | + .map(PlaylistInfoItem.class::cast) |
| 98 | + .collect(Collectors.toList()); |
| 99 | + playlists.forEach(item -> assertNotEquals(PlaylistType.NORMAL, item.getPlaylistType(), |
| 100 | + "Unexpected normal playlist in related items")); |
| 101 | + |
| 102 | + final List<PlaylistInfoItem> streamMixes = playlists.stream() |
| 103 | + .filter(item -> item.getPlaylistType().equals(PlaylistType.MIX_STREAM)) |
| 104 | + .collect(Collectors.toList()); |
| 105 | + assertEquals(1, streamMixes.size(), "Not found exactly one stream mix in related items"); |
| 106 | + |
| 107 | + final PlaylistInfoItem streamMix = streamMixes.get(0); |
| 108 | + assertSame(InfoItem.InfoType.PLAYLIST, streamMix.getInfoType()); |
| 109 | + assertEquals(YouTube.getServiceId(), streamMix.getServiceId()); |
| 110 | + assertContains(URL, streamMix.getUrl()); |
| 111 | + assertContains("list=RD" + ID, streamMix.getUrl()); |
| 112 | + assertEquals("Mix – " + TITLE, streamMix.getName()); |
| 113 | + assertIsSecureUrl(streamMix.getThumbnailUrl()); |
| 114 | + } |
| 115 | +} |
0 commit comments