sapo-videos/main.rb

91 lines
2.0 KiB
Ruby

# SPDX-License-Identifier: AGPL-3.0-only
# SPDX-FileCopyrightText: 2023 Hugo Peixoto <hugo.peixoto@gmail.com>
require 'sinatra'
require './database.rb'
require './models.rb'
def h(bytes)
if bytes < 2**10
"#{bytes} bytes"
elsif bytes < 2**20
"%.2f KiB" % (1.0 * bytes / 2**10)
elsif bytes < 2**30
"%.2f MiB" % (1.0 * bytes / 2**20)
elsif bytes < 2**40
"%.2f GiB" % (1.0 * bytes / 2**30)
else
"%.2f TiB" % (1.0 * bytes / 2**40)
end
end
set :public_folder, __dir__ + '/public'
get '/' do
downloads = ActiveRecord::Base.connection.execute("
SELECT
COUNT(1) AS total,
SUM(size) AS bytes
FROM (select size from downloads group by video_id) as x;
")[0]
videos = ActiveRecord::Base.connection.execute("select count(1) AS total from videos;")[0]
users = ActiveRecord::Base.connection.execute("select count(distinct email) AS total from downloads;")[0]
stats = {
videos_known: videos["total"].to_i,
videos_downloaded: downloads["total"].to_i,
bytes_downloaded: downloads["bytes"].to_i,
users: users["total"],
}
ERB
.new(File.read("index.html.erb"), trim_mode: "<>-")
.result_with_hash(stats)
end
get '/videos.json' do
content_type 'application/json'
amount = params['amount'].to_i
if amount > 100_000
{ error: "greedy" }.to_json
else
videos = Video
.left_outer_joins(:downloads)
.group("randname")
.order("COUNT(1) ASC, RANDOM()")
.limit(amount)
.pluck(:randname)
{ videos: videos }.to_json
end
end
post '/video' do
content_type 'application/json'
data = JSON.parse(request.body.read)
Download.create!(
video: Video.find_by!(randname: data["video_id"]),
size: data["size"],
sha256: data["sha256"],
email: data["email"],
)
{ status: 'ok' }.to_json
end
get '/config.json' do
content_type 'application/json'
{
videos_url: "https://sapo.pxto.pt/videos.json",
upload_url: "https://sapo.pxto.pt/video",
max_amount: 100_000,
}.to_json
end