From 65d3d3919beab299780029479ec72ba4e517366a Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Sat, 22 Jun 2024 16:49:49 +0200 Subject: [PATCH 01/26] Translations update from Hosted Weblate (#550) Currently translated at 100.0% (206 of 206 strings) Translation: Kyoo/Kyoo Translate-URL: https://hosted.weblate.org/projects/kyoo/kyoo/tr/ Co-authored-by: PUFF1N --- front/translations/tr.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/front/translations/tr.json b/front/translations/tr.json index 31061ea0..1b2631ff 100644 --- a/front/translations/tr.json +++ b/front/translations/tr.json @@ -59,7 +59,15 @@ "desc": "azalan" }, "switchToGrid": "Izgara görünümüne geç", - "switchToList": "Liste görünümüne geç" + "switchToList": "Liste görünümüne geç", + "mediatypekey": { + "collection": "Koleksiyonlar", + "show": "Diziler", + "all": "Hepsi", + "movie": "Filmler" + }, + "mediatype-tt": "İçeriğin Türü", + "mediatypelabel": "İçeriğin Türü" }, "misc": { "settings": "Ayarlar", From 51d88270e9e0fbebbf4a572f28d671c1d55bf066 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 28 Jun 2024 01:18:46 +0700 Subject: [PATCH 02/26] Update docker/build-push-action action to v6 (#553) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index f502bc7d..a1d49dee 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -100,7 +100,7 @@ jobs: - name: Build and push id: docker_build - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 if: steps.filter.outputs.should_run == 'true' || github.event_name == 'workflow_dispatch' || startsWith(github.event.ref, 'refs/tags/v') with: context: ${{matrix.context}} From 5b8cebfc21c72f4c208d62556f54c3d49d6c96b4 Mon Sep 17 00:00:00 2001 From: Devin Buhl Date: Fri, 28 Jun 2024 09:56:30 -0400 Subject: [PATCH 03/26] chore(renovate): regexManager is not customManager (#555) --- renovate.json5 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/renovate.json5 b/renovate.json5 index a6430424..91643799 100644 --- a/renovate.json5 +++ b/renovate.json5 @@ -1,6 +1,6 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["config:recommended", ":disableRateLimiting", "regexManagers:biomeVersions"], + "extends": ["config:recommended", ":disableRateLimiting", "customManagers:biomeVersions"], "minimumReleaseAge": "5 days", "ignorePaths": ["**/front/**"], "packageRules": [ From df8b5658a727a431ef228df7c14784aaea2ed561 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sun, 30 Jun 2024 16:02:38 +0700 Subject: [PATCH 04/26] Use Base64Url form for paths. (#556) --- back/src/Kyoo.Core/Views/Helper/Transcoder.cs | 3 ++- transcoder/utils.go | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/back/src/Kyoo.Core/Views/Helper/Transcoder.cs b/back/src/Kyoo.Core/Views/Helper/Transcoder.cs index 43f25a8d..6a7ceb84 100644 --- a/back/src/Kyoo.Core/Views/Helper/Transcoder.cs +++ b/back/src/Kyoo.Core/Views/Helper/Transcoder.cs @@ -27,6 +27,7 @@ using Kyoo.Abstractions.Models.Permissions; using Kyoo.Abstractions.Models.Utils; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.WebUtilities; namespace Kyoo.Core.Api; @@ -54,7 +55,7 @@ public abstract class TranscoderApi(IRepository repository) : CrudThumbsAp private async Task _GetPath64(Identifier identifier) { string path = await GetPath(identifier); - return Convert.ToBase64String(Encoding.UTF8.GetBytes(path)); + return WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(path)); } /// diff --git a/transcoder/utils.go b/transcoder/utils.go index 9feaee4f..cd88c545 100644 --- a/transcoder/utils.go +++ b/transcoder/utils.go @@ -24,9 +24,9 @@ func GetPath(c echo.Context) (string, string, error) { if key == "" { return "", "", echo.NewHTTPError(http.StatusBadRequest, "Missing resouce path.") } - pathb, err := base64.StdEncoding.DecodeString(key) + pathb, err := base64.RawURLEncoding.DecodeString(key) if err != nil { - return "", "", echo.NewHTTPError(http.StatusBadRequest, "Invalid path. Should be base64 encoded.") + return "", "", echo.NewHTTPError(http.StatusBadRequest, "Invalid path. Should be base64url (without padding) encoded.") } path := filepath.Clean(string(pathb)) if !filepath.IsAbs(path) { From 2b144174a8848ce2ba158be9954cebba6a68a7e3 Mon Sep 17 00:00:00 2001 From: Arlan Lloyd Date: Wed, 19 Jun 2024 17:26:19 +0000 Subject: [PATCH 05/26] check in diagram --- DIAGRAMS.md | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 DIAGRAMS.md diff --git a/DIAGRAMS.md b/DIAGRAMS.md new file mode 100644 index 00000000..8fea3727 --- /dev/null +++ b/DIAGRAMS.md @@ -0,0 +1,144 @@ +# C4 Diagrams +C4 stands for Context, Container, Component, Code. + +# Context +```mermaid + C4Context + + title Context diagram for Kyoo System + Person(userA, "User A") + + System(systemA, "Kyoo", "Self-hosted media server focused on video content.") + System_Ext(systemC, "MediaLibrary", "External Media Source") + System_Ext(systemB, "ContentDatabase", "External Content Database") + + + Rel(userA, systemA, "watches") + + Rel(systemA, systemB, "fetches metadata, title screen, backgrounds, etc") + Rel(systemA, systemC, "media content source") + + UpdateLayoutConfig($c4ShapeInRow="2", $c4BoundaryInRow="1") +``` +# Container +```mermaid + C4Container + + title Container diagram for Kyoo System + Person(user, "User") + + System_Boundary(s1, "Kyoo") { + Container(frontend, "frontend") + Container(backend, "backend") + Container(scanner, "scanner") + Container(autosync, "autosync") + Container(shareq, "sharequeue") + Container(transcoder, "transcoder") + } + + System_Ext(media, "MediaLibrary", "External Media Source") + System_Ext(content, "ContentDatabase", "External Content Database") + + Rel(user, frontend, "/") + Rel(user, backend, "/api") + Rel(frontend, backend, "") + Rel(backend, shareq, "") + Rel(backend, media, "") + Rel(backend, transcoder, "") + Rel(autosync, shareq, "") + Rel(autosync, media, "") + Rel(scanner, shareq, "") + Rel(scanner, media, "") + Rel(scanner, content, "") + Rel(transcoder, media, "") + + BiRel(backend, scanner, "") + + UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="1") + +``` + + +# Component +Ideally this would be per component drill down, instead of global +```mermaid + C4Component + + title Component diagram for Kyoo + UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="2") + + Person(user, "User") + + System_Boundary(s1, "Kyoo") { + + Container_Boundary(backend, "backend") { + ComponentDb(backend_db2, "search", "Meilisearch", "search resource") + Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend") + Component(backend_c3, "BackendMetadata", "Volume", "Persistent. Distributed Metadata") + Component(backend_c1, "kyoo_migrations", "C#, .NET 8.0", "Postgres Migration") + ComponentDb(backend_db1, "backend", "Postgres", "user data and session state") + } + + Container_Boundary(frontend, "frontend") { + Component(frontend_c1, "kyoo_front", "typescript, node.js", "Static Content") + } + + Container_Boundary(shareq, "sharequeue") { + ComponentQueue(shareq_q1, "autosync", "RabbitMQ", "NEEDS DESCRIPTION. i.e dead letter queue") + ComponentQueue(shareq_q2, "scanner", "RabbitMQ", "NEEDS DESCRIPTION. i.e dead letter queue") + ComponentQueue(shareq_q3, "scanner.rescan", "RabbitMQ", "NEEDS DESCRIPTION. i.e dead letter queue") + } + + Container_Boundary(autosync, "autosync") { + Component(autosync_c1, "kyoo_autosync", "python, python3.12", "no clue") + } + + Container_Boundary(scanner, "scanner") { + Component(scanner_c2, "kyoo_scanner", "python, python3.12", "matcher. no clue") + Component(scanner_c1, "kyoo_scanner", "python, python3.12", "no clue") + } + + Container_Boundary(transcoder, "transcoder") { + Component(transcoder_c1, "kyoo_transcoder", "go, go", "Video Transcoder") + Component(transcoder_c2, "TranscodeMetadata", "Volume", "Persistent. Distributed Metadata") + Component(transcoder_c3, "TranscodeCache", "Volume", "Volatile. Local cache") + } + + + } + + Container_Boundary(media, "MediaLibrary") { + Component_Ext(media_c1, "MediaShare", "Volume", "Read Only") + } + + Container_Boundary(content, "ContentDatabase") { + Component_Ext(content_c1, "tmdb/tvdb", "Rest API", "Content Provider") + } + + Rel(user, frontend_c1, "/") + Rel(user, backend_c2, "/api") + + Rel(backend_c1, backend_db1, "Managed schema") + Rel(backend_c2, backend_db1, "") + Rel(backend_c2, backend_db2, "") + Rel(backend_c2, backend_c3, "") + Rel(backend_c2, media_c1, "") + Rel(backend_c2, transcoder_c1, "") + + Rel(autosync_c1, media_c1, "") + + Rel(frontend_c1, backend_c2, "Frontend->Backend. Why?") + + Rel(scanner_c1, content_c1, "Fetch media metadata") + Rel(scanner_c2, content_c1, "Fetch media metadata") + Rel(scanner_c2, backend_c2, "Pushes media metadata") + Rel(scanner_c1, media_c1, "") + Rel(scanner_c2, media_c1, "") + + Rel(transcoder_c1, media_c1, "") + Rel(transcoder_c1, transcoder_c2, "") + Rel(transcoder_c1, transcoder_c3, "") + + BiRel(backend_c2, scanner_c1, "Request/Push media metadata") + +``` From 085f2c27a0a19b591adbd9271e366df4c0d3fd8a Mon Sep 17 00:00:00 2001 From: Arlan Lloyd Date: Wed, 19 Jun 2024 21:47:58 +0000 Subject: [PATCH 06/26] update diagram --- DIAGRAMS.md | 64 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/DIAGRAMS.md b/DIAGRAMS.md index 8fea3727..7c061d84 100644 --- a/DIAGRAMS.md +++ b/DIAGRAMS.md @@ -6,17 +6,19 @@ C4 stands for Context, Container, Component, Code. C4Context title Context diagram for Kyoo System - Person(userA, "User A") + Person(user, "User") - System(systemA, "Kyoo", "Self-hosted media server focused on video content.") - System_Ext(systemC, "MediaLibrary", "External Media Source") - System_Ext(systemB, "ContentDatabase", "External Content Database") + System(kyoo, "Kyoo", "Self-hosted media server focused on video content.") + System_Ext(media, "MediaLibrary", "") + System_Ext(content, "ContentDatabase", "Media Info. Artwork, etc.") + System_Ext(tracker, "ActivityTracker", "") - Rel(userA, systemA, "watches") + Rel(user, kyoo, "watches") - Rel(systemA, systemB, "fetches metadata, title screen, backgrounds, etc") - Rel(systemA, systemC, "media content source") + Rel(kyoo, content, "fetches metadata, title screen, backgrounds, etc") + Rel(kyoo, media, "media content source") + Rel(kyoo, tracker, "update tracking") UpdateLayoutConfig($c4ShapeInRow="2", $c4BoundaryInRow="1") ``` @@ -32,22 +34,24 @@ C4 stands for Context, Container, Component, Code. Container(backend, "backend") Container(scanner, "scanner") Container(autosync, "autosync") - Container(shareq, "sharequeue") + Container(sharem, "sharemessage") Container(transcoder, "transcoder") } - System_Ext(media, "MediaLibrary", "External Media Source") - System_Ext(content, "ContentDatabase", "External Content Database") + System_Ext(media, "MediaLibrary", "") + System_Ext(content, "ContentDatabase", "") + System_Ext(tracker, "ActivityTracker", "") Rel(user, frontend, "/") Rel(user, backend, "/api") Rel(frontend, backend, "") - Rel(backend, shareq, "") + Rel(backend, sharem, "") Rel(backend, media, "") Rel(backend, transcoder, "") - Rel(autosync, shareq, "") + Rel(autosync, sharem, "") Rel(autosync, media, "") - Rel(scanner, shareq, "") + Rel(autosync, tracker, "") + Rel(scanner, sharem, "") Rel(scanner, media, "") Rel(scanner, content, "") Rel(transcoder, media, "") @@ -83,19 +87,21 @@ Ideally this would be per component drill down, instead of global Component(frontend_c1, "kyoo_front", "typescript, node.js", "Static Content") } - Container_Boundary(shareq, "sharequeue") { - ComponentQueue(shareq_q1, "autosync", "RabbitMQ", "NEEDS DESCRIPTION. i.e dead letter queue") - ComponentQueue(shareq_q2, "scanner", "RabbitMQ", "NEEDS DESCRIPTION. i.e dead letter queue") - ComponentQueue(shareq_q3, "scanner.rescan", "RabbitMQ", "NEEDS DESCRIPTION. i.e dead letter queue") + Container_Boundary(sharem, "sharemessage") { + ComponentQueue(sharem_e1, "events.watched", "RabbitMQ, Exchange", "") + ComponentQueue(sharem_e2, "events.resource", "RabbitMQ, Exchange", "") + ComponentQueue(sharem_q1, "autosync", "RabbitMQ, Queue", "") + ComponentQueue(sharem_q2, "scanner.rescan", "RabbitMQ, Queue", "") } Container_Boundary(autosync, "autosync") { - Component(autosync_c1, "kyoo_autosync", "python, python3.12", "no clue") + Component(autosync_c1, "kyoo_autosync", "python, python3.12", "") } Container_Boundary(scanner, "scanner") { Component(scanner_c2, "kyoo_scanner", "python, python3.12", "matcher. no clue") Component(scanner_c1, "kyoo_scanner", "python, python3.12", "no clue") + ComponentQueue(scanner_q1, "scanner", "RabbitMQ", "") } Container_Boundary(transcoder, "transcoder") { @@ -112,26 +118,38 @@ Ideally this would be per component drill down, instead of global } Container_Boundary(content, "ContentDatabase") { - Component_Ext(content_c1, "tmdb/tvdb", "Rest API", "Content Provider") + Component_Ext(content_c1, "ContentProvider", "API", "tmdb or tvdb") } - Rel(user, frontend_c1, "/") - Rel(user, backend_c2, "/api") + Container_Boundary(tracker, "ActivityTracker") { + Component_Ext(tracker_c1, "TrackerProvider", "API", "simkl") + } + + Rel(user, frontend_c1, "") + Rel(user, backend_c2, "") Rel(backend_c1, backend_db1, "Managed schema") Rel(backend_c2, backend_db1, "") Rel(backend_c2, backend_db2, "") + Rel(backend_c2, sharem_q2, "produces") + Rel(backend_c2, sharem_e1, "produces") + Rel(backend_c2, sharem_e2, "produces") Rel(backend_c2, backend_c3, "") Rel(backend_c2, media_c1, "") Rel(backend_c2, transcoder_c1, "") Rel(autosync_c1, media_c1, "") + Rel(autosync_c1, tracker_c1, "") + Rel(autosync_c1, sharem_q1, "consumes") - Rel(frontend_c1, backend_c2, "Frontend->Backend. Why?") + Rel(frontend_c1, backend_c2, "") Rel(scanner_c1, content_c1, "Fetch media metadata") + Rel(scanner_c1, scanner_q1, "consumes") Rel(scanner_c2, content_c1, "Fetch media metadata") Rel(scanner_c2, backend_c2, "Pushes media metadata") + Rel(scanner_c2, scanner_q1, "produces") + Rel(scanner_c2, sharem_q2, "consumes") Rel(scanner_c1, media_c1, "") Rel(scanner_c2, media_c1, "") @@ -139,6 +157,8 @@ Ideally this would be per component drill down, instead of global Rel(transcoder_c1, transcoder_c2, "") Rel(transcoder_c1, transcoder_c3, "") + Rel(sharem_e1, sharem_q1, "bound") + BiRel(backend_c2, scanner_c1, "Request/Push media metadata") ``` From 4cac395d9f943f310f5c8860bb38450f1cfe9e92 Mon Sep 17 00:00:00 2001 From: Arlan Lloyd Date: Thu, 20 Jun 2024 14:05:00 +0000 Subject: [PATCH 07/26] no autosync/media relationship --- DIAGRAMS.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/DIAGRAMS.md b/DIAGRAMS.md index 7c061d84..63c23df5 100644 --- a/DIAGRAMS.md +++ b/DIAGRAMS.md @@ -49,7 +49,6 @@ C4 stands for Context, Container, Component, Code. Rel(backend, media, "") Rel(backend, transcoder, "") Rel(autosync, sharem, "") - Rel(autosync, media, "") Rel(autosync, tracker, "") Rel(scanner, sharem, "") Rel(scanner, media, "") @@ -138,7 +137,6 @@ Ideally this would be per component drill down, instead of global Rel(backend_c2, media_c1, "") Rel(backend_c2, transcoder_c1, "") - Rel(autosync_c1, media_c1, "") Rel(autosync_c1, tracker_c1, "") Rel(autosync_c1, sharem_q1, "consumes") From 07e500e6e2579a1113ce63f7ccb153a649bbbcca Mon Sep 17 00:00:00 2001 From: Arlan Lloyd Date: Thu, 20 Jun 2024 14:08:37 +0000 Subject: [PATCH 08/26] fix description --- DIAGRAMS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DIAGRAMS.md b/DIAGRAMS.md index 63c23df5..64b2b60b 100644 --- a/DIAGRAMS.md +++ b/DIAGRAMS.md @@ -100,7 +100,7 @@ Ideally this would be per component drill down, instead of global Container_Boundary(scanner, "scanner") { Component(scanner_c2, "kyoo_scanner", "python, python3.12", "matcher. no clue") Component(scanner_c1, "kyoo_scanner", "python, python3.12", "no clue") - ComponentQueue(scanner_q1, "scanner", "RabbitMQ", "") + ComponentQueue(scanner_q1, "scanner", "RabbitMQ, Queue", "") } Container_Boundary(transcoder, "transcoder") { From 6c76b772b06b862565836ad031e7af6200d75fc5 Mon Sep 17 00:00:00 2001 From: Arlan Lloyd Date: Thu, 20 Jun 2024 16:30:31 +0000 Subject: [PATCH 09/26] small updates --- DIAGRAMS.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/DIAGRAMS.md b/DIAGRAMS.md index 64b2b60b..fc81ceaa 100644 --- a/DIAGRAMS.md +++ b/DIAGRAMS.md @@ -98,8 +98,8 @@ Ideally this would be per component drill down, instead of global } Container_Boundary(scanner, "scanner") { - Component(scanner_c2, "kyoo_scanner", "python, python3.12", "matcher. no clue") - Component(scanner_c1, "kyoo_scanner", "python, python3.12", "no clue") + Component(scanner_c2, "kyoo_scanner", "python, python3.12", "matcher") + Component(scanner_c1, "kyoo_scanner", "python, python3.12", "scanner") ComponentQueue(scanner_q1, "scanner", "RabbitMQ, Queue", "") } @@ -142,14 +142,12 @@ Ideally this would be per component drill down, instead of global Rel(frontend_c1, backend_c2, "") - Rel(scanner_c1, content_c1, "Fetch media metadata") - Rel(scanner_c1, scanner_q1, "consumes") + Rel(scanner_c1, scanner_q1, "produces") Rel(scanner_c2, content_c1, "Fetch media metadata") Rel(scanner_c2, backend_c2, "Pushes media metadata") - Rel(scanner_c2, scanner_q1, "produces") + Rel(scanner_c2, scanner_q1, "consumes") Rel(scanner_c2, sharem_q2, "consumes") Rel(scanner_c1, media_c1, "") - Rel(scanner_c2, media_c1, "") Rel(transcoder_c1, media_c1, "") Rel(transcoder_c1, transcoder_c2, "") From 6c9f4c7ec489e38ca4aea30bb22adf8f4019f86b Mon Sep 17 00:00:00 2001 From: Arlan Lloyd Date: Fri, 21 Jun 2024 09:43:17 +0000 Subject: [PATCH 10/26] add project + update c4 --- DIAGRAMS.md | 160 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 113 insertions(+), 47 deletions(-) diff --git a/DIAGRAMS.md b/DIAGRAMS.md index fc81ceaa..75b57ed6 100644 --- a/DIAGRAMS.md +++ b/DIAGRAMS.md @@ -1,64 +1,130 @@ -# C4 Diagrams -C4 stands for Context, Container, Component, Code. +# Diagrams -# Context +# Project Structure +Kyoo is a monorepo that consists of several projects each in their own directory. Diagram below shows an outline of kyoo, projects, and artifacts. + +```mermaid +block-beta + columns 1 + block:proj1:1 + proj_name["Kyoo"]:1 + end + block:proj2:1 + dir_1["autosync/"] + dir_2["back/"] + dir_3["front/"] + dir_4["transcoder/"] + dir_5["scanner/"] + end + block:proj3:1 + %% columns auto (default) + block:autosync_b:1 + autosync_i1("kyoo_autosync") + end + block:back_b:1 + columns 1 + back_i1("kyoo_back") + back_i2("kyoo_migrations") + end + block:front_b:1 + front_i1("kyoo_front") + end + block:transcoder_b:1 + transcoder_i1("kyoo_transcoder") + end + block:scanner_b:1 + columns 1 + scanner_i1("kyoo_scanner") + scanner_i2("kyoo_scanner*") + end + end + + style proj_name fill:transparent,stroke-width:0px + style proj1 fill:#1168bd,stroke-width:0px + style proj2 fill:#1168bd,stroke-width:0px + style proj3 fill:#1168bd,stroke-width:0px + + style dir_1 fill:#438dd5,stroke-width:0px + style dir_2 fill:#438dd5,stroke-width:0px + style dir_3 fill:#438dd5,stroke-width:0px + style dir_4 fill:#438dd5,stroke-width:0px + style dir_5 fill:#438dd5,stroke-width:0px + + style autosync_b fill:#438dd5,stroke-width:0px + style back_b fill:#438dd5,stroke-width:0px + style front_b fill:#438dd5,stroke-width:0px + style transcoder_b fill:#438dd5,stroke-width:0px + style scanner_b fill:#438dd5,stroke-width:0px + + style autosync_i1 fill:#85bbf0,stroke-width:0px + style back_i1 fill:#85bbf0,stroke-width:0px + style back_i2 fill:#85bbf0,stroke-width:0px + style front_i1 fill:#85bbf0,stroke-width:0px + style transcoder_i1 fill:#85bbf0,stroke-width:0px + style scanner_i1 fill:#85bbf0,stroke-width:0px + style scanner_i2 fill:#85bbf0,stroke-width:0px +``` + +# C4 Diagrams +Diagrams that focus on capturing project from a high level point of view. Context, Container, Component, Code + +## Context ```mermaid C4Context title Context diagram for Kyoo System Person(user, "User") - System(kyoo, "Kyoo", "Self-hosted media server focused on video content.") - System_Ext(media, "MediaLibrary", "") - System_Ext(content, "ContentDatabase", "Media Info. Artwork, etc.") - System_Ext(tracker, "ActivityTracker", "") - - - Rel(user, kyoo, "watches") - - Rel(kyoo, content, "fetches metadata, title screen, backgrounds, etc") - Rel(kyoo, media, "media content source") - Rel(kyoo, tracker, "update tracking") - - UpdateLayoutConfig($c4ShapeInRow="2", $c4BoundaryInRow="1") -``` -# Container -```mermaid - C4Container - - title Container diagram for Kyoo System - Person(user, "User") - - System_Boundary(s1, "Kyoo") { - Container(frontend, "frontend") - Container(backend, "backend") - Container(scanner, "scanner") - Container(autosync, "autosync") - Container(sharem, "sharemessage") - Container(transcoder, "transcoder") - } - + System(kyoo, "Kyoo", "") System_Ext(media, "MediaLibrary", "") System_Ext(content, "ContentDatabase", "") System_Ext(tracker, "ActivityTracker", "") - Rel(user, frontend, "/") - Rel(user, backend, "/api") - Rel(frontend, backend, "") - Rel(backend, sharem, "") - Rel(backend, media, "") - Rel(backend, transcoder, "") - Rel(autosync, sharem, "") - Rel(autosync, tracker, "") - Rel(scanner, sharem, "") - Rel(scanner, media, "") - Rel(scanner, content, "") - Rel(transcoder, media, "") + Rel(user, kyoo, "") + Rel(kyoo, content, "") + Rel(kyoo, media, "") + Rel(kyoo, tracker, "") + UpdateLayoutConfig($c4ShapeInRow="2", $c4BoundaryInRow="2") +``` - BiRel(backend, scanner, "") +## Container +Messaging is middleware. EnterpriseMessageBus is for any messaging handled between different projects. +```mermaid + C4Container + UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="1") + title Container diagram for Kyoo System + Person(user, "User") - UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="1") + System_Boundary(internal, "Kyoo") { + Container(frontend, "front/") + Container(backend, "back/") + Container(transcoder, "transcoder/") + Container(autosync, "autosync/") + ContainerQueue(emb, "emb", "", "EnterpriseMessageBus") + Container(scanner, "scanner/") + } + + System_Boundary(external, "External") { + System_Ext(tracker, "ActivityTracker", "") + System_Ext(media, "MediaLibrary", "") + System_Ext(content, "ContentDatabase", "") + + } + + Rel(user, frontend, "") + Rel(user, backend, "") + Rel(frontend, backend, "") + Rel(backend, emb, "") + Rel(backend, media, "") + Rel(backend, transcoder, "") + Rel_Back(autosync, emb, "") + Rel(autosync, tracker, "") + Rel_Back(scanner, emb, "") + Rel(scanner, backend, "") + Rel(scanner, media, "") + Rel(scanner, content, "") + Rel(transcoder, media, "") ``` From 257679a19c11051e7cacf4ec0244d0ecc45e1743 Mon Sep 17 00:00:00 2001 From: Arlan Lloyd Date: Fri, 21 Jun 2024 10:28:15 +0000 Subject: [PATCH 11/26] splitting up megadiagram --- DIAGRAMS.md | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/DIAGRAMS.md b/DIAGRAMS.md index 75b57ed6..198f5240 100644 --- a/DIAGRAMS.md +++ b/DIAGRAMS.md @@ -129,6 +129,81 @@ Messaging is middleware. EnterpriseMessageBus is for any messaging handled betw # Component +# Component + +## Autosync +```mermaid + C4Component + title Component Diagram + UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="2") + + Container_Boundary(autosync, "autosync") { + Component(autosync_c1, "kyoo_autosync", "python, python3.12", "") + } + + Container_Boundary(emb, "emb") { + ComponentQueue(emb_q1, "autosync", "RabbitMQ, Queue", "") + ComponentQueue(emb_e1, "events.watched", "RabbitMQ, Exchange", "") + + } + + Container_Boundary(tracker, "ActivityTracker") { + Component_Ext(tracker_c1, "TrackerProvider", "API", "simkl") + } + + Container_Boundary(backend, "back") { + Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend") + } + + Rel(emb_e1, emb_q1, "bound") + Rel(autosync_c1, emb_q1, "consumes") + Rel(backend_c2, emb_e1, "produces") + Rel(autosync_c1, tracker_c1, "updates") +``` + +## Scanner +```mermaid + C4Component + title Component Diagram + UpdateLayoutConfig($c4ShapeInRow="1", $c4BoundaryInRow="3") + + Container_Boundary(media, "MediaLibrary") { + Component_Ext(media_c1, "MediaShare", "Volume", "Read Only") + } + + Container_Boundary(scanner, "scanner") { + Component(scanner_c1, "kyoo_scanner", "python, python3.12", "scanner") + ComponentQueue(scanner_q1, "scanner", "RabbitMQ, Queue", "") + Component(scanner_c2, "kyoo_scanner", "python, python3.12", "matcher") + + + } + + Container_Boundary(emb, "emb") { + ComponentQueue(emb_q2, "scanner.rescan", "RabbitMQ, Queue", "") + } + + + + + Container_Boundary(content, "ContentDatabase") { + Component_Ext(content_c1, "ContentProvider", "API", "tmdb or tvdb") + } + Container_Boundary(backend, "back") { + Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend") + } + + + Rel(scanner_c1, scanner_q1, "produces") + Rel(scanner_c1, media_c1, "watches") + Rel(scanner_c2, content_c1, "Fetch media data") + Rel(scanner_c2, backend_c2, "Pushes media data") + Rel(scanner_c2, scanner_q1, "consumes") + Rel(scanner_c2, emb_q2, "consumes") + Rel(backend_c2, emb_q2, "produces") +``` + +## OLD Ideally this would be per component drill down, instead of global ```mermaid C4Component From 8b90ae4398f51c5617c3b36807916befc0fc47e8 Mon Sep 17 00:00:00 2001 From: Arlan Lloyd Date: Fri, 21 Jun 2024 10:28:59 +0000 Subject: [PATCH 12/26] fix typo --- DIAGRAMS.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/DIAGRAMS.md b/DIAGRAMS.md index 198f5240..f4da7b84 100644 --- a/DIAGRAMS.md +++ b/DIAGRAMS.md @@ -129,8 +129,6 @@ Messaging is middleware. EnterpriseMessageBus is for any messaging handled betw # Component -# Component - ## Autosync ```mermaid C4Component From 777984a1fbefe3a3cd45c753d11dd0bf51e6fcbc Mon Sep 17 00:00:00 2001 From: Arlan Lloyd Date: Fri, 21 Jun 2024 10:39:18 +0000 Subject: [PATCH 13/26] add frontend --- DIAGRAMS.md | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/DIAGRAMS.md b/DIAGRAMS.md index f4da7b84..be2b8a2b 100644 --- a/DIAGRAMS.md +++ b/DIAGRAMS.md @@ -159,6 +159,26 @@ Messaging is middleware. EnterpriseMessageBus is for any messaging handled betw Rel(autosync_c1, tracker_c1, "updates") ``` +## Front +```mermaid + C4Component + title Component Diagram + UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="2") + + Person(user, "User") + + Container_Boundary(frontend, "frontend") { + Component(frontend_c1, "kyoo_front", "typescript, node.js", "Static Content") + } + + Container_Boundary(backend, "back") { + Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend") + } + + Rel(frontend_c1, backend_c2, "ssr") + Rel(user, frontend_c1, "") +``` + ## Scanner ```mermaid C4Component @@ -181,9 +201,6 @@ Messaging is middleware. EnterpriseMessageBus is for any messaging handled betw ComponentQueue(emb_q2, "scanner.rescan", "RabbitMQ, Queue", "") } - - - Container_Boundary(content, "ContentDatabase") { Component_Ext(content_c1, "ContentProvider", "API", "tmdb or tvdb") } From ac3438a96de4dd8d02b5ff853240bedee6ebb99a Mon Sep 17 00:00:00 2001 From: Arlan Lloyd Date: Fri, 21 Jun 2024 10:47:17 +0000 Subject: [PATCH 14/26] add transcoder --- DIAGRAMS.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/DIAGRAMS.md b/DIAGRAMS.md index be2b8a2b..3cda4bbb 100644 --- a/DIAGRAMS.md +++ b/DIAGRAMS.md @@ -218,6 +218,32 @@ Messaging is middleware. EnterpriseMessageBus is for any messaging handled betw Rel(backend_c2, emb_q2, "produces") ``` +## Transcoder +```mermaid + C4Component + title Component Diagram + UpdateLayoutConfig($c4ShapeInRow="2", $c4BoundaryInRow="2") + + Container_Boundary(transcoder, "transcoder") { + Component(transcoder_c2, "TranscodeMetadata", "Volume", "Persistent. Distributed Metadata") + Component(transcoder_c1, "kyoo_transcoder", "go, go", "Video Transcoder") + Component(transcoder_c3, "TranscodeCache", "Volume", "Volatile. Local cache") + } + + Container_Boundary(media, "MediaLibrary") { + Component_Ext(media_c1, "MediaShare", "Volume", "Read Only") + } + + Container_Boundary(backend, "back") { + Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend") + } + + Rel(transcoder_c1, media_c1, "mounts") + Rel(transcoder_c1, transcoder_c2, "") + Rel(transcoder_c1, transcoder_c3, "") + Rel(backend_c2, transcoder_c1, "") +``` + ## OLD Ideally this would be per component drill down, instead of global ```mermaid From 4b6bc0014a105231d13d7373b94263d15ceb499a Mon Sep 17 00:00:00 2001 From: Arlan Lloyd Date: Fri, 21 Jun 2024 11:10:06 +0000 Subject: [PATCH 15/26] add backend remove old --- DIAGRAMS.md | 167 ++++++++++++++++++++-------------------------------- 1 file changed, 65 insertions(+), 102 deletions(-) diff --git a/DIAGRAMS.md b/DIAGRAMS.md index 3cda4bbb..d6cb4d9a 100644 --- a/DIAGRAMS.md +++ b/DIAGRAMS.md @@ -118,9 +118,9 @@ Messaging is middleware. EnterpriseMessageBus is for any messaging handled betw Rel(backend, emb, "") Rel(backend, media, "") Rel(backend, transcoder, "") - Rel_Back(autosync, emb, "") + Rel(autosync, emb, "") Rel(autosync, tracker, "") - Rel_Back(scanner, emb, "") + Rel(scanner, emb, "") Rel(scanner, backend, "") Rel(scanner, media, "") Rel(scanner, content, "") @@ -159,6 +159,68 @@ Messaging is middleware. EnterpriseMessageBus is for any messaging handled betw Rel(autosync_c1, tracker_c1, "updates") ``` +## Back +```mermaid + C4Component + title Component Diagram + UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="3") + + Person(user, "User") + + Container_Boundary(backend, "backend") { + Component(backend_c1, "kyoo_migrations", "C#, .NET 8.0", "Postgres Migration") + ComponentDb(backend_db2, "search", "Meilisearch", "search resource") + Component(backend_c3, "BackendMetadata", "Volume", "Persistent. Distributed Metadata") + ComponentDb(backend_db1, "backend", "Postgres", "user data and session state") + Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend") + } + + Container_Boundary(media, "MediaLibrary") { + Component_Ext(media_c1, "MediaShare", "Volume", "Read Only") + } + + Container_Boundary(transcoder, "transcoder") { + Component(transcoder_c1, "kyoo_transcoder", "go, go", "Video Transcoder") + } + + Container_Boundary(scanner, "scanner") { + Component(scanner_c2, "kyoo_scanner", "python, python3.12", "matcher") + } + + Container_Boundary(emb, "embessage") { + ComponentQueue(emb_q2, "scanner.rescan", "RabbitMQ, Queue", "") + ComponentQueue(emb_e2, "events.resource", "RabbitMQ, Exchange", "unused") + ComponentQueue(emb_e1, "events.watched", "RabbitMQ, Exchange", "") + ComponentQueue(emb_q1, "autosync", "RabbitMQ, Queue", "") + } + + Container_Boundary(autosync, "autosync") { + Component(autosync_c1, "kyoo_autosync", "python, python3.12", "") + } + + + + Rel(user, backend_c2, "") + + Rel(backend_c1, backend_db1, "") + + Rel(backend_c2, backend_db1, "") + Rel(backend_c2, backend_db2, "") + Rel(backend_c2, media_c1, "") + Rel(backend_c2, transcoder_c1, "") + Rel(backend_c2, backend_c3, "") + + Rel(backend_c2, emb_q2, "produces") + Rel(backend_c2, emb_e1, "produces") + Rel(backend_c2, emb_e2, "produces") + + Rel(emb_e1, emb_q1, "bound") + + Rel(autosync_c1, emb_q1, "consumes") + + Rel(scanner_c2, emb_q2, "consumes") +``` + ## Front ```mermaid C4Component @@ -193,8 +255,6 @@ Messaging is middleware. EnterpriseMessageBus is for any messaging handled betw Component(scanner_c1, "kyoo_scanner", "python, python3.12", "scanner") ComponentQueue(scanner_q1, "scanner", "RabbitMQ, Queue", "") Component(scanner_c2, "kyoo_scanner", "python, python3.12", "matcher") - - } Container_Boundary(emb, "emb") { @@ -242,101 +302,4 @@ Messaging is middleware. EnterpriseMessageBus is for any messaging handled betw Rel(transcoder_c1, transcoder_c2, "") Rel(transcoder_c1, transcoder_c3, "") Rel(backend_c2, transcoder_c1, "") -``` - -## OLD -Ideally this would be per component drill down, instead of global -```mermaid - C4Component - - title Component diagram for Kyoo - UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="2") - - Person(user, "User") - - System_Boundary(s1, "Kyoo") { - - Container_Boundary(backend, "backend") { - ComponentDb(backend_db2, "search", "Meilisearch", "search resource") - Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend") - Component(backend_c3, "BackendMetadata", "Volume", "Persistent. Distributed Metadata") - Component(backend_c1, "kyoo_migrations", "C#, .NET 8.0", "Postgres Migration") - ComponentDb(backend_db1, "backend", "Postgres", "user data and session state") - } - - Container_Boundary(frontend, "frontend") { - Component(frontend_c1, "kyoo_front", "typescript, node.js", "Static Content") - } - - Container_Boundary(sharem, "sharemessage") { - ComponentQueue(sharem_e1, "events.watched", "RabbitMQ, Exchange", "") - ComponentQueue(sharem_e2, "events.resource", "RabbitMQ, Exchange", "") - ComponentQueue(sharem_q1, "autosync", "RabbitMQ, Queue", "") - ComponentQueue(sharem_q2, "scanner.rescan", "RabbitMQ, Queue", "") - } - - Container_Boundary(autosync, "autosync") { - Component(autosync_c1, "kyoo_autosync", "python, python3.12", "") - } - - Container_Boundary(scanner, "scanner") { - Component(scanner_c2, "kyoo_scanner", "python, python3.12", "matcher") - Component(scanner_c1, "kyoo_scanner", "python, python3.12", "scanner") - ComponentQueue(scanner_q1, "scanner", "RabbitMQ, Queue", "") - } - - Container_Boundary(transcoder, "transcoder") { - Component(transcoder_c1, "kyoo_transcoder", "go, go", "Video Transcoder") - Component(transcoder_c2, "TranscodeMetadata", "Volume", "Persistent. Distributed Metadata") - Component(transcoder_c3, "TranscodeCache", "Volume", "Volatile. Local cache") - } - - - } - - Container_Boundary(media, "MediaLibrary") { - Component_Ext(media_c1, "MediaShare", "Volume", "Read Only") - } - - Container_Boundary(content, "ContentDatabase") { - Component_Ext(content_c1, "ContentProvider", "API", "tmdb or tvdb") - } - - Container_Boundary(tracker, "ActivityTracker") { - Component_Ext(tracker_c1, "TrackerProvider", "API", "simkl") - } - - Rel(user, frontend_c1, "") - Rel(user, backend_c2, "") - - Rel(backend_c1, backend_db1, "Managed schema") - Rel(backend_c2, backend_db1, "") - Rel(backend_c2, backend_db2, "") - Rel(backend_c2, sharem_q2, "produces") - Rel(backend_c2, sharem_e1, "produces") - Rel(backend_c2, sharem_e2, "produces") - Rel(backend_c2, backend_c3, "") - Rel(backend_c2, media_c1, "") - Rel(backend_c2, transcoder_c1, "") - - Rel(autosync_c1, tracker_c1, "") - Rel(autosync_c1, sharem_q1, "consumes") - - Rel(frontend_c1, backend_c2, "") - - Rel(scanner_c1, scanner_q1, "produces") - Rel(scanner_c2, content_c1, "Fetch media metadata") - Rel(scanner_c2, backend_c2, "Pushes media metadata") - Rel(scanner_c2, scanner_q1, "consumes") - Rel(scanner_c2, sharem_q2, "consumes") - Rel(scanner_c1, media_c1, "") - - Rel(transcoder_c1, media_c1, "") - Rel(transcoder_c1, transcoder_c2, "") - Rel(transcoder_c1, transcoder_c3, "") - - Rel(sharem_e1, sharem_q1, "bound") - - BiRel(backend_c2, scanner_c1, "Request/Push media metadata") - -``` +``` \ No newline at end of file From 53321ee53c9a14cc64740e8d60434b58450fe123 Mon Sep 17 00:00:00 2001 From: Arlan Lloyd Date: Fri, 21 Jun 2024 11:22:06 +0000 Subject: [PATCH 16/26] update formatting --- DIAGRAMS.md | 142 ++++++++++++++++++++++------------------------------ 1 file changed, 60 insertions(+), 82 deletions(-) diff --git a/DIAGRAMS.md b/DIAGRAMS.md index d6cb4d9a..9f9258d0 100644 --- a/DIAGRAMS.md +++ b/DIAGRAMS.md @@ -70,85 +70,81 @@ Diagrams that focus on capturing project from a high level point of view. Contex ## Context ```mermaid - C4Context +C4Context + UpdateLayoutConfig($c4ShapeInRow="2", $c4BoundaryInRow="2") + + title Context Diagram for Kyoo + + Person(user, "User") + System(kyoo, "Kyoo", "") + System_Ext(media, "MediaLibrary", "") + System_Ext(content, "ContentDatabase", "") + System_Ext(tracker, "ActivityTracker", "") - title Context diagram for Kyoo System - Person(user, "User") - - System(kyoo, "Kyoo", "") - System_Ext(media, "MediaLibrary", "") - System_Ext(content, "ContentDatabase", "") - System_Ext(tracker, "ActivityTracker", "") - - Rel(user, kyoo, "") - Rel(kyoo, content, "") - Rel(kyoo, media, "") - Rel(kyoo, tracker, "") - UpdateLayoutConfig($c4ShapeInRow="2", $c4BoundaryInRow="2") + Rel(user, kyoo, "") + Rel(kyoo, content, "") + Rel(kyoo, media, "") + Rel(kyoo, tracker, "") ``` ## Container Messaging is middleware. EnterpriseMessageBus is for any messaging handled between different projects. ```mermaid - C4Container +C4Container UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="1") + title Container diagram for Kyoo System - Person(user, "User") - System_Boundary(internal, "Kyoo") { - Container(frontend, "front/") - Container(backend, "back/") - Container(transcoder, "transcoder/") + Person(user, "User") + System_Boundary(internal, "Kyoo") { + Container(frontend, "front/") + Container(backend, "back/") + Container(transcoder, "transcoder/") + Container(autosync, "autosync/") + ContainerQueue(emb, "emb", "", "EnterpriseMessageBus") + Container(scanner, "scanner/") + } + System_Boundary(external, "External") { + System_Ext(tracker, "ActivityTracker", "") + System_Ext(media, "MediaLibrary", "") + System_Ext(content, "ContentDatabase", "") + } - Container(autosync, "autosync/") - ContainerQueue(emb, "emb", "", "EnterpriseMessageBus") - Container(scanner, "scanner/") - } - - System_Boundary(external, "External") { - System_Ext(tracker, "ActivityTracker", "") - System_Ext(media, "MediaLibrary", "") - System_Ext(content, "ContentDatabase", "") - - } - - Rel(user, frontend, "") - Rel(user, backend, "") - Rel(frontend, backend, "") - Rel(backend, emb, "") - Rel(backend, media, "") - Rel(backend, transcoder, "") - Rel(autosync, emb, "") - Rel(autosync, tracker, "") - Rel(scanner, emb, "") - Rel(scanner, backend, "") - Rel(scanner, media, "") - Rel(scanner, content, "") - Rel(transcoder, media, "") + Rel(user, frontend, "") + Rel(user, backend, "") + Rel(frontend, backend, "") + Rel(backend, emb, "") + Rel(backend, media, "") + Rel(backend, transcoder, "") + Rel(autosync, emb, "") + Rel(autosync, tracker, "") + Rel(scanner, emb, "") + Rel(scanner, backend, "") + Rel(scanner, media, "") + Rel(scanner, content, "") + Rel(transcoder, media, "") ``` # Component ## Autosync ```mermaid - C4Component - title Component Diagram +C4Component UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="2") + title Component Diagram for Autosync + Container_Boundary(autosync, "autosync") { Component(autosync_c1, "kyoo_autosync", "python, python3.12", "") } - Container_Boundary(emb, "emb") { ComponentQueue(emb_q1, "autosync", "RabbitMQ, Queue", "") ComponentQueue(emb_e1, "events.watched", "RabbitMQ, Exchange", "") } - Container_Boundary(tracker, "ActivityTracker") { Component_Ext(tracker_c1, "TrackerProvider", "API", "simkl") } - Container_Boundary(backend, "back") { Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend") } @@ -161,78 +157,64 @@ Messaging is middleware. EnterpriseMessageBus is for any messaging handled betw ## Back ```mermaid - C4Component - title Component Diagram +C4Component UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="3") + + title Component Diagram for Back Person(user, "User") - - Container_Boundary(backend, "backend") { + Container_Boundary(backend, "back") { Component(backend_c1, "kyoo_migrations", "C#, .NET 8.0", "Postgres Migration") ComponentDb(backend_db2, "search", "Meilisearch", "search resource") Component(backend_c3, "BackendMetadata", "Volume", "Persistent. Distributed Metadata") ComponentDb(backend_db1, "backend", "Postgres", "user data and session state") Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend") } - Container_Boundary(media, "MediaLibrary") { Component_Ext(media_c1, "MediaShare", "Volume", "Read Only") } - Container_Boundary(transcoder, "transcoder") { Component(transcoder_c1, "kyoo_transcoder", "go, go", "Video Transcoder") } - Container_Boundary(scanner, "scanner") { Component(scanner_c2, "kyoo_scanner", "python, python3.12", "matcher") } - Container_Boundary(emb, "embessage") { ComponentQueue(emb_q2, "scanner.rescan", "RabbitMQ, Queue", "") ComponentQueue(emb_e2, "events.resource", "RabbitMQ, Exchange", "unused") ComponentQueue(emb_e1, "events.watched", "RabbitMQ, Exchange", "") ComponentQueue(emb_q1, "autosync", "RabbitMQ, Queue", "") } - Container_Boundary(autosync, "autosync") { Component(autosync_c1, "kyoo_autosync", "python, python3.12", "") } - - Rel(user, backend_c2, "") - Rel(backend_c1, backend_db1, "") - Rel(backend_c2, backend_db1, "") Rel(backend_c2, backend_db2, "") Rel(backend_c2, media_c1, "") Rel(backend_c2, transcoder_c1, "") Rel(backend_c2, backend_c3, "") - Rel(backend_c2, emb_q2, "produces") Rel(backend_c2, emb_e1, "produces") Rel(backend_c2, emb_e2, "produces") - Rel(emb_e1, emb_q1, "bound") - Rel(autosync_c1, emb_q1, "consumes") - Rel(scanner_c2, emb_q2, "consumes") ``` ## Front ```mermaid - C4Component - title Component Diagram +C4Component UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="2") - Person(user, "User") + title Component Diagram for Front - Container_Boundary(frontend, "frontend") { + Person(user, "User") + Container_Boundary(frontend, "front") { Component(frontend_c1, "kyoo_front", "typescript, node.js", "Static Content") } - Container_Boundary(backend, "back") { Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend") } @@ -243,24 +225,22 @@ Messaging is middleware. EnterpriseMessageBus is for any messaging handled betw ## Scanner ```mermaid - C4Component - title Component Diagram +C4Component UpdateLayoutConfig($c4ShapeInRow="1", $c4BoundaryInRow="3") + + title Component Diagram for Scanner Container_Boundary(media, "MediaLibrary") { Component_Ext(media_c1, "MediaShare", "Volume", "Read Only") } - Container_Boundary(scanner, "scanner") { Component(scanner_c1, "kyoo_scanner", "python, python3.12", "scanner") ComponentQueue(scanner_q1, "scanner", "RabbitMQ, Queue", "") Component(scanner_c2, "kyoo_scanner", "python, python3.12", "matcher") } - Container_Boundary(emb, "emb") { ComponentQueue(emb_q2, "scanner.rescan", "RabbitMQ, Queue", "") } - Container_Boundary(content, "ContentDatabase") { Component_Ext(content_c1, "ContentProvider", "API", "tmdb or tvdb") } @@ -268,7 +248,6 @@ Messaging is middleware. EnterpriseMessageBus is for any messaging handled betw Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend") } - Rel(scanner_c1, scanner_q1, "produces") Rel(scanner_c1, media_c1, "watches") Rel(scanner_c2, content_c1, "Fetch media data") @@ -280,20 +259,19 @@ Messaging is middleware. EnterpriseMessageBus is for any messaging handled betw ## Transcoder ```mermaid - C4Component - title Component Diagram +C4Component UpdateLayoutConfig($c4ShapeInRow="2", $c4BoundaryInRow="2") + + title Component Diagram for Transcoder Container_Boundary(transcoder, "transcoder") { Component(transcoder_c2, "TranscodeMetadata", "Volume", "Persistent. Distributed Metadata") Component(transcoder_c1, "kyoo_transcoder", "go, go", "Video Transcoder") Component(transcoder_c3, "TranscodeCache", "Volume", "Volatile. Local cache") } - Container_Boundary(media, "MediaLibrary") { Component_Ext(media_c1, "MediaShare", "Volume", "Read Only") } - Container_Boundary(backend, "back") { Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend") } From 3a4c07dd1e0bb824734083dc30fd0c11af841495 Mon Sep 17 00:00:00 2001 From: Arlan Lloyd Date: Fri, 21 Jun 2024 11:26:48 +0000 Subject: [PATCH 17/26] update --- DIAGRAMS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DIAGRAMS.md b/DIAGRAMS.md index 9f9258d0..c153f123 100644 --- a/DIAGRAMS.md +++ b/DIAGRAMS.md @@ -179,7 +179,7 @@ C4Component Container_Boundary(scanner, "scanner") { Component(scanner_c2, "kyoo_scanner", "python, python3.12", "matcher") } - Container_Boundary(emb, "embessage") { + Container_Boundary(emb, "emb") { ComponentQueue(emb_q2, "scanner.rescan", "RabbitMQ, Queue", "") ComponentQueue(emb_e2, "events.resource", "RabbitMQ, Exchange", "unused") ComponentQueue(emb_e1, "events.watched", "RabbitMQ, Exchange", "") From 47774351a3ca65dc4bd90fb8b3281673d11f95fd Mon Sep 17 00:00:00 2001 From: Arlan Lloyd Date: Fri, 21 Jun 2024 11:38:23 +0000 Subject: [PATCH 18/26] fix backend diagram --- DIAGRAMS.md | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/DIAGRAMS.md b/DIAGRAMS.md index c153f123..ea73bac5 100644 --- a/DIAGRAMS.md +++ b/DIAGRAMS.md @@ -163,6 +163,10 @@ C4Component title Component Diagram for Back Person(user, "User") + + Container_Boundary(frontend, "front") { + Component(frontend_c1, "kyoo_front", "typescript, node.js", "Static Content") + } Container_Boundary(backend, "back") { Component(backend_c1, "kyoo_migrations", "C#, .NET 8.0", "Postgres Migration") ComponentDb(backend_db2, "search", "Meilisearch", "search resource") @@ -170,25 +174,30 @@ C4Component ComponentDb(backend_db1, "backend", "Postgres", "user data and session state") Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend") } + Container_Boundary(media, "MediaLibrary") { Component_Ext(media_c1, "MediaShare", "Volume", "Read Only") } Container_Boundary(transcoder, "transcoder") { Component(transcoder_c1, "kyoo_transcoder", "go, go", "Video Transcoder") } + Container_Boundary(emb, "emb") { + ComponentQueue(emb_e1, "events.watched", "RabbitMQ, Exchange", "") + ComponentQueue(emb_e2, "events.resource", "RabbitMQ, Exchange", "unused") + ComponentQueue(emb_q1, "autosync", "RabbitMQ, Queue", "") + ComponentQueue(emb_q2, "scanner.rescan", "RabbitMQ, Queue", "") + } + Container_Boundary(scanner, "scanner") { + Component(scanner_c1, "kyoo_scanner", "python, python3.12", "scanner") Component(scanner_c2, "kyoo_scanner", "python, python3.12", "matcher") } - Container_Boundary(emb, "emb") { - ComponentQueue(emb_q2, "scanner.rescan", "RabbitMQ, Queue", "") - ComponentQueue(emb_e2, "events.resource", "RabbitMQ, Exchange", "unused") - ComponentQueue(emb_e1, "events.watched", "RabbitMQ, Exchange", "") - ComponentQueue(emb_q1, "autosync", "RabbitMQ, Queue", "") - } + Container_Boundary(autosync, "autosync") { Component(autosync_c1, "kyoo_autosync", "python, python3.12", "") } + Rel(user, backend_c2, "") Rel(backend_c1, backend_db1, "") Rel(backend_c2, backend_db1, "") @@ -202,6 +211,9 @@ C4Component Rel(emb_e1, emb_q1, "bound") Rel(autosync_c1, emb_q1, "consumes") Rel(scanner_c2, emb_q2, "consumes") + Rel(scanner_c1, backend_c2, "") + Rel(scanner_c2, backend_c2, "") + Rel(frontend_c1, backend_c2, "") ``` ## Front From d06abca25d1093b6169f12a7ec91b3d0b111b062 Mon Sep 17 00:00:00 2001 From: Arlan Lloyd Date: Fri, 21 Jun 2024 11:52:03 +0000 Subject: [PATCH 19/26] change container layout --- DIAGRAMS.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/DIAGRAMS.md b/DIAGRAMS.md index ea73bac5..53290f09 100644 --- a/DIAGRAMS.md +++ b/DIAGRAMS.md @@ -91,7 +91,7 @@ C4Context Messaging is middleware. EnterpriseMessageBus is for any messaging handled between different projects. ```mermaid C4Container - UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="1") + UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="3") title Container diagram for Kyoo System @@ -99,15 +99,19 @@ C4Container System_Boundary(internal, "Kyoo") { Container(frontend, "front/") Container(backend, "back/") - Container(transcoder, "transcoder/") - Container(autosync, "autosync/") ContainerQueue(emb, "emb", "", "EnterpriseMessageBus") - Container(scanner, "scanner/") + Container(transcoder, "transcoder/") + Container(scanner, "scanner/") + Container(autosync, "autosync/") } - System_Boundary(external, "External") { + System_Boundary(external, "") { + System_Ext(content, "ContentDatabase", "") + } + System_Boundary(external2, "") { System_Ext(tracker, "ActivityTracker", "") + } + System_Boundary(external3, "") { System_Ext(media, "MediaLibrary", "") - System_Ext(content, "ContentDatabase", "") } Rel(user, frontend, "") From 11a3e7170577572f735db9821a9df17642be7b11 Mon Sep 17 00:00:00 2001 From: Arlan Lloyd Date: Fri, 21 Jun 2024 11:56:44 +0000 Subject: [PATCH 20/26] reorder container diagram --- DIAGRAMS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DIAGRAMS.md b/DIAGRAMS.md index 53290f09..7a881d21 100644 --- a/DIAGRAMS.md +++ b/DIAGRAMS.md @@ -99,9 +99,9 @@ C4Container System_Boundary(internal, "Kyoo") { Container(frontend, "front/") Container(backend, "back/") - ContainerQueue(emb, "emb", "", "EnterpriseMessageBus") Container(transcoder, "transcoder/") Container(scanner, "scanner/") + ContainerQueue(emb, "emb", "", "EnterpriseMessageBus") Container(autosync, "autosync/") } System_Boundary(external, "") { From 427c0fbce5d3522f78ae3f980c7efd1dfa7d5646 Mon Sep 17 00:00:00 2001 From: Arlan Lloyd Date: Fri, 21 Jun 2024 11:57:28 +0000 Subject: [PATCH 21/26] fix markdown --- DIAGRAMS.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/DIAGRAMS.md b/DIAGRAMS.md index 7a881d21..2f1553f7 100644 --- a/DIAGRAMS.md +++ b/DIAGRAMS.md @@ -130,8 +130,8 @@ C4Container ``` -# Component -## Autosync +## Component +### Autosync ```mermaid C4Component UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="2") @@ -159,7 +159,7 @@ C4Component Rel(autosync_c1, tracker_c1, "updates") ``` -## Back +### Back ```mermaid C4Component UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="3") @@ -220,7 +220,7 @@ C4Component Rel(frontend_c1, backend_c2, "") ``` -## Front +### Front ```mermaid C4Component UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="2") @@ -239,7 +239,7 @@ C4Component Rel(user, frontend_c1, "") ``` -## Scanner +### Scanner ```mermaid C4Component UpdateLayoutConfig($c4ShapeInRow="1", $c4BoundaryInRow="3") @@ -273,7 +273,7 @@ C4Component Rel(backend_c2, emb_q2, "produces") ``` -## Transcoder +### Transcoder ```mermaid C4Component UpdateLayoutConfig($c4ShapeInRow="2", $c4BoundaryInRow="2") From 141e683d02a4a7e66e80a1531b968a9534beadf8 Mon Sep 17 00:00:00 2001 From: Arlan Lloyd Date: Fri, 21 Jun 2024 17:35:36 +0000 Subject: [PATCH 22/26] minor adjustments --- DIAGRAMS.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/DIAGRAMS.md b/DIAGRAMS.md index 2f1553f7..a4ae0ebe 100644 --- a/DIAGRAMS.md +++ b/DIAGRAMS.md @@ -154,7 +154,7 @@ C4Component } Rel(emb_e1, emb_q1, "bound") - Rel(autosync_c1, emb_q1, "consumes") + Rel_Back(autosync_c1, emb_q1, "consumes") Rel(backend_c2, emb_e1, "produces") Rel(autosync_c1, tracker_c1, "updates") ``` @@ -213,8 +213,8 @@ C4Component Rel(backend_c2, emb_e1, "produces") Rel(backend_c2, emb_e2, "produces") Rel(emb_e1, emb_q1, "bound") - Rel(autosync_c1, emb_q1, "consumes") - Rel(scanner_c2, emb_q2, "consumes") + Rel_Back(autosync_c1, emb_q1, "consumes") + Rel_Back(scanner_c2, emb_q2, "consumes") Rel(scanner_c1, backend_c2, "") Rel(scanner_c2, backend_c2, "") Rel(frontend_c1, backend_c2, "") @@ -268,8 +268,8 @@ C4Component Rel(scanner_c1, media_c1, "watches") Rel(scanner_c2, content_c1, "Fetch media data") Rel(scanner_c2, backend_c2, "Pushes media data") - Rel(scanner_c2, scanner_q1, "consumes") - Rel(scanner_c2, emb_q2, "consumes") + Rel_Back(scanner_c2, scanner_q1, "consumes") + Rel_Back(scanner_c1, emb_q2, "consumes") Rel(backend_c2, emb_q2, "produces") ``` From f58c997870be593662ab13de41e6e0baad821bc7 Mon Sep 17 00:00:00 2001 From: Arlan Lloyd Date: Fri, 21 Jun 2024 17:51:30 +0000 Subject: [PATCH 23/26] update container diagram + formatting --- DIAGRAMS.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/DIAGRAMS.md b/DIAGRAMS.md index a4ae0ebe..840e52ed 100644 --- a/DIAGRAMS.md +++ b/DIAGRAMS.md @@ -120,9 +120,9 @@ C4Container Rel(backend, emb, "") Rel(backend, media, "") Rel(backend, transcoder, "") - Rel(autosync, emb, "") + Rel_Back(autosync, emb, "") Rel(autosync, tracker, "") - Rel(scanner, emb, "") + Rel_Back(scanner, emb, "") Rel(scanner, backend, "") Rel(scanner, media, "") Rel(scanner, content, "") @@ -173,9 +173,9 @@ C4Component } Container_Boundary(backend, "back") { Component(backend_c1, "kyoo_migrations", "C#, .NET 8.0", "Postgres Migration") - ComponentDb(backend_db2, "search", "Meilisearch", "search resource") - Component(backend_c3, "BackendMetadata", "Volume", "Persistent. Distributed Metadata") ComponentDb(backend_db1, "backend", "Postgres", "user data and session state") + Component(backend_c3, "BackendMetadata", "Volume", "Persistent. Distributed Metadata") + ComponentDb(backend_db2, "search", "Meilisearch", "search resource") Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend") } From 28b130540b5cdc1459effd169170d8bb64a0a0d1 Mon Sep 17 00:00:00 2001 From: Arlan Lloyd Date: Fri, 21 Jun 2024 20:19:45 +0000 Subject: [PATCH 24/26] fix backend/scanner diagrams --- DIAGRAMS.md | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/DIAGRAMS.md b/DIAGRAMS.md index 840e52ed..40f93ec6 100644 --- a/DIAGRAMS.md +++ b/DIAGRAMS.md @@ -187,9 +187,9 @@ C4Component } Container_Boundary(emb, "emb") { ComponentQueue(emb_e1, "events.watched", "RabbitMQ, Exchange", "") - ComponentQueue(emb_e2, "events.resource", "RabbitMQ, Exchange", "unused") - ComponentQueue(emb_q1, "autosync", "RabbitMQ, Queue", "") ComponentQueue(emb_q2, "scanner.rescan", "RabbitMQ, Queue", "") + ComponentQueue(emb_q1, "autosync", "RabbitMQ, Queue", "") + ComponentQueue(emb_e2, "events.resource", "RabbitMQ, Exchange", "unused") } Container_Boundary(scanner, "scanner") { @@ -214,7 +214,7 @@ C4Component Rel(backend_c2, emb_e2, "produces") Rel(emb_e1, emb_q1, "bound") Rel_Back(autosync_c1, emb_q1, "consumes") - Rel_Back(scanner_c2, emb_q2, "consumes") + Rel_Back(scanner_c1, emb_q2, "consumes") Rel(scanner_c1, backend_c2, "") Rel(scanner_c2, backend_c2, "") Rel(frontend_c1, backend_c2, "") @@ -242,30 +242,35 @@ C4Component ### Scanner ```mermaid C4Component - UpdateLayoutConfig($c4ShapeInRow="1", $c4BoundaryInRow="3") + UpdateLayoutConfig($c4ShapeInRow="5", $c4BoundaryInRow="3") title Component Diagram for Scanner Container_Boundary(media, "MediaLibrary") { Component_Ext(media_c1, "MediaShare", "Volume", "Read Only") } - Container_Boundary(scanner, "scanner") { - Component(scanner_c1, "kyoo_scanner", "python, python3.12", "scanner") - ComponentQueue(scanner_q1, "scanner", "RabbitMQ, Queue", "") - Component(scanner_c2, "kyoo_scanner", "python, python3.12", "matcher") - } - Container_Boundary(emb, "emb") { - ComponentQueue(emb_q2, "scanner.rescan", "RabbitMQ, Queue", "") - } + Container_Boundary(content, "ContentDatabase") { Component_Ext(content_c1, "ContentProvider", "API", "tmdb or tvdb") } + + Container_Boundary(scanner, "scanner") { + Component(scanner_c2, "kyoo_scanner", "python, python3.12", "matcher") + ComponentQueue(scanner_q1, "scanner", "RabbitMQ, Queue", "") + Component(scanner_c1, "kyoo_scanner", "python, python3.12", "scanner") + } + + Container_Boundary(emb, "emb") { + ComponentQueue(emb_q2, "scanner.rescan", "RabbitMQ, Queue", "") + } + Container_Boundary(backend, "back") { Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend") } Rel(scanner_c1, scanner_q1, "produces") Rel(scanner_c1, media_c1, "watches") + Rel(scanner_c1, backend_c2, "Fetch existing scans") Rel(scanner_c2, content_c1, "Fetch media data") Rel(scanner_c2, backend_c2, "Pushes media data") Rel_Back(scanner_c2, scanner_q1, "consumes") From f4135df50213ef4cc101089407130fb3fbf90a35 Mon Sep 17 00:00:00 2001 From: Arthur Jamet Date: Sun, 7 Jul 2024 12:17:14 +0200 Subject: [PATCH 25/26] EpisodeLine: Add missing border radius --- front/packages/ui/src/details/episode.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/front/packages/ui/src/details/episode.tsx b/front/packages/ui/src/details/episode.tsx index 4435cee7..0b887b74 100644 --- a/front/packages/ui/src/details/episode.tsx +++ b/front/packages/ui/src/details/episode.tsx @@ -259,7 +259,7 @@ export const EpisodeLine = ({ width: percent(18), aspectRatio: 16 / 9, }} - {...css({ flexShrink: 0, m: ts(1) })} + {...css({ flexShrink: 0, m: ts(1), borderRadius: imageBorderRadius })} > {(watchedPercent || watchedStatus === WatchStatusV.Completed) && ( <> From e9403a8572233b500bd38d6be955b6cb36e0de4b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 02:00:42 +0000 Subject: [PATCH 26/26] Update traefik Docker tag to v3.1 --- docker-compose.build.yml | 2 +- docker-compose.dev.yml | 2 +- docker-compose.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-compose.build.yml b/docker-compose.build.yml index 98f16247..88aab714 100644 --- a/docker-compose.build.yml +++ b/docker-compose.build.yml @@ -131,7 +131,7 @@ services: profiles: ['qsv'] traefik: - image: traefik:v3.0 + image: traefik:v3.1 restart: on-failure command: - "--providers.docker=true" diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 599965f5..a735b0af 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -155,7 +155,7 @@ services: profiles: ['qsv'] traefik: - image: traefik:v3.0 + image: traefik:v3.1 restart: on-failure command: - "--providers.docker=true" diff --git a/docker-compose.yml b/docker-compose.yml index 3f33d33b..9bffedca 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -130,7 +130,7 @@ services: profiles: ['qsv'] traefik: - image: traefik:v3.0 + image: traefik:v3.1 restart: unless-stopped command: - "--providers.docker=true"