mirror of
https://github.com/iv-org/invidious.git
synced 2024-12-28 00:39:26 -05:00
Merge pull request #1399 from matthewmcgarvey/routing-job-patterns
Provide rough draft of better project organization
This commit is contained in:
commit
59d966356e
@ -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
13
src/invidious/jobs.cr
Normal 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
|
3
src/invidious/jobs/base_job.cr
Normal file
3
src/invidious/jobs/base_job.cr
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
abstract class Invidious::Jobs::BaseJob
|
||||||
|
abstract def begin
|
||||||
|
end
|
27
src/invidious/jobs/pull_popular_videos_job.cr
Normal file
27
src/invidious/jobs/pull_popular_videos_job.cr
Normal 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
|
8
src/invidious/routes/base_route.cr
Normal file
8
src/invidious/routes/base_route.cr
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
abstract class Invidious::Routes::BaseRoute
|
||||||
|
private getter config : Config
|
||||||
|
|
||||||
|
def initialize(@config)
|
||||||
|
end
|
||||||
|
|
||||||
|
abstract def handle(env)
|
||||||
|
end
|
34
src/invidious/routes/home.cr
Normal file
34
src/invidious/routes/home.cr
Normal 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
|
6
src/invidious/routes/licenses.cr
Normal file
6
src/invidious/routes/licenses.cr
Normal 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
|
6
src/invidious/routes/privacy.cr
Normal file
6
src/invidious/routes/privacy.cr
Normal 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
8
src/invidious/routing.cr
Normal 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
|
Loading…
Reference in New Issue
Block a user