Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions config/config.example.yml
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,17 @@ https_only: false
##
#admins: [""]

##
## Enable/Disable the user notifications for all users
##
## Note: On large instances, it is recommended to set this option to 'false'
## in order to reduce the amount of data written to the database, and hence
## improve the overall performance of the instance.
##
## Accepted values: true, false
## Default: true
##
#enable_user_notifications: true

# -----------------------------
# Background jobs
Expand Down
14 changes: 12 additions & 2 deletions src/invidious/channels/channels.cr
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,11 @@ def fetch_channel(ucid, pull_all_videos : Bool)

if was_insert
LOGGER.trace("fetch_channel: #{ucid} : video #{video_id} : Inserted, updating subscriptions")
Invidious::Database::Users.add_notification(video)
if CONFIG.enable_user_notifications
Invidious::Database::Users.add_notification(video)
else
Invidious::Database::Users.feed_needs_update(video)
end
else
LOGGER.trace("fetch_channel: #{ucid} : video #{video_id} : Updated")
end
Expand Down Expand Up @@ -264,7 +268,13 @@ def fetch_channel(ucid, pull_all_videos : Bool)
# so since they don't provide a published date here we can safely ignore them.
if Time.utc - video.published > 1.minute
was_insert = Invidious::Database::ChannelVideos.insert(video)
Invidious::Database::Users.add_notification(video) if was_insert
if was_insert
if CONFIG.enable_user_notifications
Invidious::Database::Users.add_notification(video)
else
Invidious::Database::Users.feed_needs_update(video)
end
end
end
end

Expand Down
2 changes: 2 additions & 0 deletions src/invidious/config.cr
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,8 @@ class Config
property hsts : Bool? = true
# Disable proxying server-wide: options: 'dash', 'livestreams', 'downloads', 'local'
property disable_proxy : Bool? | Array(String)? = false
# Enable the user notifications for all users
property enable_user_notifications : Bool = true

# URL to the modified source code to be easily AGPL compliant
# Will display in the footer, next to the main source code link
Expand Down
10 changes: 10 additions & 0 deletions src/invidious/database/users.cr
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,16 @@ module Invidious::Database::Users
# Update (misc)
# -------------------

def feed_needs_update(video : ChannelVideo)
request = <<-SQL
UPDATE users
SET feed_needs_update = true
WHERE $1 = ANY(subscriptions)
SQL

PG_DB.exec(request, video.ucid)
end

def update_preferences(user : User)
request = <<-SQL
UPDATE users
Expand Down
2 changes: 1 addition & 1 deletion src/invidious/routes/embed.cr
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ module Invidious::Routes::Embed
# PG_DB.exec("UPDATE users SET watched = array_append(watched, $1) WHERE email = $2", id, user.as(User).email)
# end

if notifications && notifications.includes? id
if CONFIG.enable_user_notifications && notifications && notifications.includes? id
Invidious::Database::Users.remove_notification(user.as(User), id)
env.get("user").as(User).notifications.delete(id)
notifications.delete(id)
Expand Down
38 changes: 24 additions & 14 deletions src/invidious/routes/feeds.cr
Original file line number Diff line number Diff line change
Expand Up @@ -96,12 +96,14 @@ module Invidious::Routes::Feeds

videos, notifications = get_subscription_feed(user, max_results, page)

# "updated" here is used for delivering new notifications, so if
# we know a user has looked at their feed e.g. in the past 10 minutes,
# they've already seen a video posted 20 minutes ago, and don't need
# to be notified.
Invidious::Database::Users.clear_notifications(user)
user.notifications = [] of String
if CONFIG.enable_user_notifications
# "updated" here is used for delivering new notifications, so if
# we know a user has looked at their feed e.g. in the past 10 minutes,
# they've already seen a video posted 20 minutes ago, and don't need
# to be notified.
Invidious::Database::Users.clear_notifications(user)
user.notifications = [] of String
end
env.set "user", user

templated "feeds/subscriptions"
Expand Down Expand Up @@ -404,13 +406,15 @@ module Invidious::Routes::Feeds

video = get_video(id, force_refresh: true)

# Deliver notifications to `/api/v1/auth/notifications`
payload = {
"topic" => video.ucid,
"videoId" => video.id,
"published" => published.to_unix,
}.to_json
PG_DB.exec("NOTIFY notifications, E'#{payload}'")
if CONFIG.enable_user_notifications
# Deliver notifications to `/api/v1/auth/notifications`
payload = {
"topic" => video.ucid,
"videoId" => video.id,
"published" => published.to_unix,
}.to_json
PG_DB.exec("NOTIFY notifications, E'#{payload}'")
end

video = ChannelVideo.new({
id: id,
Expand All @@ -426,7 +430,13 @@ module Invidious::Routes::Feeds
})

was_insert = Invidious::Database::ChannelVideos.insert(video, with_premiere_timestamp: true)
Invidious::Database::Users.add_notification(video) if was_insert
if was_insert
if CONFIG.enable_user_notifications
Invidious::Database::Users.add_notification(video)
else
Invidious::Database::Users.feed_needs_update(video)
end
end
end
end

Expand Down
2 changes: 1 addition & 1 deletion src/invidious/routes/watch.cr
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ module Invidious::Routes::Watch
Invidious::Database::Users.mark_watched(user.as(User), id)
end

if notifications && notifications.includes? id
if CONFIG.enable_user_notifications && notifications && notifications.includes? id
Invidious::Database::Users.remove_notification(user.as(User), id)
env.get("user").as(User).notifications.delete(id)
notifications.delete(id)
Expand Down
10 changes: 7 additions & 3 deletions src/invidious/routing.cr
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,9 @@ module Invidious::Routing
get "/feed/webhook/:token", Routes::Feeds, :push_notifications_get
post "/feed/webhook/:token", Routes::Feeds, :push_notifications_post

get "/modify_notifications", Routes::Notifications, :modify
if CONFIG.enable_user_notifications
get "/modify_notifications", Routes::Notifications, :modify
end
{% end %}

self.register_image_routes
Expand Down Expand Up @@ -260,8 +262,10 @@ module Invidious::Routing
post "/api/v1/auth/tokens/register", {{namespace}}::Authenticated, :register_token
post "/api/v1/auth/tokens/unregister", {{namespace}}::Authenticated, :unregister_token

get "/api/v1/auth/notifications", {{namespace}}::Authenticated, :notifications
post "/api/v1/auth/notifications", {{namespace}}::Authenticated, :notifications
if CONFIG.enable_user_notifications
get "/api/v1/auth/notifications", {{namespace}}::Authenticated, :notifications
post "/api/v1/auth/notifications", {{namespace}}::Authenticated, :notifications
end

# Misc
get "/api/v1/stats", {{namespace}}::Misc, :stats
Expand Down
4 changes: 4 additions & 0 deletions src/invidious/views/feeds/subscriptions.ecr
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
</div>
</div>

<% if CONFIG.enable_user_notifications %>

<center>
<%= translate_count(locale, "subscriptions_unseen_notifs_count", notifications.size) %>
</center>
Expand All @@ -39,6 +41,8 @@
<% end %>
</div>

<% end %>

<div class="h-box">
<hr>
</div>
Expand Down
4 changes: 3 additions & 1 deletion src/invidious/views/template.ecr
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
<div class="pure-u-1-4">
<a id="notification_ticker" title="<%= translate(locale, "Subscriptions") %>" href="/feed/subscriptions" class="pure-menu-heading">
<% notification_count = env.get("user").as(Invidious::User).notifications.size %>
<% if notification_count > 0 %>
<% if CONFIG.enable_user_notifications && notification_count > 0 %>
<span id="notification_count"><%= notification_count %></span> <i class="icon ion-ios-notifications"></i>
<% else %>
<i class="icon ion-ios-notifications-outline"></i>
Expand Down Expand Up @@ -170,7 +170,9 @@
}.to_pretty_json
%>
</script>
<% if CONFIG.enable_user_notifications %>
<script src="/js/notifications.js?v=<%= ASSET_COMMIT %>"></script>
<% end %>
<% end %>
</body>

Expand Down
2 changes: 2 additions & 0 deletions src/invidious/views/user/preferences.ecr
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,7 @@
<input name="unseen_only" id="unseen_only" type="checkbox" <% if preferences.unseen_only %>checked<% end %>>
</div>

<% if CONFIG.enable_user_notifications %>
<div class="pure-control-group">
<label for="notifications_only"><%= translate(locale, "preferences_notifications_only_label") %></label>
<input name="notifications_only" id="notifications_only" type="checkbox" <% if preferences.notifications_only %>checked<% end %>>
Expand All @@ -255,6 +256,7 @@
<a href="#" data-onclick="notification_requestPermission"><%= translate(locale, "Enable web notifications") %></a>
</div>
<% end %>
<% end %>
<% end %>

<% if env.get?("user") && CONFIG.admins.includes? env.get?("user").as(Invidious::User).email %>
Expand Down