Merge pull request #1108 from AudricV/yt_refactor-js-usage

[YouTube] Refactor JavaScript usage and fix extraction of obfuscated signature deobfuscation function
This commit is contained in:
Stypox 2023-09-22 10:41:57 +02:00 committed by GitHub
commit 289db1178a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
119 changed files with 1656 additions and 1320 deletions

View File

@ -10,18 +10,14 @@ import org.schabi.newpipe.extractor.localization.Localization;
import org.schabi.newpipe.extractor.utils.Parser;
import javax.annotation.Nonnull;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.regex.Pattern;
/**
* The extractor of YouTube's base JavaScript player file.
*
* <p>
* YouTube restrict streaming their media in multiple ways by requiring their HTML5 clients to use
* a signature timestamp, and on streaming URLs a signature deobfuscation function for some
* contents and a throttling parameter deobfuscation one for all contents.
* </p>
*
* <p>
* This class handles fetching of this base JavaScript player file in order to allow other classes
* to extract the needed data.
* </p>
@ -31,7 +27,7 @@ import java.util.regex.Pattern;
* watch page as a fallback.
* </p>
*/
public final class YoutubeJavaScriptExtractor {
final class YoutubeJavaScriptExtractor {
private static final String HTTPS = "https:";
private static final String BASE_JS_PLAYER_URL_FORMAT =
@ -40,49 +36,45 @@ public final class YoutubeJavaScriptExtractor {
"player\\\\/([a-z0-9]{8})\\\\/");
private static final Pattern EMBEDDED_WATCH_PAGE_JS_BASE_PLAYER_URL_PATTERN = Pattern.compile(
"\"jsUrl\":\"(/s/player/[A-Za-z0-9]+/player_ias\\.vflset/[A-Za-z_-]+/base\\.js)\"");
private static String cachedJavaScriptCode;
private YoutubeJavaScriptExtractor() {
}
/**
* Extracts the JavaScript file.
* Extracts the JavaScript base player file.
*
* <p>
* The result is cached, so subsequent calls use the result of previous calls.
* </p>
*
* @param videoId a YouTube video ID, which doesn't influence the result, but it may help in
* the chance that YouTube track it
* @return the whole JavaScript file as a string
* @throws ParsingException if the extraction failed
* @param videoId the video ID used to get the JavaScript base player file (an empty one can be
* passed, even it is not recommend in order to spoof better official YouTube
* clients)
* @return the whole JavaScript base player file as a string
* @throws ParsingException if the extraction of the file failed
*/
@Nonnull
public static String extractJavaScriptCode(@Nonnull final String videoId)
static String extractJavaScriptPlayerCode(@Nonnull final String videoId)
throws ParsingException {
if (cachedJavaScriptCode == null) {
String url;
try {
url = YoutubeJavaScriptExtractor.extractJavaScriptUrlWithIframeResource();
final String playerJsUrl = YoutubeJavaScriptExtractor.cleanJavaScriptUrl(url);
// Assert that the URL we extracted and built is valid
new URL(playerJsUrl);
return YoutubeJavaScriptExtractor.downloadJavaScriptCode(playerJsUrl);
} catch (final Exception e) {
url = YoutubeJavaScriptExtractor.extractJavaScriptUrlWithEmbedWatchPage(videoId);
}
final String playerJsUrl = YoutubeJavaScriptExtractor.cleanJavaScriptUrl(url);
cachedJavaScriptCode = YoutubeJavaScriptExtractor.downloadJavaScriptCode(playerJsUrl);
try {
// Assert that the URL we extracted and built is valid
new URL(playerJsUrl);
} catch (final MalformedURLException exception) {
throw new ParsingException(
"The extracted and built JavaScript URL is invalid", exception);
}
return cachedJavaScriptCode;
return YoutubeJavaScriptExtractor.downloadJavaScriptCode(playerJsUrl);
}
/**
* Reset the cached JavaScript code.
*
* <p>
* It will be fetched again the next time {@link #extractJavaScriptCode(String)} is called.
* </p>
*/
public static void resetJavaScriptCode() {
cachedJavaScriptCode = null;
}
@Nonnull
@ -134,7 +126,7 @@ public final class YoutubeJavaScriptExtractor {
}
}
// Use regexes to match the URL in a JavaScript embedded script of the HTML page
// Use regexes to match the URL in an embedded script of the HTML page
try {
return Parser.matchGroup1(
EMBEDDED_WATCH_PAGE_JS_BASE_PLAYER_URL_PATTERN, embedPageContent);
@ -145,29 +137,28 @@ public final class YoutubeJavaScriptExtractor {
}
@Nonnull
private static String cleanJavaScriptUrl(@Nonnull final String playerJsUrl) {
if (playerJsUrl.startsWith("//")) {
private static String cleanJavaScriptUrl(@Nonnull final String javaScriptPlayerUrl) {
if (javaScriptPlayerUrl.startsWith("//")) {
// https part has to be added manually if the URL is protocol-relative
return HTTPS + playerJsUrl;
} else if (playerJsUrl.startsWith("/")) {
return HTTPS + javaScriptPlayerUrl;
} else if (javaScriptPlayerUrl.startsWith("/")) {
// https://www.youtube.com part has to be added manually if the URL is relative to
// YouTube's domain
return HTTPS + "//www.youtube.com" + playerJsUrl;
return HTTPS + "//www.youtube.com" + javaScriptPlayerUrl;
} else {
return playerJsUrl;
return javaScriptPlayerUrl;
}
}
@Nonnull
private static String downloadJavaScriptCode(@Nonnull final String playerJsUrl)
private static String downloadJavaScriptCode(@Nonnull final String javaScriptPlayerUrl)
throws ParsingException {
try {
return NewPipe.getDownloader()
.get(playerJsUrl, Localization.DEFAULT)
.get(javaScriptPlayerUrl, Localization.DEFAULT)
.responseBody();
} catch (final Exception e) {
throw new ParsingException(
"Could not get JavaScript base player's code from URL: " + playerJsUrl, e);
throw new ParsingException("Could not get JavaScript base player's code", e);
}
}
}

View File

@ -0,0 +1,348 @@
package org.schabi.newpipe.extractor.services.youtube;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
import org.schabi.newpipe.extractor.utils.JavaScript;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* Manage the extraction and the usage of YouTube's player JavaScript needed data in the YouTube
* service.
*
* <p>
* YouTube restrict streaming their media in multiple ways by requiring their HTML5 clients to use
* a signature timestamp, and on streaming URLs a signature deobfuscation function for some
* contents and a throttling parameter deobfuscation one for all contents.
* </p>
*
* <p>
* This class provides access to methods which allows to get base JavaScript player's signature
* timestamp and to deobfuscate streaming URLs' signature and/or throttling parameter of HTML5
* clients.
* </p>
*/
public final class YoutubeJavaScriptPlayerManager {
@Nonnull
private static final Map<String, String> CACHED_THROTTLING_PARAMETERS = new HashMap<>();
private static String cachedJavaScriptPlayerCode;
@Nullable
private static Integer cachedSignatureTimestamp;
@Nullable
private static String cachedSignatureDeobfuscationFunction;
@Nullable
private static String cachedThrottlingDeobfuscationFunctionName;
@Nullable
private static String cachedThrottlingDeobfuscationFunction;
@Nullable
private static ParsingException throttlingDeobfFuncExtractionEx;
@Nullable
private static ParsingException sigDeobFuncExtractionEx;
@Nullable
private static ParsingException sigTimestampExtractionEx;
private YoutubeJavaScriptPlayerManager() {
}
/**
* Get the signature timestamp of the base JavaScript player file.
*
* <p>
* A valid signature timestamp sent in the payload of player InnerTube requests is required to
* get valid stream URLs on HTML5 clients for videos which have obfuscated signatures.
* </p>
*
* <p>
* The base JavaScript player file will fetched if it is not already done.
* </p>
*
* <p>
* The result of the extraction is cached until {@link #clearAllCaches()} is called, making
* subsequent calls faster.
* </p>
*
* @param videoId the video ID used to get the JavaScript base player file (an empty one can be
* passed, even it is not recommend in order to spoof better official YouTube
* clients)
* @return the signature timestamp of the base JavaScript player file
* @throws ParsingException if the extraction of the base JavaScript player file or the
* signature timestamp failed
*/
@Nonnull
public static Integer getSignatureTimestamp(@Nonnull final String videoId)
throws ParsingException {
// Return the cached result if it is present
if (cachedSignatureTimestamp != null) {
return cachedSignatureTimestamp;
}
// If the signature timestamp has been not extracted on a previous call, this mean that we
// will fail to extract it on next calls too if the player code has been not changed
// Throw again the corresponding stored exception in this case to improve performance
if (sigTimestampExtractionEx != null) {
throw sigTimestampExtractionEx;
}
extractJavaScriptCodeIfNeeded(videoId);
try {
cachedSignatureTimestamp = Integer.valueOf(
YoutubeSignatureUtils.getSignatureTimestamp(cachedJavaScriptPlayerCode));
} catch (final ParsingException e) {
// Store the exception for future calls of this method, in order to improve performance
sigTimestampExtractionEx = e;
throw e;
} catch (final NumberFormatException e) {
sigTimestampExtractionEx =
new ParsingException("Could not convert signature timestamp to a number", e);
} catch (final Exception e) {
sigTimestampExtractionEx = new ParsingException("Could not get signature timestamp", e);
throw e;
}
return cachedSignatureTimestamp;
}
/**
* Deobfuscate a signature of a streaming URL using its corresponding JavaScript base player's
* function.
*
* <p>
* Obfuscated signatures are only present on streaming URLs of some videos with HTML5 clients.
* </p>
*
* @param videoId the video ID used to get the JavaScript base player file (an
* empty one can be passed, even it is not recommend in order to
* spoof better official YouTube clients)
* @param obfuscatedSignature the obfuscated signature of a streaming URL
* @return the deobfuscated signature
* @throws ParsingException if the extraction of the base JavaScript player file or the
* signature deobfuscation function failed
*/
@Nonnull
public static String deobfuscateSignature(@Nonnull final String videoId,
@Nonnull final String obfuscatedSignature)
throws ParsingException {
// If the signature deobfuscation function has been not extracted on a previous call, this
// mean that we will fail to extract it on next calls too if the player code has been not
// changed
// Throw again the corresponding stored exception in this case to improve performance
if (sigDeobFuncExtractionEx != null) {
throw sigDeobFuncExtractionEx;
}
extractJavaScriptCodeIfNeeded(videoId);
if (cachedSignatureDeobfuscationFunction == null) {
try {
cachedSignatureDeobfuscationFunction = YoutubeSignatureUtils.getDeobfuscationCode(
cachedJavaScriptPlayerCode);
} catch (final ParsingException e) {
// Store the exception for future calls of this method, in order to improve
// performance
sigDeobFuncExtractionEx = e;
throw e;
} catch (final Exception e) {
sigDeobFuncExtractionEx = new ParsingException(
"Could not get signature parameter deobfuscation JavaScript function", e);
throw e;
}
}
try {
// Return an empty parameter in the case the function returns null
return Objects.requireNonNullElse(
JavaScript.run(cachedSignatureDeobfuscationFunction,
YoutubeSignatureUtils.DEOBFUSCATION_FUNCTION_NAME,
obfuscatedSignature), "");
} catch (final Exception e) {
// This shouldn't happen as the function validity is checked when it is extracted
throw new ParsingException(
"Could not run signature parameter deobfuscation JavaScript function", e);
}
}
/**
* Return a streaming URL with the throttling parameter of a given one deobfuscated, if it is
* present, using its corresponding JavaScript base player's function.
*
* <p>
* The throttling parameter is present on all streaming URLs of HTML5 clients.
* </p>
*
* <p>
* If it is not given or deobfuscated, speeds will be throttled to a very slow speed (around 50
* KB/s) and some streaming URLs could even lead to invalid HTTP responses such a 403 one.
* </p>
*
* <p>
* As throttling parameters can be common between multiple streaming URLs of the same player
* response, deobfuscated parameters are cached with their obfuscated variant, in order to
* improve performance with multiple calls of this method having the same obfuscated throttling
* parameter.
* </p>
*
* <p>
* The cache's size can be get using {@link #getThrottlingParametersCacheSize()} and the cache
* can be cleared using {@link #clearThrottlingParametersCache()} or {@link #clearAllCaches()}.
* </p>
*
* @param videoId the video ID used to get the JavaScript base player file (an empty one
* can be passed, even it is not recommend in order to spoof better
* official YouTube clients)
* @param streamingUrl a streaming URL
* @return the original streaming URL if it has no throttling parameter or a URL with a
* deobfuscated throttling parameter
* @throws ParsingException if the extraction of the base JavaScript player file or the
* throttling parameter deobfuscation function failed
*/
@Nonnull
public static String getUrlWithThrottlingParameterDeobfuscated(
@Nonnull final String videoId,
@Nonnull final String streamingUrl) throws ParsingException {
final String obfuscatedThrottlingParameter =
YoutubeThrottlingParameterUtils.getThrottlingParameterFromStreamingUrl(
streamingUrl);
// If the throttling parameter is not present, return the original streaming URL
if (obfuscatedThrottlingParameter == null) {
return streamingUrl;
}
// Do not use the containsKey method of the Map interface in order to avoid a double
// element search, and so to improve performance
final String cacheResult = CACHED_THROTTLING_PARAMETERS.get(
obfuscatedThrottlingParameter);
if (cacheResult != null) {
// If the throttling parameter function has been already ran on the throttling parameter
// of the current streaming URL, replace directly the obfuscated throttling parameter
// with the cached result in the streaming URL
return streamingUrl.replace(obfuscatedThrottlingParameter, cacheResult);
}
extractJavaScriptCodeIfNeeded(videoId);
// If the throttling parameter deobfuscation function has been not extracted on a previous
// call, this mean that we will fail to extract it on next calls too if the player code has
// been not changed
// Throw again the corresponding stored exception in this case to improve performance
if (throttlingDeobfFuncExtractionEx != null) {
throw throttlingDeobfFuncExtractionEx;
}
if (cachedThrottlingDeobfuscationFunction == null) {
try {
cachedThrottlingDeobfuscationFunctionName =
YoutubeThrottlingParameterUtils.getDeobfuscationFunctionName(
cachedJavaScriptPlayerCode);
cachedThrottlingDeobfuscationFunction =
YoutubeThrottlingParameterUtils.getDeobfuscationFunction(
cachedJavaScriptPlayerCode,
cachedThrottlingDeobfuscationFunctionName);
} catch (final ParsingException e) {
// Store the exception for future calls of this method, in order to improve
// performance
throttlingDeobfFuncExtractionEx = e;
throw e;
} catch (final Exception e) {
throttlingDeobfFuncExtractionEx = new ParsingException(
"Could not get throttling parameter deobfuscation JavaScript function", e);
throw e;
}
}
try {
final String deobfuscatedThrottlingParameter = JavaScript.run(
cachedThrottlingDeobfuscationFunction,
cachedThrottlingDeobfuscationFunctionName,
obfuscatedThrottlingParameter);
CACHED_THROTTLING_PARAMETERS.put(
obfuscatedThrottlingParameter, deobfuscatedThrottlingParameter);
return streamingUrl.replace(
obfuscatedThrottlingParameter, deobfuscatedThrottlingParameter);
} catch (final Exception e) {
// This shouldn't happen as the function validity is checked when it is extracted
throw new ParsingException(
"Could not run throttling parameter deobfuscation JavaScript function", e);
}
}
/**
* Get the current cache size of throttling parameters.
*
* @return the current cache size of throttling parameters
*/
public static int getThrottlingParametersCacheSize() {
return CACHED_THROTTLING_PARAMETERS.size();
}
/**
* Clear all caches.
*
* <p>
* This method will clear all cached JavaScript code and throttling parameters.
* </p>
*
* <p>
* The next time {@link #getSignatureTimestamp(String)},
* {@link #deobfuscateSignature(String, String)} or
* {@link #getUrlWithThrottlingParameterDeobfuscated(String, String)} is called, the JavaScript
* code will be fetched again and the corresponding extraction methods will be ran.
* </p>
*/
public static void clearAllCaches() {
cachedJavaScriptPlayerCode = null;
cachedSignatureDeobfuscationFunction = null;
cachedThrottlingDeobfuscationFunctionName = null;
cachedThrottlingDeobfuscationFunction = null;
cachedSignatureTimestamp = null;
clearThrottlingParametersCache();
// Clear cached extraction exceptions, if applicable
throttlingDeobfFuncExtractionEx = null;
sigDeobFuncExtractionEx = null;
sigTimestampExtractionEx = null;
}
/**
* Clear all cached throttling parameters.
*
* <p>
* The throttling parameter deobfuscation function will be ran again on these parameters if
* streaming URLs containing them are passed in the future.
* </p>
*
* <p>
* This method doesn't clear the cached throttling parameter deobfuscation function, this can
* be done using {@link #clearAllCaches()}.
* </p>
*/
public static void clearThrottlingParametersCache() {
CACHED_THROTTLING_PARAMETERS.clear();
}
/**
* Extract the JavaScript code if it isn't already cached.
*
* @param videoId the video ID used to get the JavaScript base player file (an empty one can be
* passed, even it is not recommend in order to spoof better official YouTube
* clients)
* @throws ParsingException if the extraction of the base JavaScript player file failed
*/
private static void extractJavaScriptCodeIfNeeded(@Nonnull final String videoId)
throws ParsingException {
if (cachedJavaScriptPlayerCode == null) {
cachedJavaScriptPlayerCode = YoutubeJavaScriptExtractor.extractJavaScriptPlayerCode(
videoId);
}
}
}

View File

@ -1419,7 +1419,7 @@ public final class YoutubeParsingHelper {
@Nonnull final Localization localization,
@Nonnull final ContentCountry contentCountry,
@Nonnull final String videoId,
@Nonnull final String sts,
@Nonnull final Integer sts,
final boolean isTvHtml5DesktopJsonBuilder,
@Nonnull final String contentPlaybackNonce) throws IOException, ExtractionException {
// @formatter:off

View File

@ -0,0 +1,151 @@
package org.schabi.newpipe.extractor.services.youtube;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
import org.schabi.newpipe.extractor.utils.JavaScript;
import org.schabi.newpipe.extractor.utils.Parser;
import org.schabi.newpipe.extractor.utils.jsextractor.JavaScriptExtractor;
import javax.annotation.Nonnull;
import java.util.regex.Pattern;
/**
* Utility class to get the signature timestamp of YouTube's base JavaScript player and deobfuscate
* signature of streaming URLs from HTML5 clients.
*/
final class YoutubeSignatureUtils {
/**
* The name of the deobfuscation function which needs to be called inside the deobfuscation
* code.
*/
static final String DEOBFUSCATION_FUNCTION_NAME = "deobfuscate";
private static final String[] FUNCTION_REGEXES = {
"\\bm=([a-zA-Z0-9$]{2,})\\(decodeURIComponent\\(h\\.s\\)\\)",
"\\bc&&\\(c=([a-zA-Z0-9$]{2,})\\(decodeURIComponent\\(c\\)\\)",
// CHECKSTYLE:OFF
"(?:\\b|[^a-zA-Z0-9$])([a-zA-Z0-9$]{2,})\\s*=\\s*function\\(\\s*a\\s*\\)\\s*\\{\\s*a\\s*=\\s*a\\.split\\(\\s*\"\"\\s*\\)",
// CHECKSTYLE:ON
"([\\w$]+)\\s*=\\s*function\\((\\w+)\\)\\{\\s*\\2=\\s*\\2\\.split\\(\"\"\\)\\s*;"
};
private static final String STS_REGEX = "signatureTimestamp[=:](\\d+)";
private static final String DEOBF_FUNC_REGEX_START = "(";
private static final String DEOBF_FUNC_REGEX_END = "=function\\([a-zA-Z0-9_]+\\)\\{.+?\\})";
private static final String SIG_DEOBF_HELPER_OBJ_NAME_REGEX = ";([A-Za-z0-9_\\$]{2,})\\...\\(";
private static final String SIG_DEOBF_HELPER_OBJ_REGEX_START = "(var ";
private static final String SIG_DEOBF_HELPER_OBJ_REGEX_END = "=\\{(?>.|\\n)+?\\}\\};)";
private YoutubeSignatureUtils() {
}
/**
* Get the signature timestamp property of YouTube's base JavaScript file.
*
* @param javaScriptPlayerCode the complete JavaScript base player code
* @return the signature timestamp
* @throws ParsingException if the signature timestamp couldn't be extracted
*/
@Nonnull
static String getSignatureTimestamp(@Nonnull final String javaScriptPlayerCode)
throws ParsingException {
try {
return Parser.matchGroup1(STS_REGEX, javaScriptPlayerCode);
} catch (final ParsingException e) {
throw new ParsingException(
"Could not extract signature timestamp from JavaScript code", e);
}
}
/**
* Get the signature deobfuscation code of YouTube's base JavaScript file.
*
* @param javaScriptPlayerCode the complete JavaScript base player code
* @return the signature deobfuscation code
* @throws ParsingException if the signature deobfuscation code couldn't be extracted
*/
@Nonnull
static String getDeobfuscationCode(@Nonnull final String javaScriptPlayerCode)
throws ParsingException {
try {
final String deobfuscationFunctionName = getDeobfuscationFunctionName(
javaScriptPlayerCode);
String deobfuscationFunction;
try {
deobfuscationFunction = getDeobfuscateFunctionWithLexer(
javaScriptPlayerCode, deobfuscationFunctionName);
} catch (final Exception e) {
deobfuscationFunction = getDeobfuscateFunctionWithRegex(
javaScriptPlayerCode, deobfuscationFunctionName);
}
// Assert the extracted deobfuscation function is valid
JavaScript.compileOrThrow(deobfuscationFunction);
final String helperObjectName =
Parser.matchGroup1(SIG_DEOBF_HELPER_OBJ_NAME_REGEX, deobfuscationFunction);
final String helperObject = getHelperObject(javaScriptPlayerCode, helperObjectName);
final String callerFunction = "function " + DEOBFUSCATION_FUNCTION_NAME
+ "(a){return "
+ deobfuscationFunctionName
+ "(a);}";
return helperObject + deobfuscationFunction + ";" + callerFunction;
} catch (final Exception e) {
throw new ParsingException("Could not parse deobfuscation function", e);
}
}
@Nonnull
private static String getDeobfuscationFunctionName(@Nonnull final String javaScriptPlayerCode)
throws ParsingException {
Parser.RegexException exception = null;
for (final String regex : FUNCTION_REGEXES) {
try {
return Parser.matchGroup1(regex, javaScriptPlayerCode);
} catch (final Parser.RegexException e) {
if (exception == null) {
exception = e;
}
}
}
throw new ParsingException(
"Could not find deobfuscation function with any of the known patterns", exception);
}
@Nonnull
private static String getDeobfuscateFunctionWithLexer(
@Nonnull final String javaScriptPlayerCode,
@Nonnull final String deobfuscationFunctionName) throws ParsingException {
final String functionBase = deobfuscationFunctionName + "=function";
return functionBase + JavaScriptExtractor.matchToClosingBrace(
javaScriptPlayerCode, functionBase);
}
@Nonnull
private static String getDeobfuscateFunctionWithRegex(
@Nonnull final String javaScriptPlayerCode,
@Nonnull final String deobfuscationFunctionName) throws ParsingException {
final String functionPattern = DEOBF_FUNC_REGEX_START
+ Pattern.quote(deobfuscationFunctionName)
+ DEOBF_FUNC_REGEX_END;
return "var " + Parser.matchGroup1(functionPattern, javaScriptPlayerCode);
}
@Nonnull
private static String getHelperObject(@Nonnull final String javaScriptPlayerCode,
@Nonnull final String helperObjectName)
throws ParsingException {
final String helperPattern = SIG_DEOBF_HELPER_OBJ_REGEX_START
+ Pattern.quote(helperObjectName)
+ SIG_DEOBF_HELPER_OBJ_REGEX_END;
return Parser.matchGroup1(helperPattern, javaScriptPlayerCode)
.replace("\n", "");
}
}

View File

@ -1,204 +0,0 @@
package org.schabi.newpipe.extractor.services.youtube;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
import org.schabi.newpipe.extractor.utils.JavaScript;
import org.schabi.newpipe.extractor.utils.Parser;
import org.schabi.newpipe.extractor.utils.jsextractor.JavaScriptExtractor;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.Nonnull;
/**
* YouTube's streaming URLs of HTML5 clients are protected with a cipher, which modifies their
* {@code n} query parameter.
*
* <p>
* This class handles extracting that {@code n} query parameter, applying the cipher on it and
* returning the resulting URL which is not throttled.
* </p>
*
* <p>
* For instance,
* {@code https://r5---sn-4g5ednsz.googlevideo.com/videoplayback?n=VVF2xyZLVRZZxHXZ&other=other}
* becomes
* {@code https://r5---sn-4g5ednsz.googlevideo.com/videoplayback?n=iHywZkMipkszqA&other=other}.
* </p>
*
* <p>
* Decoding the {@code n} parameter is time intensive. For this reason, the results are cached.
* The cache can be cleared using {@link #clearCache()}.
* </p>
*
*/
public final class YoutubeThrottlingDecrypter {
private static final Pattern N_PARAM_PATTERN = Pattern.compile("[&?]n=([^&]+)");
private static final Pattern DECRYPT_FUNCTION_NAME_PATTERN = Pattern.compile(
// CHECKSTYLE:OFF
"\\.get\\(\"n\"\\)\\)&&\\([a-zA-Z0-9$_]=([a-zA-Z0-9$_]+)(?:\\[(\\d+)])?\\([a-zA-Z0-9$_]\\)");
// CHECKSTYLE:ON
// Escape the curly end brace to allow compatibility with Android's regex engine
// See https://stackoverflow.com/q/45074813
@SuppressWarnings("RegExpRedundantEscape")
private static final String DECRYPT_FUNCTION_BODY_REGEX =
"=\\s*function([\\S\\s]*?\\}\\s*return [\\w$]+?\\.join\\(\"\"\\)\\s*\\};)";
private static final String DECRYPT_FUNCTION_ARRAY_OBJECT_TYPE_DECLARATION_REGEX = "var ";
private static final String FUNCTION_NAMES_IN_DECRYPT_ARRAY_REGEX = "\\s*=\\s*\\[(.+?)][;,]";
private static final Map<String, String> N_PARAMS_CACHE = new HashMap<>();
private static String decryptFunction;
private static String decryptFunctionName;
private YoutubeThrottlingDecrypter() {
// No implementation
}
/**
* Try to decrypt a YouTube streaming URL protected with a throttling parameter.
*
* <p>
* If the streaming URL provided doesn't contain a throttling parameter, it is returned as it
* is; otherwise, the encrypted value is decrypted and this value is replaced by the decrypted
* one.
* </p>
*
* <p>
* If the JavaScript code has been not extracted, it is extracted with the given video ID using
* {@link YoutubeJavaScriptExtractor#extractJavaScriptCode(String)}.
* </p>
*
* @param streamingUrl The streaming URL to decrypt, if needed.
* @param videoId A video ID, used to fetch the JavaScript code to get the decryption
* function. It can be a constant value of any existing video, but a
* constant value is discouraged, because it could allow tracking.
* @return A streaming URL with the decrypted parameter or the streaming URL itself if no
* throttling parameter has been found.
* @throws ParsingException If the streaming URL contains a throttling parameter and its
* decryption failed
*/
public static String apply(@Nonnull final String streamingUrl,
@Nonnull final String videoId) throws ParsingException {
if (!containsNParam(streamingUrl)) {
return streamingUrl;
}
try {
if (decryptFunction == null) {
final String playerJsCode
= YoutubeJavaScriptExtractor.extractJavaScriptCode(videoId);
decryptFunctionName = parseDecodeFunctionName(playerJsCode);
decryptFunction = parseDecodeFunction(playerJsCode, decryptFunctionName);
}
final String oldNParam = parseNParam(streamingUrl);
final String newNParam = decryptNParam(decryptFunction, decryptFunctionName, oldNParam);
return replaceNParam(streamingUrl, oldNParam, newNParam);
} catch (final Exception e) {
throw new ParsingException("Could not parse, decrypt or replace n parameter", e);
}
}
private static String parseDecodeFunctionName(final String playerJsCode)
throws Parser.RegexException {
final Matcher matcher = DECRYPT_FUNCTION_NAME_PATTERN.matcher(playerJsCode);
if (!matcher.find()) {
throw new Parser.RegexException("Failed to find pattern \""
+ DECRYPT_FUNCTION_NAME_PATTERN + "\"");
}
final String functionName = matcher.group(1);
if (matcher.groupCount() == 1) {
return functionName;
}
final int arrayNum = Integer.parseInt(matcher.group(2));
final Pattern arrayPattern = Pattern.compile(
DECRYPT_FUNCTION_ARRAY_OBJECT_TYPE_DECLARATION_REGEX + Pattern.quote(functionName)
+ FUNCTION_NAMES_IN_DECRYPT_ARRAY_REGEX);
final String arrayStr = Parser.matchGroup1(arrayPattern, playerJsCode);
final String[] names = arrayStr.split(",");
return names[arrayNum];
}
@Nonnull
private static String parseDecodeFunction(final String playerJsCode, final String functionName)
throws Parser.RegexException {
try {
return parseWithLexer(playerJsCode, functionName);
} catch (final Exception e) {
return parseWithRegex(playerJsCode, functionName);
}
}
@Nonnull
private static String parseWithRegex(final String playerJsCode, final String functionName)
throws Parser.RegexException {
// Quote the function name, as it may contain special regex characters such as dollar
final Pattern functionPattern = Pattern.compile(
Pattern.quote(functionName) + DECRYPT_FUNCTION_BODY_REGEX, Pattern.DOTALL);
return validateFunction("function "
+ functionName
+ Parser.matchGroup1(functionPattern, playerJsCode));
}
@Nonnull
private static String validateFunction(@Nonnull final String function) {
JavaScript.compileOrThrow(function);
return function;
}
@Nonnull
private static String parseWithLexer(final String playerJsCode, final String functionName)
throws ParsingException {
final String functionBase = functionName + "=function";
return functionBase + JavaScriptExtractor.matchToClosingBrace(playerJsCode, functionBase)
+ ";";
}
private static boolean containsNParam(final String url) {
return Parser.isMatch(N_PARAM_PATTERN, url);
}
private static String parseNParam(final String url) throws Parser.RegexException {
return Parser.matchGroup1(N_PARAM_PATTERN, url);
}
private static String decryptNParam(final String function,
final String functionName,
final String nParam) {
if (N_PARAMS_CACHE.containsKey(nParam)) {
return N_PARAMS_CACHE.get(nParam);
}
final String decryptedNParam = JavaScript.run(function, functionName, nParam);
N_PARAMS_CACHE.put(nParam, decryptedNParam);
return decryptedNParam;
}
@Nonnull
private static String replaceNParam(@Nonnull final String url,
final String oldValue,
final String newValue) {
return url.replace(oldValue, newValue);
}
/**
* @return The number of the cached {@code n} query parameters.
*/
public static int getCacheSize() {
return N_PARAMS_CACHE.size();
}
/**
* Clears all stored {@code n} query parameters.
*/
public static void clearCache() {
N_PARAMS_CACHE.clear();
}
}

View File

@ -0,0 +1,137 @@
package org.schabi.newpipe.extractor.services.youtube;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
import org.schabi.newpipe.extractor.utils.JavaScript;
import org.schabi.newpipe.extractor.utils.Parser;
import org.schabi.newpipe.extractor.utils.jsextractor.JavaScriptExtractor;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Utility class to get the throttling parameter decryption code and check if a streaming has the
* throttling parameter.
*/
final class YoutubeThrottlingParameterUtils {
private static final Pattern THROTTLING_PARAM_PATTERN = Pattern.compile("[&?]n=([^&]+)");
private static final Pattern DEOBFUSCATION_FUNCTION_NAME_PATTERN = Pattern.compile(
// CHECKSTYLE:OFF
"\\.get\\(\"n\"\\)\\)&&\\([a-zA-Z0-9$_]=([a-zA-Z0-9$_]+)(?:\\[(\\d+)])?\\([a-zA-Z0-9$_]\\)");
// CHECKSTYLE:ON
// Escape the curly end brace to allow compatibility with Android's regex engine
// See https://stackoverflow.com/q/45074813
@SuppressWarnings("RegExpRedundantEscape")
private static final String DEOBFUSCATION_FUNCTION_BODY_REGEX =
"=\\s*function([\\S\\s]*?\\}\\s*return [\\w$]+?\\.join\\(\"\"\\)\\s*\\};)";
private static final String DEOBFUSCATION_FUNCTION_ARRAY_OBJECT_TYPE_DECLARATION_REGEX = "var ";
private static final String FUNCTION_NAMES_IN_DEOBFUSCATION_ARRAY_REGEX =
"\\s*=\\s*\\[(.+?)][;,]";
private YoutubeThrottlingParameterUtils() {
}
/**
* Get the throttling parameter deobfuscation function name of YouTube's base JavaScript file.
*
* @param javaScriptPlayerCode the complete JavaScript base player code
* @return the name of the throttling parameter deobfuscation function
* @throws ParsingException if the name of the throttling parameter deobfuscation function
* could not be extracted
*/
@Nonnull
static String getDeobfuscationFunctionName(@Nonnull final String javaScriptPlayerCode)
throws ParsingException {
final Matcher matcher = DEOBFUSCATION_FUNCTION_NAME_PATTERN.matcher(javaScriptPlayerCode);
if (!matcher.find()) {
throw new ParsingException("Failed to find deobfuscation function name pattern \""
+ DEOBFUSCATION_FUNCTION_NAME_PATTERN
+ "\" in the base JavaScript player code");
}
final String functionName = matcher.group(1);
if (matcher.groupCount() == 1) {
return functionName;
}
final int arrayNum = Integer.parseInt(matcher.group(2));
final Pattern arrayPattern = Pattern.compile(
DEOBFUSCATION_FUNCTION_ARRAY_OBJECT_TYPE_DECLARATION_REGEX
+ Pattern.quote(functionName)
+ FUNCTION_NAMES_IN_DEOBFUSCATION_ARRAY_REGEX);
final String arrayStr = Parser.matchGroup1(arrayPattern, javaScriptPlayerCode);
final String[] names = arrayStr.split(",");
return names[arrayNum];
}
/**
* Get the throttling parameter deobfuscation code of YouTube's base JavaScript file.
*
* @param javaScriptPlayerCode the complete JavaScript base player code
* @return the throttling parameter deobfuscation function name
* @throws ParsingException if the throttling parameter deobfuscation code couldn't be
* extracted
*/
@Nonnull
static String getDeobfuscationFunction(@Nonnull final String javaScriptPlayerCode,
@Nonnull final String functionName)
throws ParsingException {
try {
return parseFunctionWithLexer(javaScriptPlayerCode, functionName);
} catch (final Exception e) {
return parseFunctionWithRegex(javaScriptPlayerCode, functionName);
}
}
/**
* Get the throttling parameter of a streaming URL if it exists.
*
* @param streamingUrl a streaming URL
* @return the throttling parameter of the streaming URL or {@code null} if no parameter has
* been found
*/
@Nullable
static String getThrottlingParameterFromStreamingUrl(@Nonnull final String streamingUrl) {
try {
return Parser.matchGroup1(THROTTLING_PARAM_PATTERN, streamingUrl);
} catch (final Parser.RegexException e) {
// If the throttling parameter could not be parsed from the URL, it means that there is
// no throttling parameter
// Return null in this case
return null;
}
}
@Nonnull
private static String parseFunctionWithLexer(@Nonnull final String javaScriptPlayerCode,
@Nonnull final String functionName)
throws ParsingException {
final String functionBase = functionName + "=function";
return functionBase + JavaScriptExtractor.matchToClosingBrace(
javaScriptPlayerCode, functionBase) + ";";
}
@Nonnull
private static String parseFunctionWithRegex(@Nonnull final String javaScriptPlayerCode,
@Nonnull final String functionName)
throws Parser.RegexException {
// Quote the function name, as it may contain special regex characters such as dollar
final Pattern functionPattern = Pattern.compile(
Pattern.quote(functionName) + DEOBFUSCATION_FUNCTION_BODY_REGEX,
Pattern.DOTALL);
return validateFunction("function " + functionName
+ Parser.matchGroup1(functionPattern, javaScriptPlayerCode));
}
@Nonnull
private static String validateFunction(@Nonnull final String function) {
JavaScript.compileOrThrow(function);
return function;
}
}

View File

@ -45,9 +45,6 @@ import com.grack.nanojson.JsonArray;
import com.grack.nanojson.JsonObject;
import com.grack.nanojson.JsonWriter;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.ScriptableObject;
import org.schabi.newpipe.extractor.Image;
import org.schabi.newpipe.extractor.MediaFormat;
import org.schabi.newpipe.extractor.MetaInfo;
@ -69,9 +66,8 @@ import org.schabi.newpipe.extractor.localization.Localization;
import org.schabi.newpipe.extractor.localization.TimeAgoParser;
import org.schabi.newpipe.extractor.localization.TimeAgoPatternsManager;
import org.schabi.newpipe.extractor.services.youtube.ItagItem;
import org.schabi.newpipe.extractor.services.youtube.YoutubeJavaScriptExtractor;
import org.schabi.newpipe.extractor.services.youtube.YoutubeJavaScriptPlayerManager;
import org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper;
import org.schabi.newpipe.extractor.services.youtube.YoutubeThrottlingDecrypter;
import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeChannelLinkHandlerFactory;
import org.schabi.newpipe.extractor.stream.AudioStream;
import org.schabi.newpipe.extractor.stream.DeliveryMethod;
@ -107,25 +103,6 @@ import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class YoutubeStreamExtractor extends StreamExtractor {
/*//////////////////////////////////////////////////////////////////////////
// Exceptions
//////////////////////////////////////////////////////////////////////////*/
public static class DeobfuscateException extends ParsingException {
DeobfuscateException(final String message, final Throwable cause) {
super(message, cause);
}
}
/*////////////////////////////////////////////////////////////////////////*/
@Nullable
private static String cachedDeobfuscationCode = null;
@Nullable
private static String sts = null;
@Nullable
private static String playerCode = null;
private static boolean isAndroidClientFetchForced = false;
private static boolean isIosClientFetchForced = false;
@ -637,19 +614,22 @@ public class YoutubeStreamExtractor extends StreamExtractor {
}
/**
* Try to decrypt a streaming URL and fall back to the given URL, because decryption may fail
* if YouTube changes break something.
* Try to deobfuscate a streaming URL and fall back to the given URL, because decryption may
* fail if YouTube changes break something.
*
* <p>
* This way a breaking change from YouTube does not result in a broken extractor.
* </p>
*
* @param streamingUrl the streaming URL to decrypt with {@link YoutubeThrottlingDecrypter}
* @param streamingUrl the streaming URL to which deobfuscating its throttling parameter if
* there is one
* @param videoId the video ID to use when extracting JavaScript player code, if needed
*/
private String tryDecryptUrl(final String streamingUrl, final String videoId) {
private String tryDeobfuscateThrottlingParameterOfUrl(@Nonnull final String streamingUrl,
@Nonnull final String videoId) {
try {
return YoutubeThrottlingDecrypter.apply(streamingUrl, videoId);
return YoutubeJavaScriptPlayerManager.getUrlWithThrottlingParameterDeobfuscated(
videoId, streamingUrl);
} catch (final ParsingException e) {
return streamingUrl;
}
@ -781,36 +761,28 @@ public class YoutubeStreamExtractor extends StreamExtractor {
private static final String FORMATS = "formats";
private static final String ADAPTIVE_FORMATS = "adaptiveFormats";
private static final String DEOBFUSCATION_FUNC_NAME = "deobfuscate";
private static final String STREAMING_DATA = "streamingData";
private static final String PLAYER = "player";
private static final String NEXT = "next";
private static final String SIGNATURE_CIPHER = "signatureCipher";
private static final String CIPHER = "cipher";
private static final String[] REGEXES = {
"(?:\\b|[^a-zA-Z0-9$])([a-zA-Z0-9$]{2,})\\s*=\\s*function\\(\\s*a\\s*\\)"
+ "\\s*\\{\\s*a\\s*=\\s*a\\.split\\(\\s*\"\"\\s*\\)",
"\\bm=([a-zA-Z0-9$]{2,})\\(decodeURIComponent\\(h\\.s\\)\\)",
"\\bc&&\\(c=([a-zA-Z0-9$]{2,})\\(decodeURIComponent\\(c\\)\\)",
"([\\w$]+)\\s*=\\s*function\\((\\w+)\\)\\{\\s*\\2=\\s*\\2\\.split\\(\"\"\\)\\s*;",
"\\b([\\w$]{2,})\\s*=\\s*function\\((\\w+)\\)\\{\\s*\\2=\\s*\\2\\.split\\(\"\"\\)\\s*;",
"\\bc\\s*&&\\s*d\\.set\\([^,]+\\s*,\\s*(:encodeURIComponent\\s*\\()([a-zA-Z0-9$]+)\\("
};
private static final String STS_REGEX = "signatureTimestamp[=:](\\d+)";
@Override
public void onFetchPage(@Nonnull final Downloader downloader)
throws IOException, ExtractionException {
final String videoId = getId();
initStsFromPlayerJsIfNeeded(videoId);
final Localization localization = getExtractorLocalization();
final ContentCountry contentCountry = getExtractorContentCountry();
html5Cpn = generateContentPlaybackNonce();
playerResponse = getJsonPostResponse(PLAYER,
createDesktopPlayerBody(localization, contentCountry, videoId, sts, false,
createDesktopPlayerBody(
localization,
contentCountry,
videoId,
YoutubeJavaScriptPlayerManager.getSignatureTimestamp(videoId),
false,
html5Cpn),
localization);
@ -1044,7 +1016,11 @@ public class YoutubeStreamExtractor extends StreamExtractor {
html5Cpn = generateContentPlaybackNonce();
final JsonObject tvHtml5EmbedPlayerResponse = getJsonPostResponse(PLAYER,
createDesktopPlayerBody(localization, contentCountry, videoId, sts, true,
createDesktopPlayerBody(localization,
contentCountry,
videoId,
YoutubeJavaScriptPlayerManager.getSignatureTimestamp(videoId),
true,
html5Cpn), localization);
if (isPlayerResponseNotValid(tvHtml5EmbedPlayerResponse, videoId)) {
@ -1096,106 +1072,6 @@ public class YoutubeStreamExtractor extends StreamExtractor {
.getString("videoId"));
}
private static void storePlayerJs(@Nonnull final String videoId) throws ParsingException {
try {
playerCode = YoutubeJavaScriptExtractor.extractJavaScriptCode(videoId);
} catch (final Exception e) {
throw new ParsingException("Could not store JavaScript player", e);
}
}
private static String getDeobfuscationFuncName(final String thePlayerCode)
throws DeobfuscateException {
Parser.RegexException exception = null;
for (final String regex : REGEXES) {
try {
return Parser.matchGroup1(regex, thePlayerCode);
} catch (final Parser.RegexException re) {
if (exception == null) {
exception = re;
}
}
}
throw new DeobfuscateException(
"Could not find deobfuscate function with any of the given patterns.", exception);
}
@Nonnull
private static String loadDeobfuscationCode() throws DeobfuscateException {
try {
final String deobfuscationFunctionName = getDeobfuscationFuncName(playerCode);
final String functionPattern = "("
+ deobfuscationFunctionName.replace("$", "\\$")
+ "=function\\([a-zA-Z0-9_]+\\)\\{.+?\\})";
final String deobfuscateFunction = "var " + Parser.matchGroup1(functionPattern,
playerCode) + ";";
final String helperObjectName =
Parser.matchGroup1(";([A-Za-z0-9_\\$]{2})\\...\\(",
deobfuscateFunction);
final String helperPattern =
"(var " + helperObjectName.replace("$", "\\$")
+ "=\\{.+?\\}\\};)";
final String helperObject =
Parser.matchGroup1(helperPattern, Objects.requireNonNull(playerCode).replace(
"\n", ""));
final String callerFunction =
"function " + DEOBFUSCATION_FUNC_NAME + "(a){return "
+ deobfuscationFunctionName + "(a);}";
return helperObject + deobfuscateFunction + callerFunction;
} catch (final Exception e) {
throw new DeobfuscateException("Could not parse deobfuscate function ", e);
}
}
@Nonnull
private static String getDeobfuscationCode() throws ParsingException {
if (cachedDeobfuscationCode == null) {
if (isNullOrEmpty(playerCode)) {
throw new ParsingException("playerCode is null");
}
cachedDeobfuscationCode = loadDeobfuscationCode();
}
return cachedDeobfuscationCode;
}
private static void initStsFromPlayerJsIfNeeded(@Nonnull final String videoId)
throws ParsingException {
if (!isNullOrEmpty(sts)) {
return;
}
if (playerCode == null) {
storePlayerJs(videoId);
if (playerCode == null) {
throw new ParsingException("playerCode is null");
}
}
sts = Parser.matchGroup1(STS_REGEX, playerCode);
}
private String deobfuscateSignature(final String obfuscatedSig) throws ParsingException {
final String deobfuscationCode = getDeobfuscationCode();
final Context context = Context.enter();
context.setOptimizationLevel(-1);
final Object result;
try {
final ScriptableObject scope = context.initSafeStandardObjects();
context.evaluateString(scope, deobfuscationCode, "deobfuscationCode", 1, null);
final Function deobfuscateFunc = (Function) scope.get(DEOBFUSCATION_FUNC_NAME, scope);
result = deobfuscateFunc.call(context, scope, scope, new Object[]{obfuscatedSig});
} catch (final Exception e) {
throw new DeobfuscateException("Could not get deobfuscate signature", e);
} finally {
Context.exit();
}
return Objects.toString(result, "");
}
/*//////////////////////////////////////////////////////////////////////////
// Utils
//////////////////////////////////////////////////////////////////////////*/
@ -1431,14 +1307,14 @@ public class YoutubeStreamExtractor extends StreamExtractor {
final Map<String, String> cipher = Parser.compatParseMap(
cipherString);
streamUrl = cipher.get("url") + "&" + cipher.get("sp") + "="
+ deobfuscateSignature(cipher.get("s"));
+ YoutubeJavaScriptPlayerManager.deobfuscateSignature(videoId, cipher.get("s"));
}
// Add the content playback nonce to the stream URL
streamUrl += "&" + CPN + "=" + contentPlaybackNonce;
// Decrypt the n parameter if it is present
streamUrl = tryDecryptUrl(streamUrl, videoId);
streamUrl = tryDeobfuscateThrottlingParameterOfUrl(streamUrl, videoId);
final JsonObject initRange = formatData.getObject("initRange");
final JsonObject indexRange = formatData.getObject("indexRange");
@ -1703,24 +1579,6 @@ public class YoutubeStreamExtractor extends StreamExtractor {
.getArray("contents"));
}
/**
* Reset YouTube's deobfuscation code.
*
* <p>
* This is needed for mocks in YouTube stream tests, because when they are ran, the
* {@code signatureTimestamp} is known (the {@code sts} string) so a different body than the
* body present in the mocks is send by the extractor instance. As a result, running all
* YouTube stream tests with the MockDownloader (like the CI does) will fail if this method is
* not called before fetching the page of a test.
* </p>
*/
public static void resetDeobfuscationCode() {
cachedDeobfuscationCode = null;
playerCode = null;
sts = null;
YoutubeJavaScriptExtractor.resetJavaScriptCode();
}
/**
* Enable or disable the fetch of the Android client for all stream types.
*

View File

@ -32,16 +32,16 @@ public class YoutubeJavaScriptExtractorTest {
@Test
public void testExtractJavaScript__success() throws ParsingException {
String playerJsCode = YoutubeJavaScriptExtractor.extractJavaScriptCode("d4IGg5dqeO8");
String playerJsCode = YoutubeJavaScriptExtractor.extractJavaScriptPlayerCode("d4IGg5dqeO8");
assertPlayerJsCode(playerJsCode);
}
@Test
public void testExtractJavaScript__invalidVideoId__success() throws ParsingException {
String playerJsCode = YoutubeJavaScriptExtractor.extractJavaScriptCode("not_a_video_id");
String playerJsCode = YoutubeJavaScriptExtractor.extractJavaScriptPlayerCode("not_a_video_id");
assertPlayerJsCode(playerJsCode);
playerJsCode = YoutubeJavaScriptExtractor.extractJavaScriptCode("11-chars123");
playerJsCode = YoutubeJavaScriptExtractor.extractJavaScriptPlayerCode("11-chars123");
assertPlayerJsCode(playerJsCode);
}

View File

@ -0,0 +1,53 @@
package org.schabi.newpipe.extractor.services.youtube;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.schabi.newpipe.downloader.DownloaderTestImpl;
import org.schabi.newpipe.extractor.NewPipe;
import javax.annotation.Nonnull;
import java.io.IOException;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
class YoutubeSignaturesTest {
@BeforeEach
void setUp() throws IOException {
NewPipe.init(DownloaderTestImpl.getInstance());
YoutubeTestsUtils.ensureStateless();
}
@ValueSource(strings = {
"QzUGs1qRTEI",
""
})
@ParameterizedTest
void testSignatureTimestampExtraction(@Nonnull final String videoId) throws Exception {
final Integer signatureTimestamp =
YoutubeJavaScriptPlayerManager.getSignatureTimestamp(videoId);
assertTrue(signatureTimestamp > 0, "signatureTimestamp is <= 0");
}
/*
The first column of the CSV entries is a video ID
The second one of these entries are not real signatures, but as the deobfuscation function
manipulates strings, we can use random characters combined as strings to test the extraction
and the execution of the function
*/
@CsvSource(value = {
"QzUGs1qRTEI,5QjJrWzVcOutYYNyxkDJVkzQDZQxNbbxGi4hRoh2h4PomQMQq9vo2WPHVpHgxRn7qT3WyhRiJa1k1t1DL3lynZtupHmG3wW4qh59faKjtY4UVu",
",7vIK4hG6NbcIEQP4ZIRjonOzuPHh7wTrEgBdEMYyfE4F5Pq0FiGdv04kptb587c8aToH345ETJ8dMbXnpOmjanP3nzgJ0iNg8oHIm8oeQODPSP"
})
@ParameterizedTest
void testSignatureDeobfuscation(@Nonnull final String videoId,
@Nonnull final String sampleString) throws Exception {
// As the signature deobfuscation changes frequently with player versions, we can only test
// that we get a different string than the original one
assertNotEquals(sampleString,
YoutubeJavaScriptPlayerManager.deobfuscateSignature(videoId, sampleString));
}
}

View File

@ -3,7 +3,6 @@ package org.schabi.newpipe.extractor.services.youtube;
import org.schabi.newpipe.extractor.ExtractorAsserts;
import org.schabi.newpipe.extractor.Image;
import org.schabi.newpipe.extractor.services.DefaultTests;
import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor;
import javax.annotation.Nullable;
import java.util.Collection;
@ -29,7 +28,7 @@ public final class YoutubeTestsUtils {
YoutubeParsingHelper.setConsentAccepted(false);
YoutubeParsingHelper.resetClientVersionAndKey();
YoutubeParsingHelper.setNumberGenerator(new Random(1));
YoutubeStreamExtractor.resetDeobfuscationCode();
YoutubeJavaScriptPlayerManager.clearAllCaches();
}
/**

View File

@ -1,56 +0,0 @@
package org.schabi.newpipe.extractor.services.youtube;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.fail;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mozilla.javascript.EvaluatorException;
import org.schabi.newpipe.downloader.DownloaderTestImpl;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
import java.io.IOException;
class YoutubeThrottlingDecrypterTest {
@BeforeEach
public void setup() throws IOException {
NewPipe.init(DownloaderTestImpl.getInstance());
}
@Test
void testExtractFunction__success() throws ParsingException {
final String[] videoIds = {"jE1USQrs1rw", "CqxjzfudGAc", "goH-9MfQI7w", "KYIdr_7H5Yw", "J1WeqmGbYeI"};
final String encryptedUrl = "https://r6---sn-4g5ednek.googlevideo.com/videoplayback?expire=1626562120&ei=6AnzYO_YBpql1gLGkb_IBQ&ip=127.0.0.1&id=o-ANhBEf36Z5h-8U9DDddtPDqtS0ZNwf0XJAAigudKI2uI&itag=278&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278&source=youtube&requiressl=yes&vprv=1&mime=video%2Fwebm&ns=TvecOReN0vPuXb3j_zq157IG&gir=yes&clen=2915100&dur=270.203&lmt=1608157174907785&keepalive=yes&fexp=24001373,24007246&c=WEB&txp=5535432&n=N9BWSTFT7vvBJrvQ&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&alr=yes&sig=AOq0QJ8wRQIgW6XnUDKPDSxiT0_KE_tDDMpcaCJl2Un5p0Fu9qZNQGkCIQDWxsDHi_s2BEmRqIbd1C5g_gzfihB7RZLsScKWNMwzzA%3D%3D&cpn=9r2yt3BqcYmeb2Yu&cver=2.20210716.00.00&redirect_counter=1&cm2rm=sn-4g5ezy7s&cms_redirect=yes&mh=Y5&mm=34&mn=sn-4g5ednek&ms=ltu&mt=1626540524&mv=m&mvi=6&pl=43&lsparams=mh,mm,mn,ms,mv,mvi,pl&lsig=AG3C_xAwRQIhAIUzxTn9Vw1-vm-_7OQ5-0h1M6AZsY9Bx1FlCCTeMICzAiADtGggbn4Znsrh2EnvyOsGnYdRGcbxn4mW9JMOQiInDQ%3D%3D&range=259165-480735&rn=11&rbuf=20190";
for (final String videoId : videoIds) {
try {
final String decryptedUrl = YoutubeThrottlingDecrypter.apply(encryptedUrl, videoId);
assertNotEquals(encryptedUrl, decryptedUrl);
} catch (final EvaluatorException e) {
fail("Failed to extract n param decrypt function for video " + videoId + "\n" + e);
}
}
}
@Test
void testDecode__success() throws ParsingException {
// URL extracted from browser with the dev tools
final String encryptedUrl = "https://r6---sn-4g5ednek.googlevideo.com/videoplayback?expire=1626562120&ei=6AnzYO_YBpql1gLGkb_IBQ&ip=127.0.0.1&id=o-ANhBEf36Z5h-8U9DDddtPDqtS0ZNwf0XJAAigudKI2uI&itag=278&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C248%2C278&source=youtube&requiressl=yes&vprv=1&mime=video%2Fwebm&ns=TvecOReN0vPuXb3j_zq157IG&gir=yes&clen=2915100&dur=270.203&lmt=1608157174907785&keepalive=yes&fexp=24001373,24007246&c=WEB&txp=5535432&n=N9BWSTFT7vvBJrvQ&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&alr=yes&sig=AOq0QJ8wRQIgW6XnUDKPDSxiT0_KE_tDDMpcaCJl2Un5p0Fu9qZNQGkCIQDWxsDHi_s2BEmRqIbd1C5g_gzfihB7RZLsScKWNMwzzA%3D%3D&cpn=9r2yt3BqcYmeb2Yu&cver=2.20210716.00.00&redirect_counter=1&cm2rm=sn-4g5ezy7s&cms_redirect=yes&mh=Y5&mm=34&mn=sn-4g5ednek&ms=ltu&mt=1626540524&mv=m&mvi=6&pl=43&lsparams=mh,mm,mn,ms,mv,mvi,pl&lsig=AG3C_xAwRQIhAIUzxTn9Vw1-vm-_7OQ5-0h1M6AZsY9Bx1FlCCTeMICzAiADtGggbn4Znsrh2EnvyOsGnYdRGcbxn4mW9JMOQiInDQ%3D%3D&range=259165-480735&rn=11&rbuf=20190";
final String decryptedUrl = YoutubeThrottlingDecrypter.apply(encryptedUrl, "jE1USQrs1rw");
// The cipher function changes over time, so we just check if the n param changed.
assertNotEquals(encryptedUrl, decryptedUrl);
}
@Test
void testDecode__noNParam__success() throws ParsingException {
final String noNParamUrl = "https://r5---sn-4g5ednsz.googlevideo.com/videoplayback?expire=1626553257&ei=SefyYPmIFoKT1wLtqbjgCQ&ip=127.0.0.1&id=o-AIT5xGifsaEAdEOAb5vd06J9VNtm-KHHolnaZRGPjHZi&itag=140&source=youtube&requiressl=yes&mh=xO&mm=31%2C29&mn=sn-4g5ednsz%2Csn-4g5e6nsr&ms=au%2Crdu&mv=m&mvi=5&pl=24&initcwndbps=1322500&vprv=1&mime=audio%2Fmp4&ns=cA2SS5atEe0mH8tMwGTO4RIG&gir=yes&clen=3009275&dur=185.898&lmt=1626356984653961&mt=1626531173&fvip=5&keepalive=yes&fexp=24001373%2C24007246&beids=23886212&c=WEB&txp=6411222&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAPueRlTutSlzPafxrqBmgZz5m7-Zfbw3QweDp3j4XO9SAiEA5tF7_ZCJFKmS-D6I1jlUURjpjoiTbsYyKuarV4u6E8Y%3D&sig=AOq0QJ8wRQIgRD_4WwkPeTEKGVSQqPsznMJGqq4nVJ8o1ChGBCgi4Y0CIQCZT3tI40YLKBWJCh2Q7AlvuUIpN0ficzdSElLeQpJdrw==";
final String decrypted = YoutubeThrottlingDecrypter.apply(noNParamUrl, "jE1USQrs1rw");
assertEquals(noNParamUrl, decrypted);
}
}

View File

@ -0,0 +1,63 @@
package org.schabi.newpipe.extractor.services.youtube;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.fail;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.schabi.newpipe.downloader.DownloaderTestImpl;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.exceptions.ParsingException;
import java.io.IOException;
class YoutubeThrottlingParameterDeobfuscationTest {
@BeforeEach
void setup() throws IOException {
NewPipe.init(DownloaderTestImpl.getInstance());
YoutubeTestsUtils.ensureStateless();
}
@Test
void testExtractFunction__success() {
final String[] videoIds = {"jE1USQrs1rw", "CqxjzfudGAc", "goH-9MfQI7w", "KYIdr_7H5Yw", "J1WeqmGbYeI"};
final String obfuscatedUrl = "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";
for (final String videoId : videoIds) {
try {
final String deobfuscatedUrl =
YoutubeJavaScriptPlayerManager.getUrlWithThrottlingParameterDeobfuscated(
videoId, obfuscatedUrl);
assertNotEquals(obfuscatedUrl, deobfuscatedUrl);
} catch (final Exception e) {
fail("Failed to extract throttling parameter deobfuscation function or run its code for video "
+ videoId, e);
}
}
}
@Test
void testDecode__success() throws ParsingException {
// URL extracted from browser with the developer tools
final String obfuscatedUrl = "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 deobfuscatedUrl =
YoutubeJavaScriptPlayerManager.getUrlWithThrottlingParameterDeobfuscated(
"jE1USQrs1rw", obfuscatedUrl);
// The deobfuscation function changes over time, so we just check if the corresponding
// parameter changed
assertNotEquals(obfuscatedUrl, deobfuscatedUrl);
}
@Test
void testDecode__noThrottlingParam__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 deobfuscatedUrl =
YoutubeJavaScriptPlayerManager.getUrlWithThrottlingParameterDeobfuscated(
"jE1USQrs1rw", noNParamUrl);
assertEquals(noNParamUrl, deobfuscatedUrl);
}
}

View File

@ -22,6 +22,9 @@
"cache-control": [
"private, max-age\u003d0"
],
"content-security-policy-report-only": [
"require-trusted-types-for \u0027script\u0027;report-uri /cspreport"
],
"content-type": [
"text/javascript; charset\u003dutf-8"
],
@ -32,10 +35,10 @@
"cross-origin"
],
"date": [
"Sun, 06 Aug 2023 10:32:04 GMT"
"Thu, 21 Sep 2023 15:02:44 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:04 GMT"
"Thu, 21 Sep 2023 15:02:44 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -53,9 +56,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003dThBsKXQrbBc; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003dzk2V4bAa_a0; Domain\u003d.youtube.com; Expires\u003dFri, 02-Feb-2024 10:32:04 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+044; expires\u003dTue, 05-Aug-2025 10:32:04 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003dl3FN8yFGp14; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003dXNrsY8W6jbU; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:02:44 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:02:44 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+992; expires\u003dSat, 20-Sep-2025 15:02:44 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"
@ -70,7 +74,7 @@
"0"
]
},
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/f98908d1\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/019a2dc2\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"latestUrl": "https://www.youtube.com/iframe_api"
}
}

View File

@ -3,10 +3,10 @@
"httpMethod": "GET",
"url": "https://www.youtube.com/sw.js",
"headers": {
"Origin": [
"Referer": [
"https://www.youtube.com"
],
"Referer": [
"Origin": [
"https://www.youtube.com"
],
"Accept-Language": [
@ -37,14 +37,14 @@
"content-type": [
"text/javascript; charset\u003dutf-8"
],
"cross-origin-opener-policy": [
"cross-origin-opener-policy-report-only": [
"same-origin; report-to\u003d\"youtube_main\""
],
"date": [
"Sun, 06 Aug 2023 10:32:05 GMT"
"Thu, 21 Sep 2023 15:02:44 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:05 GMT"
"Thu, 21 Sep 2023 15:02:44 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -62,9 +62,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003d_ePI2e04vBk; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dMon, 09-Nov-2020 10:32:05 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+880; expires\u003dTue, 05-Aug-2025 10:32:05 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003dcx01SyaoKlE; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dFri, 25-Dec-2020 15:02:44 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:02:44 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+977; expires\u003dSat, 20-Sep-2025 15:02:44 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"

View File

@ -35,10 +35,10 @@
"cross-origin"
],
"date": [
"Sun, 06 Aug 2023 10:32:08 GMT"
"Thu, 21 Sep 2023 15:02:50 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:08 GMT"
"Thu, 21 Sep 2023 15:02:50 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -56,9 +56,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003dCggYGhnFpn4; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003dfOZz-Hcsa8I; Domain\u003d.youtube.com; Expires\u003dFri, 02-Feb-2024 10:32:08 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+353; expires\u003dTue, 05-Aug-2025 10:32:08 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003dtPcaXeLL38s; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d4-geGwtkYIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:02:50 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:02:50 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+061; expires\u003dSat, 20-Sep-2025 15:02:50 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"
@ -73,7 +74,7 @@
"0"
]
},
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/f98908d1\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/019a2dc2\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"latestUrl": "https://www.youtube.com/iframe_api"
}
}

View File

@ -3,10 +3,10 @@
"httpMethod": "GET",
"url": "https://www.youtube.com/sw.js",
"headers": {
"Origin": [
"Referer": [
"https://www.youtube.com"
],
"Referer": [
"Origin": [
"https://www.youtube.com"
],
"Accept-Language": [
@ -37,14 +37,14 @@
"content-type": [
"text/javascript; charset\u003dutf-8"
],
"cross-origin-opener-policy-report-only": [
"cross-origin-opener-policy": [
"same-origin; report-to\u003d\"youtube_main\""
],
"date": [
"Sun, 06 Aug 2023 10:32:09 GMT"
"Thu, 21 Sep 2023 15:02:50 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:09 GMT"
"Thu, 21 Sep 2023 15:02:50 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -62,9 +62,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003dvgdx37Cw0dc; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dMon, 09-Nov-2020 10:32:09 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+825; expires\u003dTue, 05-Aug-2025 10:32:09 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003dbMjNX2rRSzs; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dFri, 25-Dec-2020 15:02:50 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:02:50 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+682; expires\u003dSat, 20-Sep-2025 15:02:50 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"

View File

@ -32,10 +32,10 @@
"cross-origin"
],
"date": [
"Sun, 06 Aug 2023 10:32:10 GMT"
"Thu, 21 Sep 2023 15:02:51 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:10 GMT"
"Thu, 21 Sep 2023 15:02:51 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -53,9 +53,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003duEdrAwFTcyI; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d3V0RFPcVfVU; Domain\u003d.youtube.com; Expires\u003dFri, 02-Feb-2024 10:32:10 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+869; expires\u003dTue, 05-Aug-2025 10:32:10 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003drV2V9xKPn2g; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003dyArlko_MaYE; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:02:51 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:02:51 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+549; expires\u003dSat, 20-Sep-2025 15:02:51 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"
@ -70,7 +71,7 @@
"0"
]
},
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/f98908d1\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/019a2dc2\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"latestUrl": "https://www.youtube.com/iframe_api"
}
}

View File

@ -3,10 +3,10 @@
"httpMethod": "GET",
"url": "https://www.youtube.com/sw.js",
"headers": {
"Origin": [
"Referer": [
"https://www.youtube.com"
],
"Referer": [
"Origin": [
"https://www.youtube.com"
],
"Accept-Language": [
@ -34,6 +34,9 @@
"cache-control": [
"private, max-age\u003d0"
],
"content-security-policy-report-only": [
"require-trusted-types-for \u0027script\u0027;report-uri /cspreport"
],
"content-type": [
"text/javascript; charset\u003dutf-8"
],
@ -41,10 +44,10 @@
"same-origin; report-to\u003d\"youtube_main\""
],
"date": [
"Sun, 06 Aug 2023 10:32:10 GMT"
"Thu, 21 Sep 2023 15:02:52 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:10 GMT"
"Thu, 21 Sep 2023 15:02:52 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -62,10 +65,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003dRA_2BSOXx_o; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dMon, 09-Nov-2020 10:32:10 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJJVBIA; Domain\u003d.youtube.com; Expires\u003dFri, 02-Feb-2024 10:32:10 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+267; expires\u003dTue, 05-Aug-2025 10:32:10 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003dJo4YW5r-esI; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dFri, 25-Dec-2020 15:02:52 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:02:52 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+222; expires\u003dSat, 20-Sep-2025 15:02:52 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"

View File

@ -32,10 +32,10 @@
"cross-origin"
],
"date": [
"Sun, 06 Aug 2023 10:32:06 GMT"
"Thu, 21 Sep 2023 15:02:47 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:06 GMT"
"Thu, 21 Sep 2023 15:02:47 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -53,9 +53,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003dpk8W8YRvNWQ; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003dHVLf-D_fjFE; Domain\u003d.youtube.com; Expires\u003dFri, 02-Feb-2024 10:32:06 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+289; expires\u003dTue, 05-Aug-2025 10:32:06 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003dvmo8Wx0OeEs; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d2JAfh7G6b1I; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:02:47 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:02:47 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+093; expires\u003dSat, 20-Sep-2025 15:02:47 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"
@ -70,7 +71,7 @@
"0"
]
},
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/f98908d1\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/019a2dc2\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"latestUrl": "https://www.youtube.com/iframe_api"
}
}

View File

@ -3,10 +3,10 @@
"httpMethod": "GET",
"url": "https://www.youtube.com/sw.js",
"headers": {
"Origin": [
"Referer": [
"https://www.youtube.com"
],
"Referer": [
"Origin": [
"https://www.youtube.com"
],
"Accept-Language": [
@ -41,10 +41,10 @@
"same-origin; report-to\u003d\"youtube_main\""
],
"date": [
"Sun, 06 Aug 2023 10:32:07 GMT"
"Thu, 21 Sep 2023 15:02:47 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:07 GMT"
"Thu, 21 Sep 2023 15:02:47 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -62,9 +62,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003dnxQodgimc88; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dMon, 09-Nov-2020 10:32:07 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+181; expires\u003dTue, 05-Aug-2025 10:32:07 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003dNE-cfmRV9JA; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dFri, 25-Dec-2020 15:02:47 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:02:47 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+210; expires\u003dSat, 20-Sep-2025 15:02:47 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"

View File

@ -35,10 +35,10 @@
"cross-origin"
],
"date": [
"Sun, 06 Aug 2023 10:32:25 GMT"
"Thu, 21 Sep 2023 15:03:10 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:25 GMT"
"Thu, 21 Sep 2023 15:03:10 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -56,9 +56,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003dzCoL9PvOWY8; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003drrI-GjWag4E; Domain\u003d.youtube.com; Expires\u003dFri, 02-Feb-2024 10:32:25 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+810; expires\u003dTue, 05-Aug-2025 10:32:25 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003d5oFqaVC5dFc; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003dn5sSPpdVLNI; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:03:10 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:03:10 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+614; expires\u003dSat, 20-Sep-2025 15:03:10 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"
@ -73,7 +74,7 @@
"0"
]
},
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/f98908d1\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/019a2dc2\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"latestUrl": "https://www.youtube.com/iframe_api"
}
}

View File

@ -3,10 +3,10 @@
"httpMethod": "GET",
"url": "https://www.youtube.com/sw.js",
"headers": {
"Origin": [
"Referer": [
"https://www.youtube.com"
],
"Referer": [
"Origin": [
"https://www.youtube.com"
],
"Accept-Language": [
@ -34,9 +34,6 @@
"cache-control": [
"private, max-age\u003d0"
],
"content-security-policy-report-only": [
"require-trusted-types-for \u0027script\u0027;report-uri /cspreport"
],
"content-type": [
"text/javascript; charset\u003dutf-8"
],
@ -44,10 +41,10 @@
"same-origin; report-to\u003d\"youtube_main\""
],
"date": [
"Sun, 06 Aug 2023 10:32:25 GMT"
"Thu, 21 Sep 2023 15:03:10 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:25 GMT"
"Thu, 21 Sep 2023 15:03:10 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -65,9 +62,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003dlb9SLNDrA2A; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dMon, 09-Nov-2020 10:32:25 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+325; expires\u003dTue, 05-Aug-2025 10:32:25 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003duO27SaYfj5M; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dFri, 25-Dec-2020 15:03:10 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:03:10 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+059; expires\u003dSat, 20-Sep-2025 15:03:10 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"

View File

@ -23,7 +23,7 @@
"private, max-age\u003d0"
],
"content-security-policy-report-only": [
"base-uri \u0027self\u0027;default-src \u0027self\u0027 https: blob:;font-src https: data:;img-src https: data: android-webview-video-poster:;media-src blob: https:;object-src \u0027none\u0027;script-src \u0027nonce-1MlJVCB9LOEgUPp23ay00A\u0027 \u0027unsafe-inline\u0027 \u0027strict-dynamic\u0027 https: http: \u0027unsafe-eval\u0027;style-src https: \u0027unsafe-inline\u0027;report-uri /cspreport"
"require-trusted-types-for \u0027script\u0027;report-uri /cspreport"
],
"content-type": [
"text/javascript; charset\u003dutf-8"
@ -35,10 +35,10 @@
"cross-origin"
],
"date": [
"Sun, 06 Aug 2023 10:32:15 GMT"
"Thu, 21 Sep 2023 15:02:58 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:15 GMT"
"Thu, 21 Sep 2023 15:02:58 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -56,9 +56,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003dzCHVXTCKSxc; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d5_IoyB8Wv5c; Domain\u003d.youtube.com; Expires\u003dFri, 02-Feb-2024 10:32:15 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+432; expires\u003dTue, 05-Aug-2025 10:32:15 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003dWYLtZ40Oi3A; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d7AefgLLDwV8; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:02:58 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:02:58 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+423; expires\u003dSat, 20-Sep-2025 15:02:58 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"
@ -73,7 +74,7 @@
"0"
]
},
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/f98908d1\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/019a2dc2\\/www-widgetapi.vflset\\/www-widgetapi.js\u0027;window[\u0027yt_embedsEnableIframeWithLazyLoad\u0027] \u003d true ;try{var ttPolicy\u003dwindow.trustedTypes.createPolicy(\"youtube-widget-api\",{createScriptURL:function(x){return x}});scriptUrl\u003dttPolicy.createScriptURL(scriptUrl)}catch(e){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"latestUrl": "https://www.youtube.com/iframe_api"
}
}

View File

@ -3,10 +3,10 @@
"httpMethod": "GET",
"url": "https://www.youtube.com/sw.js",
"headers": {
"Origin": [
"Referer": [
"https://www.youtube.com"
],
"Referer": [
"Origin": [
"https://www.youtube.com"
],
"Accept-Language": [
@ -41,10 +41,10 @@
"same-origin; report-to\u003d\"youtube_main\""
],
"date": [
"Sun, 06 Aug 2023 10:32:15 GMT"
"Thu, 21 Sep 2023 15:02:58 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:15 GMT"
"Thu, 21 Sep 2023 15:02:58 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -62,9 +62,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003do5uQ1Dr5bfg; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dMon, 09-Nov-2020 10:32:15 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+554; expires\u003dTue, 05-Aug-2025 10:32:15 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003d_U4C2r2RtSY; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dFri, 25-Dec-2020 15:02:58 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:02:58 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+109; expires\u003dSat, 20-Sep-2025 15:02:58 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"

View File

@ -23,7 +23,6 @@
"private, max-age\u003d0"
],
"content-security-policy-report-only": [
"base-uri \u0027self\u0027;default-src \u0027self\u0027 https: blob:;font-src https: data:;img-src https: data: android-webview-video-poster:;media-src blob: https:;object-src \u0027none\u0027;script-src \u0027nonce-M4N_SAF_pGn2ZCy2HLUBTA\u0027 \u0027unsafe-inline\u0027 \u0027strict-dynamic\u0027 https: http: \u0027unsafe-eval\u0027;style-src https: \u0027unsafe-inline\u0027;report-uri /cspreport",
"require-trusted-types-for \u0027script\u0027;report-uri /cspreport"
],
"content-type": [
@ -36,10 +35,10 @@
"cross-origin"
],
"date": [
"Sun, 06 Aug 2023 10:32:17 GMT"
"Thu, 21 Sep 2023 15:03:00 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:17 GMT"
"Thu, 21 Sep 2023 15:03:00 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -57,9 +56,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003dAFZJpg1m2B0; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003du_E_C_pix_M; Domain\u003d.youtube.com; Expires\u003dFri, 02-Feb-2024 10:32:17 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+421; expires\u003dTue, 05-Aug-2025 10:32:17 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003duqgvDThAHAs; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003dMuDn0deOavA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:03:00 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:03:00 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+748; expires\u003dSat, 20-Sep-2025 15:03:00 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"
@ -74,7 +74,7 @@
"0"
]
},
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/f98908d1\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/f130aa11\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"latestUrl": "https://www.youtube.com/iframe_api"
}
}

View File

@ -3,17 +3,17 @@
"httpMethod": "POST",
"url": "https://www.youtube.com/youtubei/v1/player?key\u003dAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8\u0026prettyPrint\u003dfalse",
"headers": {
"Origin": [
"Referer": [
"https://www.youtube.com"
],
"Referer": [
"Origin": [
"https://www.youtube.com"
],
"Cookie": [
"CONSENT\u003dPENDING+264"
],
"X-YouTube-Client-Version": [
"2.20230804.01.00"
"2.20230920.00.00"
],
"X-YouTube-Client-Name": [
"1"
@ -196,13 +196,11 @@
112,
34,
58,
34,
49,
57,
53,
55,
49,
34,
54,
50,
48,
125,
125,
44,
@ -528,7 +526,7 @@
"application/json; charset\u003dUTF-8"
],
"date": [
"Sun, 06 Aug 2023 10:32:20 GMT"
"Thu, 21 Sep 2023 15:03:02 GMT"
],
"server": [
"scaffolding on HTTPServer2"
@ -548,7 +546,7 @@
"0"
]
},
"responseBody": "{\"responseContext\":{\"visitorData\":\"Cgs2NkdkbU5odHMtYyi07b2mBg%3D%3D\"},\"playabilityStatus\":{\"status\":\"UNPLAYABLE\",\"reason\":\"This video is unavailable\",\"messages\":[\"This is a private video. Please sign in to verify that you may see it.\"]},\"trackingParams\":\"CAAQu2kiEwiP5Jio6seAAxWNyBEIHSShBZE\u003d\"}",
"responseBody": "{\"responseContext\":{\"visitorData\":\"CgtRejZyLVFLSGp6WSimtrGoBjIGCgJGUhIA\",\"maxAgeSeconds\":0},\"playabilityStatus\":{\"status\":\"UNPLAYABLE\",\"reason\":\"This video is unavailable\",\"messages\":[\"This is a private video. Please sign in to verify that you may see it.\"]},\"trackingParams\":\"CAAQu2kiEwj62c_O_LuBAxXBMEwKHRDpA1M\u003d\"}",
"latestUrl": "https://www.youtube.com/youtubei/v1/player?key\u003dAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8\u0026prettyPrint\u003dfalse"
}
}

View File

@ -3,17 +3,17 @@
"httpMethod": "POST",
"url": "https://www.youtube.com/youtubei/v1/player?key\u003dAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8\u0026prettyPrint\u003dfalse",
"headers": {
"Origin": [
"Referer": [
"https://www.youtube.com"
],
"Referer": [
"Origin": [
"https://www.youtube.com"
],
"Cookie": [
"CONSENT\u003dPENDING+977"
],
"X-YouTube-Client-Version": [
"2.20230804.01.00"
"2.20230920.00.00"
],
"X-YouTube-Client-Name": [
"1"
@ -196,13 +196,11 @@
112,
34,
58,
34,
49,
57,
53,
55,
49,
34,
54,
50,
48,
125,
125,
44,
@ -528,7 +526,7 @@
"application/json; charset\u003dUTF-8"
],
"date": [
"Sun, 06 Aug 2023 10:32:20 GMT"
"Thu, 21 Sep 2023 15:03:02 GMT"
],
"server": [
"scaffolding on HTTPServer2"
@ -548,7 +546,7 @@
"0"
]
},
"responseBody": "{\"responseContext\":{\"visitorData\":\"CgtIYUtzdDd1d1NhYyi07b2mBg%3D%3D\"},\"playabilityStatus\":{\"status\":\"ERROR\",\"reason\":\"This video is unavailable\"},\"trackingParams\":\"CAAQu2kiEwjs1qGo6seAAxVJulUKHXGlAXk\u003d\"}",
"responseBody": "{\"responseContext\":{\"visitorData\":\"CgtCb2RiMXg5S0xfRSimtrGoBjIGCgJGUhIA\",\"maxAgeSeconds\":0},\"playabilityStatus\":{\"status\":\"ERROR\",\"reason\":\"This video is unavailable\"},\"trackingParams\":\"CAAQu2kiEwiJ99jO_LuBAxVfbU8EHS6_DLg\u003d\"}",
"latestUrl": "https://www.youtube.com/youtubei/v1/player?key\u003dAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8\u0026prettyPrint\u003dfalse"
}
}

View File

@ -3,17 +3,17 @@
"httpMethod": "POST",
"url": "https://www.youtube.com/youtubei/v1/player?key\u003dAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8\u0026prettyPrint\u003dfalse",
"headers": {
"Origin": [
"Referer": [
"https://www.youtube.com"
],
"Referer": [
"Origin": [
"https://www.youtube.com"
],
"Cookie": [
"CONSENT\u003dPENDING+302"
],
"X-YouTube-Client-Version": [
"2.20230804.01.00"
"2.20230920.00.00"
],
"X-YouTube-Client-Name": [
"1"
@ -196,13 +196,11 @@
112,
34,
58,
34,
49,
57,
53,
55,
49,
34,
54,
50,
48,
125,
125,
44,
@ -528,7 +526,7 @@
"application/json; charset\u003dUTF-8"
],
"date": [
"Sun, 06 Aug 2023 10:32:20 GMT"
"Thu, 21 Sep 2023 15:03:02 GMT"
],
"server": [
"scaffolding on HTTPServer2"
@ -548,7 +546,7 @@
"0"
]
},
"responseBody": "{\"responseContext\":{\"visitorData\":\"CgtoMHluNGZsbk9Wayi07b2mBg%3D%3D\",\"maxAgeSeconds\":0},\"playabilityStatus\":{\"status\":\"UNPLAYABLE\",\"reason\":\"The uploader has not made this video available in your country\"},\"videoDetails\":{\"videoId\":\"_PL2HJKxnOM\",\"title\":\"SNL Introduces Jim Carrey as Joe Biden | Saturday Night Live\",\"lengthSeconds\":\"115\",\"channelId\":\"UCkiP0kvvwqUWlttRLCq88gw\",\"isOwnerViewing\":false,\"shortDescription\":\"Season 46 of SNL premiers with Jim Carrey playing Joe Biden for the rest of the 2020 election.\\n\\nWatch full SNL episodes and sketches on the Global TV App or at: https://www.globaltv.com/shows/saturday-night-live/\",\"isCrawlable\":false,\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/_PL2HJKxnOM/default.jpg\",\"width\":120,\"height\":90},{\"url\":\"https://i.ytimg.com/vi/_PL2HJKxnOM/mqdefault.jpg\",\"width\":320,\"height\":180},{\"url\":\"https://i.ytimg.com/vi/_PL2HJKxnOM/hqdefault.jpg\",\"width\":480,\"height\":360},{\"url\":\"https://i.ytimg.com/vi/_PL2HJKxnOM/sddefault.jpg\",\"width\":640,\"height\":480},{\"url\":\"https://i.ytimg.com/vi/_PL2HJKxnOM/maxresdefault.jpg\",\"width\":1920,\"height\":1080}]},\"allowRatings\":true,\"viewCount\":\"395902\",\"author\":\"Global TV\",\"isPrivate\":false,\"isUnpluggedCorpus\":false,\"isLiveContent\":false},\"trackingParams\":\"CAAQu2kiEwipqq6o6seAAxXTRHoFHUqNCXs\u003d\",\"adBreakHeartbeatParams\":\"Q0FBJTNE\"}",
"responseBody": "{\"responseContext\":{\"visitorData\":\"CgtfaFBUS1U2QkJmYyimtrGoBjIGCgJGUhIA\",\"maxAgeSeconds\":0},\"playabilityStatus\":{\"status\":\"UNPLAYABLE\",\"reason\":\"The uploader has not made this video available in your country\"},\"videoDetails\":{\"videoId\":\"_PL2HJKxnOM\",\"title\":\"SNL Introduces Jim Carrey as Joe Biden | Saturday Night Live\",\"lengthSeconds\":\"115\",\"channelId\":\"UCkiP0kvvwqUWlttRLCq88gw\",\"isOwnerViewing\":false,\"shortDescription\":\"Season 46 of SNL premiers with Jim Carrey playing Joe Biden for the rest of the 2020 election.\\n\\nWatch full SNL episodes and sketches on the Global TV App or at: https://www.globaltv.com/shows/saturday-night-live/\",\"isCrawlable\":false,\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/_PL2HJKxnOM/default.jpg\",\"width\":120,\"height\":90},{\"url\":\"https://i.ytimg.com/vi/_PL2HJKxnOM/mqdefault.jpg\",\"width\":320,\"height\":180},{\"url\":\"https://i.ytimg.com/vi/_PL2HJKxnOM/hqdefault.jpg\",\"width\":480,\"height\":360},{\"url\":\"https://i.ytimg.com/vi/_PL2HJKxnOM/sddefault.jpg\",\"width\":640,\"height\":480},{\"url\":\"https://i.ytimg.com/vi/_PL2HJKxnOM/maxresdefault.jpg\",\"width\":1920,\"height\":1080}]},\"allowRatings\":true,\"viewCount\":\"395905\",\"author\":\"Global TV\",\"isPrivate\":false,\"isUnpluggedCorpus\":false,\"isLiveContent\":false},\"trackingParams\":\"CAAQu2kiEwjUs-XO_LuBAxUiGfEFHdGGAb0\u003d\",\"adBreakHeartbeatParams\":\"Q0FBJTNE\"}",
"latestUrl": "https://www.youtube.com/youtubei/v1/player?key\u003dAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8\u0026prettyPrint\u003dfalse"
}
}

View File

@ -3,10 +3,10 @@
"httpMethod": "GET",
"url": "https://www.youtube.com/sw.js",
"headers": {
"Origin": [
"Referer": [
"https://www.youtube.com"
],
"Referer": [
"Origin": [
"https://www.youtube.com"
],
"Accept-Language": [
@ -37,14 +37,14 @@
"content-type": [
"text/javascript; charset\u003dutf-8"
],
"cross-origin-opener-policy": [
"cross-origin-opener-policy-report-only": [
"same-origin; report-to\u003d\"youtube_main\""
],
"date": [
"Sun, 06 Aug 2023 10:32:17 GMT"
"Thu, 21 Sep 2023 15:03:01 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:17 GMT"
"Thu, 21 Sep 2023 15:03:01 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -62,9 +62,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003dvyTtas-9gN4; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dMon, 09-Nov-2020 10:32:17 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+363; expires\u003dTue, 05-Aug-2025 10:32:17 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003dYTkHcZAMlUY; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dFri, 25-Dec-2020 15:03:01 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:03:01 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+324; expires\u003dSat, 20-Sep-2025 15:03:01 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"

View File

@ -3,17 +3,17 @@
"httpMethod": "POST",
"url": "https://www.youtube.com/youtubei/v1/player?key\u003dAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8\u0026prettyPrint\u003dfalse",
"headers": {
"Origin": [
"Referer": [
"https://www.youtube.com"
],
"Referer": [
"Origin": [
"https://www.youtube.com"
],
"Cookie": [
"CONSENT\u003dPENDING+663"
],
"X-YouTube-Client-Version": [
"2.20230804.01.00"
"2.20230920.00.00"
],
"X-YouTube-Client-Name": [
"1"
@ -196,13 +196,11 @@
112,
34,
58,
34,
49,
57,
53,
55,
49,
34,
54,
50,
48,
125,
125,
44,
@ -528,7 +526,7 @@
"application/json; charset\u003dUTF-8"
],
"date": [
"Sun, 06 Aug 2023 10:32:18 GMT"
"Thu, 21 Sep 2023 15:03:01 GMT"
],
"server": [
"scaffolding on HTTPServer2"
@ -548,7 +546,7 @@
"0"
]
},
"responseBody": "{\"responseContext\":{\"visitorData\":\"CgtiS29yR21lUV83ayix7b2mBg%3D%3D\"},\"playabilityStatus\":{\"status\":\"ERROR\",\"reason\":\"This video is unavailable\"},\"trackingParams\":\"CAAQu2kiEwidlZWn6seAAxVTjnwKHWXaAn0\u003d\"}",
"responseBody": "{\"responseContext\":{\"visitorData\":\"CgtnMHhrRENzYy00YyiltrGoBjIGCgJGUhIA\",\"maxAgeSeconds\":0},\"playabilityStatus\":{\"status\":\"ERROR\",\"reason\":\"This video is unavailable\"},\"trackingParams\":\"CAAQu2kiEwj096PO_LuBAxU1EPEFHZa-ATA\u003d\"}",
"latestUrl": "https://www.youtube.com/youtubei/v1/player?key\u003dAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8\u0026prettyPrint\u003dfalse"
}
}

View File

@ -3,17 +3,17 @@
"httpMethod": "POST",
"url": "https://www.youtube.com/youtubei/v1/player?key\u003dAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8\u0026prettyPrint\u003dfalse",
"headers": {
"Origin": [
"Referer": [
"https://www.youtube.com"
],
"Referer": [
"Origin": [
"https://www.youtube.com"
],
"Cookie": [
"CONSENT\u003dPENDING+465"
],
"X-YouTube-Client-Version": [
"2.20230804.01.00"
"2.20230920.00.00"
],
"X-YouTube-Client-Name": [
"1"
@ -196,13 +196,11 @@
112,
34,
58,
34,
49,
57,
53,
55,
49,
34,
54,
50,
48,
125,
125,
44,
@ -528,7 +526,7 @@
"application/json; charset\u003dUTF-8"
],
"date": [
"Sun, 06 Aug 2023 10:32:18 GMT"
"Thu, 21 Sep 2023 15:03:01 GMT"
],
"server": [
"scaffolding on HTTPServer2"
@ -548,7 +546,7 @@
"0"
]
},
"responseBody": "{\"responseContext\":{\"visitorData\":\"Cgt6S19TWmRQaVN6QSiy7b2mBg%3D%3D\"},\"playabilityStatus\":{\"status\":\"UNPLAYABLE\",\"reason\":\"This video is available to this channel\u0027s members on level: Magnificent Members (or any higher level). Join this YouTube channel from your computer or Android app.\",\"playableInEmbed\":true,\"skip\":{\"playabilityErrorSkipConfig\":{\"skipOnPlayabilityError\":false}}},\"videoDetails\":{\"videoId\":\"ayI2iBwGdxw\",\"title\":\"Behind the Scenes at EGX 2019 - Exclusive Members Video!\",\"lengthSeconds\":\"751\",\"keywords\":[\"eurogamer\",\"EGX 2019\",\"members video\",\"behind the scenes\",\"vlog\",\"IAn Higton\",\"Aoife Wilson\",\"Zoe Delahunty-light\"],\"channelId\":\"UCciKycgzURdymx-GRSY2_dA\",\"isOwnerViewing\":false,\"shortDescription\":\"Join Aoife, Zoe and Ian for an exclusive, members only behind the scenes look at an average day in a not so average setting - EGX 2019! Can you spot yourself or people you know in this little vlog? We think we recognised a few familiar faces!\\n\\nSubscribe to Eurogamer - http://www.youtube.com/subscription_center?add_user\u003deurogamer\\n\\nFor the latest video game reviews, news and analysis, check out http://www.eurogamer.net and don\u0027t forget to follow us on Twitter: http://twitter.com/eurogamer\",\"isCrawlable\":true,\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/ayI2iBwGdxw/default.jpg\",\"width\":120,\"height\":90},{\"url\":\"https://i.ytimg.com/vi/ayI2iBwGdxw/mqdefault.jpg\",\"width\":320,\"height\":180},{\"url\":\"https://i.ytimg.com/vi/ayI2iBwGdxw/hqdefault.jpg\",\"width\":480,\"height\":360},{\"url\":\"https://i.ytimg.com/vi/ayI2iBwGdxw/sddefault.jpg\",\"width\":640,\"height\":480},{\"url\":\"https://i.ytimg.com/vi/ayI2iBwGdxw/maxresdefault.jpg\",\"width\":1920,\"height\":1080}]},\"allowRatings\":true,\"viewCount\":\"567\",\"author\":\"Eurogamer\",\"isPrivate\":false,\"isUnpluggedCorpus\":false,\"isLiveContent\":false},\"trackingParams\":\"CAAQu2kiEwiaqaGn6seAAxVcXHoFHboCDGk\u003d\",\"adBreakHeartbeatParams\":\"Q0FBJTNE\"}",
"responseBody": "{\"responseContext\":{\"visitorData\":\"CgtTbGdEZjJzN0dKayiltrGoBjIGCgJGUhIA\",\"maxAgeSeconds\":0},\"playabilityStatus\":{\"status\":\"UNPLAYABLE\",\"reason\":\"This video is available to this channel\u0027s members on level: Magnificent Members (or any higher level). Join this YouTube channel from your computer or Android app.\",\"playableInEmbed\":true,\"skip\":{\"playabilityErrorSkipConfig\":{\"skipOnPlayabilityError\":false}}},\"videoDetails\":{\"videoId\":\"ayI2iBwGdxw\",\"title\":\"Behind the Scenes at EGX 2019 - Exclusive Members Video!\",\"lengthSeconds\":\"751\",\"keywords\":[\"eurogamer\",\"EGX 2019\",\"members video\",\"behind the scenes\",\"vlog\",\"IAn Higton\",\"Aoife Wilson\",\"Zoe Delahunty-light\"],\"channelId\":\"UCciKycgzURdymx-GRSY2_dA\",\"isOwnerViewing\":false,\"shortDescription\":\"Join Aoife, Zoe and Ian for an exclusive, members only behind the scenes look at an average day in a not so average setting - EGX 2019! Can you spot yourself or people you know in this little vlog? We think we recognised a few familiar faces!\\n\\nSubscribe to Eurogamer - http://www.youtube.com/subscription_center?add_user\u003deurogamer\\n\\nFor the latest video game reviews, news and analysis, check out http://www.eurogamer.net and don\u0027t forget to follow us on Twitter: http://twitter.com/eurogamer\",\"isCrawlable\":true,\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/ayI2iBwGdxw/default.jpg\",\"width\":120,\"height\":90},{\"url\":\"https://i.ytimg.com/vi/ayI2iBwGdxw/mqdefault.jpg\",\"width\":320,\"height\":180},{\"url\":\"https://i.ytimg.com/vi/ayI2iBwGdxw/hqdefault.jpg\",\"width\":480,\"height\":360},{\"url\":\"https://i.ytimg.com/vi/ayI2iBwGdxw/sddefault.jpg\",\"width\":640,\"height\":480},{\"url\":\"https://i.ytimg.com/vi/ayI2iBwGdxw/maxresdefault.jpg\",\"width\":1920,\"height\":1080}]},\"allowRatings\":true,\"viewCount\":\"571\",\"author\":\"Eurogamer\",\"isPrivate\":false,\"isUnpluggedCorpus\":false,\"isLiveContent\":false},\"trackingParams\":\"CAAQu2kiEwjIoK_O_LuBAxVkF_EFHUyIDDI\u003d\",\"adBreakHeartbeatParams\":\"Q0FBJTNE\"}",
"latestUrl": "https://www.youtube.com/youtubei/v1/player?key\u003dAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8\u0026prettyPrint\u003dfalse"
}
}

View File

@ -3,17 +3,17 @@
"httpMethod": "POST",
"url": "https://www.youtube.com/youtubei/v1/player?key\u003dAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8\u0026prettyPrint\u003dfalse",
"headers": {
"Origin": [
"Referer": [
"https://www.youtube.com"
],
"Referer": [
"Origin": [
"https://www.youtube.com"
],
"Cookie": [
"CONSENT\u003dPENDING+694"
],
"X-YouTube-Client-Version": [
"2.20230804.01.00"
"2.20230920.00.00"
],
"X-YouTube-Client-Name": [
"1"
@ -196,13 +196,11 @@
112,
34,
58,
34,
49,
57,
53,
55,
49,
34,
54,
50,
48,
125,
125,
44,
@ -528,7 +526,7 @@
"application/json; charset\u003dUTF-8"
],
"date": [
"Sun, 06 Aug 2023 10:32:19 GMT"
"Thu, 21 Sep 2023 15:03:02 GMT"
],
"server": [
"scaffolding on HTTPServer2"
@ -548,7 +546,7 @@
"0"
]
},
"responseBody": "{\"responseContext\":{\"visitorData\":\"Cgt2V2p6SXcxaVoxcyiy7b2mBg%3D%3D\"},\"playabilityStatus\":{\"status\":\"UNPLAYABLE\",\"reason\":\"This video is only available to Music Premium members\",\"playableInEmbed\":true},\"videoDetails\":{\"videoId\":\"sMJ8bRN2dak\",\"title\":\"Acquainted / Might Not (Live From The JUNOs 2016)\",\"lengthSeconds\":\"296\",\"keywords\":[\"The Weeknd\",\"ザウィークエンド\",\"ザ・ウィークエンド\",\"Belly\",\"ベリー\",\"Acquainted / Might Not\"],\"channelId\":\"UClYV6hHlupm_S_ObS1W-DYw\",\"isOwnerViewing\":false,\"shortDescription\":\"Provided to YouTube by Universal Music Group\\n\\nAcquainted / Might Not (Live From The JUNOs 2016) · The Weeknd · Belly\\n\\nAcquainted / Might Not\\n\\n℗ 2015 The Weeknd XO, Inc., Manufactured and Marketed by Republic Records, a Division of UMG Recordings, Inc.\\n\\nReleased on: 2016-05-06\\n\\nStudio Personnel, Engineer: Doug McClement\\nStudio Personnel, Mixer: Ker Friesen\\nComposer Lyricist: Abel Tesfaye\\nComposer Lyricist: Jason Quenneville\\nComposer Lyricist: Carlo Montagnese\\nComposer Lyricist: Ben Diehl\\nComposer Lyricist: Danny Schofield\\nComposer Lyricist: Ahmad Balshe\\n\\nAuto-generated by YouTube.\",\"isCrawlable\":true,\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/sMJ8bRN2dak/default.jpg\",\"width\":120,\"height\":90},{\"url\":\"https://i.ytimg.com/vi/sMJ8bRN2dak/mqdefault.jpg\",\"width\":320,\"height\":180},{\"url\":\"https://i.ytimg.com/vi/sMJ8bRN2dak/hqdefault.jpg\",\"width\":480,\"height\":360},{\"url\":\"https://i.ytimg.com/vi/sMJ8bRN2dak/sddefault.jpg\",\"width\":640,\"height\":480},{\"url\":\"https://i.ytimg.com/vi/sMJ8bRN2dak/maxresdefault.jpg\",\"width\":1920,\"height\":1080}]},\"allowRatings\":true,\"viewCount\":\"33664\",\"author\":\"The Weeknd - Topic\",\"isPrivate\":false,\"isUnpluggedCorpus\":false,\"isLiveContent\":false},\"trackingParams\":\"CAAQu2kiEwjUuLCn6seAAxWb1REIHcs9AGM\u003d\",\"adBreakHeartbeatParams\":\"Q0FBJTNE\"}",
"responseBody": "{\"responseContext\":{\"visitorData\":\"CgtrUEhWWThYcEFSNCiltrGoBjIGCgJGUhIA\",\"maxAgeSeconds\":0},\"playabilityStatus\":{\"status\":\"UNPLAYABLE\",\"reason\":\"This video is only available to Music Premium members\",\"playableInEmbed\":true},\"videoDetails\":{\"videoId\":\"sMJ8bRN2dak\",\"title\":\"Acquainted / Might Not (Live From The JUNOs 2016)\",\"lengthSeconds\":\"296\",\"keywords\":[\"The Weeknd\",\"ザウィークエンド\",\"ザ・ウィークエンド\",\"Belly\",\"ベリー\",\"Acquainted / Might Not\"],\"channelId\":\"UClYV6hHlupm_S_ObS1W-DYw\",\"isOwnerViewing\":false,\"shortDescription\":\"Provided to YouTube by Universal Music Group\\n\\nAcquainted / Might Not (Live From The JUNOs 2016) · The Weeknd · Belly\\n\\nAcquainted / Might Not\\n\\n℗ 2015 The Weeknd XO, Inc., Manufactured and Marketed by Republic Records, a Division of UMG Recordings, Inc.\\n\\nReleased on: 2016-05-06\\n\\nStudio Personnel, Engineer: Doug McClement\\nStudio Personnel, Mixer: Ker Friesen\\nComposer Lyricist: Abel Tesfaye\\nComposer Lyricist: Jason Quenneville\\nComposer Lyricist: Carlo Montagnese\\nComposer Lyricist: Ben Diehl\\nComposer Lyricist: Danny Schofield\\nComposer Lyricist: Ahmad Balshe\\n\\nAuto-generated by YouTube.\",\"isCrawlable\":true,\"thumbnail\":{\"thumbnails\":[{\"url\":\"https://i.ytimg.com/vi/sMJ8bRN2dak/default.jpg\",\"width\":120,\"height\":90},{\"url\":\"https://i.ytimg.com/vi/sMJ8bRN2dak/mqdefault.jpg\",\"width\":320,\"height\":180},{\"url\":\"https://i.ytimg.com/vi/sMJ8bRN2dak/hqdefault.jpg\",\"width\":480,\"height\":360},{\"url\":\"https://i.ytimg.com/vi/sMJ8bRN2dak/sddefault.jpg\",\"width\":640,\"height\":480},{\"url\":\"https://i.ytimg.com/vi/sMJ8bRN2dak/maxresdefault.jpg\",\"width\":1920,\"height\":1080}]},\"allowRatings\":true,\"viewCount\":\"33792\",\"author\":\"The Weeknd - Topic\",\"isPrivate\":false,\"isUnpluggedCorpus\":false,\"isLiveContent\":false},\"trackingParams\":\"CAAQu2kiEwjHhr_O_LuBAxU8HfEFHZ_PC6Y\u003d\",\"adBreakHeartbeatParams\":\"Q0FBJTNE\"}",
"latestUrl": "https://www.youtube.com/youtubei/v1/player?key\u003dAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8\u0026prettyPrint\u003dfalse"
}
}

View File

@ -22,6 +22,10 @@
"cache-control": [
"private, max-age\u003d0"
],
"content-security-policy-report-only": [
"base-uri \u0027self\u0027;default-src \u0027self\u0027 https: blob:;font-src https: data:;img-src https: data: android-webview-video-poster:;media-src blob: https:;object-src \u0027none\u0027;script-src \u0027nonce-9Cug0BW8-gqVWG77UsdvZQ\u0027 \u0027unsafe-inline\u0027 \u0027strict-dynamic\u0027 https: http: \u0027unsafe-eval\u0027;style-src https: \u0027unsafe-inline\u0027;report-uri /cspreport",
"require-trusted-types-for \u0027script\u0027;report-uri /cspreport"
],
"content-type": [
"text/javascript; charset\u003dutf-8"
],
@ -32,10 +36,10 @@
"cross-origin"
],
"date": [
"Sun, 06 Aug 2023 10:32:11 GMT"
"Thu, 21 Sep 2023 15:02:54 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:11 GMT"
"Thu, 21 Sep 2023 15:02:54 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -53,9 +57,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003d1Xu7NS0eOzs; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003dYuAZdAPI4Ok; Domain\u003d.youtube.com; Expires\u003dFri, 02-Feb-2024 10:32:11 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+965; expires\u003dTue, 05-Aug-2025 10:32:11 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003d5_nL-AQEQz4; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003ddc5OsadOfWo; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:02:54 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:02:54 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+014; expires\u003dSat, 20-Sep-2025 15:02:54 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"
@ -70,7 +75,7 @@
"0"
]
},
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/f98908d1\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/019a2dc2\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"latestUrl": "https://www.youtube.com/iframe_api"
}
}

View File

@ -3,10 +3,10 @@
"httpMethod": "GET",
"url": "https://www.youtube.com/sw.js",
"headers": {
"Origin": [
"Referer": [
"https://www.youtube.com"
],
"Referer": [
"Origin": [
"https://www.youtube.com"
],
"Accept-Language": [
@ -34,9 +34,6 @@
"cache-control": [
"private, max-age\u003d0"
],
"content-security-policy-report-only": [
"require-trusted-types-for \u0027script\u0027;report-uri /cspreport"
],
"content-type": [
"text/javascript; charset\u003dutf-8"
],
@ -44,10 +41,10 @@
"same-origin; report-to\u003d\"youtube_main\""
],
"date": [
"Sun, 06 Aug 2023 10:32:12 GMT"
"Thu, 21 Sep 2023 15:02:55 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:12 GMT"
"Thu, 21 Sep 2023 15:02:55 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -65,9 +62,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003dHOg-7Vyd77A; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dMon, 09-Nov-2020 10:32:12 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+496; expires\u003dTue, 05-Aug-2025 10:32:12 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003dGXImUDcI4Bc; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dFri, 25-Dec-2020 15:02:55 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:02:55 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+310; expires\u003dSat, 20-Sep-2025 15:02:55 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"

View File

@ -22,9 +22,6 @@
"cache-control": [
"private, max-age\u003d0"
],
"content-security-policy-report-only": [
"require-trusted-types-for \u0027script\u0027;report-uri /cspreport"
],
"content-type": [
"text/javascript; charset\u003dutf-8"
],
@ -35,10 +32,10 @@
"cross-origin"
],
"date": [
"Sun, 06 Aug 2023 10:32:20 GMT"
"Thu, 21 Sep 2023 15:03:02 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:20 GMT"
"Thu, 21 Sep 2023 15:03:02 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -56,9 +53,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003dTfeZEz0nmlM; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003dYCcfT2EwcqM; Domain\u003d.youtube.com; Expires\u003dFri, 02-Feb-2024 10:32:20 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+310; expires\u003dTue, 05-Aug-2025 10:32:20 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003dksSIRUPD-Dg; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003dQXjkf1sTE8E; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:03:02 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:03:02 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+876; expires\u003dSat, 20-Sep-2025 15:03:02 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"
@ -73,7 +71,7 @@
"0"
]
},
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/f98908d1\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/019a2dc2\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"latestUrl": "https://www.youtube.com/iframe_api"
}
}

View File

@ -3,10 +3,10 @@
"httpMethod": "GET",
"url": "https://www.youtube.com/sw.js",
"headers": {
"Origin": [
"Referer": [
"https://www.youtube.com"
],
"Referer": [
"Origin": [
"https://www.youtube.com"
],
"Accept-Language": [
@ -34,6 +34,9 @@
"cache-control": [
"private, max-age\u003d0"
],
"content-security-policy-report-only": [
"require-trusted-types-for \u0027script\u0027;report-uri /cspreport"
],
"content-type": [
"text/javascript; charset\u003dutf-8"
],
@ -41,10 +44,10 @@
"same-origin; report-to\u003d\"youtube_main\""
],
"date": [
"Sun, 06 Aug 2023 10:32:21 GMT"
"Thu, 21 Sep 2023 15:03:03 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:21 GMT"
"Thu, 21 Sep 2023 15:03:03 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -62,9 +65,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003d-otLL_9O32Q; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dMon, 09-Nov-2020 10:32:21 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+175; expires\u003dTue, 05-Aug-2025 10:32:20 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003dLJ-Skf5fzV0; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dFri, 25-Dec-2020 15:03:03 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:03:03 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+079; expires\u003dSat, 20-Sep-2025 15:03:03 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"

View File

@ -22,6 +22,9 @@
"cache-control": [
"private, max-age\u003d0"
],
"content-security-policy-report-only": [
"require-trusted-types-for \u0027script\u0027;report-uri /cspreport"
],
"content-type": [
"text/javascript; charset\u003dutf-8"
],
@ -32,10 +35,10 @@
"cross-origin"
],
"date": [
"Sun, 06 Aug 2023 10:32:26 GMT"
"Thu, 21 Sep 2023 15:03:12 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:26 GMT"
"Thu, 21 Sep 2023 15:03:12 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -53,9 +56,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003dSQGPhvGc5Is; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003daoJ2iWqJgDo; Domain\u003d.youtube.com; Expires\u003dFri, 02-Feb-2024 10:32:26 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+799; expires\u003dTue, 05-Aug-2025 10:32:26 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003dd8spF4hA4ng; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003dJjkLdvNl4Zc; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:03:12 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:03:12 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+917; expires\u003dSat, 20-Sep-2025 15:03:12 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"
@ -70,7 +74,7 @@
"0"
]
},
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/f98908d1\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/019a2dc2\\/www-widgetapi.vflset\\/www-widgetapi.js\u0027;window[\u0027yt_embedsEnableIframeWithLazyLoad\u0027] \u003d true ;try{var ttPolicy\u003dwindow.trustedTypes.createPolicy(\"youtube-widget-api\",{createScriptURL:function(x){return x}});scriptUrl\u003dttPolicy.createScriptURL(scriptUrl)}catch(e){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"latestUrl": "https://www.youtube.com/iframe_api"
}
}

View File

@ -3,10 +3,10 @@
"httpMethod": "GET",
"url": "https://www.youtube.com/sw.js",
"headers": {
"Origin": [
"Referer": [
"https://www.youtube.com"
],
"Referer": [
"Origin": [
"https://www.youtube.com"
],
"Accept-Language": [
@ -41,10 +41,10 @@
"same-origin; report-to\u003d\"youtube_main\""
],
"date": [
"Sun, 06 Aug 2023 10:32:27 GMT"
"Thu, 21 Sep 2023 15:03:12 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:27 GMT"
"Thu, 21 Sep 2023 15:03:12 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -62,9 +62,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003dyNJBshu5bCM; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dMon, 09-Nov-2020 10:32:27 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+803; expires\u003dTue, 05-Aug-2025 10:32:27 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003dOTjYit44EyE; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dFri, 25-Dec-2020 15:03:12 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:03:12 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+905; expires\u003dSat, 20-Sep-2025 15:03:12 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"

View File

@ -22,9 +22,6 @@
"cache-control": [
"private, max-age\u003d0"
],
"content-security-policy-report-only": [
"base-uri \u0027self\u0027;default-src \u0027self\u0027 https: blob:;font-src https: data:;img-src https: data: android-webview-video-poster:;media-src blob: https:;object-src \u0027none\u0027;script-src \u0027nonce-x4AgUlO1hjKWAU-cR42eMw\u0027 \u0027unsafe-inline\u0027 \u0027strict-dynamic\u0027 https: http: \u0027unsafe-eval\u0027;style-src https: \u0027unsafe-inline\u0027;report-uri /cspreport"
],
"content-type": [
"text/javascript; charset\u003dutf-8"
],
@ -35,10 +32,10 @@
"cross-origin"
],
"date": [
"Sun, 06 Aug 2023 10:32:22 GMT"
"Thu, 21 Sep 2023 15:03:04 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:22 GMT"
"Thu, 21 Sep 2023 15:03:04 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -56,9 +53,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003dfJzrIRqbi7M; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003doucR1sDvGOk; Domain\u003d.youtube.com; Expires\u003dFri, 02-Feb-2024 10:32:22 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+462; expires\u003dTue, 05-Aug-2025 10:32:22 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003dejSP5aJWh_A; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003dmyJEkBmnZ8s; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:03:04 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:03:04 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+154; expires\u003dSat, 20-Sep-2025 15:03:04 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"
@ -73,7 +71,7 @@
"0"
]
},
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/f98908d1\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/019a2dc2\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"latestUrl": "https://www.youtube.com/iframe_api"
}
}

View File

@ -3,10 +3,10 @@
"httpMethod": "GET",
"url": "https://www.youtube.com/sw.js",
"headers": {
"Origin": [
"Referer": [
"https://www.youtube.com"
],
"Referer": [
"Origin": [
"https://www.youtube.com"
],
"Accept-Language": [
@ -34,9 +34,6 @@
"cache-control": [
"private, max-age\u003d0"
],
"content-security-policy-report-only": [
"require-trusted-types-for \u0027script\u0027;report-uri /cspreport"
],
"content-type": [
"text/javascript; charset\u003dutf-8"
],
@ -44,10 +41,10 @@
"same-origin; report-to\u003d\"youtube_main\""
],
"date": [
"Sun, 06 Aug 2023 10:32:22 GMT"
"Thu, 21 Sep 2023 15:03:05 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:22 GMT"
"Thu, 21 Sep 2023 15:03:05 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -65,9 +62,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003dEcUxafIK3w8; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dMon, 09-Nov-2020 10:32:22 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+899; expires\u003dTue, 05-Aug-2025 10:32:22 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003d4COvXI3Higo; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d; Domain\u003d.youtube.com; Expires\u003dFri, 25-Dec-2020 15:03:05 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:03:05 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+880; expires\u003dSat, 20-Sep-2025 15:03:05 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"

View File

@ -23,7 +23,8 @@
"private, max-age\u003d0"
],
"content-security-policy-report-only": [
"require-trusted-types-for \u0027script\u0027;report-uri /cspreport"
"require-trusted-types-for \u0027script\u0027;report-uri /cspreport",
"base-uri \u0027self\u0027;default-src \u0027self\u0027 https: blob:;font-src https: data:;img-src https: data: android-webview-video-poster:;media-src blob: https:;object-src \u0027none\u0027;script-src \u0027nonce-M4dIZ2RupfJxsFX2CDmNPA\u0027 \u0027unsafe-inline\u0027 \u0027strict-dynamic\u0027 https: http: \u0027unsafe-eval\u0027;style-src https: \u0027unsafe-inline\u0027;report-uri /cspreport"
],
"content-type": [
"text/javascript; charset\u003dutf-8"
@ -35,10 +36,10 @@
"cross-origin"
],
"date": [
"Sun, 06 Aug 2023 10:32:23 GMT"
"Thu, 21 Sep 2023 15:03:07 GMT"
],
"expires": [
"Sun, 06 Aug 2023 10:32:23 GMT"
"Thu, 21 Sep 2023 15:03:07 GMT"
],
"origin-trial": [
"AvC9UlR6RDk2crliDsFl66RWLnTbHrDbp+DiY6AYz/PNQ4G4tdUTjrHYr2sghbkhGQAVxb7jaPTHpEVBz0uzQwkAAAB4eyJvcmlnaW4iOiJodHRwczovL3lvdXR1YmUuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJWaWV3WFJlcXVlc3RlZFdpdGhEZXByZWNhdGlvbiIsImV4cGlyeSI6MTcxOTUzMjc5OSwiaXNTdWJkb21haW4iOnRydWV9"
@ -56,9 +57,10 @@
"ESF"
],
"set-cookie": [
"YSC\u003d-LQPLqPBJfM; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d4xHmo3HIu18; Domain\u003d.youtube.com; Expires\u003dFri, 02-Feb-2024 10:32:23 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+883; expires\u003dTue, 05-Aug-2025 10:32:23 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003dzksdiYOL7D8; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003dSmqiHCer3s4; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:03:07 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_PRIVACY_METADATA\u003dCgJGUhIA; Domain\u003d.youtube.com; Expires\u003dTue, 19-Mar-2024 15:03:07 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dlax",
"CONSENT\u003dPENDING+964; expires\u003dSat, 20-Sep-2025 15:03:07 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"
@ -73,7 +75,7 @@
"0"
]
},
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/f98908d1\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/019a2dc2\\/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){}var YT;if(!window[\"YT\"])YT\u003d{loading:0,loaded:0};var YTConfig;if(!window[\"YTConfig\"])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;var i\u003d0;for(;i\u003cl.length;i++)try{l[i]()}catch(e){}};YT.setConfig\u003dfunction(c){var k;for(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\",\nn)}var b\u003ddocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"latestUrl": "https://www.youtube.com/iframe_api"
}
}

Some files were not shown because too many files have changed in this diff Show More