mirror of
https://github.com/TeamNewPipe/NewPipeExtractor.git
synced 2024-12-14 06:10:33 +05:30
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.UTF_8;
|
||||||
import static org.schabi.newpipe.extractor.utils.Utils.getStringResultFromRegexArray;
|
import static org.schabi.newpipe.extractor.utils.Utils.getStringResultFromRegexArray;
|
||||||
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
|
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
|
||||||
|
|
||||||
import static java.util.Collections.singletonList;
|
import static java.util.Collections.singletonList;
|
||||||
|
|
||||||
import com.grack.nanojson.JsonArray;
|
import com.grack.nanojson.JsonArray;
|
||||||
@ -234,28 +233,6 @@ public final class YoutubeParsingHelper {
|
|||||||
|
|
||||||
private static Random numberGenerator = new SecureRandom();
|
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 =
|
private static final String FEED_BASE_CHANNEL_ID =
|
||||||
"https://www.youtube.com/feeds/videos.xml?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=";
|
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_ANDROID_PATTERN = Pattern.compile("&c=ANDROID");
|
||||||
private static final Pattern C_IOS_PATTERN = Pattern.compile("&c=IOS");
|
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) {
|
private static boolean isGoogleURL(final String url) {
|
||||||
final String cachedUrl = extractCachedUrlIfNeeded(url);
|
final String cachedUrl = extractCachedUrlIfNeeded(url);
|
||||||
try {
|
try {
|
||||||
@ -1378,7 +1372,6 @@ public final class YoutubeParsingHelper {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Add the <code>CONSENT</code> cookie to prevent redirect to <code>consent.youtube.com</code>
|
* 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
|
* @param headers the headers which should be completed
|
||||||
*/
|
*/
|
||||||
public static void addCookieHeader(@Nonnull final Map<String, List<String>> headers) {
|
public static void addCookieHeader(@Nonnull final Map<String, List<String>> headers) {
|
||||||
@ -1391,8 +1384,13 @@ public final class YoutubeParsingHelper {
|
|||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
public static String generateConsentCookie() {
|
public static String generateConsentCookie() {
|
||||||
final int statusCode = 100 + numberGenerator.nextInt(900);
|
return "CONSENT=" + (isConsentAccepted()
|
||||||
return CONSENT_COOKIE + statusCode;
|
// 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,
|
public static String extractCookieValue(final String cookieName,
|
||||||
@ -1612,16 +1610,6 @@ public final class YoutubeParsingHelper {
|
|||||||
return false;
|
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
|
* 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).
|
* 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) {
|
public static boolean isIosStreamingUrl(@Nonnull final String url) {
|
||||||
return Parser.isMatch(C_IOS_PATTERN, 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.Parser;
|
||||||
import org.schabi.newpipe.extractor.utils.StringUtils;
|
import org.schabi.newpipe.extractor.utils.StringUtils;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* YouTube's streaming URLs of HTML5 clients are protected with a cipher, which modifies their
|
* YouTube's streaming URLs of HTML5 clients are protected with a cipher, which modifies their
|
||||||
* {@code n} query parameter.
|
* {@code n} query parameter.
|
||||||
@ -128,16 +129,25 @@ public final class YoutubeThrottlingDecrypter {
|
|||||||
private static String parseWithParenthesisMatching(final String playerJsCode,
|
private static String parseWithParenthesisMatching(final String playerJsCode,
|
||||||
final String functionName) {
|
final String functionName) {
|
||||||
final String functionBase = functionName + "=function";
|
final String functionBase = functionName + "=function";
|
||||||
return functionBase + StringUtils.matchToClosingParenthesis(playerJsCode, functionBase)
|
return validateFunction(functionBase
|
||||||
+ ";";
|
+ StringUtils.matchToClosingParenthesis(playerJsCode, functionBase)
|
||||||
|
+ ";");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private static String parseWithRegex(final String playerJsCode, final String functionName)
|
private static String parseWithRegex(final String playerJsCode, final String functionName)
|
||||||
throws Parser.RegexException {
|
throws Parser.RegexException {
|
||||||
final Pattern functionPattern = Pattern.compile(functionName + "=function(.*?}};)\n",
|
final Pattern functionPattern = Pattern.compile(functionName + "=function(.*?};)\n",
|
||||||
Pattern.DOTALL);
|
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) {
|
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.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.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.extractCookieValue;
|
||||||
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.extractPlaylistTypeFromPlaylistId;
|
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.extractPlaylistTypeFromPlaylistId;
|
||||||
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getKey;
|
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.StreamingService;
|
||||||
import org.schabi.newpipe.extractor.downloader.Downloader;
|
import org.schabi.newpipe.extractor.downloader.Downloader;
|
||||||
import org.schabi.newpipe.extractor.downloader.Response;
|
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.ExtractionException;
|
||||||
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
||||||
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
|
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 byte[] body = JsonWriter.string(jsonBody.done()).getBytes(StandardCharsets.UTF_8);
|
||||||
|
|
||||||
final Map<String, List<String>> headers = new HashMap<>();
|
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()
|
final Response response = getDownloader().post(YOUTUBEI_V1_URL + "next?key=" + getKey()
|
||||||
+ DISABLE_PRETTY_PRINT_PARAMETER, headers, body, localization);
|
+ DISABLE_PRETTY_PRINT_PARAMETER, headers, body, localization);
|
||||||
|
|
||||||
initialData = JsonUtils.toJsonObject(getValidJsonResponseBody(response));
|
initialData = JsonUtils.toJsonObject(getValidJsonResponseBody(response));
|
||||||
playlistData = initialData.getObject("contents").getObject("twoColumnWatchNextResults")
|
playlistData = initialData
|
||||||
.getObject("playlist").getObject("playlist");
|
.getObject("contents")
|
||||||
|
.getObject("twoColumnWatchNextResults")
|
||||||
|
.getObject("playlist")
|
||||||
|
.getObject("playlist");
|
||||||
if (isNullOrEmpty(playlistData)) {
|
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);
|
cookieValue = extractCookieValue(COOKIE_NAME, response);
|
||||||
}
|
}
|
||||||
@ -212,7 +223,8 @@ public class YoutubeMixPlaylistExtractor extends PlaylistExtractor {
|
|||||||
|
|
||||||
final StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId());
|
final StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId());
|
||||||
final Map<String, List<String>> headers = new HashMap<>();
|
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(),
|
final Response response = getDownloader().post(page.getUrl(), headers, page.getBody(),
|
||||||
getExtractorLocalization());
|
getExtractorLocalization());
|
||||||
|
@ -22,6 +22,7 @@ import com.grack.nanojson.JsonWriter;
|
|||||||
|
|
||||||
import org.schabi.newpipe.extractor.InfoItem;
|
import org.schabi.newpipe.extractor.InfoItem;
|
||||||
import org.schabi.newpipe.extractor.MetaInfo;
|
import org.schabi.newpipe.extractor.MetaInfo;
|
||||||
|
import org.schabi.newpipe.extractor.MultiInfoItemsCollector;
|
||||||
import org.schabi.newpipe.extractor.Page;
|
import org.schabi.newpipe.extractor.Page;
|
||||||
import org.schabi.newpipe.extractor.StreamingService;
|
import org.schabi.newpipe.extractor.StreamingService;
|
||||||
import org.schabi.newpipe.extractor.downloader.Downloader;
|
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.linkhandler.SearchQueryHandler;
|
||||||
import org.schabi.newpipe.extractor.localization.DateWrapper;
|
import org.schabi.newpipe.extractor.localization.DateWrapper;
|
||||||
import org.schabi.newpipe.extractor.localization.TimeAgoParser;
|
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.search.SearchExtractor;
|
||||||
import org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper;
|
import org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper;
|
||||||
import org.schabi.newpipe.extractor.utils.JsonUtils;
|
import org.schabi.newpipe.extractor.utils.JsonUtils;
|
||||||
@ -43,6 +43,7 @@ import java.util.Collections;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
@ -133,28 +134,34 @@ public class YoutubeMusicSearchExtractor extends SearchExtractor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
private List<JsonObject> getItemSectionRendererContents() {
|
||||||
@Override
|
return initialData
|
||||||
public String getUrl() throws ParsingException {
|
.getObject("contents")
|
||||||
return super.getUrl();
|
.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
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
public String getSearchSuggestion() throws ParsingException {
|
public String getSearchSuggestion() throws ParsingException {
|
||||||
final JsonObject itemSectionRenderer = JsonUtils.getArray(JsonUtils.getArray(initialData,
|
for (final JsonObject obj : getItemSectionRendererContents()) {
|
||||||
"contents.tabbedSearchResultsRenderer.tabs").getObject(0),
|
final JsonObject didYouMeanRenderer = obj
|
||||||
"tabRenderer.content.sectionListRenderer.contents")
|
.getObject("didYouMeanRenderer");
|
||||||
.getObject(0)
|
final JsonObject showingResultsForRenderer = obj
|
||||||
.getObject("itemSectionRenderer");
|
|
||||||
if (itemSectionRenderer.isEmpty()) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
final JsonObject didYouMeanRenderer = itemSectionRenderer.getArray("contents")
|
|
||||||
.getObject(0).getObject("didYouMeanRenderer");
|
|
||||||
final JsonObject showingResultsForRenderer = itemSectionRenderer.getArray("contents")
|
|
||||||
.getObject(0)
|
|
||||||
.getObject("showingResultsForRenderer");
|
.getObject("showingResultsForRenderer");
|
||||||
|
|
||||||
if (!didYouMeanRenderer.isEmpty()) {
|
if (!didYouMeanRenderer.isEmpty()) {
|
||||||
@ -162,26 +169,17 @@ public class YoutubeMusicSearchExtractor extends SearchExtractor {
|
|||||||
} else if (!showingResultsForRenderer.isEmpty()) {
|
} else if (!showingResultsForRenderer.isEmpty()) {
|
||||||
return JsonUtils.getString(showingResultsForRenderer,
|
return JsonUtils.getString(showingResultsForRenderer,
|
||||||
"correctedQueryEndpoint.searchEndpoint.query");
|
"correctedQueryEndpoint.searchEndpoint.query");
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isCorrectedSearch() throws ParsingException {
|
public boolean isCorrectedSearch() throws ParsingException {
|
||||||
final JsonObject itemSectionRenderer = JsonUtils.getArray(JsonUtils.getArray(initialData,
|
return getItemSectionRendererContents()
|
||||||
"contents.tabbedSearchResultsRenderer.tabs").getObject(0),
|
.stream()
|
||||||
"tabRenderer.content.sectionListRenderer.contents")
|
.anyMatch(obj -> obj.has("showingResultsForRenderer"));
|
||||||
.getObject(0)
|
|
||||||
.getObject("itemSectionRenderer");
|
|
||||||
if (itemSectionRenderer.isEmpty()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final JsonObject firstContent = itemSectionRenderer.getArray("contents").getObject(0);
|
|
||||||
|
|
||||||
return firstContent.has("didYouMeanRenderer")
|
|
||||||
|| firstContent.has("showingResultsForRenderer");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
|
@ -9,6 +9,18 @@ public final class JavaScript {
|
|||||||
private 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,
|
public static String run(final String function,
|
||||||
final String functionName,
|
final String functionName,
|
||||||
final String... parameters) {
|
final String... parameters) {
|
||||||
|
@ -36,7 +36,7 @@ public class BandcampSearchExtractorTest {
|
|||||||
* the accordingly named song by Zach Benson
|
* the accordingly named song by Zach Benson
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testStreamSearch() throws ExtractionException, IOException {
|
void testStreamSearch() throws ExtractionException, IOException {
|
||||||
final SearchExtractor extractor = Bandcamp.getSearchExtractor("best friend's basement");
|
final SearchExtractor extractor = Bandcamp.getSearchExtractor("best friend's basement");
|
||||||
|
|
||||||
final ListExtractor.InfoItemsPage<InfoItem> page = extractor.getInitialPage();
|
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
|
* Tests whether searching bandcamp for "C418" returns the artist's profile
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testChannelSearch() throws ExtractionException, IOException {
|
void testChannelSearch() throws ExtractionException, IOException {
|
||||||
final SearchExtractor extractor = Bandcamp.getSearchExtractor("C418");
|
final SearchExtractor extractor = Bandcamp.getSearchExtractor("C418");
|
||||||
final InfoItem c418 = extractor.getInitialPage()
|
final InfoItem c418 = extractor.getInitialPage()
|
||||||
.getItems().get(0);
|
.getItems().get(0);
|
||||||
@ -71,19 +71,21 @@ public class BandcampSearchExtractorTest {
|
|||||||
* Tests whether searching bandcamp for "minecraft volume alpha" returns the corresponding album
|
* Tests whether searching bandcamp for "minecraft volume alpha" returns the corresponding album
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testAlbumSearch() throws ExtractionException, IOException {
|
void testAlbumSearch() throws ExtractionException, IOException {
|
||||||
final SearchExtractor extractor = Bandcamp.getSearchExtractor("minecraft volume alpha");
|
final SearchExtractor extractor = Bandcamp.getSearchExtractor("minecraft volume alpha");
|
||||||
InfoItem minecraft = extractor.getInitialPage()
|
InfoItem minecraft = extractor.getInitialPage()
|
||||||
.getItems().get(0);
|
.getItems().get(0);
|
||||||
|
|
||||||
// Minecraft volume alpha should be the first result, no?
|
// 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().endsWith(".jpg"));
|
||||||
assertTrue(minecraft.getThumbnailUrl().contains("f4.bcbits.com/img/"));
|
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
|
// 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
|
* Tests searches with multiple pages
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testMultiplePages() throws ExtractionException, IOException {
|
void testMultiplePages() throws ExtractionException, IOException {
|
||||||
// A query practically guaranteed to have the maximum amount of pages
|
// A query practically guaranteed to have the maximum amount of pages
|
||||||
final SearchExtractor extractor = Bandcamp.getSearchExtractor("e");
|
final SearchExtractor extractor = Bandcamp.getSearchExtractor("e");
|
||||||
|
|
||||||
|
@ -20,55 +20,60 @@ public class PeertubePlaylistExtractorTest {
|
|||||||
@BeforeAll
|
@BeforeAll
|
||||||
public static void setUp() throws Exception {
|
public static void setUp() throws Exception {
|
||||||
NewPipe.init(DownloaderTestImpl.getInstance());
|
NewPipe.init(DownloaderTestImpl.getInstance());
|
||||||
extractor = (PeertubePlaylistExtractor) PeerTube
|
extractor = (PeertubePlaylistExtractor) PeerTube.getPlaylistExtractor(
|
||||||
.getPlaylistExtractor("https://framatube.org/videos/watch/playlist/96b0ee2b-a5a7-4794-8769-58d8ccb79ab7");
|
"https://framatube.org/videos/watch/playlist/96b0ee2b-a5a7-4794-8769-58d8ccb79ab7");
|
||||||
extractor.fetchPage();
|
extractor.fetchPage();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetName() throws ParsingException {
|
void testGetName() throws ParsingException {
|
||||||
assertEquals("Shocking !", extractor.getName());
|
assertEquals("Shocking !", extractor.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Disabled("URL changes with every request")
|
@Disabled("URL changes with every request")
|
||||||
public void testGetThumbnailUrl() throws ParsingException {
|
void testGetThumbnailUrl() throws ParsingException {
|
||||||
assertEquals("https://framatube.org/static/thumbnails/playlist-96b0ee2b-a5a7-4794-8769-58d8ccb79ab7.jpg", extractor.getThumbnailUrl());
|
assertEquals(
|
||||||
|
"https://framatube.org/static/thumbnails/playlist-96b0ee2b-a5a7-4794-8769-58d8ccb79ab7.jpg",
|
||||||
|
extractor.getThumbnailUrl());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetUploaderUrl() throws ParsingException {
|
void testGetUploaderUrl() throws ParsingException {
|
||||||
assertEquals("https://skeptikon.fr/accounts/metadechoc", extractor.getUploaderUrl());
|
assertEquals("https://skeptikon.fr/accounts/metadechoc", extractor.getUploaderUrl());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetUploaderAvatarUrl() throws ParsingException {
|
void testGetUploaderAvatarUrl() throws ParsingException {
|
||||||
assertEquals("https://framatube.org/lazy-static/avatars/c6801ff9-cb49-42e6-b2db-3db623248115.jpg", extractor.getUploaderAvatarUrl());
|
assertEquals(
|
||||||
|
"https://framatube.org/lazy-static/avatars/cd0f781d-0287-4be2-94f1-24cd732337b2.jpg",
|
||||||
|
extractor.getUploaderAvatarUrl());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetUploaderName() throws ParsingException {
|
void testGetUploaderName() throws ParsingException {
|
||||||
assertEquals("Méta de Choc", extractor.getUploaderName());
|
assertEquals("Méta de Choc", extractor.getUploaderName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetStreamCount() throws ParsingException {
|
void testGetStreamCount() throws ParsingException {
|
||||||
ExtractorAsserts.assertGreaterOrEqual(39, extractor.getStreamCount());
|
ExtractorAsserts.assertGreaterOrEqual(39, extractor.getStreamCount());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetSubChannelUrl() throws ParsingException {
|
void testGetSubChannelUrl() throws ParsingException {
|
||||||
assertEquals("https://skeptikon.fr/video-channels/metadechoc_channel", extractor.getSubChannelUrl());
|
assertEquals("https://skeptikon.fr/video-channels/metadechoc_channel", extractor.getSubChannelUrl());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetSubChannelName() throws ParsingException {
|
void testGetSubChannelName() throws ParsingException {
|
||||||
assertEquals("SHOCKING !", extractor.getSubChannelName());
|
assertEquals("SHOCKING !", extractor.getSubChannelName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetSubChannelAvatarUrl() throws ParsingException {
|
void testGetSubChannelAvatarUrl() throws ParsingException {
|
||||||
assertEquals("https://framatube.org/lazy-static/avatars/e801ccce-8694-4309-b0ab-e6f0e552ef77.png",
|
assertEquals(
|
||||||
|
"https://framatube.org/lazy-static/avatars/637753af-fcf2-4b61-88f9-b9857c953457.png",
|
||||||
extractor.getSubChannelAvatarUrl());
|
extractor.getSubChannelAvatarUrl());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,9 @@ package org.schabi.newpipe.extractor.services.soundcloud;
|
|||||||
|
|
||||||
import org.junit.jupiter.api.BeforeAll;
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
import org.junit.jupiter.api.Test;
|
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.downloader.DownloaderTestImpl;
|
||||||
import org.schabi.newpipe.extractor.NewPipe;
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
||||||
@ -25,57 +28,54 @@ public class SoundcloudStreamLinkHandlerFactoryTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getIdWithNullAsUrl() {
|
void getIdWithNullAsUrl() {
|
||||||
assertThrows(IllegalArgumentException.class, () -> linkHandler.fromUrl(null));
|
assertThrows(IllegalArgumentException.class, () -> linkHandler.fromUrl(null));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@ParameterizedTest
|
||||||
public void getIdForInvalidUrls() {
|
@ValueSource(strings = {
|
||||||
List<String> invalidUrls = new ArrayList<>(50);
|
"https://soundcloud.com/liluzivert/t.e.s.t",
|
||||||
invalidUrls.add("https://soundcloud.com/liluzivert/t.e.s.t");
|
"https://soundcloud.com/liluzivert/tracks",
|
||||||
invalidUrls.add("https://soundcloud.com/liluzivert/tracks");
|
"https://soundcloud.com/"
|
||||||
invalidUrls.add("https://soundcloud.com/");
|
})
|
||||||
for (String invalidUrl : invalidUrls) {
|
void getIdForInvalidUrls(final String invalidUrl) {
|
||||||
Throwable exception = null;
|
assertThrows(ParsingException.class, () -> linkHandler.fromUrl(invalidUrl).getId());
|
||||||
try {
|
|
||||||
linkHandler.fromUrl(invalidUrl).getId();
|
|
||||||
} catch (ParsingException e) {
|
|
||||||
exception = e;
|
|
||||||
}
|
|
||||||
if (exception == null) {
|
|
||||||
fail("Expected ParsingException for url: " + invalidUrl);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@ParameterizedTest
|
||||||
public void getId() throws Exception {
|
@CsvSource(value = {
|
||||||
assertEquals("309689103", linkHandler.fromUrl("https://soundcloud.com/liluzivert/15-ysl").getId());
|
"309689103,https://soundcloud.com/liluzivert/15-ysl",
|
||||||
assertEquals("309689082", linkHandler.fromUrl("https://www.soundcloud.com/liluzivert/15-luv-scars-ko").getId());
|
"309689082,https://www.soundcloud.com/liluzivert/15-luv-scars-ko",
|
||||||
assertEquals("309689035", linkHandler.fromUrl("http://soundcloud.com/liluzivert/15-boring-shit").getId());
|
"309689035,http://soundcloud.com/liluzivert/15-boring-shit",
|
||||||
assertEquals("259273264", linkHandler.fromUrl("https://soundcloud.com/liluzivert/ps-qs-produced-by-don-cannon/").getId());
|
"259273264,https://soundcloud.com/liluzivert/ps-qs-produced-by-don-cannon/",
|
||||||
assertEquals("294488599", linkHandler.fromUrl("http://www.soundcloud.com/liluzivert/secure-the-bag-produced-by-glohan-beats").getId());
|
"294488599,http://www.soundcloud.com/liluzivert/secure-the-bag-produced-by-glohan-beats",
|
||||||
assertEquals("294488438", linkHandler.fromUrl("HtTpS://sOuNdClOuD.cOm/LiLuZiVeRt/In-O4-pRoDuCeD-bY-dP-bEaTz").getId());
|
"245710200,HtTpS://sOuNdClOuD.cOm/lIeuTeNaNt_rAe/bOtS-wAs-wOlLeN-wIr-tRinKeN",
|
||||||
assertEquals("294488147", linkHandler.fromUrl("https://soundcloud.com/liluzivert/fresh-produced-by-zaytoven#t=69").getId());
|
"294488147,https://soundcloud.com/liluzivert/fresh-produced-by-zaytoven#t=69",
|
||||||
assertEquals("294487876", linkHandler.fromUrl("https://soundcloud.com/liluzivert/threesome-produced-by-zaytoven#t=1:09").getId());
|
"294487876,https://soundcloud.com/liluzivert/threesome-produced-by-zaytoven#t=1:09",
|
||||||
assertEquals("294487684", linkHandler.fromUrl("https://soundcloud.com/liluzivert/blonde-brigitte-produced-manny-fresh#t=1:9").getId());
|
"294487684,https://soundcloud.com/liluzivert/blonde-brigitte-produced-manny-fresh#t=1:9",
|
||||||
assertEquals("294487428", linkHandler.fromUrl("https://soundcloud.com/liluzivert/today-produced-by-c-note#t=1m9s").getId());
|
"294487428,https://soundcloud.com/liluzivert/today-produced-by-c-note#t=1m9s",
|
||||||
assertEquals("294487157", linkHandler.fromUrl("https://soundcloud.com/liluzivert/changed-my-phone-produced-by-c-note#t=1m09s").getId());
|
"294487157,https://soundcloud.com/liluzivert/changed-my-phone-produced-by-c-note#t=1m09s",
|
||||||
assertEquals("44556776", linkHandler.fromUrl("https://soundcloud.com/kechuspider-sets-1/last-days").getId());
|
"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
|
@ParameterizedTest
|
||||||
public void testAcceptUrl() throws ParsingException {
|
@ValueSource(strings = {
|
||||||
assertTrue(linkHandler.acceptUrl("https://soundcloud.com/liluzivert/15-ysl"));
|
"https://soundcloud.com/liluzivert/15-ysl",
|
||||||
assertTrue(linkHandler.acceptUrl("https://www.soundcloud.com/liluzivert/15-luv-scars-ko"));
|
"https://www.soundcloud.com/liluzivert/15-luv-scars-ko",
|
||||||
assertTrue(linkHandler.acceptUrl("http://soundcloud.com/liluzivert/15-boring-shit"));
|
"http://soundcloud.com/liluzivert/15-boring-shit",
|
||||||
assertTrue(linkHandler.acceptUrl("http://www.soundcloud.com/liluzivert/secure-the-bag-produced-by-glohan-beats"));
|
"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"));
|
"HtTpS://sOuNdClOuD.cOm/LiLuZiVeRt/In-O4-pRoDuCeD-bY-dP-bEaTz",
|
||||||
assertTrue(linkHandler.acceptUrl("https://soundcloud.com/liluzivert/fresh-produced-by-zaytoven#t=69"));
|
"https://soundcloud.com/liluzivert/fresh-produced-by-zaytoven#t=69",
|
||||||
assertTrue(linkHandler.acceptUrl("https://soundcloud.com/liluzivert/threesome-produced-by-zaytoven#t=1:09"));
|
"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"));
|
"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"));
|
"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"));
|
"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
|
@Test
|
||||||
public void getIdWithNullAsUrl() {
|
public void getIdWithNullAsUrl() {
|
||||||
assertThrows(IllegalArgumentException.class, () -> linkHandler.fromId(null));
|
assertThrows(NullPointerException.class, () -> linkHandler.fromId(null));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -6,7 +6,10 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
|
|||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
import static org.schabi.newpipe.extractor.ExtractorAsserts.assertIsSecureUrl;
|
import static org.schabi.newpipe.extractor.ExtractorAsserts.assertIsSecureUrl;
|
||||||
import static org.schabi.newpipe.extractor.ServiceList.YouTube;
|
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;
|
import com.grack.nanojson.JsonWriter;
|
||||||
|
|
||||||
@ -39,12 +42,13 @@ public class YoutubeMixPlaylistExtractorTest {
|
|||||||
private static YoutubeMixPlaylistExtractor extractor;
|
private static YoutubeMixPlaylistExtractor extractor;
|
||||||
|
|
||||||
public static class Mix {
|
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 – ";
|
private static final String VIDEO_TITLE = "Mix – ";
|
||||||
|
|
||||||
@BeforeAll
|
@BeforeAll
|
||||||
public static void setUp() throws Exception {
|
public static void setUp() throws Exception {
|
||||||
YoutubeTestsUtils.ensureStateless();
|
YoutubeTestsUtils.ensureStateless();
|
||||||
|
YoutubeParsingHelper.setConsentAccepted(true);
|
||||||
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "mix"));
|
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "mix"));
|
||||||
dummyCookie.put(YoutubeMixPlaylistExtractor.COOKIE_NAME, "whatever");
|
dummyCookie.put(YoutubeMixPlaylistExtractor.COOKIE_NAME, "whatever");
|
||||||
extractor = (YoutubeMixPlaylistExtractor) YouTube
|
extractor = (YoutubeMixPlaylistExtractor) YouTube
|
||||||
@ -132,14 +136,15 @@ public class YoutubeMixPlaylistExtractorTest {
|
|||||||
|
|
||||||
public static class MixWithIndex {
|
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 String VIDEO_TITLE = "Mix – ";
|
||||||
private static final int INDEX = 7; // YT starts the index with 1...
|
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
|
@BeforeAll
|
||||||
public static void setUp() throws Exception {
|
public static void setUp() throws Exception {
|
||||||
YoutubeTestsUtils.ensureStateless();
|
YoutubeTestsUtils.ensureStateless();
|
||||||
|
YoutubeParsingHelper.setConsentAccepted(true);
|
||||||
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "mixWithIndex"));
|
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "mixWithIndex"));
|
||||||
dummyCookie.put(YoutubeMixPlaylistExtractor.COOKIE_NAME, "whatever");
|
dummyCookie.put(YoutubeMixPlaylistExtractor.COOKIE_NAME, "whatever");
|
||||||
extractor = (YoutubeMixPlaylistExtractor) YouTube
|
extractor = (YoutubeMixPlaylistExtractor) YouTube
|
||||||
@ -221,11 +226,12 @@ public class YoutubeMixPlaylistExtractorTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static class MyMix {
|
public static class MyMix {
|
||||||
private static final String VIDEO_ID = "_AzeUSL9lZc";
|
private static final String VIDEO_ID = "YVkUvmDQ3HY";
|
||||||
|
|
||||||
@BeforeAll
|
@BeforeAll
|
||||||
public static void setUp() throws Exception {
|
public static void setUp() throws Exception {
|
||||||
YoutubeTestsUtils.ensureStateless();
|
YoutubeTestsUtils.ensureStateless();
|
||||||
|
YoutubeParsingHelper.setConsentAccepted(true);
|
||||||
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "myMix"));
|
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "myMix"));
|
||||||
dummyCookie.put(YoutubeMixPlaylistExtractor.COOKIE_NAME, "whatever");
|
dummyCookie.put(YoutubeMixPlaylistExtractor.COOKIE_NAME, "whatever");
|
||||||
extractor = (YoutubeMixPlaylistExtractor) YouTube
|
extractor = (YoutubeMixPlaylistExtractor) YouTube
|
||||||
@ -249,7 +255,7 @@ public class YoutubeMixPlaylistExtractorTest {
|
|||||||
void getThumbnailUrl() throws Exception {
|
void getThumbnailUrl() throws Exception {
|
||||||
final String thumbnailUrl = extractor.getThumbnailUrl();
|
final String thumbnailUrl = extractor.getThumbnailUrl();
|
||||||
assertIsSecureUrl(thumbnailUrl);
|
assertIsSecureUrl(thumbnailUrl);
|
||||||
assertTrue(thumbnailUrl.startsWith("https://i.ytimg.com/vi/_AzeUSL9lZc"));
|
assertTrue(thumbnailUrl.startsWith("https://i.ytimg.com/vi/" + VIDEO_ID));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -316,6 +322,7 @@ public class YoutubeMixPlaylistExtractorTest {
|
|||||||
@BeforeAll
|
@BeforeAll
|
||||||
public static void setUp() throws IOException {
|
public static void setUp() throws IOException {
|
||||||
YoutubeTestsUtils.ensureStateless();
|
YoutubeTestsUtils.ensureStateless();
|
||||||
|
YoutubeParsingHelper.setConsentAccepted(true);
|
||||||
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "invalid"));
|
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "invalid"));
|
||||||
dummyCookie.put(YoutubeMixPlaylistExtractor.COOKIE_NAME, "whatever");
|
dummyCookie.put(YoutubeMixPlaylistExtractor.COOKIE_NAME, "whatever");
|
||||||
}
|
}
|
||||||
@ -350,6 +357,7 @@ public class YoutubeMixPlaylistExtractorTest {
|
|||||||
@BeforeAll
|
@BeforeAll
|
||||||
public static void setUp() throws Exception {
|
public static void setUp() throws Exception {
|
||||||
YoutubeTestsUtils.ensureStateless();
|
YoutubeTestsUtils.ensureStateless();
|
||||||
|
YoutubeParsingHelper.setConsentAccepted(true);
|
||||||
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "channelMix"));
|
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "channelMix"));
|
||||||
dummyCookie.put(YoutubeMixPlaylistExtractor.COOKIE_NAME, "whatever");
|
dummyCookie.put(YoutubeMixPlaylistExtractor.COOKIE_NAME, "whatever");
|
||||||
extractor = (YoutubeMixPlaylistExtractor) YouTube
|
extractor = (YoutubeMixPlaylistExtractor) YouTube
|
||||||
@ -414,6 +422,7 @@ public class YoutubeMixPlaylistExtractorTest {
|
|||||||
@BeforeAll
|
@BeforeAll
|
||||||
public static void setUp() throws Exception {
|
public static void setUp() throws Exception {
|
||||||
YoutubeTestsUtils.ensureStateless();
|
YoutubeTestsUtils.ensureStateless();
|
||||||
|
YoutubeParsingHelper.setConsentAccepted(true);
|
||||||
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "genreMix"));
|
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH + "genreMix"));
|
||||||
dummyCookie.put(YoutubeMixPlaylistExtractor.COOKIE_NAME, "whatever");
|
dummyCookie.put(YoutubeMixPlaylistExtractor.COOKIE_NAME, "whatever");
|
||||||
extractor = (YoutubeMixPlaylistExtractor) YouTube
|
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.BeforeAll;
|
||||||
import org.junit.jupiter.api.Test;
|
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.downloader.DownloaderTestImpl;
|
||||||
import org.schabi.newpipe.extractor.NewPipe;
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
||||||
@ -22,92 +25,110 @@ public class YoutubePlaylistLinkHandlerFactoryTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getIdWithNullAsUrl() {
|
void getIdWithNullAsUrl() {
|
||||||
assertThrows(IllegalArgumentException.class, () -> linkHandler.fromId(null));
|
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
|
@Test
|
||||||
public void getIdfromYt() throws Exception {
|
void fromUrlIsMixVideo() 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 {
|
|
||||||
final String videoId = "_AzeUSL9lZc";
|
final String videoId = "_AzeUSL9lZc";
|
||||||
String url = "https://www.youtube.com/watch?v=" + videoId + "&list=RD" + videoId;
|
String url = "https://www.youtube.com/watch?v=" + videoId + "&list=RD" + videoId;
|
||||||
assertEquals(url, linkHandler.fromUrl(url).getUrl());
|
assertEquals(url, linkHandler.fromUrl(url).getUrl());
|
||||||
@ -118,7 +139,7 @@ public class YoutubePlaylistLinkHandlerFactoryTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void fromUrlIsMixPlaylist() throws Exception {
|
void fromUrlIsMixPlaylist() throws Exception {
|
||||||
final String videoId = "_AzeUSL9lZc";
|
final String videoId = "_AzeUSL9lZc";
|
||||||
final String url = "https://www.youtube.com/watch?v=" + videoId + "&list=RD" + videoId;
|
final String url = "https://www.youtube.com/watch?v=" + videoId + "&list=RD" + videoId;
|
||||||
assertEquals(url,
|
assertEquals(url,
|
||||||
|
@ -2,6 +2,9 @@ package org.schabi.newpipe.extractor.services.youtube;
|
|||||||
|
|
||||||
import org.junit.jupiter.api.BeforeAll;
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
import org.junit.jupiter.api.Test;
|
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.downloader.DownloaderTestImpl;
|
||||||
import org.schabi.newpipe.extractor.NewPipe;
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
import org.schabi.newpipe.extractor.exceptions.FoundAdException;
|
import org.schabi.newpipe.extractor.exceptions.FoundAdException;
|
||||||
@ -17,7 +20,6 @@ import static org.junit.jupiter.api.Assertions.*;
|
|||||||
* Test for {@link YoutubeStreamLinkHandlerFactory}
|
* Test for {@link YoutubeStreamLinkHandlerFactory}
|
||||||
*/
|
*/
|
||||||
public class YoutubeStreamLinkHandlerFactoryTest {
|
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;
|
private static YoutubeStreamLinkHandlerFactory linkHandler;
|
||||||
|
|
||||||
@BeforeAll
|
@BeforeAll
|
||||||
@ -27,146 +29,178 @@ public class YoutubeStreamLinkHandlerFactoryTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getIdWithNullAsUrl() {
|
void getIdWithNullAsUrl() {
|
||||||
assertThrows(IllegalArgumentException.class, () -> linkHandler.fromId(null));
|
assertThrows(NullPointerException.class, () -> linkHandler.fromId(null));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getIdForAd() throws ParsingException {
|
void getIdForAd() {
|
||||||
assertThrows(FoundAdException.class, () -> linkHandler.fromUrl(AD_URL));
|
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
|
@ParameterizedTest
|
||||||
public void getIdForInvalidUrls() {
|
@ValueSource(strings = {
|
||||||
List<String> invalidUrls = new ArrayList<>(50);
|
"https://www.youtube.com/watch?v=jZViOEv90d",
|
||||||
invalidUrls.add("https://www.youtube.com/watch?v=jZViOEv90d");
|
"https://www.youtube.com/watchjZViOEv90d",
|
||||||
invalidUrls.add("https://www.youtube.com/watchjZViOEv90d");
|
"https://www.youtube.com/",
|
||||||
invalidUrls.add("https://www.youtube.com/");
|
"https://www.youtube.com/channel/UCBR8-60-B28hp2BmDPdntcQ",
|
||||||
invalidUrls.add("https://www.youtube.com/channel/UCBR8-60-B28hp2BmDPdntcQ");
|
"https://invidious.fdn.fr/channel/UCBR8-60-B28hp2BmDPdntcQ"
|
||||||
invalidUrls.add("https://invidio.us/channel/UCBR8-60-B28hp2BmDPdntcQ");
|
})
|
||||||
for (String invalidUrl : invalidUrls) {
|
void getIdForInvalidUrls(final String invalidUrl) {
|
||||||
Throwable exception = null;
|
assertThrows(ParsingException.class, () -> linkHandler.fromUrl(invalidUrl).getId());
|
||||||
try {
|
|
||||||
linkHandler.fromUrl(invalidUrl).getId();
|
|
||||||
} catch (ParsingException e) {
|
|
||||||
exception = e;
|
|
||||||
}
|
|
||||||
if (exception == null) {
|
|
||||||
fail("Expected ParsingException for url: " + invalidUrl);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@ParameterizedTest
|
||||||
public void getIdfromYt() throws Exception {
|
@ValueSource(strings = {
|
||||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("https://www.youtube.com/watch?v=jZViOEv90dI").getId());
|
"https://www.youtube.com/watch?v=jZViOEv90dI",
|
||||||
assertEquals("W-fFHeTX70Q", linkHandler.fromUrl("https://www.youtube.com/watch?v=W-fFHeTX70Q").getId());
|
"https://www.youtube.com/watch?v=jZViOEv90dI&t=100",
|
||||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("https://www.youtube.com/watch?v=jZViOEv90dI&t=100").getId());
|
"https://WWW.YouTube.com/watch?v=jZViOEv90dI&t=100",
|
||||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("https://WWW.YouTube.com/watch?v=jZViOEv90dI&t=100").getId());
|
"HTTPS://www.youtube.com/watch?v=jZViOEv90dI&t=100",
|
||||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("HTTPS://www.youtube.com/watch?v=jZViOEv90dI&t=100").getId());
|
"https://youtu.be/jZViOEv90dI?t=9s",
|
||||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("https://youtu.be/jZViOEv90dI?t=9s").getId());
|
"HTTPS://Youtu.be/jZViOEv90dI?t=9s",
|
||||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("HTTPS://Youtu.be/jZViOEv90dI?t=9s").getId());
|
"https://www.youtube.com/embed/jZViOEv90dI",
|
||||||
assertEquals("uEJuoEs1UxY", linkHandler.fromUrl("http://www.youtube.com/watch_popup?v=uEJuoEs1UxY").getId());
|
"https://www.youtube-nocookie.com/embed/jZViOEv90dI",
|
||||||
assertEquals("uEJuoEs1UxY", linkHandler.fromUrl("http://www.Youtube.com/watch_popup?v=uEJuoEs1UxY").getId());
|
"http://www.youtube.com/watch?v=jZViOEv90dI",
|
||||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("https://www.youtube.com/embed/jZViOEv90dI").getId());
|
"http://youtube.com/watch?v=jZViOEv90dI",
|
||||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("https://www.youtube-nocookie.com/embed/jZViOEv90dI").getId());
|
"http://youtu.be/jZViOEv90dI?t=9s",
|
||||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("http://www.youtube.com/watch?v=jZViOEv90dI").getId());
|
"http://www.youtube.com/embed/jZViOEv90dI",
|
||||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("http://youtube.com/watch?v=jZViOEv90dI").getId());
|
"http://www.Youtube.com/embed/jZViOEv90dI",
|
||||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("http://youtu.be/jZViOEv90dI?t=9s").getId());
|
"http://www.youtube-nocookie.com/embed/jZViOEv90dI",
|
||||||
assertEquals("7_WWz2DSnT8", linkHandler.fromUrl("https://youtu.be/7_WWz2DSnT8").getId());
|
"vnd.youtube://www.youtube.com/watch?v=jZViOEv90dI",
|
||||||
assertEquals("oy6NvWeVruY", linkHandler.fromUrl("https://m.youtube.com/watch?v=oy6NvWeVruY").getId());
|
"vnd.youtube:jZViOEv90dI"
|
||||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("http://www.youtube.com/embed/jZViOEv90dI").getId());
|
})
|
||||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("http://www.Youtube.com/embed/jZViOEv90dI").getId());
|
void getId_jZViOEv90dI_fromYt(final String url) throws Exception {
|
||||||
assertEquals("jZViOEv90dI", linkHandler.fromUrl("http://www.youtube-nocookie.com/embed/jZViOEv90dI").getId());
|
assertEquals("jZViOEv90dI", linkHandler.fromUrl(url).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());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@ParameterizedTest
|
||||||
public void testAcceptYtUrl() throws ParsingException {
|
@ValueSource(strings = {
|
||||||
assertTrue(linkHandler.acceptUrl("https://www.youtube.com/watch?v=jZViOEv90dI"));
|
"https://www.youtube.com/shorts/IOS2fqxwYbA",
|
||||||
assertTrue(linkHandler.acceptUrl("https://www.youtube.com/watch?v=jZViOEv90dI&t=100"));
|
"http://www.youtube.com/shorts/IOS2fqxwYbA",
|
||||||
assertTrue(linkHandler.acceptUrl("https://WWW.YouTube.com/watch?v=jZViOEv90dI&t=100"));
|
"http://www.youtube.com/v/IOS2fqxwYbA",
|
||||||
assertTrue(linkHandler.acceptUrl("HTTPS://www.youtube.com/watch?v=jZViOEv90dI&t=100"));
|
"https://www.youtube.com/w/IOS2fqxwYbA",
|
||||||
assertTrue(linkHandler.acceptUrl("https://youtu.be/jZViOEv90dI?t=9s"));
|
"https://www.youtube.com/watch/IOS2fqxwYbA"
|
||||||
assertTrue(linkHandler.acceptUrl("https://www.youtube.com/embed/jZViOEv90dI"));
|
})
|
||||||
assertTrue(linkHandler.acceptUrl("https://www.youtube-nocookie.com/embed/jZViOEv90dI"));
|
void getId_IOS2fqxwYbA_fromYt(final String url) throws Exception {
|
||||||
assertTrue(linkHandler.acceptUrl("http://www.youtube.com/watch?v=jZViOEv90dI"));
|
assertEquals("IOS2fqxwYbA", linkHandler.fromUrl(url).getId());
|
||||||
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"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@ParameterizedTest
|
||||||
public void testAcceptHookUrl() throws ParsingException {
|
@ValueSource(strings = {
|
||||||
assertTrue(linkHandler.acceptUrl("https://hooktube.com/watch?v=TglNG-yjabU"));
|
"https://m.youtube.com/watch?v=-cdveCh1kQk)",
|
||||||
assertTrue(linkHandler.acceptUrl("http://hooktube.com/watch?v=TglNG-yjabU"));
|
"https://www.youtube.com/watch?v=-cdveCh1kQk-",
|
||||||
assertTrue(linkHandler.acceptUrl("hooktube.com/watch?v=3msbfr6pBNE"));
|
"https://WWW.YouTube.com/watch?v=-cdveCh1kQkwhatever",
|
||||||
assertTrue(linkHandler.acceptUrl("https://hooktube.com/watch?v=ocH3oSnZG3c&list=PLS2VU1j4vzuZwooPjV26XM9UEBY2CPNn2"));
|
"https://youtu.be/-cdveCh1kQk)hello",
|
||||||
assertTrue(linkHandler.acceptUrl("hooktube.com/watch/3msbfr6pBNE"));
|
"HTTPS://youtu.be/-cdveCh1kQk)"
|
||||||
assertTrue(linkHandler.acceptUrl("hooktube.com/v/3msbfr6pBNE"));
|
})
|
||||||
assertTrue(linkHandler.acceptUrl("hooktube.com/embed/3msbfr6pBNE"));
|
void getId_cdveCh1kQk_fromYt(final String url) throws Exception {
|
||||||
|
assertEquals("-cdveCh1kQk", linkHandler.fromUrl(url).getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@ParameterizedTest
|
||||||
public void testGetHookIdfromUrl() throws ParsingException {
|
@CsvSource({
|
||||||
assertEquals("TglNG-yjabU", linkHandler.fromUrl("https://hooktube.com/watch?v=TglNG-yjabU").getId());
|
"W-fFHeTX70Q,https://www.youtube.com/watch?v=W-fFHeTX70Q",
|
||||||
assertEquals("TglNG-yjabU", linkHandler.fromUrl("http://hooktube.com/watch?v=TglNG-yjabU").getId());
|
"uEJuoEs1UxY,http://www.youtube.com/watch_popup?v=uEJuoEs1UxY",
|
||||||
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("hooktube.com/watch?v=3msbfr6pBNE").getId());
|
"uEJuoEs1UxY,http://www.Youtube.com/watch_popup?v=uEJuoEs1UxY",
|
||||||
assertEquals("ocH3oSnZG3c", linkHandler.fromUrl("https://hooktube.com/watch?v=ocH3oSnZG3c&list=PLS2VU1j4vzuZwooPjV26XM9UEBY2CPNn2").getId());
|
"7_WWz2DSnT8,https://youtu.be/7_WWz2DSnT8",
|
||||||
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("hooktube.com/watch/3msbfr6pBNE").getId());
|
"oy6NvWeVruY,https://m.youtube.com/watch?v=oy6NvWeVruY",
|
||||||
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("hooktube.com/v/3msbfr6pBNE").getId());
|
"EhxJLojIE_o,http://www.youtube.com/attribution_link?a=JdfC0C9V6ZI&u=%2Fwatch%3Fv%3DEhxJLojIE_o%26feature%3Dshare",
|
||||||
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("hooktube.com/w/3msbfr6pBNE").getId());
|
"n8X9_MgEdCg,vnd.youtube://n8X9_MgEdCg",
|
||||||
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("hooktube.com/embed/3msbfr6pBNE").getId());
|
"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
|
@ParameterizedTest
|
||||||
public void testAcceptInvidiousUrl() throws ParsingException {
|
@ValueSource(strings = {
|
||||||
assertTrue(linkHandler.acceptUrl("https://invidio.us/watch?v=TglNG-yjabU"));
|
"https://www.youtube.com/watch?v=jZViOEv90dI",
|
||||||
assertTrue(linkHandler.acceptUrl("http://www.invidio.us/watch?v=TglNG-yjabU"));
|
"https://www.youtube.com/watch?v=jZViOEv90dI&t=100",
|
||||||
assertTrue(linkHandler.acceptUrl("http://invidio.us/watch?v=TglNG-yjabU"));
|
"https://WWW.YouTube.com/watch?v=jZViOEv90dI&t=100",
|
||||||
assertTrue(linkHandler.acceptUrl("invidio.us/watch?v=3msbfr6pBNE"));
|
"HTTPS://www.youtube.com/watch?v=jZViOEv90dI&t=100",
|
||||||
assertTrue(linkHandler.acceptUrl("https://invidio.us/watch?v=ocH3oSnZG3c&test=PLS2VU1j4vzuZwooPjV26XM9UEBY2CPNn2"));
|
"https://youtu.be/jZViOEv90dI?t=9s",
|
||||||
assertTrue(linkHandler.acceptUrl("invidio.us/embed/3msbfr6pBNE"));
|
"https://www.youtube.com/embed/jZViOEv90dI",
|
||||||
assertTrue(linkHandler.acceptUrl("invidio.us/watch/3msbfr6pBNE"));
|
"https://www.youtube-nocookie.com/embed/jZViOEv90dI",
|
||||||
assertTrue(linkHandler.acceptUrl("invidio.us/v/3msbfr6pBNE"));
|
"http://www.youtube.com/watch?v=jZViOEv90dI",
|
||||||
assertTrue(linkHandler.acceptUrl("invidio.us/w/3msbfr6pBNE"));
|
"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
|
@ParameterizedTest
|
||||||
public void testGetInvidiousIdfromUrl() throws ParsingException {
|
@ValueSource(strings = {
|
||||||
assertEquals("TglNG-yjabU", linkHandler.fromUrl("https://invidio.us/watch?v=TglNG-yjabU").getId());
|
"https://hooktube.com/watch?v=TglNG-yjabU",
|
||||||
assertEquals("TglNG-yjabU", linkHandler.fromUrl("http://www.invidio.us/watch?v=TglNG-yjabU").getId());
|
"http://hooktube.com/watch?v=TglNG-yjabU",
|
||||||
assertEquals("TglNG-yjabU", linkHandler.fromUrl("http://invidio.us/watch?v=TglNG-yjabU").getId());
|
"https://hooktube.com/watch?v=ocH3oSnZG3c&test=PLS2VU1j4vzuZwooPjV26XM9UEBY2CPNn2",
|
||||||
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/watch?v=3msbfr6pBNE").getId());
|
"hooktube.com/watch?v=3msbfr6pBNE",
|
||||||
assertEquals("ocH3oSnZG3c", linkHandler.fromUrl("https://invidio.us/watch?v=ocH3oSnZG3c&test=PLS2VU1j4vzuZwooPjV26XM9UEBY2CPNn2").getId());
|
"hooktube.com/watch/3msbfr6pBNE",
|
||||||
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/embed/3msbfr6pBNE").getId());
|
"hooktube.com/v/3msbfr6pBNE",
|
||||||
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/v/3msbfr6pBNE").getId());
|
"hooktube.com/embed/3msbfr6pBNE"
|
||||||
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/w/3msbfr6pBNE").getId());
|
})
|
||||||
assertEquals("3msbfr6pBNE", linkHandler.fromUrl("invidio.us/watch/3msbfr6pBNE").getId());
|
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>
|
* </p>
|
||||||
*/
|
*/
|
||||||
public static void ensureStateless() {
|
public static void ensureStateless() {
|
||||||
|
YoutubeParsingHelper.setConsentAccepted(false);
|
||||||
YoutubeParsingHelper.resetClientVersionAndKey();
|
YoutubeParsingHelper.resetClientVersionAndKey();
|
||||||
YoutubeParsingHelper.setNumberGenerator(new Random(1));
|
YoutubeParsingHelper.setNumberGenerator(new Random(1));
|
||||||
YoutubeStreamExtractor.resetDeobfuscationCode();
|
YoutubeStreamExtractor.resetDeobfuscationCode();
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
package org.schabi.newpipe.extractor.services.youtube;
|
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.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.mozilla.javascript.EvaluatorException;
|
import org.mozilla.javascript.EvaluatorException;
|
||||||
@ -9,11 +13,7 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
class YoutubeThrottlingDecrypterTest {
|
||||||
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
|
||||||
import static org.junit.jupiter.api.Assertions.fail;
|
|
||||||
|
|
||||||
public class YoutubeThrottlingDecrypterTest {
|
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
public void setup() throws IOException {
|
public void setup() throws IOException {
|
||||||
@ -21,7 +21,7 @@ public class YoutubeThrottlingDecrypterTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testExtractFunction__success() throws ParsingException {
|
void testExtractFunction__success() throws ParsingException {
|
||||||
final String[] videoIds = {"jE1USQrs1rw", "CqxjzfudGAc", "goH-9MfQI7w", "KYIdr_7H5Yw", "J1WeqmGbYeI"};
|
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";
|
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 {
|
try {
|
||||||
final String decryptedUrl = YoutubeThrottlingDecrypter.apply(encryptedUrl, videoId);
|
final String decryptedUrl = YoutubeThrottlingDecrypter.apply(encryptedUrl, videoId);
|
||||||
assertNotEquals(encryptedUrl, decryptedUrl);
|
assertNotEquals(encryptedUrl, decryptedUrl);
|
||||||
} catch (EvaluatorException e) {
|
} catch (final EvaluatorException e) {
|
||||||
fail("Failed to extract n param decrypt function for video " + videoId + "\n" + e);
|
fail("Failed to extract n param decrypt function for video " + videoId + "\n" + e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDecode__success() throws ParsingException {
|
void testDecode__success() throws ParsingException {
|
||||||
// URL extracted from browser with the dev tools
|
// 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 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");
|
final String decryptedUrl = YoutubeThrottlingDecrypter.apply(encryptedUrl, "jE1USQrs1rw");
|
||||||
@ -46,7 +46,7 @@ public class YoutubeThrottlingDecrypterTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@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 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");
|
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.BeforeAll;
|
||||||
import org.junit.jupiter.api.Disabled;
|
import org.junit.jupiter.api.Disabled;
|
||||||
import org.schabi.newpipe.downloader.DownloaderTestImpl;
|
import org.schabi.newpipe.downloader.DownloaderTestImpl;
|
||||||
import org.schabi.newpipe.downloader.MockOnly;
|
|
||||||
import org.schabi.newpipe.extractor.InfoItem;
|
import org.schabi.newpipe.extractor.InfoItem;
|
||||||
import org.schabi.newpipe.extractor.NewPipe;
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
import org.schabi.newpipe.extractor.StreamingService;
|
import org.schabi.newpipe.extractor.StreamingService;
|
||||||
@ -158,8 +157,8 @@ public class YoutubeMusicSearchExtractorTest {
|
|||||||
|
|
||||||
public static class CorrectedSearch extends DefaultSearchExtractorTest {
|
public static class CorrectedSearch extends DefaultSearchExtractorTest {
|
||||||
private static SearchExtractor extractor;
|
private static SearchExtractor extractor;
|
||||||
private static final String QUERY = "nocopyrigh sounds";
|
private static final String QUERY = "no copyrigh sounds";
|
||||||
private static final String EXPECTED_SUGGESTION = "nocopyrightsounds";
|
private static final String EXPECTED_SUGGESTION = "no copyright sounds";
|
||||||
|
|
||||||
@BeforeAll
|
@BeforeAll
|
||||||
public static void setUp() throws Exception {
|
public static void setUp() throws Exception {
|
||||||
|
@ -136,11 +136,17 @@ public class YoutubeSearchExtractorTest {
|
|||||||
@Override public InfoItem.InfoType expectedInfoItemType() { return InfoItem.InfoType.STREAM; }
|
@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")
|
@MockOnly("Currently constantly switching between \"Did you mean\" and \"Showing results for ...\" occurs")
|
||||||
public static class Suggestion extends DefaultSearchExtractorTest {
|
public static class Suggestion extends DefaultSearchExtractorTest {
|
||||||
private static SearchExtractor extractor;
|
private static SearchExtractor extractor;
|
||||||
private static final String QUERY = "newpip";
|
private static final String QUERY = "algorythm";
|
||||||
private static final String EXPECTED_SUGGESTION = "newpipe";
|
private static final String EXPECTED_SUGGESTION = "algorithm";
|
||||||
|
|
||||||
@BeforeAll
|
@BeforeAll
|
||||||
public static void setUp() throws Exception {
|
public static void setUp() throws Exception {
|
||||||
@ -161,6 +167,9 @@ public class YoutubeSearchExtractorTest {
|
|||||||
@Override public InfoItem.InfoType expectedInfoItemType() { return InfoItem.InfoType.STREAM; }
|
@Override public InfoItem.InfoType expectedInfoItemType() { return InfoItem.InfoType.STREAM; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for YT's "Showing results for...".
|
||||||
|
*/
|
||||||
public static class CorrectedSearch extends DefaultSearchExtractorTest {
|
public static class CorrectedSearch extends DefaultSearchExtractorTest {
|
||||||
private static SearchExtractor extractor;
|
private static SearchExtractor extractor;
|
||||||
private static final String QUERY = "pewdeipie";
|
private static final String QUERY = "pewdeipie";
|
||||||
@ -254,15 +263,14 @@ public class YoutubeSearchExtractorTest {
|
|||||||
@Override public String expectedSearchString() { return QUERY; }
|
@Override public String expectedSearchString() { return QUERY; }
|
||||||
@Override public String expectedSearchSuggestion() { return null; }
|
@Override public String expectedSearchSuggestion() { return null; }
|
||||||
@Override public List<MetaInfo> expectedMetaInfo() throws MalformedURLException {
|
@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(
|
return Collections.singletonList(new MetaInfo(
|
||||||
"COVID-19",
|
"COVID-19",
|
||||||
new Description("Get the latest information from the WHO about coronavirus.", Description.PLAIN_TEXT),
|
new Description(
|
||||||
urls,
|
"Get the latest information from the WHO about coronavirus.",
|
||||||
urlTexts
|
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
|
// testMoreRelatedItems is broken because a video has no duration shown
|
||||||
|
@ -19,7 +19,7 @@ import javax.annotation.Nullable;
|
|||||||
|
|
||||||
public class YoutubeStreamExtractorLivestreamTest extends DefaultStreamExtractorTest {
|
public class YoutubeStreamExtractorLivestreamTest extends DefaultStreamExtractorTest {
|
||||||
private static final String RESOURCE_PATH = DownloaderFactory.RESOURCE_PATH + "services/youtube/extractor/stream/";
|
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 int TIMESTAMP = 1737;
|
||||||
private static final String URL = YoutubeStreamExtractorDefaultTest.BASE_URL + ID + "&t=" + TIMESTAMP;
|
private static final String URL = YoutubeStreamExtractorDefaultTest.BASE_URL + ID + "&t=" + TIMESTAMP;
|
||||||
private static StreamExtractor extractor;
|
private static StreamExtractor extractor;
|
||||||
@ -57,9 +57,9 @@ public class YoutubeStreamExtractorLivestreamTest extends DefaultStreamExtractor
|
|||||||
@Override public long expectedLength() { return 0; }
|
@Override public long expectedLength() { return 0; }
|
||||||
@Override public long expectedTimestamp() { return TIMESTAMP; }
|
@Override public long expectedTimestamp() { return TIMESTAMP; }
|
||||||
@Override public long expectedViewCountAtLeast() { return 0; }
|
@Override public long expectedViewCountAtLeast() { return 0; }
|
||||||
@Nullable @Override public String expectedUploadDate() { return "2020-02-22 00:00:00.000"; }
|
@Nullable @Override public String expectedUploadDate() { return "2022-07-12 00:00:00.000"; }
|
||||||
@Nullable @Override public String expectedTextualUploadDate() { return "2020-02-22"; }
|
@Nullable @Override public String expectedTextualUploadDate() { return "2022-07-12"; }
|
||||||
@Override public long expectedLikeCountAtLeast() { return 825000; }
|
@Override public long expectedLikeCountAtLeast() { return 340_000; }
|
||||||
@Override public long expectedDislikeCountAtLeast() { return -1; }
|
@Override public long expectedDislikeCountAtLeast() { return -1; }
|
||||||
@Override public boolean expectedHasSubtitles() { return false; }
|
@Override public boolean expectedHasSubtitles() { return false; }
|
||||||
@Nullable @Override public String expectedDashMpdUrlContains() { return "https://manifest.googlevideo.com/api/manifest/dash/"; }
|
@Nullable @Override public String expectedDashMpdUrlContains() { return "https://manifest.googlevideo.com/api/manifest/dash/"; }
|
||||||
|
@ -37,17 +37,14 @@
|
|||||||
"content-type": [
|
"content-type": [
|
||||||
"text/javascript; charset\u003dutf-8"
|
"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": [
|
"cross-origin-opener-policy-report-only": [
|
||||||
"same-origin; report-to\u003d\"youtube_main\""
|
"same-origin; report-to\u003d\"youtube_main\""
|
||||||
],
|
],
|
||||||
"date": [
|
"date": [
|
||||||
"Fri, 12 Aug 2022 17:16:43 GMT"
|
"Sun, 21 Aug 2022 16:38:46 GMT"
|
||||||
],
|
],
|
||||||
"expires": [
|
"expires": [
|
||||||
"Fri, 12 Aug 2022 17:16:43 GMT"
|
"Sun, 21 Aug 2022 16:38:46 GMT"
|
||||||
],
|
],
|
||||||
"p3p": [
|
"p3p": [
|
||||||
"CP\u003d\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl\u003den-GB for more info.\""
|
"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"
|
"ESF"
|
||||||
],
|
],
|
||||||
"set-cookie": [
|
"set-cookie": [
|
||||||
"YSC\u003dHJEPOQIuvI8; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
"YSC\u003dt2u6Ud1gkeE; 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",
|
"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+356; expires\u003dSun, 11-Aug-2024 17:16:43 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
"CONSENT\u003dPENDING+112; expires\u003dTue, 20-Aug-2024 16:38:46 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||||
],
|
],
|
||||||
"strict-transport-security": [
|
"strict-transport-security": [
|
||||||
"max-age\u003d31536000"
|
"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": [
|
"content-type": [
|
||||||
"text/javascript; charset\u003dutf-8"
|
"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": [
|
"cross-origin-opener-policy-report-only": [
|
||||||
"same-origin; report-to\u003d\"youtube_main\""
|
"same-origin; report-to\u003d\"youtube_main\""
|
||||||
],
|
],
|
||||||
"date": [
|
"date": [
|
||||||
"Fri, 12 Aug 2022 17:16:45 GMT"
|
"Sun, 21 Aug 2022 16:38:47 GMT"
|
||||||
],
|
],
|
||||||
"expires": [
|
"expires": [
|
||||||
"Fri, 12 Aug 2022 17:16:45 GMT"
|
"Sun, 21 Aug 2022 16:38:47 GMT"
|
||||||
],
|
],
|
||||||
"p3p": [
|
"p3p": [
|
||||||
"CP\u003d\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl\u003den-GB for more info.\""
|
"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"
|
"ESF"
|
||||||
],
|
],
|
||||||
"set-cookie": [
|
"set-cookie": [
|
||||||
"YSC\u003dK9DOXZ0zyRk; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
"YSC\u003dLGlvlQyOQUM; 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",
|
"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+273; expires\u003dSun, 11-Aug-2024 17:16:45 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
"CONSENT\u003dPENDING+765; expires\u003dTue, 20-Aug-2024 16:38:47 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||||
],
|
],
|
||||||
"strict-transport-security": [
|
"strict-transport-security": [
|
||||||
"max-age\u003d31536000"
|
"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": [
|
"content-type": [
|
||||||
"text/javascript; charset\u003dutf-8"
|
"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": [
|
"cross-origin-opener-policy-report-only": [
|
||||||
"same-origin; report-to\u003d\"youtube_main\""
|
"same-origin; report-to\u003d\"youtube_main\""
|
||||||
],
|
],
|
||||||
"date": [
|
"date": [
|
||||||
"Fri, 12 Aug 2022 17:16:43 GMT"
|
"Sun, 21 Aug 2022 16:38:51 GMT"
|
||||||
],
|
],
|
||||||
"expires": [
|
"expires": [
|
||||||
"Fri, 12 Aug 2022 17:16:43 GMT"
|
"Sun, 21 Aug 2022 16:38:51 GMT"
|
||||||
],
|
],
|
||||||
"p3p": [
|
"p3p": [
|
||||||
"CP\u003d\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl\u003den-GB for more info.\""
|
"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"
|
"ESF"
|
||||||
],
|
],
|
||||||
"set-cookie": [
|
"set-cookie": [
|
||||||
"YSC\u003dlu4fkvyZAxU; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
"YSC\u003dPF2mcCgU8NQ; 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",
|
"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+623; expires\u003dSun, 11-Aug-2024 17:16:43 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
"CONSENT\u003dPENDING+608; expires\u003dTue, 20-Aug-2024 16:38:51 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||||
],
|
],
|
||||||
"strict-transport-security": [
|
"strict-transport-security": [
|
||||||
"max-age\u003d31536000"
|
"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": [
|
"content-type": [
|
||||||
"text/javascript; charset\u003dutf-8"
|
"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": [
|
"cross-origin-opener-policy-report-only": [
|
||||||
"same-origin; report-to\u003d\"youtube_main\""
|
"same-origin; report-to\u003d\"youtube_main\""
|
||||||
],
|
],
|
||||||
"date": [
|
"date": [
|
||||||
"Fri, 12 Aug 2022 17:16:40 GMT"
|
"Sun, 21 Aug 2022 16:37:11 GMT"
|
||||||
],
|
],
|
||||||
"expires": [
|
"expires": [
|
||||||
"Fri, 12 Aug 2022 17:16:40 GMT"
|
"Sun, 21 Aug 2022 16:37:11 GMT"
|
||||||
],
|
],
|
||||||
"p3p": [
|
"p3p": [
|
||||||
"CP\u003d\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl\u003den-GB for more info.\""
|
"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"
|
"ESF"
|
||||||
],
|
],
|
||||||
"set-cookie": [
|
"set-cookie": [
|
||||||
"YSC\u003d4btN-niFGiY; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
"YSC\u003dPkLFS2iAitE; 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",
|
"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+172; expires\u003dSun, 11-Aug-2024 17:16:40 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
"CONSENT\u003dPENDING+887; expires\u003dTue, 20-Aug-2024 16:37:11 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||||
],
|
],
|
||||||
"strict-transport-security": [
|
"strict-transport-security": [
|
||||||
"max-age\u003d31536000"
|
"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": [
|
"content-type": [
|
||||||
"text/javascript; charset\u003dutf-8"
|
"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": [
|
"cross-origin-opener-policy-report-only": [
|
||||||
"same-origin; report-to\u003d\"youtube_main\""
|
"same-origin; report-to\u003d\"youtube_main\""
|
||||||
],
|
],
|
||||||
"date": [
|
"date": [
|
||||||
"Fri, 12 Aug 2022 17:16:41 GMT"
|
"Sun, 21 Aug 2022 16:38:52 GMT"
|
||||||
],
|
],
|
||||||
"expires": [
|
"expires": [
|
||||||
"Fri, 12 Aug 2022 17:16:41 GMT"
|
"Sun, 21 Aug 2022 16:38:52 GMT"
|
||||||
],
|
],
|
||||||
"p3p": [
|
"p3p": [
|
||||||
"CP\u003d\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl\u003den-GB for more info.\""
|
"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"
|
"ESF"
|
||||||
],
|
],
|
||||||
"set-cookie": [
|
"set-cookie": [
|
||||||
"YSC\u003d5SzFkp8Nmuw; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
"YSC\u003d9ZuBX_amuYc; 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",
|
"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+194; expires\u003dSun, 11-Aug-2024 17:16:41 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
"CONSENT\u003dPENDING+017; expires\u003dTue, 20-Aug-2024 16:38:52 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||||
],
|
],
|
||||||
"strict-transport-security": [
|
"strict-transport-security": [
|
||||||
"max-age\u003d31536000"
|
"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": [
|
"content-type": [
|
||||||
"text/javascript; charset\u003dutf-8"
|
"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": [
|
"cross-origin-opener-policy-report-only": [
|
||||||
"same-origin; report-to\u003d\"youtube_main\""
|
"same-origin; report-to\u003d\"youtube_main\""
|
||||||
],
|
],
|
||||||
"date": [
|
"date": [
|
||||||
"Fri, 12 Aug 2022 17:16:42 GMT"
|
"Sun, 21 Aug 2022 16:38:55 GMT"
|
||||||
],
|
],
|
||||||
"expires": [
|
"expires": [
|
||||||
"Fri, 12 Aug 2022 17:16:42 GMT"
|
"Sun, 21 Aug 2022 16:38:55 GMT"
|
||||||
],
|
],
|
||||||
"p3p": [
|
"p3p": [
|
||||||
"CP\u003d\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl\u003den-GB for more info.\""
|
"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"
|
"ESF"
|
||||||
],
|
],
|
||||||
"set-cookie": [
|
"set-cookie": [
|
||||||
"YSC\u003dOi24IxlsbgM; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
"YSC\u003d26HXucc95mk; 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",
|
"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+126; expires\u003dSun, 11-Aug-2024 17:16:42 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
"CONSENT\u003dPENDING+335; expires\u003dTue, 20-Aug-2024 16:38:55 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||||
],
|
],
|
||||||
"strict-transport-security": [
|
"strict-transport-security": [
|
||||||
"max-age\u003d31536000"
|
"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\""
|
"same-origin; report-to\u003d\"youtube_main\""
|
||||||
],
|
],
|
||||||
"date": [
|
"date": [
|
||||||
"Fri, 12 Aug 2022 17:15:19 GMT"
|
"Sun, 14 Aug 2022 12:51:07 GMT"
|
||||||
],
|
],
|
||||||
"expires": [
|
"expires": [
|
||||||
"Fri, 12 Aug 2022 17:15:19 GMT"
|
"Sun, 14 Aug 2022 12:51:07 GMT"
|
||||||
],
|
],
|
||||||
"p3p": [
|
"p3p": [
|
||||||
"CP\u003d\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl\u003den-GB for more info.\""
|
"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"
|
"ESF"
|
||||||
],
|
],
|
||||||
"set-cookie": [
|
"set-cookie": [
|
||||||
"YSC\u003d3cfmLDXRL-I; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
"YSC\u003dwDB2v601q14; 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",
|
"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+284; expires\u003dSun, 11-Aug-2024 17:15:19 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
"CONSENT\u003dPENDING+276; expires\u003dTue, 13-Aug-2024 12:51:07 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||||
],
|
],
|
||||||
"strict-transport-security": [
|
"strict-transport-security": [
|
||||||
"max-age\u003d31536000"
|
"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": [
|
"content-type": [
|
||||||
"text/javascript; charset\u003dutf-8"
|
"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": [
|
"cross-origin-opener-policy-report-only": [
|
||||||
"same-origin; report-to\u003d\"youtube_main\""
|
"same-origin; report-to\u003d\"youtube_main\""
|
||||||
],
|
],
|
||||||
@ -35,10 +32,10 @@
|
|||||||
"cross-origin"
|
"cross-origin"
|
||||||
],
|
],
|
||||||
"date": [
|
"date": [
|
||||||
"Fri, 12 Aug 2022 17:16:20 GMT"
|
"Sun, 21 Aug 2022 16:38:05 GMT"
|
||||||
],
|
],
|
||||||
"expires": [
|
"expires": [
|
||||||
"Fri, 12 Aug 2022 17:16:20 GMT"
|
"Sun, 21 Aug 2022 16:38:05 GMT"
|
||||||
],
|
],
|
||||||
"p3p": [
|
"p3p": [
|
||||||
"CP\u003d\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl\u003den-GB for more info.\""
|
"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"
|
"ESF"
|
||||||
],
|
],
|
||||||
"set-cookie": [
|
"set-cookie": [
|
||||||
"YSC\u003dnrs3dIuSyOU; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
"YSC\u003deRIdTZy8lIc; 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",
|
"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+733; expires\u003dSun, 11-Aug-2024 17:16:20 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
"CONSENT\u003dPENDING+622; expires\u003dTue, 20-Aug-2024 16:38:05 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||||
],
|
],
|
||||||
"strict-transport-security": [
|
"strict-transport-security": [
|
||||||
"max-age\u003d31536000"
|
"max-age\u003d31536000"
|
||||||
@ -70,7 +67,7 @@
|
|||||||
"0"
|
"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"
|
"latestUrl": "https://www.youtube.com/iframe_api"
|
||||||
}
|
}
|
||||||
}
|
}
|
File diff suppressed because one or more lines are too long
@ -37,17 +37,14 @@
|
|||||||
"content-type": [
|
"content-type": [
|
||||||
"text/javascript; charset\u003dutf-8"
|
"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": [
|
"cross-origin-opener-policy-report-only": [
|
||||||
"same-origin; report-to\u003d\"youtube_main\""
|
"same-origin; report-to\u003d\"youtube_main\""
|
||||||
],
|
],
|
||||||
"date": [
|
"date": [
|
||||||
"Fri, 12 Aug 2022 17:16:20 GMT"
|
"Sun, 21 Aug 2022 16:38:07 GMT"
|
||||||
],
|
],
|
||||||
"expires": [
|
"expires": [
|
||||||
"Fri, 12 Aug 2022 17:16:20 GMT"
|
"Sun, 21 Aug 2022 16:38:07 GMT"
|
||||||
],
|
],
|
||||||
"p3p": [
|
"p3p": [
|
||||||
"CP\u003d\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl\u003den-GB for more info.\""
|
"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"
|
"ESF"
|
||||||
],
|
],
|
||||||
"set-cookie": [
|
"set-cookie": [
|
||||||
"YSC\u003dEHE6P3OVrNg; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
|
"YSC\u003dn0iNRR1XrY0; 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",
|
"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+775; expires\u003dSun, 11-Aug-2024 17:16:20 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
"CONSENT\u003dPENDING+968; expires\u003dTue, 20-Aug-2024 16:38:07 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
|
||||||
],
|
],
|
||||||
"strict-transport-security": [
|
"strict-transport-security": [
|
||||||
"max-age\u003d31536000"
|
"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
Block a user