diff --git a/src/helpers.cr b/src/helpers.cr index a5148bdf..8106cb4f 100644 --- a/src/helpers.cr +++ b/src/helpers.cr @@ -183,4 +183,29 @@ def decrypt_signature(a) a[0] = a[49 % a.size] a[49] = c return a.join("") -end \ No newline at end of file +end + +def rank_videos(db, n) + top = [] of {Float64, String} + + db.query("SELECT id, wilson_score, published FROM videos WHERE views > 5000 ORDER BY published DESC LIMIT 10000") do |rs| + rs.each do + id = rs.read(String) + wilson_score = rs.read(Float64) + published = rs.read(Time) + + # Exponential decay, older videos tend to rank lower + temperature = wilson_score * Math.exp(-0.02*((Time.now - published).hours)) + top << {temperature, id} + end + end + + top.sort! + + # Make hottest come first + top.reverse! + top = top.map { |a, b| b } + + # Return top + return top[1..n] +end diff --git a/src/invidious.cr b/src/invidious.cr index b23dfe5b..18613ffe 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -123,6 +123,21 @@ macro templated(filename) end get "/" do |env| + top = rank_videos(PG_DB, 120) + + args = [] of String + 1..(top.size - 1).times { |i| args << "($#{i + 1}), " } + args << "($#{top.size}) " + args = args.join("") + + videos = [] of Video + PG_DB.query("SELECT * FROM videos d INNER JOIN (VALUES #{args}) v(id) USING (id)", top) do |rs| + rs.each do + video = rs.read(Video) + videos << video + end + end + templated "index" end diff --git a/src/views/index.ecr b/src/views/index.ecr index 885c8d5c..3d250f56 100644 --- a/src/views/index.ecr +++ b/src/views/index.ecr @@ -1,3 +1,19 @@ <% content_for "header" do %> Invidious -<% end %> \ No newline at end of file +<% end %> + +<% videos.each_slice(4) do |slice| %> +
+<% slice.each do |video| %> + <% player_response = JSON.parse(video.info["player_response"]) %> +
+
+ + "/> + <%= video.title %> + +
+
+ <% end %> +
+<% end %>