diff options
| author | Omar Roth <omarroth@hotmail.com> | 2019-02-18 11:29:57 -0600 |
|---|---|---|
| committer | Omar Roth <omarroth@hotmail.com> | 2019-02-18 11:29:57 -0600 |
| commit | 4933cd46d754587aa4b159af49f54e91611b44c3 (patch) | |
| tree | 22d1ffc2ce4bc5d114611961f209853d9ec699e1 /src | |
| parent | 421ad21b40ffaa4e7814a0282ed8aa4ce30de441 (diff) | |
| download | invidious-4933cd46d754587aa4b159af49f54e91611b44c3.tar.gz invidious-4933cd46d754587aa4b159af49f54e91611b44c3.tar.bz2 invidious-4933cd46d754587aa4b159af49f54e91611b44c3.zip | |
Fix sorting of subscriptions with 'latest_only'
Diffstat (limited to 'src')
| -rw-r--r-- | src/invidious.cr | 26 |
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 |
