support pubsub notifications without making a request to innertube
All checks were successful
Invidious CI / build (push) Successful in 5m12s

Closes #56
This commit is contained in:
Fijxu 2024-12-18 21:57:42 -03:00
parent 83256b2af1
commit df94f1c0b8
Signed by: Fijxu
GPG key ID: 32C1DDF333EDA6A4
2 changed files with 17 additions and 12 deletions

View file

@ -111,6 +111,7 @@ class Config
# Subscribe to channels using PubSubHubbub (requires domain, hmac_key) # Subscribe to channels using PubSubHubbub (requires domain, hmac_key)
property use_pubsub_feeds : Bool | Int32 = false property use_pubsub_feeds : Bool | Int32 = false
property use_innertube_for_feeds : Bool = true
property popular_enabled : Bool = true property popular_enabled : Bool = true
property captcha_enabled : Bool = true property captcha_enabled : Bool = true
property login_enabled : Bool = true property login_enabled : Bool = true

View file

@ -416,18 +416,22 @@ module Invidious::Routes::Feeds
author = entry.xpath_node("default:author/default:name", namespaces).not_nil!.content author = entry.xpath_node("default:author/default:name", namespaces).not_nil!.content
published = Time.parse_rfc3339(entry.xpath_node("default:published", namespaces).not_nil!.content) published = Time.parse_rfc3339(entry.xpath_node("default:published", namespaces).not_nil!.content)
updated = Time.parse_rfc3339(entry.xpath_node("default:updated", namespaces).not_nil!.content) updated = Time.parse_rfc3339(entry.xpath_node("default:updated", namespaces).not_nil!.content)
ucid = entry.xpath_node("yt:channelId", namespaces).not_nil!.content
title = entry.xpath_node("default:title", namespaces).not_nil!.content
begin if CONFIG.use_innertube_for_feeds
video = get_video(id, force_refresh: true) begin
rescue video_ = get_video(id, force_refresh: true)
next # skip this video since it raised an exception (e.g. it is a scheduled live event) rescue
next # skip this video since it raised an exception (e.g. it is a scheduled live event)
end
end end
if CONFIG.enable_user_notifications if CONFIG.enable_user_notifications
# Deliver notifications to `/api/v1/auth/notifications` # Deliver notifications to `/api/v1/auth/notifications`
payload = { payload = {
"topic" => video.ucid, "topic" => ucid,
"videoId" => video.id, "videoId" => id,
"published" => published.to_unix, "published" => published.to_unix,
}.to_json }.to_json
PG_DB.exec("NOTIFY notifications, E'#{payload}'") PG_DB.exec("NOTIFY notifications, E'#{payload}'")
@ -435,15 +439,15 @@ module Invidious::Routes::Feeds
video = ChannelVideo.new({ video = ChannelVideo.new({
id: id, id: id,
title: video.title, title: title,
published: published, published: published,
updated: updated, updated: updated,
ucid: video.ucid, ucid: ucid,
author: author, author: author,
length_seconds: video.length_seconds, length_seconds: video_.try &.length_seconds || 0,
live_now: video.live_now, live_now: video_.try &.live_now || false,
premiere_timestamp: video.premiere_timestamp, premiere_timestamp: video_.try &.premiere_timestamp || nil,
views: video.views, views: video_.try &.views || nil,
}) })
was_insert = Invidious::Database::ChannelVideos.insert(video, with_premiere_timestamp: true) was_insert = Invidious::Database::ChannelVideos.insert(video, with_premiere_timestamp: true)