From 5bf4e20c5a6134d29bf272ec2add27a0c6dbe78f Mon Sep 17 00:00:00 2001 From: syeopite Date: Sat, 9 Nov 2024 23:10:13 -0800 Subject: [PATCH] Add ability to load extension shards for Invidious --- .gitignore | 2 ++ src/addons/extract-addons.cr | 19 +++++++++++++++++++ src/invidious.cr | 11 +++++++++++ 3 files changed, 32 insertions(+) create mode 100644 src/addons/extract-addons.cr diff --git a/.gitignore b/.gitignore index 7a26e1a6..d56dc1c8 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ /invidious /sentry /config/config.yml + +/src/addons/enabled.txt \ No newline at end of file diff --git a/src/addons/extract-addons.cr b/src/addons/extract-addons.cr new file mode 100644 index 00000000..d64d27e4 --- /dev/null +++ b/src/addons/extract-addons.cr @@ -0,0 +1,19 @@ +require "yaml" + +shardyml = File.open("shard.yml") do |file| + YAML.parse(file).as_h +end + +# Finds all dependencies prefixed with extendious +raw_addons = shardyml["dependencies"].as_h.keys.select(&.as_s.starts_with?("extendious")) +addons = [] of String + +raw_addons.map do |addon_name| + addon_name = addon_name.as_s + addon_module = addon_name.lchop("extendious-") + addon_module = addon_module.split("-").map!(&.capitalize).join + + addons << "#{addon_name},#{addon_module}" +end + +File.write("src/addons/enabled.txt", addons.join("\n")) diff --git a/src/invidious.cr b/src/invidious.cr index b422dcbb..e7654dcf 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -243,6 +243,17 @@ Kemal.config.host_binding = Kemal.config.host_binding != "0.0.0.0" ? Kemal.confi Kemal.config.port = Kemal.config.port != 3000 ? Kemal.config.port : CONFIG.port Kemal.config.app_name = "Invidious" +# Loads optional extensions for Invidious +# Essentially just glorified shards with a set naming scheme +# and load method + +{{run("./addons/extract-addons.cr", "--minified")}} +{% for addon in read_file("src/addons/enabled.txt").lines %} + {% shard_name, module_name = addon.split(",") %} + require {{shard_name.id.stringify}} + {{module_name.id}}Ext.invidious_load +{% end %} + # Use in kemal's production mode. # Users can also set the KEMAL_ENV environmental variable for this to be set automatically. {% if flag?(:release) || flag?(:production) %}