2022-02-06 19:24:40 +01:00
|
|
|
|
/*
|
|
|
|
|
* Created by Christian Schabesberger on 30.12.15.
|
|
|
|
|
*
|
|
|
|
|
* Copyright (C) Christian Schabesberger 2015 <chris.schabesberger@mailbox.org>
|
|
|
|
|
* YoutubeVideoExtractorDefault.java is part of NewPipe Extractor.
|
|
|
|
|
*
|
|
|
|
|
* NewPipe Extractor is free software: you can redistribute it and/or modify
|
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
* (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* NewPipe Extractor is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* along with NewPipe Extractor. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
|
*/
|
|
|
|
|
|
2019-09-12 14:36:42 +02:00
|
|
|
|
package org.schabi.newpipe.extractor.services.youtube.stream;
|
2017-08-05 10:03:56 +02:00
|
|
|
|
|
2022-02-07 21:23:38 +01:00
|
|
|
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
2022-12-16 18:12:52 +01:00
|
|
|
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
2022-02-07 21:23:38 +01:00
|
|
|
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
|
|
|
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
2022-11-14 00:10:44 +01:00
|
|
|
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
2022-02-07 21:23:38 +01:00
|
|
|
|
import static org.schabi.newpipe.extractor.ServiceList.YouTube;
|
|
|
|
|
|
2021-12-27 21:08:08 +01:00
|
|
|
|
import org.junit.jupiter.api.BeforeAll;
|
|
|
|
|
import org.junit.jupiter.api.Disabled;
|
|
|
|
|
import org.junit.jupiter.api.Test;
|
2021-01-17 18:55:37 +01:00
|
|
|
|
import org.schabi.newpipe.downloader.DownloaderFactory;
|
2020-02-09 11:59:23 +01:00
|
|
|
|
import org.schabi.newpipe.downloader.DownloaderTestImpl;
|
2020-12-20 19:54:12 +01:00
|
|
|
|
import org.schabi.newpipe.extractor.MetaInfo;
|
2017-08-05 10:03:56 +02:00
|
|
|
|
import org.schabi.newpipe.extractor.NewPipe;
|
2020-04-09 13:51:47 +02:00
|
|
|
|
import org.schabi.newpipe.extractor.StreamingService;
|
2020-03-01 02:00:33 +01:00
|
|
|
|
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
|
2021-02-20 14:53:57 +01:00
|
|
|
|
import org.schabi.newpipe.extractor.exceptions.GeographicRestrictionException;
|
|
|
|
|
import org.schabi.newpipe.extractor.exceptions.PaidContentException;
|
2017-08-05 10:03:56 +02:00
|
|
|
|
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
2021-02-20 14:53:57 +01:00
|
|
|
|
import org.schabi.newpipe.extractor.exceptions.PrivateContentException;
|
|
|
|
|
import org.schabi.newpipe.extractor.exceptions.YoutubeMusicPremiumContentException;
|
2020-04-09 13:51:47 +02:00
|
|
|
|
import org.schabi.newpipe.extractor.services.DefaultStreamExtractorTest;
|
2022-02-07 21:23:38 +01:00
|
|
|
|
import org.schabi.newpipe.extractor.services.youtube.YoutubeTestsUtils;
|
2020-02-09 11:59:23 +01:00
|
|
|
|
import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor;
|
2022-11-14 00:10:44 +01:00
|
|
|
|
import org.schabi.newpipe.extractor.stream.AudioStream;
|
2023-03-28 00:02:20 +02:00
|
|
|
|
import org.schabi.newpipe.extractor.stream.AudioTrackType;
|
2022-02-07 21:23:38 +01:00
|
|
|
|
import org.schabi.newpipe.extractor.stream.Description;
|
|
|
|
|
import org.schabi.newpipe.extractor.stream.StreamExtractor;
|
|
|
|
|
import org.schabi.newpipe.extractor.stream.StreamSegment;
|
|
|
|
|
import org.schabi.newpipe.extractor.stream.StreamType;
|
2023-01-31 19:16:14 +01:00
|
|
|
|
import org.schabi.newpipe.extractor.utils.LocaleCompat;
|
2017-08-05 10:03:56 +02:00
|
|
|
|
|
2021-01-17 18:55:37 +01:00
|
|
|
|
import java.io.IOException;
|
2020-12-20 19:54:12 +01:00
|
|
|
|
import java.net.MalformedURLException;
|
|
|
|
|
import java.net.URL;
|
2020-04-09 13:51:47 +02:00
|
|
|
|
import java.util.Arrays;
|
2020-12-20 19:54:12 +01:00
|
|
|
|
import java.util.Collections;
|
2019-09-10 18:38:51 +02:00
|
|
|
|
import java.util.List;
|
2023-01-31 19:16:14 +01:00
|
|
|
|
import java.util.Locale;
|
|
|
|
|
import java.util.Objects;
|
2017-08-06 22:20:15 +02:00
|
|
|
|
|
2021-02-17 20:26:23 +01:00
|
|
|
|
import javax.annotation.Nullable;
|
|
|
|
|
|
2017-08-05 10:03:56 +02:00
|
|
|
|
public class YoutubeStreamExtractorDefaultTest {
|
2021-01-17 18:55:37 +01:00
|
|
|
|
private static final String RESOURCE_PATH = DownloaderFactory.RESOURCE_PATH + "services/youtube/extractor/stream/";
|
2020-04-09 13:51:47 +02:00
|
|
|
|
static final String BASE_URL = "https://www.youtube.com/watch?v=";
|
2020-02-09 11:59:23 +01:00
|
|
|
|
public static final String YOUTUBE_LICENCE = "YouTube licence";
|
2017-08-05 10:03:56 +02:00
|
|
|
|
|
2020-03-01 02:00:33 +01:00
|
|
|
|
public static class NotAvailable {
|
2021-12-27 21:08:08 +01:00
|
|
|
|
@BeforeAll
|
2021-01-17 18:55:37 +01:00
|
|
|
|
public static void setUp() throws IOException {
|
2022-02-07 21:23:38 +01:00
|
|
|
|
YoutubeTestsUtils.ensureStateless();
|
2022-03-16 17:22:42 +01:00
|
|
|
|
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "notAvailable"));
|
2020-03-01 02:00:33 +01:00
|
|
|
|
}
|
|
|
|
|
|
2021-12-27 21:08:08 +01:00
|
|
|
|
@Test
|
|
|
|
|
void geoRestrictedContent() throws Exception {
|
2021-02-20 14:53:57 +01:00
|
|
|
|
final StreamExtractor extractor =
|
|
|
|
|
YouTube.getStreamExtractor(BASE_URL + "_PL2HJKxnOM");
|
2021-12-27 21:08:08 +01:00
|
|
|
|
assertThrows(GeographicRestrictionException.class, extractor::fetchPage);
|
2021-02-20 14:53:57 +01:00
|
|
|
|
}
|
|
|
|
|
|
2021-12-27 21:08:08 +01:00
|
|
|
|
@Test
|
|
|
|
|
void nonExistentFetch() throws Exception {
|
2020-03-01 02:00:33 +01:00
|
|
|
|
final StreamExtractor extractor =
|
2020-04-09 13:51:47 +02:00
|
|
|
|
YouTube.getStreamExtractor(BASE_URL + "don-t-exist");
|
2021-12-27 21:08:08 +01:00
|
|
|
|
assertThrows(ContentNotAvailableException.class, extractor::fetchPage);
|
2020-03-01 02:00:33 +01:00
|
|
|
|
}
|
|
|
|
|
|
2021-12-27 21:08:08 +01:00
|
|
|
|
@Test
|
|
|
|
|
void invalidId() throws Exception {
|
2020-03-01 02:00:33 +01:00
|
|
|
|
final StreamExtractor extractor =
|
2020-04-09 13:51:47 +02:00
|
|
|
|
YouTube.getStreamExtractor(BASE_URL + "INVALID_ID_INVALID_ID");
|
2021-12-27 21:08:08 +01:00
|
|
|
|
assertThrows(ParsingException.class, extractor::fetchPage);
|
2020-03-01 02:00:33 +01:00
|
|
|
|
}
|
2021-02-20 14:53:57 +01:00
|
|
|
|
|
2021-12-27 21:08:08 +01:00
|
|
|
|
@Test
|
|
|
|
|
void paidContent() throws Exception {
|
2021-02-20 14:53:57 +01:00
|
|
|
|
final StreamExtractor extractor =
|
|
|
|
|
YouTube.getStreamExtractor(BASE_URL + "ayI2iBwGdxw");
|
2021-12-27 21:08:08 +01:00
|
|
|
|
assertThrows(PaidContentException.class, extractor::fetchPage);
|
2021-02-20 14:53:57 +01:00
|
|
|
|
}
|
|
|
|
|
|
2021-12-27 21:08:08 +01:00
|
|
|
|
@Test
|
|
|
|
|
void privateContent() throws Exception {
|
2021-02-20 14:53:57 +01:00
|
|
|
|
final StreamExtractor extractor =
|
|
|
|
|
YouTube.getStreamExtractor(BASE_URL + "8VajtrESJzA");
|
2021-12-27 21:08:08 +01:00
|
|
|
|
assertThrows(PrivateContentException.class, extractor::fetchPage);
|
2021-02-20 14:53:57 +01:00
|
|
|
|
}
|
|
|
|
|
|
2021-12-27 21:08:08 +01:00
|
|
|
|
@Test
|
|
|
|
|
void youtubeMusicPremiumContent() throws Exception {
|
2021-02-20 14:53:57 +01:00
|
|
|
|
final StreamExtractor extractor =
|
|
|
|
|
YouTube.getStreamExtractor(BASE_URL + "sMJ8bRN2dak");
|
2021-12-27 21:08:08 +01:00
|
|
|
|
assertThrows(YoutubeMusicPremiumContentException.class, extractor::fetchPage);
|
2021-02-20 14:53:57 +01:00
|
|
|
|
}
|
2020-03-01 02:00:33 +01:00
|
|
|
|
}
|
|
|
|
|
|
2020-04-09 13:51:47 +02:00
|
|
|
|
public static class DescriptionTestPewdiepie extends DefaultStreamExtractorTest {
|
2020-08-14 11:09:29 +02:00
|
|
|
|
private static final String ID = "7PIMiDcwNvc";
|
2022-01-12 10:45:06 +01:00
|
|
|
|
private static final int TIMESTAMP = 7483;
|
|
|
|
|
private static final String URL = BASE_URL + ID + "&t=" + TIMESTAMP + "s";
|
2020-04-09 13:51:47 +02:00
|
|
|
|
private static StreamExtractor extractor;
|
2018-09-07 22:18:22 +02:00
|
|
|
|
|
2021-12-27 21:08:08 +01:00
|
|
|
|
@BeforeAll
|
2018-09-07 22:18:22 +02:00
|
|
|
|
public static void setUp() throws Exception {
|
2022-02-07 21:23:38 +01:00
|
|
|
|
YoutubeTestsUtils.ensureStateless();
|
2022-03-16 17:22:42 +01:00
|
|
|
|
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "pewdiwpie"));
|
2020-04-09 13:51:47 +02:00
|
|
|
|
extractor = YouTube.getStreamExtractor(URL);
|
2018-09-07 22:18:22 +02:00
|
|
|
|
extractor.fetchPage();
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-07 22:42:21 +01:00
|
|
|
|
// @formatter:off
|
2020-04-09 13:51:47 +02:00
|
|
|
|
@Override public StreamExtractor extractor() { return extractor; }
|
|
|
|
|
@Override public StreamingService expectedService() { return YouTube; }
|
2020-08-14 11:09:29 +02:00
|
|
|
|
@Override public String expectedName() { return "Marzia & Felix - Wedding 19.08.2019"; }
|
2020-04-09 13:51:47 +02:00
|
|
|
|
@Override public String expectedId() { return ID; }
|
|
|
|
|
@Override public String expectedUrlContains() { return BASE_URL + ID; }
|
|
|
|
|
@Override public String expectedOriginalUrlContains() { return URL; }
|
|
|
|
|
|
|
|
|
|
@Override public StreamType expectedStreamType() { return StreamType.VIDEO_STREAM; }
|
|
|
|
|
@Override public String expectedUploaderName() { return "PewDiePie"; }
|
|
|
|
|
@Override public String expectedUploaderUrl() { return "https://www.youtube.com/channel/UC-lHJZR3Gqxm24_Vd_AJ5Yw"; }
|
2022-02-11 05:08:22 +01:00
|
|
|
|
@Override public long expectedUploaderSubscriberCountAtLeast() { return 110_000_000; }
|
2020-04-09 13:51:47 +02:00
|
|
|
|
@Override public List<String> expectedDescriptionContains() {
|
2020-08-14 11:09:29 +02:00
|
|
|
|
return Arrays.asList("https://www.youtube.com/channel/UC7l23W7gFi4Uho6WSzckZRA",
|
|
|
|
|
"https://www.handcraftpictures.com/");
|
2020-04-09 13:51:47 +02:00
|
|
|
|
}
|
2021-01-22 01:44:58 +01:00
|
|
|
|
@Override public boolean expectedUploaderVerified() { return true; }
|
2020-08-14 11:09:29 +02:00
|
|
|
|
@Override public long expectedLength() { return 381; }
|
2020-04-09 13:51:47 +02:00
|
|
|
|
@Override public long expectedTimestamp() { return TIMESTAMP; }
|
|
|
|
|
@Override public long expectedViewCountAtLeast() { return 26682500; }
|
2020-08-14 11:09:29 +02:00
|
|
|
|
@Nullable @Override public String expectedUploadDate() { return "2019-08-24 00:00:00.000"; }
|
|
|
|
|
@Nullable @Override public String expectedTextualUploadDate() { return "2019-08-24"; }
|
|
|
|
|
@Override public long expectedLikeCountAtLeast() { return 5212900; }
|
2021-12-27 17:04:46 +01:00
|
|
|
|
@Override public long expectedDislikeCountAtLeast() { return -1; }
|
2020-12-12 10:24:55 +01:00
|
|
|
|
@Override public int expectedStreamSegmentsCount() { return 0; }
|
2020-02-09 11:59:23 +01:00
|
|
|
|
@Override public String expectedLicence() { return YOUTUBE_LICENCE; }
|
|
|
|
|
@Override public String expectedCategory() { return "Entertainment"; }
|
2021-02-07 22:42:21 +01:00
|
|
|
|
// @formatter:on
|
2017-11-22 18:39:38 +01:00
|
|
|
|
}
|
2018-09-24 15:06:00 +02:00
|
|
|
|
|
2020-04-09 13:51:47 +02:00
|
|
|
|
public static class DescriptionTestUnboxing extends DefaultStreamExtractorTest {
|
|
|
|
|
private static final String ID = "cV5TjZCJkuA";
|
|
|
|
|
private static final String URL = BASE_URL + ID;
|
|
|
|
|
private static StreamExtractor extractor;
|
2018-09-24 15:06:00 +02:00
|
|
|
|
|
2021-12-27 21:08:08 +01:00
|
|
|
|
@BeforeAll
|
2018-09-24 15:06:00 +02:00
|
|
|
|
public static void setUp() throws Exception {
|
2022-02-07 21:23:38 +01:00
|
|
|
|
YoutubeTestsUtils.ensureStateless();
|
2022-03-16 17:22:42 +01:00
|
|
|
|
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "unboxing"));
|
2020-04-09 13:51:47 +02:00
|
|
|
|
extractor = YouTube.getStreamExtractor(URL);
|
2018-09-24 15:06:00 +02:00
|
|
|
|
extractor.fetchPage();
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-07 22:42:21 +01:00
|
|
|
|
// @formatter:off
|
2020-04-09 13:51:47 +02:00
|
|
|
|
@Override public StreamExtractor extractor() { return extractor; }
|
|
|
|
|
@Override public StreamingService expectedService() { return YouTube; }
|
|
|
|
|
@Override public String expectedName() { return "This Smartphone Changes Everything..."; }
|
|
|
|
|
@Override public String expectedId() { return ID; }
|
|
|
|
|
@Override public String expectedUrlContains() { return URL; }
|
|
|
|
|
@Override public String expectedOriginalUrlContains() { return URL; }
|
|
|
|
|
|
|
|
|
|
@Override public StreamType expectedStreamType() { return StreamType.VIDEO_STREAM; }
|
|
|
|
|
@Override public String expectedUploaderName() { return "Unbox Therapy"; }
|
|
|
|
|
@Override public String expectedUploaderUrl() { return "https://www.youtube.com/channel/UCsTcErHg8oDvUnTzoqsYeNw"; }
|
2022-02-11 05:08:22 +01:00
|
|
|
|
@Override public long expectedUploaderSubscriberCountAtLeast() { return 18_000_000; }
|
2020-04-09 13:51:47 +02:00
|
|
|
|
@Override public List<String> expectedDescriptionContains() {
|
[YouTube] Fix hashtags links extraction and escape text in attribute descriptions + HTML links
webCommandMetadata object is contained inside a commandMetadata one, so it is
not accessible from the root of the navigationEndpoint object.
The corresponding statement has been moved at the bottom of the specific
endpoints parsing, as the webCommandMetadata object is present almost
everywhere, otherwise URLs of some endpoints would have be changed, such as
uploader URLs (from channel IDs to handles).
As no ParsingException is now thrown by getUrlFromNavigationEndpoint, and so by
getTextFromObject, getUrlFromObject and getTextAtKey, the methods which were
catching ParsingExceptions thrown by these methods had to be updated.
URLs got in the HTML version of getTextFromObject are now escaped properly to
provide valid HTML to clients. This has been also done for attribute
descriptions, with the description text for this type of descriptions.
As YouTube descriptions are in HTML format (except for the fallback on the JSON
player response, which is plain text and only happens when there is no visual
metadata or a breaking change), all URLs returned are escaped, so tests which
are testing presence of URLs with escaped characters had to be updated (it was
only the case for YoutubeStreamExtractorDefaultTest.DescriptionTestUnboxing).
2023-02-20 13:21:55 +01:00
|
|
|
|
return Arrays.asList("https://www.youtube.com/watch?v=X7FLCHVXpsA&list=PL7u4lWXQ3wfI_7PgX0C-VTiwLeu0S4v34",
|
|
|
|
|
"https://www.youtube.com/watch?v=Lqv6G0pDNnw&list=PL7u4lWXQ3wfI_7PgX0C-VTiwLeu0S4v34",
|
|
|
|
|
"https://www.youtube.com/watch?v=XxaRBPyrnBU&list=PL7u4lWXQ3wfI_7PgX0C-VTiwLeu0S4v34",
|
|
|
|
|
"https://www.youtube.com/watch?v=U-9tUEOFKNU&list=PL7u4lWXQ3wfI_7PgX0C-VTiwLeu0S4v34");
|
2020-04-09 13:51:47 +02:00
|
|
|
|
}
|
|
|
|
|
@Override public long expectedLength() { return 434; }
|
|
|
|
|
@Override public long expectedViewCountAtLeast() { return 21229200; }
|
|
|
|
|
@Nullable @Override public String expectedUploadDate() { return "2018-06-19 00:00:00.000"; }
|
|
|
|
|
@Nullable @Override public String expectedTextualUploadDate() { return "2018-06-19"; }
|
|
|
|
|
@Override public long expectedLikeCountAtLeast() { return 340100; }
|
2021-12-27 17:04:46 +01:00
|
|
|
|
@Override public long expectedDislikeCountAtLeast() { return -1; }
|
2021-01-22 01:44:58 +01:00
|
|
|
|
@Override public boolean expectedUploaderVerified() { return true; }
|
2020-02-09 11:59:23 +01:00
|
|
|
|
@Override public String expectedLicence() { return YOUTUBE_LICENCE; }
|
|
|
|
|
@Override public String expectedCategory() { return "Science & Technology"; }
|
|
|
|
|
@Override public List<String> expectedTags() {
|
|
|
|
|
return Arrays.asList("2018", "8 plus", "apple", "apple iphone", "apple iphone x", "best", "best android",
|
|
|
|
|
"best smartphone", "cool gadgets", "find", "find x", "find x review", "find x unboxing", "findx",
|
|
|
|
|
"galaxy s9", "galaxy s9+", "hands on", "iphone 8", "iphone 8 plus", "iphone x", "new iphone", "nex",
|
|
|
|
|
"oneplus 6", "oppo", "oppo find x", "oppo find x hands on", "oppo find x review",
|
|
|
|
|
"oppo find x unboxing", "oppo findx", "pixel 2 xl", "review", "samsung", "samsung galaxy",
|
|
|
|
|
"samsung galaxy s9", "smartphone", "unbox therapy", "unboxing", "vivo", "vivo apex", "vivo nex");
|
|
|
|
|
}
|
2021-02-07 22:42:21 +01:00
|
|
|
|
// @formatter:on
|
2018-09-24 15:06:00 +02:00
|
|
|
|
}
|
2019-08-26 18:14:09 +02:00
|
|
|
|
|
2021-12-27 21:08:08 +01:00
|
|
|
|
@Disabled("Test broken, video was made private")
|
2020-04-09 13:51:47 +02:00
|
|
|
|
public static class RatingsDisabledTest extends DefaultStreamExtractorTest {
|
|
|
|
|
private static final String ID = "HRKu0cvrr_o";
|
|
|
|
|
private static final int TIMESTAMP = 17;
|
|
|
|
|
private static final String URL = BASE_URL + ID + "&t=" + TIMESTAMP;
|
|
|
|
|
private static StreamExtractor extractor;
|
2020-01-06 23:57:08 +01:00
|
|
|
|
|
2021-12-27 21:08:08 +01:00
|
|
|
|
@BeforeAll
|
2020-01-06 23:57:08 +01:00
|
|
|
|
public static void setUp() throws Exception {
|
2022-02-07 21:23:38 +01:00
|
|
|
|
YoutubeTestsUtils.ensureStateless();
|
2022-03-16 17:22:42 +01:00
|
|
|
|
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "ratingsDisabled"));
|
2020-04-09 13:51:47 +02:00
|
|
|
|
extractor = YouTube.getStreamExtractor(URL);
|
2020-01-06 23:57:08 +01:00
|
|
|
|
extractor.fetchPage();
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-07 22:42:21 +01:00
|
|
|
|
// @formatter:off
|
2020-04-09 13:51:47 +02:00
|
|
|
|
@Override public StreamExtractor extractor() { return extractor; }
|
|
|
|
|
@Override public StreamingService expectedService() { return YouTube; }
|
|
|
|
|
@Override public String expectedName() { return "AlphaOmegaSin Fanboy Logic: Likes/Dislikes Disabled = Point Invalid Lol wtf?"; }
|
|
|
|
|
@Override public String expectedId() { return ID; }
|
|
|
|
|
@Override public String expectedUrlContains() { return BASE_URL + ID; }
|
|
|
|
|
@Override public String expectedOriginalUrlContains() { return URL; }
|
|
|
|
|
|
|
|
|
|
@Override public StreamType expectedStreamType() { return StreamType.VIDEO_STREAM; }
|
|
|
|
|
@Override public String expectedUploaderName() { return "YouTuber PrinceOfFALLEN"; }
|
|
|
|
|
@Override public String expectedUploaderUrl() { return "https://www.youtube.com/channel/UCQT2yul0lr6Ie9qNQNmw-sg"; }
|
|
|
|
|
@Override public List<String> expectedDescriptionContains() { return Arrays.asList("dislikes", "Alpha", "wrong"); }
|
|
|
|
|
@Override public long expectedLength() { return 84; }
|
|
|
|
|
@Override public long expectedTimestamp() { return TIMESTAMP; }
|
|
|
|
|
@Override public long expectedViewCountAtLeast() { return 190; }
|
|
|
|
|
@Nullable @Override public String expectedUploadDate() { return "2019-01-02 00:00:00.000"; }
|
|
|
|
|
@Nullable @Override public String expectedTextualUploadDate() { return "2019-01-02"; }
|
|
|
|
|
@Override public long expectedLikeCountAtLeast() { return -1; }
|
|
|
|
|
@Override public long expectedDislikeCountAtLeast() { return -1; }
|
2021-02-07 22:42:21 +01:00
|
|
|
|
// @formatter:on
|
2019-08-26 18:14:09 +02:00
|
|
|
|
}
|
2020-12-12 10:24:55 +01:00
|
|
|
|
|
2021-04-11 22:58:48 +02:00
|
|
|
|
public static class StreamSegmentsTestTagesschau extends DefaultStreamExtractorTest {
|
2020-12-12 10:24:55 +01:00
|
|
|
|
// StreamSegment example with single macro-makers panel
|
2021-04-11 22:58:48 +02:00
|
|
|
|
private static final String ID = "KI7fMGRg0Wk";
|
2020-12-12 10:24:55 +01:00
|
|
|
|
private static final String URL = BASE_URL + ID;
|
|
|
|
|
private static StreamExtractor extractor;
|
|
|
|
|
|
2021-12-27 21:08:08 +01:00
|
|
|
|
@BeforeAll
|
2020-12-12 10:24:55 +01:00
|
|
|
|
public static void setUp() throws Exception {
|
2022-02-07 21:23:38 +01:00
|
|
|
|
YoutubeTestsUtils.ensureStateless();
|
2022-03-16 17:22:42 +01:00
|
|
|
|
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "streamSegmentsTagesschau"));
|
2020-12-12 10:24:55 +01:00
|
|
|
|
extractor = YouTube.getStreamExtractor(URL);
|
|
|
|
|
extractor.fetchPage();
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-07 22:42:21 +01:00
|
|
|
|
// @formatter:off
|
2020-12-12 10:24:55 +01:00
|
|
|
|
@Override public StreamExtractor extractor() { return extractor; }
|
|
|
|
|
@Override public StreamingService expectedService() { return YouTube; }
|
2021-04-11 22:58:48 +02:00
|
|
|
|
@Override public String expectedName() { return "tagesschau 20:00 Uhr, 17.03.2021"; }
|
2020-12-12 10:24:55 +01:00
|
|
|
|
@Override public String expectedId() { return ID; }
|
|
|
|
|
@Override public String expectedUrlContains() { return BASE_URL + ID; }
|
|
|
|
|
@Override public String expectedOriginalUrlContains() { return URL; }
|
|
|
|
|
|
|
|
|
|
@Override public StreamType expectedStreamType() { return StreamType.VIDEO_STREAM; }
|
2021-04-11 22:58:48 +02:00
|
|
|
|
@Override public String expectedUploaderName() { return "tagesschau"; }
|
|
|
|
|
@Override public String expectedUploaderUrl() { return "https://www.youtube.com/channel/UC5NOEUbkLheQcaaRldYW5GA"; }
|
2022-02-11 05:08:22 +01:00
|
|
|
|
@Override public long expectedUploaderSubscriberCountAtLeast() { return 1_000_000; }
|
2021-04-11 22:58:48 +02:00
|
|
|
|
@Override public boolean expectedUploaderVerified() { return true; }
|
2020-12-12 10:24:55 +01:00
|
|
|
|
@Override public List<String> expectedDescriptionContains() {
|
2021-04-11 22:58:48 +02:00
|
|
|
|
return Arrays.asList("Themen der Sendung", "07:15", "Wetter", "Sendung nachträglich bearbeitet");
|
2020-12-12 10:24:55 +01:00
|
|
|
|
}
|
2021-04-11 22:58:48 +02:00
|
|
|
|
@Override public long expectedLength() { return 953; }
|
|
|
|
|
@Override public long expectedViewCountAtLeast() { return 270000; }
|
|
|
|
|
@Nullable @Override public String expectedUploadDate() { return "2021-03-17 00:00:00.000"; }
|
|
|
|
|
@Nullable @Override public String expectedTextualUploadDate() { return "2021-03-17"; }
|
|
|
|
|
@Override public long expectedLikeCountAtLeast() { return 2300; }
|
2021-12-27 17:04:46 +01:00
|
|
|
|
@Override public long expectedDislikeCountAtLeast() { return -1; }
|
2020-12-12 10:24:55 +01:00
|
|
|
|
@Override public boolean expectedHasSubtitles() { return false; }
|
2021-04-11 22:58:48 +02:00
|
|
|
|
@Override public int expectedStreamSegmentsCount() { return 13; }
|
2020-02-09 11:59:23 +01:00
|
|
|
|
@Override public String expectedLicence() { return YOUTUBE_LICENCE; }
|
2021-04-11 22:58:48 +02:00
|
|
|
|
@Override public String expectedCategory() { return "News & Politics"; }
|
2020-02-09 11:59:23 +01:00
|
|
|
|
// @formatter:on
|
2021-02-15 19:21:28 +01:00
|
|
|
|
|
2020-12-12 10:24:55 +01:00
|
|
|
|
@Test
|
2022-02-07 21:23:38 +01:00
|
|
|
|
void testStreamSegment0() throws Exception {
|
2021-04-11 22:58:48 +02:00
|
|
|
|
final StreamSegment segment = extractor.getStreamSegments().get(0);
|
|
|
|
|
assertEquals(0, segment.getStartTimeSeconds());
|
|
|
|
|
assertEquals("Guten Abend", segment.getTitle());
|
|
|
|
|
assertEquals(BASE_URL + ID + "?t=0", segment.getUrl());
|
|
|
|
|
assertNotNull(segment.getPreviewUrl());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
2022-02-07 21:23:38 +01:00
|
|
|
|
void testStreamSegment3() throws Exception {
|
2020-12-12 10:24:55 +01:00
|
|
|
|
final StreamSegment segment = extractor.getStreamSegments().get(3);
|
2021-04-11 22:58:48 +02:00
|
|
|
|
assertEquals(224, segment.getStartTimeSeconds());
|
|
|
|
|
assertEquals("Pandemie dämpft Konjunkturprognose für 2021", segment.getTitle());
|
|
|
|
|
assertEquals(BASE_URL + ID + "?t=224", segment.getUrl());
|
2020-12-12 10:24:55 +01:00
|
|
|
|
assertNotNull(segment.getPreviewUrl());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static class StreamSegmentsTestMaiLab extends DefaultStreamExtractorTest {
|
|
|
|
|
// StreamSegment example with macro-makers panel and transcription panel
|
|
|
|
|
private static final String ID = "ud9d5cMDP_0";
|
|
|
|
|
private static final String URL = BASE_URL + ID;
|
|
|
|
|
private static StreamExtractor extractor;
|
|
|
|
|
|
2021-12-27 21:08:08 +01:00
|
|
|
|
@BeforeAll
|
2020-12-12 10:24:55 +01:00
|
|
|
|
public static void setUp() throws Exception {
|
2022-02-07 21:23:38 +01:00
|
|
|
|
YoutubeTestsUtils.ensureStateless();
|
2022-03-16 17:22:42 +01:00
|
|
|
|
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "streamSegmentsMaiLab"));
|
2020-12-12 10:24:55 +01:00
|
|
|
|
extractor = YouTube.getStreamExtractor(URL);
|
|
|
|
|
extractor.fetchPage();
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-14 14:57:23 +01:00
|
|
|
|
// @formatter:off
|
2020-12-12 10:24:55 +01:00
|
|
|
|
@Override public StreamExtractor extractor() { return extractor; }
|
|
|
|
|
@Override public StreamingService expectedService() { return YouTube; }
|
|
|
|
|
@Override public String expectedName() { return "Vitamin D wissenschaftlich gepr\u00fcft"; }
|
|
|
|
|
@Override public String expectedId() { return ID; }
|
|
|
|
|
@Override public String expectedUrlContains() { return BASE_URL + ID; }
|
|
|
|
|
@Override public String expectedOriginalUrlContains() { return URL; }
|
|
|
|
|
|
|
|
|
|
@Override public StreamType expectedStreamType() { return StreamType.VIDEO_STREAM; }
|
|
|
|
|
@Override public String expectedUploaderName() { return "maiLab"; }
|
|
|
|
|
@Override public String expectedUploaderUrl() { return "https://www.youtube.com/channel/UCyHDQ5C6z1NDmJ4g6SerW8g"; }
|
2022-02-11 05:08:22 +01:00
|
|
|
|
@Override public long expectedUploaderSubscriberCountAtLeast() { return 1_400_000; }
|
2021-02-14 14:57:23 +01:00
|
|
|
|
@Override public List<String> expectedDescriptionContains() {return Arrays.asList("Vitamin", "2:44", "Was ist Vitamin D?");}
|
2021-01-22 01:44:58 +01:00
|
|
|
|
@Override public boolean expectedUploaderVerified() { return true; }
|
2021-02-14 14:57:23 +01:00
|
|
|
|
@Override public long expectedLength() { return 1010; }
|
|
|
|
|
@Override public long expectedViewCountAtLeast() { return 815500; }
|
|
|
|
|
@Nullable @Override public String expectedUploadDate() { return "2020-11-18 00:00:00.000"; }
|
|
|
|
|
@Nullable @Override public String expectedTextualUploadDate() { return "2020-11-18"; }
|
|
|
|
|
@Override public long expectedLikeCountAtLeast() { return 48500; }
|
2021-12-27 17:04:46 +01:00
|
|
|
|
@Override public long expectedDislikeCountAtLeast() { return -1; }
|
2021-02-14 14:57:23 +01:00
|
|
|
|
@Override public boolean expectedHasSubtitles() { return true; }
|
|
|
|
|
@Override public int expectedStreamSegmentsCount() { return 7; }
|
2020-02-09 11:59:23 +01:00
|
|
|
|
@Override public String expectedLicence() { return YOUTUBE_LICENCE; }
|
|
|
|
|
@Override public String expectedCategory() { return "Science & Technology"; }
|
|
|
|
|
@Override public List<String> expectedTags() {
|
|
|
|
|
return Arrays.asList("Diabetes", "Erkältung", "Gesundheit", "Immunabwehr", "Immunsystem", "Infektion",
|
|
|
|
|
"Komisch alles chemisch", "Krebs", "Lab", "Lesch", "Mai", "Mai Thi", "Mai Thi Nguyen-Kim",
|
|
|
|
|
"Mangel", "Nahrungsergänzungsmittel", "Nguyen", "Nguyen Kim", "Nguyen-Kim", "Quarks", "Sommer",
|
|
|
|
|
"Supplemente", "Supplements", "Tabletten", "Terra X", "TerraX", "The Secret Life Of Scientists",
|
|
|
|
|
"Tropfen", "Vitamin D", "Vitamin-D-Mangel", "Vitamine", "Winter", "einnehmen", "maiLab", "nehmen",
|
|
|
|
|
"supplementieren", "Überdosis", "Überschuss");
|
|
|
|
|
}
|
2021-02-14 14:57:23 +01:00
|
|
|
|
// @formatter:on
|
2021-01-17 18:55:37 +01:00
|
|
|
|
|
2020-12-12 10:24:55 +01:00
|
|
|
|
@Test
|
2022-02-07 21:23:38 +01:00
|
|
|
|
void testStreamSegment() throws Exception {
|
2020-12-12 10:24:55 +01:00
|
|
|
|
final StreamSegment segment = extractor.getStreamSegments().get(1);
|
|
|
|
|
assertEquals(164, segment.getStartTimeSeconds());
|
|
|
|
|
assertEquals("Was ist Vitamin D?", segment.getTitle());
|
|
|
|
|
assertEquals(BASE_URL + ID + "?t=164", segment.getUrl());
|
|
|
|
|
assertNotNull(segment.getPreviewUrl());
|
|
|
|
|
}
|
2021-01-17 18:55:37 +01:00
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
@Test
|
2021-12-27 21:08:08 +01:00
|
|
|
|
@Disabled("encoding problem")
|
2021-02-15 19:21:28 +01:00
|
|
|
|
public void testName() {}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
@Test
|
2021-12-27 21:08:08 +01:00
|
|
|
|
@Disabled("encoding problem")
|
2021-02-15 19:21:28 +01:00
|
|
|
|
public void testTags() {}
|
2020-12-12 10:24:55 +01:00
|
|
|
|
}
|
2020-12-20 19:54:12 +01:00
|
|
|
|
|
|
|
|
|
public static class PublicBroadcasterTest extends DefaultStreamExtractorTest {
|
|
|
|
|
private static final String ID = "q6fgbYWsMgw";
|
|
|
|
|
private static final int TIMESTAMP = 0;
|
|
|
|
|
private static final String URL = BASE_URL + ID;
|
|
|
|
|
private static StreamExtractor extractor;
|
|
|
|
|
|
2021-12-27 21:08:08 +01:00
|
|
|
|
@BeforeAll
|
2020-12-20 19:54:12 +01:00
|
|
|
|
public static void setUp() throws Exception {
|
2022-02-07 21:23:38 +01:00
|
|
|
|
YoutubeTestsUtils.ensureStateless();
|
2022-03-16 17:22:42 +01:00
|
|
|
|
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "publicBroadcast"));
|
2020-12-20 19:54:12 +01:00
|
|
|
|
extractor = YouTube.getStreamExtractor(URL);
|
|
|
|
|
extractor.fetchPage();
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-07 22:42:21 +01:00
|
|
|
|
// @formatter:off
|
2020-12-20 19:54:12 +01:00
|
|
|
|
@Override public StreamExtractor extractor() { return extractor; }
|
|
|
|
|
@Override public StreamingService expectedService() { return YouTube; }
|
|
|
|
|
@Override public String expectedName() { return "Was verbirgt sich am tiefsten Punkt des Ozeans?"; }
|
|
|
|
|
@Override public String expectedId() { return ID; }
|
|
|
|
|
@Override public String expectedUrlContains() { return BASE_URL + ID; }
|
|
|
|
|
@Override public String expectedOriginalUrlContains() { return URL; }
|
|
|
|
|
|
|
|
|
|
@Override public StreamType expectedStreamType() { return StreamType.VIDEO_STREAM; }
|
|
|
|
|
@Override public String expectedUploaderName() { return "Dinge Erklärt – Kurzgesagt"; }
|
|
|
|
|
@Override public String expectedUploaderUrl() { return "https://www.youtube.com/channel/UCwRH985XgMYXQ6NxXDo8npw"; }
|
2022-02-11 05:08:22 +01:00
|
|
|
|
@Override public long expectedUploaderSubscriberCountAtLeast() { return 1_500_000; }
|
2020-12-20 19:54:12 +01:00
|
|
|
|
@Override public List<String> expectedDescriptionContains() { return Arrays.asList("Lasst uns abtauchen!", "Angebot von funk", "Dinge"); }
|
|
|
|
|
@Override public long expectedLength() { return 631; }
|
|
|
|
|
@Override public long expectedTimestamp() { return TIMESTAMP; }
|
|
|
|
|
@Override public long expectedViewCountAtLeast() { return 1_600_000; }
|
|
|
|
|
@Nullable @Override public String expectedUploadDate() { return "2019-06-12 00:00:00.000"; }
|
|
|
|
|
@Nullable @Override public String expectedTextualUploadDate() { return "2019-06-12"; }
|
|
|
|
|
@Override public long expectedLikeCountAtLeast() { return 70000; }
|
2021-12-27 17:04:46 +01:00
|
|
|
|
@Override public long expectedDislikeCountAtLeast() { return -1; }
|
2020-12-20 19:54:12 +01:00
|
|
|
|
@Override public List<MetaInfo> expectedMetaInfo() throws MalformedURLException {
|
|
|
|
|
return Collections.singletonList(new MetaInfo(
|
2022-08-15 05:49:40 +02:00
|
|
|
|
"",
|
2020-12-20 19:54:12 +01:00
|
|
|
|
new Description("Funk is a German public broadcast service.", Description.PLAIN_TEXT),
|
|
|
|
|
Collections.singletonList(new URL("https://de.wikipedia.org/wiki/Funk_(Medienangebot)?wprov=yicw1")),
|
|
|
|
|
Collections.singletonList("Wikipedia (German)")
|
|
|
|
|
));
|
|
|
|
|
}
|
2021-01-22 01:44:58 +01:00
|
|
|
|
@Override public boolean expectedUploaderVerified() { return true; }
|
2020-02-09 11:59:23 +01:00
|
|
|
|
@Override public String expectedLicence() { return YOUTUBE_LICENCE; }
|
|
|
|
|
@Override public String expectedCategory() { return "Education"; }
|
|
|
|
|
@Override public List<String> expectedTags() {
|
|
|
|
|
return Arrays.asList("Abgrund", "Algen", "Bakterien", "Challengertief", "Dumbooktopus",
|
|
|
|
|
"Dunkel", "Dunkelheit", "Fische", "Flohkrebs", "Hadal-Zone", "Kontinentalschelf",
|
|
|
|
|
"Licht", "Mariannengraben", "Meer", "Meeresbewohner", "Meeresschnee", "Mesopelagial",
|
|
|
|
|
"Ozean", "Photosynthese", "Plankton", "Plastik", "Polypen", "Pottwale",
|
|
|
|
|
"Staatsquelle", "Tauchen", "Tauchgang", "Tentakel", "Tiefe", "Tiefsee", "Tintenfische",
|
|
|
|
|
"Titanic", "Vampirtintenfisch", "Verschmutzung", "Viperfisch", "Wale");
|
|
|
|
|
}
|
2021-02-07 22:42:21 +01:00
|
|
|
|
// @formatter:on
|
2020-12-20 19:54:12 +01:00
|
|
|
|
}
|
|
|
|
|
|
2022-11-04 19:42:12 +01:00
|
|
|
|
public static class NoVisualMetadataVideoTest extends DefaultStreamExtractorTest {
|
|
|
|
|
// Video without visual metadata on YouTube clients (video title, upload date, channel name,
|
|
|
|
|
// comments, ...)
|
|
|
|
|
private static final String ID = "An8vtD1FDqs";
|
|
|
|
|
private static final String URL = BASE_URL + ID;
|
|
|
|
|
private static StreamExtractor extractor;
|
|
|
|
|
|
|
|
|
|
@BeforeAll
|
|
|
|
|
public static void setUp() throws Exception {
|
|
|
|
|
YoutubeTestsUtils.ensureStateless();
|
|
|
|
|
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "noVisualMetadata"));
|
|
|
|
|
extractor = YouTube.getStreamExtractor(URL);
|
|
|
|
|
extractor.fetchPage();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override public StreamType expectedStreamType() { return StreamType.VIDEO_STREAM; }
|
|
|
|
|
@Override public String expectedUploaderName() { return "Makani"; }
|
|
|
|
|
@Override public String expectedUploaderUrl() { return "https://www.youtube.com/channel/UC-iMZJ8NppwT2fLwzFWJKOQ"; }
|
|
|
|
|
@Override public List<String> expectedDescriptionContains() { return Arrays.asList("Makani", "prototype", "rotors"); }
|
|
|
|
|
@Override public long expectedLength() { return 175; }
|
|
|
|
|
@Override public long expectedViewCountAtLeast() { return 88_000; }
|
|
|
|
|
@Nullable @Override public String expectedUploadDate() { return "2017-05-16 00:00:00.000"; }
|
|
|
|
|
@Nullable @Override public String expectedTextualUploadDate() { return "2017-05-16"; }
|
|
|
|
|
@Override public long expectedLikeCountAtLeast() { return -1; }
|
|
|
|
|
@Override public long expectedDislikeCountAtLeast() { return -1; }
|
|
|
|
|
@Override public StreamExtractor extractor() { return extractor; }
|
|
|
|
|
@Override public StreamingService expectedService() { return YouTube; }
|
|
|
|
|
@Override public String expectedName() { return "Makani’s first commercial-scale energy kite"; }
|
|
|
|
|
@Override public String expectedId() { return "An8vtD1FDqs"; }
|
|
|
|
|
@Override public String expectedUrlContains() { return BASE_URL + ID; }
|
|
|
|
|
@Override public String expectedOriginalUrlContains() { return URL; }
|
|
|
|
|
@Override public String expectedCategory() { return "Science & Technology"; }
|
|
|
|
|
@Override public String expectedLicence() { return YOUTUBE_LICENCE; }
|
|
|
|
|
@Override public List<String> expectedTags() {
|
|
|
|
|
return Arrays.asList("Makani", "Moonshot", "Moonshot Factory", "Prototyping",
|
|
|
|
|
"california", "california wind", "clean", "clean energy", "climate change",
|
|
|
|
|
"climate crisis", "energy", "energy kite", "google", "google x", "green",
|
|
|
|
|
"green energy", "kite", "kite power", "kite power solutions",
|
|
|
|
|
"kite power systems", "makani power", "power", "renewable", "renewable energy",
|
|
|
|
|
"renewable energy engineering", "renewable energy projects",
|
|
|
|
|
"renewable energy sources", "renewables", "solutions", "tech", "technology",
|
|
|
|
|
"turbine", "wind", "wind energy", "wind power", "wind turbine", "windmill");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
@Override
|
|
|
|
|
public void testSubscriberCount() {
|
|
|
|
|
assertThrows(ParsingException.class, () -> extractor.getUploaderSubscriberCount());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
@Override
|
|
|
|
|
public void testLikeCount() {
|
|
|
|
|
assertThrows(ParsingException.class, () -> extractor.getLikeCount());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
@Override
|
|
|
|
|
public void testUploaderAvatarUrl() {
|
|
|
|
|
assertThrows(ParsingException.class, () -> extractor.getUploaderAvatarUrl());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-09 11:59:23 +01:00
|
|
|
|
public static class UnlistedTest {
|
|
|
|
|
private static YoutubeStreamExtractor extractor;
|
|
|
|
|
|
2021-12-27 21:08:08 +01:00
|
|
|
|
@BeforeAll
|
2020-02-09 11:59:23 +01:00
|
|
|
|
public static void setUp() throws Exception {
|
2022-02-07 21:23:38 +01:00
|
|
|
|
YoutubeTestsUtils.ensureStateless();
|
2020-02-09 11:59:23 +01:00
|
|
|
|
NewPipe.init(DownloaderTestImpl.getInstance());
|
|
|
|
|
extractor = (YoutubeStreamExtractor) YouTube
|
|
|
|
|
.getStreamExtractor("https://www.youtube.com/watch?v=tjz2u2DiveM");
|
|
|
|
|
extractor.fetchPage();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
2022-02-07 21:23:38 +01:00
|
|
|
|
void testGetUnlisted() {
|
2020-02-09 11:59:23 +01:00
|
|
|
|
assertEquals(StreamExtractor.Privacy.UNLISTED, extractor.getPrivacy());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static class CCLicensed {
|
|
|
|
|
private static final String ID = "M4gD1WSo5mA";
|
|
|
|
|
private static final String URL = BASE_URL + ID;
|
|
|
|
|
private static StreamExtractor extractor;
|
|
|
|
|
|
2021-12-27 21:08:08 +01:00
|
|
|
|
@BeforeAll
|
2020-02-09 11:59:23 +01:00
|
|
|
|
public static void setUp() throws Exception {
|
2022-02-07 21:23:38 +01:00
|
|
|
|
YoutubeTestsUtils.ensureStateless();
|
2020-02-09 11:59:23 +01:00
|
|
|
|
NewPipe.init(DownloaderTestImpl.getInstance());
|
|
|
|
|
extractor = YouTube.getStreamExtractor(URL);
|
|
|
|
|
extractor.fetchPage();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
2022-02-07 21:23:38 +01:00
|
|
|
|
void testGetLicence() throws ParsingException {
|
2020-02-09 11:59:23 +01:00
|
|
|
|
assertEquals("Creative Commons Attribution licence (reuse allowed)", extractor.getLicence());
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-11-14 00:10:44 +01:00
|
|
|
|
|
|
|
|
|
public static class AudioTrackLanguage {
|
|
|
|
|
|
|
|
|
|
private static final String ID = "kX3nB4PpJko";
|
|
|
|
|
private static final String URL = BASE_URL + ID;
|
|
|
|
|
private static StreamExtractor extractor;
|
|
|
|
|
|
|
|
|
|
@BeforeAll
|
|
|
|
|
public static void setUp() throws Exception {
|
|
|
|
|
YoutubeTestsUtils.ensureStateless();
|
|
|
|
|
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "audioTrack"));
|
|
|
|
|
extractor = YouTube.getStreamExtractor(URL);
|
|
|
|
|
extractor.fetchPage();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void testCheckAudioStreams() throws Exception {
|
2023-01-31 19:16:14 +01:00
|
|
|
|
final List<AudioStream> audioStreams = extractor.getAudioStreams();
|
|
|
|
|
assertFalse(audioStreams.isEmpty());
|
2022-11-14 00:10:44 +01:00
|
|
|
|
|
2023-01-31 19:16:14 +01:00
|
|
|
|
for (final AudioStream stream : audioStreams) {
|
|
|
|
|
assertNotNull(stream.getAudioTrackName());
|
2022-11-14 00:10:44 +01:00
|
|
|
|
}
|
|
|
|
|
|
2023-01-31 19:16:14 +01:00
|
|
|
|
assertTrue(audioStreams.stream()
|
2022-12-16 18:12:52 +01:00
|
|
|
|
.anyMatch(audioStream -> "English".equals(audioStream.getAudioTrackName())));
|
2022-11-14 01:05:31 +01:00
|
|
|
|
|
2023-01-31 19:16:14 +01:00
|
|
|
|
final Locale hindiLocale = LocaleCompat.forLanguageTag("hi");
|
|
|
|
|
assertTrue(audioStreams.stream()
|
|
|
|
|
.anyMatch(audioStream ->
|
|
|
|
|
Objects.equals(audioStream.getAudioLocale(), hindiLocale)));
|
2022-12-16 18:12:52 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-28 00:02:20 +02:00
|
|
|
|
public static class AudioTrackTypes {
|
|
|
|
|
private static final String ID = "Kn56bMZ9OE8";
|
2022-12-16 18:12:52 +01:00
|
|
|
|
private static final String URL = BASE_URL + ID;
|
|
|
|
|
private static StreamExtractor extractor;
|
|
|
|
|
|
|
|
|
|
@BeforeAll
|
|
|
|
|
public static void setUp() throws Exception {
|
|
|
|
|
YoutubeTestsUtils.ensureStateless();
|
2023-03-28 00:02:20 +02:00
|
|
|
|
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "audioTrackType"));
|
2022-12-16 18:12:52 +01:00
|
|
|
|
extractor = YouTube.getStreamExtractor(URL);
|
|
|
|
|
extractor.fetchPage();
|
2022-11-14 00:10:44 +01:00
|
|
|
|
}
|
|
|
|
|
|
2022-12-16 18:12:52 +01:00
|
|
|
|
@Test
|
2023-03-28 00:02:20 +02:00
|
|
|
|
void testCheckOriginalAudio() throws Exception {
|
2022-12-16 18:12:52 +01:00
|
|
|
|
assertFalse(extractor.getAudioStreams().isEmpty());
|
|
|
|
|
|
|
|
|
|
assertTrue(extractor.getAudioStreams()
|
|
|
|
|
.stream()
|
2023-03-28 00:02:20 +02:00
|
|
|
|
.anyMatch(s -> s.getAudioTrackType() == AudioTrackType.ORIGINAL));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void testCheckDubbedAudio() throws Exception {
|
|
|
|
|
assertTrue(extractor.getAudioStreams()
|
|
|
|
|
.stream()
|
|
|
|
|
.anyMatch(s -> s.getAudioTrackType() == AudioTrackType.DUBBED));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void testCheckDescriptiveAudio() throws Exception {
|
|
|
|
|
assertTrue(extractor.getAudioStreams()
|
|
|
|
|
.stream()
|
|
|
|
|
.anyMatch(s -> s.getAudioTrackType() == AudioTrackType.DESCRIPTIVE));
|
2022-12-16 18:12:52 +01:00
|
|
|
|
}
|
2022-11-14 00:10:44 +01:00
|
|
|
|
}
|
2017-08-05 10:03:56 +02:00
|
|
|
|
}
|