mirror of
https://github.com/iv-org/invidious.git
synced 2026-09-07 01:22:49 -05:00
Show real view counts in playlist-backed feeds
The playlist tables store no views, so Trending/Popular reported 0 for every item. The companion suggestion bot already caches YouTube metadata in suggest.video_meta in the same database: look the counts up in one query per feed and fall back to 0 when the row or the whole schema is missing, so instances without the bot are unaffected. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
5025d06c00
commit
b3272e62a4
@ -13,7 +13,7 @@ module Invidious::PlaylistFeeds
|
|||||||
# in its own order, duplicates dropped. Missing or non-public playlists
|
# in its own order, duplicates dropped. Missing or non-public playlists
|
||||||
# are skipped with a log line so one bad entry cannot break the feed.
|
# are skipped with a log line so one bad entry cannot break the feed.
|
||||||
def feed_videos(plids : Array(String)) : Array(SearchVideo)
|
def feed_videos(plids : Array(String)) : Array(SearchVideo)
|
||||||
videos = [] of SearchVideo
|
playlist_videos = [] of PlaylistVideo
|
||||||
seen = Set(String).new
|
seen = Set(String).new
|
||||||
|
|
||||||
plids.each do |plid|
|
plids.each do |plid|
|
||||||
@ -30,23 +30,42 @@ module Invidious::PlaylistFeeds
|
|||||||
Invidious::Database::PlaylistVideos.select(plid, playlist.index, 0, limit: 200).each do |video|
|
Invidious::Database::PlaylistVideos.select(plid, playlist.index, 0, limit: 200).each do |video|
|
||||||
next if seen.includes?(video.id)
|
next if seen.includes?(video.id)
|
||||||
seen << video.id
|
seen << video.id
|
||||||
videos << as_search_video(video)
|
playlist_videos << video
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
videos
|
views = view_counts(seen.to_a)
|
||||||
|
playlist_videos.map { |video| as_search_video(video, views[video.id]? || 0_i64) }
|
||||||
end
|
end
|
||||||
|
|
||||||
# PlaylistVideo lacks views/description/thumbnails metadata; neutral
|
# The playlist tables store no view counts, but the companion suggestion bot
|
||||||
# defaults keep the SearchVideo JSON shape the feed endpoints promise.
|
# keeps a permanent metadata cache in the same database. That `suggest`
|
||||||
private def as_search_video(video : PlaylistVideo) : SearchVideo
|
# schema belongs to the bot and is absent on a fresh install of this fork, so
|
||||||
|
# a failed lookup costs the view counts only, never the feed itself.
|
||||||
|
private def view_counts(ids : Array(String)) : Hash(String, Int64)
|
||||||
|
return {} of String => Int64 if ids.empty?
|
||||||
|
|
||||||
|
request = <<-SQL
|
||||||
|
SELECT vid, views FROM suggest.video_meta
|
||||||
|
WHERE views IS NOT NULL AND vid = ANY($1)
|
||||||
|
SQL
|
||||||
|
|
||||||
|
PG_DB.query_all(request, ids, as: {String, Int64}).to_h
|
||||||
|
rescue ex
|
||||||
|
LOGGER.debug("PlaylistFeeds: no view counts from suggest.video_meta (#{ex.message})")
|
||||||
|
{} of String => Int64
|
||||||
|
end
|
||||||
|
|
||||||
|
# PlaylistVideo lacks description/thumbnails metadata; neutral defaults keep
|
||||||
|
# the SearchVideo JSON shape the feed endpoints promise.
|
||||||
|
private def as_search_video(video : PlaylistVideo, views : Int64) : SearchVideo
|
||||||
SearchVideo.new({
|
SearchVideo.new({
|
||||||
title: video.title,
|
title: video.title,
|
||||||
id: video.id,
|
id: video.id,
|
||||||
author: video.author,
|
author: video.author,
|
||||||
ucid: video.ucid,
|
ucid: video.ucid,
|
||||||
published: video.published,
|
published: video.published,
|
||||||
views: 0_i64,
|
views: views,
|
||||||
description_html: "",
|
description_html: "",
|
||||||
length_seconds: video.length_seconds,
|
length_seconds: video.length_seconds,
|
||||||
premiere_timestamp: nil,
|
premiere_timestamp: nil,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user