From bbec11199756376f0051686d0e9866c41e692c38 Mon Sep 17 00:00:00 2001 From: Fijxu Date: Sat, 5 Apr 2025 00:39:05 -0300 Subject: [PATCH] feat(experimental): minify js files using esbuild --- assets/js/.gitignore | 1 + scripts/minify-js.cr | 96 +++++++++++++++++++ src/invidious.cr | 9 ++ src/invidious/views/add_playlist_items.ecr | 2 +- src/invidious/views/channel.ecr | 2 +- src/invidious/views/community.ecr | 2 +- .../views/components/items_paginated.ecr | 2 +- src/invidious/views/components/player.ecr | 2 +- .../views/components/subscribe_widget.ecr | 2 +- src/invidious/views/embed.ecr | 4 +- src/invidious/views/feeds/history.ecr | 2 +- src/invidious/views/feeds/playlists.ecr | 2 +- src/invidious/views/feeds/popular.ecr | 2 +- src/invidious/views/feeds/subscriptions.ecr | 4 +- src/invidious/views/feeds/trending.ecr | 2 +- src/invidious/views/playlist.ecr | 2 +- src/invidious/views/post.ecr | 4 +- src/invidious/views/template.ecr | 10 +- src/invidious/views/watch.ecr | 6 +- 19 files changed, 131 insertions(+), 25 deletions(-) create mode 100644 assets/js/.gitignore create mode 100755 scripts/minify-js.cr diff --git a/assets/js/.gitignore b/assets/js/.gitignore new file mode 100644 index 00000000..dd9a3a5e --- /dev/null +++ b/assets/js/.gitignore @@ -0,0 +1 @@ +minified \ No newline at end of file diff --git a/scripts/minify-js.cr b/scripts/minify-js.cr new file mode 100755 index 00000000..2d07df8c --- /dev/null +++ b/scripts/minify-js.cr @@ -0,0 +1,96 @@ +require "http" +require "colorize" + +ESBUILD_VERSION = "0.25.0" + +esbuild_os = "" +esbuild_arch = "" + +# https://esbuild.github.io/getting-started/#other-ways-to-install +{% if flag?(:linux) %} + esbuild_os = "linux" +{% elsif flag?(:windows) %} + esbuild_os = "win32" +{% elsif flag?(:darwin) %} + esbuild_os = "darwin" +{% elsif flag?(:freebsd) %} + esbuild_os = "freebsd" +{% elsif flag?(:openbsd) %} + esbuild_os = "openbsd" +{% elsif flag?(:netbsd) %} + esbuild_os = "netbsd" +{% elsif flag?(:solaris) %} + esbuild_os = "sunos" +{% else %} + esbuild_os = "linux" +{% end %} + +{% if flag?(:x86_64) %} + esbuild_arch = "x64" +{% elsif flag?(:arm64) %} + esbuild_arch = "arm64" +{% else %} + esbuild_arch = "x64" +{% end %} + +tmp_dir_path = "#{Dir.tempdir}/invidious-esbuild-binary" +esbuild_tar_location = "#{tmp_dir_path}/esbuild-#{esbuild_os}-#{esbuild_os}-#{ESBUILD_VERSION}.tgz" +esbuild_binary_location = "#{tmp_dir_path}/package/bin/esbuild" +Dir.mkdir(tmp_dir_path) if !Dir.exists? tmp_dir_path + +esbuild_url = "https://registry.npmjs.org/@esbuild/#{esbuild_os}-#{esbuild_arch}/-/#{esbuild_os}-#{esbuild_arch}-#{ESBUILD_VERSION}.tgz" + +# Download esbuild binary +HTTP::Client.get(esbuild_url) do |response| + puts "Downloading esbuild from #{esbuild_url}" + data = response.body_io.gets_to_end + File.write(esbuild_tar_location, data) + + `tar -vzxf '#{esbuild_tar_location}' -C '#{tmp_dir_path}'` + raise "Extraction for #{esbuild_tar_location} failed" if !$?.success? + puts "esbuild downloaded successfully" +end + +files_to_minify = [ + "_helpers.js", + "comments.js", + "embed.js", + "handlers.js", + "notifications.js", + "pagination.js", + "playlist_widget.js", + "post.js", + "sse.js", + "themes.js", + "watch.js", + "player.js", + "watched_indicator.js", + "watched_widget.js", +] + +files_to_minify.each do |file| + file_path = "assets/js/#{file}" + outdir = "assets/js/minified" + process_output = IO::Memory.new + + process = Process.run("#{esbuild_binary_location}", error: process_output, args: [ + file_path, + "--color=false", + "--sourcemap", + "--minify", + "--outdir=#{outdir}", + ] + ) + + if process.success? + puts "Minified #{file}".colorize(:green) + elsif !process.success? + puts "Failed to minify #{file}, esbuild exited with exit code #{process.exit_code}: #{process_output.to_s.split("\n").first}".colorize(:red) + raise Exception.new("All files have to be minified sucessfully in order to compile!") + end +end + +puts "Minify done!" + +# Cleanup +`rm -rf #{tmp_dir_path}` diff --git a/src/invidious.cr b/src/invidious.cr index 33a2994e..e760e70c 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -160,6 +160,15 @@ LOGGER = Invidious::LogHandler.new(OUTPUT, CONFIG.log_level, CONFIG.colorize_log # Check table integrity Invidious::Database.check_integrity(CONFIG) +# Minifies Invidious Javascript +{% if flag?(:minify_debug) || (flag?(:release) || flag?(:production)) && !flag?(:skip_minified_js) %} + {% puts "\nMinifying Invidious JavaScript\n" %} + {% puts run("../scripts/minify-js.cr").stringify %} + JS_PATH="js/minified" +{% else %} + JS_PATH="js" +{% end %} + {% if !flag?(:skip_videojs_download) %} # Resolve player dependencies. This is done at compile time. # diff --git a/src/invidious/views/add_playlist_items.ecr b/src/invidious/views/add_playlist_items.ecr index 6aea82ae..2c8af339 100644 --- a/src/invidious/views/add_playlist_items.ecr +++ b/src/invidious/views/add_playlist_items.ecr @@ -29,7 +29,7 @@ }.to_pretty_json %> - + <%= rendered "components/items_paginated" %> diff --git a/src/invidious/views/channel.ecr b/src/invidious/views/channel.ecr index 153df707..7896d7ec 100644 --- a/src/invidious/views/channel.ecr +++ b/src/invidious/views/channel.ecr @@ -45,7 +45,7 @@ <%- end -%> - + <%= author %> - Invidious diff --git a/src/invidious/views/community.ecr b/src/invidious/views/community.ecr index 132e636c..0b082998 100644 --- a/src/invidious/views/community.ecr +++ b/src/invidious/views/community.ecr @@ -43,4 +43,4 @@ }.to_pretty_json %> - + diff --git a/src/invidious/views/components/items_paginated.ecr b/src/invidious/views/components/items_paginated.ecr index f69df3fe..6513ea77 100644 --- a/src/invidious/views/components/items_paginated.ecr +++ b/src/invidious/views/components/items_paginated.ecr @@ -18,4 +18,4 @@ %> - + diff --git a/src/invidious/views/components/player.ecr b/src/invidious/views/components/player.ecr index af352102..63faab31 100644 --- a/src/invidious/views/components/player.ecr +++ b/src/invidious/views/components/player.ecr @@ -86,4 +86,4 @@ }.to_pretty_json %> - + diff --git a/src/invidious/views/components/subscribe_widget.ecr b/src/invidious/views/components/subscribe_widget.ecr index 3cfcb0eb..34c1446c 100644 --- a/src/invidious/views/components/subscribe_widget.ecr +++ b/src/invidious/views/components/subscribe_widget.ecr @@ -27,7 +27,7 @@ }.to_pretty_json %> - + <% else %> "> diff --git a/src/invidious/views/embed.ecr b/src/invidious/views/embed.ecr index 1bf5cc3e..7b7ac7c5 100644 --- a/src/invidious/views/embed.ecr +++ b/src/invidious/views/embed.ecr @@ -11,7 +11,7 @@ <%= HTML.escape(video.title) %> - Invidious - + @@ -32,6 +32,6 @@ <%= rendered "components/player" %> - + diff --git a/src/invidious/views/feeds/history.ecr b/src/invidious/views/feeds/history.ecr index 13fe4147..979cdf69 100644 --- a/src/invidious/views/feeds/history.ecr +++ b/src/invidious/views/feeds/history.ecr @@ -25,7 +25,7 @@ }.to_pretty_json %> - +
<% watched.each do |item| %> diff --git a/src/invidious/views/feeds/playlists.ecr b/src/invidious/views/feeds/playlists.ecr index 2a4b6edd..3b05e292 100644 --- a/src/invidious/views/feeds/playlists.ecr +++ b/src/invidious/views/feeds/playlists.ecr @@ -40,4 +40,4 @@ <% end %>
- + diff --git a/src/invidious/views/feeds/popular.ecr b/src/invidious/views/feeds/popular.ecr index 5fbe539c..02171431 100644 --- a/src/invidious/views/feeds/popular.ecr +++ b/src/invidious/views/feeds/popular.ecr @@ -17,4 +17,4 @@ <% end %> - + diff --git a/src/invidious/views/feeds/subscriptions.ecr b/src/invidious/views/feeds/subscriptions.ecr index f3ea349f..425a63c2 100644 --- a/src/invidious/views/feeds/subscriptions.ecr +++ b/src/invidious/views/feeds/subscriptions.ecr @@ -53,7 +53,7 @@ }.to_pretty_json %> - +
@@ -62,7 +62,7 @@ <% end %>
- + <%= IV::Frontend::Pagination.nav_numeric(locale, diff --git a/src/invidious/views/feeds/trending.ecr b/src/invidious/views/feeds/trending.ecr index 7dc416c6..93e90f78 100644 --- a/src/invidious/views/feeds/trending.ecr +++ b/src/invidious/views/feeds/trending.ecr @@ -46,4 +46,4 @@ <% end %> - + diff --git a/src/invidious/views/playlist.ecr b/src/invidious/views/playlist.ecr index c27ddba6..21cf7af9 100644 --- a/src/invidious/views/playlist.ecr +++ b/src/invidious/views/playlist.ecr @@ -118,7 +118,7 @@ }.to_pretty_json %> - + <% end %> diff --git a/src/invidious/views/post.ecr b/src/invidious/views/post.ecr index fb03a44c..ea56a2ac 100644 --- a/src/invidious/views/post.ecr +++ b/src/invidious/views/post.ecr @@ -44,5 +44,5 @@ }.to_pretty_json %> - - \ No newline at end of file + + \ No newline at end of file diff --git a/src/invidious/views/template.ecr b/src/invidious/views/template.ecr index 4599f45a..fa2358c1 100644 --- a/src/invidious/views/template.ecr +++ b/src/invidious/views/template.ecr @@ -22,7 +22,7 @@ - + -theme"> @@ -163,10 +163,10 @@ - - + + <% if env.get? "user" %> - + <% if CONFIG.enable_user_notifications %> - + <% end %> <% end %> diff --git a/src/invidious/views/watch.ecr b/src/invidious/views/watch.ecr index dc363f37..d37d6de0 100644 --- a/src/invidious/views/watch.ecr +++ b/src/invidious/views/watch.ecr @@ -199,7 +199,7 @@ we're going to need to do it here in order to allow for translations. }.to_pretty_json %> - + <% end %> <% end %> @@ -391,5 +391,5 @@ we're going to need to do it here in order to allow for translations. <% end %> - - + +