Provide rough draft of better project organization

This commit is contained in:
Matthew McGarvey 2020-10-05 23:41:18 -05:00
parent 1978c3d3bd
commit 85c212aee3
9 changed files with 115 additions and 43 deletions

View File

@ -27,6 +27,8 @@ require "compress/zip"
require "protodec/utils" require "protodec/utils"
require "./invidious/helpers/*" require "./invidious/helpers/*"
require "./invidious/*" require "./invidious/*"
require "./invidious/routes/**"
require "./invidious/jobs/**"
ENV_CONFIG_NAME = "INVIDIOUS_CONFIG" ENV_CONFIG_NAME = "INVIDIOUS_CONFIG"
@ -196,11 +198,11 @@ if config.statistics_enabled
end end
end end
popular_videos = [] of ChannelVideo Invidious::Jobs.register Invidious::Jobs::PullPopularVideosJob.new(PG_DB)
spawn do Invidious::Jobs.start_all
pull_popular_videos(PG_DB) do |videos|
popular_videos = videos def popular_videos
end Invidious::Jobs::PullPopularVideosJob::POPULAR_VIDEOS.get
end end
DECRYPT_FUNCTION = [] of {SigProc, Int32} DECRYPT_FUNCTION = [] of {SigProc, Int32}
@ -350,44 +352,9 @@ before_all do |env|
env.set "current_page", URI.encode_www_form(current_page) env.set "current_page", URI.encode_www_form(current_page)
end end
get "/" do |env| Invidious::Routing.get "/", Invidious::Routes::Home
preferences = env.get("preferences").as(Preferences) Invidious::Routing.get "/privacy", Invidious::Routes::Privacy
locale = LOCALES[preferences.locale]? Invidious::Routing.get "/licenses", Invidious::Routes::Licenses
user = env.get? "user"
case preferences.default_home
when ""
templated "empty"
when "Popular"
templated "popular"
when "Trending"
env.redirect "/feed/trending"
when "Subscriptions"
if user
env.redirect "/feed/subscriptions"
else
templated "popular"
end
when "Playlists"
if user
env.redirect "/view_all_playlists"
else
templated "popular"
end
else
templated "empty"
end
end
get "/privacy" do |env|
locale = LOCALES[env.get("preferences").as(Preferences).locale]?
templated "privacy"
end
get "/licenses" do |env|
locale = LOCALES[env.get("preferences").as(Preferences).locale]?
rendered "licenses"
end
# Videos # Videos

13
src/invidious/jobs.cr Normal file
View File

@ -0,0 +1,13 @@
module Invidious::Jobs
JOBS = [] of BaseJob
def self.register(job : BaseJob)
JOBS << job
end
def self.start_all
JOBS.each do |job|
spawn { job.begin }
end
end
end

View File

@ -0,0 +1,3 @@
abstract class Invidious::Jobs::BaseJob
abstract def begin
end

View File

@ -0,0 +1,27 @@
class Invidious::Jobs::PullPopularVideosJob < Invidious::Jobs::BaseJob
QUERY = <<-SQL
SELECT DISTINCT ON (ucid) *
FROM channel_videos
WHERE ucid IN (SELECT channel FROM (SELECT UNNEST(subscriptions) AS channel FROM users) AS d
GROUP BY channel ORDER BY COUNT(channel) DESC LIMIT 40)
ORDER BY ucid, published DESC
SQL
POPULAR_VIDEOS = Atomic.new([] of ChannelVideo)
private getter db : DB::Database
def initialize(@db)
end
def begin
loop do
videos = db.query_all(QUERY, as: ChannelVideo)
.sort_by(&.published)
.reverse
POPULAR_VIDEOS.set(videos)
sleep 1.minute
Fiber.yield
end
end
end

View File

@ -0,0 +1,8 @@
abstract class Invidious::Routes::BaseRoute
private getter config : Config
def initialize(@config)
end
abstract def handle(env)
end

View File

@ -0,0 +1,34 @@
class Invidious::Routes::Home < Invidious::Routes::BaseRoute
def handle(env)
preferences = env.get("preferences").as(Preferences)
locale = LOCALES[preferences.locale]?
user = env.get? "user"
case preferences.default_home
when ""
templated "empty"
when "Popular"
templated "popular"
when "Trending"
env.redirect "/feed/trending"
when "Subscriptions"
if user
env.redirect "/feed/subscriptions"
else
templated "popular"
end
when "Playlists"
if user
env.redirect "/view_all_playlists"
else
templated "popular"
end
else
templated "empty"
end
end
private def popular_videos
Jobs::PullPopularVideosJob::POPULAR_VIDEOS.get
end
end

View File

@ -0,0 +1,6 @@
class Invidious::Routes::Licenses < Invidious::Routes::BaseRoute
def handle(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]?
rendered "licenses"
end
end

View File

@ -0,0 +1,6 @@
class Invidious::Routes::Privacy < Invidious::Routes::BaseRoute
def handle(env)
locale = LOCALES[env.get("preferences").as(Preferences).locale]?
templated "privacy"
end
end

8
src/invidious/routing.cr Normal file
View File

@ -0,0 +1,8 @@
module Invidious::Routing
macro get(path, controller)
get {{ path }} do |env|
controller_instance = {{ controller }}.new(config)
controller_instance.handle(env)
end
end
end