From 694c73c01d9de6d52f4f88cd319d1e82df1bfe49 Mon Sep 17 00:00:00 2001 From: Sommerwiesel Date: Wed, 18 Jun 2025 16:15:16 +0200 Subject: [PATCH] Rewrite Readme and some patches --- README.md | 10 ++ patches/010-use-redis-for-video-cache.patch | 151 ++++++++++++++++++++ patches/018-add-watch-message.patch | 16 +++ 3 files changed, 177 insertions(+) create mode 100644 patches/010-use-redis-for-video-cache.patch create mode 100644 patches/018-add-watch-message.patch diff --git a/README.md b/README.md index 63f5922..319e00f 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,16 @@ Based upon patches from: - https://github.com/yewtudotbe/invidious-custom - https://git.nadeko.net/Fijxu/invidious +# Requirements + +You'll have to set these up yourself: + +- HAProxy 2.x with my config under etc/haproxy/haproxy.conf +- PostgreSQL 16 Server +- (optional) PGBouncer, recommended when you want to host a public instance to pool connections to PSQL +- (optional) Anubis https://github.com/TecharoHQ/anubis, recommended when you want to host a public instance to prevent DDoS from bots and ai +- Nginx Web Server (1.26 or higher for quic support) + # Build instructions Do this in a separate dir (for example /srv/invidious) under non-root permissions diff --git a/patches/010-use-redis-for-video-cache.patch b/patches/010-use-redis-for-video-cache.patch new file mode 100644 index 0000000..c810b62 --- /dev/null +++ b/patches/010-use-redis-for-video-cache.patch @@ -0,0 +1,151 @@ +From 7c4c24f829b4eeb8ca035b4a9d77eef53ca8aefa Mon Sep 17 00:00:00 2001 +From: Emilien Devos +Date: Sat, 10 Jun 2023 22:21:38 +0200 +Subject: [PATCH 1/1] use redis for video cache + +--- + shard.lock | 8 ++++++++ + shard.yml | 2 ++ + src/invidious.cr | 8 +++++++- + src/invidious/config.cr | 3 +++ + src/invidious/database/videos.cr | 16 +++++++++++++--- + src/invidious/videos.cr | 2 +- + 6 files changed, 34 insertions(+), 5 deletions(-) + +diff --git a/shard.lock b/shard.lock +index 397bd8bc..8c599d1b 100644 +--- a/shard.lock ++++ b/shard.lock +@@ -36,6 +36,10 @@ shards: + git: https://github.com/will/crystal-pg.git + version: 0.28.0 + ++ pool: ++ git: https://github.com/ysbaddaden/pool.git ++ version: 0.2.4 ++ + protodec: + git: https://github.com/iv-org/protodec.git + version: 0.1.5 +@@ -44,6 +48,10 @@ shards: + git: https://github.com/luislavena/radix.git + version: 0.4.1 + ++ redis: ++ git: https://github.com/stefanwille/crystal-redis.git ++ version: 2.9.1 ++ + spectator: + git: https://github.com/icy-arctic-fox/spectator.git + version: 0.10.6 +diff --git a/shard.yml b/shard.yml +index 367f7c73..c46e1c42 100644 +--- a/shard.yml ++++ b/shard.yml +@@ -31,6 +31,8 @@ dependencies: + http_proxy: + github: mamantoha/http_proxy + version: ~> 0.10.3 ++ redis: ++ github: stefanwille/crystal-redis + + development_dependencies: + spectator: +diff --git a/src/invidious.cr b/src/invidious.cr +index 3804197e..e2d40597 100644 +--- a/src/invidious.cr ++++ b/src/invidious.cr +@@ -31,6 +31,7 @@ require "xml" + require "yaml" + require "compress/zip" + require "protodec/utils" ++require "redis" + + require "./invidious/database/*" + require "./invidious/database/migrations/*" +@@ -60,7 +61,12 @@ alias IV = Invidious + CONFIG = Config.load + HMAC_KEY = CONFIG.hmac_key + +-PG_DB = DB.open CONFIG.database_url ++PG_DB = DB.open CONFIG.database_url ++REDIS_DB = Redis::PooledClient.new(unixsocket: CONFIG.redis_socket || nil, url: CONFIG.redis_url || nil, database: CONFIG.redis_db || 0, password: CONFIG.redis_auth || nil) ++ ++if REDIS_DB.ping ++ puts "Connected to redis" ++end + ARCHIVE_URL = URI.parse("https://archive.org") + PUBSUB_URL = URI.parse("https://pubsubhubbub.appspot.com") + REDDIT_URL = URI.parse("https://www.reddit.com") +diff --git a/src/invidious/config.cr b/src/invidious/config.cr +index c4ddcdb3..5b6c576c 100644 +--- a/src/invidious/config.cr ++++ b/src/invidious/config.cr +@@ -77,6 +77,11 @@ class Config + # Used for crawling channels: threads should check all videos uploaded by a channel + property full_refresh : Bool = false + ++ property redis_url : String? ++ property redis_socket : String? ++ property redis_auth : String? ++ property redis_db : Int32? ++ + # Jobs config structure. See jobs.cr and jobs/base_job.cr + property jobs = Invidious::Jobs::JobsConfig.new + +diff --git a/src/invidious/database/videos.cr b/src/invidious/database/videos.cr +index 695f5b33..776ef5b1 100644 +--- a/src/invidious/database/videos.cr ++++ b/src/invidious/database/videos.cr +@@ -10,7 +10,8 @@ module Invidious::Database::Videos + ON CONFLICT (id) DO NOTHING + SQL + +- PG_DB.exec(request, video.id, video.info.to_json, video.updated) ++ REDIS_DB.set(video.id, video.info.to_json, ex: 3600) ++ REDIS_DB.set(video.id + ":time", video.updated, ex: 3600) + end + + def delete(id) +@@ -19,7 +20,8 @@ module Invidious::Database::Videos + WHERE id = $1 + SQL + +- PG_DB.exec(request, id) ++ REDIS_DB.del(id) ++ REDIS_DB.del(id + ":time") + end + + def delete_expired +@@ -47,6 +49,14 @@ module Invidious::Database::Videos + WHERE id = $1 + SQL + +- return PG_DB.query_one?(request, id, as: Video) ++ if ((info = REDIS_DB.get(id)) && (time = REDIS_DB.get(id + ":time"))) ++ return Video.new({ ++ id: id, ++ info: JSON.parse(info).as_h, ++ updated: Time.parse(time, "%Y-%m-%d %H:%M:%S %z", Time::Location::UTC), ++ }) ++ else ++ return nil ++ end + end + end +diff --git a/src/invidious/videos.cr b/src/invidious/videos.cr +index 6d0cf9ba..dde35291 100644 +--- a/src/invidious/videos.cr ++++ b/src/invidious/videos.cr +@@ -400,7 +400,7 @@ def get_video(id, refresh = true, region = nil, force_refresh = false) + video.schema_version != Video::SCHEMA_VERSION # cache control + begin + video = fetch_video(id, region, env) +- Invidious::Database::Videos.update(video) ++ Invidious::Database::Videos.insert(video) + rescue ex + Invidious::Database::Videos.delete(id) + raise ex +-- +2.46.0 + diff --git a/patches/018-add-watch-message.patch b/patches/018-add-watch-message.patch new file mode 100644 index 0000000..8708688 --- /dev/null +++ b/patches/018-add-watch-message.patch @@ -0,0 +1,16 @@ +diff --git a/src/invidious/views/watch.ecr b/src/invidious/views/watch.ecr +index d137672a..776ea27c 100644 +--- a/src/invidious/views/watch.ecr ++++ b/src/invidious/views/watch.ecr +@@ -72,6 +72,11 @@ we're going to need to do it here in order to allow for translations. + + <%= rendered "components/feed_menu" %> + ++
++ If the video doesn't start playing with The media could not be loaded error, please just wait for a short while (Invidious will retry automatically) or try switching to another backend.
++ This error is a simple timing problem with Invidious not waiting until the video data has been loaded from YouTube and will almost always just fix itself on its own. ++
++ +
+ <%= rendered "components/player" %> +