forked from midou/invidious
Add subscribe and unsubscribe button
This commit is contained in:
parent
a7452d61fa
commit
7757eca92c
@ -209,14 +209,24 @@ get "/watch" do |env|
|
|||||||
env.params.query.delete_all("listen")
|
env.params.query.delete_all("listen")
|
||||||
end
|
end
|
||||||
|
|
||||||
yt_client = get_client(youtube_pool)
|
client = get_client(youtube_pool)
|
||||||
|
|
||||||
|
authorized = env.get? "authorized"
|
||||||
|
if authorized
|
||||||
|
sid = env.request.cookies["SID"].value
|
||||||
|
|
||||||
|
subscriptions = PG_DB.query_one("SELECT subscriptions FROM users WHERE id = $1", sid, as: Array(String))
|
||||||
|
else
|
||||||
|
subscriptions = [] of String
|
||||||
|
end
|
||||||
|
|
||||||
begin
|
begin
|
||||||
video = get_video(id, yt_client, PG_DB)
|
video = get_video(id, client, PG_DB)
|
||||||
rescue ex
|
rescue ex
|
||||||
error_message = ex.message
|
error_message = ex.message
|
||||||
next templated "error"
|
next templated "error"
|
||||||
ensure
|
ensure
|
||||||
youtube_pool << yt_client
|
youtube_pool << client
|
||||||
end
|
end
|
||||||
|
|
||||||
fmt_stream = [] of HTTP::Params
|
fmt_stream = [] of HTTP::Params
|
||||||
@ -611,13 +621,13 @@ get "/enable_notifications" do |env|
|
|||||||
headers["content-type"] = "application/x-www-form-urlencoded"
|
headers["content-type"] = "application/x-www-form-urlencoded"
|
||||||
subs = XML.parse_html(subs.body)
|
subs = XML.parse_html(subs.body)
|
||||||
subs.xpath_nodes(%q(//a[@class="subscription-title yt-uix-sessionlink"]/@href)).each do |channel|
|
subs.xpath_nodes(%q(//a[@class="subscription-title yt-uix-sessionlink"]/@href)).each do |channel|
|
||||||
channel_id = channel.content.lstrip("/channel/")
|
channel_id = channel.content.lstrip("/channel/").not_nil!
|
||||||
|
|
||||||
channel_req = {
|
channel_req = {
|
||||||
"channel_id" => channel_id.not_nil!,
|
"channel_id" => channel_id,
|
||||||
"receive_all_updates" => "true",
|
"receive_all_updates" => "true",
|
||||||
"receive_post_updates" => "true",
|
"receive_post_updates" => "true",
|
||||||
"session_token" => session_token.not_nil!,
|
"session_token" => session_token,
|
||||||
}
|
}
|
||||||
|
|
||||||
channel_req = HTTP::Params.encode(channel_req)
|
channel_req = HTTP::Params.encode(channel_req)
|
||||||
@ -651,14 +661,14 @@ get "/disable_notifications" do |env|
|
|||||||
headers["content-type"] = "application/x-www-form-urlencoded"
|
headers["content-type"] = "application/x-www-form-urlencoded"
|
||||||
subs = XML.parse_html(subs.body)
|
subs = XML.parse_html(subs.body)
|
||||||
subs.xpath_nodes(%q(//a[@class="subscription-title yt-uix-sessionlink"]/@href)).each do |channel|
|
subs.xpath_nodes(%q(//a[@class="subscription-title yt-uix-sessionlink"]/@href)).each do |channel|
|
||||||
channel_id = channel.content.lstrip("/channel/")
|
channel_id = channel.content.lstrip("/channel/").not_nil!
|
||||||
|
|
||||||
channel_req = {
|
channel_req = {
|
||||||
"channel_id" => channel_id.not_nil!,
|
"channel_id" => channel_id,
|
||||||
"receive_all_updates" => "false",
|
"receive_all_updates" => "false",
|
||||||
"receive_no_updates" => "false",
|
"receive_no_updates" => "false",
|
||||||
"receive_post_updates" => "true",
|
"receive_post_updates" => "true",
|
||||||
"session_token" => session_token.not_nil!,
|
"session_token" => session_token,
|
||||||
}
|
}
|
||||||
|
|
||||||
channel_req = HTTP::Params.encode(channel_req)
|
channel_req = HTTP::Params.encode(channel_req)
|
||||||
@ -672,6 +682,63 @@ get "/disable_notifications" do |env|
|
|||||||
env.redirect "/"
|
env.redirect "/"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
get "/subscription_ajax" do |env|
|
||||||
|
authorized = env.get? "authorized"
|
||||||
|
referer = env.request.headers["referer"]?
|
||||||
|
referer ||= "/"
|
||||||
|
|
||||||
|
if authorized
|
||||||
|
if env.params.query["action_create_subscription_to_channel"]?
|
||||||
|
action = "action_create_subscription_to_channel"
|
||||||
|
elsif env.params.query["action_remove_subscriptions"]?
|
||||||
|
action = "action_remove_subscriptions"
|
||||||
|
else
|
||||||
|
action = ""
|
||||||
|
env.redirect referer
|
||||||
|
end
|
||||||
|
|
||||||
|
channel_id = env.params.query["c"]?
|
||||||
|
channel_id ||= ""
|
||||||
|
|
||||||
|
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"
|
||||||
|
|
||||||
|
post_req = {
|
||||||
|
"session_token" => session_token,
|
||||||
|
}
|
||||||
|
post_req = HTTP::Params.encode(post_req)
|
||||||
|
post_url = "/subscription_ajax?#{action}=1&c=#{channel_id}"
|
||||||
|
|
||||||
|
# Update user
|
||||||
|
if client.post(post_url, headers, post_req).status_code == 200
|
||||||
|
sid = env.request.cookies["SID"].value
|
||||||
|
|
||||||
|
case action
|
||||||
|
when .starts_with? "action_create"
|
||||||
|
PG_DB.exec("UPDATE users SET subscriptions = array_append(subscriptions,$1) WHERE id = $2", channel_id, sid)
|
||||||
|
when .starts_with? "action_remove"
|
||||||
|
PG_DB.exec("UPDATE users SET subscriptions = array_remove(subscriptions,$1) WHERE id = $2", channel_id, sid)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
youtube_pool << client
|
||||||
|
end
|
||||||
|
|
||||||
|
env.redirect referer
|
||||||
|
end
|
||||||
|
|
||||||
error 404 do |env|
|
error 404 do |env|
|
||||||
error_message = "404 Page not found"
|
error_message = "404 Page not found"
|
||||||
templated "error"
|
templated "error"
|
||||||
|
@ -132,6 +132,21 @@ function toggle_comments(target) {
|
|||||||
<h3><%= video.info["author"] %></h3>
|
<h3><%= video.info["author"] %></h3>
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
<% if authorized %>
|
||||||
|
<% if subscriptions.includes? video.info["ucid"] %>
|
||||||
|
<p>
|
||||||
|
<a href="/subscription_ajax?action_remove_subscriptions=1&c=<%= video.info["ucid"] %>">
|
||||||
|
<b>Unsubscribe from <%= video.info["author"] %></b>
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
<% else %>
|
||||||
|
<p>
|
||||||
|
<a href="/subscription_ajax?action_create_subscription_to_channel=1&c=<%= video.info["ucid"] %>">
|
||||||
|
<b>Subscribe to <%= video.info["author"] %></b>
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
<p>
|
<p>
|
||||||
<b>Shared <%= video.published.to_s("%B %-d, %Y") %></b>
|
<b>Shared <%= video.published.to_s("%B %-d, %Y") %></b>
|
||||||
</p>
|
</p>
|
||||||
|
Loading…
Reference in New Issue
Block a user