mirror of
				https://github.com/iv-org/invidious.git
				synced 2025-10-31 04:32:02 +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 "./invidious/helpers/*" | ||||
| require "./invidious/*" | ||||
| require "./invidious/routes/**" | ||||
| require "./invidious/jobs/**" | ||||
|  | ||||
| ENV_CONFIG_NAME = "INVIDIOUS_CONFIG" | ||||
|  | ||||
| @@ -196,11 +198,11 @@ if config.statistics_enabled | ||||
|   end | ||||
| end | ||||
|  | ||||
| popular_videos = [] of ChannelVideo | ||||
| spawn do | ||||
|   pull_popular_videos(PG_DB) do |videos| | ||||
|     popular_videos = videos | ||||
|   end | ||||
| Invidious::Jobs.register Invidious::Jobs::PullPopularVideosJob.new(PG_DB) | ||||
| Invidious::Jobs.start_all | ||||
|  | ||||
| def popular_videos | ||||
|   Invidious::Jobs::PullPopularVideosJob::POPULAR_VIDEOS.get | ||||
| end | ||||
|  | ||||
| DECRYPT_FUNCTION = [] of {SigProc, Int32} | ||||
| @@ -350,44 +352,9 @@ before_all do |env| | ||||
|   env.set "current_page", URI.encode_www_form(current_page) | ||||
| end | ||||
|  | ||||
| get "/" do |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 | ||||
|  | ||||
| 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 | ||||
| Invidious::Routing.get "/", Invidious::Routes::Home | ||||
| Invidious::Routing.get "/privacy", Invidious::Routes::Privacy | ||||
| Invidious::Routing.get "/licenses", Invidious::Routes::Licenses | ||||
|  | ||||
| # 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
	 Perflyst
					Perflyst