From 2c5d75dccebb5b91f13c0092a13335fef6ed5f75 Mon Sep 17 00:00:00 2001 From: Omar Roth Date: Fri, 30 Mar 2018 20:52:10 -0500 Subject: [PATCH] Add enable and disable notifications (bell dinging feature) --- src/invidious.cr | 85 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/src/invidious.cr b/src/invidious.cr index c91b75f86..dfa0aadf4 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -587,6 +587,91 @@ get "/feed/subscriptions" do |env| end end +# Two functions that are useful if you have multiple subscriptions that don't have +# the "bell dinged". enable_notifications dings the bell for all subscriptions, +# disable_notifications does the opposite. These don't fit conveniently anywhere, +# so instead are here more as an undocumented utility. +get "/enable_notifications" do |env| + authorized = env.get? "authorized" + + if authorized + headers = HTTP::Headers.new + headers["Cookie"] = env.request.headers["Cookie"] + + client = get_client(youtube_pool) + subs = client.get("/subscription_manager?disable_polymer=1", headers) + headers["Cookie"] += "; " + subs.cookies.add_request_headers(headers)["Cookie"] + match = subs.body.match(/'XSRF_TOKEN': "(?[A-Za-z0-9\_\-\=]+)"/) + if match + session_token = match["session_token"] + else + next env.redirect "/" + end + + headers["content-type"] = "application/x-www-form-urlencoded" + subs = XML.parse_html(subs.body) + subs.xpath_nodes(%q(//a[@class="subscription-title yt-uix-sessionlink"]/@href)).each do |channel| + channel_id = channel.content.lstrip("/channel/") + + channel_req = { + "channel_id" => channel_id.not_nil!, + "receive_all_updates" => "true", + "receive_post_updates" => "true", + "session_token" => session_token.not_nil!, + } + + channel_req = HTTP::Params.encode(channel_req) + + client.post("/subscription_ajax?action_update_subscription_preferences=1", headers, channel_req) + end + + youtube_pool << client + end + + env.redirect "/" +end + +get "/disable_notifications" do |env| + authorized = env.get? "authorized" + + if authorized + headers = HTTP::Headers.new + headers["Cookie"] = env.request.headers["Cookie"] + + client = get_client(youtube_pool) + subs = client.get("/subscription_manager?disable_polymer=1", headers) + headers["Cookie"] += "; " + subs.cookies.add_request_headers(headers)["Cookie"] + match = subs.body.match(/'XSRF_TOKEN': "(?[A-Za-z0-9\_\-\=]+)"/) + if match + session_token = match["session_token"] + else + next env.redirect "/" + end + + headers["content-type"] = "application/x-www-form-urlencoded" + subs = XML.parse_html(subs.body) + subs.xpath_nodes(%q(//a[@class="subscription-title yt-uix-sessionlink"]/@href)).each do |channel| + channel_id = channel.content.lstrip("/channel/") + + channel_req = { + "channel_id" => channel_id.not_nil!, + "receive_all_updates" => "false", + "receive_no_updates" => "false", + "receive_post_updates" => "true", + "session_token" => session_token.not_nil!, + } + + channel_req = HTTP::Params.encode(channel_req) + + client.post("/subscription_ajax?action_update_subscription_preferences=1", headers, channel_req) + end + + youtube_pool << client + end + + env.redirect "/" +end + error 404 do |env| error_message = "404 Page not found" templated "error"