Merge pull request #755 from litetex/clean-up-yt-dis-likes

Cleanup: Remove old ways of getting YT dis/likes
This commit is contained in:
litetex 2021-12-27 18:32:02 +01:00 committed by GitHub
commit 10f6cc7194
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
89 changed files with 2971 additions and 5370 deletions

View File

@ -149,27 +149,24 @@ public class BandcampRadioStreamExtractor extends BandcampStreamExtractor {
@Nonnull
@Override
public String getLicence() {
// Contrary to other Bandcamp streams, radio streams don't have a license
return "";
}
@Nonnull
@Override
public String getCategory() {
// Contrary to other Bandcamp streams, radio streams don't have categories
return "";
}
@Nonnull
@Override
public List<String> getTags() {
// Contrary to other Bandcamp streams, radio streams don't have tags
return Collections.emptyList();
}
@Nonnull
@Override
public Privacy getPrivacy() {
return Privacy.PUBLIC;
}
@Override
public PlaylistInfoItemsCollector getRelatedItems() {
// Contrary to other Bandcamp streams, radio streams don't have related items

View File

@ -98,11 +98,6 @@ public class BandcampStreamExtractor extends StreamExtractor {
return albumJson.getString("artist");
}
@Override
public boolean isUploaderVerified() throws ParsingException {
return false;
}
@Nullable
@Override
public String getTextualUploadDate() {
@ -132,24 +127,6 @@ public class BandcampStreamExtractor extends StreamExtractor {
}
}
@Nonnull
@Override
public String getSubChannelUrl() {
return "";
}
@Nonnull
@Override
public String getSubChannelName() {
return "";
}
@Nonnull
@Override
public String getSubChannelAvatarUrl() {
return "";
}
@Nonnull
@Override
public Description getDescription() {
@ -164,48 +141,6 @@ public class BandcampStreamExtractor extends StreamExtractor {
return new Description(s, Description.PLAIN_TEXT);
}
@Override
public int getAgeLimit() {
return NO_AGE_LIMIT;
}
@Override
public long getLength() {
return 0;
}
@Override
public long getTimeStamp() {
return 0;
}
@Override
public long getViewCount() {
return -1;
}
@Override
public long getLikeCount() {
return -1;
}
@Override
public long getDislikeCount() {
return -1;
}
@Nonnull
@Override
public String getDashMpdUrl() {
return "";
}
@Nonnull
@Override
public String getHlsUrl() {
return "";
}
@Override
public List<AudioStream> getAudioStreams() {
final List<AudioStream> audioStreams = new ArrayList<>();
@ -228,18 +163,6 @@ public class BandcampStreamExtractor extends StreamExtractor {
return Collections.emptyList();
}
@Nonnull
@Override
public List<SubtitlesStream> getSubtitlesDefault() {
return Collections.emptyList();
}
@Nonnull
@Override
public List<SubtitlesStream> getSubtitles(MediaFormat format) {
return Collections.emptyList();
}
@Override
public StreamType getStreamType() {
return StreamType.AUDIO_STREAM;
@ -259,23 +182,6 @@ public class BandcampStreamExtractor extends StreamExtractor {
return collector;
}
@Override
public String getErrorMessage() {
return null;
}
@Nonnull
@Override
public String getHost() {
return "";
}
@Nonnull
@Override
public Privacy getPrivacy() {
return Privacy.PUBLIC;
}
@Nonnull
@Override
public String getCategory() {
@ -315,12 +221,6 @@ public class BandcampStreamExtractor extends StreamExtractor {
}
}
@Nullable
@Override
public Locale getLanguageInfo() {
return null;
}
@Nonnull
@Override
public List<String> getTags() {
@ -334,22 +234,4 @@ public class BandcampStreamExtractor extends StreamExtractor {
return tags;
}
@Nonnull
@Override
public String getSupportInfo() {
return "";
}
@Nonnull
@Override
public List<StreamSegment> getStreamSegments() throws ParsingException {
return Collections.emptyList();
}
@Nonnull
@Override
public List<MetaInfo> getMetaInfo() throws ParsingException {
return Collections.emptyList();
}
}

View File

@ -60,18 +60,6 @@ public class MediaCCCLiveStreamExtractor extends StreamExtractor {
return room.getString("display");
}
@Nullable
@Override
public String getTextualUploadDate() throws ParsingException {
return null;
}
@Nullable
@Override
public DateWrapper getUploadDate() throws ParsingException {
return null;
}
@Nonnull
@Override
public String getThumbnailUrl() throws ParsingException {
@ -84,36 +72,11 @@ public class MediaCCCLiveStreamExtractor extends StreamExtractor {
return new Description(conference.getString("description") + " - " + group, Description.PLAIN_TEXT);
}
@Override
public int getAgeLimit() {
return 0;
}
@Override
public long getLength() {
return 0;
}
@Override
public long getTimeStamp() throws ParsingException {
return 0;
}
@Override
public long getViewCount() {
return -1;
}
@Override
public long getLikeCount() {
return -1;
}
@Override
public long getDislikeCount() {
return -1;
}
@Nonnull
@Override
public String getUploaderUrl() throws ParsingException {
@ -126,41 +89,6 @@ public class MediaCCCLiveStreamExtractor extends StreamExtractor {
return conference.getString("conference");
}
@Override
public boolean isUploaderVerified() throws ParsingException {
return false;
}
@Nonnull
@Override
public String getUploaderAvatarUrl() {
return "";
}
@Nonnull
@Override
public String getSubChannelUrl() {
return "";
}
@Nonnull
@Override
public String getSubChannelName() {
return "";
}
@Nonnull
@Override
public String getSubChannelAvatarUrl() {
return "";
}
@Nonnull
@Override
public String getDashMpdUrl() throws ParsingException {
return "";
}
@Nonnull
@Override
public String getHlsUrl() {
@ -221,85 +149,14 @@ public class MediaCCCLiveStreamExtractor extends StreamExtractor {
return null;
}
@Nonnull
@Override
public List<SubtitlesStream> getSubtitlesDefault() {
return Collections.emptyList();
}
@Nonnull
@Override
public List<SubtitlesStream> getSubtitles(MediaFormat format) {
return Collections.emptyList();
}
@Override
public StreamType getStreamType() throws ParsingException {
return StreamType.LIVE_STREAM; // TODO: video and audio only streams are both available
}
@Nullable
@Override
public StreamInfoItemsCollector getRelatedItems() {
return null;
}
@Override
public String getErrorMessage() {
return null;
}
@Nonnull
@Override
public String getHost() {
return "";
}
@Nonnull
@Override
public Privacy getPrivacy() {
return Privacy.PUBLIC;
}
@Nonnull
@Override
public String getCategory() {
return group;
}
@Nonnull
@Override
public String getLicence() {
return "";
}
@Nullable
@Override
public Locale getLanguageInfo() {
return null;
}
@Nonnull
@Override
public List<String> getTags() {
return Collections.emptyList();
}
@Nonnull
@Override
public String getSupportInfo() {
return "";
}
@Nonnull
@Override
public List<StreamSegment> getStreamSegments() {
return Collections.emptyList();
}
@Nonnull
@Override
public List<MetaInfo> getMetaInfo() {
return Collections.emptyList();
}
}

View File

@ -58,36 +58,16 @@ public class MediaCCCStreamExtractor extends StreamExtractor {
return new Description(data.getString("description"), Description.PLAIN_TEXT);
}
@Override
public int getAgeLimit() {
return 0;
}
@Override
public long getLength() {
return data.getInt("length");
}
@Override
public long getTimeStamp() {
return 0;
}
@Override
public long getViewCount() {
return data.getInt("view_count");
}
@Override
public long getLikeCount() {
return -1;
}
@Override
public long getDislikeCount() {
return -1;
}
@Nonnull
@Override
public String getUploaderUrl() {
@ -101,47 +81,12 @@ public class MediaCCCStreamExtractor extends StreamExtractor {
.replaceFirst("https://(api\\.)?media\\.ccc\\.de/public/conferences/", "");
}
@Override
public boolean isUploaderVerified() throws ParsingException {
return false;
}
@Nonnull
@Override
public String getUploaderAvatarUrl() {
return conferenceData.getString("logo_url");
}
@Nonnull
@Override
public String getSubChannelUrl() {
return "";
}
@Nonnull
@Override
public String getSubChannelName() {
return "";
}
@Nonnull
@Override
public String getSubChannelAvatarUrl() {
return "";
}
@Nonnull
@Override
public String getDashMpdUrl() {
return "";
}
@Nonnull
@Override
public String getHlsUrl() {
return "";
}
@Override
public List<AudioStream> getAudioStreams() throws ExtractionException {
final JsonArray recordings = data.getArray("recordings");
@ -200,34 +145,11 @@ public class MediaCCCStreamExtractor extends StreamExtractor {
return Collections.emptyList();
}
@Nonnull
@Override
public List<SubtitlesStream> getSubtitlesDefault() {
return Collections.emptyList();
}
@Nonnull
@Override
public List<SubtitlesStream> getSubtitles(final MediaFormat format) {
return Collections.emptyList();
}
@Override
public StreamType getStreamType() {
return StreamType.VIDEO_STREAM;
}
@Nullable
@Override
public StreamInfoItemsCollector getRelatedItems() {
return null;
}
@Override
public String getErrorMessage() {
return null;
}
@Override
public void onFetchPage(@Nonnull final Downloader downloader)
throws IOException, ExtractionException {
@ -253,30 +175,6 @@ public class MediaCCCStreamExtractor extends StreamExtractor {
return data.getString("frontend_link");
}
@Nonnull
@Override
public String getHost() {
return "";
}
@Nonnull
@Override
public Privacy getPrivacy() {
return Privacy.PUBLIC;
}
@Nonnull
@Override
public String getCategory() {
return "";
}
@Nonnull
@Override
public String getLicence() {
return "";
}
@Override
public Locale getLanguageInfo() throws ParsingException {
return Localization.getLocaleFromThreeLetterCode(data.getString("original_language"));
@ -287,22 +185,4 @@ public class MediaCCCStreamExtractor extends StreamExtractor {
public List<String> getTags() {
return JsonUtils.getStringListFromJsonArray(data.getArray("tags"));
}
@Nonnull
@Override
public String getSupportInfo() {
return "";
}
@Nonnull
@Override
public List<StreamSegment> getStreamSegments() {
return Collections.emptyList();
}
@Nonnull
@Override
public List<MetaInfo> getMetaInfo() {
return Collections.emptyList();
}
}

View File

@ -149,11 +149,6 @@ public class PeertubeStreamExtractor extends StreamExtractor {
return JsonUtils.getString(json, "account.displayName");
}
@Override
public boolean isUploaderVerified() throws ParsingException {
return false;
}
@Nonnull
@Override
public String getUploaderAvatarUrl() {
@ -190,12 +185,6 @@ public class PeertubeStreamExtractor extends StreamExtractor {
return baseUrl + value;
}
@Nonnull
@Override
public String getDashMpdUrl() {
return "";
}
@Nonnull
@Override
public String getHlsUrl() {
@ -329,18 +318,6 @@ public class PeertubeStreamExtractor extends StreamExtractor {
}
}
@Nonnull
@Override
public List<StreamSegment> getStreamSegments() {
return Collections.emptyList();
}
@Nonnull
@Override
public List<MetaInfo> getMetaInfo() {
return Collections.emptyList();
}
private String getRelatedItemsUrl(final List<String> tags) throws UnsupportedEncodingException {
final String url = baseUrl + PeertubeSearchQueryHandlerFactory.SEARCH_ENDPOINT;
final StringBuilder params = new StringBuilder();
@ -386,11 +363,6 @@ public class PeertubeStreamExtractor extends StreamExtractor {
}
}
@Override
public String getErrorMessage() {
return null;
}
@Override
public void onFetchPage(final Downloader downloader) throws IOException, ExtractionException {
final Response response = downloader.get(baseUrl + PeertubeStreamLinkHandlerFactory.VIDEO_API_ENDPOINT + getId());

View File

@ -102,11 +102,6 @@ public class SoundcloudStreamExtractor extends StreamExtractor {
return new Description(track.getString("description"), Description.PLAIN_TEXT);
}
@Override
public int getAgeLimit() {
return NO_AGE_LIMIT;
}
@Override
public long getLength() {
return track.getLong("duration") / 1000L;
@ -127,11 +122,6 @@ public class SoundcloudStreamExtractor extends StreamExtractor {
return track.getLong("favoritings_count", -1);
}
@Override
public long getDislikeCount() {
return -1;
}
@Nonnull
@Override
public String getUploaderUrl() {
@ -155,36 +145,6 @@ public class SoundcloudStreamExtractor extends StreamExtractor {
return SoundcloudParsingHelper.getAvatarUrl(track);
}
@Nonnull
@Override
public String getSubChannelUrl() {
return "";
}
@Nonnull
@Override
public String getSubChannelName() {
return "";
}
@Nonnull
@Override
public String getSubChannelAvatarUrl() {
return "";
}
@Nonnull
@Override
public String getDashMpdUrl() {
return "";
}
@Nonnull
@Override
public String getHlsUrl() {
return "";
}
@Override
public List<AudioStream> getAudioStreams() throws ExtractionException {
final List<AudioStream> audioStreams = new ArrayList<>();
@ -343,18 +303,6 @@ public class SoundcloudStreamExtractor extends StreamExtractor {
return Collections.emptyList();
}
@Override
@Nonnull
public List<SubtitlesStream> getSubtitlesDefault() {
return Collections.emptyList();
}
@Override
@Nonnull
public List<SubtitlesStream> getSubtitles(MediaFormat format) {
return Collections.emptyList();
}
@Override
public StreamType getStreamType() {
return StreamType.AUDIO_STREAM;
@ -372,17 +320,6 @@ public class SoundcloudStreamExtractor extends StreamExtractor {
return collector;
}
@Override
public String getErrorMessage() {
return null;
}
@Nonnull
@Override
public String getHost() {
return "";
}
@Override
public Privacy getPrivacy() {
return track.getString("sharing").equals("public") ? Privacy.PUBLIC : Privacy.PRIVATE;
@ -400,11 +337,6 @@ public class SoundcloudStreamExtractor extends StreamExtractor {
return track.getString("license");
}
@Override
public Locale getLanguageInfo() {
return null;
}
@Nonnull
@Override
public List<String> getTags() {
@ -432,22 +364,4 @@ public class SoundcloudStreamExtractor extends StreamExtractor {
}
return tags;
}
@Nonnull
@Override
public String getSupportInfo() {
return "";
}
@Nonnull
@Override
public List<StreamSegment> getStreamSegments() {
return Collections.emptyList();
}
@Nonnull
@Override
public List<MetaInfo> getMetaInfo() {
return Collections.emptyList();
}
}

View File

@ -337,24 +337,18 @@ public class YoutubeStreamExtractor extends StreamExtractor {
@Override
public long getLikeCount() throws ParsingException {
assertPageFetched();
String likesString = null;
String likesString = "";
try {
likesString = getVideoPrimaryInfoRenderer().getObject("sentimentBar")
.getObject("sentimentBarRenderer").getString("tooltip");
if (likesString != null && likesString.contains("/")) {
likesString = likesString.split("/")[0];
} else {
likesString = getVideoPrimaryInfoRenderer()
.getObject("videoActions")
.getObject("menuRenderer")
.getArray("topLevelButtons")
.getObject(0)
.getObject("toggleButtonRenderer")
.getObject("defaultText")
.getObject("accessibility")
.getObject("accessibilityData")
.getString("label");
}
likesString = getVideoPrimaryInfoRenderer()
.getObject("videoActions")
.getObject("menuRenderer")
.getArray("topLevelButtons")
.getObject(0)
.getObject("toggleButtonRenderer")
.getObject("defaultText")
.getObject("accessibility")
.getObject("accessibilityData")
.getString("label");
if (likesString == null) {
// If this kicks in our button has no content and therefore ratings must be disabled
@ -364,6 +358,10 @@ public class YoutubeStreamExtractor extends StreamExtractor {
return -1;
}
if (likesString.toLowerCase().contains("no likes")) {
return 0;
}
return Integer.parseInt(Utils.removeNonDigitCharacters(likesString));
} catch (final NumberFormatException nfe) {
throw new ParsingException("Could not parse \"" + likesString + "\" as an Integer",
@ -376,34 +374,6 @@ public class YoutubeStreamExtractor extends StreamExtractor {
}
}
@Override
public long getDislikeCount() throws ParsingException {
assertPageFetched();
try {
String dislikesString = getVideoPrimaryInfoRenderer().getObject("sentimentBar")
.getObject("sentimentBarRenderer").getString("tooltip");
if (dislikesString != null && dislikesString.contains("/")) {
dislikesString = dislikesString.split("/")[1];
return Integer.parseInt(Utils.removeNonDigitCharacters(dislikesString));
} else {
// Calculate dislike with average rating and like count
long likes = getLikeCount();
double averageRating = playerResponse.getObject("videoDetails").getDouble("averageRating");
if (likes != -1 && averageRating > 1) {
// If averageRating can't be gathered, it will be 0,
// but we also can't divide by 0 so we need > 1
return Math.round(likes * ((5 - averageRating) / (averageRating - 1)));
}
}
} catch (final Exception e) {
}
// Silently fail as YouTube is "gradually rolling out" removing dislike count
// https://blog.youtube/news-and-events/update-to-youtube/
return -1;
}
@Nonnull
@Override
public String getUploaderUrl() throws ParsingException {
@ -467,24 +437,6 @@ public class YoutubeStreamExtractor extends StreamExtractor {
return fixThumbnailUrl(url);
}
@Nonnull
@Override
public String getSubChannelUrl() {
return "";
}
@Nonnull
@Override
public String getSubChannelName() {
return "";
}
@Nonnull
@Override
public String getSubChannelAvatarUrl() {
return "";
}
@Nonnull
@Override
public String getDashMpdUrl() throws ParsingException {
@ -1266,12 +1218,6 @@ public class YoutubeStreamExtractor extends StreamExtractor {
}
}
@Nonnull
@Override
public String getHost() {
return "";
}
@Nonnull
@Override
public Privacy getPrivacy() {
@ -1313,12 +1259,6 @@ public class YoutubeStreamExtractor extends StreamExtractor {
.getArray("keywords"));
}
@Nonnull
@Override
public String getSupportInfo() {
return "";
}
@Nonnull
@Override
public List<StreamSegment> getStreamSegments() throws ParsingException {

View File

@ -63,7 +63,9 @@ public abstract class StreamExtractor extends Extractor {
* @see #getUploadDate()
*/
@Nullable
public abstract String getTextualUploadDate() throws ParsingException;
public String getTextualUploadDate() throws ParsingException {
return null;
}
/**
* A more general {@code Calendar} instance set to the date provided by the service.<br>
@ -77,7 +79,9 @@ public abstract class StreamExtractor extends Extractor {
* @see #getTextualUploadDate()
*/
@Nullable
public abstract DateWrapper getUploadDate() throws ParsingException;
public DateWrapper getUploadDate() throws ParsingException {
return null;
}
/**
* This will return the url to the thumbnail of the stream. Try to return the medium resolution here.
@ -95,7 +99,9 @@ public abstract class StreamExtractor extends Extractor {
* @throws ParsingException
*/
@Nonnull
public abstract Description getDescription() throws ParsingException;
public Description getDescription() throws ParsingException {
return Description.emptyDescription;
}
/**
* Get the age limit.
@ -103,52 +109,64 @@ public abstract class StreamExtractor extends Extractor {
* @return The age which limits the content or {@value NO_AGE_LIMIT} if there is no limit
* @throws ParsingException if an error occurs while parsing
*/
public abstract int getAgeLimit() throws ParsingException;
public int getAgeLimit() throws ParsingException {
return NO_AGE_LIMIT;
}
/**
* This should return the length of a video in seconds.
*
* @return The length of the stream in seconds.
* @return The length of the stream in seconds or 0 when it has no length (e.g. a livestream).
* @throws ParsingException
*/
public abstract long getLength() throws ParsingException;
public long getLength() throws ParsingException {
return 0;
}
/**
* If the url you are currently handling contains a time stamp/seek, you can return the
* position it represents here.
* If the url has no time stamp simply return zero.
*
* @return the timestamp in seconds
* @return the timestamp in seconds or 0 when there is no timestamp
* @throws ParsingException
*/
public abstract long getTimeStamp() throws ParsingException;
public long getTimeStamp() throws ParsingException {
return 0;
}
/**
* The count of how many people have watched the video/listened to the audio stream.
* If the current stream has no view count or its not available simply return -1
*
* @return amount of views.
* @return amount of views or -1 if not available.
* @throws ParsingException
*/
public abstract long getViewCount() throws ParsingException;
public long getViewCount() throws ParsingException {
return -1;
}
/**
* The amount of likes a video/audio stream got.
* If the current stream has no likes or its not available simply return -1
*
* @return the amount of likes the stream got
* @return the amount of likes the stream got or -1 if not available.
* @throws ParsingException
*/
public abstract long getLikeCount() throws ParsingException;
public long getLikeCount() throws ParsingException {
return -1;
}
/**
* The amount of dislikes a video/audio stream got.
* If the current stream has no dislikes or its not available simply return -1
*
* @return the amount of likes the stream got
* @return the amount of likes the stream got or -1 if not available.
* @throws ParsingException
*/
public abstract long getDislikeCount() throws ParsingException;
public long getDislikeCount() throws ParsingException {
return -1;
}
/**
* The Url to the page of the creator/uploader of the stream. This must not be a homepage,
@ -157,7 +175,7 @@ public abstract class StreamExtractor extends Extractor {
* so be sure to implement that one before you return a value here, otherwise NewPipe will crash if one selects
* this url.
*
* @return the url to the page of the creator/uploader of the stream or an empty String
* @return the url to the page of the creator/uploader of the stream or an empty string
* @throws ParsingException
*/
@Nonnull
@ -167,7 +185,7 @@ public abstract class StreamExtractor extends Extractor {
* The name of the creator/uploader of the stream.
* If the name is not available you can simply return an empty string.
*
* @return the name of the creator/uploader of the stream or an empty String
* @return the name of the creator/uploader of the stream or an empty tring
* @throws ParsingException
*/
@Nonnull
@ -180,7 +198,9 @@ public abstract class StreamExtractor extends Extractor {
* @return whether the uploader has been verified by the service's provider
* @throws ParsingException
*/
public abstract boolean isUploaderVerified() throws ParsingException;
public boolean isUploaderVerified() throws ParsingException {
return false;
}
/**
* The url to the image file/profile picture/avatar of the creator/uploader of the stream.
@ -190,7 +210,9 @@ public abstract class StreamExtractor extends Extractor {
* @throws ParsingException
*/
@Nonnull
public abstract String getUploaderAvatarUrl() throws ParsingException;
public String getUploaderAvatarUrl() throws ParsingException {
return "";
}
/**
* The Url to the page of the sub-channel of the stream. This must not be a homepage,
@ -203,7 +225,9 @@ public abstract class StreamExtractor extends Extractor {
* @throws ParsingException
*/
@Nonnull
public abstract String getSubChannelUrl() throws ParsingException;
public String getSubChannelUrl() throws ParsingException {
return "";
}
/**
* The name of the sub-channel of the stream.
@ -213,7 +237,9 @@ public abstract class StreamExtractor extends Extractor {
* @throws ParsingException
*/
@Nonnull
public abstract String getSubChannelName() throws ParsingException;
public String getSubChannelName() throws ParsingException {
return "";
}
/**
* The url to the image file/profile picture/avatar of the sub-channel of the stream.
@ -223,17 +249,21 @@ public abstract class StreamExtractor extends Extractor {
* @throws ParsingException
*/
@Nonnull
public abstract String getSubChannelAvatarUrl() throws ParsingException;
public String getSubChannelAvatarUrl() throws ParsingException {
return "";
}
/**
* Get the dash mpd url. If you don't know what a dash MPD is you can read about it
* <a href="https://www.brendanlong.com/the-structure-of-an-mpeg-dash-mpd.html">here</a>.
*
* @return the url as a string or an empty string
* @return the url as a string or an empty string or an empty string if not available
* @throws ParsingException if an error occurs while reading
*/
@Nonnull
public abstract String getDashMpdUrl() throws ParsingException;
public String getDashMpdUrl() throws ParsingException {
return "";
}
/**
* I am not sure if this is in use, and how this is used. However the frontend is missing support
@ -241,11 +271,13 @@ public abstract class StreamExtractor extends Extractor {
* <a href="https://github.com/teamnewpipe/newpipe/issues">issue</a>,
* or fix this description if you know whats up with this.
*
* @return The Url to the hls stream.
* @return The Url to the hls stream or an empty string if not available.
* @throws ParsingException
*/
@Nonnull
public abstract String getHlsUrl() throws ParsingException;
public String getHlsUrl() throws ParsingException {
return "";
}
/**
* This should return a list of available
@ -298,7 +330,9 @@ public abstract class StreamExtractor extends Extractor {
* @throws ExtractionException
*/
@Nonnull
public abstract List<SubtitlesStream> getSubtitlesDefault() throws IOException, ExtractionException;
public List<SubtitlesStream> getSubtitlesDefault() throws IOException, ExtractionException {
return Collections.emptyList();
}
/**
* This will return a list of available
@ -312,7 +346,9 @@ public abstract class StreamExtractor extends Extractor {
* @throws ExtractionException
*/
@Nonnull
public abstract List<SubtitlesStream> getSubtitles(MediaFormat format) throws IOException, ExtractionException;
public List<SubtitlesStream> getSubtitles(MediaFormat format) throws IOException, ExtractionException {
return Collections.emptyList();
}
/**
* Get the <a href="https://teamnewpipe.github.io/NewPipeExtractor/javadoc/">StreamType</a>.
@ -334,13 +370,15 @@ public abstract class StreamExtractor extends Extractor {
* @throws ExtractionException
*/
@Nullable
public abstract InfoItemsCollector<? extends InfoItem, ? extends InfoItemExtractor>
getRelatedItems() throws IOException, ExtractionException;
public InfoItemsCollector<? extends InfoItem, ? extends InfoItemExtractor>
getRelatedItems() throws IOException, ExtractionException {
return null;
}
/**
* @deprecated Use {@link #getRelatedItems()}. May be removed in a future version.
* @return The result of {@link #getRelatedItems()} if it is a
* StreamInfoItemsCollector, null otherwise
* StreamInfoItemsCollector, <code>null</code> otherwise
* @throws IOException
* @throws ExtractionException
*/
@ -367,9 +405,11 @@ public abstract class StreamExtractor extends Extractor {
/**
* Should analyse the webpage's document and extracts any error message there might be.
*
* @return Error message; null if there is no error message.
* @return Error message; <code>null</code> if there is no error message.
*/
public abstract String getErrorMessage();
public String getErrorMessage() {
return null;
}
//////////////////////////////////////////////////////////////////
/// Helper
@ -435,30 +475,35 @@ public abstract class StreamExtractor extends Extractor {
* a federated system, but a centralised system,
* you can simply return an empty string.
*
* @return the host of the stream or an empty String.
* @return the host of the stream or an empty string.
* @throws ParsingException
*/
@Nonnull
public abstract String getHost() throws ParsingException;
public String getHost() throws ParsingException {
return "";
}
/**
* The privacy of the stream (Eg. Public, Private, Unlisted).
* If the privacy is not available you can simply return an empty string.
*
* @return the privacy of the stream or an empty String.
* @return the privacy of the stream.
* @throws ParsingException
*/
public abstract Privacy getPrivacy() throws ParsingException;
public Privacy getPrivacy() throws ParsingException {
return Privacy.PUBLIC;
}
/**
* The name of the category of the stream.
* If the category is not available you can simply return an empty string.
*
* @return the category of the stream or an empty String.
* @return the category of the stream or an empty string.
* @throws ParsingException
*/
@Nonnull
public abstract String getCategory() throws ParsingException;
public String getCategory() throws ParsingException {
return "";
}
/**
* The name of the licence of the stream.
@ -468,7 +513,9 @@ public abstract class StreamExtractor extends Extractor {
* @throws ParsingException
*/
@Nonnull
public abstract String getLicence() throws ParsingException;
public String getLicence() throws ParsingException {
return "";
}
/**
* The locale language of the stream.
@ -476,11 +523,13 @@ public abstract class StreamExtractor extends Extractor {
* If the language is provided by a language code, you can return
* new Locale(language_code);
*
* @return the locale language of the stream or null.
* @return the locale language of the stream or <code>null</code>.
* @throws ParsingException
*/
@Nullable
public abstract Locale getLanguageInfo() throws ParsingException;
public Locale getLanguageInfo() throws ParsingException {
return null;
}
/**
* The list of tags of the stream.
@ -490,7 +539,9 @@ public abstract class StreamExtractor extends Extractor {
* @throws ParsingException
*/
@Nonnull
public abstract List<String> getTags() throws ParsingException;
public List<String> getTags() throws ParsingException {
return Collections.emptyList();
}
/**
* The support information of the stream.
@ -499,11 +550,13 @@ public abstract class StreamExtractor extends Extractor {
* If the support information are not available,
* you can simply return an empty String.
*
* @return the support information of the stream or an empty String.
* @return the support information of the stream or an empty string.
* @throws ParsingException
*/
@Nonnull
public abstract String getSupportInfo() throws ParsingException;
public String getSupportInfo() throws ParsingException {
return "";
}
/**
* The list of stream segments by timestamps for the stream.
@ -513,7 +566,9 @@ public abstract class StreamExtractor extends Extractor {
* @throws ParsingException
*/
@Nonnull
public abstract List<StreamSegment> getStreamSegments() throws ParsingException;
public List<StreamSegment> getStreamSegments() throws ParsingException {
return Collections.emptyList();
}
/**
* Meta information about the stream.
@ -524,11 +579,14 @@ public abstract class StreamExtractor extends Extractor {
* </p>
* The meta information often contains links to external sources like Wikipedia or the WHO.
*
* @return The meta info of the stream or an empty List if not provided.
* @return The meta info of the stream or an empty list if not provided.
* @throws ParsingException
*/
@Nonnull
public abstract List<MetaInfo> getMetaInfo() throws ParsingException;
public List<MetaInfo> getMetaInfo() throws ParsingException {
return Collections.emptyList();
}
public enum Privacy {
PUBLIC,
UNLISTED,

View File

@ -55,7 +55,7 @@ public class YoutubeStreamExtractorAgeRestrictedTest extends DefaultStreamExtrac
@Nullable @Override public String expectedUploadDate() { return "2018-03-11 00:00:00.000"; }
@Nullable @Override public String expectedTextualUploadDate() { return "2018-03-11"; }
@Override public long expectedLikeCountAtLeast() { return 3_700; }
@Override public long expectedDislikeCountAtLeast() { return 30; }
@Override public long expectedDislikeCountAtLeast() { return -1; }
@Override public boolean expectedHasRelatedItems() { return false; } // no related videos (!)
@Override public int expectedAgeLimit() { return 18; }
@Override public boolean expectedHasSubtitles() { return false; }

View File

@ -58,7 +58,7 @@ public class YoutubeStreamExtractorControversialTest extends DefaultStreamExtrac
@Nullable @Override public String expectedUploadDate() { return "2010-09-09 00:00:00.000"; }
@Nullable @Override public String expectedTextualUploadDate() { return "2010-09-09"; }
@Override public long expectedLikeCountAtLeast() { return 13300; }
@Override public long expectedDislikeCountAtLeast() { return 2600; }
@Override public long expectedDislikeCountAtLeast() { return -1; }
@Override public List<String> expectedTags() { return Arrays.asList("Books", "Burning", "Jones", "Koran", "Qur'an", "Terry", "the amazing atheist"); }
@Override public String expectedCategory() { return "Entertainment"; }
@Override public String expectedLicence() { return "YouTube licence"; }

View File

@ -148,7 +148,7 @@ public class YoutubeStreamExtractorDefaultTest {
@Nullable @Override public String expectedUploadDate() { return "2019-08-24 00:00:00.000"; }
@Nullable @Override public String expectedTextualUploadDate() { return "2019-08-24"; }
@Override public long expectedLikeCountAtLeast() { return 5212900; }
@Override public long expectedDislikeCountAtLeast() { return 30600; }
@Override public long expectedDislikeCountAtLeast() { return -1; }
@Override public int expectedStreamSegmentsCount() { return 0; }
@Override public String expectedLicence() { return YOUTUBE_LICENCE; }
@Override public String expectedCategory() { return "Entertainment"; }
@ -192,7 +192,7 @@ public class YoutubeStreamExtractorDefaultTest {
@Nullable @Override public String expectedUploadDate() { return "2018-06-19 00:00:00.000"; }
@Nullable @Override public String expectedTextualUploadDate() { return "2018-06-19"; }
@Override public long expectedLikeCountAtLeast() { return 340100; }
@Override public long expectedDislikeCountAtLeast() { return 18700; }
@Override public long expectedDislikeCountAtLeast() { return -1; }
@Override public boolean expectedUploaderVerified() { return true; }
@Override public String expectedLicence() { return YOUTUBE_LICENCE; }
@Override public String expectedCategory() { return "Science & Technology"; }
@ -282,7 +282,7 @@ public class YoutubeStreamExtractorDefaultTest {
@Nullable @Override public String expectedUploadDate() { return "2021-03-17 00:00:00.000"; }
@Nullable @Override public String expectedTextualUploadDate() { return "2021-03-17"; }
@Override public long expectedLikeCountAtLeast() { return 2300; }
@Override public long expectedDislikeCountAtLeast() { return 450; }
@Override public long expectedDislikeCountAtLeast() { return -1; }
@Override public boolean expectedHasSubtitles() { return false; }
@Override public int expectedStreamSegmentsCount() { return 13; }
@Override public String expectedLicence() { return YOUTUBE_LICENCE; }
@ -342,7 +342,7 @@ public class YoutubeStreamExtractorDefaultTest {
@Nullable @Override public String expectedUploadDate() { return "2020-11-18 00:00:00.000"; }
@Nullable @Override public String expectedTextualUploadDate() { return "2020-11-18"; }
@Override public long expectedLikeCountAtLeast() { return 48500; }
@Override public long expectedDislikeCountAtLeast() { return 20000; }
@Override public long expectedDislikeCountAtLeast() { return -1; }
@Override public boolean expectedHasSubtitles() { return true; }
@Override public int expectedStreamSegmentsCount() { return 7; }
@Override public String expectedLicence() { return YOUTUBE_LICENCE; }
@ -411,7 +411,7 @@ public class YoutubeStreamExtractorDefaultTest {
@Nullable @Override public String expectedUploadDate() { return "2019-06-12 00:00:00.000"; }
@Nullable @Override public String expectedTextualUploadDate() { return "2019-06-12"; }
@Override public long expectedLikeCountAtLeast() { return 70000; }
@Override public long expectedDislikeCountAtLeast() { return 500; }
@Override public long expectedDislikeCountAtLeast() { return -1; }
@Override public List<MetaInfo> expectedMetaInfo() throws MalformedURLException {
return Collections.singletonList(new MetaInfo(
EMPTY_STRING,

View File

@ -63,7 +63,7 @@ public class YoutubeStreamExtractorLivestreamTest extends DefaultStreamExtractor
@Nullable @Override public String expectedUploadDate() { return "2020-02-22 00:00:00.000"; }
@Nullable @Override public String expectedTextualUploadDate() { return "2020-02-22"; }
@Override public long expectedLikeCountAtLeast() { return 825000; }
@Override public long expectedDislikeCountAtLeast() { return 15600; }
@Override public long expectedDislikeCountAtLeast() { return -1; }
@Override public boolean expectedHasSubtitles() { return false; }
@Nullable @Override public String expectedDashMpdUrlContains() { return "https://manifest.googlevideo.com/api/manifest/dash/"; }
@Override public boolean expectedHasFrames() { return false; }

View File

@ -54,7 +54,7 @@ public class YoutubeStreamExtractorUnlistedTest extends DefaultStreamExtractorTe
@Nullable @Override public String expectedUploadDate() { return "2017-09-22 00:00:00.000"; }
@Nullable @Override public String expectedTextualUploadDate() { return "2017-09-22"; }
@Override public long expectedLikeCountAtLeast() { return 110; }
@Override public long expectedDislikeCountAtLeast() { return 0; }
@Override public long expectedDislikeCountAtLeast() { return -1; }
@Override public StreamExtractor.Privacy expectedPrivacy() { return UNLISTED; }
@Override public String expectedLicence() { return "YouTube licence"; }
@Override public String expectedCategory() { return "Gaming"; }

View File

@ -26,16 +26,16 @@
"text/javascript; charset\u003dutf-8"
],
"cross-origin-opener-policy-report-only": [
"same-origin; report-to\u003d\"AXrpQdexiF0ssZ_nH8Dr-M3QgbdVRvO77RECMA\""
"same-origin; report-to\u003d\"ATmXEA_aXV-idIZ-e5x1JSbJUg8hfAx2dSl3lQ\""
],
"cross-origin-resource-policy": [
"cross-origin"
],
"date": [
"Wed, 08 Dec 2021 20:07:15 GMT"
"Mon, 27 Dec 2021 16:06:33 GMT"
],
"expires": [
"Wed, 08 Dec 2021 20:07:15 GMT"
"Mon, 27 Dec 2021 16:06:33 GMT"
],
"p3p": [
"CP\u003d\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl\u003den-GB for more info.\""
@ -44,15 +44,15 @@
"ch-ua-arch\u003d*, ch-ua-bitness\u003d*, ch-ua-full-version\u003d*, ch-ua-model\u003d*, ch-ua-platform\u003d*, ch-ua-platform-version\u003d*"
],
"report-to": [
"{\"group\":\"AXrpQdexiF0ssZ_nH8Dr-M3QgbdVRvO77RECMA\",\"max_age\":2592000,\"endpoints\":[{\"url\":\"https://csp.withgoogle.com/csp/report-to/encsid_AXrpQdexiF0ssZ_nH8Dr-M3QgbdVRvO77RECMA\"}]}"
"{\"group\":\"ATmXEA_aXV-idIZ-e5x1JSbJUg8hfAx2dSl3lQ\",\"max_age\":2592000,\"endpoints\":[{\"url\":\"https://csp.withgoogle.com/csp/report-to/encsid_ATmXEA_aXV-idIZ-e5x1JSbJUg8hfAx2dSl3lQ\"}]}"
],
"server": [
"ESF"
],
"set-cookie": [
"YSC\u003dP2g-VD0PQjQ; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003dPfSCy2p0974; Domain\u003d.youtube.com; Expires\u003dMon, 06-Jun-2022 20:07:15 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+585; expires\u003dFri, 08-Dec-2023 20:07:15 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003dnPcJ2G1k_tY; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003d8gv0jn7WFvA; Domain\u003d.youtube.com; Expires\u003dSat, 25-Jun-2022 16:06:33 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+029; expires\u003dWed, 27-Dec-2023 16:06:33 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"strict-transport-security": [
"max-age\u003d31536000"
@ -67,7 +67,7 @@
"0"
]
},
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/46ac5f60\\/www-widgetapi.vflset\\/www-widgetapi.js\u0027;try{var ttPolicy\u003dwindow.trustedTypes.createPolicy(\"youtube-widget-api\",{createScriptURL:function(x){return x}});scriptUrl\u003dttPolicy.createScriptURL(scriptUrl)}catch(e){}if(!window[\"YT\"])var YT\u003d{loading:0,loaded:0};if(!window[\"YTConfig\"])var YTConfig\u003d{\"host\":\"https://www.youtube.com\"};\nif(!YT.loading){YT.loading\u003d1;(function(){var l\u003d[];YT.ready\u003dfunction(f){if(YT.loaded)f();else l.push(f)};window.onYTReady\u003dfunction(){YT.loaded\u003d1;for(var i\u003d0;i\u003cl.length;i++)try{l[i]()}catch(e$0){}};YT.setConfig\u003dfunction(c){for(var k in c)if(c.hasOwnProperty(k))YTConfig[k]\u003dc[k]};var a\u003ddocument.createElement(\"script\");a.type\u003d\"text/javascript\";a.id\u003d\"www-widgetapi-script\";a.src\u003dscriptUrl;a.async\u003dtrue;var c\u003ddocument.currentScript;if(c){var n\u003dc.nonce||c.getAttribute(\"nonce\");if(n)a.setAttribute(\"nonce\",n)}var b\u003d\ndocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/8da38e9a\\/www-widgetapi.vflset\\/www-widgetapi.js\u0027;try{var ttPolicy\u003dwindow.trustedTypes.createPolicy(\"youtube-widget-api\",{createScriptURL:function(x){return x}});scriptUrl\u003dttPolicy.createScriptURL(scriptUrl)}catch(e){}if(!window[\"YT\"])var YT\u003d{loading:0,loaded:0};if(!window[\"YTConfig\"])var YTConfig\u003d{\"host\":\"https://www.youtube.com\"};\nif(!YT.loading){YT.loading\u003d1;(function(){var l\u003d[];YT.ready\u003dfunction(f){if(YT.loaded)f();else l.push(f)};window.onYTReady\u003dfunction(){YT.loaded\u003d1;for(var i\u003d0;i\u003cl.length;i++)try{l[i]()}catch(e$0){}};YT.setConfig\u003dfunction(c){for(var k in c)if(c.hasOwnProperty(k))YTConfig[k]\u003dc[k]};var a\u003ddocument.createElement(\"script\");a.type\u003d\"text/javascript\";a.id\u003d\"www-widgetapi-script\";a.src\u003dscriptUrl;a.async\u003dtrue;var c\u003ddocument.currentScript;if(c){var n\u003dc.nonce||c.getAttribute(\"nonce\");if(n)a.setAttribute(\"nonce\",n)}var b\u003d\ndocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"latestUrl": "https://www.youtube.com/iframe_api"
}
}

View File

@ -1,188 +1,12 @@
{
"request": {
"httpMethod": "POST",
"url": "https://www.youtube.com/youtubei/v1/player?key\u003dAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8",
"httpMethod": "GET",
"url": "https://www.youtube.com/iframe_api",
"headers": {
"Accept-Language": [
"en-GB, en;q\u003d0.9"
],
"Origin": [
"https://www.youtube.com"
],
"X-YouTube-Client-Name": [
"1"
],
"Referer": [
"https://www.youtube.com"
],
"X-YouTube-Client-Version": [
"2.20210728.00.00"
],
"Content-Type": [
"application/json"
]
},
"dataToSend": [
123,
34,
99,
111,
110,
116,
101,
120,
116,
34,
58,
123,
34,
99,
108,
105,
101,
110,
116,
34,
58,
123,
34,
104,
108,
34,
58,
34,
101,
110,
45,
71,
66,
34,
44,
34,
103,
108,
34,
58,
34,
71,
66,
34,
44,
34,
99,
108,
105,
101,
110,
116,
78,
97,
109,
101,
34,
58,
34,
87,
69,
66,
34,
44,
34,
99,
108,
105,
101,
110,
116,
86,
101,
114,
115,
105,
111,
110,
34,
58,
34,
50,
46,
50,
48,
50,
49,
48,
55,
50,
56,
46,
48,
48,
46,
48,
48,
34,
125,
44,
34,
117,
115,
101,
114,
34,
58,
123,
34,
108,
111,
99,
107,
101,
100,
83,
97,
102,
101,
116,
121,
77,
111,
100,
101,
34,
58,
102,
97,
108,
115,
101,
125,
125,
44,
34,
118,
105,
100,
101,
111,
73,
100,
34,
58,
34,
73,
78,
86,
65,
76,
73,
68,
95,
73,
68,
95,
34,
125
],
"localization": {
"languageCode": "en",
"countryCode": "GB"
@ -193,33 +17,45 @@
"responseMessage": "",
"responseHeaders": {
"alt-svc": [
"h3\u003d\":443\"; ma\u003d2592000,h3-29\u003d\":443\"; ma\u003d2592000,h3-T051\u003d\":443\"; ma\u003d2592000,h3-Q050\u003d\":443\"; ma\u003d2592000,h3-Q046\u003d\":443\"; ma\u003d2592000,h3-Q043\u003d\":443\"; ma\u003d2592000,quic\u003d\":443\"; ma\u003d2592000; v\u003d\"46,43\""
"h3\u003d\":443\"; ma\u003d2592000,h3-29\u003d\":443\"; ma\u003d2592000,h3-Q050\u003d\":443\"; ma\u003d2592000,h3-Q046\u003d\":443\"; ma\u003d2592000,h3-Q043\u003d\":443\"; ma\u003d2592000,quic\u003d\":443\"; ma\u003d2592000; v\u003d\"46,43\""
],
"cache-control": [
"private"
"private, max-age\u003d0"
],
"content-type": [
"application/json; charset\u003dUTF-8"
"text/javascript; charset\u003dutf-8"
],
"cross-origin-opener-policy-report-only": [
"same-origin; report-to\u003d\"ATmXEA_aXV-idIZ-e5x1JSbJUg8hfAx2dSl3lQ\""
],
"cross-origin-resource-policy": [
"cross-origin"
],
"date": [
"Fri, 30 Jul 2021 17:07:03 GMT"
"Mon, 27 Dec 2021 16:06:44 GMT"
],
"expires": [
"Fri, 30 Jul 2021 17:07:03 GMT"
"Mon, 27 Dec 2021 16:06:44 GMT"
],
"p3p": [
"CP\u003d\"This is not a P3P policy! See g.co/p3phelp for more info.\""
"CP\u003d\"This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl\u003den-GB for more info.\""
],
"permissions-policy": [
"ch-ua-arch\u003d*, ch-ua-bitness\u003d*, ch-ua-full-version\u003d*, ch-ua-model\u003d*, ch-ua-platform\u003d*, ch-ua-platform-version\u003d*"
],
"report-to": [
"{\"group\":\"ATmXEA_aXV-idIZ-e5x1JSbJUg8hfAx2dSl3lQ\",\"max_age\":2592000,\"endpoints\":[{\"url\":\"https://csp.withgoogle.com/csp/report-to/encsid_ATmXEA_aXV-idIZ-e5x1JSbJUg8hfAx2dSl3lQ\"}]}"
],
"server": [
"ESF"
],
"set-cookie": [
"CONSENT\u003dPENDING+683; expires\u003dFri, 01-Jan-2038 00:00:00 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"YSC\u003dKZT0YDZfDrY; Domain\u003d.youtube.com; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"VISITOR_INFO1_LIVE\u003dh6lqAE2Cbgo; Domain\u003d.youtube.com; Expires\u003dSat, 25-Jun-2022 16:06:44 GMT; Path\u003d/; Secure; HttpOnly; SameSite\u003dnone",
"CONSENT\u003dPENDING+570; expires\u003dWed, 27-Dec-2023 16:06:44 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"vary": [
"Origin",
"X-Origin",
"Referer"
"strict-transport-security": [
"max-age\u003d31536000"
],
"x-content-type-options": [
"nosniff"
@ -231,7 +67,7 @@
"0"
]
},
"responseBody": "{\n \"responseContext\": {\n \"visitorData\": \"Cgs5dHI5TkJaN0ZkOCi345CIBg%3D%3D\",\n \"serviceTrackingParams\": [\n {\n \"service\": \"GFEEDBACK\",\n \"params\": [\n {\n \"key\": \"is_viewed_live\",\n \"value\": \"False\"\n },\n {\n \"key\": \"logged_in\",\n \"value\": \"0\"\n },\n {\n \"key\": \"e\",\n \"value\": \"24057238,23996512,24045411,24036948,23748147,9453589,24070942,23944779,24045469,23940237,23983296,23975058,24064096,24049820,24058128,24050503,24044772,23986026,24068842,24036237,24062579,23968386,24066707,1714254,24002922,23857949,24077373,24049571,23974595,24002025,24065632,24049573,23744176,24028143,24590539,24060921,24053866,24007246,24056275,23891344,24004644,23983813,24058812,24043240,23998056,24030040,24070035,24037583,24045470,24058380,23966208,24001373,9453588,24059521,24042870,24056264,23918597,23934970,23891346,24002022,24074166,23987907,23996830,23882502,23804281,23884386,24065724,24037794,24016285,23946420,24076879\"\n }\n ]\n },\n {\n \"service\": \"CSI\",\n \"params\": [\n {\n \"key\": \"c\",\n \"value\": \"WEB\"\n },\n {\n \"key\": \"cver\",\n \"value\": \"2.20210728.00.00\"\n },\n {\n \"key\": \"yt_li\",\n \"value\": \"0\"\n },\n {\n \"key\": \"GetPlayer_rid\",\n \"value\": \"0xc3b20fae4d257c49\"\n }\n ]\n },\n {\n \"service\": \"GUIDED_HELP\",\n \"params\": [\n {\n \"key\": \"logged_in\",\n \"value\": \"0\"\n }\n ]\n },\n {\n \"service\": \"ECATCHER\",\n \"params\": [\n {\n \"key\": \"client.version\",\n \"value\": \"2.20210728\"\n },\n {\n \"key\": \"client.name\",\n \"value\": \"WEB\"\n }\n ]\n }\n ],\n \"mainAppWebResponseContext\": {\n \"loggedOut\": true\n },\n \"webResponseContextExtensionData\": {\n \"hasDecorated\": true\n }\n },\n \"trackingParams\": \"CAAQu2kiEwjMoID9o4vyAhUsEfEFHSf4AIc\u003d\",\n \"playabilityStatus\": {\n \"status\": \"ERROR\",\n \"reason\": \"Video unavailable\",\n \"errorScreen\": {\n \"playerErrorMessageRenderer\": {\n \"reason\": {\n \"simpleText\": \"Video unavailable\"\n },\n \"thumbnail\": {\n \"thumbnails\": [\n {\n \"url\": \"//s.ytimg.com/yts/img/meh7-vflGevej7.png\",\n \"width\": 140,\n \"height\": 100\n }\n ]\n },\n \"icon\": {\n \"iconType\": \"ERROR_OUTLINE\"\n }\n }\n },\n \"contextParams\": \"Q0FBU0FnZ0E\u003d\"\n },\n \"frameworkUpdates\": {\n \"entityBatchUpdate\": {\n \"mutations\": [\n {\n \"entityKey\": \"Eg0KC0lOVkFMSURfSURfIPYBKAE%3D\",\n \"type\": \"ENTITY_MUTATION_TYPE_REPLACE\",\n \"payload\": {\n \"offlineabilityEntity\": {\n \"key\": \"Eg0KC0lOVkFMSURfSURfIPYBKAE%3D\",\n \"accessState\": \"OFFLINEABILITY_FEATURE_ACCESS_STATE_UNKNOWN\"\n }\n }\n }\n ],\n \"timestamp\": {\n \"seconds\": \"1627664823\",\n \"nanos\": 625250794\n }\n }\n }\n}\n",
"latestUrl": "https://www.youtube.com/youtubei/v1/player?key\u003dAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8"
"responseBody": "var scriptUrl \u003d \u0027https:\\/\\/www.youtube.com\\/s\\/player\\/8da38e9a\\/www-widgetapi.vflset\\/www-widgetapi.js\u0027;try{var ttPolicy\u003dwindow.trustedTypes.createPolicy(\"youtube-widget-api\",{createScriptURL:function(x){return x}});scriptUrl\u003dttPolicy.createScriptURL(scriptUrl)}catch(e){}if(!window[\"YT\"])var YT\u003d{loading:0,loaded:0};if(!window[\"YTConfig\"])var YTConfig\u003d{\"host\":\"https://www.youtube.com\"};\nif(!YT.loading){YT.loading\u003d1;(function(){var l\u003d[];YT.ready\u003dfunction(f){if(YT.loaded)f();else l.push(f)};window.onYTReady\u003dfunction(){YT.loaded\u003d1;for(var i\u003d0;i\u003cl.length;i++)try{l[i]()}catch(e$0){}};YT.setConfig\u003dfunction(c){for(var k in c)if(c.hasOwnProperty(k))YTConfig[k]\u003dc[k]};var a\u003ddocument.createElement(\"script\");a.type\u003d\"text/javascript\";a.id\u003d\"www-widgetapi-script\";a.src\u003dscriptUrl;a.async\u003dtrue;var c\u003ddocument.currentScript;if(c){var n\u003dc.nonce||c.getAttribute(\"nonce\");if(n)a.setAttribute(\"nonce\",n)}var b\u003d\ndocument.getElementsByTagName(\"script\")[0];b.parentNode.insertBefore(a,b)})()};\n",
"latestUrl": "https://www.youtube.com/iframe_api"
}
}

View File

@ -1,16 +1,22 @@
{
"request": {
"httpMethod": "POST",
"url": "https://youtubei.googleapis.com/youtubei/v1/player?key\u003dAIzaSyA8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39w",
"url": "https://www.youtube.com/youtubei/v1/player?key\u003dAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8",
"headers": {
"Accept-Language": [
"en-GB, en;q\u003d0.9"
],
"User-Agent": [
"com.google.android.youtube/16.29.38Linux; U; Android 11; GB) gzip"
"Origin": [
"https://www.youtube.com"
],
"x-goog-api-format-version": [
"2"
"X-YouTube-Client-Name": [
"1"
],
"Referer": [
"https://www.youtube.com"
],
"X-YouTube-Client-Version": [
"2.20210728.00.00"
],
"Content-Type": [
"application/json"
@ -19,6 +25,82 @@
"dataToSend": [
123,
34,
112,
108,
97,
121,
98,
97,
99,
107,
67,
111,
110,
116,
101,
120,
116,
34,
58,
123,
34,
99,
111,
110,
116,
101,
110,
116,
80,
108,
97,
121,
98,
97,
99,
107,
67,
111,
110,
116,
101,
120,
116,
34,
58,
123,
34,
115,
105,
103,
110,
97,
116,
117,
114,
101,
84,
105,
109,
101,
115,
116,
97,
109,
112,
34,
58,
34,
49,
56,
57,
55,
56,
34,
125,
125,
44,
34,
99,
111,
110,
@ -30,78 +112,6 @@
58,
123,
34,
116,
104,
105,
114,
100,
80,
97,
114,
116,
121,
34,
58,
123,
34,
101,
109,
98,
101,
100,
85,
114,
108,
34,
58,
34,
104,
116,
116,
112,
115,
58,
47,
47,
119,
119,
119,
46,
121,
111,
117,
116,
117,
98,
101,
46,
99,
111,
109,
47,
119,
97,
116,
99,
104,
63,
118,
61,
56,
86,
97,
106,
116,
114,
69,
83,
74,
122,
65,
34,
125,
44,
34,
99,
108,
105,
@ -125,29 +135,6 @@
34,
44,
34,
99,
108,
105,
101,
110,
116,
78,
97,
109,
101,
34,
58,
34,
65,
78,
68,
82,
79,
73,
68,
34,
44,
34,
103,
108,
34,
@ -164,20 +151,16 @@
101,
110,
116,
83,
99,
114,
78,
97,
109,
101,
101,
110,
34,
58,
34,
87,
69,
77,
66,
69,
68,
34,
44,
34,
@ -197,14 +180,22 @@
34,
58,
34,
49,
54,
50,
46,
50,
57,
46,
51,
48,
50,
49,
48,
55,
50,
56,
46,
48,
48,
46,
48,
48,
34,
125,
44,
@ -254,17 +245,17 @@
34,
58,
34,
56,
86,
97,
106,
100,
111,
110,
45,
116,
45,
101,
120,
105,
115,
116,
114,
69,
83,
74,
122,
65,
34,
125
],
@ -278,7 +269,7 @@
"responseMessage": "",
"responseHeaders": {
"alt-svc": [
"h3\u003d\":443\"; ma\u003d2592000,h3-29\u003d\":443\"; ma\u003d2592000,h3-T051\u003d\":443\"; ma\u003d2592000,h3-Q050\u003d\":443\"; ma\u003d2592000,h3-Q046\u003d\":443\"; ma\u003d2592000,h3-Q043\u003d\":443\"; ma\u003d2592000,quic\u003d\":443\"; ma\u003d2592000; v\u003d\"46,43\""
"h3\u003d\":443\"; ma\u003d2592000,h3-29\u003d\":443\"; ma\u003d2592000,h3-Q050\u003d\":443\"; ma\u003d2592000,h3-Q046\u003d\":443\"; ma\u003d2592000,h3-Q043\u003d\":443\"; ma\u003d2592000,quic\u003d\":443\"; ma\u003d2592000; v\u003d\"46,43\""
],
"cache-control": [
"private"
@ -287,10 +278,10 @@
"application/json; charset\u003dUTF-8"
],
"date": [
"Fri, 30 Jul 2021 17:07:06 GMT"
"Mon, 27 Dec 2021 16:06:47 GMT"
],
"expires": [
"Fri, 30 Jul 2021 17:07:06 GMT"
"Mon, 27 Dec 2021 16:06:47 GMT"
],
"p3p": [
"CP\u003d\"This is not a P3P policy! See g.co/p3phelp for more info.\""
@ -299,7 +290,7 @@
"ESF"
],
"set-cookie": [
"CONSENT\u003dPENDING+241; expires\u003dFri, 01-Jan-2038 00:00:00 GMT; path\u003d/; domain\u003d.googleapis.com; Secure"
"CONSENT\u003dPENDING+161; expires\u003dWed, 27-Dec-2023 16:06:47 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"vary": [
"Origin",
@ -316,7 +307,7 @@
"0"
]
},
"responseBody": "{\n \"responseContext\": {\n \"visitorData\": \"CgtsNWhSRGgzOWZaZyi645CIBg%3D%3D\",\n \"serviceTrackingParams\": [\n {\n \"service\": \"GFEEDBACK\",\n \"params\": [\n {\n \"key\": \"is_viewed_live\",\n \"value\": \"False\"\n },\n {\n \"key\": \"logged_in\",\n \"value\": \"0\"\n },\n {\n \"key\": \"e\",\n \"value\": \"24057238,24043232,24045411,23983814,24043023,24070036,24070942,23944779,24068017,24044110,23983296,24070189,24065253,24067360,23968386,24050503,24049820,24058128,24068842,24060091,23996512,23857949,24075814,24049571,24068431,24060921,23974595,24076880,24049573,1714247,24064582,23744176,24028143,24027395,24046762,24024948,24007246,24053866,24036236,24056275,24054937,23891344,24004644,24058812,24036947,23998056,24030040,23970385,23966208,23735348,24058380,24001373,24054345,23918597,24056264,24061714,24059521,24065726,23891346,23934970,23940238,24042870,23996830,24063124,24063663,23884386,23882502,23990876,24021124,24016285,24037794,23946420,24032314,24000751,24071155\"\n }\n ]\n },\n {\n \"service\": \"CSI\",\n \"params\": [\n {\n \"key\": \"c\",\n \"value\": \"ANDROID\"\n },\n {\n \"key\": \"cver\",\n \"value\": \"16.29.38\"\n },\n {\n \"key\": \"yt_li\",\n \"value\": \"0\"\n },\n {\n \"key\": \"GetPlayer_rid\",\n \"value\": \"0x29c50e9e9c43cc11\"\n }\n ]\n },\n {\n \"service\": \"GUIDED_HELP\",\n \"params\": [\n {\n \"key\": \"logged_in\",\n \"value\": \"0\"\n }\n ]\n },\n {\n \"service\": \"ECATCHER\",\n \"params\": [\n {\n \"key\": \"client.version\",\n \"value\": \"16.29\"\n },\n {\n \"key\": \"client.name\",\n \"value\": \"ANDROID\"\n }\n ]\n },\n {\n \"service\": \"LISTNR\",\n \"params\": [\n {\n \"key\": \"e\",\n \"value\": \"24050503,24043023,23996830,24054345,24036947,24037785,24058380,24033252,24075814,24024517,24046762,24056074,24065253,24017183,24037284,24049820,24064582,24031773,24030282\"\n }\n ]\n },\n {\n \"service\": \"SUGGEST\",\n \"params\": [\n {\n \"key\": \"sugexp\",\n \"value\": \"ytmct_c,ytpo.bo.me\u003d0,ytposo.bo.me\u003d0,ytpso.bo.me\u003d0,ytpsoso.bo.me\u003d0,cfro\u003d1,ytpo.bo.me\u003d1,ytposo.bo.me\u003d1,ytpso.bo.me\u003d1,ytpsoso.bo.me\u003d1,ytmo.uic\u003d1\"\n }\n ]\n }\n ]\n },\n \"trackingParams\": \"CAAQu2kiEwie-7H-o4vyAhWTEPEFHT68DIY\u003d\",\n \"playabilityStatus\": {\n \"status\": \"LOGIN_REQUIRED\",\n \"reason\": \"This video is private.\",\n \"messages\": [\n \"This is a private video. Please sign in to verify that you may see it.\"\n ],\n \"errorScreen\": {\n \"playerErrorMessageRenderer\": {\n \"subreason\": {\n \"runs\": [\n {\n \"text\": \"If the owner of this video has granted you access, please \"\n },\n {\n \"text\": \"sign in\",\n \"navigationEndpoint\": {\n \"clickTrackingParams\": \"CAAQu2kiEwie-7H-o4vyAhWTEPEFHT68DIYyDXByaXZhdGVfdmlkZW8\u003d\",\n \"signInEndpoint\": {\n \"nextEndpoint\": {\n \"clickTrackingParams\": \"CAAQu2kiEwie-7H-o4vyAhWTEPEFHT68DIY\u003d\",\n \"urlEndpoint\": {\n \"url\": \"\"\n }\n }\n }\n }\n },\n {\n \"text\": \".\"\n }\n ]\n }\n }\n },\n \"contextParams\": \"Q0FBU0FnZ0E\u003d\"\n },\n \"playerSettingsMenuData\": {\n \"loggingDirectives\": {\n \"trackingParams\": \"CAEQtc4GIhMInvux_qOL8gIVkxDxBR0-vAyG\",\n \"visibility\": {\n \"types\": \"12\"\n }\n }\n },\n \"frameworkUpdates\": {\n \"entityBatchUpdate\": {\n \"mutations\": [\n {\n \"entityKey\": \"Eg0KCzhWYWp0ckVTSnpBIPYBKAE%3D\",\n \"type\": \"ENTITY_MUTATION_TYPE_REPLACE\",\n \"payload\": {\n \"offlineabilityEntity\": {\n \"key\": \"Eg0KCzhWYWp0ckVTSnpBIPYBKAE%3D\",\n \"accessState\": \"OFFLINEABILITY_FEATURE_ACCESS_STATE_UNKNOWN\"\n }\n }\n }\n ],\n \"timestamp\": {\n \"seconds\": \"1627664826\",\n \"nanos\": 557066370\n }\n }\n }\n}\n",
"latestUrl": "https://youtubei.googleapis.com/youtubei/v1/player?key\u003dAIzaSyA8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39w"
"responseBody": "{\n \"responseContext\": {\n \"visitorData\": \"Cgt3ckhBV1BwOEVRRSiXyaeOBg%3D%3D\",\n \"serviceTrackingParams\": [\n {\n \"service\": \"GFEEDBACK\",\n \"params\": [\n {\n \"key\": \"is_viewed_live\",\n \"value\": \"False\"\n },\n {\n \"key\": \"logged_in\",\n \"value\": \"0\"\n },\n {\n \"key\": \"e\",\n \"value\": \"24117475,24082661,24036947,24131028,24058380,24077241,24007246,24142941,24145062,24131151,23934970,23998056,24004644,24146460,24104858,24129402,24111165,24001373,24080738,23884386,24034168,23882502,24116717,23858057,23966208,24142470,24002022,24067629,24146886,24106839,24007790,24131296,24135236,24143789,23804281,23885487,24120819,23918597,9407156,24085811,24110902,23946420,24115641,24148484,39321475,24145516,24002025,24109689,24116735,23983296,24126016,24141079,23735347,23944779,24150973,24140247,24138442,23968386,24147474,24134152,24028143,23986024,24077266,24084439,1714245,24144448,23744176,24002922,23795882,24143428,24142961,23748146\"\n }\n ]\n },\n {\n \"service\": \"CSI\",\n \"params\": [\n {\n \"key\": \"c\",\n \"value\": \"WEB\"\n },\n {\n \"key\": \"cver\",\n \"value\": \"2.20210728.00.00\"\n },\n {\n \"key\": \"yt_li\",\n \"value\": \"0\"\n },\n {\n \"key\": \"GetPlayer_rid\",\n \"value\": \"0x7c666bc7f580224e\"\n }\n ]\n },\n {\n \"service\": \"GUIDED_HELP\",\n \"params\": [\n {\n \"key\": \"logged_in\",\n \"value\": \"0\"\n }\n ]\n },\n {\n \"service\": \"ECATCHER\",\n \"params\": [\n {\n \"key\": \"client.version\",\n \"value\": \"2.20211103\"\n },\n {\n \"key\": \"client.name\",\n \"value\": \"WEB\"\n },\n {\n \"key\": \"client.fexp\",\n \"value\": \"24117475,24082661,24036947,24131028,24058380,24077241,24007246,24142941,24145062,24131151,23934970,23998056,24004644,24146460,24104858,24129402,24111165,24001373,24080738,23884386,24034168,23882502,24116717,23858057,23966208,24142470,24002022,24067629,24146886,24106839,24007790,24131296,24135236,24143789,23804281,23885487,24120819,23918597,9407156,24085811,24110902,23946420,24115641,24148484,39321475,24145516,24002025,24109689,24116735,23983296,24126016,24141079,23735347,23944779,24150973,24140247,24138442,23968386,24147474,24134152,24028143,23986024,24077266,24084439,1714245,24144448,23744176,24002922,23795882,24143428,24142961,23748146\"\n }\n ]\n }\n ],\n \"mainAppWebResponseContext\": {\n \"loggedOut\": true\n },\n \"webResponseContextExtensionData\": {\n \"hasDecorated\": true\n }\n },\n \"trackingParams\": \"CAAQu2kiEwiqrJWiroT1AhWL61EKHbJnB5U\u003d\",\n \"playabilityStatus\": {\n \"status\": \"ERROR\",\n \"reason\": \"Video unavailable\",\n \"errorScreen\": {\n \"playerErrorMessageRenderer\": {\n \"reason\": {\n \"simpleText\": \"Video unavailable\"\n },\n \"thumbnail\": {\n \"thumbnails\": [\n {\n \"url\": \"//s.ytimg.com/yts/img/meh7-vflGevej7.png\",\n \"width\": 140,\n \"height\": 100\n }\n ]\n },\n \"icon\": {\n \"iconType\": \"ERROR_OUTLINE\"\n }\n }\n },\n \"contextParams\": \"Q0FBU0FnZ0E\u003d\"\n },\n \"frameworkUpdates\": {\n \"entityBatchUpdate\": {\n \"mutations\": [\n {\n \"entityKey\": \"Eg0KC2Rvbi10LWV4aXN0IPYBKAE%3D\",\n \"type\": \"ENTITY_MUTATION_TYPE_REPLACE\",\n \"payload\": {\n \"offlineabilityEntity\": {\n \"key\": \"Eg0KC2Rvbi10LWV4aXN0IPYBKAE%3D\",\n \"accessState\": \"OFFLINEABILITY_FEATURE_ACCESS_STATE_UNKNOWN\",\n \"addToOfflineButtonState\": \"ADD_TO_OFFLINE_BUTTON_STATE_UNKNOWN\"\n }\n }\n }\n ],\n \"timestamp\": {\n \"seconds\": \"1640621207\",\n \"nanos\": 285203883\n }\n }\n }\n}\n",
"latestUrl": "https://www.youtube.com/youtubei/v1/player?key\u003dAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8"
}
}

View File

@ -93,9 +93,9 @@
34,
49,
56,
56,
51,
57,
55,
56,
34,
125,
125,
@ -112,6 +112,78 @@
58,
123,
34,
116,
104,
105,
114,
100,
80,
97,
114,
116,
121,
34,
58,
123,
34,
101,
109,
98,
101,
100,
85,
114,
108,
34,
58,
34,
104,
116,
116,
112,
115,
58,
47,
47,
119,
119,
119,
46,
121,
111,
117,
116,
117,
98,
101,
46,
99,
111,
109,
47,
119,
97,
116,
99,
104,
63,
118,
61,
100,
111,
110,
45,
116,
45,
101,
120,
105,
115,
116,
34,
125,
44,
34,
99,
108,
105,
@ -170,6 +242,29 @@
101,
110,
116,
83,
99,
114,
101,
101,
110,
34,
58,
34,
69,
77,
66,
69,
68,
34,
44,
34,
99,
108,
105,
101,
110,
116,
86,
101,
114,
@ -269,7 +364,7 @@
"responseMessage": "",
"responseHeaders": {
"alt-svc": [
"h3\u003d\":443\"; ma\u003d2592000,h3-29\u003d\":443\"; ma\u003d2592000,h3-T051\u003d\":443\"; ma\u003d2592000,h3-Q050\u003d\":443\"; ma\u003d2592000,h3-Q046\u003d\":443\"; ma\u003d2592000,h3-Q043\u003d\":443\"; ma\u003d2592000,quic\u003d\":443\"; ma\u003d2592000; v\u003d\"46,43\""
"h3\u003d\":443\"; ma\u003d2592000,h3-29\u003d\":443\"; ma\u003d2592000,h3-Q050\u003d\":443\"; ma\u003d2592000,h3-Q046\u003d\":443\"; ma\u003d2592000,h3-Q043\u003d\":443\"; ma\u003d2592000,quic\u003d\":443\"; ma\u003d2592000; v\u003d\"46,43\""
],
"cache-control": [
"private"
@ -278,10 +373,10 @@
"application/json; charset\u003dUTF-8"
],
"date": [
"Fri, 30 Jul 2021 17:07:06 GMT"
"Mon, 27 Dec 2021 16:06:47 GMT"
],
"expires": [
"Fri, 30 Jul 2021 17:07:06 GMT"
"Mon, 27 Dec 2021 16:06:47 GMT"
],
"p3p": [
"CP\u003d\"This is not a P3P policy! See g.co/p3phelp for more info.\""
@ -290,7 +385,7 @@
"ESF"
],
"set-cookie": [
"CONSENT\u003dPENDING+343; expires\u003dFri, 01-Jan-2038 00:00:00 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"CONSENT\u003dPENDING+780; expires\u003dWed, 27-Dec-2023 16:06:47 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
],
"vary": [
"Origin",
@ -307,7 +402,7 @@
"0"
]
},
"responseBody": "{\n \"responseContext\": {\n \"visitorData\": \"CgtScV9obUx4ODBjOCi645CIBg%3D%3D\",\n \"serviceTrackingParams\": [\n {\n \"service\": \"GFEEDBACK\",\n \"params\": [\n {\n \"key\": \"is_viewed_live\",\n \"value\": \"False\"\n },\n {\n \"key\": \"logged_in\",\n \"value\": \"0\"\n },\n {\n \"key\": \"e\",\n \"value\": \"24068842,24070036,24058380,23744176,23748146,24070279,23974595,24076879,24049571,23934970,23996830,24002022,24030040,23857950,24049573,24056275,1714253,24053866,24058812,24036237,23946420,24001373,23986016,23804281,23968386,24066623,23882502,24078033,24004644,9453586,23998056,24049820,24059521,24050503,23918597,24056264,24045411,24063598,24007246,24062579,24037794,24058128,9453587,24002025,24002922,23891346,23884386,24042870,24039151,23944779,23983296,24016284,24057238,23983814,24065176,9407157,23966208,24028143,23996512,24060921,9466591,24036947,24043240,23891344\"\n }\n ]\n },\n {\n \"service\": \"CSI\",\n \"params\": [\n {\n \"key\": \"c\",\n \"value\": \"WEB\"\n },\n {\n \"key\": \"cver\",\n \"value\": \"2.20210728.00.00\"\n },\n {\n \"key\": \"yt_li\",\n \"value\": \"0\"\n },\n {\n \"key\": \"GetPlayer_rid\",\n \"value\": \"0xa971253474c3e88f\"\n }\n ]\n },\n {\n \"service\": \"GUIDED_HELP\",\n \"params\": [\n {\n \"key\": \"logged_in\",\n \"value\": \"0\"\n }\n ]\n },\n {\n \"service\": \"ECATCHER\",\n \"params\": [\n {\n \"key\": \"client.version\",\n \"value\": \"2.20210728\"\n },\n {\n \"key\": \"client.name\",\n \"value\": \"WEB\"\n }\n ]\n }\n ],\n \"mainAppWebResponseContext\": {\n \"loggedOut\": true\n },\n \"webResponseContextExtensionData\": {\n \"hasDecorated\": true\n }\n },\n \"trackingParams\": \"CAAQu2kiEwit1rb-o4vyAhUFJ0wKHduEBZM\u003d\",\n \"playabilityStatus\": {\n \"status\": \"ERROR\",\n \"reason\": \"Video unavailable\",\n \"errorScreen\": {\n \"playerErrorMessageRenderer\": {\n \"reason\": {\n \"simpleText\": \"Video unavailable\"\n },\n \"thumbnail\": {\n \"thumbnails\": [\n {\n \"url\": \"//s.ytimg.com/yts/img/meh7-vflGevej7.png\",\n \"width\": 140,\n \"height\": 100\n }\n ]\n },\n \"icon\": {\n \"iconType\": \"ERROR_OUTLINE\"\n }\n }\n },\n \"contextParams\": \"Q0FBU0FnZ0E\u003d\"\n },\n \"frameworkUpdates\": {\n \"entityBatchUpdate\": {\n \"mutations\": [\n {\n \"entityKey\": \"Eg0KC2Rvbi10LWV4aXN0IPYBKAE%3D\",\n \"type\": \"ENTITY_MUTATION_TYPE_REPLACE\",\n \"payload\": {\n \"offlineabilityEntity\": {\n \"key\": \"Eg0KC2Rvbi10LWV4aXN0IPYBKAE%3D\",\n \"accessState\": \"OFFLINEABILITY_FEATURE_ACCESS_STATE_UNKNOWN\"\n }\n }\n }\n ],\n \"timestamp\": {\n \"seconds\": \"1627664826\",\n \"nanos\": 620707341\n }\n }\n }\n}\n",
"responseBody": "{\n \"responseContext\": {\n \"visitorData\": \"Cgt6ZmdwLVdzOEROQSiXyaeOBg%3D%3D\",\n \"serviceTrackingParams\": [\n {\n \"service\": \"GFEEDBACK\",\n \"params\": [\n {\n \"key\": \"is_viewed_live\",\n \"value\": \"False\"\n },\n {\n \"key\": \"logged_in\",\n \"value\": \"0\"\n },\n {\n \"key\": \"e\",\n \"value\": \"1714257,23882502,24111165,24004644,24104858,24148481,23946420,24001373,23804281,24120820,24007246,24142941,24091242,23998056,24077241,24094608,24129501,24134152,24115066,24045475,24085811,24082661,24002923,9405988,24115641,24106839,24141079,24007790,23934970,24110902,24143789,24108447,24142470,24140247,23884386,24034168,24080738,23966208,24138442,24147469,24002022,24116717,23983296,24146886,23858057,24028143,23968386,24131152,24148127,24135236,24084439,24045476,24117476,24002025,24036948,24109689,23918597,24145063,24145516,39321475,24062267,24116735,24143428,23744176,24127639,23986027,24129402,24053418,24077266,24058380,23944779\"\n }\n ]\n },\n {\n \"service\": \"CSI\",\n \"params\": [\n {\n \"key\": \"c\",\n \"value\": \"WEB\"\n },\n {\n \"key\": \"cver\",\n \"value\": \"2.20210728.00.00\"\n },\n {\n \"key\": \"yt_li\",\n \"value\": \"0\"\n },\n {\n \"key\": \"GetPlayer_rid\",\n \"value\": \"0xad7f8756a25db65b\"\n }\n ]\n },\n {\n \"service\": \"GUIDED_HELP\",\n \"params\": [\n {\n \"key\": \"logged_in\",\n \"value\": \"0\"\n }\n ]\n },\n {\n \"service\": \"ECATCHER\",\n \"params\": [\n {\n \"key\": \"client.version\",\n \"value\": \"2.20211103\"\n },\n {\n \"key\": \"client.name\",\n \"value\": \"WEB\"\n },\n {\n \"key\": \"client.fexp\",\n \"value\": \"1714257,23882502,24111165,24004644,24104858,24148481,23946420,24001373,23804281,24120820,24007246,24142941,24091242,23998056,24077241,24094608,24129501,24134152,24115066,24045475,24085811,24082661,24002923,9405988,24115641,24106839,24141079,24007790,23934970,24110902,24143789,24108447,24142470,24140247,23884386,24034168,24080738,23966208,24138442,24147469,24002022,24116717,23983296,24146886,23858057,24028143,23968386,24131152,24148127,24135236,24084439,24045476,24117476,24002025,24036948,24109689,23918597,24145063,24145516,39321475,24062267,24116735,24143428,23744176,24127639,23986027,24129402,24053418,24077266,24058380,23944779\"\n }\n ]\n }\n ],\n \"mainAppWebResponseContext\": {\n \"loggedOut\": true\n },\n \"webResponseContextExtensionData\": {\n \"hasDecorated\": true\n }\n },\n \"trackingParams\": \"CAAQu2kiEwjwj5qiroT1AhXp1BEIHaEwD5A\u003d\",\n \"playabilityStatus\": {\n \"status\": \"ERROR\",\n \"reason\": \"Video unavailable\",\n \"errorScreen\": {\n \"playerErrorMessageRenderer\": {\n \"subreason\": {\n \"simpleText\": \"This video is unavailable\"\n },\n \"reason\": {\n \"simpleText\": \"Video unavailable\"\n },\n \"thumbnail\": {\n \"thumbnails\": [\n {\n \"url\": \"//s.ytimg.com/yts/img/meh7-vflGevej7.png\",\n \"width\": 140,\n \"height\": 100\n }\n ]\n },\n \"icon\": {\n \"iconType\": \"ERROR_OUTLINE\"\n }\n }\n },\n \"contextParams\": \"Q0FBU0FnZ0E\u003d\"\n },\n \"frameworkUpdates\": {\n \"entityBatchUpdate\": {\n \"mutations\": [\n {\n \"entityKey\": \"Eg0KC2Rvbi10LWV4aXN0IPYBKAE%3D\",\n \"type\": \"ENTITY_MUTATION_TYPE_REPLACE\",\n \"payload\": {\n \"offlineabilityEntity\": {\n \"key\": \"Eg0KC2Rvbi10LWV4aXN0IPYBKAE%3D\",\n \"accessState\": \"OFFLINEABILITY_FEATURE_ACCESS_STATE_UNKNOWN\",\n \"addToOfflineButtonState\": \"ADD_TO_OFFLINE_BUTTON_STATE_UNKNOWN\"\n }\n }\n }\n ],\n \"timestamp\": {\n \"seconds\": \"1640621207\",\n \"nanos\": 369473633\n }\n }\n }\n}\n",
"latestUrl": "https://www.youtube.com/youtubei/v1/player?key\u003dAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8"
}
}

View File

@ -1,22 +1,16 @@
{
"request": {
"httpMethod": "POST",
"url": "https://www.youtube.com/youtubei/v1/player?key\u003dAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8",
"url": "https://youtubei.googleapis.com/youtubei/v1/player?key\u003dAIzaSyA8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39w",
"headers": {
"Accept-Language": [
"en-GB, en;q\u003d0.9"
],
"Origin": [
"https://www.youtube.com"
"User-Agent": [
"com.google.android.youtube/16.29.38Linux; U; Android 11; GB) gzip"
],
"X-YouTube-Client-Name": [
"1"
],
"Referer": [
"https://www.youtube.com"
],
"X-YouTube-Client-Version": [
"2.20210728.00.00"
"x-goog-api-format-version": [
"2"
],
"Content-Type": [
"application/json"
@ -25,82 +19,6 @@
"dataToSend": [
123,
34,
112,
108,
97,
121,
98,
97,
99,
107,
67,
111,
110,
116,
101,
120,
116,
34,
58,
123,
34,
99,
111,
110,
116,
101,
110,
116,
80,
108,
97,
121,
98,
97,
99,
107,
67,
111,
110,
116,
101,
120,
116,
34,
58,
123,
34,
115,
105,
103,
110,
97,
116,
117,
114,
101,
84,
105,
109,
101,
115,
116,
97,
109,
112,
34,
58,
34,
49,
56,
56,
51,
55,
34,
125,
125,
44,
34,
99,
111,
110,
@ -207,16 +125,6 @@
34,
44,
34,
103,
108,
34,
58,
34,
71,
66,
34,
44,
34,
99,
108,
105,
@ -230,8 +138,22 @@
34,
58,
34,
87,
69,
65,
78,
68,
82,
79,
73,
68,
34,
44,
34,
103,
108,
34,
58,
34,
71,
66,
34,
44,
@ -275,22 +197,14 @@
34,
58,
34,
50,
46,
50,
48,
50,
49,
48,
55,
54,
46,
50,
57,
46,
51,
56,
46,
48,
48,
46,
48,
48,
34,
125,
44,
@ -364,7 +278,7 @@
"responseMessage": "",
"responseHeaders": {
"alt-svc": [
"h3\u003d\":443\"; ma\u003d2592000,h3-29\u003d\":443\"; ma\u003d2592000,h3-T051\u003d\":443\"; ma\u003d2592000,h3-Q050\u003d\":443\"; ma\u003d2592000,h3-Q046\u003d\":443\"; ma\u003d2592000,h3-Q043\u003d\":443\"; ma\u003d2592000,quic\u003d\":443\"; ma\u003d2592000; v\u003d\"46,43\""
"h3\u003d\":443\"; ma\u003d2592000,h3-29\u003d\":443\"; ma\u003d2592000,h3-Q050\u003d\":443\"; ma\u003d2592000,h3-Q046\u003d\":443\"; ma\u003d2592000,h3-Q043\u003d\":443\"; ma\u003d2592000,quic\u003d\":443\"; ma\u003d2592000; v\u003d\"46,43\""
],
"cache-control": [
"private"
@ -373,10 +287,10 @@
"application/json; charset\u003dUTF-8"
],
"date": [
"Fri, 30 Jul 2021 17:07:05 GMT"
"Mon, 27 Dec 2021 16:06:46 GMT"
],
"expires": [
"Fri, 30 Jul 2021 17:07:05 GMT"
"Mon, 27 Dec 2021 16:06:46 GMT"
],
"p3p": [
"CP\u003d\"This is not a P3P policy! See g.co/p3phelp for more info.\""
@ -385,7 +299,7 @@
"ESF"
],
"set-cookie": [
"CONSENT\u003dPENDING+496; expires\u003dFri, 01-Jan-2038 00:00:00 GMT; path\u003d/; domain\u003d.youtube.com; Secure"
"CONSENT\u003dPENDING+945; expires\u003dWed, 27-Dec-2023 16:06:46 GMT; path\u003d/; domain\u003d.googleapis.com; Secure"
],
"vary": [
"Origin",
@ -402,7 +316,7 @@
"0"
]
},
"responseBody": "{\n \"responseContext\": {\n \"visitorData\": \"CgtfM3RCSC1ZUklfTSi545CIBg%3D%3D\",\n \"serviceTrackingParams\": [\n {\n \"service\": \"GFEEDBACK\",\n \"params\": [\n {\n \"key\": \"is_viewed_live\",\n \"value\": \"False\"\n },\n {\n \"key\": \"logged_in\",\n \"value\": \"0\"\n },\n {\n \"key\": \"e\",\n \"value\": \"9406010,24058128,23858057,24002022,24068860,23891346,24076877,23884386,23996830,24049820,24056264,24042870,24050503,24059521,23934970,23986030,23804281,23735347,24037794,23946420,24016285,23918597,24036236,24058812,24053866,24049573,24047617,24007246,24004644,24070035,23891344,24056275,23974595,23998056,24043240,24030040,24001373,24049571,23966208,24058380,24051037,23882503,24002922,24075254,23744176,24077375,24060921,24002025,23748146,24028143,24590539,23843508,23983296,24036948,24068842,24045411,23886230,24027681,24053419,23983814,23984878,24057238,23944779,1714256,23968386,24064096,23996512,24067276,23857948,23826896,23984488\"\n }\n ]\n },\n {\n \"service\": \"CSI\",\n \"params\": [\n {\n \"key\": \"c\",\n \"value\": \"WEB\"\n },\n {\n \"key\": \"cver\",\n \"value\": \"2.20210728.00.00\"\n },\n {\n \"key\": \"yt_li\",\n \"value\": \"0\"\n },\n {\n \"key\": \"GetPlayer_rid\",\n \"value\": \"0x6c4dc945102f13b6\"\n }\n ]\n },\n {\n \"service\": \"GUIDED_HELP\",\n \"params\": [\n {\n \"key\": \"logged_in\",\n \"value\": \"0\"\n }\n ]\n },\n {\n \"service\": \"ECATCHER\",\n \"params\": [\n {\n \"key\": \"client.version\",\n \"value\": \"2.20210728\"\n },\n {\n \"key\": \"client.name\",\n \"value\": \"WEB\"\n }\n ]\n }\n ],\n \"mainAppWebResponseContext\": {\n \"loggedOut\": true\n },\n \"webResponseContextExtensionData\": {\n \"hasDecorated\": true\n }\n },\n \"trackingParams\": \"CAAQu2kiEwipwvP9o4vyAhUF97QKHbsjDF4\u003d\",\n \"playabilityStatus\": {\n \"status\": \"ERROR\",\n \"reason\": \"Video unavailable\",\n \"errorScreen\": {\n \"playerErrorMessageRenderer\": {\n \"subreason\": {\n \"simpleText\": \"This video is unavailable.\"\n },\n \"reason\": {\n \"simpleText\": \"Video unavailable\"\n },\n \"thumbnail\": {\n \"thumbnails\": [\n {\n \"url\": \"//s.ytimg.com/yts/img/meh7-vflGevej7.png\",\n \"width\": 140,\n \"height\": 100\n }\n ]\n },\n \"icon\": {\n \"iconType\": \"ERROR_OUTLINE\"\n }\n }\n },\n \"contextParams\": \"Q0FBU0FnZ0E\u003d\"\n },\n \"frameworkUpdates\": {\n \"entityBatchUpdate\": {\n \"mutations\": [\n {\n \"entityKey\": \"Eg0KC0lOVkFMSURfSURfIPYBKAE%3D\",\n \"type\": \"ENTITY_MUTATION_TYPE_REPLACE\",\n \"payload\": {\n \"offlineabilityEntity\": {\n \"key\": \"Eg0KC0lOVkFMSURfSURfIPYBKAE%3D\",\n \"accessState\": \"OFFLINEABILITY_FEATURE_ACCESS_STATE_UNKNOWN\"\n }\n }\n }\n ],\n \"timestamp\": {\n \"seconds\": \"1627664825\",\n \"nanos\": 515823298\n }\n }\n }\n}\n",
"latestUrl": "https://www.youtube.com/youtubei/v1/player?key\u003dAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8"
"responseBody": "{\n \"responseContext\": {\n \"visitorData\": \"CgtJbWVMVC1mRHY2cyiWyaeOBg%3D%3D\",\n \"serviceTrackingParams\": [\n {\n \"service\": \"GFEEDBACK\",\n \"params\": [\n {\n \"key\": \"is_viewed_live\",\n \"value\": \"False\"\n },\n {\n \"key\": \"logged_in\",\n \"value\": \"0\"\n },\n {\n \"key\": \"e\",\n \"value\": \"24053418,24080738,24054345,24123943,24074379,24063124,24007790,24058380,23998056,24036947,24142941,23946420,23918597,24078649,24077241,24007246,24021124,23886486,24135236,23884386,24004644,23966208,24141866,23968386,24142470,24091230,24116717,24034978,23944779,24064556,24150973,24117475,24134152,24082662,23744176,24136747,24001373,24104858,24082169,1714243,24109690,23934970,24054937,24143789,24110902,24116735,24085811,39321475,24106839,24034168,24128155,24138442,24140247,24132532,24077266,23983296,24131029,24144387,24115641,24060091,23882503,24002922,24142961,24143428,24120820,24078457,24091243,23998873,24028143\"\n }\n ]\n },\n {\n \"service\": \"CSI\",\n \"params\": [\n {\n \"key\": \"c\",\n \"value\": \"ANDROID\"\n },\n {\n \"key\": \"cver\",\n \"value\": \"16.29.38\"\n },\n {\n \"key\": \"yt_li\",\n \"value\": \"0\"\n },\n {\n \"key\": \"GetPlayer_rid\",\n \"value\": \"0xa0ffc99a285c97f3\"\n }\n ]\n },\n {\n \"service\": \"GUIDED_HELP\",\n \"params\": [\n {\n \"key\": \"logged_in\",\n \"value\": \"0\"\n }\n ]\n },\n {\n \"service\": \"ECATCHER\",\n \"params\": [\n {\n \"key\": \"client.version\",\n \"value\": \"16.29\"\n },\n {\n \"key\": \"client.name\",\n \"value\": \"ANDROID\"\n },\n {\n \"key\": \"client.fexp\",\n \"value\": \"24053418,24080738,24054345,24123943,24074379,24063124,24007790,24058380,23998056,24036947,24142941,23946420,23918597,24078649,24077241,24007246,24021124,23886486,24135236,23884386,24004644,23966208,24141866,23968386,24142470,24091230,24116717,24034978,23944779,24064556,24150973,24117475,24134152,24082662,23744176,24136747,24001373,24104858,24082169,1714243,24109690,23934970,24054937,24143789,24110902,24116735,24085811,39321475,24106839,24034168,24128155,24138442,24140247,24132532,24077266,23983296,24131029,24144387,24115641,24060091,23882503,24002922,24142961,24143428,24120820,24078457,24091243,23998873,24028143\"\n }\n ]\n },\n {\n \"service\": \"LISTNR\",\n \"params\": [\n {\n \"key\": \"e\",\n \"value\": \"24054345,24142941,24036947,24109931,24116717,24116735,24110902,24033252,24082169,24134152,23998873,24104858,24106839,24150973,24037284,39321475,24085324,24074379,24117475,24064556,24024517,24132532,24058380,24115641,24140247,24143428,24138065,24142470,24030282,24109690\"\n }\n ]\n }\n ]\n },\n \"trackingParams\": \"CAAQu2kiEwiujtGhroT1AhV62REIHQcGAAI\u003d\",\n \"playabilityStatus\": {\n \"status\": \"ERROR\",\n \"reason\": \"This video is unavailable\",\n \"errorScreen\": {\n \"playerErrorMessageRenderer\": {\n \"reason\": {\n \"runs\": [\n {\n \"text\": \"This video is unavailable\"\n }\n ]\n },\n \"thumbnail\": {\n \"thumbnails\": [\n {\n \"url\": \"//s.ytimg.com/yts/img/meh7-vflGevej7.png\",\n \"width\": 140,\n \"height\": 100\n }\n ]\n }\n }\n },\n \"contextParams\": \"Q0FBU0FnZ0E\u003d\"\n },\n \"playerSettingsMenuData\": {\n \"loggingDirectives\": {\n \"trackingParams\": \"CAEQtc4GIhMIro7Roa6E9QIVetkRCB0HBgAC\",\n \"visibility\": {\n \"types\": \"12\"\n }\n }\n },\n \"frameworkUpdates\": {\n \"entityBatchUpdate\": {\n \"mutations\": [\n {\n \"entityKey\": \"Eg0KC0lOVkFMSURfSURfIPYBKAE%3D\",\n \"type\": \"ENTITY_MUTATION_TYPE_REPLACE\",\n \"payload\": {\n \"offlineabilityEntity\": {\n \"key\": \"Eg0KC0lOVkFMSURfSURfIPYBKAE%3D\",\n \"accessState\": \"OFFLINEABILITY_FEATURE_ACCESS_STATE_UNKNOWN\",\n \"addToOfflineButtonState\": \"ADD_TO_OFFLINE_BUTTON_STATE_UNKNOWN\"\n }\n }\n }\n ],\n \"timestamp\": {\n \"seconds\": \"1640621206\",\n \"nanos\": 162641190\n }\n }\n }\n}\n",
"latestUrl": "https://youtubei.googleapis.com/youtubei/v1/player?key\u003dAIzaSyA8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39w"
}
}