From 3615bbd893bca1308a2fb07116339f9e00fcfe8f Mon Sep 17 00:00:00 2001 From: Fijxu Date: Sat, 16 Nov 2024 12:00:01 -0300 Subject: [PATCH] Remove user supplied po_token and visitor_data --- src/invidious/config.cr | 2 -- src/invidious/routes/preferences.cr | 8 -------- src/invidious/routes/watch.cr | 22 +++++++--------------- src/invidious/user/preferences.cr | 4 ---- src/invidious/videos.cr | 12 ++++++------ src/invidious/videos/parser.cr | 22 ++++++++++------------ src/invidious/views/user/preferences.ecr | 12 ------------ src/invidious/yt_backend/youtube_api.cr | 17 +++-------------- 8 files changed, 26 insertions(+), 73 deletions(-) diff --git a/src/invidious/config.cr b/src/invidious/config.cr index 74a378c6..718a262b 100644 --- a/src/invidious/config.cr +++ b/src/invidious/config.cr @@ -45,8 +45,6 @@ struct ConfigPreferences property vr_mode : Bool = true property show_nick : Bool = true property save_player_pos : Bool = false - property po_token : String = "" - property visitor_data : String = "" def to_tuple {% begin %} diff --git a/src/invidious/routes/preferences.cr b/src/invidious/routes/preferences.cr index 09069486..5d3dd9b7 100644 --- a/src/invidious/routes/preferences.cr +++ b/src/invidious/routes/preferences.cr @@ -86,12 +86,6 @@ module Invidious::Routes::PreferencesRoute show_nick ||= "off" show_nick = show_nick == "on" - po_token = env.params.body["po_token"]?.try &.as(String) - po_token ||= CONFIG.default_user_preferences.po_token - - visitor_data = env.params.body["visitor_data"]?.try &.as(String) - visitor_data ||= CONFIG.default_user_preferences.visitor_data - comments = [] of String 2.times do |i| comments << (env.params.body["comments[#{i}]"]?.try &.as(String) || CONFIG.default_user_preferences.comments[i]) @@ -186,8 +180,6 @@ module Invidious::Routes::PreferencesRoute vr_mode: vr_mode, show_nick: show_nick, save_player_pos: save_player_pos, - po_token: po_token, - visitor_data: visitor_data, }.to_json) if user = env.get? "user" diff --git a/src/invidious/routes/watch.cr b/src/invidious/routes/watch.cr index 42dfd1d4..10a851ff 100644 --- a/src/invidious/routes/watch.cr +++ b/src/invidious/routes/watch.cr @@ -3,14 +3,6 @@ module Invidious::Routes::Watch def self.handle(env) locale = env.get("preferences").as(Preferences).locale - if !CONFIG.ignore_user_tokens - user_po_token = env.get("preferences").as(Preferences).po_token - user_visitor_data = env.get("preferences").as(Preferences).visitor_data - else - user_po_token = "" - user_visitor_data = "" - end - region = env.params.query["region"]? if env.params.query.to_s.includes?("%20") || env.params.query.to_s.includes?("+") @@ -60,7 +52,7 @@ module Invidious::Routes::Watch env.params.query.delete_all("listen") begin - video = get_video(id, region: params.region, po_token: user_po_token, visitor_data: user_visitor_data) + video = get_video(id, region: params.region) rescue ex : NotFoundException LOGGER.error("get_video not found: #{id} : #{ex.message}") return error_template(404, ex) @@ -152,7 +144,7 @@ module Invidious::Routes::Watch end end - # Removes non default audio tracks + # Removes non default audio tracks audio_streams.reject! do |z| z if z.dig?("audioTrack", "audioIsDefault") == false end @@ -219,11 +211,11 @@ module Invidious::Routes::Watch captions: video.captions ) - begin - video_url = fmt_stream[0]["url"].to_s - rescue - video_url = nil - end + begin + video_url = fmt_stream[0]["url"].to_s + rescue + video_url = nil + end templated "watch" end diff --git a/src/invidious/user/preferences.cr b/src/invidious/user/preferences.cr index 342d91b3..0a8525f3 100644 --- a/src/invidious/user/preferences.cr +++ b/src/invidious/user/preferences.cr @@ -57,10 +57,6 @@ struct Preferences property volume : Int32 = CONFIG.default_user_preferences.volume property save_player_pos : Bool = CONFIG.default_user_preferences.save_player_pos - @[YAML::Field(converter: Preferences::ProcessString)] - property po_token : String = "" - property visitor_data : String = "" - module BoolToString def self.to_json(value : String, json : JSON::Builder) json.string value diff --git a/src/invidious/videos.cr b/src/invidious/videos.cr index 96dcdb25..c6e69ee5 100644 --- a/src/invidious/videos.cr +++ b/src/invidious/videos.cr @@ -294,7 +294,7 @@ struct Video predicate_bool upcoming, isUpcoming end -def get_video(id, refresh = true, region = nil, force_refresh = false, po_token = "", visitor_data = "") +def get_video(id, refresh = true, region = nil, force_refresh = false) if (video = Invidious::Database::Videos.select(id)) && !region # If record was last updated over 10 minutes ago, or video has since premiered, # refresh (expire param in response lasts for 6 hours) @@ -304,7 +304,7 @@ def get_video(id, refresh = true, region = nil, force_refresh = false, po_token force_refresh || video.schema_version != Video::SCHEMA_VERSION # cache control begin - video = fetch_video(id, region, po_token, visitor_data) + video = fetch_video(id, region) Invidious::Database::Videos.insert(video) rescue ex Invidious::Database::Videos.delete(id) @@ -312,7 +312,7 @@ def get_video(id, refresh = true, region = nil, force_refresh = false, po_token end end else - video = fetch_video(id, region, po_token, visitor_data) + video = fetch_video(id, region) Invidious::Database::Videos.insert(video) if !region end @@ -320,11 +320,11 @@ def get_video(id, refresh = true, region = nil, force_refresh = false, po_token rescue DB::Error # Avoid common `DB::PoolRetryAttemptsExceeded` error and friends # Note: All DB errors inherit from `DB::Error` - return fetch_video(id, region, po_token, visitor_data) + return fetch_video(id, region) end -def fetch_video(id, region, po_token, visitor_data) - info = extract_video_info(video_id: id, user_po_token: po_token, user_visitor_data: visitor_data) +def fetch_video(id, region) + info = extract_video_info(video_id: id) if reason = info["reason"]? if reason == "Video unavailable" diff --git a/src/invidious/videos/parser.cr b/src/invidious/videos/parser.cr index a1f4741b..a670ac36 100644 --- a/src/invidious/videos/parser.cr +++ b/src/invidious/videos/parser.cr @@ -50,17 +50,17 @@ def parse_related_video(related : JSON::Any) : Hash(String, JSON::Any)? } end -def extract_video_info(video_id : String, user_po_token, user_visitor_data) +def extract_video_info(video_id : String) # Init client config for the API client_config = YoutubeAPI::ClientConfig.new redis_po_token, redis_visitor_data = Tokens.get_tokens - po_token = (user_po_token if !user_po_token.empty?) || redis_po_token || CONFIG.po_token - visitor_data = (user_visitor_data if !user_visitor_data.empty?) || redis_visitor_data || CONFIG.visitor_data + po_token = redis_po_token || CONFIG.po_token + visitor_data = redis_visitor_data || CONFIG.visitor_data # Fetch data from the player endpoint - player_response = YoutubeAPI.player(video_id: video_id, params: "2AMB", client_config: client_config, po_token: po_token, visitor_data: visitor_data) + player_response = YoutubeAPI.player(video_id: video_id, params: "2AMB", client_config: client_config) playability_status = player_response.dig?("playabilityStatus", "status").try &.as_s @@ -115,7 +115,7 @@ def extract_video_info(video_id : String, user_po_token, user_visitor_data) # following issue for an explanation about decrypted URLs: # https://github.com/TeamNewPipe/NewPipeExtractor/issues/562 client_config.client_type = YoutubeAPI::ClientType::AndroidTestSuite - new_player_response = try_fetch_streaming_data(video_id, client_config, po_token, visitor_data) + new_player_response = try_fetch_streaming_data(video_id, client_config) end # Replace player response and reset reason @@ -136,7 +136,7 @@ def extract_video_info(video_id : String, user_po_token, user_visitor_data) if streaming_data = player_response["streamingData"]? %w[formats adaptiveFormats].each do |key| streaming_data.as_h[key]?.try &.as_a.each do |format| - format.as_h["url"] = JSON::Any.new(convert_url(format, po_token)) + format.as_h["url"] = JSON::Any.new(convert_url(format)) end end @@ -149,9 +149,9 @@ def extract_video_info(video_id : String, user_po_token, user_visitor_data) return params end -def try_fetch_streaming_data(id : String, client_config : YoutubeAPI::ClientConfig, po_token, visitor_data) : Hash(String, JSON::Any)? +def try_fetch_streaming_data(id : String, client_config : YoutubeAPI::ClientConfig) : Hash(String, JSON::Any)? LOGGER.debug("try_fetch_streaming_data: [#{id}] Using #{client_config.client_type} client.") - response = YoutubeAPI.player(video_id: id, params: "2AMB", client_config: client_config, po_token: po_token, visitor_data: visitor_data) + response = YoutubeAPI.player(video_id: id, params: "2AMB", client_config: client_config) playability_status = response["playabilityStatus"]["status"] LOGGER.debug("try_fetch_streaming_data: [#{id}] Got playabilityStatus == #{playability_status}.") @@ -460,7 +460,7 @@ def parse_video_info(video_id : String, player_response : Hash(String, JSON::Any return params end -private def convert_url(fmt, po_token) +private def convert_url(fmt) if cfr = fmt["signatureCipher"]?.try { |json| HTTP::Params.parse(json.as_s) } sp = cfr["sp"] url = URI.parse(cfr["url"]) @@ -478,9 +478,7 @@ private def convert_url(fmt, po_token) n = DECRYPT_FUNCTION.try &.decrypt_nsig(params["n"]) params["n"] = n if n - if !po_token.nil? - params["pot"] = po_token - elsif token = CONFIG.po_token + if token = CONFIG.po_token params["pot"] = token end diff --git a/src/invidious/views/user/preferences.ecr b/src/invidious/views/user/preferences.ecr index c04805bb..fde9f203 100644 --- a/src/invidious/views/user/preferences.ecr +++ b/src/invidious/views/user/preferences.ecr @@ -126,22 +126,10 @@ checked<% end %>> - <% if !CONFIG.ignore_user_tokens %> -
- - -
- -
- - -
- <% if env.get?("user") %>
<%= translate(locale, "Generate po_token and visitor_data for your account") %>
- <% end %> <% end %> <%= translate(locale, "preferences_category_visual") %> diff --git a/src/invidious/yt_backend/youtube_api.cr b/src/invidious/yt_backend/youtube_api.cr index 366f6b80..beb3f821 100644 --- a/src/invidious/yt_backend/youtube_api.cr +++ b/src/invidious/yt_backend/youtube_api.cr @@ -3,8 +3,6 @@ # module YoutubeAPI - @@visitor_data : String = "" - extend self # For Android versions, see https://en.wikipedia.org/wiki/Android_version_history @@ -322,9 +320,7 @@ module YoutubeAPI client_context["client"]["platform"] = platform end - if !@@visitor_data.empty? - client_context["client"]["visitorData"] = @@visitor_data - elsif CONFIG.visitor_data.is_a?(String) + if CONFIG.visitor_data.is_a?(String) client_context["client"]["visitorData"] = CONFIG.visitor_data.as(String) end @@ -460,12 +456,7 @@ module YoutubeAPI *, # Force the following parameters to be passed by name params : String, client_config : ClientConfig | Nil = nil, - po_token : String | Nil, - visitor_data : String | Nil, ) - if visitor_data - @@visitor_data = visitor_data - end # Playback context, separate because it can be different between clients playback_ctx = { "html5Preference" => "HTML5_PREF_WANTS", @@ -491,7 +482,7 @@ module YoutubeAPI "contentPlaybackContext" => playback_ctx, }, "serviceIntegrityDimensions" => { - "poToken" => po_token || CONFIG.po_token, + "poToken" => CONFIG.po_token, }, } @@ -625,9 +616,7 @@ module YoutubeAPI headers["User-Agent"] = user_agent end - if !@@visitor_data.empty? - headers["X-Goog-Visitor-Id"] = @@visitor_data - elsif CONFIG.visitor_data.is_a?(String) + if CONFIG.visitor_data.is_a?(String) headers["X-Goog-Visitor-Id"] = CONFIG.visitor_data.as(String) end