diff options
| author | Omar Roth <omarroth@hotmail.com> | 2018-03-30 20:52:10 -0500 |
|---|---|---|
| committer | Omar Roth <omarroth@hotmail.com> | 2018-03-30 20:52:10 -0500 |
| commit | 2c5d75dccebb5b91f13c0092a13335fef6ed5f75 (patch) | |
| tree | 30acb8ea95bb72f8654634f3811836ce9b51a79e | |
| parent | 0aa8ad9a7cc8581269cb5d5b44827951ee2369c3 (diff) | |
| download | invidious-2c5d75dccebb5b91f13c0092a13335fef6ed5f75.tar.gz invidious-2c5d75dccebb5b91f13c0092a13335fef6ed5f75.tar.bz2 invidious-2c5d75dccebb5b91f13c0092a13335fef6ed5f75.zip | |
Add enable and disable notifications (bell dinging feature)
| -rw-r--r-- | src/invidious.cr | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/invidious.cr b/src/invidious.cr index c91b75f8..dfa0aadf 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': "(?<session_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': "(?<session_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" |
