diff options
| author | Samantaz Fox <coding@samantaz.fr> | 2024-08-13 20:35:43 +0200 |
|---|---|---|
| committer | Samantaz Fox <coding@samantaz.fr> | 2024-08-13 20:35:43 +0200 |
| commit | 2d18ff1f80aa804a11108f346a7a3a20f4eb191d (patch) | |
| tree | 8d7bde219f794480af8810475f6e13ce41a9eedf /src | |
| parent | 2d7869b48ba1c1aca04fd66c52d37853321775cf (diff) | |
| parent | e6c39f9e3a29b1b701f18875f57114cb30c4b8dc (diff) | |
| download | invidious-2d18ff1f80aa804a11108f346a7a3a20f4eb191d.tar.gz invidious-2d18ff1f80aa804a11108f346a7a3a20f4eb191d.tar.bz2 invidious-2d18ff1f80aa804a11108f346a7a3a20f4eb191d.zip | |
Add ability to set po_token and visitordata ID (#4789)
This PR adds two new config option, to pass a PO token (config 'po_token') and
a visitor ID (config 'visitor_data') to Youtube. These two strings are required
to play videos using the WEB client.
Warning: These strings gives much more identifiable information to Google!
If the po_token setting is filled in, then the WEB client is used. If not, the
Android client is used. TvHtml5ScreenEmbed will still be used as a fallback.
Script for generating po_token and visitor_data:
https://github.com/iv-org/youtube-trusted-session-generator
Helps with issue 4734
Diffstat (limited to 'src')
| -rw-r--r-- | src/invidious/config.cr | 5 | ||||
| -rw-r--r-- | src/invidious/videos.cr | 1 | ||||
| -rw-r--r-- | src/invidious/videos/parser.cr | 11 | ||||
| -rw-r--r-- | src/invidious/yt_backend/youtube_api.cr | 11 |
4 files changed, 25 insertions, 3 deletions
diff --git a/src/invidious/config.cr b/src/invidious/config.cr index 29c39bd6..c4ddcdb3 100644 --- a/src/invidious/config.cr +++ b/src/invidious/config.cr @@ -132,6 +132,11 @@ class Config # Use Innertube's transcripts API instead of timedtext for closed captions property use_innertube_for_captions : Bool = false + # visitor data ID for Google session + property visitor_data : String? = nil + # poToken for passing bot attestation + property po_token : String? = nil + # Saved cookies in "name1=value1; name2=value2..." format @[YAML::Field(converter: Preferences::StringToCookies)] property cookies : HTTP::Cookies = HTTP::Cookies.new diff --git a/src/invidious/videos.cr b/src/invidious/videos.cr index c44a8f46..0d26b395 100644 --- a/src/invidious/videos.cr +++ b/src/invidious/videos.cr @@ -115,6 +115,7 @@ struct Video n = DECRYPT_FUNCTION.try &.decrypt_nsig(params["n"]) params["n"] = n if n + params["pot"] = CONFIG.po_token if CONFIG.po_token params["host"] = url.host.not_nil! if region = self.info["region"]?.try &.as_s diff --git a/src/invidious/videos/parser.cr b/src/invidious/videos/parser.cr index 4bdb2512..95fa3d79 100644 --- a/src/invidious/videos/parser.cr +++ b/src/invidious/videos/parser.cr @@ -55,7 +55,7 @@ def extract_video_info(video_id : String) client_config = YoutubeAPI::ClientConfig.new # Fetch data from the player endpoint - player_response = YoutubeAPI.player(video_id: video_id, params: "", client_config: client_config) + player_response = YoutubeAPI.player(video_id: video_id, params: "2AMB", client_config: client_config) playability_status = player_response.dig?("playabilityStatus", "status").try &.as_s @@ -102,7 +102,9 @@ def extract_video_info(video_id : String) new_player_response = nil - if reason.nil? + # Don't use Android client if po_token is passed because po_token doesn't + # work for Android client. + if reason.nil? && CONFIG.po_token.nil? # Fetch the video streams using an Android client in order to get the # decrypted URLs and maybe fix throttling issues (#2194). See the # following issue for an explanation about decrypted URLs: @@ -112,7 +114,10 @@ def extract_video_info(video_id : String) end # Last hope - if new_player_response.nil? + # Only trigger if reason found and po_token or didn't work wth Android client. + # TvHtml5ScreenEmbed now requires sig helper for it to work but po_token is not required + # if the IP address is not blocked. + if CONFIG.po_token && reason || CONFIG.po_token.nil? && new_player_response.nil? client_config.client_type = YoutubeAPI::ClientType::TvHtml5ScreenEmbed new_player_response = try_fetch_streaming_data(video_id, client_config) end diff --git a/src/invidious/yt_backend/youtube_api.cr b/src/invidious/yt_backend/youtube_api.cr index 09a5e7f4..6d585bf2 100644 --- a/src/invidious/yt_backend/youtube_api.cr +++ b/src/invidious/yt_backend/youtube_api.cr @@ -320,6 +320,10 @@ module YoutubeAPI client_context["client"]["platform"] = platform end + if CONFIG.visitor_data.is_a?(String) + client_context["client"]["visitorData"] = CONFIG.visitor_data.as(String) + end + return client_context end @@ -477,6 +481,9 @@ module YoutubeAPI "playbackContext" => { "contentPlaybackContext" => playback_ctx, }, + "serviceIntegrityDimensions" => { + "poToken" => CONFIG.po_token, + }, } # Append the additional parameters if those were provided @@ -609,6 +616,10 @@ module YoutubeAPI headers["User-Agent"] = user_agent end + if CONFIG.visitor_data.is_a?(String) + headers["X-Goog-Visitor-Id"] = CONFIG.visitor_data.as(String) + end + # Logging LOGGER.debug("YoutubeAPI: Using endpoint: \"#{endpoint}\"") LOGGER.trace("YoutubeAPI: ClientConfig: #{client_config}") |
