commit
d6577e5e0b
|
@ -27,7 +27,6 @@ import static org.schabi.newpipe.extractor.utils.Utils.HTTPS;
|
|||
import static org.schabi.newpipe.extractor.utils.Utils.UTF_8;
|
||||
import static org.schabi.newpipe.extractor.utils.Utils.getStringResultFromRegexArray;
|
||||
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
|
||||
|
||||
import static java.util.Collections.singletonList;
|
||||
|
||||
import com.grack.nanojson.JsonArray;
|
||||
|
@ -234,28 +233,6 @@ public final class YoutubeParsingHelper {
|
|||
|
||||
private static Random numberGenerator = new SecureRandom();
|
||||
|
||||
/**
|
||||
* {@code PENDING+} means that the user did not yet submit their choices.
|
||||
*
|
||||
* <p>
|
||||
* Therefore, YouTube & Google should not track the user, because they did not give consent.
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* The three digits at the end can be random, but are required.
|
||||
* </p>
|
||||
*/
|
||||
private static final String CONSENT_COOKIE_VALUE = "PENDING+";
|
||||
|
||||
/**
|
||||
* YouTube {@code CONSENT} cookie.
|
||||
*
|
||||
* <p>
|
||||
* Should prevent redirect to {@code consent.youtube.com}.
|
||||
* </p>
|
||||
*/
|
||||
private static final String CONSENT_COOKIE = "CONSENT=" + CONSENT_COOKIE_VALUE;
|
||||
|
||||
private static final String FEED_BASE_CHANNEL_ID =
|
||||
"https://www.youtube.com/feeds/videos.xml?channel_id=";
|
||||
private static final String FEED_BASE_USER = "https://www.youtube.com/feeds/videos.xml?user=";
|
||||
|
@ -265,6 +242,23 @@ public final class YoutubeParsingHelper {
|
|||
private static final Pattern C_ANDROID_PATTERN = Pattern.compile("&c=ANDROID");
|
||||
private static final Pattern C_IOS_PATTERN = Pattern.compile("&c=IOS");
|
||||
|
||||
/**
|
||||
* Determines how the consent cookie (that is required for YouTube) will be generated.
|
||||
*
|
||||
* <p>
|
||||
* {@code false} (default) will use {@code PENDING+}.
|
||||
* {@code true} will use {@code YES+}.
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* Setting this value to <code>true</code> is currently needed if you want to watch
|
||||
* Mix Playlists in some countries (EU).
|
||||
* </p>
|
||||
*
|
||||
* @see #generateConsentCookie()
|
||||
*/
|
||||
private static boolean consentAccepted = false;
|
||||
|
||||
private static boolean isGoogleURL(final String url) {
|
||||
final String cachedUrl = extractCachedUrlIfNeeded(url);
|
||||
try {
|
||||
|
@ -1378,7 +1372,6 @@ public final class YoutubeParsingHelper {
|
|||
|
||||
/**
|
||||
* Add the <code>CONSENT</code> cookie to prevent redirect to <code>consent.youtube.com</code>
|
||||
* @see #CONSENT_COOKIE
|
||||
* @param headers the headers which should be completed
|
||||
*/
|
||||
public static void addCookieHeader(@Nonnull final Map<String, List<String>> headers) {
|
||||
|
@ -1391,8 +1384,13 @@ public final class YoutubeParsingHelper {
|
|||
|
||||
@Nonnull
|
||||
public static String generateConsentCookie() {
|
||||
final int statusCode = 100 + numberGenerator.nextInt(900);
|
||||
return CONSENT_COOKIE + statusCode;
|
||||
return "CONSENT=" + (isConsentAccepted()
|
||||
// YES+ means that the user did submit their choices and allows tracking.
|
||||
? "YES+"
|
||||
// PENDING+ means that the user did not yet submit their choices.
|
||||
// YT & Google should not track the user, because they did not give consent.
|
||||
// The three digits at the end can be random, but are required.
|
||||
: "PENDING+" + (100 + numberGenerator.nextInt(900)));
|
||||
}
|
||||
|
||||
public static String extractCookieValue(final String cookieName,
|
||||
|
@ -1612,16 +1610,6 @@ public final class YoutubeParsingHelper {
|
|||
return false;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
public static String unescapeDocument(@Nonnull final String doc) {
|
||||
return doc
|
||||
.replaceAll("\\\\x22", "\"")
|
||||
.replaceAll("\\\\x7b", "{")
|
||||
.replaceAll("\\\\x7d", "}")
|
||||
.replaceAll("\\\\x5b", "[")
|
||||
.replaceAll("\\\\x5d", "]");
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a content playback nonce (also called {@code cpn}), sent by YouTube clients in
|
||||
* playback requests (and also for some clients, in the player request body).
|
||||
|
@ -1692,4 +1680,18 @@ public final class YoutubeParsingHelper {
|
|||
public static boolean isIosStreamingUrl(@Nonnull final String url) {
|
||||
return Parser.isMatch(C_IOS_PATTERN, url);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see #consentAccepted
|
||||
*/
|
||||
public static void setConsentAccepted(final boolean accepted) {
|
||||
consentAccepted = accepted;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see #consentAccepted
|
||||
*/
|
||||
public static boolean isConsentAccepted() {
|
||||
return consentAccepted;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,12 +5,13 @@ import org.schabi.newpipe.extractor.utils.JavaScript;
|
|||
import org.schabi.newpipe.extractor.utils.Parser;
|
||||
import org.schabi.newpipe.extractor.utils.StringUtils;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
/**
|
||||
* YouTube's streaming URLs of HTML5 clients are protected with a cipher, which modifies their
|
||||
* {@code n} query parameter.
|
||||
|
@ -128,16 +129,25 @@ public final class YoutubeThrottlingDecrypter {
|
|||
private static String parseWithParenthesisMatching(final String playerJsCode,
|
||||
final String functionName) {
|
||||
final String functionBase = functionName + "=function";
|
||||
return functionBase + StringUtils.matchToClosingParenthesis(playerJsCode, functionBase)
|
||||
+ ";";
|
||||
return validateFunction(functionBase
|
||||
+ StringUtils.matchToClosingParenthesis(playerJsCode, functionBase)
|
||||
+ ";");
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
private static String parseWithRegex(final String playerJsCode, final String functionName)
|
||||
throws Parser.RegexException {
|
||||
final Pattern functionPattern = Pattern.compile(functionName + "=function(.*?}};)\n",
|
||||
final Pattern functionPattern = Pattern.compile(functionName + "=function(.*?};)\n",
|
||||
Pattern.DOTALL);
|
||||
return "function " + functionName + Parser.matchGroup1(functionPattern, playerJsCode);
|
||||
return validateFunction("function "
|
||||
+ functionName
|
||||
+ Parser.matchGroup1(functionPattern, playerJsCode));
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
private static String validateFunction(@Nonnull final String function) {
|
||||
JavaScript.compileOrThrow(function);
|
||||
return function;
|
||||
}
|
||||
|
||||
private static boolean containsNParam(final String url) {
|
||||
|
|
|
@ -2,7 +2,7 @@ package org.schabi.newpipe.extractor.services.youtube.extractors;
|
|||
|
||||
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.DISABLE_PRETTY_PRINT_PARAMETER;
|
||||
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.YOUTUBEI_V1_URL;
|
||||
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.addClientInfoHeaders;
|
||||
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.addYouTubeHeaders;
|
||||
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.extractCookieValue;
|
||||
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.extractPlaylistTypeFromPlaylistId;
|
||||
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getKey;
|
||||
|
@ -23,6 +23,7 @@ import org.schabi.newpipe.extractor.Page;
|
|||
import org.schabi.newpipe.extractor.StreamingService;
|
||||
import org.schabi.newpipe.extractor.downloader.Downloader;
|
||||
import org.schabi.newpipe.extractor.downloader.Response;
|
||||
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
|
||||
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
||||
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
||||
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
|
||||
|
@ -89,16 +90,26 @@ public class YoutubeMixPlaylistExtractor extends PlaylistExtractor {
|
|||
final byte[] body = JsonWriter.string(jsonBody.done()).getBytes(StandardCharsets.UTF_8);
|
||||
|
||||
final Map<String, List<String>> headers = new HashMap<>();
|
||||
addClientInfoHeaders(headers);
|
||||
// Cookie is required due to consent
|
||||
addYouTubeHeaders(headers);
|
||||
|
||||
final Response response = getDownloader().post(YOUTUBEI_V1_URL + "next?key=" + getKey()
|
||||
+ DISABLE_PRETTY_PRINT_PARAMETER, headers, body, localization);
|
||||
|
||||
initialData = JsonUtils.toJsonObject(getValidJsonResponseBody(response));
|
||||
playlistData = initialData.getObject("contents").getObject("twoColumnWatchNextResults")
|
||||
.getObject("playlist").getObject("playlist");
|
||||
playlistData = initialData
|
||||
.getObject("contents")
|
||||
.getObject("twoColumnWatchNextResults")
|
||||
.getObject("playlist")
|
||||
.getObject("playlist");
|
||||
if (isNullOrEmpty(playlistData)) {
|
||||
throw new ExtractionException("Could not get playlistData");
|
||||
final ExtractionException ex = new ExtractionException("Could not get playlistData");
|
||||
if (!YoutubeParsingHelper.isConsentAccepted()) {
|
||||
throw new ContentNotAvailableException(
|
||||
"Consent is required in some countries to view Mix playlists",
|
||||
ex);
|
||||
}
|
||||
throw ex;
|
||||
}
|
||||
cookieValue = extractCookieValue(COOKIE_NAME, response);
|
||||
}
|
||||
|
@ -212,7 +223,8 @@ public class YoutubeMixPlaylistExtractor extends PlaylistExtractor {
|
|||
|
||||
final StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId());
|
||||
final Map<String, List<String>> headers = new HashMap<>();
|
||||
addClientInfoHeaders(headers);
|
||||
// Cookie is required due to consent
|
||||
addYouTubeHeaders(headers);
|
||||
|
||||
final Response response = getDownloader().post(page.getUrl(), headers, page.getBody(),
|
||||
getExtractorLocalization());
|
||||
|
|
|
@ -22,6 +22,7 @@ import com.grack.nanojson.JsonWriter;
|
|||
|
||||
import org.schabi.newpipe.extractor.InfoItem;
|
||||
import org.schabi.newpipe.extractor.MetaInfo;
|
||||
import org.schabi.newpipe.extractor.MultiInfoItemsCollector;
|
||||
import org.schabi.newpipe.extractor.Page;
|
||||
import org.schabi.newpipe.extractor.StreamingService;
|
||||
import org.schabi.newpipe.extractor.downloader.Downloader;
|
||||
|
@ -31,7 +32,6 @@ import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
|
|||
import org.schabi.newpipe.extractor.linkhandler.SearchQueryHandler;
|
||||
import org.schabi.newpipe.extractor.localization.DateWrapper;
|
||||
import org.schabi.newpipe.extractor.localization.TimeAgoParser;
|
||||
import org.schabi.newpipe.extractor.MultiInfoItemsCollector;
|
||||
import org.schabi.newpipe.extractor.search.SearchExtractor;
|
||||
import org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper;
|
||||
import org.schabi.newpipe.extractor.utils.JsonUtils;
|
||||
|
@ -43,6 +43,7 @@ import java.util.Collections;
|
|||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
@ -133,55 +134,52 @@ public class YoutubeMusicSearchExtractor extends SearchExtractor {
|
|||
}
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public String getUrl() throws ParsingException {
|
||||
return super.getUrl();
|
||||
private List<JsonObject> getItemSectionRendererContents() {
|
||||
return initialData
|
||||
.getObject("contents")
|
||||
.getObject("tabbedSearchResultsRenderer")
|
||||
.getArray("tabs")
|
||||
.getObject(0)
|
||||
.getObject("tabRenderer")
|
||||
.getObject("content")
|
||||
.getObject("sectionListRenderer")
|
||||
.getArray("contents")
|
||||
.stream()
|
||||
.filter(JsonObject.class::isInstance)
|
||||
.map(JsonObject.class::cast)
|
||||
.map(c -> c.getObject("itemSectionRenderer"))
|
||||
.filter(isr -> !isr.isEmpty())
|
||||
.map(isr -> isr
|
||||
.getArray("contents")
|
||||
.getObject(0))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public String getSearchSuggestion() throws ParsingException {
|
||||
final JsonObject itemSectionRenderer = JsonUtils.getArray(JsonUtils.getArray(initialData,
|
||||
"contents.tabbedSearchResultsRenderer.tabs").getObject(0),
|
||||
"tabRenderer.content.sectionListRenderer.contents")
|
||||
.getObject(0)
|
||||
.getObject("itemSectionRenderer");
|
||||
if (itemSectionRenderer.isEmpty()) {
|
||||
return "";
|
||||
for (final JsonObject obj : getItemSectionRendererContents()) {
|
||||
final JsonObject didYouMeanRenderer = obj
|
||||
.getObject("didYouMeanRenderer");
|
||||
final JsonObject showingResultsForRenderer = obj
|
||||
.getObject("showingResultsForRenderer");
|
||||
|
||||
if (!didYouMeanRenderer.isEmpty()) {
|
||||
return getTextFromObject(didYouMeanRenderer.getObject("correctedQuery"));
|
||||
} else if (!showingResultsForRenderer.isEmpty()) {
|
||||
return JsonUtils.getString(showingResultsForRenderer,
|
||||
"correctedQueryEndpoint.searchEndpoint.query");
|
||||
}
|
||||
}
|
||||
|
||||
final JsonObject didYouMeanRenderer = itemSectionRenderer.getArray("contents")
|
||||
.getObject(0).getObject("didYouMeanRenderer");
|
||||
final JsonObject showingResultsForRenderer = itemSectionRenderer.getArray("contents")
|
||||
.getObject(0)
|
||||
.getObject("showingResultsForRenderer");
|
||||
|
||||
if (!didYouMeanRenderer.isEmpty()) {
|
||||
return getTextFromObject(didYouMeanRenderer.getObject("correctedQuery"));
|
||||
} else if (!showingResultsForRenderer.isEmpty()) {
|
||||
return JsonUtils.getString(showingResultsForRenderer,
|
||||
"correctedQueryEndpoint.searchEndpoint.query");
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCorrectedSearch() throws ParsingException {
|
||||
final JsonObject itemSectionRenderer = JsonUtils.getArray(JsonUtils.getArray(initialData,
|
||||
"contents.tabbedSearchResultsRenderer.tabs").getObject(0),
|
||||
"tabRenderer.content.sectionListRenderer.contents")
|
||||
.getObject(0)
|
||||
.getObject("itemSectionRenderer");
|
||||
if (itemSectionRenderer.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
final JsonObject firstContent = itemSectionRenderer.getArray("contents").getObject(0);
|
||||
|
||||
return firstContent.has("didYouMeanRenderer")
|
||||
|| firstContent.has("showingResultsForRenderer");
|
||||
return getItemSectionRendererContents()
|
||||
.stream()
|
||||
.anyMatch(obj -> obj.has("showingResultsForRenderer"));
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
|
|
|
@ -9,6 +9,18 @@ public final class JavaScript {
|
|||
private JavaScript() {
|
||||
}
|
||||
|
||||
public static void compileOrThrow(final String function) {
|
||||
try {
|
||||
final Context context = Context.enter();
|
||||
context.setOptimizationLevel(-1);
|
||||
|
||||
// If it doesn't compile it throws an exception here
|
||||
context.compileString(function, null, 1, null);
|
||||
} finally {
|
||||
Context.exit();
|
||||
}
|
||||
}
|
||||
|
||||
public static String run(final String function,
|
||||
final String functionName,
|
||||
final String... parameters) {
|
||||
|
|
|
@ -36,7 +36,7 @@ public class BandcampSearchExtractorTest {
|
|||
* the accordingly named song by Zach Benson
|
||||
*/
|
||||
@Test
|
||||
public void testStreamSearch() throws ExtractionException, IOException {
|
||||
void testStreamSearch() throws ExtractionException, IOException {
|
||||
final SearchExtractor extractor = Bandcamp.getSearchExtractor("best friend's basement");
|
||||
|
||||
final ListExtractor.InfoItemsPage<InfoItem> page = extractor.getInitialPage();
|
||||
|
@ -54,7 +54,7 @@ public class BandcampSearchExtractorTest {
|
|||
* Tests whether searching bandcamp for "C418" returns the artist's profile
|
||||
*/
|
||||
@Test
|
||||
public void testChannelSearch() throws ExtractionException, IOException {
|
||||
void testChannelSearch() throws ExtractionException, IOException {
|
||||
final SearchExtractor extractor = Bandcamp.getSearchExtractor("C418");
|
||||
final InfoItem c418 = extractor.getInitialPage()
|
||||
.getItems().get(0);
|
||||
|
@ -71,19 +71,21 @@ public class BandcampSearchExtractorTest {
|
|||
* Tests whether searching bandcamp for "minecraft volume alpha" returns the corresponding album
|
||||
*/
|
||||
@Test
|
||||
public void testAlbumSearch() throws ExtractionException, IOException {
|
||||
void testAlbumSearch() throws ExtractionException, IOException {
|
||||
final SearchExtractor extractor = Bandcamp.getSearchExtractor("minecraft volume alpha");
|
||||
InfoItem minecraft = extractor.getInitialPage()
|
||||
.getItems().get(0);
|
||||
|
||||
// Minecraft volume alpha should be the first result, no?
|
||||
assertEquals("Minecraft - Volume Alpha", minecraft.getName());
|
||||
assertEquals("Minecraft: Volume Alpha (cover)", minecraft.getName());
|
||||
assertTrue(minecraft.getThumbnailUrl().endsWith(".jpg"));
|
||||
assertTrue(minecraft.getThumbnailUrl().contains("f4.bcbits.com/img/"));
|
||||
assertEquals("https://c418.bandcamp.com/album/minecraft-volume-alpha", minecraft.getUrl());
|
||||
assertEquals(
|
||||
"https://chromacat248.bandcamp.com/album/minecraft-volume-alpha-cover",
|
||||
minecraft.getUrl());
|
||||
|
||||
// Verify that playlist tracks counts get extracted correctly
|
||||
assertEquals(24, ((PlaylistInfoItem) minecraft).getStreamCount());
|
||||
assertEquals(3, ((PlaylistInfoItem) minecraft).getStreamCount());
|
||||
|
||||
}
|
||||
|
||||
|
@ -91,7 +93,7 @@ public class BandcampSearchExtractorTest {
|
|||
* Tests searches with multiple pages
|
||||
*/
|
||||
@Test
|
||||
public void testMultiplePages() throws ExtractionException, IOException {
|
||||
void testMultiplePages() throws ExtractionException, IOException {
|
||||
// A query practically guaranteed to have the maximum amount of pages
|
||||
final SearchExtractor extractor = Bandcamp.getSearchExtractor("e");
|
||||
|
||||
|
|
|
@ -20,55 +20,60 @@ public class PeertubePlaylistExtractorTest {
|
|||
@BeforeAll
|
||||
public static void setUp() throws Exception {
|
||||
NewPipe.init(DownloaderTestImpl.getInstance());
|
||||
extractor = (PeertubePlaylistExtractor) PeerTube
|
||||
.getPlaylistExtractor("https://framatube.org/videos/watch/playlist/96b0ee2b-a5a7-4794-8769-58d8ccb79ab7");
|
||||
extractor = (PeertubePlaylistExtractor) PeerTube.getPlaylistExtractor(
|
||||
"https://framatube.org/videos/watch/playlist/96b0ee2b-a5a7-4794-8769-58d8ccb79ab7");
|
||||
extractor.fetchPage();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetName() throws ParsingException {
|
||||
void testGetName() throws ParsingException {
|
||||
assertEquals("Shocking !", extractor.getName());
|
||||
}
|
||||
|
||||
@Test
|
||||
@Disabled("URL changes with every request")
|
||||
public void testGetThumbnailUrl() throws ParsingException {
|
||||
assertEquals("https://framatube.org/static/thumbnails/playlist-96b0ee2b-a5a7-4794-8769-58d8ccb79ab7.jpg", extractor.getThumbnailUrl());
|
||||
void testGetThumbnailUrl() throws ParsingException {
|
||||
assertEquals(
|
||||
"https://framatube.org/static/thumbnails/playlist-96b0ee2b-a5a7-4794-8769-58d8ccb79ab7.jpg",
|
||||
extractor.getThumbnailUrl());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetUploaderUrl() throws ParsingException {
|
||||
void testGetUploaderUrl() throws ParsingException {
|
||||
assertEquals("https://skeptikon.fr/accounts/metadechoc", extractor.getUploaderUrl());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetUploaderAvatarUrl() throws ParsingException {
|
||||
assertEquals("https://framatube.org/lazy-static/avatars/c6801ff9-cb49-42e6-b2db-3db623248115.jpg", extractor.getUploaderAvatarUrl());
|
||||
void testGetUploaderAvatarUrl() throws ParsingException {
|
||||
assertEquals(
|
||||
"https://framatube.org/lazy-static/avatars/cd0f781d-0287-4be2-94f1-24cd732337b2.jpg",
|
||||
extractor.getUploaderAvatarUrl());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetUploaderName() throws ParsingException {
|
||||
void testGetUploaderName() throws ParsingException {
|
||||
assertEquals("Méta de Choc", extractor.getUploaderName());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetStreamCount() throws ParsingException {
|
||||
void testGetStreamCount() throws ParsingException {
|
||||
ExtractorAsserts.assertGreaterOrEqual(39, extractor.getStreamCount());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetSubChannelUrl() throws ParsingException {
|
||||
void testGetSubChannelUrl() throws ParsingException {
|
||||
assertEquals("https://skeptikon.fr/video-channels/metadechoc_channel", extractor.getSubChannelUrl());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetSubChannelName() throws ParsingException {
|
||||
void testGetSubChannelName() throws ParsingException {
|
||||
assertEquals("SHOCKING !", extractor.getSubChannelName());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetSubChannelAvatarUrl() throws ParsingException {
|
||||
assertEquals("https://framatube.org/lazy-static/avatars/e801ccce-8694-4309-b0ab-e6f0e552ef77.png",
|
||||
void testGetSubChannelAvatarUrl() throws ParsingException {
|
||||
assertEquals(
|
||||
"https://framatube.org/lazy-static/avatars/637753af-fcf2-4b61-88f9-b9857c953457.png",
|
||||
extractor.getSubChannelAvatarUrl());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,9 @@ package org.schabi.newpipe.extractor.services.soundcloud;
|
|||
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.CsvSource;
|
||||
import org.junit.jupiter.params.provider.ValueSource;
|
||||
import org.schabi.newpipe.downloader.DownloaderTestImpl;
|
||||
import org.schabi.newpipe.extractor.NewPipe;
|
||||
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
||||
|
@ -25,57 +28,54 @@ public class SoundcloudStreamLinkHandlerFactoryTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void getIdWithNullAsUrl() {
|
||||
void getIdWithNullAsUrl() {
|
||||
assertThrows(IllegalArgumentException.class, () -> linkHandler.fromUrl(null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getIdForInvalidUrls() {
|
||||
List<String> invalidUrls = new ArrayList<>(50);
|
||||
invalidUrls.add("https://soundcloud.com/liluzivert/t.e.s.t");
|
||||
invalidUrls.add("https://soundcloud.com/liluzivert/tracks");
|
||||
invalidUrls.add("https://soundcloud.com/");
|
||||
for (String invalidUrl : invalidUrls) {
|
||||
Throwable exception = null;
|
||||
try {
|
||||
linkHandler.fromUrl(invalidUrl).getId();
|
||||
} catch (ParsingException e) {
|
||||
exception = e;
|
||||
}
|
||||
if (exception == null) {
|
||||
fail("Expected ParsingException for url: " + invalidUrl);
|
||||
}
|
||||
}
|
||||
@ParameterizedTest
|
||||
@ValueSource(strings = {
|
||||
"https://soundcloud.com/liluzivert/t.e.s.t",
|
||||
"https://soundcloud.com/liluzivert/tracks",
|
||||
"https://soundcloud.com/"
|
||||
})
|
||||
void getIdForInvalidUrls(final String invalidUrl) {
|
||||
assertThrows(ParsingException.class, () -> linkHandler.fromUrl(invalidUrl).getId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getId() throws Exception {
|
||||
assertEquals("309689103", linkHandler.fromUrl("https://soundcloud.com/liluzivert/15-ysl").getId());
|
||||
assertEquals("309689082", linkHandler.fromUrl("https://www.soundcloud.com/liluzivert/15-luv-scars-ko").getId());
|
||||
assertEquals("309689035", linkHandler.fromUrl("http://soundcloud.com/liluzivert/15-boring-shit").getId());
|
||||
assertEquals("259273264", linkHandler.fromUrl("https://soundcloud.com/liluzivert/ps-qs-produced-by-don-cannon/").getId());
|
||||
assertEquals("294488599", linkHandler.fromUrl("http://www.soundcloud.com/liluzivert/secure-the-bag-produced-by-glohan-beats").getId());
|
||||
assertEquals("294488438", linkHandler.fromUrl("HtTpS://sOuNdClOuD.cOm/LiLuZiVeRt/In-O4-pRoDuCeD-bY-dP-bEaTz").getId());
|
||||
assertEquals("294488147", linkHandler.fromUrl("https://soundcloud.com/liluzivert/fresh-produced-by-zaytoven#t=69").getId());
|
||||
assertEquals("294487876", linkHandler.fromUrl("https://soundcloud.com/liluzivert/threesome-produced-by-zaytoven#t=1:09").getId());
|
||||
assertEquals("294487684", linkHandler.fromUrl("https://soundcloud.com/liluzivert/blonde-brigitte-produced-manny-fresh#t=1:9").getId());
|
||||
assertEquals("294487428", linkHandler.fromUrl("https://soundcloud.com/liluzivert/today-produced-by-c-note#t=1m9s").getId());
|
||||
assertEquals("294487157", linkHandler.fromUrl("https://soundcloud.com/liluzivert/changed-my-phone-produced-by-c-note#t=1m09s").getId());
|
||||
assertEquals("44556776", linkHandler.fromUrl("https://soundcloud.com/kechuspider-sets-1/last-days").getId());
|
||||
@ParameterizedTest
|
||||
@CsvSource(value = {
|
||||
"309689103,https://soundcloud.com/liluzivert/15-ysl",
|
||||
"309689082,https://www.soundcloud.com/liluzivert/15-luv-scars-ko",
|
||||
"309689035,http://soundcloud.com/liluzivert/15-boring-shit",
|
||||
"259273264,https://soundcloud.com/liluzivert/ps-qs-produced-by-don-cannon/",
|
||||
"294488599,http://www.soundcloud.com/liluzivert/secure-the-bag-produced-by-glohan-beats",
|
||||
"245710200,HtTpS://sOuNdClOuD.cOm/lIeuTeNaNt_rAe/bOtS-wAs-wOlLeN-wIr-tRinKeN",
|
||||
"294488147,https://soundcloud.com/liluzivert/fresh-produced-by-zaytoven#t=69",
|
||||
"294487876,https://soundcloud.com/liluzivert/threesome-produced-by-zaytoven#t=1:09",
|
||||
"294487684,https://soundcloud.com/liluzivert/blonde-brigitte-produced-manny-fresh#t=1:9",
|
||||
"294487428,https://soundcloud.com/liluzivert/today-produced-by-c-note#t=1m9s",
|
||||
"294487157,https://soundcloud.com/liluzivert/changed-my-phone-produced-by-c-note#t=1m09s",
|
||||
"44556776,https://soundcloud.com/kechuspider-sets-1/last-days"
|
||||
})
|
||||
void getId(final String expectedId, final String url) throws ParsingException {
|
||||
assertEquals(expectedId, linkHandler.fromUrl(url).getId());
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testAcceptUrl() throws ParsingException {
|
||||
assertTrue(linkHandler.acceptUrl("https://soundcloud.com/liluzivert/15-ysl"));
|
||||
assertTrue(linkHandler.acceptUrl("https://www.soundcloud.com/liluzivert/15-luv-scars-ko"));
|
||||
assertTrue(linkHandler.acceptUrl("http://soundcloud.com/liluzivert/15-boring-shit"));
|
||||
assertTrue(linkHandler.acceptUrl("http://www.soundcloud.com/liluzivert/secure-the-bag-produced-by-glohan-beats"));
|
||||
assertTrue(linkHandler.acceptUrl("HtTpS://sOuNdClOuD.cOm/LiLuZiVeRt/In-O4-pRoDuCeD-bY-dP-bEaTz"));
|
||||
assertTrue(linkHandler.acceptUrl("https://soundcloud.com/liluzivert/fresh-produced-by-zaytoven#t=69"));
|
||||
assertTrue(linkHandler.acceptUrl("https://soundcloud.com/liluzivert/threesome-produced-by-zaytoven#t=1:09"));
|
||||
assertTrue(linkHandler.acceptUrl("https://soundcloud.com/liluzivert/blonde-brigitte-produced-manny-fresh#t=1:9"));
|
||||
assertTrue(linkHandler.acceptUrl("https://soundcloud.com/liluzivert/today-produced-by-c-note#t=1m9s"));
|
||||
assertTrue(linkHandler.acceptUrl("https://soundcloud.com/liluzivert/changed-my-phone-produced-by-c-note#t=1m09s"));
|
||||
@ParameterizedTest
|
||||
@ValueSource(strings = {
|
||||
"https://soundcloud.com/liluzivert/15-ysl",
|
||||
"https://www.soundcloud.com/liluzivert/15-luv-scars-ko",
|
||||
"http://soundcloud.com/liluzivert/15-boring-shit",
|
||||
"http://www.soundcloud.com/liluzivert/secure-the-bag-produced-by-glohan-beats",
|
||||
"HtTpS://sOuNdClOuD.cOm/LiLuZiVeRt/In-O4-pRoDuCeD-bY-dP-bEaTz",
|
||||
"https://soundcloud.com/liluzivert/fresh-produced-by-zaytoven#t=69",
|
||||
"https://soundcloud.com/liluzivert/threesome-produced-by-zaytoven#t=1:09",
|
||||
"https://soundcloud.com/liluzivert/blonde-brigitte-produced-manny-fresh#t=1:9",
|
||||
"https://soundcloud.com/liluzivert/today-produced-by-c-note#t=1m9s",
|
||||
"https://soundcloud.com/liluzivert/changed-my-phone-produced-by-c-note#t=1m09s"
|
||||
})
|
||||
void testAcceptUrl(final String url) throws ParsingException {
|
||||
assertTrue(linkHandler.acceptUrl(url));
|
||||
}
|
||||
}
|
|
@ -24,7 +24,7 @@ public class YoutubeCommentsLinkHandlerFactoryTest {
|
|||
|
||||
@Test
|
||||
public void getIdWithNullAsUrl() {
|
||||
assertThrows(IllegalArgumentException.class, () -> linkHandler.fromId(null));
|
||||
assertThrows(NullPointerException.class, () -> linkHandler.fromId(null));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -6,7 +6,10 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
|
|||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
import static org.schabi.newpipe.extractor.ExtractorAsserts.assertIsSecureUrl;
|
||||
import static org.schabi.newpipe.extractor.ServiceList.YouTube;
|
||||
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.*;
|
||||
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.DISABLE_PRETTY_PRINT_PARAMETER;
|
||||
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.YOUTUBEI_V1_URL;
|
||||
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getKey;
|
||||
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.prepareDesktopJsonBuilder;
|
||||
|
||||
import com.grack.nanojson.JsonWriter;
|
||||
|
||||
|
@ -39,12 +42,13 @@ public class YoutubeMixPlaylistExtractorTest {
|
|||
private static YoutubeMixPlaylistExtractor extractor;
|
||||
|
||||
public static class Mix {
|
||||
private static final String VIDEO_ID = "QqsLTNkzvaY";
|
||||
private static final String VIDEO_ID = "FAqYW76GLPA";
|
||||
private static final String VIDEO_TITLE = "Mix – ";
|
||||
|
||||
@BeforeAll
|
||||
public static void setUp() throws Exception {
|
||||
YoutubeTestsUtils.ensureStateless();
|
||||
YoutubeParsingHelper.setConsentAccepted(true);
|
||||
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "mix"));
|
||||
dummyCookie.put(YoutubeMixPlaylistExtractor.COOKIE_NAME, "whatever");
|
||||
extractor = (YoutubeMixPlaylistExtractor) YouTube
|
||||
|
@ -132,14 +136,15 @@ public class YoutubeMixPlaylistExtractorTest {
|
|||
|
||||
public static class MixWithIndex {
|
||||
|
||||
private static final String VIDEO_ID = "QqsLTNkzvaY";
|
||||
private static final String VIDEO_ID = "FAqYW76GLPA";
|
||||
private static final String VIDEO_TITLE = "Mix – ";
|
||||
private static final int INDEX = 7; // YT starts the index with 1...
|
||||
private static final String VIDEO_ID_AT_INDEX = "xAUJYP8tnRE";
|
||||
private static final String VIDEO_ID_AT_INDEX = "F90Cw4l-8NY";
|
||||
|
||||
@BeforeAll
|
||||
public static void setUp() throws Exception {
|
||||
YoutubeTestsUtils.ensureStateless();
|
||||
YoutubeParsingHelper.setConsentAccepted(true);
|
||||
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "mixWithIndex"));
|
||||
dummyCookie.put(YoutubeMixPlaylistExtractor.COOKIE_NAME, "whatever");
|
||||
extractor = (YoutubeMixPlaylistExtractor) YouTube
|
||||
|
@ -221,11 +226,12 @@ public class YoutubeMixPlaylistExtractorTest {
|
|||
}
|
||||
|
||||
public static class MyMix {
|
||||
private static final String VIDEO_ID = "_AzeUSL9lZc";
|
||||
private static final String VIDEO_ID = "YVkUvmDQ3HY";
|
||||
|
||||
@BeforeAll
|
||||
public static void setUp() throws Exception {
|
||||
YoutubeTestsUtils.ensureStateless();
|
||||
YoutubeParsingHelper.setConsentAccepted(true);
|
||||
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "myMix"));
|
||||
dummyCookie.put(YoutubeMixPlaylistExtractor.COOKIE_NAME, "whatever");
|
||||
extractor = (YoutubeMixPlaylistExtractor) YouTube
|
||||
|
@ -249,7 +255,7 @@ public class YoutubeMixPlaylistExtractorTest {
|
|||
void getThumbnailUrl() throws Exception {
|
||||
final String thumbnailUrl = extractor.getThumbnailUrl();
|
||||
assertIsSecureUrl(thumbnailUrl);
|
||||
assertTrue(thumbnailUrl.startsWith("https://i.ytimg.com/vi/_AzeUSL9lZc"));
|
||||
assertTrue(thumbnailUrl.startsWith("https://i.ytimg.com/vi/" + VIDEO_ID));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -316,6 +322,7 @@ public class YoutubeMixPlaylistExtractorTest {
|
|||
@BeforeAll
|
||||
public static void setUp() throws IOException {
|
||||
YoutubeTestsUtils.ensureStateless();
|
||||
YoutubeParsingHelper.setConsentAccepted(true);
|
||||
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "invalid"));
|
||||
dummyCookie.put(YoutubeMixPlaylistExtractor.COOKIE_NAME, "whatever");
|
||||
}
|
||||
|
@ -350,6 +357,7 @@ public class YoutubeMixPlaylistExtractorTest {
|
|||
@BeforeAll
|
||||
public static void setUp() throws Exception {
|
||||
YoutubeTestsUtils.ensureStateless();
|
||||
YoutubeParsingHelper.setConsentAccepted(true);
|
||||
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "channelMix"));
|
||||
dummyCookie.put(YoutubeMixPlaylistExtractor.COOKIE_NAME, "whatever");
|
||||
extractor = (YoutubeMixPlaylistExtractor) YouTube
|
||||
|
@ -414,6 +422,7 @@ public class YoutubeMixPlaylistExtractorTest {
|
|||
@BeforeAll
|
||||
public static void setUp() throws Exception {
|
||||
YoutubeTestsUtils.ensureStateless();
|
||||
YoutubeParsingHelper.setConsentAccepted(true);
|
||||
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "genreMix"));
|
||||
dummyCookie.put(YoutubeMixPlaylistExtractor.COOKIE_NAME, "whatever");
|
||||
extractor = (YoutubeMixPlaylistExtractor) YouTube
|
||||
|
|
|
@ -2,6 +2,9 @@ package org.schabi.newpipe.extractor.services.youtube;
|
|||
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.CsvSource;
|
||||
import org.junit.jupiter.params.provider.ValueSource;
|
||||
import org.schabi.newpipe.downloader.DownloaderTestImpl;
|
||||
import org.schabi.newpipe.extractor.NewPipe;
|
||||
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
||||
|
@ -22,92 +25,110 @@ public class YoutubePlaylistLinkHandlerFactoryTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void getIdWithNullAsUrl() {
|
||||
assertThrows(IllegalArgumentException.class, () -> linkHandler.fromId(null));
|
||||
void getIdWithNullAsUrl() {
|
||||
assertThrows(NullPointerException.class, () -> linkHandler.fromId(null));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@CsvSource({
|
||||
"PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC,https://www.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV,https://www.youtube.com/playlist?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV",
|
||||
"PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC,https://www.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC&t=100",
|
||||
"PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC,https://WWW.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC&t=100",
|
||||
"PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC,HTTPS://www.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC&t=100",
|
||||
"PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC,https://www.youtube.com/watch?v=0JFM3PRZH-k&index=8&list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC,http://www.youtube.com/watch?v=0JFM3PRZH-k&index=8&list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC,https://m.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC,https://youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC,www.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV,www.youtube.com/playlist?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV",
|
||||
"OLAK5uy_lEBUW9iTwqf0IlYPxZ8LrzpgqjAHZgZpM,https://music.youtube.com/playlist?list=OLAK5uy_lEBUW9iTwqf0IlYPxZ8LrzpgqjAHZgZpM"
|
||||
})
|
||||
void getIdfromYt(final String expectedId, final String url) throws ParsingException {
|
||||
assertEquals(expectedId, linkHandler.fromUrl(url).getId());
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(strings = {
|
||||
"https://www.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"https://www.youtube.com/playlist?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV",
|
||||
"https://WWW.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dCI",
|
||||
"HTTPS://www.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"https://www.youtube.com/watch?v=0JFM3PRZH-k&index=8&list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"http://www.youtube.com/watch?v=0JFM3PRZH-k&index=8&list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"https://m.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"https://youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"www.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"www.youtube.com/playlist?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV",
|
||||
"https://music.youtube.com/playlist?list=OLAK5uy_lEBUW9iTwqf0IlYPxZ8LrzpgqjAHZgZpM",
|
||||
"https://www.youtube.com/playlist?list=RDCLAK5uy_ly6s4irLuZAcjEDwJmqcA_UtSipMyGgbQ", // YouTube Music playlist
|
||||
"https://www.youtube.com/watch?v=2kZVEUGLgy4&list=RDdoEcQv1wlsI&index=2, " // YouTube Mix
|
||||
})
|
||||
void acceptYtUrl(final String url) throws ParsingException {
|
||||
assertTrue(linkHandler.acceptUrl(url));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(strings = {
|
||||
"https://www.youtube.com/feed/trending?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV",
|
||||
"https://www.youtube.com/feed/subscriptions?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV",
|
||||
"ftp://www.youtube.com/feed/trending?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV",
|
||||
"www.youtube.com:22/feed/trending?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV",
|
||||
"youtube . com/feed/trending?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV",
|
||||
"?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV"
|
||||
})
|
||||
void deniesInvalidYtUrl(final String url) throws ParsingException {
|
||||
assertFalse(linkHandler.acceptUrl(url));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(strings = {
|
||||
"https://www.invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"https://www.invidio.us/playlist?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV",
|
||||
"https://WWW.invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dCI",
|
||||
"HTTPS://www.invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"https://www.invidio.us/watch?v=0JFM3PRZH-k&index=8&list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"http://www.invidio.us/watch?v=0JFM3PRZH-k&index=8&list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"https://invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"www.invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"www.invidio.us/playlist?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV"
|
||||
})
|
||||
void acceptInvidioUrl(final String url) throws ParsingException {
|
||||
assertTrue(linkHandler.acceptUrl(url));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(strings = {
|
||||
"https://invidio.us/feed/trending?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV",
|
||||
"https://invidio.us/feed/subscriptions?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV",
|
||||
"ftp:/invidio.us/feed/trending?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV",
|
||||
"invidio.us:22/feed/trending?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV",
|
||||
"invidio . us/feed/trending?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV",
|
||||
"?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV"
|
||||
})
|
||||
void deniesInvalidInvidioUrl(final String url) throws ParsingException {
|
||||
assertFalse(linkHandler.acceptUrl(url));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@CsvSource({
|
||||
"PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC,https://www.invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV,https://www.invidio.us/playlist?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV",
|
||||
"PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC,https://www.invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC&t=100",
|
||||
"PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC,https://WWW.invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC&t=100",
|
||||
"PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC,HTTPS://www.invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC&t=100",
|
||||
"PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC,https://www.invidio.us/watch?v=0JFM3PRZH-k&index=8&list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC,http://www.invidio.us/watch?v=0JFM3PRZH-k&index=8&list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC,https://invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC,www.invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC",
|
||||
"PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV,www.invidio.us/playlist?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV"
|
||||
})
|
||||
void getInvidioIdfromUrl(final String expectedId, final String url) throws ParsingException {
|
||||
assertEquals(expectedId, linkHandler.fromUrl(url).getId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getIdfromYt() throws Exception {
|
||||
assertEquals("PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC", linkHandler.fromUrl("https://www.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC").getId());
|
||||
assertEquals("PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV", linkHandler.fromUrl("https://www.youtube.com/playlist?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV").getId());
|
||||
assertEquals("PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC", linkHandler.fromUrl("https://www.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC&t=100").getId());
|
||||
assertEquals("PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC", linkHandler.fromUrl("https://WWW.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC&t=100").getId());
|
||||
assertEquals("PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC", linkHandler.fromUrl("HTTPS://www.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC&t=100").getId());
|
||||
assertEquals("PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC", linkHandler.fromUrl("https://www.youtube.com/watch?v=0JFM3PRZH-k&index=8&list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC").getId());
|
||||
assertEquals("PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC", linkHandler.fromUrl("http://www.youtube.com/watch?v=0JFM3PRZH-k&index=8&list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC").getId());
|
||||
assertEquals("PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC", linkHandler.fromUrl("https://m.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC").getId());
|
||||
assertEquals("PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC", linkHandler.fromUrl("https://youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC").getId());
|
||||
assertEquals("PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC", linkHandler.fromUrl("www.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC").getId());
|
||||
assertEquals("PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV", linkHandler.fromUrl("www.youtube.com/playlist?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV").getId());
|
||||
assertEquals("OLAK5uy_lEBUW9iTwqf0IlYPxZ8LrzpgqjAHZgZpM", linkHandler.fromUrl("https://music.youtube.com/playlist?list=OLAK5uy_lEBUW9iTwqf0IlYPxZ8LrzpgqjAHZgZpM").getId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAcceptYtUrl() throws ParsingException {
|
||||
assertTrue(linkHandler.acceptUrl("https://www.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC"));
|
||||
assertTrue(linkHandler.acceptUrl("https://www.youtube.com/playlist?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV"));
|
||||
assertTrue(linkHandler.acceptUrl("https://WWW.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dCI"));
|
||||
assertTrue(linkHandler.acceptUrl("HTTPS://www.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC"));
|
||||
assertTrue(linkHandler.acceptUrl("https://www.youtube.com/watch?v=0JFM3PRZH-k&index=8&list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC"));
|
||||
assertTrue(linkHandler.acceptUrl("http://www.youtube.com/watch?v=0JFM3PRZH-k&index=8&list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC"));
|
||||
assertTrue(linkHandler.acceptUrl("https://m.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC"));
|
||||
assertTrue(linkHandler.acceptUrl("https://youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC"));
|
||||
assertTrue(linkHandler.acceptUrl("www.youtube.com/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC"));
|
||||
assertTrue(linkHandler.acceptUrl("www.youtube.com/playlist?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV"));
|
||||
assertTrue(linkHandler.acceptUrl("https://music.youtube.com/playlist?list=OLAK5uy_lEBUW9iTwqf0IlYPxZ8LrzpgqjAHZgZpM"));
|
||||
assertTrue(linkHandler.acceptUrl("https://www.youtube.com/playlist?list=RDCLAK5uy_ly6s4irLuZAcjEDwJmqcA_UtSipMyGgbQ")); // YouTube Music playlist
|
||||
assertTrue(linkHandler.acceptUrl("https://www.youtube.com/watch?v=2kZVEUGLgy4&list=RDdoEcQv1wlsI&index=2, ")); // YouTube Mix
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeniesInvalidYtUrl() throws ParsingException {
|
||||
assertFalse(linkHandler.acceptUrl("https://www.youtube.com/feed/trending?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV"));
|
||||
assertFalse(linkHandler.acceptUrl("https://www.youtube.com/feed/subscriptions?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV"));
|
||||
assertFalse(linkHandler.acceptUrl("ftp://www.youtube.com/feed/trending?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV"));
|
||||
assertFalse(linkHandler.acceptUrl("www.youtube.com:22/feed/trending?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV"));
|
||||
assertFalse(linkHandler.acceptUrl("youtube . com/feed/trending?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV"));
|
||||
assertFalse(linkHandler.acceptUrl("?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAcceptInvidioUrl() throws ParsingException {
|
||||
assertTrue(linkHandler.acceptUrl("https://www.invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC"));
|
||||
assertTrue(linkHandler.acceptUrl("https://www.invidio.us/playlist?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV"));
|
||||
assertTrue(linkHandler.acceptUrl("https://WWW.invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dCI"));
|
||||
assertTrue(linkHandler.acceptUrl("HTTPS://www.invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC"));
|
||||
assertTrue(linkHandler.acceptUrl("https://www.invidio.us/watch?v=0JFM3PRZH-k&index=8&list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC"));
|
||||
assertTrue(linkHandler.acceptUrl("http://www.invidio.us/watch?v=0JFM3PRZH-k&index=8&list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC"));
|
||||
assertTrue(linkHandler.acceptUrl("https://invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC"));
|
||||
assertTrue(linkHandler.acceptUrl("www.invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC"));
|
||||
assertTrue(linkHandler.acceptUrl("www.invidio.us/playlist?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeniesInvalidInvidioUrl() throws ParsingException {
|
||||
assertFalse(linkHandler.acceptUrl("https://invidio.us/feed/trending?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV"));
|
||||
assertFalse(linkHandler.acceptUrl("https://invidio.us/feed/subscriptions?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV"));
|
||||
assertFalse(linkHandler.acceptUrl("ftp:/invidio.us/feed/trending?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV"));
|
||||
assertFalse(linkHandler.acceptUrl("invidio.us:22/feed/trending?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV"));
|
||||
assertFalse(linkHandler.acceptUrl("invidio . us/feed/trending?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV"));
|
||||
assertFalse(linkHandler.acceptUrl("?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetInvidioIdfromUrl() throws ParsingException {
|
||||
assertEquals("PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC", linkHandler.fromUrl("https://www.invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC").getId());
|
||||
assertEquals("PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV", linkHandler.fromUrl("https://www.invidio.us/playlist?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV").getId());
|
||||
assertEquals("PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC", linkHandler.fromUrl("https://www.invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC&t=100").getId());
|
||||
assertEquals("PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC", linkHandler.fromUrl("https://WWW.invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC&t=100").getId());
|
||||
assertEquals("PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC", linkHandler.fromUrl("HTTPS://www.invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC&t=100").getId());
|
||||
assertEquals("PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC", linkHandler.fromUrl("https://www.invidio.us/watch?v=0JFM3PRZH-k&index=8&list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC").getId());
|
||||
assertEquals("PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC", linkHandler.fromUrl("http://www.invidio.us/watch?v=0JFM3PRZH-k&index=8&list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC").getId());
|
||||
assertEquals("PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC", linkHandler.fromUrl("https://invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC").getId());
|
||||
assertEquals("PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC", linkHandler.fromUrl("www.invidio.us/playlist?list=PLW5y1tjAOzI3orQNF1yGGVL5x-pR2K1dC").getId());
|
||||
assertEquals("PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV", linkHandler.fromUrl("www.invidio.us/playlist?list=PLz8YL4HVC87WJQDzVoY943URKQCsHS9XV").getId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void fromUrlIsMixVideo() throws Exception {
|
||||
void fromUrlIsMixVideo() throws Exception {
|
||||
final String videoId = "_AzeUSL9lZc";
|
||||
String url = "https://www.youtube.com/watch?v=" + videoId + "&list=RD" + videoId;
|
||||
assertEquals(url, linkHandler.fromUrl(url).getUrl());
|
||||
|
@ -118,7 +139,7 @@ public class YoutubePlaylistLinkHandlerFactoryTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void fromUrlIsMixPlaylist() throws Exception {
|
||||
void fromUrlIsMixPlaylist() throws Exception {
|
||||
final String videoId = "_AzeUSL9lZc";
|
||||
final String url = "https://www.youtube.com/watch?v=" + videoId + "&list=RD" + videoId;
|
||||
assertEquals(url,
|
||||
|
|
|
@ -2,6 +2,9 @@ package org.schabi.newpipe.extractor.services.youtube;
|
|||
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.CsvSource;
|
||||
import org.junit.jupiter.params.provider.ValueSource;
|
||||
import org.schabi.newpipe.downloader.DownloaderTestImpl;
|
||||
import org.schabi.newpipe.extractor.NewPipe;
|
||||
import org.schabi.newpipe.extractor.exceptions.FoundAdException;
|
||||
|
@ -17,7 +20,6 @@ import static org.junit.jupiter.api.Assertions.*;
|
|||
* Test for {@link YoutubeStreamLinkHandlerFactory}
|
||||
*/
|
||||
public class YoutubeStreamLinkHandlerFactoryTest {
|
||||
private static String AD_URL = "https://googleads.g.doubleclick.net/aclk?sa=l&ai=C-2IPgeVTWPf4GcOStgfOnIOADf78n61GvKmmobYDrgIQASDj-5MDKAJg9ZXOgeAEoAGgy_T-A8gBAakC2gkpmquIsT6oAwGqBJMBT9BgD5kVgbN0dX602bFFaDw9vsxq-We-S8VkrXVBi6W_e7brZ36GCz1WO3EPEeklYuJjXLUowwCOKsd-8xr1UlS_tusuFJv9iX35xoBHKTRvs8-0aDbfEIm6in37QDfFuZjqgEMB8-tg0Jn_Pf1RU5OzbuU40B4Gy25NUTnOxhDKthOhKBUSZEksCEerUV8GMu10iAXCxquwApIFBggDEAEYAaAGGsgGlIjthrUDgAfItIsBqAemvhvYBwHSCAUIgGEQAbgT6AE&num=1&sig=AOD64_1DybDd4qAm5O7o9UAbTNRdqXXHFQ&ctype=21&video_id=dMO_IXYPZew&client=ca-pub-6219811747049371&adurl=http://www.youtube.com/watch%3Fv%3DdMO_IXYPZew";
|
||||
private static YoutubeStreamLinkHandlerFactory linkHandler;
|
||||
|
||||
@BeforeAll
|
||||
|
@ -27,146 +29,178 @@ public class YoutubeStreamLinkHandlerFactoryTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void getIdWithNullAsUrl() {
|
||||
assertThrows(IllegalArgumentException.class, () -> linkHandler.fromId(null));
|
||||
void getIdWithNullAsUrl() {
|
||||
assertThrows(NullPointerException.class, () -> linkHandler.fromId(null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getIdForAd() throws ParsingException {
|
||||
assertThrows(FoundAdException.class, () -> linkHandler.fromUrl(AD_URL));
|
||||
void getIdForAd() {
|
||||
assertThrows(FoundAdException.class, () -> linkHandler.fromUrl(
|
||||
"https://googleads.g.doubleclick.net/aclk?sa=l&ai=C-2IPgeVTWPf4GcOStgfOnIOADf78n61GvKmmobYDrgIQASDj-5MDKAJg9ZXOgeAEoAGgy_T-A8gBAakC2gkpmquIsT6oAwGqBJMBT9BgD5kVgbN0dX602bFFaDw9vsxq-We-S8VkrXVBi6W_e7brZ36GCz1WO3EPEeklYuJjXLUowwCOKsd-8xr1UlS_tusuFJv9iX35xoBHKTRvs8-0aDbfEIm6in37QDfFuZjqgEMB8-tg0Jn_Pf1RU5OzbuU40B4Gy25NUTnOxhDKthOhKBUSZEksCEerUV8GMu10iAXCxquwApIFBggDEAEYAaAGGsgGlIjthrUDgAfItIsBqAemvhvYBwHSCAUIgGEQAbgT6AE&num=1&sig=AOD64_1DybDd4qAm5O7o9UAbTNRdqXXHFQ&ctype=21&video_id=dMO_IXYPZew&client=ca-pub-6219811747049371&adurl=http://www.youtube.com/watch%3Fv%3DdMO_IXYPZew"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getIdForInvalidUrls() {
|
||||
List<String> invalidUrls = new ArrayList<>(50);
|
||||
invalidUrls.add("https://www.youtube.com/watch?v=jZViOEv90d");
|
||||
invalidUrls.add("https://www.youtube.com/watchjZViOEv90d");
|
||||
invalidUrls.add("https://www.youtube.com/");
|
||||
invalidUrls.add("https://www.youtube.com/channel/UCBR8-60-B28hp2BmDPdntcQ");
|
||||
invalidUrls.add("https://invidio.us/channel/UCBR8-60-B28hp2BmDPdntcQ");
|
||||
for (String invalidUrl : invalidUrls) {
|
||||
Throwable exception = null;
|
||||
try {
|
||||
linkHandler.fromUrl(invalidUrl).getId();
|
||||
} catch (ParsingException e) {
|
||||
exception = e;
|
||||
}
|
||||
if (exception == null) {
|
||||
fail("Expected ParsingException for url: " + invalidUrl);
|
||||
}
|
||||
}
|
||||
@ParameterizedTest
|
||||
@ValueSource(strings = {
|
||||
"https://www.youtube.com/watch?v=jZViOEv90d",
|
||||
"https://www.youtube.com/watchjZViOEv90d",
|
||||
"https://www.youtube.com/",
|
||||
"https://www.youtube.com/channel/UCBR8-60-B28hp2BmDPdntcQ",
|
||||
"https://invidious.fdn.fr/channel/UCBR8-60-B28hp2BmDPdntcQ"
|
||||
})
|
||||
void getIdForInvalidUrls(final String invalidUrl) {
|
||||
assertThrows(ParsingException.class, () -> linkHandler.fromUrl(invalidUrl).getId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getIdfromYt() throws Exception {
|
||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("https://www.youtube.com/watch?v=jZViOEv90dI").getId());
|
||||
assertEquals("W-fFHeTX70Q", linkHandler.fromUrl("https://www.youtube.com/watch?v=W-fFHeTX70Q").getId());
|
||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("https://www.youtube.com/watch?v=jZViOEv90dI&t=100").getId());
|
||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("https://WWW.YouTube.com/watch?v=jZViOEv90dI&t=100").getId());
|
||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("HTTPS://www.youtube.com/watch?v=jZViOEv90dI&t=100").getId());
|
||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("https://youtu.be/jZViOEv90dI?t=9s").getId());
|
||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("HTTPS://Youtu.be/jZViOEv90dI?t=9s").getId());
|
||||
assertEquals("uEJuoEs1UxY", linkHandler.fromUrl("http://www.youtube.com/watch_popup?v=uEJuoEs1UxY").getId());
|
||||
assertEquals("uEJuoEs1UxY", linkHandler.fromUrl("http://www.Youtube.com/watch_popup?v=uEJuoEs1UxY").getId());
|
||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("https://www.youtube.com/embed/jZViOEv90dI").getId());
|
||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("https://www.youtube-nocookie.com/embed/jZViOEv90dI").getId());
|
||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("http://www.youtube.com/watch?v=jZViOEv90dI").getId());
|
||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("http://youtube.com/watch?v=jZViOEv90dI").getId());
|
||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("http://youtu.be/jZViOEv90dI?t=9s").getId());
|
||||
assertEquals("7_WWz2DSnT8", linkHandler.fromUrl("https://youtu.be/7_WWz2DSnT8").getId());
|
||||
assertEquals("oy6NvWeVruY", linkHandler.fromUrl("https://m.youtube.com/watch?v=oy6NvWeVruY").getId());
|
||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("http://www.youtube.com/embed/jZViOEv90dI").getId());
|
||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("http://www.Youtube.com/embed/jZViOEv90dI").getId());
|
||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("http://www.youtube-nocookie.com/embed/jZViOEv90dI").getId());
|
||||
assertEquals("EhxJLojIE_o", linkHandler.fromUrl("http://www.youtube.com/attribution_link?a=JdfC0C9V6ZI&u=%2Fwatch%3Fv%3DEhxJLojIE_o%26feature%3Dshare").getId());
|
||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("vnd.youtube://www.youtube.com/watch?v=jZViOEv90dI").getId());
|
||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("vnd.youtube:jZViOEv90dI").getId());
|
||||
assertEquals("n8X9_MgEdCg", linkHandler.fromUrl("vnd.youtube://n8X9_MgEdCg").getId());
|
||||
assertEquals("O0EDx9WAelc", linkHandler.fromUrl("https://music.youtube.com/watch?v=O0EDx9WAelc").getId());
|
||||
assertEquals("-cdveCh1kQk", linkHandler.fromUrl("https://m.youtube.com/watch?v=-cdveCh1kQk)").getId());
|
||||
assertEquals("-cdveCh1kQk", linkHandler.fromUrl("https://www.youtube.com/watch?v=-cdveCh1kQk-").getId());
|
||||
assertEquals("-cdveCh1kQk", linkHandler.fromUrl("https://WWW.YouTube.com/watch?v=-cdveCh1kQkwhatever").getId());
|
||||
assertEquals("O0EDx9WAelc", linkHandler.fromUrl("HTTPS://www.youtube.com/watch?v=O0EDx9WAelc]").getId());
|
||||
assertEquals("-cdveCh1kQk", linkHandler.fromUrl("https://youtu.be/-cdveCh1kQk)hello").getId());
|
||||
assertEquals("OGS7c0-CmRs", linkHandler.fromUrl("https://YouTu.be/OGS7c0-CmRswhatever)").getId());
|
||||
assertEquals("-cdveCh1kQk", linkHandler.fromUrl("HTTPS://youtu.be/-cdveCh1kQk)").getId());
|
||||
assertEquals("IOS2fqxwYbA", linkHandler.fromUrl("https://www.youtube.com/shorts/IOS2fqxwYbAhi").getId());
|
||||
assertEquals("IOS2fqxwYbA", linkHandler.fromUrl("http://www.youtube.com/shorts/IOS2fqxwYbA").getId());
|
||||
assertEquals("IOS2fqxwYbA", linkHandler.fromUrl("http://www.youtube.com/v/IOS2fqxwYbA").getId());
|
||||
assertEquals("IOS2fqxwYbA", linkHandler.fromUrl("http://www.youtube.com/w/IOS2fqxwYbA").getId());
|
||||
assertEquals("IOS2fqxwYbA", linkHandler.fromUrl("http://www.youtube.com/watch/IOS2fqxwYbA").getId());
|
||||
@ParameterizedTest
|
||||
@ValueSource(strings = {
|
||||
"https://www.youtube.com/watch?v=jZViOEv90dI",
|
||||
"https://www.youtube.com/watch?v=jZViOEv90dI&t=100",
|
||||
"https://WWW.YouTube.com/watch?v=jZViOEv90dI&t=100",
|
||||
"HTTPS://www.youtube.com/watch?v=jZViOEv90dI&t=100",
|
||||
"https://youtu.be/jZViOEv90dI?t=9s",
|
||||
"HTTPS://Youtu.be/jZViOEv90dI?t=9s",
|
||||
"https://www.youtube.com/embed/jZViOEv90dI",
|
||||
"https://www.youtube-nocookie.com/embed/jZViOEv90dI",
|
||||
"http://www.youtube.com/watch?v=jZViOEv90dI",
|
||||
"http://youtube.com/watch?v=jZViOEv90dI",
|
||||
"http://youtu.be/jZViOEv90dI?t=9s",
|
||||
"http://www.youtube.com/embed/jZViOEv90dI",
|
||||
"http://www.Youtube.com/embed/jZViOEv90dI",
|
||||
"http://www.youtube-nocookie.com/embed/jZViOEv90dI",
|
||||
"vnd.youtube://www.youtube.com/watch?v=jZViOEv90dI",
|
||||
"vnd.youtube:jZViOEv90dI"
|
||||
})
|
||||
void getId_jZViOEv90dI_fromYt(final String url) throws Exception {
|
||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl(url).getId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAcceptYtUrl() throws ParsingException {
|
||||
assertTrue(linkHandler.acceptUrl("https://www.youtube.com/watch?v=jZViOEv90dI"));
|
||||
assertTrue(linkHandler.acceptUrl("https://www.youtube.com/watch?v=jZViOEv90dI&t=100"));
|
||||
assertTrue(linkHandler.acceptUrl("https://WWW.YouTube.com/watch?v=jZViOEv90dI&t=100"));
|
||||
assertTrue(linkHandler.acceptUrl("HTTPS://www.youtube.com/watch?v=jZViOEv90dI&t=100"));
|
||||
assertTrue(linkHandler.acceptUrl("https://youtu.be/jZViOEv90dI?t=9s"));
|
||||
assertTrue(linkHandler.acceptUrl("https://www.youtube.com/embed/jZViOEv90dI"));
|
||||
assertTrue(linkHandler.acceptUrl("https://www.youtube-nocookie.com/embed/jZViOEv90dI"));
|
||||
assertTrue(linkHandler.acceptUrl("http://www.youtube.com/watch?v=jZViOEv90dI"));
|
||||
assertTrue(linkHandler.acceptUrl("http://youtu.be/jZViOEv90dI?t=9s"));
|
||||
assertTrue(linkHandler.acceptUrl("http://www.youtube.com/embed/jZViOEv90dI"));
|
||||
assertTrue(linkHandler.acceptUrl("http://www.youtube-nocookie.com/embed/jZViOEv90dI"));
|
||||
assertTrue(linkHandler.acceptUrl("http://www.youtube.com/attribution_link?a=JdfC0C9V6ZI&u=%2Fwatch%3Fv%3DEhxJLojIE_o%26feature%3Dshare"));
|
||||
assertTrue(linkHandler.acceptUrl("vnd.youtube://www.youtube.com/watch?v=jZViOEv90dI"));
|
||||
assertTrue(linkHandler.acceptUrl("vnd.youtube:jZViOEv90dI"));
|
||||
assertTrue(linkHandler.acceptUrl("vnd.youtube.launch:jZViOEv90dI"));
|
||||
assertTrue(linkHandler.acceptUrl("https://music.youtube.com/watch?v=O0EDx9WAelc"));
|
||||
assertTrue(linkHandler.acceptUrl("https://www.youtube.com/shorts/IOS2fqxwYbA"));
|
||||
assertTrue(linkHandler.acceptUrl("https://www.youtube.com/v/IOS2fqxwYbA"));
|
||||
assertTrue(linkHandler.acceptUrl("https://www.youtube.com/w/IOS2fqxwYbA"));
|
||||
assertTrue(linkHandler.acceptUrl("https://www.youtube.com/watch/IOS2fqxwYbA"));
|
||||
@ParameterizedTest
|
||||
@ValueSource(strings = {
|
||||
"https://www.youtube.com/shorts/IOS2fqxwYbA",
|
||||
"http://www.youtube.com/shorts/IOS2fqxwYbA",
|
||||
"http://www.youtube.com/v/IOS2fqxwYbA",
|
||||
"https://www.youtube.com/w/IOS2fqxwYbA",
|
||||
"https://www.youtube.com/watch/IOS2fqxwYbA"
|
||||
})
|
||||
void getId_IOS2fqxwYbA_fromYt(final String url) throws Exception {
|
||||
assertEquals("IOS2fqxwYbA", linkHandler.fromUrl(url).getId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAcceptHookUrl() throws ParsingException {
|
||||
assertTrue(linkHandler.acceptUrl("https://hooktube.com/watch?v=TglNG-yjabU"));
|
||||
assertTrue(linkHandler.acceptUrl("http://hooktube.com/watch?v=TglNG-yjabU"));
|
||||
assertTrue(linkHandler.acceptUrl("hooktube.com/watch?v=3msbfr6pBNE"));
|
||||
assertTrue(linkHandler.acceptUrl("https://hooktube.com/watch?v=ocH3oSnZG3c&list=PLS2VU1j4vzuZwooPjV26XM9UEBY2CPNn2"));
|
||||
assertTrue(linkHandler.acceptUrl("hooktube.com/watch/3msbfr6pBNE"));
|
||||
assertTrue(linkHandler.acceptUrl("hooktube.com/v/3msbfr6pBNE"));
|
||||
assertTrue(linkHandler.acceptUrl("hooktube.com/embed/3msbfr6pBNE"));
|
||||
@ParameterizedTest
|
||||
@ValueSource(strings = {
|
||||
"https://m.youtube.com/watch?v=-cdveCh1kQk)",
|
||||
"https://www.youtube.com/watch?v=-cdveCh1kQk-",
|
||||
"https://WWW.YouTube.com/watch?v=-cdveCh1kQkwhatever",
|
||||
"https://youtu.be/-cdveCh1kQk)hello",
|
||||
"HTTPS://youtu.be/-cdveCh1kQk)"
|
||||
})
|
||||
void getId_cdveCh1kQk_fromYt(final String url) throws Exception {
|
||||
assertEquals("-cdveCh1kQk", linkHandler.fromUrl(url).getId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetHookIdfromUrl() throws ParsingException {
|
||||
assertEquals("TglNG-yjabU", linkHandler.fromUrl("https://hooktube.com/watch?v=TglNG-yjabU").getId());
|
||||
assertEquals("TglNG-yjabU", linkHandler.fromUrl("http://hooktube.com/watch?v=TglNG-yjabU").getId());
|
||||
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("hooktube.com/watch?v=3msbfr6pBNE").getId());
|
||||
assertEquals("ocH3oSnZG3c", linkHandler.fromUrl("https://hooktube.com/watch?v=ocH3oSnZG3c&list=PLS2VU1j4vzuZwooPjV26XM9UEBY2CPNn2").getId());
|
||||
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("hooktube.com/watch/3msbfr6pBNE").getId());
|
||||
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("hooktube.com/v/3msbfr6pBNE").getId());
|
||||
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("hooktube.com/w/3msbfr6pBNE").getId());
|
||||
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("hooktube.com/embed/3msbfr6pBNE").getId());
|
||||
@ParameterizedTest
|
||||
@CsvSource({
|
||||
"W-fFHeTX70Q,https://www.youtube.com/watch?v=W-fFHeTX70Q",
|
||||
"uEJuoEs1UxY,http://www.youtube.com/watch_popup?v=uEJuoEs1UxY",
|
||||
"uEJuoEs1UxY,http://www.Youtube.com/watch_popup?v=uEJuoEs1UxY",
|
||||
"7_WWz2DSnT8,https://youtu.be/7_WWz2DSnT8",
|
||||
"oy6NvWeVruY,https://m.youtube.com/watch?v=oy6NvWeVruY",
|
||||
"EhxJLojIE_o,http://www.youtube.com/attribution_link?a=JdfC0C9V6ZI&u=%2Fwatch%3Fv%3DEhxJLojIE_o%26feature%3Dshare",
|
||||
"n8X9_MgEdCg,vnd.youtube://n8X9_MgEdCg",
|
||||
"O0EDx9WAelc,https://music.youtube.com/watch?v=O0EDx9WAelc",
|
||||
"O0EDx9WAelc,HTTPS://www.youtube.com/watch?v=O0EDx9WAelc]",
|
||||
"OGS7c0-CmRs,https://YouTu.be/OGS7c0-CmRswhatever)"
|
||||
})
|
||||
void getId_diverse_fromYt(final String expectedId, final String url) throws Exception {
|
||||
assertEquals(expectedId, linkHandler.fromUrl(url).getId());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAcceptInvidiousUrl() throws ParsingException {
|
||||
assertTrue(linkHandler.acceptUrl("https://invidio.us/watch?v=TglNG-yjabU"));
|
||||
assertTrue(linkHandler.acceptUrl("http://www.invidio.us/watch?v=TglNG-yjabU"));
|
||||
assertTrue(linkHandler.acceptUrl("http://invidio.us/watch?v=TglNG-yjabU"));
|
||||
assertTrue(linkHandler.acceptUrl("invidio.us/watch?v=3msbfr6pBNE"));
|
||||
assertTrue(linkHandler.acceptUrl("https://invidio.us/watch?v=ocH3oSnZG3c&test=PLS2VU1j4vzuZwooPjV26XM9UEBY2CPNn2"));
|
||||
assertTrue(linkHandler.acceptUrl("invidio.us/embed/3msbfr6pBNE"));
|
||||
assertTrue(linkHandler.acceptUrl("invidio.us/watch/3msbfr6pBNE"));
|
||||
assertTrue(linkHandler.acceptUrl("invidio.us/v/3msbfr6pBNE"));
|
||||
assertTrue(linkHandler.acceptUrl("invidio.us/w/3msbfr6pBNE"));
|
||||
@ParameterizedTest
|
||||
@ValueSource(strings = {
|
||||
"https://www.youtube.com/watch?v=jZViOEv90dI",
|
||||
"https://www.youtube.com/watch?v=jZViOEv90dI&t=100",
|
||||
"https://WWW.YouTube.com/watch?v=jZViOEv90dI&t=100",
|
||||
"HTTPS://www.youtube.com/watch?v=jZViOEv90dI&t=100",
|
||||
"https://youtu.be/jZViOEv90dI?t=9s",
|
||||
"https://www.youtube.com/embed/jZViOEv90dI",
|
||||
"https://www.youtube-nocookie.com/embed/jZViOEv90dI",
|
||||
"http://www.youtube.com/watch?v=jZViOEv90dI",
|
||||
"http://youtu.be/jZViOEv90dI?t=9s",
|
||||
"http://www.youtube.com/embed/jZViOEv90dI",
|
||||
"http://www.youtube-nocookie.com/embed/jZViOEv90dI",
|
||||
"http://www.youtube.com/attribution_link?a=JdfC0C9V6ZI&u=%2Fwatch%3Fv%3DEhxJLojIE_o%26feature%3Dshare",
|
||||
"vnd.youtube://www.youtube.com/watch?v=jZViOEv90dI",
|
||||
"vnd.youtube:jZViOEv90dI",
|
||||
"vnd.youtube.launch:jZViOEv90dI",
|
||||
"https://music.youtube.com/watch?v=O0EDx9WAelc",
|
||||
"https://www.youtube.com/shorts/IOS2fqxwYbA",
|
||||
"http://www.youtube.com/shorts/IOS2fqxwYbA",
|
||||
"http://www.youtube.com/v/IOS2fqxwYbA",
|
||||
"https://www.youtube.com/w/IOS2fqxwYbA",
|
||||
"https://www.youtube.com/watch/IOS2fqxwYbA"
|
||||
})
|
||||
void acceptYtUrl(final String url) throws ParsingException {
|
||||
assertTrue(linkHandler.acceptUrl(url));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetInvidiousIdfromUrl() throws ParsingException {
|
||||
assertEquals("TglNG-yjabU", linkHandler.fromUrl("https://invidio.us/watch?v=TglNG-yjabU").getId());
|
||||
assertEquals("TglNG-yjabU", linkHandler.fromUrl("http://www.invidio.us/watch?v=TglNG-yjabU").getId());
|
||||
assertEquals("TglNG-yjabU", linkHandler.fromUrl("http://invidio.us/watch?v=TglNG-yjabU").getId());
|
||||
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/watch?v=3msbfr6pBNE").getId());
|
||||
assertEquals("ocH3oSnZG3c", linkHandler.fromUrl("https://invidio.us/watch?v=ocH3oSnZG3c&test=PLS2VU1j4vzuZwooPjV26XM9UEBY2CPNn2").getId());
|
||||
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/embed/3msbfr6pBNE").getId());
|
||||
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/v/3msbfr6pBNE").getId());
|
||||
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/w/3msbfr6pBNE").getId());
|
||||
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/watch/3msbfr6pBNE").getId());
|
||||
@ParameterizedTest
|
||||
@ValueSource(strings = {
|
||||
"https://hooktube.com/watch?v=TglNG-yjabU",
|
||||
"http://hooktube.com/watch?v=TglNG-yjabU",
|
||||
"https://hooktube.com/watch?v=ocH3oSnZG3c&test=PLS2VU1j4vzuZwooPjV26XM9UEBY2CPNn2",
|
||||
"hooktube.com/watch?v=3msbfr6pBNE",
|
||||
"hooktube.com/watch/3msbfr6pBNE",
|
||||
"hooktube.com/v/3msbfr6pBNE",
|
||||
"hooktube.com/embed/3msbfr6pBNE"
|
||||
})
|
||||
void acceptHookUrl(final String url) throws ParsingException {
|
||||
assertTrue(linkHandler.acceptUrl(url));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@CsvSource({
|
||||
"TglNG-yjabU,https://hooktube.com/watch?v=TglNG-yjabU",
|
||||
"TglNG-yjabU,http://hooktube.com/watch?v=TglNG-yjabU",
|
||||
"ocH3oSnZG3c,https://hooktube.com/watch?v=ocH3oSnZG3c&test=PLS2VU1j4vzuZwooPjV26XM9UEBY2CPNn2",
|
||||
"3msbfr6pBNE,hooktube.com/watch?v=3msbfr6pBNE",
|
||||
"3msbfr6pBNE,hooktube.com/watch/3msbfr6pBNE",
|
||||
"3msbfr6pBNE,hooktube.com/v/3msbfr6pBNE",
|
||||
"3msbfr6pBNE,hooktube.com/w/3msbfr6pBNE",
|
||||
"3msbfr6pBNE,hooktube.com/embed/3msbfr6pBNE"
|
||||
})
|
||||
void getHookIdfromUrl(final String expectedId, final String url) throws Exception {
|
||||
assertEquals(expectedId, linkHandler.fromUrl(url).getId());
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(strings = {
|
||||
"https://invidious.fdn.fr/watch?v=TglNG-yjabU",
|
||||
"http://www.invidio.us/watch?v=TglNG-yjabU",
|
||||
"http://invidious.fdn.fr/watch?v=TglNG-yjabU",
|
||||
"invidious.fdn.fr/watch?v=3msbfr6pBNE",
|
||||
"https://invidious.fdn.fr/watch?v=ocH3oSnZG3c&test=PLS2VU1j4vzuZwooPjV26XM9UEBY2CPNn2",
|
||||
"invidious.fdn.fr/embed/3msbfr6pBNE",
|
||||
"invidious.fdn.fr/watch/3msbfr6pBNE",
|
||||
"invidious.fdn.fr/v/3msbfr6pBNE",
|
||||
"invidious.fdn.fr/w/3msbfr6pBNE"
|
||||
})
|
||||
void acceptInvidiousUrl(final String url) throws ParsingException {
|
||||
assertTrue(linkHandler.acceptUrl(url));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@CsvSource({
|
||||
"TglNG-yjabU,https://invidious.fdn.fr/watch?v=TglNG-yjabU",
|
||||
"TglNG-yjabU,http://www.invidio.us/watch?v=TglNG-yjabU",
|
||||
"TglNG-yjabU,http://invidious.fdn.fr/watch?v=TglNG-yjabU",
|
||||
"ocH3oSnZG3c,https://invidious.fdn.fr/watch?v=ocH3oSnZG3c&test=PLS2VU1j4vzuZwooPjV26XM9UEBY2CPNn2",
|
||||
"3msbfr6pBNE,invidious.fdn.fr/watch?v=3msbfr6pBNE",
|
||||
"3msbfr6pBNE,invidious.fdn.fr/embed/3msbfr6pBNE",
|
||||
"3msbfr6pBNE,invidious.fdn.fr/v/3msbfr6pBNE",
|
||||
"3msbfr6pBNE,invidious.fdn.fr/w/3msbfr6pBNE",
|
||||
"3msbfr6pBNE,invidious.fdn.fr/watch/3msbfr6pBNE"
|
||||
})
|
||||
void getInvidiousIdfromUrl(final String expectedId, final String url) throws Exception {
|
||||
assertEquals(expectedId, linkHandler.fromUrl(url).getId());
|
||||
}
|
||||
}
|
|
@ -21,6 +21,7 @@ public final class YoutubeTestsUtils {
|
|||
* </p>
|
||||
*/
|
||||
public static void ensureStateless() {
|
||||
YoutubeParsingHelper.setConsentAccepted(false);
|
||||
YoutubeParsingHelper.resetClientVersionAndKey();
|
||||
YoutubeParsingHelper.setNumberGenerator(new Random(1));
|
||||
YoutubeStreamExtractor.resetDeobfuscationCode();
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
package org.schabi.newpipe.extractor.services.youtube;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
||||
import static org.junit.jupiter.api.Assertions.fail;
|
||||
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mozilla.javascript.EvaluatorException;
|
||||
|
@ -9,11 +13,7 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
|||
|
||||
import java.io.IOException;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
||||
import static org.junit.jupiter.api.Assertions.fail;
|
||||
|
||||
public class YoutubeThrottlingDecrypterTest {
|
||||
class YoutubeThrottlingDecrypterTest {
|
||||
|
||||
@BeforeEach
|
||||
public void setup() throws IOException {
|
||||
|
@ -21,7 +21,7 @@ public class YoutubeThrottlingDecrypterTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void testExtractFunction__success() throws ParsingException {
|
||||
void testExtractFunction__success() throws ParsingException {
|
||||
final String[] videoIds = {"jE1USQrs1rw", "CqxjzfudGAc", "goH-9MfQI7w", "KYIdr_7H5Yw", "J1WeqmGbYeI"};
|
||||
|
||||
final String encryptedUrl = "https://r6---sn-4g5ednek.googlevideo.com/videoplayback?expire=1626562120&ei=6AnzYO_YBpql1gLGkb_IBQ&ip=127.0.0.1&id=o-ANhBEf36Z5h-8U9DDddtPDqtS0ZNwf0XJAAigudKI2uI&itag=278&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278&source=youtube&requiressl=yes&vprv=1&mime=video%2Fwebm&ns=TvecOReN0vPuXb3j_zq157IG&gir=yes&clen=2915100&dur=270.203&lmt=1608157174907785&keepalive=yes&fexp=24001373,24007246&c=WEB&txp=5535432&n=N9BWSTFT7vvBJrvQ&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&alr=yes&sig=AOq0QJ8wRQIgW6XnUDKPDSxiT0_KE_tDDMpcaCJl2Un5p0Fu9qZNQGkCIQDWxsDHi_s2BEmRqIbd1C5g_gzfihB7RZLsScKWNMwzzA%3D%3D&cpn=9r2yt3BqcYmeb2Yu&cver=2.20210716.00.00&redirect_counter=1&cm2rm=sn-4g5ezy7s&cms_redirect=yes&mh=Y5&mm=34&mn=sn-4g5ednek&ms=ltu&mt=1626540524&mv=m&mvi=6&pl=43&lsparams=mh,mm,mn,ms,mv,mvi,pl&lsig=AG3C_xAwRQIhAIUzxTn9Vw1-vm-_7OQ5-0h1M6AZsY9Bx1FlCCTeMICzAiADtGggbn4Znsrh2EnvyOsGnYdRGcbxn4mW9JMOQiInDQ%3D%3D&range=259165-480735&rn=11&rbuf=20190";
|
||||
|
@ -30,14 +30,14 @@ public class YoutubeThrottlingDecrypterTest {
|
|||
try {
|
||||
final String decryptedUrl = YoutubeThrottlingDecrypter.apply(encryptedUrl, videoId);
|
||||
assertNotEquals(encryptedUrl, decryptedUrl);
|
||||
} catch (EvaluatorException e) {
|
||||
} catch (final EvaluatorException e) {
|
||||
fail("Failed to extract n param decrypt function for video " + videoId + "\n" + e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDecode__success() throws ParsingException {
|
||||
void testDecode__success() throws ParsingException {
|
||||
// URL extracted from browser with the dev tools
|
||||
final String encryptedUrl = "https://r6---sn-4g5ednek.googlevideo.com/videoplayback?expire=1626562120&ei=6AnzYO_YBpql1gLGkb_IBQ&ip=127.0.0.1&id=o-ANhBEf36Z5h-8U9DDddtPDqtS0ZNwf0XJAAigudKI2uI&itag=278&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278&source=youtube&requiressl=yes&vprv=1&mime=video%2Fwebm&ns=TvecOReN0vPuXb3j_zq157IG&gir=yes&clen=2915100&dur=270.203&lmt=1608157174907785&keepalive=yes&fexp=24001373,24007246&c=WEB&txp=5535432&n=N9BWSTFT7vvBJrvQ&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&alr=yes&sig=AOq0QJ8wRQIgW6XnUDKPDSxiT0_KE_tDDMpcaCJl2Un5p0Fu9qZNQGkCIQDWxsDHi_s2BEmRqIbd1C5g_gzfihB7RZLsScKWNMwzzA%3D%3D&cpn=9r2yt3BqcYmeb2Yu&cver=2.20210716.00.00&redirect_counter=1&cm2rm=sn-4g5ezy7s&cms_redirect=yes&mh=Y5&mm=34&mn=sn-4g5ednek&ms=ltu&mt=1626540524&mv=m&mvi=6&pl=43&lsparams=mh,mm,mn,ms,mv,mvi,pl&lsig=AG3C_xAwRQIhAIUzxTn9Vw1-vm-_7OQ5-0h1M6AZsY9Bx1FlCCTeMICzAiADtGggbn4Znsrh2EnvyOsGnYdRGcbxn4mW9JMOQiInDQ%3D%3D&range=259165-480735&rn=11&rbuf=20190";
|
||||
final String decryptedUrl = YoutubeThrottlingDecrypter.apply(encryptedUrl, "jE1USQrs1rw");
|
||||
|
@ -46,7 +46,7 @@ public class YoutubeThrottlingDecrypterTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void testDecode__noNParam__success() throws ParsingException {
|
||||
void testDecode__noNParam__success() throws ParsingException {
|
||||
final String noNParamUrl = "https://r5---sn-4g5ednsz.googlevideo.com/videoplayback?expire=1626553257&ei=SefyYPmIFoKT1wLtqbjgCQ&ip=127.0.0.1&id=o-AIT5xGifsaEAdEOAb5vd06J9VNtm-KHHolnaZRGPjHZi&itag=140&source=youtube&requiressl=yes&mh=xO&mm=31%2C29&mn=sn-4g5ednsz%2Csn-4g5e6nsr&ms=au%2Crdu&mv=m&mvi=5&pl=24&initcwndbps=1322500&vprv=1&mime=audio%2Fmp4&ns=cA2SS5atEe0mH8tMwGTO4RIG&gir=yes&clen=3009275&dur=185.898&lmt=1626356984653961&mt=1626531173&fvip=5&keepalive=yes&fexp=24001373%2C24007246&beids=23886212&c=WEB&txp=6411222&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAPueRlTutSlzPafxrqBmgZz5m7-Zfbw3QweDp3j4XO9SAiEA5tF7_ZCJFKmS-D6I1jlUURjpjoiTbsYyKuarV4u6E8Y%3D&sig=AOq0QJ8wRQIgRD_4WwkPeTEKGVSQqPsznMJGqq4nVJ8o1ChGBCgi4Y0CIQCZT3tI40YLKBWJCh2Q7AlvuUIpN0ficzdSElLeQpJdrw==";
|
||||
final String decrypted = YoutubeThrottlingDecrypter.apply(noNParamUrl, "jE1USQrs1rw");
|
||||
|
||||
|
|
|
@ -6,7 +6,6 @@ import static java.util.Collections.singletonList;
|
|||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.Disabled;
|
||||
import org.schabi.newpipe.downloader.DownloaderTestImpl;
|
||||
import org.schabi.newpipe.downloader.MockOnly;
|
||||
import org.schabi.newpipe.extractor.InfoItem;
|
||||
import org.schabi.newpipe.extractor.NewPipe;
|
||||
import org.schabi.newpipe.extractor.StreamingService;
|
||||
|
@ -158,8 +157,8 @@ public class YoutubeMusicSearchExtractorTest {
|
|||
|
||||
public static class CorrectedSearch extends DefaultSearchExtractorTest {
|
||||
private static SearchExtractor extractor;
|
||||
private static final String QUERY = "nocopyrigh sounds";
|
||||
private static final String EXPECTED_SUGGESTION = "nocopyrightsounds";
|
||||
private static final String QUERY = "no copyrigh sounds";
|
||||
private static final String EXPECTED_SUGGESTION = "no copyright sounds";
|
||||
|
||||
@BeforeAll
|
||||
public static void setUp() throws Exception {
|
||||
|
|
|
@ -136,11 +136,17 @@ public class YoutubeSearchExtractorTest {
|
|||
@Override public InfoItem.InfoType expectedInfoItemType() { return InfoItem.InfoType.STREAM; }
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for YT's "Did you mean...".
|
||||
* <p>
|
||||
* Hint: YT mostly shows "did you mean..." when you are searching in another language.
|
||||
* </p>
|
||||
*/
|
||||
@MockOnly("Currently constantly switching between \"Did you mean\" and \"Showing results for ...\" occurs")
|
||||
public static class Suggestion extends DefaultSearchExtractorTest {
|
||||
private static SearchExtractor extractor;
|
||||
private static final String QUERY = "newpip";
|
||||
private static final String EXPECTED_SUGGESTION = "newpipe";
|
||||
private static final String QUERY = "algorythm";
|
||||
private static final String EXPECTED_SUGGESTION = "algorithm";
|
||||
|
||||
@BeforeAll
|
||||
public static void setUp() throws Exception {
|
||||
|
@ -161,6 +167,9 @@ public class YoutubeSearchExtractorTest {
|
|||
@Override public InfoItem.InfoType expectedInfoItemType() { return InfoItem.InfoType.STREAM; }
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for YT's "Showing results for...".
|
||||
*/
|
||||
public static class CorrectedSearch extends DefaultSearchExtractorTest {
|
||||
private static SearchExtractor extractor;
|
||||
private static final String QUERY = "pewdeipie";
|
||||
|
@ -254,15 +263,14 @@ public class YoutubeSearchExtractorTest {
|
|||
@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
|
||||
new Description(
|
||||
"Get the latest information from the WHO about coronavirus.",
|
||||
Description.PLAIN_TEXT),
|
||||
Collections.singletonList(
|
||||
new URL("https://www.who.int/emergencies/diseases/novel-coronavirus-2019")),
|
||||
Collections.singletonList("LEARN MORE")
|
||||
));
|
||||
}
|
||||
// testMoreRelatedItems is broken because a video has no duration shown
|
||||
|
|
|
@ -19,7 +19,7 @@ import javax.annotation.Nullable;
|
|||
|
||||
public class YoutubeStreamExtractorLivestreamTest extends DefaultStreamExtractorTest {
|
||||
private static final String RESOURCE_PATH = DownloaderFactory.RESOURCE_PATH + "services/youtube/extractor/stream/";
|
||||
private static final String ID = "5qap5aO4i9A";
|
||||
private static final String ID = "jfKfPfyJRdk";
|
||||
private static final int TIMESTAMP = 1737;
|
||||
private static final String URL = YoutubeStreamExtractorDefaultTest.BASE_URL + ID + "&t=" + TIMESTAMP;
|
||||
private static StreamExtractor extractor;
|
||||
|
@ -57,9 +57,9 @@ public class YoutubeStreamExtractorLivestreamTest extends DefaultStreamExtractor
|
|||
@Override public long expectedLength() { return 0; }
|
||||
@Override public long expectedTimestamp() { return TIMESTAMP; }
|
||||
@Override public long expectedViewCountAtLeast() { return 0; }
|
||||
@Nullable @Override public String expectedUploadDate() { return "2020-02-22 00:00:00.000"; }
|
||||
@Nullable @Override public String expectedTextualUploadDate() { return "2020-02-22"; }
|
||||
@Override public long expectedLikeCountAtLeast() { return 825000; }
|
||||
@Nullable @Override public String expectedUploadDate() { return "2022-07-12 00:00:00.000"; }
|
||||
@Nullable @Override public String expectedTextualUploadDate() { return "2022-07-12"; }
|
||||
@Override public long expectedLikeCountAtLeast() { return 340_000; }
|
||||
@Override public long expectedDislikeCountAtLeast() { return -1; }
|
||||
@Override public boolean expectedHasSubtitles() { return false; }
|
||||
@Nullable @Override public String expectedDashMpdUrlContains() { return "https://manifest.googlevideo.com/api/manifest/dash/"; }
|
||||
|
|
|
@ -37,17 +37,14 @@
|
|||
"content-type": [
|
||||
"text/javascript; charset\u003dutf-8"
|
||||
],
|
||||
"critical-ch": [
|
||||
"Sec-CH-UA-Arch, Sec-CH-UA-Bitness, Sec-CH-UA-Full-Version, Sec-CH-UA-Full-Version-List, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version"
|
||||
],
|
||||
"cross-origin-opener-policy-report-only": [
|
||||
"same-origin; report-to\u003d\"youtube_main\""
|
||||
],
|
||||
"date": [
|
||||
"Fri, 12 Aug 2022 17:16:43 GMT"
|
||||
"Sun, 21 Aug 2022 16:38:46 GMT"
|
||||
],
|
||||
"expires": [
|
||||
"Fri, 12 Aug 2022 17:16:43 GMT"
|
||||
"Sun, 21 Aug 2022 16:38:46 GMT"
|
||||
],
|
||||
"p3p": [
|
||||
"CP\u003d\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl\u003den-GB for more info.\""
|
||||
|
@ -62,9 +59,9 @@
|
|||
"ESF"
|
||||
],
|
||||
"set-cookie": [
|
||||
"YSC\u003dHJEPOQIuvI8; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dSat, 16-Nov-2019 17:16:43 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"CONSENT\u003dPENDING+356; expires\u003dSun, 11-Aug-2024 17:16:43 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||
"YSC\u003dt2u6Ud1gkeE; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dMon, 25-Nov-2019 16:38:46 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"CONSENT\u003dPENDING+112; expires\u003dTue, 20-Aug-2024 16:38:46 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||
],
|
||||
"strict-transport-security": [
|
||||
"max-age\u003d31536000"
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -37,17 +37,14 @@
|
|||
"content-type": [
|
||||
"text/javascript; charset\u003dutf-8"
|
||||
],
|
||||
"critical-ch": [
|
||||
"Sec-CH-UA-Arch, Sec-CH-UA-Bitness, Sec-CH-UA-Full-Version, Sec-CH-UA-Full-Version-List, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version"
|
||||
],
|
||||
"cross-origin-opener-policy-report-only": [
|
||||
"same-origin; report-to\u003d\"youtube_main\""
|
||||
],
|
||||
"date": [
|
||||
"Fri, 12 Aug 2022 17:16:45 GMT"
|
||||
"Sun, 21 Aug 2022 16:38:47 GMT"
|
||||
],
|
||||
"expires": [
|
||||
"Fri, 12 Aug 2022 17:16:45 GMT"
|
||||
"Sun, 21 Aug 2022 16:38:47 GMT"
|
||||
],
|
||||
"p3p": [
|
||||
"CP\u003d\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl\u003den-GB for more info.\""
|
||||
|
@ -62,9 +59,9 @@
|
|||
"ESF"
|
||||
],
|
||||
"set-cookie": [
|
||||
"YSC\u003dK9DOXZ0zyRk; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dSat, 16-Nov-2019 17:16:45 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"CONSENT\u003dPENDING+273; expires\u003dSun, 11-Aug-2024 17:16:45 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||
"YSC\u003dLGlvlQyOQUM; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dMon, 25-Nov-2019 16:38:47 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"CONSENT\u003dPENDING+765; expires\u003dTue, 20-Aug-2024 16:38:47 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||
],
|
||||
"strict-transport-security": [
|
||||
"max-age\u003d31536000"
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -37,17 +37,14 @@
|
|||
"content-type": [
|
||||
"text/javascript; charset\u003dutf-8"
|
||||
],
|
||||
"critical-ch": [
|
||||
"Sec-CH-UA-Arch, Sec-CH-UA-Bitness, Sec-CH-UA-Full-Version, Sec-CH-UA-Full-Version-List, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version"
|
||||
],
|
||||
"cross-origin-opener-policy-report-only": [
|
||||
"same-origin; report-to\u003d\"youtube_main\""
|
||||
],
|
||||
"date": [
|
||||
"Fri, 12 Aug 2022 17:16:43 GMT"
|
||||
"Sun, 21 Aug 2022 16:38:51 GMT"
|
||||
],
|
||||
"expires": [
|
||||
"Fri, 12 Aug 2022 17:16:43 GMT"
|
||||
"Sun, 21 Aug 2022 16:38:51 GMT"
|
||||
],
|
||||
"p3p": [
|
||||
"CP\u003d\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl\u003den-GB for more info.\""
|
||||
|
@ -62,9 +59,9 @@
|
|||
"ESF"
|
||||
],
|
||||
"set-cookie": [
|
||||
"YSC\u003dlu4fkvyZAxU; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dSat, 16-Nov-2019 17:16:43 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"CONSENT\u003dPENDING+623; expires\u003dSun, 11-Aug-2024 17:16:43 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||
"YSC\u003dPF2mcCgU8NQ; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dMon, 25-Nov-2019 16:38:51 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"CONSENT\u003dPENDING+608; expires\u003dTue, 20-Aug-2024 16:38:51 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||
],
|
||||
"strict-transport-security": [
|
||||
"max-age\u003d31536000"
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -37,17 +37,14 @@
|
|||
"content-type": [
|
||||
"text/javascript; charset\u003dutf-8"
|
||||
],
|
||||
"critical-ch": [
|
||||
"Sec-CH-UA-Arch, Sec-CH-UA-Bitness, Sec-CH-UA-Full-Version, Sec-CH-UA-Full-Version-List, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version"
|
||||
],
|
||||
"cross-origin-opener-policy-report-only": [
|
||||
"same-origin; report-to\u003d\"youtube_main\""
|
||||
],
|
||||
"date": [
|
||||
"Fri, 12 Aug 2022 17:16:40 GMT"
|
||||
"Sun, 21 Aug 2022 16:37:11 GMT"
|
||||
],
|
||||
"expires": [
|
||||
"Fri, 12 Aug 2022 17:16:40 GMT"
|
||||
"Sun, 21 Aug 2022 16:37:11 GMT"
|
||||
],
|
||||
"p3p": [
|
||||
"CP\u003d\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl\u003den-GB for more info.\""
|
||||
|
@ -62,9 +59,9 @@
|
|||
"ESF"
|
||||
],
|
||||
"set-cookie": [
|
||||
"YSC\u003d4btN-niFGiY; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dSat, 16-Nov-2019 17:16:40 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"CONSENT\u003dPENDING+172; expires\u003dSun, 11-Aug-2024 17:16:40 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||
"YSC\u003dPkLFS2iAitE; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dMon, 25-Nov-2019 16:37:11 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"CONSENT\u003dPENDING+887; expires\u003dTue, 20-Aug-2024 16:37:11 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||
],
|
||||
"strict-transport-security": [
|
||||
"max-age\u003d31536000"
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -37,17 +37,14 @@
|
|||
"content-type": [
|
||||
"text/javascript; charset\u003dutf-8"
|
||||
],
|
||||
"critical-ch": [
|
||||
"Sec-CH-UA-Arch, Sec-CH-UA-Bitness, Sec-CH-UA-Full-Version, Sec-CH-UA-Full-Version-List, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version"
|
||||
],
|
||||
"cross-origin-opener-policy-report-only": [
|
||||
"same-origin; report-to\u003d\"youtube_main\""
|
||||
],
|
||||
"date": [
|
||||
"Fri, 12 Aug 2022 17:16:41 GMT"
|
||||
"Sun, 21 Aug 2022 16:38:52 GMT"
|
||||
],
|
||||
"expires": [
|
||||
"Fri, 12 Aug 2022 17:16:41 GMT"
|
||||
"Sun, 21 Aug 2022 16:38:52 GMT"
|
||||
],
|
||||
"p3p": [
|
||||
"CP\u003d\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl\u003den-GB for more info.\""
|
||||
|
@ -62,9 +59,9 @@
|
|||
"ESF"
|
||||
],
|
||||
"set-cookie": [
|
||||
"YSC\u003d5SzFkp8Nmuw; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dSat, 16-Nov-2019 17:16:41 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"CONSENT\u003dPENDING+194; expires\u003dSun, 11-Aug-2024 17:16:41 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||
"YSC\u003d9ZuBX_amuYc; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dMon, 25-Nov-2019 16:38:52 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"CONSENT\u003dPENDING+017; expires\u003dTue, 20-Aug-2024 16:38:52 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||
],
|
||||
"strict-transport-security": [
|
||||
"max-age\u003d31536000"
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -37,17 +37,14 @@
|
|||
"content-type": [
|
||||
"text/javascript; charset\u003dutf-8"
|
||||
],
|
||||
"critical-ch": [
|
||||
"Sec-CH-UA-Arch, Sec-CH-UA-Bitness, Sec-CH-UA-Full-Version, Sec-CH-UA-Full-Version-List, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version"
|
||||
],
|
||||
"cross-origin-opener-policy-report-only": [
|
||||
"same-origin; report-to\u003d\"youtube_main\""
|
||||
],
|
||||
"date": [
|
||||
"Fri, 12 Aug 2022 17:16:42 GMT"
|
||||
"Sun, 21 Aug 2022 16:38:55 GMT"
|
||||
],
|
||||
"expires": [
|
||||
"Fri, 12 Aug 2022 17:16:42 GMT"
|
||||
"Sun, 21 Aug 2022 16:38:55 GMT"
|
||||
],
|
||||
"p3p": [
|
||||
"CP\u003d\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl\u003den-GB for more info.\""
|
||||
|
@ -62,9 +59,9 @@
|
|||
"ESF"
|
||||
],
|
||||
"set-cookie": [
|
||||
"YSC\u003dOi24IxlsbgM; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dSat, 16-Nov-2019 17:16:42 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"CONSENT\u003dPENDING+126; expires\u003dSun, 11-Aug-2024 17:16:42 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||
"YSC\u003d26HXucc95mk; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dMon, 25-Nov-2019 16:38:55 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"CONSENT\u003dPENDING+335; expires\u003dTue, 20-Aug-2024 16:38:55 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||
],
|
||||
"strict-transport-security": [
|
||||
"max-age\u003d31536000"
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -44,10 +44,10 @@
|
|||
"same-origin; report-to\u003d\"youtube_main\""
|
||||
],
|
||||
"date": [
|
||||
"Fri, 12 Aug 2022 17:15:19 GMT"
|
||||
"Sun, 14 Aug 2022 12:51:07 GMT"
|
||||
],
|
||||
"expires": [
|
||||
"Fri, 12 Aug 2022 17:15:19 GMT"
|
||||
"Sun, 14 Aug 2022 12:51:07 GMT"
|
||||
],
|
||||
"p3p": [
|
||||
"CP\u003d\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl\u003den-GB for more info.\""
|
||||
|
@ -62,9 +62,9 @@
|
|||
"ESF"
|
||||
],
|
||||
"set-cookie": [
|
||||
"YSC\u003d3cfmLDXRL-I; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dSat, 16-Nov-2019 17:15:19 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"CONSENT\u003dPENDING+284; expires\u003dSun, 11-Aug-2024 17:15:19 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||
"YSC\u003dwDB2v601q14; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dMon, 18-Nov-2019 12:51:07 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"CONSENT\u003dPENDING+276; expires\u003dTue, 13-Aug-2024 12:51:07 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||
],
|
||||
"strict-transport-security": [
|
||||
"max-age\u003d31536000"
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -25,9 +25,6 @@
|
|||
"content-type": [
|
||||
"text/javascript; charset\u003dutf-8"
|
||||
],
|
||||
"critical-ch": [
|
||||
"Sec-CH-UA-Arch, Sec-CH-UA-Bitness, Sec-CH-UA-Full-Version, Sec-CH-UA-Full-Version-List, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version"
|
||||
],
|
||||
"cross-origin-opener-policy-report-only": [
|
||||
"same-origin; report-to\u003d\"youtube_main\""
|
||||
],
|
||||
|
@ -35,10 +32,10 @@
|
|||
"cross-origin"
|
||||
],
|
||||
"date": [
|
||||
"Fri, 12 Aug 2022 17:16:20 GMT"
|
||||
"Sun, 21 Aug 2022 16:38:05 GMT"
|
||||
],
|
||||
"expires": [
|
||||
"Fri, 12 Aug 2022 17:16:20 GMT"
|
||||
"Sun, 21 Aug 2022 16:38:05 GMT"
|
||||
],
|
||||
"p3p": [
|
||||
"CP\u003d\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl\u003den-GB for more info.\""
|
||||
|
@ -53,9 +50,9 @@
|
|||
"ESF"
|
||||
],
|
||||
"set-cookie": [
|
||||
"YSC\u003dnrs3dIuSyOU; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"VISITOR_INFO1_LIVE\u003dI4TriyjOMs0; Domain\u003d.youtube.com; Expires\u003dWed, 08-Feb-2023 17:16:20 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"CONSENT\u003dPENDING+733; expires\u003dSun, 11-Aug-2024 17:16:20 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||
"YSC\u003deRIdTZy8lIc; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"VISITOR_INFO1_LIVE\u003dmLomAg1nFh4; Domain\u003d.youtube.com; Expires\u003dFri, 17-Feb-2023 16:38:05 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"CONSENT\u003dPENDING+622; expires\u003dTue, 20-Aug-2024 16:38:05 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||
],
|
||||
"strict-transport-security": [
|
||||
"max-age\u003d31536000"
|
||||
|
@ -70,7 +67,7 @@
|
|||
"0"
|
||||
]
|
||||
},
|
||||
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/4c3f79c5\\/www-widgetapi.vflset\\/www-widgetapi.js\u0027;try{var ttPolicy\u003dwindow.trustedTypes.createPolicy(\"youtube-widget-api\",{createScriptURL:function(x){return x}});scriptUrl\u003dttPolicy.createScriptURL(scriptUrl)}catch(e){}if(!window[\"YT\"])var YT\u003d{loading:0,loaded:0};if(!window[\"YTConfig\"])var YTConfig\u003d{\"host\":\"https://www.youtube.com\"};\nif(!YT.loading){YT.loading\u003d1;(function(){var l\u003d[];YT.ready\u003dfunction(f){if(YT.loaded)f();else l.push(f)};window.onYTReady\u003dfunction(){YT.loaded\u003d1;for(var i\u003d0;i\u003cl.length;i++)try{l[i]()}catch(e$0){}};YT.setConfig\u003dfunction(c){for(var k in c)if(c.hasOwnProperty(k))YTConfig[k]\u003dc[k]};var a\u003ddocument.createElement(\"script\");a.type\u003d\"text/javascript\";a.id\u003d\"www-widgetapi-script\";a.src\u003dscriptUrl;a.async\u003dtrue;var c\u003ddocument.currentScript;if(c){var n\u003dc.nonce||c.getAttribute(\"nonce\");if(n)a.setAttribute(\"nonce\",n)}var b\u003d\ndocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
|
||||
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/009f1d77\\/www-widgetapi.vflset\\/www-widgetapi.js\u0027;try{var ttPolicy\u003dwindow.trustedTypes.createPolicy(\"youtube-widget-api\",{createScriptURL:function(x){return x}});scriptUrl\u003dttPolicy.createScriptURL(scriptUrl)}catch(e){}if(!window[\"YT\"])var YT\u003d{loading:0,loaded:0};if(!window[\"YTConfig\"])var YTConfig\u003d{\"host\":\"https://www.youtube.com\"};\nif(!YT.loading){YT.loading\u003d1;(function(){var l\u003d[];YT.ready\u003dfunction(f){if(YT.loaded)f();else l.push(f)};window.onYTReady\u003dfunction(){YT.loaded\u003d1;for(var i\u003d0;i\u003cl.length;i++)try{l[i]()}catch(e$0){}};YT.setConfig\u003dfunction(c){for(var k in c)if(c.hasOwnProperty(k))YTConfig[k]\u003dc[k]};var a\u003ddocument.createElement(\"script\");a.type\u003d\"text/javascript\";a.id\u003d\"www-widgetapi-script\";a.src\u003dscriptUrl;a.async\u003dtrue;var c\u003ddocument.currentScript;if(c){var n\u003dc.nonce||c.getAttribute(\"nonce\");if(n)a.setAttribute(\"nonce\",n)}var b\u003d\ndocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
|
||||
"latestUrl": "https://www.youtube.com/iframe_api"
|
||||
}
|
||||
}
|
File diff suppressed because one or more lines are too long
|
@ -37,17 +37,14 @@
|
|||
"content-type": [
|
||||
"text/javascript; charset\u003dutf-8"
|
||||
],
|
||||
"critical-ch": [
|
||||
"Sec-CH-UA-Arch, Sec-CH-UA-Bitness, Sec-CH-UA-Full-Version, Sec-CH-UA-Full-Version-List, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version"
|
||||
],
|
||||
"cross-origin-opener-policy-report-only": [
|
||||
"same-origin; report-to\u003d\"youtube_main\""
|
||||
],
|
||||
"date": [
|
||||
"Fri, 12 Aug 2022 17:16:20 GMT"
|
||||
"Sun, 21 Aug 2022 16:38:07 GMT"
|
||||
],
|
||||
"expires": [
|
||||
"Fri, 12 Aug 2022 17:16:20 GMT"
|
||||
"Sun, 21 Aug 2022 16:38:07 GMT"
|
||||
],
|
||||
"p3p": [
|
||||
"CP\u003d\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl\u003den-GB for more info.\""
|
||||
|
@ -62,9 +59,9 @@
|
|||
"ESF"
|
||||
],
|
||||
"set-cookie": [
|
||||
"YSC\u003dEHE6P3OVrNg; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dSat, 16-Nov-2019 17:16:20 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"CONSENT\u003dPENDING+775; expires\u003dSun, 11-Aug-2024 17:16:20 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||
"YSC\u003dn0iNRR1XrY0; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dMon, 25-Nov-2019 16:38:07 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
||||
"CONSENT\u003dPENDING+968; expires\u003dTue, 20-Aug-2024 16:38:07 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||
],
|
||||
"strict-transport-security": [
|
||||
"max-age\u003d31536000"
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue