# SPDX-License-Identifier: AGPL-3.0-only # SPDX-FileCopyrightText: 2023 Hugo Peixoto 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] stats = { downloads: downloads } ERB .new(File.read("index.html.erb"), trim_mode: "<>-") .result_with_hash(stats: 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.order("RANDOM()").limit(amount).pluck(:randname) }.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