mirror of
				https://github.com/iv-org/invidious.git
				synced 2025-11-04 06:31:57 +00:00 
			
		
		
		
	Merge pull request #1399 from matthewmcgarvey/routing-job-patterns
Provide rough draft of better project organization
This commit is contained in:
		@@ -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
 | 
				
			||||||
		Reference in New Issue
	
	Block a user