summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOmar Roth <omarroth@hotmail.com>2019-02-18 11:29:57 -0600
committerOmar Roth <omarroth@hotmail.com>2019-02-18 11:29:57 -0600
commit4933cd46d754587aa4b159af49f54e91611b44c3 (patch)
tree22d1ffc2ce4bc5d114611961f209853d9ec699e1
parent421ad21b40ffaa4e7814a0282ed8aa4ce30de441 (diff)
downloadinvidious-4933cd46d754587aa4b159af49f54e91611b44c3.tar.gz
invidious-4933cd46d754587aa4b159af49f54e91611b44c3.tar.bz2
invidious-4933cd46d754587aa4b159af49f54e91611b44c3.zip
Fix sorting of subscriptions with 'latest_only'
-rw-r--r--src/invidious.cr26
1 files changed, 22 insertions, 4 deletions
diff --git a/src/invidious.cr b/src/invidious.cr
index 565ae1ae..8db804df 100644
--- a/src/invidious.cr
+++ b/src/invidious.cr
@@ -1798,6 +1798,8 @@ get "/feed/subscriptions" do |env|
view_name = "subscriptions_#{sha256(user.email)[0..7]}"
if preferences.notifications_only && !notifications.empty?
+ # Only show notifications
+
args = arg_array(notifications)
notifications = PG_DB.query_all("SELECT * FROM channel_videos WHERE id IN (#{args})
@@ -1819,27 +1821,38 @@ get "/feed/subscriptions" do |env|
else
if preferences.latest_only
if preferences.unseen_only
+ # Show latest video from a channel that a user hasn't watched
+ # "unseen_only" isn't really correct here, more accurate would be "unwatched_only"
+
videos = PG_DB.query_all("SELECT DISTINCT ON (ucid) * FROM #{view_name} WHERE \
NOT id = ANY (VALUES #{user.watched.map { |id| %(('#{id}')) }.join(",")}) \
ORDER BY ucid, published #{sort}", as: ChannelVideo)
else
+ # Show latest video from each channel
+
videos = PG_DB.query_all("SELECT DISTINCT ON (ucid) * FROM #{view_name} \
- ORDER BY ucid, published #{sort}", as: ChannelVideo)
+ ORDER BY ucid, published", as: ChannelVideo)
end
videos.sort_by! { |video| video.published }.reverse!
else
if preferences.unseen_only
+ # Only show unwatched
+
videos = PG_DB.query_all("SELECT * FROM #{view_name} WHERE \
NOT id = ANY (VALUES #{user.watched.map { |id| %(('#{id}')) }.join(",")}) \
ORDER BY published #{sort} LIMIT $1 OFFSET $2", limit, offset, as: ChannelVideo)
else
+ # Sort subscriptions as normal
+
videos = PG_DB.query_all("SELECT * FROM #{view_name} \
ORDER BY published #{sort} LIMIT $1 OFFSET $2", limit, offset, as: ChannelVideo)
end
end
case preferences.sort
+ when "published - reverse"
+ videos.sort_by! { |video| video.published }
when "alphabetically"
videos.sort_by! { |video| video.title }
when "alphabetically - reverse"
@@ -1850,7 +1863,6 @@ get "/feed/subscriptions" do |env|
videos.sort_by! { |video| video.author }.reverse!
end
- # TODO: Add option to disable picking out notifications from regular feed
notifications = PG_DB.query_one("SELECT notifications FROM users WHERE email = $1", user.email,
as: Array(String))
@@ -1862,6 +1874,12 @@ get "/feed/subscriptions" do |env|
videos = videos[0..max_results]
end
+ # Clear user's notifications and set updated to the current time.
+
+ # "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.
PG_DB.exec("UPDATE users SET notifications = $1, updated = $2 WHERE email = $3", [] of String, Time.now,
user.email)
user.notifications = [] of String
@@ -1886,8 +1904,8 @@ get "/feed/history" do |env|
user = user.as(User)
limit = user.preferences.max_results
- if user.watched[(page - 1)*limit]?
- watched = user.watched.reverse[(page - 1)*limit, limit]
+ if user.watched[(page - 1) * limit]?
+ watched = user.watched.reverse[(page - 1) * limit, limit]
else
watched = [] of String
end