From 602d257d63f972266e432877e8194c6efd35e724 Mon Sep 17 00:00:00 2001 From: Nadim Zubidat Date: Tue, 20 May 2025 15:41:16 +0200 Subject: [PATCH 001/190] Add a section for media provider identifiers --- docs/general/server/identifiers.md | 48 ++++++++++++++++++ .../docs/tvdb-media-identifier-example.png | Bin 0 -> 18005 bytes 2 files changed, 48 insertions(+) create mode 100644 docs/general/server/identifiers.md create mode 100644 static/images/docs/tvdb-media-identifier-example.png diff --git a/docs/general/server/identifiers.md b/docs/general/server/identifiers.md new file mode 100644 index 00000000..5729e37c --- /dev/null +++ b/docs/general/server/identifiers.md @@ -0,0 +1,48 @@ +--- +uid: provider-identifiers +title: Media Provider Identifiers +--- + +# Media Provider Identifiers + +To improve the accuracy of media identification, you can manually specify a media provider identifier for each movie or show. Each media provider uses a unique identifier for its content, and adding these identifiers greatly improves media identification. Identifiers can be specified in your movie/show file or folder name. For example: + +```txt +Movies +├── Best_Movie_Ever (1994) [tmdbid-680] +│ ├── Best_Movie_Ever (1994) [tmdbid-680].mp4 +└── Movie (2021) [imdbid-tt12801262] + └── Movie (2021) [imdbid-tt12801262].mp4 +Shows +└── Series Name (2018) [tvdbid-79168] + ├── Season 01 + | ├── Series Name B S01E01.mkv + | └── Series Name B S01E02.mkv + └── Season 02 + ├── Series Name B S02E01-E02.mkv + └── Series Name B S02E03.mkv +``` + +## Finding Media Identifiers +Below are instructions on how to find media provider identifiers for each supported provider. + +### The Movie Database (TVDB) +The identifier is found in the URL of the movie/show. For example: + +URL: `https://www.themoviedb.org/movie/569094-spider-man-across-the-spider-verse` + +Identifier: `[tmdbid-569094]` + +### Internet Movie Database (IMDB) +The identifier is found in the URL of the movie/show. For example: + +URL: `https://www.imdb.com/title/tt9362722/` + +Identifier: `[imdbid-tt9362722]` + +### The TV Database (TVDB) +The identifier is found on the main page of the movie/show. For example: + +![How to find The TVDB media identifier](/images/docs/tvdb-media-identifier-example.png) + +Identifier: `[tvdbid-132814]` \ No newline at end of file diff --git a/static/images/docs/tvdb-media-identifier-example.png b/static/images/docs/tvdb-media-identifier-example.png new file mode 100644 index 0000000000000000000000000000000000000000..ef677d56dd1342bdd458fd6808408da7b743242f GIT binary patch literal 18005 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 B_G$nC literal 0 HcmV?d00001 From f4a4c3e3ad7f6bf235186e6a0f23a5e84577662e Mon Sep 17 00:00:00 2001 From: Nadim Zubidat Date: Tue, 20 May 2025 17:01:59 +0200 Subject: [PATCH 002/190] Fix issues reporetd by markdownlint --- docs/general/server/identifiers.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/general/server/identifiers.md b/docs/general/server/identifiers.md index 5729e37c..bda5a9f7 100644 --- a/docs/general/server/identifiers.md +++ b/docs/general/server/identifiers.md @@ -24,9 +24,11 @@ Shows ``` ## Finding Media Identifiers + Below are instructions on how to find media provider identifiers for each supported provider. ### The Movie Database (TVDB) + The identifier is found in the URL of the movie/show. For example: URL: `https://www.themoviedb.org/movie/569094-spider-man-across-the-spider-verse` @@ -34,6 +36,7 @@ URL: `https://www.themoviedb.org/movie/569094-spider-man-across-the-spider-verse Identifier: `[tmdbid-569094]` ### Internet Movie Database (IMDB) + The identifier is found in the URL of the movie/show. For example: URL: `https://www.imdb.com/title/tt9362722/` @@ -41,8 +44,9 @@ URL: `https://www.imdb.com/title/tt9362722/` Identifier: `[imdbid-tt9362722]` ### The TV Database (TVDB) + The identifier is found on the main page of the movie/show. For example: ![How to find The TVDB media identifier](/images/docs/tvdb-media-identifier-example.png) -Identifier: `[tvdbid-132814]` \ No newline at end of file +Identifier: `[tvdbid-132814]` From 15110abda209a02c896389d8893eef7fde761673 Mon Sep 17 00:00:00 2001 From: Nadim Zubidat Date: Fri, 6 Jun 2025 09:11:56 +0200 Subject: [PATCH 003/190] Move section about metadata provider identifiers to metadata section --- docs/general/server/{ => metadata}/identifiers.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) rename docs/general/server/{ => metadata}/identifiers.md (64%) diff --git a/docs/general/server/identifiers.md b/docs/general/server/metadata/identifiers.md similarity index 64% rename from docs/general/server/identifiers.md rename to docs/general/server/metadata/identifiers.md index bda5a9f7..0f031068 100644 --- a/docs/general/server/identifiers.md +++ b/docs/general/server/metadata/identifiers.md @@ -1,15 +1,15 @@ --- -uid: provider-identifiers -title: Media Provider Identifiers +uid: metadata-provider-identifiers +title: Metadata Provider Identifiers --- -# Media Provider Identifiers +# Metadata Provider Identifiers -To improve the accuracy of media identification, you can manually specify a media provider identifier for each movie or show. Each media provider uses a unique identifier for its content, and adding these identifiers greatly improves media identification. Identifiers can be specified in your movie/show file or folder name. For example: +To improve the accuracy of media identification, you can manually specify a metadata provider identifier for each movie or show. Each metadata provider uses a unique identifier for its content, and adding these identifiers greatly improves media identification. Identifiers can be specified in your movie/show file or folder name. Multiple identifiers can be specified. For example: ```txt Movies -├── Best_Movie_Ever (1994) [tmdbid-680] +├── Best_Movie_Ever (1994) [tmdbid-680] [imdbid-1234] │ ├── Best_Movie_Ever (1994) [tmdbid-680].mp4 └── Movie (2021) [imdbid-tt12801262] └── Movie (2021) [imdbid-tt12801262].mp4 @@ -23,9 +23,9 @@ Shows └── Series Name B S02E03.mkv ``` -## Finding Media Identifiers +## Finding Metadata Provider Identifiers -Below are instructions on how to find media provider identifiers for each supported provider. +Below are instructions on how to find metadata provider identifiers for each supported provider. ### The Movie Database (TVDB) From b769acce84dad21b4b171d9a8793aba1a33fcc59 Mon Sep 17 00:00:00 2001 From: Nadim Zubidat Date: Mon, 30 Jun 2025 17:12:17 +0200 Subject: [PATCH 004/190] refer to titles instead of movies or shows --- docs/general/server/metadata/identifiers.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/general/server/metadata/identifiers.md b/docs/general/server/metadata/identifiers.md index 0f031068..754aa76d 100644 --- a/docs/general/server/metadata/identifiers.md +++ b/docs/general/server/metadata/identifiers.md @@ -29,7 +29,7 @@ Below are instructions on how to find metadata provider identifiers for each sup ### The Movie Database (TVDB) -The identifier is found in the URL of the movie/show. For example: +The identifier is found in the URL of the title. For example: URL: `https://www.themoviedb.org/movie/569094-spider-man-across-the-spider-verse` @@ -37,7 +37,7 @@ Identifier: `[tmdbid-569094]` ### Internet Movie Database (IMDB) -The identifier is found in the URL of the movie/show. For example: +The identifier is found in the URL of the title. For example: URL: `https://www.imdb.com/title/tt9362722/` @@ -45,7 +45,7 @@ Identifier: `[imdbid-tt9362722]` ### The TV Database (TVDB) -The identifier is found on the main page of the movie/show. For example: +The identifier is found on the main page of the title. For example: ![How to find The TVDB media identifier](/images/docs/tvdb-media-identifier-example.png) From 0fc3bd2fd56dcb6417b1c0b070faaf026813bcd2 Mon Sep 17 00:00:00 2001 From: Nadim Zubidat Date: Mon, 30 Jun 2025 18:15:02 +0200 Subject: [PATCH 005/190] Use a TV Show example for TVDB media identifier --- docs/general/server/metadata/identifiers.md | 2 +- .../docs/tvdb-media-identifier-example.png | Bin 18005 -> 10403 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/server/metadata/identifiers.md b/docs/general/server/metadata/identifiers.md index 754aa76d..4c377ce4 100644 --- a/docs/general/server/metadata/identifiers.md +++ b/docs/general/server/metadata/identifiers.md @@ -49,4 +49,4 @@ The identifier is found on the main page of the title. For example: ![How to find The TVDB media identifier](/images/docs/tvdb-media-identifier-example.png) -Identifier: `[tvdbid-132814]` +Identifier: `[tvdbid-266189]` diff --git a/static/images/docs/tvdb-media-identifier-example.png b/static/images/docs/tvdb-media-identifier-example.png index ef677d56dd1342bdd458fd6808408da7b743242f..478df596cfe0901fd52dd12e45f0eb274d77dc16 100644 GIT binary patch literal 10403 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 Ll{aNl#{T~Ur|&pe literal 18005 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 B_G$nC From b9d3fbb58a998a02684c54b84b7b9b982a890d23 Mon Sep 17 00:00:00 2001 From: nadimz Date: Mon, 30 Jun 2025 19:49:53 +0200 Subject: [PATCH 006/190] Update docs/general/server/metadata/identifiers.md Co-authored-by: theguymadmax --- docs/general/server/metadata/identifiers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/server/metadata/identifiers.md b/docs/general/server/metadata/identifiers.md index 4c377ce4..aaf40756 100644 --- a/docs/general/server/metadata/identifiers.md +++ b/docs/general/server/metadata/identifiers.md @@ -27,7 +27,7 @@ Shows Below are instructions on how to find metadata provider identifiers for each supported provider. -### The Movie Database (TVDB) +### The Movie Database (TMDB) The identifier is found in the URL of the title. For example: From 731363f959256f851f7d80fcb6a088faebaddede Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 03:52:20 +0100 Subject: [PATCH 007/190] Updated hardware-selection.md Improved readability and clarity. :- ) --- .../administration/hardware-selection.md | 101 +++++++++--------- 1 file changed, 50 insertions(+), 51 deletions(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 69a424b1..d8df1a2c 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -5,11 +5,11 @@ title: Hardware Selection # Selecting Appropriate Hardware -This page covers what you need to know in order to select appropriate hardware for a Jellyfin server and take full advantage of its features (e. g. hardware acceleration). +The following is intended to help you choose appropriate hardware hardware for a Jellyfin server and take full advantage of its features. E.g., hardware acceleration. -## TL;DR +## Simple Guide -Below is a list of recommended specs to run Jellyfin. Even though Jellyfin will work on even lower end hardware, the following specs are recommended for a good experience. +Below is a list of recommended specs to run Jellyfin. Whilst Jellyfin can work on relatively low-end hardware, the following specs are recommended for a good experience. ### Shared Items @@ -17,16 +17,16 @@ Some component recommendations do not change regardless of the hardware configur - Storage: 100GB SSD for your OS, Jellyfin files and transcoding cache.1 Consider adding more on Windows 11, or if you have many large media files that need transcoding. - Networking: Gigabit Ethernet Adapter or faster, WiFi or Powerline not recommended. -- Internet Connection: At least 20mbps upload bandwidth for remote access.2 +- Internet Connection: At least 20 Mbps upload bandwidth for remote access.2 1Your largest media file times the max number of concurrent streams all your users will consume can be used as a rule of thumb for the transcoding file size.
-2If you have less than 100mbps of total upload bandwidth, a bandwidth limit of 70% of your upload speed for Jellyfin is recommended to avoid affecting normal internet usage. This option can be found in the dashboard. +2If you have less than 100 Mbps of total upload bandwidth, a bandwidth limit of 70% of your upload speed for Jellyfin is recommended to avoid affecting internet usage outside of Jellyfin. This option can be found in the Jellyfin Server `Dashboard`. ### Hardware Encoder Quality Different vendors have different hardware encoder implementations and produce different results. Usually, newer generations within the same vendor will provide better results. The following is a quick comparison on the quality between vendors on modern products. -Apple ≥ Intel ≥ Nvidia >>> AMD\* +Apple ≥ Intel ≥ NVIDIA >>> AMD\* \* This only represents the default Jellyfin settings. The quality may be different depending on your exact configuration. @@ -42,7 +42,7 @@ AMD is **NOT** recommended if you plan to use integrated graphics for Jellyfin. :::caution -Intel 7-10th gen CPUs have been removed from this list, since the toolkit for these generations has been deprecated by Intel. If you own 7-10th gen CPUs with integrated graphics, please continue to use them for Jellyfin, as they are still perfectly capable of performing the task. If you are making a purchase decision, please consider something else instead. +Intel 7-10th gen CPUs have been removed from this list, since the toolkit for these generations has been deprecated by Intel. If you own a 7-10th gen CPU with integrated graphics, please continue to use them for Jellyfin, as they are still perfectly capable of performing the task. If you are making a purchase decision, you may wish to consider something else. ::: @@ -51,8 +51,8 @@ Intel 7-10th gen CPUs have been removed from this list, since the toolkit for th If you are planning to use a dedicated graphics card (including upgrading an old system with a dedicated GPU), the following specs are recommended: - CPU: Intel Core i5-2300, AMD FX-8100 or better (Geekbench 6 Multicore 1500 or better), CPU Vendor / Performance will **NOT** affect hardware encode speed or quality -- RAM: 8GB (4GB should be enough for a server running Linux without a GUI) -- Graphics: Intel Arc A series or newer, Nvidia GTX16/RTX20 series or newer (Excluding GTX1650), **AMD is NOT recommended**. +- RAM: 8GB (4GB should be enough for a Linux server without a native GUI) +- Graphics: Intel Arc A series or newer, NVIDIA GTX16/RTX20 series or newer (Excluding GTX1650), **AMD is NOT recommended**. Intel Drivers are much easier to install on Linux, with many distributions including them by default. If you do not need CUDA for other applications, it is highly recommended that you stick with Intel Graphics on Linux. @@ -70,21 +70,21 @@ where a Ryzen 9 5950X cannot handle even a single video stream. Please read [the ### Low Power Servers -For users with expensive power or running servers on battery power: +For users with expensive electricity, or running battery-powered servers: - Intel 12th gen or above N series platforms -- Apple M Series mac mini +- Apple M Series Mac mini - Rockchip RK3588 / RK3588S SBC (**Advanced Users Only**) ### Potentially Problematic Hardware These hardware platforms might lead to a poor Jellyfin experience. Please be careful to avoid them when shopping for hardware. -- Intel "Atom" CPUs: Intel J/M/N/Y series low power CPUs up to 11th gen use a different architecture than higher end parts, leading to subpar performance despite what their names might suggest. Please be careful about these parts when shopping for a system to run Jellyfin. -- Prebuilt NAS devices: The software environment on most Prebuilt NAS devices often causes 3rd party software to be hard to install and not work properly. They also often have low end processors that are too slow for a good Jellyfin experience (Intel Atom, Realtek ARM CPUs etc.). -- Most Single Board Computers (SBC): Most SBCs (Including Raspberry Pis and **especially the Pi 5**) are too slow to provide a good Jellyfin experience since they often lack proper support for hardware acceleration. If You really want to run Jellyfin on an SBC, please look at models based on the following platforms: Rockchip RK3588 / RK3588S, Intel Core, Intel 12th gen N series +- Intel "Atom" CPUs: Intel J/M/N/Y series low power CPUs up to 11th gen use a different architecture than higher end parts, leading to subpar performance despite what their names might suggest. It is advised to avoid using these parts in a Jellyfin Server. +- Consumer-grade Prebuilt NAS Appliances: The software environment on most consumer-grade prebuilt NAS appliances often makes third-party software more challenging to install, sometimes even preventing it from working properly despite a successful installation. They may have low-end processors that are too slow for an acceptable Jellyfin experience. E.g., Intel Atom, Realtek ARM CPUs et al. +- Most Single Board Computers (SBC): Most SBCs (including the Raspberry Pi, **especially the Raspberry Pi 5**) are too slow to provide an acceptable Jellyfin experience as they often lack proper support for hardware acceleration. If you really want to run Jellyfin on an SBC, you may wish to consider models based on the following platforms: Rockchip RK3588 / RK3588S, Intel Core, Intel 12th gen N series - AMD Graphics: AMD Graphics have poor encoder quality and poor driver support. **This applies even on Linux**. -- Low end GPUs: Certain low end GPUs (eg. GT1030, RX6400) don't have hardware encoding available. These models can't be used for Jellyfin hardware acceleration. +- Low-end GPUs: Certain low-end GPUs, e.g., GT1030, RX6400, are not capable of hardware encoding. These models cannot be used for hardware acceleration for a Jellyfin Server. ## Detailed Guide @@ -95,62 +95,61 @@ The CPU will be responsible for many tasks, notably: - Transcoding Audio - Decoding video in unsupported codecs -Audio codecs are very lightweight and most CPUs should be able to handle them without issues (Ryzen 5950X FLAC -> AAC transcoding runs at ~110x real time). Please note that they will only use one core. +Audio codecs are very lightweight and most CPUs should be able to handle them without issues, e.g., Ryzen 5950X `FLAC -> AAC` transcoding runs at ~110x real-time. Please note that they will only use a single core. Video in unsupported codecs are usually older formats that are easier to decode. Assuming hardware acceleration is properly configured, any modern CPU with 4 threads should be able to handle the workload. -However, newer codecs can also require software decoding if there are no available hardware decoders. HEVC, VP9 and AV1 can be **VERY** demanding even on modern CPUs if hardware acceleration isn't available. This is why a hardware platform capable of HEVC 10bit hardware decoding is strongly recommended. +However, newer codecs can also require software decoding if there are no available hardware decoders. HEVC, VP9 and AV1 can be **VERY** demanding even on modern CPUs if hardware acceleration is not available on a Jellyfin Server. This is why a hardware platform capable of HEVC 10bit hardware decoding is strongly recommended. -In our custom `jellyfin-ffmpeg` fork, the dav1d decoder is enabled, leading to faster software decoding compared to HEVC or VP9. However, it will still use significantly more resources compared to software decoding H.264 or older codecs. Since we have a more efficient AV1 software decoder, and AV1 media isn't common yet, you shouldn't worry about AV1 when shopping for hardware. +In our custom `jellyfin-ffmpeg` fork, the dav1d decoder is enabled, leading to faster software decoding compared to HEVC or VP9. However, it will still use significantly more resources compared to software decoding H.264, or older codecs. Since we have a more efficient AV1 software decoder, and AV1 media isn't common yet, you shouldn't worry about AV1 when choosing components for your Jellyfin Server. #### Integrated Graphics -Integrated graphics can be useful for transcoding video. Please refer to [the GPU section](/docs/general/administration/hardware-selection#graphics-cards-gpus) for a guide. +Integrated graphics can be useful for transcoding video. For more informatin, please refer to [the GPU section](/docs/general/administration/hardware-selection#graphics-cards-gpus). #### Resizable BAR -[Resizable Bar (ReBAR)](https://www.intel.com/content/www/us/en/support/articles/000090831/graphics.html) is a PCI Express feature that optimizes access to PCIe devices. This feature requires support from both the platform and the device. Intel 10th gen or above and AMD Ryzen 3000 Series or above have support for this feature. +[Resizable Bar (ReBAR)](https://www.intel.com/content/www/us/en/support/articles/000090831/graphics.html) is a PCI Express feature that optimizes access to PCIe devices. This feature requires support from both the platform and the device. Suppor for this feature is available from Intel 10th gen and above, and AMD Ryzen 3000 Series and above. In BIOS settings of motherboards, it may also be called `Smart Access Memory` or `Clever Access Memory` -When using Intel ARC Graphics, Resizable BAR is recommended. Disabling it will result in a 10% reduction in transcoding performance. However, given how fast the media engine on Intel ARC is, this will not be a problem for the vast majority of users. +When using Intel ARC Graphics, Resizable BAR is recommended. Disabling it will result in a 10% reduction in transcoding performance. However, given how fast the media engine on Intel ARC is, this should not be a problem for the average deployment. #### Software HDR to SDR Tone-mapping -If there is no GPU available, the CPU can also be used to tone-map HDR content to SDR. **This can be very demanding on +If there is no GPU available on a Jellyfin Server, the CPU can also be used to tone-map HDR content to SDR. **This can be very demanding on the CPU, therefore a GPU is ALWAYS recommended.** When using software tone-mapping, a software encoder will always be -used. Tone-mapping 4K 60fps Dolby Vision content to 4K 60fps H264 SDR requires a Ryzen 9 5950X for faster than real time -transcoding. If you would like to output in H265 or AV1, you may end up in situations where no current desktop CPUs have -enough performance. +used. Tone-mapping 4K 60fps Dolby Vision content to 4K 60fps H264 SDR requires a Ryzen 9 5950X for faster than real-time +transcoding. You may find current desktop CPUs do not offer adequate performance if you seek to provide streams in H265 or AV1. ### System Memory (RAM) -As a general rule of thumb, at least 8GB is recommended for most configurations. For a Linux server running without a GUI, 4GB should be enough. +As a general recommendation, at least 8GB is recommended for the average deployment. For a Linux server running without a GUI, 4GB may be adequate. -It is recommended to add more memory on Windows 11 due to the OS being heavier. +It is recommended to add more memory when using Windows 11 due to the OS being heavier. ### Graphics Cards (GPUs) With modern systems, the media engines are usually located on the GPUs. Therefore, the available hardware acceleration options are determined by the choice of GPU. -Encoder Quality: Apple ≥ Intel ≥ Nvidia >>> AMD\* +Encoder Quality: Apple ≥ Intel ≥ NVIDIA >>> AMD\* \* This only represents the default Jellyfin settings. The quality may be different depending on your exact configuration. -Intel is always recommended on non-apple hardware for the following reasons: +Intel is always recommended on non-Apple hardware for the following reasons: -- Intel provides a good quality encoder, slightly better than Nvidia and significantly better than AMD. -- Intel drivers and the compute environment is much easier to setup than both Nvidia and AMD +- Intel provides a good quality encoder, slightly better than NVIDIA and significantly better than AMD. +- Intel drivers and the compute environment is much easier to setup than both NVIDIA and AMD -AMD is not recommended because of poor quality H.264 and H.265(HEVC) output, as well as being hard to setup the compute environment. While AMD has significantly improved AV1 encoder quality, you are still more likely to transcode to H.264 or H.265 than to AV1 due to compatibility. +AMD is not recommended due to poor quality H.264 and H.265 (HEVC) output, as well as being hard to set up the compute environment. While AMD has significantly improved AV1 encoder quality, you are still more likely to transcode to H.264 or H.265 than to AV1 due to compatibility. A list of common codecs can be found in the [codec support documentation](/docs/general/clients/codec-support/). The following is a list of video codecs Jellyfin supports transcoding to: -- H.264 (Most common transcode target) -- H.265 (Limited support by clients) -- AV1 (New in 10.9, supported by most modern browsers) +- H.264 (most common transcode target) +- H.265 (Jellyfin clients have limited support) +- AV1 (new in Jellyfin v10.9, supported by most modern browsers) For decoding support, the more codecs the better. However, there are only a few codecs that media is commonly available in. The most important one to look for is HEVC 10bit decoding support, as it can be very demanding on the CPU to decode. @@ -158,31 +157,31 @@ For decoding support, the more codecs the better. However, there are only a few Please refer to [this table](https://en.wikipedia.org/wiki/Intel_Quick_Sync_Video#Hardware_decoding_and_encoding) for supported codecs. -Intel CPUs with a model description that ends with F don't have integrated graphics. These are intended to be used with a dedicated graphics card. Please beware if you intend to use Intel integrated graphics. +Intel CPUs with a model name that ends with `F` do not have integrated graphics. These are intended to be used with a dedicated graphics card. Ergo, if you wish to use Intel integrated graphics, this is not an appropriate choice of component for your Jellyfin Server. -If you are planning to use Linux with Intel 12/13th Gen integrated graphics or ARC, these GPUs only work on Linux Kernel 6.2 or newer. Please check your distribution to make sure it has a supported Linux Kernel version. Please read [Known Intel limitations on Linux](/docs/general/post-install/transcoding/hardware-acceleration/known-issues#intel-on-linux) for more info. +If you are planning to use Linux with Intel 12/13th gen integrated graphics or ARC, these GPUs only work on Linux Kernel 6.2 or newer. Please check your distribution to make sure it has a supported Linux Kernel version. Further information: [Known Intel limitations on Linux](/docs/general/post-install/transcoding/hardware-acceleration/known-issues#intel-on-linux). :::caution -Intel 10th gen and older integrated graphics are losing support for QSV on Linux due to the SDK for these platforms being deprecated by Intel. If you own 7-10th gen CPUs with integrated graphics, please continue to use them for Jellyfin. If you are making a purchase decision, please choose a newer CPU if you plan on using Intel integrated graphics. +Intel 10th gen and older integrated graphics are losing support for QSV on Linux due to the SDK for these platforms being deprecated by Intel. If you own 7-10th gen CPUs with integrated graphics, please continue to use them for Jellyfin. If you are making a purchase decision, you may wish to consider a newer CPU if you plan on using Intel integrated graphics. ::: -#### Nvidia Graphics +#### NVIDIA Graphics Please refer to [this table](https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new) for supported codecs. -Certain low end cards (e.g. GT 1030) don't have encoding hardware. Please be careful when choosing a GPU. +Certain low-end cards, e.g., GT 1030, do not have encoding hardware. Please be careful when choosing a GPU. #### AMD Graphics -AMD graphics is not recommended for Jellyfin, but the information is still provided for convenience. Please refer to [this article](https://en.wikipedia.org/wiki/Video_Coding_Engine) for supported codecs. +AMD graphics is not recommended for Jellyfin, but the information is still provided for reference. Information on supported codecs is on [this article](https://en.wikipedia.org/wiki/Video_Coding_Engine). -Certain low end cards (e.g. RX 6400, RX 6500) don't have encoding hardware. Please be careful when choosing a GPU. +Certain low-end cards, e.g., RX 6400, RX 6500, do not have encoding hardware. Please be careful when choosing a GPU. -Many AMD CPUs don't have integrated graphics. These are intended to be used with a dedicated graphics card. +Many AMD CPUs do not have integrated graphics. These are intended to be used with a dedicated graphics card. -For Ryzen 1000 ~ 5000 Series, desktop CPUs with a model description that ends with G have integrated graphics while other desktop CPUs do NOT. For Ryzen 7000 Series, desktop CPUs with a model description that ends with F do NOT have integrated graphics while others do. +For Ryzen 1000 - 5000 Series, desktop CPUs with a model description that ends with `G` have integrated graphics, but other Ryzen 1000-5000 desktop CPUs do NOT. For Ryzen 7000 Series, desktop CPUs with a model description that ends with `F` do NOT have integrated graphics while others do. Please check the product page of your CPU for more info. @@ -202,17 +201,17 @@ Supported codecs are listed below: ✅ = Encode + Decode, 🔶 = Decode Only, ❌ = Not Supported. -1 Although the hardware does support AV1 decoding, [ffmpeg does not support it yet](https://trac.ffmpeg.org/ticket/10642). +1 Although the hardware does support AV1 decoding, [ffmpeg does not yet support it](https://trac.ffmpeg.org/ticket/10642). :::caution -No Apple Silicon media engine drivers currently exist for non-macOS operating systems. You will NOT be able to use hardware acceleration if you are running [Asahi Linux](https://asahilinux.org/). +No Apple Silicon media engine drivers currently exist for non-macOS operating systems. You will NOT be able to use hardware acceleration if you are running [Asahi Linux](https://asahilinux.org/) on your Apple Silicon hardware. ::: #### Rockchip VPU -Currently only the VPU on RK3588/3588S SoC is recommended. It can handle most common video codecs, including AV1 decode. +Currently only the VPU on RK3588/3588S SoC is recommended, which can handle most common video codecs, including AV1 decode. Supported codecs are listed below: @@ -233,16 +232,16 @@ Supported codecs are listed below: ### Storage -There are two general types of storage that can be used on a Jellyfin server. Media libraries and Jellyfin files require different performance characteristics. +There are two general types of storage that can be used on a Jellyfin Server. Media files and Jellyfin files each require different performance characteristics for optimal performance. #### Media Storage -Anything with higher sequential access speed than bitrate of media will work. This storage can be a network share or a cloud storage service mounted on the Jellyfin host if desired. +Anything with higher sequential access speed than bitrate of media is appropriate. If desired, this storage may be a network share, or a cloud storage service mounted on the Jellyfin Server host. #### Jellyfin Files -Jellyfin files will see lots of random access, therefore SSDs are recommended for Jellyfin files. AVOID mechanical drives that use [SMR (Shingled Magnetic Recording)](https://en.wikipedia.org/wiki/Shingled_magnetic_recording) as they will result in a VERY poor experience. +The files for Jellyfin itself (i.e., not your media files) will see a lot of random access, therefore SSDs are recommended for these files. AVOID mechanical drives that use [SMR (Shingled Magnetic Recording)](https://en.wikipedia.org/wiki/Shingled_magnetic_recording) as they will result in a VERY poor experience. ### Networking -Networking is for connecting your Jellyfin server to other devices. It is recommended that the server be connected to the internet via Ethernet cables. Wi-Fi or Powerline solutions are NOT recommended. +Networking is for connecting your Jellyfin server to other devices. It is recommended that the Jellyfin Server be connected to your network via Ethernet cables for optimal performance. Wi-Fi or Powerline solutions for a Jellyfin Server are NOT recommended and will result in an especially poor experience. From f6d758a6912138ac1cc15eda46fc3d30e1005347 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 03:53:52 +0100 Subject: [PATCH 008/190] Update hardware-selection.md --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index d8df1a2c..0d0b58fe 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -42,7 +42,7 @@ AMD is **NOT** recommended if you plan to use integrated graphics for Jellyfin. :::caution -Intel 7-10th gen CPUs have been removed from this list, since the toolkit for these generations has been deprecated by Intel. If you own a 7-10th gen CPU with integrated graphics, please continue to use them for Jellyfin, as they are still perfectly capable of performing the task. If you are making a purchase decision, you may wish to consider something else. +Intel 7-10th gen CPUs have been removed from this list, since the toolkit for these generations has been deprecated by Intel. If you own a 7-10th gen CPU with integrated graphics, please continue to use them for Jellyfin, as they are still perfectly capable of performing the task. If you are making a purchase decision, you may wish to consider alternatives. ::: From d66946d8a1a76ca1735bf9a2c569827293bfbf8a Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 05:27:19 +0100 Subject: [PATCH 009/190] Update hardware-selection.md based on feedback Updated based on https://github.com/jellyfin/jellyfin.org/pull/1511#discussion_r2275294848 --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 0d0b58fe..148ec5e8 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -81,7 +81,7 @@ For users with expensive electricity, or running battery-powered servers: These hardware platforms might lead to a poor Jellyfin experience. Please be careful to avoid them when shopping for hardware. - Intel "Atom" CPUs: Intel J/M/N/Y series low power CPUs up to 11th gen use a different architecture than higher end parts, leading to subpar performance despite what their names might suggest. It is advised to avoid using these parts in a Jellyfin Server. -- Consumer-grade Prebuilt NAS Appliances: The software environment on most consumer-grade prebuilt NAS appliances often makes third-party software more challenging to install, sometimes even preventing it from working properly despite a successful installation. They may have low-end processors that are too slow for an acceptable Jellyfin experience. E.g., Intel Atom, Realtek ARM CPUs et al. +- Prebuilt NAS Appliances: The software environment on most prebuilt NAS appliances often makes third-party software more challenging to install, sometimes even preventing it from working properly despite a successful installation. They may have low-end processors that are too slow for an acceptable Jellyfin experience. E.g., Intel Atom, Realtek ARM CPUs et al. - Most Single Board Computers (SBC): Most SBCs (including the Raspberry Pi, **especially the Raspberry Pi 5**) are too slow to provide an acceptable Jellyfin experience as they often lack proper support for hardware acceleration. If you really want to run Jellyfin on an SBC, you may wish to consider models based on the following platforms: Rockchip RK3588 / RK3588S, Intel Core, Intel 12th gen N series - AMD Graphics: AMD Graphics have poor encoder quality and poor driver support. **This applies even on Linux**. - Low-end GPUs: Certain low-end GPUs, e.g., GT1030, RX6400, are not capable of hardware encoding. These models cannot be used for hardware acceleration for a Jellyfin Server. From 6a454e8d5ed891579ce73f78eb05c3f4682e66dd Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 05:28:19 +0100 Subject: [PATCH 010/190] Update hardware-selection.md based on feedback Updated based on https://github.com/jellyfin/jellyfin.org/pull/1511#discussion_r2275298433 --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 148ec5e8..08930601 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -124,7 +124,7 @@ transcoding. You may find current desktop CPUs do not offer adequate performance ### System Memory (RAM) -As a general recommendation, at least 8GB is recommended for the average deployment. For a Linux server running without a GUI, 4GB may be adequate. +As a general recommendation, at least 8GB is recommended for the average deployment. For a Linux server running without a GUI, 4GB may be enough. It is recommended to add more memory when using Windows 11 due to the OS being heavier. From b6ef00efa7d02dd17998040c1569ca52807c7e82 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 05:29:24 +0100 Subject: [PATCH 011/190] Update hardware-selection.md based off of feedback Updated based off of https://github.com/jellyfin/jellyfin.org/pull/1511#discussion_r2275300896 --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 08930601..8e3f4c47 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -157,7 +157,7 @@ For decoding support, the more codecs the better. However, there are only a few Please refer to [this table](https://en.wikipedia.org/wiki/Intel_Quick_Sync_Video#Hardware_decoding_and_encoding) for supported codecs. -Intel CPUs with a model name that ends with `F` do not have integrated graphics. These are intended to be used with a dedicated graphics card. Ergo, if you wish to use Intel integrated graphics, this is not an appropriate choice of component for your Jellyfin Server. +Intel CPUs with a model name that ends with `F` do not have integrated graphics. These are intended to be used with a dedicated graphics card, meaning that if you wish to use Intel integrated graphics, this is not an appropriate choice of component for your Jellyfin Server. If you are planning to use Linux with Intel 12/13th gen integrated graphics or ARC, these GPUs only work on Linux Kernel 6.2 or newer. Please check your distribution to make sure it has a supported Linux Kernel version. Further information: [Known Intel limitations on Linux](/docs/general/post-install/transcoding/hardware-acceleration/known-issues#intel-on-linux). From 2f4832399a34e3ae3479d8616c83cbb544f2202e Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 05:41:31 +0100 Subject: [PATCH 012/190] Update hardware-selection.md based off of feedback Based off of https://github.com/jellyfin/jellyfin.org/pull/1511#discussion_r2275296110 --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 8e3f4c47..90b43b26 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -95,7 +95,7 @@ The CPU will be responsible for many tasks, notably: - Transcoding Audio - Decoding video in unsupported codecs -Audio codecs are very lightweight and most CPUs should be able to handle them without issues, e.g., Ryzen 5950X `FLAC -> AAC` transcoding runs at ~110x real-time. Please note that they will only use a single core. +Whilst audio codecs will only utilize a single core, they are very lightweight, most CPUs should be able to handle them without issues. E.g., a Ryzen 5950X transcoding `FLAC -> AAC` runs at ~110x real-time. Video in unsupported codecs are usually older formats that are easier to decode. Assuming hardware acceleration is properly configured, any modern CPU with 4 threads should be able to handle the workload. From 3bd1fb9728a377a7be49e5ed2b024cd94799e0b7 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 05:55:13 +0100 Subject: [PATCH 013/190] Updated hardware-selection.md based on feedback Updated based on https://github.com/jellyfin/jellyfin.org/pull/1511#discussion_r2275321054 --- docs/general/administration/hardware-selection.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 90b43b26..767662b9 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -50,8 +50,8 @@ Intel 7-10th gen CPUs have been removed from this list, since the toolkit for th If you are planning to use a dedicated graphics card (including upgrading an old system with a dedicated GPU), the following specs are recommended: -- CPU: Intel Core i5-2300, AMD FX-8100 or better (Geekbench 6 Multicore 1500 or better), CPU Vendor / Performance will **NOT** affect hardware encode speed or quality -- RAM: 8GB (4GB should be enough for a Linux server without a native GUI) +- CPU: Intel Core i5-2300,AMD FX-8100 or better (Geekbench 6 Multicore 1500 or better), CPU Vendor / Performance will **NOT** affect hardware encode speed or quality +- RAM: 8GB. However, 4GB may be enough for a Linux server that is not running a graphical user interface. CLI or browser-based administrative panels are essential on 4GB of RAM. - Graphics: Intel Arc A series or newer, NVIDIA GTX16/RTX20 series or newer (Excluding GTX1650), **AMD is NOT recommended**. Intel Drivers are much easier to install on Linux, with many distributions including them by default. If you do not need CUDA for other applications, it is highly recommended that you stick with Intel Graphics on Linux. From 14ceb8b66ab977f62d00aac80c6c38a1a8c72c0e Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 05:56:57 +0100 Subject: [PATCH 014/190] Updated hardware-selection.md Think this is superior. :- ) --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 767662b9..0d153319 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -51,7 +51,7 @@ Intel 7-10th gen CPUs have been removed from this list, since the toolkit for th If you are planning to use a dedicated graphics card (including upgrading an old system with a dedicated GPU), the following specs are recommended: - CPU: Intel Core i5-2300,AMD FX-8100 or better (Geekbench 6 Multicore 1500 or better), CPU Vendor / Performance will **NOT** affect hardware encode speed or quality -- RAM: 8GB. However, 4GB may be enough for a Linux server that is not running a graphical user interface. CLI or browser-based administrative panels are essential on 4GB of RAM. +- RAM: 8GB. However, 4GB may be enough for a Linux server that is not running a locally-rendered GUI. CLI or browser-based administrative panels are essential on 4GB of RAM. - Graphics: Intel Arc A series or newer, NVIDIA GTX16/RTX20 series or newer (Excluding GTX1650), **AMD is NOT recommended**. Intel Drivers are much easier to install on Linux, with many distributions including them by default. If you do not need CUDA for other applications, it is highly recommended that you stick with Intel Graphics on Linux. From caf2bd1b8279c3d6673b5888cff124f18a622b28 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 06:06:50 +0100 Subject: [PATCH 015/190] Update hardware-selection.md Fixed a typo. :- ) --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 0d153319..2e42258c 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -105,7 +105,7 @@ In our custom `jellyfin-ffmpeg` fork, the dav1d decoder is enabled, leading to f #### Integrated Graphics -Integrated graphics can be useful for transcoding video. For more informatin, please refer to [the GPU section](/docs/general/administration/hardware-selection#graphics-cards-gpus). +Integrated graphics can be useful for transcoding video. For more information, please refer to [the GPU section](/docs/general/administration/hardware-selection#graphics-cards-gpus). #### Resizable BAR From e590dadf0a7df4be2f5afde011fa929fab2152de Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 06:08:48 +0100 Subject: [PATCH 016/190] Update hardware-selection.md Fixed a typo. :- ) --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 2e42258c..112b9975 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -109,7 +109,7 @@ Integrated graphics can be useful for transcoding video. For more information, p #### Resizable BAR -[Resizable Bar (ReBAR)](https://www.intel.com/content/www/us/en/support/articles/000090831/graphics.html) is a PCI Express feature that optimizes access to PCIe devices. This feature requires support from both the platform and the device. Suppor for this feature is available from Intel 10th gen and above, and AMD Ryzen 3000 Series and above. +[Resizable Bar (ReBAR)](https://www.intel.com/content/www/us/en/support/articles/000090831/graphics.html) is a PCI Express feature that optimizes access to PCIe devices. This feature requires support from both the platform and the device. Support for this feature is available from Intel 10th gen and above, and AMD Ryzen 3000 Series and above. In BIOS settings of motherboards, it may also be called `Smart Access Memory` or `Clever Access Memory` From b39318f3a5299d7d745d5ec010038b6bb2b1d00d Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 06:11:03 +0100 Subject: [PATCH 017/190] Update hardware-selection.md Improved readability a little more. :- ) --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 112b9975..7eed68ca 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -109,7 +109,7 @@ Integrated graphics can be useful for transcoding video. For more information, p #### Resizable BAR -[Resizable Bar (ReBAR)](https://www.intel.com/content/www/us/en/support/articles/000090831/graphics.html) is a PCI Express feature that optimizes access to PCIe devices. This feature requires support from both the platform and the device. Support for this feature is available from Intel 10th gen and above, and AMD Ryzen 3000 Series and above. +[Resizable Bar (ReBAR)](https://www.intel.com/content/www/us/en/support/articles/000090831/graphics.html) is a PCI Express feature that optimizes access to PCIe devices. This feature requires support from both the platform and the device. Support for this feature is available beginning with Intel 10th gen, and likewise beginning with AMD Ryzen 3000 Series. In BIOS settings of motherboards, it may also be called `Smart Access Memory` or `Clever Access Memory` From ca61f196807c74d0cfbbdf57d3b553e3c4603bed Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 06:12:10 +0100 Subject: [PATCH 018/190] Update hardware-selection.md Less is more. :- ) --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 7eed68ca..1d0a2207 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -109,7 +109,7 @@ Integrated graphics can be useful for transcoding video. For more information, p #### Resizable BAR -[Resizable Bar (ReBAR)](https://www.intel.com/content/www/us/en/support/articles/000090831/graphics.html) is a PCI Express feature that optimizes access to PCIe devices. This feature requires support from both the platform and the device. Support for this feature is available beginning with Intel 10th gen, and likewise beginning with AMD Ryzen 3000 Series. +[Resizable Bar (ReBAR)](https://www.intel.com/content/www/us/en/support/articles/000090831/graphics.html) is a PCI Express feature that optimizes access to PCIe devices. This feature requires support from both the platform and the device. Support for this feature is respectively available beginning with Intel 10th gen and AMD Ryzen 3000 Series. In BIOS settings of motherboards, it may also be called `Smart Access Memory` or `Clever Access Memory` From 358580c8fd7adfd633a3169b9a120c2fa44b6b11 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 06:14:28 +0100 Subject: [PATCH 019/190] Update hardware-selection.md Clarified where the limitation was regarding AV1. --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 1d0a2207..b4d3e123 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -141,7 +141,7 @@ Intel is always recommended on non-Apple hardware for the following reasons: - Intel provides a good quality encoder, slightly better than NVIDIA and significantly better than AMD. - Intel drivers and the compute environment is much easier to setup than both NVIDIA and AMD -AMD is not recommended due to poor quality H.264 and H.265 (HEVC) output, as well as being hard to set up the compute environment. While AMD has significantly improved AV1 encoder quality, you are still more likely to transcode to H.264 or H.265 than to AV1 due to compatibility. +AMD is not recommended due to poor quality H.264 and H.265 (HEVC) output, as well as being hard to set up the compute environment. While AMD has significantly improved AV1 encoder quality, you are still more likely to transcode to H.264 or H.265 than to AV1 due to the hardware capabilities of the average Jellyfin client. A list of common codecs can be found in the [codec support documentation](/docs/general/clients/codec-support/). From 7665b9fc8f241edeaf236909b0e387780e87e6a1 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 06:17:30 +0100 Subject: [PATCH 020/190] Update hardware-selection.md Improved clarity on AMD integrated graphics. --- docs/general/administration/hardware-selection.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index b4d3e123..c524ac84 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -181,7 +181,9 @@ Certain low-end cards, e.g., RX 6400, RX 6500, do not have encoding hardware. Pl Many AMD CPUs do not have integrated graphics. These are intended to be used with a dedicated graphics card. -For Ryzen 1000 - 5000 Series, desktop CPUs with a model description that ends with `G` have integrated graphics, but other Ryzen 1000-5000 desktop CPUs do NOT. For Ryzen 7000 Series, desktop CPUs with a model description that ends with `F` do NOT have integrated graphics while others do. +For Ryzen 1000 - 5000 Series, only desktop CPUs with a model description that ends with `G` have integrated graphics—other Ryzen 1000-5000 desktop CPUs do NOT. + +For Ryzen 7000 Series, desktop CPUs with a model description that ends with `F` do NOT have integrated graphics, whereas the rest do. Please check the product page of your CPU for more info. From 253b1f9cb51729bc8ca3db5fe3eaedc43ec25ae1 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 06:20:15 +0100 Subject: [PATCH 021/190] Update hardware-selection.md Improved readability regarding codecs for non-English speakers. :- ) --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index c524ac84..45e5b6d7 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -151,7 +151,7 @@ The following is a list of video codecs Jellyfin supports transcoding to: - H.265 (Jellyfin clients have limited support) - AV1 (new in Jellyfin v10.9, supported by most modern browsers) -For decoding support, the more codecs the better. However, there are only a few codecs that media is commonly available in. The most important one to look for is HEVC 10bit decoding support, as it can be very demanding on the CPU to decode. +A greater number of codecs is desirable for decoding support. With that said, media is generally available in a small number of codecs. The most important one to look for is HEVC 10bit decoding support, as decoding can be CPU intensive. #### Intel Graphics From 5d721c014a7339b2d82ce525cd8a3fded36a275c Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 06:25:36 +0100 Subject: [PATCH 022/190] Update hardware-selection.md Improved readability for non-English speakers by simplifying. :- ) --- docs/general/administration/hardware-selection.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 45e5b6d7..0f79649b 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -32,13 +32,13 @@ Apple ≥ Intel ≥ NVIDIA >>> AMD\* ### Server with Integrated Graphics -If you are not planning to use a dedicated graphics card, the following specs are recommended: +If you do not intend to use a dedicated graphics card, the following specs are recommended: - CPU: Intel Core i5-11400, Intel Pentium Gold G7400, Intel N100, Apple M series or newer (excluding Intel J/M/N/Y series up to 11th gen) - RAM: 8GB System RAM (Consider adding more on Windows 11) - Graphics: Intel UHD 710, Apple M series or newer -AMD is **NOT** recommended if you plan to use integrated graphics for Jellyfin. +AMD is **NOT** recommended if you intend to use integrated graphics for Jellyfin. :::caution @@ -48,7 +48,7 @@ Intel 7-10th gen CPUs have been removed from this list, since the toolkit for th ### Server with Dedicated Graphics -If you are planning to use a dedicated graphics card (including upgrading an old system with a dedicated GPU), the following specs are recommended: +If you intend to use a dedicated graphics card (including upgrading an old system with a dedicated GPU), the following specs are recommended: - CPU: Intel Core i5-2300,AMD FX-8100 or better (Geekbench 6 Multicore 1500 or better), CPU Vendor / Performance will **NOT** affect hardware encode speed or quality - RAM: 8GB. However, 4GB may be enough for a Linux server that is not running a locally-rendered GUI. CLI or browser-based administrative panels are essential on 4GB of RAM. @@ -159,7 +159,7 @@ Please refer to [this table](https://en.wikipedia.org/wiki/Intel_Quick_Sync_Vide Intel CPUs with a model name that ends with `F` do not have integrated graphics. These are intended to be used with a dedicated graphics card, meaning that if you wish to use Intel integrated graphics, this is not an appropriate choice of component for your Jellyfin Server. -If you are planning to use Linux with Intel 12/13th gen integrated graphics or ARC, these GPUs only work on Linux Kernel 6.2 or newer. Please check your distribution to make sure it has a supported Linux Kernel version. Further information: [Known Intel limitations on Linux](/docs/general/post-install/transcoding/hardware-acceleration/known-issues#intel-on-linux). +If you intend to use Linux with Intel 12/13th gen integrated graphics or ARC, these GPUs only work on Linux Kernel 6.2 or newer. Please check your distribution to make sure it has a supported Linux Kernel version. Further information: [Known Intel limitations on Linux](/docs/general/post-install/transcoding/hardware-acceleration/known-issues#intel-on-linux). :::caution From 4382b9545550e00c70f6a4fe98089a158c9b230c Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 06:27:35 +0100 Subject: [PATCH 023/190] Update hardware-selection.md Caught a missing period. --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 0f79649b..287d9e69 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -120,7 +120,7 @@ When using Intel ARC Graphics, Resizable BAR is recommended. Disabling it will r If there is no GPU available on a Jellyfin Server, the CPU can also be used to tone-map HDR content to SDR. **This can be very demanding on the CPU, therefore a GPU is ALWAYS recommended.** When using software tone-mapping, a software encoder will always be used. Tone-mapping 4K 60fps Dolby Vision content to 4K 60fps H264 SDR requires a Ryzen 9 5950X for faster than real-time -transcoding. You may find current desktop CPUs do not offer adequate performance if you seek to provide streams in H265 or AV1. +transcoding. You may find current desktop CPUs do not offer adequate performance if you seek to provide streams in H.265 or AV1. ### System Memory (RAM) From fc13747ac9efd1cf1d03c579bfa9f98e8f158aba Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 06:30:05 +0100 Subject: [PATCH 024/190] Update hardware-selection.md Removed redundant pluralization. --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 287d9e69..de3efcec 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -246,4 +246,4 @@ The files for Jellyfin itself (i.e., not your media files) will see a lot of ran ### Networking -Networking is for connecting your Jellyfin server to other devices. It is recommended that the Jellyfin Server be connected to your network via Ethernet cables for optimal performance. Wi-Fi or Powerline solutions for a Jellyfin Server are NOT recommended and will result in an especially poor experience. +Networking is for connecting your Jellyfin server to other devices. It is recommended that the Jellyfin Server be connected to your network via Ethernet cable for optimal performance. Wi-Fi or Powerline solutions for a Jellyfin Server are NOT recommended and will result in an especially poor experience. From 6b42599dea3fe386dd60fc0057b971e91f4e0749 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 06:36:06 +0100 Subject: [PATCH 025/190] Update hardware-selection.md Added warning about DMZ ports as I've seen newbies plug their server straight into the "spare" ethernet port on their router, which has turned out to be for DMZ. Likewise, with people thinking they should put their server on the DMZ to secure the rest of their network without realizing that it's out in the open. --- docs/general/administration/hardware-selection.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index de3efcec..d58f9e72 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -247,3 +247,5 @@ The files for Jellyfin itself (i.e., not your media files) will see a lot of ran ### Networking Networking is for connecting your Jellyfin server to other devices. It is recommended that the Jellyfin Server be connected to your network via Ethernet cable for optimal performance. Wi-Fi or Powerline solutions for a Jellyfin Server are NOT recommended and will result in an especially poor experience. + +Jellyfin Server is not designed to be exposed directly to the internet, do NOT accidentally connect your Jellyfin Server to ethernet ports marked `DMZ` on your network router. Always check the label before inserting the cable. From e17ee5cb7bcef2e04c5e3e1787422752cdd6cddc Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 06:37:58 +0100 Subject: [PATCH 026/190] Update hardware-selection.md Clarified what the label was on. --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index d58f9e72..77d6260a 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -248,4 +248,4 @@ The files for Jellyfin itself (i.e., not your media files) will see a lot of ran Networking is for connecting your Jellyfin server to other devices. It is recommended that the Jellyfin Server be connected to your network via Ethernet cable for optimal performance. Wi-Fi or Powerline solutions for a Jellyfin Server are NOT recommended and will result in an especially poor experience. -Jellyfin Server is not designed to be exposed directly to the internet, do NOT accidentally connect your Jellyfin Server to ethernet ports marked `DMZ` on your network router. Always check the label before inserting the cable. +Jellyfin Server is not designed to be exposed directly to the internet, do NOT accidentally connect your Jellyfin Server to ethernet ports marked `DMZ` on your network router. Always check the port label before inserting the cable. From 3a58bfa221e5eece3d2dad8b8b00b29867fdd5c7 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 06:39:30 +0100 Subject: [PATCH 027/190] Update hardware-selection.md Improved readability. :- ) --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 77d6260a..862506da 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -101,7 +101,7 @@ Video in unsupported codecs are usually older formats that are easier to decode. However, newer codecs can also require software decoding if there are no available hardware decoders. HEVC, VP9 and AV1 can be **VERY** demanding even on modern CPUs if hardware acceleration is not available on a Jellyfin Server. This is why a hardware platform capable of HEVC 10bit hardware decoding is strongly recommended. -In our custom `jellyfin-ffmpeg` fork, the dav1d decoder is enabled, leading to faster software decoding compared to HEVC or VP9. However, it will still use significantly more resources compared to software decoding H.264, or older codecs. Since we have a more efficient AV1 software decoder, and AV1 media isn't common yet, you shouldn't worry about AV1 when choosing components for your Jellyfin Server. +In our custom `jellyfin-ffmpeg` fork, the dav1d decoder is enabled, leading to faster software decoding compared to HEVC or VP9. However, it will still use significantly more resources compared to software decoding H.264 and older codecs. Since we have a more efficient AV1 software decoder, and AV1 media isn't common yet, you shouldn't worry about AV1 when choosing components for your Jellyfin Server. #### Integrated Graphics From 6410173b3ab36a8c9f56af878f44f1232e54db7f Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 06:47:31 +0100 Subject: [PATCH 028/190] Update hardware-selection.md Clarified. --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 862506da..194ebb70 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -248,4 +248,4 @@ The files for Jellyfin itself (i.e., not your media files) will see a lot of ran Networking is for connecting your Jellyfin server to other devices. It is recommended that the Jellyfin Server be connected to your network via Ethernet cable for optimal performance. Wi-Fi or Powerline solutions for a Jellyfin Server are NOT recommended and will result in an especially poor experience. -Jellyfin Server is not designed to be exposed directly to the internet, do NOT accidentally connect your Jellyfin Server to ethernet ports marked `DMZ` on your network router. Always check the port label before inserting the cable. +Jellyfin Server is not designed to be exposed directly to the internet, do NOT accidentally connect your server to ethernet ports marked `DMZ` on your network router. Always check the port label before inserting the cable. From 69899ee304e407bfcde0af59138d573497056b24 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 07:11:37 +0100 Subject: [PATCH 029/190] Update storage.md with information about ZFS Thought this was sorely lacking and is something I've been experimenting with due to there not being much information available on the topic. --- docs/general/administration/storage.md | 30 ++++++++++++++++++++------ 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/docs/general/administration/storage.md b/docs/general/administration/storage.md index 41d90a4f..d125e6aa 100644 --- a/docs/general/administration/storage.md +++ b/docs/general/administration/storage.md @@ -1,13 +1,11 @@ --- uid: server-storage title: Storage ---- - -## Storage +- Jellyfin is designed to directly read media from the filesystem. A network storage device that is using samba or NFS must be directly mounted to the OS. The Jellyfin database should also be stored locally and not on a network storage device. -### NFS +## NFS In case you encounter performance issues where files take a long time to start playing while using NFSv3, you might be running in an issue with .NET locking without NFSv3 having locking enabled. @@ -18,18 +16,36 @@ To solve this, you have the following options: - Enable the lock service. - Use NFSv4 which has built-in lock support. -## Docker or VMs +## Docker and VMs -For storage, a moderate size library database can grow anywhere from 10 to 100 GB. The [transcoding](/docs/general/post-install/transcoding) folder needs roughly the same size as the original media if it's being transcoded at the same bitrate. A single 50GB Blu-Ray Remux by itself can take up to approximately 60GB or as little as 15GB, depending on the quality selected. If the transcoding folder is held on the same storage as the database, this must be taken into consideration. +A database for a moderate-sized library can grow anywhere from 10 to 100 GB. + +The [transcoding](/docs/general/post-install/transcoding) folder needs roughly the same size as the original media when transcoded at the same bitrate. A single 50 GB Blu-Ray remux by itself can take up to ~60 GB or as little as ~15 GB, depending on chosen quality. If the transcoding folder is held on the same storage as the database, this must be taken into consideration. ## Cloud A popular choice for cloud storage has been the program [rclone](https://rclone.org/downloads/). It is supported on most Operating Systems. To facilitate combining local and cloud filesystems, rclone can be paired with another program such as [mergerfs](https://github.com/trapexit/mergerfs). For cloud storage, it is recommended to disable image extraction as this requires downloading the entire file to perform this task. -### MergerFS +## MergerFS MergerFS isn't meant for everything, [see here](https://github.com/trapexit/mergerfs#what-should-mergerfs-not-be-used-for) for more. - rclone recommended [config](https://forum.rclone.org/t/my-best-rclone-config-mount-for-plex/7441). To modify and examine your mergerfs mount, here's a quick [guide](https://zackreed.me/mergerfs-neat-tricks). + +## Filesystem Considerations + +With certain filesystems, optimizations are highly recommended for acceptable performance. + +### ZFS + +Whilst development is being done on further database providers, in current implementation of Jellyfin Server, the database uses SQLite. ZFS uses a default record size of `128 K`. This is sub-optimal for the SQLite database. + +Ideally, you want `4 K` or `8 K` for the dataset that contains your database. This is easily configured when running Jellyfin Server within a Docker container as you are able to easily change bind mounts and can set various datasets for each path as appropriate. + +The record size for your media file dataset(s) must not be using `4 K` or `8 K`, otherwise you will likely encounter performance issues as your database scales. + +For ZFS datasets containing large media files (i.e., not the dataset containing the Jellyfin Server SQLite database), a record size of `1 M` is likely appropriate for optimal performance. + +N.b. Changing the record size on an existing ZFS dataset will not change the existing data within it, meaning performance will not be any different for anything but newly-written changes into the dataset. As such, it is recommended to rewrite your data into the dataset to take advantage of the change in record size, otherwise the configuration change will not perform as expected. From fb310daf4c24ddd50f59b3ed05c8a3308e1ba29f Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 07:15:58 +0100 Subject: [PATCH 030/190] Update storage.md Added warning about ZFS and mechanical drives. --- docs/general/administration/storage.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/general/administration/storage.md b/docs/general/administration/storage.md index d125e6aa..9532a45e 100644 --- a/docs/general/administration/storage.md +++ b/docs/general/administration/storage.md @@ -42,10 +42,12 @@ With certain filesystems, optimizations are highly recommended for acceptable pe Whilst development is being done on further database providers, in current implementation of Jellyfin Server, the database uses SQLite. ZFS uses a default record size of `128 K`. This is sub-optimal for the SQLite database. -Ideally, you want `4 K` or `8 K` for the dataset that contains your database. This is easily configured when running Jellyfin Server within a Docker container as you are able to easily change bind mounts and can set various datasets for each path as appropriate. +Ideally, you should use `4 K` or `8 K` for the dataset that contains your Jellyfin Server SQLite database. This is easily configured when running Jellyfin Server within a Docker container as you are able to easily change bind mounts and can set various datasets for each path as appropriate. The record size for your media file dataset(s) must not be using `4 K` or `8 K`, otherwise you will likely encounter performance issues as your database scales. For ZFS datasets containing large media files (i.e., not the dataset containing the Jellyfin Server SQLite database), a record size of `1 M` is likely appropriate for optimal performance. N.b. Changing the record size on an existing ZFS dataset will not change the existing data within it, meaning performance will not be any different for anything but newly-written changes into the dataset. As such, it is recommended to rewrite your data into the dataset to take advantage of the change in record size, otherwise the configuration change will not perform as expected. + +As ZFS snapshots can use a lot of storage over time without a sensible `destroy` schedule, there may be a temptation to keep your data on a mechanical drive instead of an SSD. Do NOT use ZFS-formatted mechanical drives to store your Jellyfin Server data (everything except your media files), or you will have terrible performance. SSD is absolutely necessary. From 35ddabfaded39d7de9553e382545568abdfab5fb Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 07:17:13 +0100 Subject: [PATCH 031/190] Update storage.md Improved readability. --- docs/general/administration/storage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/storage.md b/docs/general/administration/storage.md index 9532a45e..8e834051 100644 --- a/docs/general/administration/storage.md +++ b/docs/general/administration/storage.md @@ -48,6 +48,6 @@ The record size for your media file dataset(s) must not be using `4 K` or `8 K`, For ZFS datasets containing large media files (i.e., not the dataset containing the Jellyfin Server SQLite database), a record size of `1 M` is likely appropriate for optimal performance. -N.b. Changing the record size on an existing ZFS dataset will not change the existing data within it, meaning performance will not be any different for anything but newly-written changes into the dataset. As such, it is recommended to rewrite your data into the dataset to take advantage of the change in record size, otherwise the configuration change will not perform as expected. +N.b.: Changing the record size on an existing ZFS dataset will not change the existing data within it, meaning performance will not be any different for anything but newly-written changes into the dataset. As such, it is recommended to rewrite your data into the dataset to take advantage of the change in record size, otherwise the configuration change will not perform as expected. As ZFS snapshots can use a lot of storage over time without a sensible `destroy` schedule, there may be a temptation to keep your data on a mechanical drive instead of an SSD. Do NOT use ZFS-formatted mechanical drives to store your Jellyfin Server data (everything except your media files), or you will have terrible performance. SSD is absolutely necessary. From 169e84d39875fdf6bb48550f5910a3ea82a48e3a Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 07:18:48 +0100 Subject: [PATCH 032/190] Update storage.md Clarified. --- docs/general/administration/storage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/storage.md b/docs/general/administration/storage.md index 8e834051..6042396f 100644 --- a/docs/general/administration/storage.md +++ b/docs/general/administration/storage.md @@ -3,7 +3,7 @@ uid: server-storage title: Storage - -Jellyfin is designed to directly read media from the filesystem. A network storage device that is using samba or NFS must be directly mounted to the OS. The Jellyfin database should also be stored locally and not on a network storage device. +Jellyfin is designed to directly read media from a filesystem. A network storage device using Samba or NFS must be directly mounted to the OS. The Jellyfin Server database should also be stored locally and not on a network storage device for acceptable performance. ## NFS From 1851521ef736e1a9659f66129b81701ed699ebe8 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 07:21:47 +0100 Subject: [PATCH 033/190] Updated storage.md based on feedback Updated based on https://github.com/jellyfin/jellyfin.org/pull/1513#pullrequestreview-3119163490 --- docs/general/administration/storage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/storage.md b/docs/general/administration/storage.md index 6042396f..eece9297 100644 --- a/docs/general/administration/storage.md +++ b/docs/general/administration/storage.md @@ -20,7 +20,7 @@ To solve this, you have the following options: A database for a moderate-sized library can grow anywhere from 10 to 100 GB. -The [transcoding](/docs/general/post-install/transcoding) folder needs roughly the same size as the original media when transcoded at the same bitrate. A single 50 GB Blu-Ray remux by itself can take up to ~60 GB or as little as ~15 GB, depending on chosen quality. If the transcoding folder is held on the same storage as the database, this must be taken into consideration. +The [transcoding](/docs/general/post-install/transcoding) folder needs roughly the same size as the original media when transcoded at the same bitrate. A single 50 GB Blu-Ray remux by itself can take up to ~60 GB or as little as ~15 GB. If the transcoding folder is held on the same storage as the database, this must be taken into consideration. ## Cloud From b671e5a062e839b6ce06d46670ac2db9929de71a Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 07:23:26 +0100 Subject: [PATCH 034/190] Update storage.md Clarified. --- docs/general/administration/storage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/storage.md b/docs/general/administration/storage.md index eece9297..1ec00c48 100644 --- a/docs/general/administration/storage.md +++ b/docs/general/administration/storage.md @@ -48,6 +48,6 @@ The record size for your media file dataset(s) must not be using `4 K` or `8 K`, For ZFS datasets containing large media files (i.e., not the dataset containing the Jellyfin Server SQLite database), a record size of `1 M` is likely appropriate for optimal performance. -N.b.: Changing the record size on an existing ZFS dataset will not change the existing data within it, meaning performance will not be any different for anything but newly-written changes into the dataset. As such, it is recommended to rewrite your data into the dataset to take advantage of the change in record size, otherwise the configuration change will not perform as expected. +N.b.: Changing the record size on an existing ZFS dataset will not change the existing data within it, meaning performance will not be any different for anything but newly-written changes into the dataset. As such, it is recommended to rewrite your data into the dataset to take advantage of the change in record size, otherwise the configuration change will not yield the expected change in performance. As ZFS snapshots can use a lot of storage over time without a sensible `destroy` schedule, there may be a temptation to keep your data on a mechanical drive instead of an SSD. Do NOT use ZFS-formatted mechanical drives to store your Jellyfin Server data (everything except your media files), or you will have terrible performance. SSD is absolutely necessary. From 2258877964027b95e77de6edd75027fbf4e42c27 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 07:24:14 +0100 Subject: [PATCH 035/190] Update storage.md Added a missing `the`. :- ) --- docs/general/administration/storage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/storage.md b/docs/general/administration/storage.md index 1ec00c48..36c87026 100644 --- a/docs/general/administration/storage.md +++ b/docs/general/administration/storage.md @@ -40,7 +40,7 @@ With certain filesystems, optimizations are highly recommended for acceptable pe ### ZFS -Whilst development is being done on further database providers, in current implementation of Jellyfin Server, the database uses SQLite. ZFS uses a default record size of `128 K`. This is sub-optimal for the SQLite database. +Whilst development is being done on further database providers, in the current implementation of Jellyfin Server, the database uses SQLite. ZFS uses a default record size of `128 K`. This is sub-optimal for the SQLite database. Ideally, you should use `4 K` or `8 K` for the dataset that contains your Jellyfin Server SQLite database. This is easily configured when running Jellyfin Server within a Docker container as you are able to easily change bind mounts and can set various datasets for each path as appropriate. From 065620bec8621c10093040fec2bdd28ea0d45f76 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 07:28:27 +0100 Subject: [PATCH 036/190] Update storage.md Clarified the reason as to why it is important. --- docs/general/administration/storage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/storage.md b/docs/general/administration/storage.md index 36c87026..3cd18335 100644 --- a/docs/general/administration/storage.md +++ b/docs/general/administration/storage.md @@ -20,7 +20,7 @@ To solve this, you have the following options: A database for a moderate-sized library can grow anywhere from 10 to 100 GB. -The [transcoding](/docs/general/post-install/transcoding) folder needs roughly the same size as the original media when transcoded at the same bitrate. A single 50 GB Blu-Ray remux by itself can take up to ~60 GB or as little as ~15 GB. If the transcoding folder is held on the same storage as the database, this must be taken into consideration. +The [transcoding](/docs/general/post-install/transcoding) folder needs roughly the same size as the original media when transcoded at the same bitrate. A single 50 GB Blu-Ray remux by itself can take up to ~60 GB or as little as ~15 GB. If the transcoding folder is held on the same storage as the database, this must be taken into consideration to prevent running out of storage and thus corrupting your database. ## Cloud From ec767aca91e396ea8ccb79a676734d86c9ac840f Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 07:31:38 +0100 Subject: [PATCH 037/190] Update storage.md Improved readability for non-English speaking users. --- docs/general/administration/storage.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/general/administration/storage.md b/docs/general/administration/storage.md index 3cd18335..f7d517e1 100644 --- a/docs/general/administration/storage.md +++ b/docs/general/administration/storage.md @@ -24,7 +24,9 @@ The [transcoding](/docs/general/post-install/transcoding) folder needs roughly t ## Cloud -A popular choice for cloud storage has been the program [rclone](https://rclone.org/downloads/). It is supported on most Operating Systems. To facilitate combining local and cloud filesystems, rclone can be paired with another program such as [mergerfs](https://github.com/trapexit/mergerfs). For cloud storage, it is recommended to disable image extraction as this requires downloading the entire file to perform this task. +[rclone](https://rclone.org/downloads/) is a popular choice for integrating cloud storage with a Jellyfin Server. rclone is supported on most operating systems. To combine local and cloud filesystems, rclone can be paired with another program such as [mergerfs](https://github.com/trapexit/mergerfs). + +When using cloud storage, it is recommended to disable image extraction as the task requires downloading the entire file. ## MergerFS From 28e07d994c06a7c7b7ee72b6d48651e62ef1d0bf Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 07:32:39 +0100 Subject: [PATCH 038/190] Update storage.md Improved readability. :- ) --- docs/general/administration/storage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/storage.md b/docs/general/administration/storage.md index f7d517e1..7d4a63c9 100644 --- a/docs/general/administration/storage.md +++ b/docs/general/administration/storage.md @@ -38,7 +38,7 @@ To modify and examine your mergerfs mount, here's a quick [guide](https://zackre ## Filesystem Considerations -With certain filesystems, optimizations are highly recommended for acceptable performance. +For certain filesystems, optimizations are highly recommended for acceptable performance. ### ZFS From 9600d9e91d16d88648eb18f4e466f01cfffa2a12 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 07:34:21 +0100 Subject: [PATCH 039/190] Update storage.md Improved clarity. --- docs/general/administration/storage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/storage.md b/docs/general/administration/storage.md index 7d4a63c9..0d4f9f24 100644 --- a/docs/general/administration/storage.md +++ b/docs/general/administration/storage.md @@ -44,7 +44,7 @@ For certain filesystems, optimizations are highly recommended for acceptable per Whilst development is being done on further database providers, in the current implementation of Jellyfin Server, the database uses SQLite. ZFS uses a default record size of `128 K`. This is sub-optimal for the SQLite database. -Ideally, you should use `4 K` or `8 K` for the dataset that contains your Jellyfin Server SQLite database. This is easily configured when running Jellyfin Server within a Docker container as you are able to easily change bind mounts and can set various datasets for each path as appropriate. +Ideally, you should use a record size of `4 K` or `8 K` on the dataset that contains your Jellyfin Server SQLite database. This is easily configured when running Jellyfin Server within a Docker container as you are able to easily change bind mounts and can set various datasets for each path as appropriate. The record size for your media file dataset(s) must not be using `4 K` or `8 K`, otherwise you will likely encounter performance issues as your database scales. From 13097006f782a92434cb068e10d200a2d462b50c Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 07:35:40 +0100 Subject: [PATCH 040/190] Update storage.md Improved clarity. --- docs/general/administration/storage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/storage.md b/docs/general/administration/storage.md index 0d4f9f24..2379fa27 100644 --- a/docs/general/administration/storage.md +++ b/docs/general/administration/storage.md @@ -22,7 +22,7 @@ A database for a moderate-sized library can grow anywhere from 10 to 100 GB. The [transcoding](/docs/general/post-install/transcoding) folder needs roughly the same size as the original media when transcoded at the same bitrate. A single 50 GB Blu-Ray remux by itself can take up to ~60 GB or as little as ~15 GB. If the transcoding folder is held on the same storage as the database, this must be taken into consideration to prevent running out of storage and thus corrupting your database. -## Cloud +## Cloud Storage Providers [rclone](https://rclone.org/downloads/) is a popular choice for integrating cloud storage with a Jellyfin Server. rclone is supported on most operating systems. To combine local and cloud filesystems, rclone can be paired with another program such as [mergerfs](https://github.com/trapexit/mergerfs). From e5221603a59c4cb414377ac22a8e60717d52d4b1 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 10:23:51 +0100 Subject: [PATCH 041/190] Updated hardware-selection.md based on feedback Updated it based off of https://github.com/jellyfin/jellyfin.org/pull/1511#discussion_r2275998683 --- docs/general/administration/hardware-selection.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 194ebb70..e488c4c6 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -234,11 +234,11 @@ Supported codecs are listed below: ### Storage -There are two general types of storage that can be used on a Jellyfin Server. Media files and Jellyfin files each require different performance characteristics for optimal performance. +There are two general types of storage that can be used on a Jellyfin Server. Media files and Jellyfin files respectively require specific hardware to optimize performance. #### Media Storage -Anything with higher sequential access speed than bitrate of media is appropriate. If desired, this storage may be a network share, or a cloud storage service mounted on the Jellyfin Server host. +Anything with higher sequential access speed than bitrate of media is acceptable. If desired, this storage may be a network share, or a cloud storage service mounted on the Jellyfin Server host. #### Jellyfin Files From 5cdc9679116c6a9cc4103e0a0e0886d4085da158 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 10:27:45 +0100 Subject: [PATCH 042/190] Updated hardware-selection.md based on feedback Updated based off of feedback on https://github.com/jellyfin/jellyfin.org/pull/1511#discussion_r2276002121 --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index e488c4c6..f52be50c 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -207,7 +207,7 @@ Supported codecs are listed below: :::caution -No Apple Silicon media engine drivers currently exist for non-macOS operating systems. You will NOT be able to use hardware acceleration if you are running [Asahi Linux](https://asahilinux.org/) on your Apple Silicon hardware. +No Apple Silicon media engine drivers currently exist for non-macOS operating systems. You will NOT be able to use hardware acceleration if the server is running [Asahi Linux](https://asahilinux.org/). ::: From 98f951cee4c0880d1d4cd8ae45e43cf1acf3fdf6 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 10:32:04 +0100 Subject: [PATCH 043/190] Updated hardware-selection.md based off of feedback Updated it based off of https://github.com/jellyfin/jellyfin.org/pull/1511#discussion_r2276006493 --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index f52be50c..7915b149 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -175,7 +175,7 @@ Certain low-end cards, e.g., GT 1030, do not have encoding hardware. Please be c #### AMD Graphics -AMD graphics is not recommended for Jellyfin, but the information is still provided for reference. Information on supported codecs is on [this article](https://en.wikipedia.org/wiki/Video_Coding_Engine). +AMD graphics is not recommended for Jellyfin, this information is solely provided for reference. Further reading on supported codecs on AMD Video Coding Engine: [https://en.wikipedia.org/wiki/Video_Coding_Engine](https://en.wikipedia.org/wiki/Video_Coding_Engine). Certain low-end cards, e.g., RX 6400, RX 6500, do not have encoding hardware. Please be careful when choosing a GPU. From 43981befdc67505f7658d31cf82c3d295218f66e Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 10:33:49 +0100 Subject: [PATCH 044/190] Update hardware-selection.md Preferred the acronym as the name has changed. --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 7915b149..89716743 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -175,7 +175,7 @@ Certain low-end cards, e.g., GT 1030, do not have encoding hardware. Please be c #### AMD Graphics -AMD graphics is not recommended for Jellyfin, this information is solely provided for reference. Further reading on supported codecs on AMD Video Coding Engine: [https://en.wikipedia.org/wiki/Video_Coding_Engine](https://en.wikipedia.org/wiki/Video_Coding_Engine). +AMD graphics is not recommended for Jellyfin, this information is solely provided for reference. Further reading on supported codecs on AMD VCE: [https://en.wikipedia.org/wiki/Video_Coding_Engine](https://en.wikipedia.org/wiki/Video_Coding_Engine). Certain low-end cards, e.g., RX 6400, RX 6500, do not have encoding hardware. Please be careful when choosing a GPU. From b457979ee03abcb920c7aea89f1218c429e9ebf6 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 14 Aug 2025 10:35:12 +0100 Subject: [PATCH 045/190] Update hardware-selection.md Improved readability. --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 89716743..7323ef1f 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -175,7 +175,7 @@ Certain low-end cards, e.g., GT 1030, do not have encoding hardware. Please be c #### AMD Graphics -AMD graphics is not recommended for Jellyfin, this information is solely provided for reference. Further reading on supported codecs on AMD VCE: [https://en.wikipedia.org/wiki/Video_Coding_Engine](https://en.wikipedia.org/wiki/Video_Coding_Engine). +AMD graphics is not recommended for Jellyfin, this information is solely provided for reference. Further reading on AMD VCE supported codecs: [https://en.wikipedia.org/wiki/Video_Coding_Engine](https://en.wikipedia.org/wiki/Video_Coding_Engine). Certain low-end cards, e.g., RX 6400, RX 6500, do not have encoding hardware. Please be careful when choosing a GPU. From bea408ce52e1a23ac093bd761fc773a79270d14c Mon Sep 17 00:00:00 2001 From: Brandon Poulliot <37082932+bpoulliot@users.noreply.github.com> Date: Sat, 30 Aug 2025 13:00:34 -0600 Subject: [PATCH 046/190] Update hardware-selection.md add info regarding ARC A-series cards and ReBar --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 69a424b1..624563de 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -58,7 +58,7 @@ Intel Drivers are much easier to install on Linux, with many distributions inclu :::caution -Intel ARC B series cards require ReBar to be enabled. This means you must use it on a platform with Intel 10th gen, AMD Ryzen 3000 series or newer. +Intel ARC B-series cards require ReBar to be enabled. This means you must use it on a platform with Intel 10th gen, AMD Ryzen 3000 series or newer. Intel ARC A-series cards require ReBar enabled for optimal performance. ::: From 496081002e748305d3fd8a185ccaef608a6e4771 Mon Sep 17 00:00:00 2001 From: Brandon Poulliot <37082932+bpoulliot@users.noreply.github.com> Date: Tue, 2 Sep 2025 14:23:07 -0600 Subject: [PATCH 047/190] Update hardware-selection.md revise language for A-series ARC cards --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 624563de..36fdc9a8 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -58,7 +58,7 @@ Intel Drivers are much easier to install on Linux, with many distributions inclu :::caution -Intel ARC B-series cards require ReBar to be enabled. This means you must use it on a platform with Intel 10th gen, AMD Ryzen 3000 series or newer. Intel ARC A-series cards require ReBar enabled for optimal performance. +Intel ARC B-series cards require ReBar to be enabled. This means you must use it on a platform with Intel 10th gen, AMD Ryzen 3000 series or newer. Intel ARC A-series cards do not require ReBar to function, however, ReBar must enabled for optimal performance. ::: From 2da2536b6ccc41e655d6de3b27e4aeeeacdfc654 Mon Sep 17 00:00:00 2001 From: Brandon Poulliot <37082932+bpoulliot@users.noreply.github.com> Date: Tue, 2 Sep 2025 14:26:20 -0600 Subject: [PATCH 048/190] Update docs/general/administration/hardware-selection.md Co-authored-by: JPVenson --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 36fdc9a8..08d6f173 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -58,7 +58,7 @@ Intel Drivers are much easier to install on Linux, with many distributions inclu :::caution -Intel ARC B-series cards require ReBar to be enabled. This means you must use it on a platform with Intel 10th gen, AMD Ryzen 3000 series or newer. Intel ARC A-series cards do not require ReBar to function, however, ReBar must enabled for optimal performance. +Intel ARC B-series cards require ReBar to be enabled. This means you must use it on a platform with Intel 10th gen, AMD Ryzen 3000 series or newer. Intel ARC A-series cards do not require ReBar to function, however, ReBar should be enabled for optimal performance. ::: From dcb061ced9e231526077d0b1f4ed7c17cf3d131a Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 25 Sep 2025 15:21:14 +0100 Subject: [PATCH 049/190] Update docs/general/administration/storage.md Co-authored-by: BotBlake --- docs/general/administration/storage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/storage.md b/docs/general/administration/storage.md index 2379fa27..fa5081f4 100644 --- a/docs/general/administration/storage.md +++ b/docs/general/administration/storage.md @@ -52,4 +52,4 @@ For ZFS datasets containing large media files (i.e., not the dataset containing N.b.: Changing the record size on an existing ZFS dataset will not change the existing data within it, meaning performance will not be any different for anything but newly-written changes into the dataset. As such, it is recommended to rewrite your data into the dataset to take advantage of the change in record size, otherwise the configuration change will not yield the expected change in performance. -As ZFS snapshots can use a lot of storage over time without a sensible `destroy` schedule, there may be a temptation to keep your data on a mechanical drive instead of an SSD. Do NOT use ZFS-formatted mechanical drives to store your Jellyfin Server data (everything except your media files), or you will have terrible performance. SSD is absolutely necessary. +As ZFS snapshots can use a lot of storage over time without a sensible `destroy` schedule, there may be a temptation to keep your data on a mechanical drive instead of an SSD. Do not use ZFS-formatted mechanical drives to store your Jellyfin Server data (everything except your media files), as this will result in poor performance. An SSD is strongly recommended. From 7a935bcb3f31203ed8ea164dfe6e0b6766f2ab01 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 25 Sep 2025 15:21:45 +0100 Subject: [PATCH 050/190] Update docs/general/administration/storage.md Co-authored-by: BotBlake --- docs/general/administration/storage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/storage.md b/docs/general/administration/storage.md index fa5081f4..7b1745da 100644 --- a/docs/general/administration/storage.md +++ b/docs/general/administration/storage.md @@ -50,6 +50,6 @@ The record size for your media file dataset(s) must not be using `4 K` or `8 K`, For ZFS datasets containing large media files (i.e., not the dataset containing the Jellyfin Server SQLite database), a record size of `1 M` is likely appropriate for optimal performance. -N.b.: Changing the record size on an existing ZFS dataset will not change the existing data within it, meaning performance will not be any different for anything but newly-written changes into the dataset. As such, it is recommended to rewrite your data into the dataset to take advantage of the change in record size, otherwise the configuration change will not yield the expected change in performance. +Note that changing the record size on an existing ZFS dataset will not change the existing data within it, meaning performance will not be any different for anything but newly-written changes into the dataset. As such, it is recommended to rewrite your data into the dataset to take advantage of the change in record size; otherwise, the configuration change will not yield the expected change in performance. As ZFS snapshots can use a lot of storage over time without a sensible `destroy` schedule, there may be a temptation to keep your data on a mechanical drive instead of an SSD. Do not use ZFS-formatted mechanical drives to store your Jellyfin Server data (everything except your media files), as this will result in poor performance. An SSD is strongly recommended. From 256b8001c37062829f192d56ef2e1a2d94ff1e2e Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 25 Sep 2025 15:22:07 +0100 Subject: [PATCH 051/190] Update docs/general/administration/storage.md Co-authored-by: BotBlake --- docs/general/administration/storage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/storage.md b/docs/general/administration/storage.md index 7b1745da..98ca2da4 100644 --- a/docs/general/administration/storage.md +++ b/docs/general/administration/storage.md @@ -3,7 +3,7 @@ uid: server-storage title: Storage - -Jellyfin is designed to directly read media from a filesystem. A network storage device using Samba or NFS must be directly mounted to the OS. The Jellyfin Server database should also be stored locally and not on a network storage device for acceptable performance. +Jellyfin is designed to directly read media from a filesystem. A network storage device using SMB or NFS must be directly mounted to the OS. The Jellyfin Server database should also be stored locally and not on a network storage device for acceptable performance. ## NFS From 8e6a4a4bf0f6e476a61e1dd1350c3a13a69f3f76 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 25 Sep 2025 15:28:33 +0100 Subject: [PATCH 052/190] Update docs/general/administration/storage.md Co-authored-by: BotBlake --- docs/general/administration/storage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/storage.md b/docs/general/administration/storage.md index 98ca2da4..48f42de0 100644 --- a/docs/general/administration/storage.md +++ b/docs/general/administration/storage.md @@ -26,7 +26,7 @@ The [transcoding](/docs/general/post-install/transcoding) folder needs roughly t [rclone](https://rclone.org/downloads/) is a popular choice for integrating cloud storage with a Jellyfin Server. rclone is supported on most operating systems. To combine local and cloud filesystems, rclone can be paired with another program such as [mergerfs](https://github.com/trapexit/mergerfs). -When using cloud storage, it is recommended to disable image extraction as the task requires downloading the entire file. +When using cloud storage, it is recommended to disable image extraction as it requires downloading the entire file. ## MergerFS From 40916c8547531c1040420763caee3f3899e66a1f Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Thu, 25 Sep 2025 15:28:46 +0100 Subject: [PATCH 053/190] Update docs/general/administration/storage.md Co-authored-by: BotBlake --- docs/general/administration/storage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/storage.md b/docs/general/administration/storage.md index 48f42de0..bd052e66 100644 --- a/docs/general/administration/storage.md +++ b/docs/general/administration/storage.md @@ -1,7 +1,7 @@ --- uid: server-storage title: Storage -- +--- Jellyfin is designed to directly read media from a filesystem. A network storage device using SMB or NFS must be directly mounted to the OS. The Jellyfin Server database should also be stored locally and not on a network storage device for acceptable performance. From 64772a4eac62a8eea7d40a633e501e73bc0a939d Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Sun, 5 Oct 2025 00:43:02 +0100 Subject: [PATCH 054/190] Update docs/general/administration/hardware-selection.md Co-authored-by: BotBlake --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 7323ef1f..d72d8050 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -177,7 +177,7 @@ Certain low-end cards, e.g., GT 1030, do not have encoding hardware. Please be c AMD graphics is not recommended for Jellyfin, this information is solely provided for reference. Further reading on AMD VCE supported codecs: [https://en.wikipedia.org/wiki/Video_Coding_Engine](https://en.wikipedia.org/wiki/Video_Coding_Engine). -Certain low-end cards, e.g., RX 6400, RX 6500, do not have encoding hardware. Please be careful when choosing a GPU. +Certain low-end cards (e.g., RX 6400, RX 6500) do not have encoding hardware. Please be careful when choosing a GPU. Many AMD CPUs do not have integrated graphics. These are intended to be used with a dedicated graphics card. From 7656fe761a362d6da736b596b4902b79247f6db7 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Sun, 5 Oct 2025 00:43:14 +0100 Subject: [PATCH 055/190] Update docs/general/administration/hardware-selection.md Co-authored-by: BotBlake --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index d72d8050..f43e7488 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -171,7 +171,7 @@ Intel 10th gen and older integrated graphics are losing support for QSV on Linux Please refer to [this table](https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new) for supported codecs. -Certain low-end cards, e.g., GT 1030, do not have encoding hardware. Please be careful when choosing a GPU. +Certain low-end cards (e.g. GT 1030) do not have encoding hardware. Please be careful when choosing a GPU. #### AMD Graphics From 7ebf378c1a7bd88ee2f8cbbafbc354f4a40eddfa Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Sun, 5 Oct 2025 00:43:24 +0100 Subject: [PATCH 056/190] Update docs/general/administration/hardware-selection.md Co-authored-by: BotBlake --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index f43e7488..02f04ec6 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -84,7 +84,7 @@ These hardware platforms might lead to a poor Jellyfin experience. Please be car - Prebuilt NAS Appliances: The software environment on most prebuilt NAS appliances often makes third-party software more challenging to install, sometimes even preventing it from working properly despite a successful installation. They may have low-end processors that are too slow for an acceptable Jellyfin experience. E.g., Intel Atom, Realtek ARM CPUs et al. - Most Single Board Computers (SBC): Most SBCs (including the Raspberry Pi, **especially the Raspberry Pi 5**) are too slow to provide an acceptable Jellyfin experience as they often lack proper support for hardware acceleration. If you really want to run Jellyfin on an SBC, you may wish to consider models based on the following platforms: Rockchip RK3588 / RK3588S, Intel Core, Intel 12th gen N series - AMD Graphics: AMD Graphics have poor encoder quality and poor driver support. **This applies even on Linux**. -- Low-end GPUs: Certain low-end GPUs, e.g., GT1030, RX6400, are not capable of hardware encoding. These models cannot be used for hardware acceleration for a Jellyfin Server. +- Low-end GPUs: Certain low-end GPUs (e.g. GT1030, RX6400) are not capable of hardware encoding. These models cannot be used for hardware acceleration for a Jellyfin Server. ## Detailed Guide From 07d7f620a8de6c451387aa00112653212afaa699 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Sun, 5 Oct 2025 00:43:35 +0100 Subject: [PATCH 057/190] Update docs/general/administration/hardware-selection.md Co-authored-by: BotBlake --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 02f04ec6..a61e5908 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -51,7 +51,7 @@ Intel 7-10th gen CPUs have been removed from this list, since the toolkit for th If you intend to use a dedicated graphics card (including upgrading an old system with a dedicated GPU), the following specs are recommended: - CPU: Intel Core i5-2300,AMD FX-8100 or better (Geekbench 6 Multicore 1500 or better), CPU Vendor / Performance will **NOT** affect hardware encode speed or quality -- RAM: 8GB. However, 4GB may be enough for a Linux server that is not running a locally-rendered GUI. CLI or browser-based administrative panels are essential on 4GB of RAM. +- RAM: 8GB. (4GB may be sufficient for a Linux server without its own GUI.) - Graphics: Intel Arc A series or newer, NVIDIA GTX16/RTX20 series or newer (Excluding GTX1650), **AMD is NOT recommended**. Intel Drivers are much easier to install on Linux, with many distributions including them by default. If you do not need CUDA for other applications, it is highly recommended that you stick with Intel Graphics on Linux. From aaac37a90c58003247dbec6cf2b5ee0e934ba344 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Sun, 5 Oct 2025 00:43:46 +0100 Subject: [PATCH 058/190] Update docs/general/administration/hardware-selection.md Co-authored-by: BotBlake --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index a61e5908..35b37d75 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -81,7 +81,7 @@ For users with expensive electricity, or running battery-powered servers: These hardware platforms might lead to a poor Jellyfin experience. Please be careful to avoid them when shopping for hardware. - Intel "Atom" CPUs: Intel J/M/N/Y series low power CPUs up to 11th gen use a different architecture than higher end parts, leading to subpar performance despite what their names might suggest. It is advised to avoid using these parts in a Jellyfin Server. -- Prebuilt NAS Appliances: The software environment on most prebuilt NAS appliances often makes third-party software more challenging to install, sometimes even preventing it from working properly despite a successful installation. They may have low-end processors that are too slow for an acceptable Jellyfin experience. E.g., Intel Atom, Realtek ARM CPUs et al. +- Prebuilt NAS Appliances: The software environment on most prebuilt NAS appliances often makes third-party software more challenging to install, sometimes even preventing it from working properly despite a successful installation. They may have low-end processors that are too slow for an acceptable Jellyfin experience. (e.g. Intel Atom, Realtek ARM CPUs, etc.). - Most Single Board Computers (SBC): Most SBCs (including the Raspberry Pi, **especially the Raspberry Pi 5**) are too slow to provide an acceptable Jellyfin experience as they often lack proper support for hardware acceleration. If you really want to run Jellyfin on an SBC, you may wish to consider models based on the following platforms: Rockchip RK3588 / RK3588S, Intel Core, Intel 12th gen N series - AMD Graphics: AMD Graphics have poor encoder quality and poor driver support. **This applies even on Linux**. - Low-end GPUs: Certain low-end GPUs (e.g. GT1030, RX6400) are not capable of hardware encoding. These models cannot be used for hardware acceleration for a Jellyfin Server. From f660ecea15e1c0b0b13ec25a1392a9b466c28ef3 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Sun, 5 Oct 2025 00:43:56 +0100 Subject: [PATCH 059/190] Update docs/general/administration/hardware-selection.md Co-authored-by: BotBlake --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 35b37d75..d3d96d9f 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -95,7 +95,7 @@ The CPU will be responsible for many tasks, notably: - Transcoding Audio - Decoding video in unsupported codecs -Whilst audio codecs will only utilize a single core, they are very lightweight, most CPUs should be able to handle them without issues. E.g., a Ryzen 5950X transcoding `FLAC -> AAC` runs at ~110x real-time. +Whilst audio codecs will only utilize a single core, they are very lightweight and most CPUs should be able to handle them without issues. (e.g. a Ryzen 5950X transcoding `FLAC -> AAC` runs at ~110x real-time.) Video in unsupported codecs are usually older formats that are easier to decode. Assuming hardware acceleration is properly configured, any modern CPU with 4 threads should be able to handle the workload. From a949cb3fa72492c669de2bfbb46b00dca2d4cbb2 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Sun, 5 Oct 2025 00:44:52 +0100 Subject: [PATCH 060/190] Update docs/general/administration/hardware-selection.md Co-authored-by: BotBlake --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index d3d96d9f..dd99566a 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -248,4 +248,4 @@ The files for Jellyfin itself (i.e., not your media files) will see a lot of ran Networking is for connecting your Jellyfin server to other devices. It is recommended that the Jellyfin Server be connected to your network via Ethernet cable for optimal performance. Wi-Fi or Powerline solutions for a Jellyfin Server are NOT recommended and will result in an especially poor experience. -Jellyfin Server is not designed to be exposed directly to the internet, do NOT accidentally connect your server to ethernet ports marked `DMZ` on your network router. Always check the port label before inserting the cable. +Jellyfin Server is not designed to be exposed directly to the internet. Ensure it remains protected behind a properly configured firewall or other secure network environment. From e603209363dc30456dc7d7bbf97d957303277efe Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Sun, 5 Oct 2025 05:13:02 +0100 Subject: [PATCH 061/190] Update docs/general/administration/hardware-selection.md Co-authored-by: felix920506 --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index dd99566a..8a31b99a 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -95,7 +95,7 @@ The CPU will be responsible for many tasks, notably: - Transcoding Audio - Decoding video in unsupported codecs -Whilst audio codecs will only utilize a single core, they are very lightweight and most CPUs should be able to handle them without issues. (e.g. a Ryzen 5950X transcoding `FLAC -> AAC` runs at ~110x real-time.) +Whilst most audio codecs will only utilize a single core, they are very lightweight and most CPUs should be able to handle them without issues. (e.g. a Ryzen 5950X transcoding `FLAC -> AAC` runs at ~110x real-time.) Video in unsupported codecs are usually older formats that are easier to decode. Assuming hardware acceleration is properly configured, any modern CPU with 4 threads should be able to handle the workload. From adfefd267b0a1286748f27a4cc269c6055db1de2 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Sun, 5 Oct 2025 05:13:17 +0100 Subject: [PATCH 062/190] Update docs/general/administration/hardware-selection.md Co-authored-by: BotBlake --- docs/general/administration/hardware-selection.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/hardware-selection.md b/docs/general/administration/hardware-selection.md index 8a31b99a..cf58d330 100644 --- a/docs/general/administration/hardware-selection.md +++ b/docs/general/administration/hardware-selection.md @@ -5,7 +5,7 @@ title: Hardware Selection # Selecting Appropriate Hardware -The following is intended to help you choose appropriate hardware hardware for a Jellyfin server and take full advantage of its features. E.g., hardware acceleration. +The following is intended to help you choose appropriate hardware for a Jellyfin server and take full advantage of its features (e.g. hardware acceleration). ## Simple Guide From 8852dd2efc4fe2a58e2ef5e3d36f98816ae42a43 Mon Sep 17 00:00:00 2001 From: Nadim Zubidat Date: Mon, 6 Oct 2025 20:48:49 +0000 Subject: [PATCH 063/190] consolidate metadata provider documentation --- .../server/media/_video-metadata-providers.md | 18 ++++------ docs/general/server/media/movies.md | 4 +-- docs/general/server/media/shows.md | 4 +-- docs/general/server/metadata/identifiers.md | 24 ++++++++----- package-lock.json | 35 +------------------ 5 files changed, 28 insertions(+), 57 deletions(-) diff --git a/docs/general/server/media/_video-metadata-providers.md b/docs/general/server/media/_video-metadata-providers.md index 13c287e7..ea602fd0 100644 --- a/docs/general/server/media/_video-metadata-providers.md +++ b/docs/general/server/media/_video-metadata-providers.md @@ -2,16 +2,12 @@ ### Metadata providers -Jellyfin fetches information about the media automatically from external metadata providers. The following metadata providers are supported: +Jellyfin fetches information about the media automatically from external metadata providers. +Movies and shows can be named with a metadata provider ID to improve matching. -- [TheMovieDB (TMDB)](https://www.themoviedb.org/) -- [TheTVDB (TVDB)](https://www.thetvdb.com/) (Shows Only) -- [OMDb API (OMDB)](https://www.omdbapi.com/) (English Only) +```txt +Movie Name (year) [metadata provider id] +Series Name (year) [metadata provider id] +``` -Movies and show series can be named with a metadata provider ID to improve matching. They can be added to a file name in the following format: - -- `[imdbid-tt12345678]` -- `[tmdbid-12345]` -- `[tvdbid-67890]` - -Multiple IDs can be added in the same file / folder. e.g. `Jellyfin Documentary [imdbid-tt00000000] [tmdbid-00000].mkv` +Read more about it in the [metadata provider identifiers section](/docs/general/server/metadata/identifiers.md). diff --git a/docs/general/server/media/movies.md b/docs/general/server/media/movies.md index cdf72aff..57e7cd9a 100644 --- a/docs/general/server/media/movies.md +++ b/docs/general/server/media/movies.md @@ -41,10 +41,10 @@ Movies The folder containing the movie should be named in the following format: ```txt -Movie Name (year) [external id] +Movie Name (year) [metadata provider id] ``` -The `year` and `external id` fields are optional, but they will help identify media more reliably. +The `year` and `metadata provider id` fields are optional, but they will help identify media more reliably. The video files within the folder should have the same name as the folder. I.e. if the folder is named `Super Fun Movie`, the video file within should be named `Super Fun Movie.mp4` (or any other extension), optionally with tags defined below. diff --git a/docs/general/server/media/shows.md b/docs/general/server/media/shows.md index 1b9b69b8..b7bb3046 100644 --- a/docs/general/server/media/shows.md +++ b/docs/general/server/media/shows.md @@ -47,10 +47,10 @@ Each video file may contain multiple episodes. However, they will be shown as a The series folder should be named in the following format: ```txt -Series Name (year) [external id] +Series Name (year) [metadata provider id] ``` -The `year` and `external id` fields are optional, but they will help identify media more reliably. +The `year` and `metadata provider id` fields are optional, but they will help identify media more reliably. - Example with name only: `Jellyfin Documentary.mkv` - Example with year: `Jellyfin Documentary (2030)` diff --git a/docs/general/server/metadata/identifiers.md b/docs/general/server/metadata/identifiers.md index aaf40756..6dec4af2 100644 --- a/docs/general/server/metadata/identifiers.md +++ b/docs/general/server/metadata/identifiers.md @@ -23,6 +23,14 @@ Shows └── Series Name B S02E03.mkv ``` +## Supported Metadata Providers + +The following metadata providers are supported: + +- [The Movie DB (TMDB)](https://www.themoviedb.org/) +- [The TV Database (TVDB)](https://www.thetvdb.com/) (Shows Only) +- [OMDb API (OMDB)](https://www.omdbapi.com/) (English Only) + ## Finding Metadata Provider Identifiers Below are instructions on how to find metadata provider identifiers for each supported provider. @@ -35,14 +43,6 @@ URL: `https://www.themoviedb.org/movie/569094-spider-man-across-the-spider-verse Identifier: `[tmdbid-569094]` -### Internet Movie Database (IMDB) - -The identifier is found in the URL of the title. For example: - -URL: `https://www.imdb.com/title/tt9362722/` - -Identifier: `[imdbid-tt9362722]` - ### The TV Database (TVDB) The identifier is found on the main page of the title. For example: @@ -50,3 +50,11 @@ The identifier is found on the main page of the title. For example: ![How to find The TVDB media identifier](/images/docs/tvdb-media-identifier-example.png) Identifier: `[tvdbid-266189]` + +### OMDb API (OMDB) + +OMDB provider uses Internet Movie Database (IMDB) IDs as identifiers. The identifier is found in the URL of the title. For example: + +URL: `https://www.imdb.com/title/tt9362722/` + +Identifier: `[imdbid-tt9362722]` diff --git a/package-lock.json b/package-lock.json index 16988e42..8c08ebd4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -120,7 +120,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -1955,7 +1954,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -1978,7 +1976,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -2088,7 +2085,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -2510,7 +2506,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3152,7 +3147,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.1.tgz", "integrity": "sha512-FWDk1LIGD5UR5Zmm9rCrXRoxZUgbwuP6FBA7rc50DVfzqDOMkeMe3NyJhOsA2dF0zBE3VbHEIMmTjKwTZJwbaA==", "license": "MIT", - "peer": true, "dependencies": { "@docusaurus/babel": "3.9.1", "@docusaurus/bundler": "3.9.1", @@ -3358,7 +3352,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.1.tgz", "integrity": "sha512-DyLk9BIA6I9gPIuia8XIL+XIEbNnExam6AHzRsfrEq4zJr7k/DsWW7oi4aJMepDnL7jMRhpVcdsCxdjb0/A9xg==", "license": "MIT", - "peer": true, "dependencies": { "@docusaurus/core": "3.9.1", "@docusaurus/logger": "3.9.1", @@ -3502,7 +3495,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.1.tgz", "integrity": "sha512-j9adi961F+6Ps9d0jcb5BokMcbjXAAJqKkV43eo8nh4YgmDj7KUNDX4EnOh/MjTQeO06oPY5cxp3yUXdW/8Ggw==", "license": "MIT", - "peer": true, "dependencies": { "@docusaurus/mdx-loader": "3.9.1", "@docusaurus/module-type-aliases": "3.9.1", @@ -4360,7 +4352,6 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", - "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -5254,7 +5245,6 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -5922,7 +5912,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.24.tgz", "integrity": "sha512-0dLEBsA1kI3OezMBF8nSsb7Nk19ZnsyE1LLhB8r27KbgU5H4pvuqZLdtE+aUkJVoXgTVuA+iLIwmZ0TuK4tx6A==", "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -6116,7 +6105,6 @@ "integrity": "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.44.1", "@typescript-eslint/types": "8.44.1", @@ -6541,7 +6529,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -6609,7 +6596,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -7335,7 +7321,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", @@ -7635,7 +7620,6 @@ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", @@ -8353,7 +8337,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -8673,7 +8656,6 @@ "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10" } @@ -9083,7 +9065,6 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -10095,7 +10076,6 @@ "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -10173,7 +10153,6 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", - "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -17380,7 +17359,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -18324,7 +18302,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -18878,7 +18855,6 @@ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -19195,7 +19171,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -19208,7 +19183,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -19253,7 +19227,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/react": "*" }, @@ -19282,7 +19255,6 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -20114,7 +20086,6 @@ "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz", "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==", "license": "MIT", - "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -20243,7 +20214,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -21644,8 +21614,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", @@ -21799,7 +21768,6 @@ "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -22526,7 +22494,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.0.tgz", "integrity": "sha512-hUtqAR3ZLVEYDEABdBioQCIqSoguHbFn1K7WlPPWSuXmx0031BD73PSE35jKyftdSh4YLDoQNgK4pqBt5Q82MA==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", From fd3b00779166967e408f0274ccd060631b7779e8 Mon Sep 17 00:00:00 2001 From: Nadim Zubidat Date: Tue, 7 Oct 2025 06:12:30 +0000 Subject: [PATCH 064/190] Use metadata provider id instead of external id for consistancy --- docs/general/server/media/movies.md | 4 ++-- docs/general/server/media/shows.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/general/server/media/movies.md b/docs/general/server/media/movies.md index 57e7cd9a..266c32c2 100644 --- a/docs/general/server/media/movies.md +++ b/docs/general/server/media/movies.md @@ -50,8 +50,8 @@ The video files within the folder should have the same name as the folder. I.e. - Example with name only: `Jellyfin Documentary.mkv` - Example with year: `Jellyfin Documentary (2030).mkv` -- Example with external id: `Jellyfin Documentary [imdbid-tt00000000].mkv` -- Example with both year and external id: `Jellyfin Documentary (2030) [imdbid-tt00000000].mkv` +- Example with metadata provider id: `Jellyfin Documentary [imdbid-tt00000000].mkv` +- Example with both year and metadata provider id: `Jellyfin Documentary (2030) [imdbid-tt00000000].mkv` import VideoMetadataProviders from './\_video-metadata-providers.md'; diff --git a/docs/general/server/media/shows.md b/docs/general/server/media/shows.md index b7bb3046..c821edb1 100644 --- a/docs/general/server/media/shows.md +++ b/docs/general/server/media/shows.md @@ -54,8 +54,8 @@ The `year` and `metadata provider id` fields are optional, but they will help id - Example with name only: `Jellyfin Documentary.mkv` - Example with year: `Jellyfin Documentary (2030)` -- Example with external id: `Jellyfin Documentary [imdbid-tt00000000]` -- Example with both year and external id: `Jellyfin Documentary (2030) [imdbid-tt00000000]` +- Example with metadata provider id: `Jellyfin Documentary [imdbid-tt00000000]` +- Example with both year and metadata provider id: `Jellyfin Documentary (2030) [imdbid-tt00000000]` The Season folders should be named `Season *`, with `*` being any number. For the best results, please pad the season number with `0`s at the front to make sure each entry has the same number of digits. For example: `Season 5` -> `Season 05`. From 3dc1819128d654e6e8668942c3c7f74e23847984 Mon Sep 17 00:00:00 2001 From: Nadim Zubidat Date: Tue, 7 Oct 2025 19:34:58 +0000 Subject: [PATCH 065/190] Revert package-lock.json changes --- package-lock.json | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 8c08ebd4..16988e42 100644 --- a/package-lock.json +++ b/package-lock.json @@ -120,6 +120,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -1954,6 +1955,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -1976,6 +1978,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -2085,6 +2088,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -2506,6 +2510,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3147,6 +3152,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.1.tgz", "integrity": "sha512-FWDk1LIGD5UR5Zmm9rCrXRoxZUgbwuP6FBA7rc50DVfzqDOMkeMe3NyJhOsA2dF0zBE3VbHEIMmTjKwTZJwbaA==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/babel": "3.9.1", "@docusaurus/bundler": "3.9.1", @@ -3352,6 +3358,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.1.tgz", "integrity": "sha512-DyLk9BIA6I9gPIuia8XIL+XIEbNnExam6AHzRsfrEq4zJr7k/DsWW7oi4aJMepDnL7jMRhpVcdsCxdjb0/A9xg==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/core": "3.9.1", "@docusaurus/logger": "3.9.1", @@ -3495,6 +3502,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.1.tgz", "integrity": "sha512-j9adi961F+6Ps9d0jcb5BokMcbjXAAJqKkV43eo8nh4YgmDj7KUNDX4EnOh/MjTQeO06oPY5cxp3yUXdW/8Ggw==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/mdx-loader": "3.9.1", "@docusaurus/module-type-aliases": "3.9.1", @@ -4352,6 +4360,7 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", + "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -5245,6 +5254,7 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -5912,6 +5922,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.24.tgz", "integrity": "sha512-0dLEBsA1kI3OezMBF8nSsb7Nk19ZnsyE1LLhB8r27KbgU5H4pvuqZLdtE+aUkJVoXgTVuA+iLIwmZ0TuK4tx6A==", "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -6105,6 +6116,7 @@ "integrity": "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.44.1", "@typescript-eslint/types": "8.44.1", @@ -6529,6 +6541,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -6596,6 +6609,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -7321,6 +7335,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", @@ -7620,6 +7635,7 @@ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", @@ -8337,6 +8353,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -8656,6 +8673,7 @@ "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10" } @@ -9065,6 +9083,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -10076,6 +10095,7 @@ "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -10153,6 +10173,7 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", + "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -17359,6 +17380,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -18302,6 +18324,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -18855,6 +18878,7 @@ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -19171,6 +19195,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -19183,6 +19208,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -19227,6 +19253,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/react": "*" }, @@ -19255,6 +19282,7 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -20086,6 +20114,7 @@ "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz", "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==", "license": "MIT", + "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -20214,6 +20243,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -21614,7 +21644,8 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/type-check": { "version": "0.4.0", @@ -21768,6 +21799,7 @@ "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -22494,6 +22526,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.0.tgz", "integrity": "sha512-hUtqAR3ZLVEYDEABdBioQCIqSoguHbFn1K7WlPPWSuXmx0031BD73PSE35jKyftdSh4YLDoQNgK4pqBt5Q82MA==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", From 06b6a9d87d2e8c85c8a3c6cb3bc4c9d9e841475a Mon Sep 17 00:00:00 2001 From: nadimz Date: Tue, 7 Oct 2025 21:35:56 +0200 Subject: [PATCH 066/190] Update docs/general/server/media/_video-metadata-providers.md Co-authored-by: felix920506 --- docs/general/server/media/_video-metadata-providers.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/general/server/media/_video-metadata-providers.md b/docs/general/server/media/_video-metadata-providers.md index ea602fd0..4bbc7d05 100644 --- a/docs/general/server/media/_video-metadata-providers.md +++ b/docs/general/server/media/_video-metadata-providers.md @@ -2,7 +2,8 @@ ### Metadata providers -Jellyfin fetches information about the media automatically from external metadata providers. +Jellyfin fetches information about the media automatically from external metadata providers for most types of content. +Movies and shows can be named with a metadata provider ID to improve matching. Movies and shows can be named with a metadata provider ID to improve matching. ```txt From 5de8d6377c3712ff24635c05fa24d4efc84df7d1 Mon Sep 17 00:00:00 2001 From: felix920506 Date: Thu, 23 Oct 2025 14:51:03 +0800 Subject: [PATCH 067/190] add troubleshooting info about db locked on lxc --- docs/general/administration/troubleshooting.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/general/administration/troubleshooting.md b/docs/general/administration/troubleshooting.md index add962bd..02ffc95c 100644 --- a/docs/general/administration/troubleshooting.md +++ b/docs/general/administration/troubleshooting.md @@ -240,3 +240,7 @@ Stop your Jellyin server and navigate to its config directory. There are a lot o ``` then start your jellyfin instance again. If this still does not help with the issues, you can try setting the `LockingBehavior` to `Pessimistic` instead but this comes with a significant performance impact so it is only recommended when `Optimistic` does not help with the issues. + +### LXC specific issues + +It has been brought to the team's attention that there are issues with LXC specifically. If you are getting such errors on LXC after setting lock mode to `Optimistic`, it is recommended that you migrate to full virtualization (virtual machines) or Docker. There is unlikely to be a solution for LXC any time soon, and we will be unable to provide any support for database locked problems on LXC. From 817d372961d36d2f9581d59155d561490798b10a Mon Sep 17 00:00:00 2001 From: felix920506 Date: Fri, 24 Oct 2025 10:12:56 +0800 Subject: [PATCH 068/190] use hackmd instead of framapad --- docs/general/contributing/documentation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/general/contributing/documentation.md b/docs/general/contributing/documentation.md index 0bd74ade..4a34a74b 100644 --- a/docs/general/contributing/documentation.md +++ b/docs/general/contributing/documentation.md @@ -11,11 +11,11 @@ Documentation is fast-moving and ever-changing. Please think carefully about wha ## Please Self-Review -Before finalizing your changes, please be courteous to reviewers and run your changes through, at least, a spellchecker (e.g. `apsell`) and potentially a grammar checker. AI is fine for this though please use it sparingly for *generating* content. Make sure you re-read what comes out and adjust as required. We appreciate individual writing styles but the bulk of our review back-and-forth is over minor issues like this, so please do your part to get it right first. +Before finalizing your changes, please be courteous to reviewers and run your changes through, at least, a spellchecker (e.g. `apsell`) and potentially a grammar checker. AI is fine for this though please use it sparingly for _generating_ content. Make sure you re-read what comes out and adjust as required. We appreciate individual writing styles but the bulk of our review back-and-forth is over minor issues like this, so please do your part to get it right first. ## Peer Copyediting -For very large changes, we encourage the idea of peer copyediting. Instead of submitting a massive PR and then having back-and-forth line-by-line editing in there, we suggest placing your new/updated doc in a collaborative document editor such as [Framapad](https://framapad.org/abc/en/) and sharing it in our [documentation Matrix room](/contact). You can then, between chat and the collaborative editor, obtain a line-by-line copyedit for spelling, grammar, and formatting, without back-and-forth in the PR. Once both sides are happy with the changes, a pull request can then be submitted. +For very large changes, we encourage the idea of peer copyediting. Instead of submitting a massive PR and then having back-and-forth line-by-line editing in there, we suggest placing your new/updated doc in a collaborative document editor such as [HackMD](https://hackmd.io) and sharing it in our [documentation Matrix room](/contact). You can then, between chat and the collaborative editor, obtain a line-by-line copyedit for spelling, grammar, and formatting, without back-and-forth in the PR. Once both sides are happy with the changes, a pull request can then be submitted. While this does seem like "more work", for substantial changes this should ideally be a small part of the entire process, and will help ensure that final reviews go more smoothly. From 6159894f02ba5b5a5ea2ffd2af2c4a8480a4b237 Mon Sep 17 00:00:00 2001 From: Greg Grossmeier Date: Fri, 24 Oct 2025 11:12:01 -0700 Subject: [PATCH 069/190] Keep the built-in vs manual distinction for restores The original formatting had two different restore sections: one under the built-in backup section and one as a top-level section (on this page). This proposed (minor) edit puts the second one as a sub-section of the manual backup section. This, I believe, better aligns with the intent of the author or at least keeps the consistency across the two backup methods documented. --- docs/general/administration/backup-and-restore.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/general/administration/backup-and-restore.md b/docs/general/administration/backup-and-restore.md index 04b2f1c7..042558ee 100644 --- a/docs/general/administration/backup-and-restore.md +++ b/docs/general/administration/backup-and-restore.md @@ -50,7 +50,7 @@ The Backup folder is located within your Jellyfin data directory which is locate After clicking on the `Create` button all data will be written into a new zip archive. -### Restore from Backup +### Restore from Built-in Backup To restore from a Backup you can either use the webUI by navigating to the same view as for the step above and clicking on the restore button in the list of backups, or you can start jellyfin with the `--restore-archive PATH_TO_BACKUP_ZIP` argument. Note that when you start a restore from the webUI, you server will immediately restart for this process to take place and will be unavailable for that time. @@ -94,7 +94,7 @@ Taking a manual Backup essentially involves you copying all the data jellyfin re 3. Start up Jellyfin again, either after upgrading or on the current version. You now have a safe copy of your data in the path chosen in step 2. -## Restoring a Backup +### Restoring a Manual Backup This process assumes you followed the steps above to take the backup. From 03b0d548f6c310a97f22eaf300e1bde5d9953688 Mon Sep 17 00:00:00 2001 From: mhgrrrl <65903082+wnhre2ur8cxx8@users.noreply.github.com> Date: Mon, 27 Oct 2025 11:48:06 +0100 Subject: [PATCH 070/190] fix(docs-nginx): add missing apikey map --- docs/general/post-install/networking/8_reverse-proxy/nginx.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/general/post-install/networking/8_reverse-proxy/nginx.md b/docs/general/post-install/networking/8_reverse-proxy/nginx.md index a82ccda6..330fe5fe 100644 --- a/docs/general/post-install/networking/8_reverse-proxy/nginx.md +++ b/docs/general/post-install/networking/8_reverse-proxy/nginx.md @@ -94,7 +94,7 @@ server { ### Censor sensitive information in logs -This censors any 'api_key' URL parameter from the logfile. +This censors any 'api_key' or 'ApiKey' URL parameter from the logfile. ```conf #Must be in HTTP block @@ -105,6 +105,7 @@ log_format stripsecrets '$remote_addr $host - $remote_user [$time_local] ' map $request $secretfilter { ~*^(?.*[\?&]api_key=)([^&]*)(?.*)$ "${prefix1}***$suffix1"; + ~*^(?.*[\?&]ApiKey=)([^&]*)(?.*)$ "${prefix1}***$suffix1"; default $request; } From 427d8b8ca8fc7b011e3ba6d69252385c1d02961b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 28 Oct 2025 23:03:00 +0000 Subject: [PATCH 071/190] Update dependency swiper to v12.0.3 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index b9a59b96..6598a63e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "react": "18.3.1", "react-dom": "18.3.1", "sass": "1.93.2", - "swiper": "12.0.2", + "swiper": "12.0.3", "ua-parser-js": "2.0.6", "url-loader": "4.1.1" }, @@ -21309,9 +21309,9 @@ } }, "node_modules/swiper": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/swiper/-/swiper-12.0.2.tgz", - "integrity": "sha512-y8F6fDGXmTVVgwqJj6I00l4FdGuhpFJn0U/9Ucn1MwWOw3NdLV8aH88pZOjyhBgU/6PyBlUx+JuAQ5KMWz906Q==", + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-12.0.3.tgz", + "integrity": "sha512-BHd6U1VPEIksrXlyXjMmRWO0onmdNPaTAFduzqR3pgjvi7KfmUCAm/0cj49u2D7B0zNjMw02TSeXfinC1hDCXg==", "funding": [ { "type": "patreon", diff --git a/package.json b/package.json index 472c51af..450b9f0f 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "react": "18.3.1", "react-dom": "18.3.1", "sass": "1.93.2", - "swiper": "12.0.2", + "swiper": "12.0.3", "ua-parser-js": "2.0.6", "url-loader": "4.1.1" }, From d66b4c37d443318ea23527db5b014fe3d0921599 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 8 Nov 2025 06:49:18 +0000 Subject: [PATCH 072/190] Update dependency globals to v16.5.0 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index b9a59b96..eeeb7605 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,7 +51,7 @@ "eslint-plugin-promise": "7.2.1", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "5.2.0", - "globals": "16.4.0", + "globals": "16.5.0", "node-fetch": "3.3.2", "prettier": "3.6.2", "typescript": "5.9.3", @@ -11577,9 +11577,9 @@ } }, "node_modules/globals": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", - "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 472c51af..6d17f263 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "eslint-plugin-promise": "7.2.1", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "5.2.0", - "globals": "16.4.0", + "globals": "16.5.0", "node-fetch": "3.3.2", "prettier": "3.6.2", "typescript": "5.9.3", From 5d79029b2b93e4ea228fab550b7e3f3a7001553f Mon Sep 17 00:00:00 2001 From: "Joshua M. Boniface" Date: Sun, 9 Nov 2025 22:58:10 -0500 Subject: [PATCH 073/190] Update documentation around .ignore files Reflect the changes in jellyfin/jellyfin#13906. Fixes #1649 --- .../server/media/excluding-directory.md | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/docs/general/server/media/excluding-directory.md b/docs/general/server/media/excluding-directory.md index 5b67863d..70a75de7 100644 --- a/docs/general/server/media/excluding-directory.md +++ b/docs/general/server/media/excluding-directory.md @@ -1,18 +1,22 @@ --- uid: server-media-excluding-directory -title: Excluding a directory +title: Excluding files and directories --- -# Excluding a directory +# Excluding files and directory -Directories, and their respective media files, can be excluded from the library scan. This can be achieved by placing a `.ignore` file in the directory you want to exclude. As a result, the directory, and it's subdirectories, will be excluded from being scanned and shown to the end user. +Directories and files can be set for exclusion from Jellyfin media library scans, permitting you to include non-tracked files and directories within your media library. This is done by using `.ignore` (dot-ignore) files within your media library directories. :::tip -When placing a `.ignore` file inside a directory, make sure to refresh/ rescan the metadata afterwards for it to be applied. +When creating a `.ignore` file, ensure that you refresh/rescan the library afterwards for it to be applied. ::: +## Excluding whole directories + +To exclude an entire directory, place an **empty** file named `.ignore` inside the directory. This directory, and all files and subdirectories within it, will be excluded. + The example given below results in the directories `Season 03` and `OST` being ignored: ```txt @@ -29,3 +33,27 @@ Shows ├── .ignore └── ... ``` + +## Excluding specific files or subdirectories + +When a `.ignore` file is **not empty**, it is treated as a list of file/directory matches using the [same format as a Git `.gitignore` file](https://git-scm.com/docs/gitignore#_pattern_format). + +:::caution + +This is a new feature in Jellyfin 10.11.x and later; older versions did not care about the contents of `.ignore` files. Legacy non-empty `.ignore` files must be manually corrected or they will stop functioning as expected. + +::: + +For example, a `.ignore` containing the following: + +```txt +*.avi +sample.mkv +specials/ +``` + +Will trigger Jellyfin to ignore: + +* any file that ends with `.avi`. +* any file named exactly `sample.mkv`. +* the subdirectory `specials` and all files under it. From 4068bc6a1474df17531731edd0bdf91e82005a21 Mon Sep 17 00:00:00 2001 From: "Joshua M. Boniface" Date: Sun, 9 Nov 2025 23:02:44 -0500 Subject: [PATCH 074/190] Add "or updating" to refresh note --- docs/general/server/media/excluding-directory.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/server/media/excluding-directory.md b/docs/general/server/media/excluding-directory.md index 70a75de7..57401f8c 100644 --- a/docs/general/server/media/excluding-directory.md +++ b/docs/general/server/media/excluding-directory.md @@ -9,7 +9,7 @@ Directories and files can be set for exclusion from Jellyfin media library scans :::tip -When creating a `.ignore` file, ensure that you refresh/rescan the library afterwards for it to be applied. +When creating or updating a `.ignore` file, ensure that you refresh/rescan the library afterwards for it to be applied. ::: From 77daaf44be65e7acfc29b0ccb795a9460be3f31d Mon Sep 17 00:00:00 2001 From: "Joshua M. Boniface" Date: Sun, 9 Nov 2025 23:07:44 -0500 Subject: [PATCH 075/190] Fix title and use consistent capitalization Matches the other categories in the sidebar. --- docs/general/server/media/excluding-directory.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/general/server/media/excluding-directory.md b/docs/general/server/media/excluding-directory.md index 57401f8c..b21d833e 100644 --- a/docs/general/server/media/excluding-directory.md +++ b/docs/general/server/media/excluding-directory.md @@ -1,9 +1,9 @@ --- uid: server-media-excluding-directory -title: Excluding files and directories +title: Excluding Files and Directories --- -# Excluding files and directory +# Excluding Files and Directories Directories and files can be set for exclusion from Jellyfin media library scans, permitting you to include non-tracked files and directories within your media library. This is done by using `.ignore` (dot-ignore) files within your media library directories. From 1babae09d7f686223fd3ca5911da7724f4cb3f8f Mon Sep 17 00:00:00 2001 From: "Joshua M. Boniface" Date: Sun, 9 Nov 2025 23:09:03 -0500 Subject: [PATCH 076/190] Tweak wording slightly --- docs/general/server/media/excluding-directory.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/server/media/excluding-directory.md b/docs/general/server/media/excluding-directory.md index b21d833e..f94b8057 100644 --- a/docs/general/server/media/excluding-directory.md +++ b/docs/general/server/media/excluding-directory.md @@ -36,7 +36,7 @@ Shows ## Excluding specific files or subdirectories -When a `.ignore` file is **not empty**, it is treated as a list of file/directory matches using the [same format as a Git `.gitignore` file](https://git-scm.com/docs/gitignore#_pattern_format). +When a `.ignore` file is **not empty**, it is treated as a list of items to ignore using the [same format as a Git `.gitignore` file](https://git-scm.com/docs/gitignore#_pattern_format). :::caution From 21d91cc97e41d23e7f4d8d841de71078b0bc8270 Mon Sep 17 00:00:00 2001 From: Allegra Date: Thu, 13 Nov 2025 02:23:40 -0500 Subject: [PATCH 077/190] update backup folder locations for confirmed incorrect platforms --- .../administration/backup-and-restore.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/general/administration/backup-and-restore.md b/docs/general/administration/backup-and-restore.md index 04b2f1c7..3c285d9b 100644 --- a/docs/general/administration/backup-and-restore.md +++ b/docs/general/administration/backup-and-restore.md @@ -34,19 +34,19 @@ To take a new Backup, enter the Jellyfin Dashboard, open the `Backups` tab and c - Trickplay. All trickplay data that is stored not alongside media. The Backup system will check for at least 4GB of free space in the backup folder where backups a written to. However this can easily not be enough if you also backup Subtitles and Trickplay so ensure you have enough free space there. -The Backup folder is located within your Jellyfin data directory which is located in: +The Backup folder is located within your Jellyfin data directory, namely: -- Official Docker: Wherever your `/data` volume are sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. -- LinuxServer.io Docker: Data are wherever your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. -- Debian/Ubuntu packages: `/var/lib/jellyfin/backups`. -- RPMFusion Fedora/CentOS packages: Data is in `/var/lib/jellyfin/backups`. +- Official Docker: `/config/data/backups` where `` is where your `config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. +- LinuxServer.io Docker: `/config/data/data/backups` where `` is where your `config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. +- Debian/Ubuntu packages: `/var/lib/jellyfin/data/backups`. +- RPMFusion Fedora/CentOS packages: `/var/lib/jellyfin/backups`. - Windows User Install: `%LOCALAPPDATA%\Jellyfin\data\backups` (`C:\Users\\AppData\Local\Jellyfin\data\backups`) - Windows Service Install: `%PROGRAMDATA%\Jellyfin\Server\data\backups` (`C:\ProgramData\Jellyfin\Server\data\backups`) - MacOS Installer (.dmg): Data is stored in one of these paths; back up whichever one(s) exist: `~/.config/jellyfin/backups`, `~/.local/share/jellyfin/backups`, `~/Library/Application Support/Jellyfin/backups`: - - Portable Installs: - - Linux: Data is stored in `~/.local/share/jellyfin/backups`. - - Windows: Data and config is in `C:\Users\\AppData\Local\Jellyfin\backups`, using `%LOCALAPPDATA%`. - - MacOS: Data is stored in these paths; back up whichever one(s) exist: `~/.config/jellyfin/backups`, `~/.local/share/jellyfin/backups`, `~/Library/Application Support/Jellyfin/backups`. +- Portable Installs: + - Linux: Data is stored in `~/.local/share/jellyfin/data/backups`. + - Windows: Data and config is in `C:\Users\\AppData\Local\jellyfin\data\backups`, using `%LOCALAPPDATA%`. + - MacOS: Data is stored in these paths; back up whichever one(s) exist: `~/.config/jellyfin/backups`, `~/.local/share/jellyfin/backups`, `~/Library/Application Support/Jellyfin/backups`. After clicking on the `Create` button all data will be written into a new zip archive. From 568a9b2d1fd6c6032c10a71c403499b3e1f116eb Mon Sep 17 00:00:00 2001 From: Allegra Date: Thu, 13 Nov 2025 02:34:02 -0500 Subject: [PATCH 078/190] fix manual backup instructions for docker --- docs/general/administration/backup-and-restore.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/general/administration/backup-and-restore.md b/docs/general/administration/backup-and-restore.md index 3c285d9b..3e4d59b2 100644 --- a/docs/general/administration/backup-and-restore.md +++ b/docs/general/administration/backup-and-restore.md @@ -36,8 +36,8 @@ To take a new Backup, enter the Jellyfin Dashboard, open the `Backups` tab and c The Backup system will check for at least 4GB of free space in the backup folder where backups a written to. However this can easily not be enough if you also backup Subtitles and Trickplay so ensure you have enough free space there. The Backup folder is located within your Jellyfin data directory, namely: -- Official Docker: `/config/data/backups` where `` is where your `config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. -- LinuxServer.io Docker: `/config/data/data/backups` where `` is where your `config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. +- Official Docker: `/config/data/backups` where `` is where your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. +- LinuxServer.io Docker: `/config/data/data/backups` where `` is where your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. - Debian/Ubuntu packages: `/var/lib/jellyfin/data/backups`. - RPMFusion Fedora/CentOS packages: `/var/lib/jellyfin/backups`. - Windows User Install: `%LOCALAPPDATA%\Jellyfin\data\backups` (`C:\Users\\AppData\Local\Jellyfin\data\backups`) @@ -71,8 +71,8 @@ Taking a manual Backup essentially involves you copying all the data jellyfin re 2. Copy your data and configuration directories to a destination of your choice. What you name the copies is up to you; personally, I like to use dated and versioned directory names e.g. `jellyfin.2024-05-01_10.8.13`. Where these files are also depends on the platform; generally these follow the [XDG Directory Specification](https://specifications.freedesktop.org/basedir-spec/latest/) for platforms that support it. For more information see [the configuration documentation](/docs/general/administration/configuration/#server-paths). **NOTE**: These are default locations; if you've changed your data or config paths, use those instead. - - Official Docker: Wherever your `/data` and `/config` volumes are sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. - - LinuxServer.io Docker: Data and config are wherever your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. + - Official Docker: Wherever your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. + - LinuxServer.io Docker: Wherever your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. - Debian/Ubuntu packages: Data is in `/var/lib/jellyfin` and config is in `/etc/jellyfin`; these are defined in `/etc/default/jellyfin`. - RPMFusion Fedora/CentOS packages: Data is in `/var/lib/jellyfin` and config is in `/etc/jellyfin`; these are defined in `/etc/sysconfig/jellyfin`. - Windows Tray/Installer (.exe): Data and config is in `%PROGRAMDATA%\Jellyfin\Server` (`C:\ProgramData\Jellyfin\Server`) or `%LOCALAPPDATA%\Jellyfin` (`C:\Users\\AppData\Local\Jellyfin`). From ab5c2aab6d579b12bed2332edd97b8df95865b8e Mon Sep 17 00:00:00 2001 From: Allegra Date: Thu, 13 Nov 2025 04:31:23 -0500 Subject: [PATCH 079/190] update old link --- docs/general/administration/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/configuration.md b/docs/general/administration/configuration.md index a45b3da4..6d57e236 100644 --- a/docs/general/administration/configuration.md +++ b/docs/general/administration/configuration.md @@ -19,7 +19,7 @@ Documentation for the available command line options can be obtained by adding t ## Server Paths -The file paths used by the server are determined according to the rules outlined below. In general, the [XDG specification](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html) is followed by default for non-Windows systems. +The file paths used by the server are determined according to the rules outlined below. In general, the [XDG specification](https://specifications.freedesktop.org/basedir-spec/latest/) is followed by default for non-Windows systems. ### Data Directory From 5f56075310485bcad7eba5e9c88a0141b856fd0b Mon Sep 17 00:00:00 2001 From: Allegra Date: Thu, 13 Nov 2025 06:01:08 -0500 Subject: [PATCH 080/190] update manual backup instructions for clarity and consistency --- docs/general/administration/backup-and-restore.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/general/administration/backup-and-restore.md b/docs/general/administration/backup-and-restore.md index 3e4d59b2..396247f9 100644 --- a/docs/general/administration/backup-and-restore.md +++ b/docs/general/administration/backup-and-restore.md @@ -71,15 +71,15 @@ Taking a manual Backup essentially involves you copying all the data jellyfin re 2. Copy your data and configuration directories to a destination of your choice. What you name the copies is up to you; personally, I like to use dated and versioned directory names e.g. `jellyfin.2024-05-01_10.8.13`. Where these files are also depends on the platform; generally these follow the [XDG Directory Specification](https://specifications.freedesktop.org/basedir-spec/latest/) for platforms that support it. For more information see [the configuration documentation](/docs/general/administration/configuration/#server-paths). **NOTE**: These are default locations; if you've changed your data or config paths, use those instead. - - Official Docker: Wherever your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. - - LinuxServer.io Docker: Wherever your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. - - Debian/Ubuntu packages: Data is in `/var/lib/jellyfin` and config is in `/etc/jellyfin`; these are defined in `/etc/default/jellyfin`. - - RPMFusion Fedora/CentOS packages: Data is in `/var/lib/jellyfin` and config is in `/etc/jellyfin`; these are defined in `/etc/sysconfig/jellyfin`. - - Windows Tray/Installer (.exe): Data and config is in `%PROGRAMDATA%\Jellyfin\Server` (`C:\ProgramData\Jellyfin\Server`) or `%LOCALAPPDATA%\Jellyfin` (`C:\Users\\AppData\Local\Jellyfin`). + - Official Docker: The data directory is wherever your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. This directory contains the config directory as well. + - LinuxServer.io Docker: The config directory is wherever your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. This directory contains the data directory as well. + - Debian/Ubuntu packages: The data directory is `/var/lib/jellyfin` and the config directory is `/etc/jellyfin`; these are defined in `/etc/default/jellyfin`. + - RPMFusion Fedora/CentOS packages: The data directory is `/var/lib/jellyfin` and the config directory is `/etc/jellyfin`; these are defined in `/etc/sysconfig/jellyfin`. + - Windows Tray/Installer (.exe): The data directory is `%PROGRAMDATA%\Jellyfin\Server` (`C:\ProgramData\Jellyfin\Server`) or `%LOCALAPPDATA%\Jellyfin` (`C:\Users\\AppData\Local\Jellyfin`). This directory contains the config directory as well. - MacOS Installer (.dmg): Data is stored in one of these paths; back up whichever one(s) exist: `~/.config/jellyfin/`, `~/.local/share/jellyfin/`, `~/Library/Application Support/Jellyfin/`. - Portable Installs: - - Linux: Data is stored in `~/.local/share/jellyfin` and config in `~/.local/share/jellyfin`. - - Windows: Data and config is in `C:\Users\\AppData\Local\Jellyfin`, using `%LOCALAPPDATA%`. + - Linux: The data and config directories are both `~/.local/share/jellyfin`. + - Windows: The data directory is `%LOCALAPPDATA%\jellyfin` (`C:\Users\\AppData\Local\jellyfin`). This directory contains the config directory as well. - MacOS: Data is stored in these paths; back up whichever one(s) exist: `~/.config/jellyfin/`, `~/.local/share/jellyfin/`, `~/Library/Application Support/Jellyfin/`. As an example, on Debian, you can do this with these commands to make a copy of both directories into a single target directory: From 1b02baff63f12d926aa7ee29afdcd7f834726609 Mon Sep 17 00:00:00 2001 From: Allegra Date: Thu, 13 Nov 2025 06:03:59 -0500 Subject: [PATCH 081/190] fix pre-existing typos --- docs/general/administration/backup-and-restore.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/general/administration/backup-and-restore.md b/docs/general/administration/backup-and-restore.md index 396247f9..30e1930d 100644 --- a/docs/general/administration/backup-and-restore.md +++ b/docs/general/administration/backup-and-restore.md @@ -52,7 +52,7 @@ After clicking on the `Create` button all data will be written into a new zip ar ### Restore from Backup -To restore from a Backup you can either use the webUI by navigating to the same view as for the step above and clicking on the restore button in the list of backups, or you can start jellyfin with the `--restore-archive PATH_TO_BACKUP_ZIP` argument. Note that when you start a restore from the webUI, you server will immediately restart for this process to take place and will be unavailable for that time. +To restore from a Backup you can either use the webUI by navigating to the same view as for the step above and clicking on the restore button in the list of backups, or you can start jellyfin with the `--restore-archive PATH_TO_BACKUP_ZIP` argument. Note that when you start a restore from the webUI, your server will immediately restart for this process to take place and will be unavailable for that time. ## Manual Backup @@ -94,7 +94,7 @@ Taking a manual Backup essentially involves you copying all the data jellyfin re 3. Start up Jellyfin again, either after upgrading or on the current version. You now have a safe copy of your data in the path chosen in step 2. -## Restoring a Backup +### Restoring a Backup This process assumes you followed the steps above to take the backup. From 683bcd59cf4199dc5b013d1bb3ee100277ddbd77 Mon Sep 17 00:00:00 2001 From: Allegra Date: Thu, 13 Nov 2025 06:13:10 -0500 Subject: [PATCH 082/190] tweak wording for clarity and consistency --- docs/general/administration/backup-and-restore.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/general/administration/backup-and-restore.md b/docs/general/administration/backup-and-restore.md index 30e1930d..b6f13038 100644 --- a/docs/general/administration/backup-and-restore.md +++ b/docs/general/administration/backup-and-restore.md @@ -34,10 +34,10 @@ To take a new Backup, enter the Jellyfin Dashboard, open the `Backups` tab and c - Trickplay. All trickplay data that is stored not alongside media. The Backup system will check for at least 4GB of free space in the backup folder where backups a written to. However this can easily not be enough if you also backup Subtitles and Trickplay so ensure you have enough free space there. -The Backup folder is located within your Jellyfin data directory, namely: +The Backup folder is located within your Jellyfin data directory, by default: -- Official Docker: `/config/data/backups` where `` is where your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. -- LinuxServer.io Docker: `/config/data/data/backups` where `` is where your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. +- Official Docker: `/config/data/backups` where `` is where your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. +- LinuxServer.io Docker: `/config/data/data/backups` where `` is where your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. - Debian/Ubuntu packages: `/var/lib/jellyfin/data/backups`. - RPMFusion Fedora/CentOS packages: `/var/lib/jellyfin/backups`. - Windows User Install: `%LOCALAPPDATA%\Jellyfin\data\backups` (`C:\Users\\AppData\Local\Jellyfin\data\backups`) @@ -58,7 +58,7 @@ To restore from a Backup you can either use the webUI by navigating to the same Taking a manual Backup essentially involves you copying all the data jellyfin requires on your own. -### Taking a Backup +### Create a Backup 1. Stop the running Jellyfin server. This is extremely important, as otherwise the database will be locked and might not be recoverable when restoring. Note that this will interrupt any playback. - Any platform: Within the Jellyfin Dashboard, click "Shutdown". This should cleanly stop the process on all platforms, but if not, try one of the following. @@ -94,7 +94,7 @@ Taking a manual Backup essentially involves you copying all the data jellyfin re 3. Start up Jellyfin again, either after upgrading or on the current version. You now have a safe copy of your data in the path chosen in step 2. -### Restoring a Backup +### Restore from Backup This process assumes you followed the steps above to take the backup. From d7910e1ed9240d5f1e92e2775298dde149b074a0 Mon Sep 17 00:00:00 2001 From: Allegra Date: Thu, 13 Nov 2025 06:32:58 -0500 Subject: [PATCH 083/190] fix builtin backup location for remaining platforms --- docs/general/administration/backup-and-restore.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/general/administration/backup-and-restore.md b/docs/general/administration/backup-and-restore.md index b6f13038..85757780 100644 --- a/docs/general/administration/backup-and-restore.md +++ b/docs/general/administration/backup-and-restore.md @@ -39,14 +39,14 @@ The Backup folder is located within your Jellyfin data directory, by default: - Official Docker: `/config/data/backups` where `` is where your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. - LinuxServer.io Docker: `/config/data/data/backups` where `` is where your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. - Debian/Ubuntu packages: `/var/lib/jellyfin/data/backups`. -- RPMFusion Fedora/CentOS packages: `/var/lib/jellyfin/backups`. +- RPMFusion Fedora/CentOS packages: `/var/lib/jellyfin/data/backups`. - Windows User Install: `%LOCALAPPDATA%\Jellyfin\data\backups` (`C:\Users\\AppData\Local\Jellyfin\data\backups`) - Windows Service Install: `%PROGRAMDATA%\Jellyfin\Server\data\backups` (`C:\ProgramData\Jellyfin\Server\data\backups`) -- MacOS Installer (.dmg): Data is stored in one of these paths; back up whichever one(s) exist: `~/.config/jellyfin/backups`, `~/.local/share/jellyfin/backups`, `~/Library/Application Support/Jellyfin/backups`: +- MacOS Installer (.dmg): Data is stored in one of these paths; back up whichever one(s) exist: `~/.config/jellyfin/data/backups`, `~/.local/share/jellyfin/data/backups`, `~/Library/Application Support/Jellyfin/data/backups`: - Portable Installs: - Linux: Data is stored in `~/.local/share/jellyfin/data/backups`. - Windows: Data and config is in `C:\Users\\AppData\Local\jellyfin\data\backups`, using `%LOCALAPPDATA%`. - - MacOS: Data is stored in these paths; back up whichever one(s) exist: `~/.config/jellyfin/backups`, `~/.local/share/jellyfin/backups`, `~/Library/Application Support/Jellyfin/backups`. + - MacOS: Data is stored in these paths; back up whichever one(s) exist: `~/.config/jellyfin/data/backups`, `~/.local/share/jellyfin/data/backups`, `~/Library/Application Support/Jellyfin/data/backups`. After clicking on the `Create` button all data will be written into a new zip archive. From 4122dad3ebaaabbb19d6c7ae659315ffea964b9b Mon Sep 17 00:00:00 2001 From: Iksas Date: Thu, 13 Nov 2025 23:55:05 +0100 Subject: [PATCH 084/190] remove ineffective ligature setting --- src/css/custom.scss | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/css/custom.scss b/src/css/custom.scss index d33a0e9d..47a96f4b 100644 --- a/src/css/custom.scss +++ b/src/css/custom.scss @@ -5,11 +5,6 @@ * work well for content-centric websites. */ -html { - -moz-font-feature-settings: 'liga' on; - font-feature-settings: 'liga'; -} - :root { /* base font */ --ifm-font-family-base: 'Noto Sans', sans-serif; From 07d9118eaa2c3b6d71c2913c3bd7b2a267b07bdd Mon Sep 17 00:00:00 2001 From: felix920506 Date: Sun, 16 Nov 2025 11:36:52 +0800 Subject: [PATCH 085/190] Update codec-support.md --- docs/general/clients/codec-support.md | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/docs/general/clients/codec-support.md b/docs/general/clients/codec-support.md index c1e3df36..31c6e2df 100644 --- a/docs/general/clients/codec-support.md +++ b/docs/general/clients/codec-support.md @@ -13,16 +13,16 @@ The goal is to Direct Play all media. This means the container, video, audio and [Test your browser's compatibility for any codec profile.](https://cconcolato.github.io/media-mime-support/) -| Sorted by efficiency (excluding bit depth) | Chrome | Edge | Firefox | Safari | Android | Android TV | iOS | SwiftFin (iOS) | [Roku](https://developer.roku.com/docs/specs/media/streaming-specifications.md) | Kodi | Jellyfin Media Player | -| ------------------------------------------------------------------------------------------------------------------ | -------------- | -------------- | ------- | --------------- | -------------- | -------------- | -------------- | --------------- | ------------------------------------------------------------------------------- | ---- | --------------------- | -| [MPEG-4 Part 2/SP](https://en.wikipedia.org/wiki/DivX) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | -| [MPEG-4 Part 2/ASP]() | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | | ✅ | ✅ | -| [H.264 8Bit](https://caniuse.com/#feat=mpeg4 'H264 Browser Support Reference') | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| [H.264 10Bit](https://caniuse.com/#feat=mpeg4 'H264 Browser Support Reference') | ✅ | ✅ | ❌ | 🔶12 | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | ✅ | +| Sorted by efficiency (excluding bit depth) | Chrome | Edge | Firefox | Safari | Android | Android TV | iOS | SwiftFin (iOS) | [Roku](https://developer.roku.com/docs/specs/media/streaming-specifications.md) | Kodi | Jellyfin Media Player | +| ------------------------------------------------------------------------------------------------------------------ | -------------- | -------------- | --------------- | --------------- | -------------- | -------------- | -------------- | --------------- | ------------------------------------------------------------------------------- | ---- | --------------------- | +| [MPEG-4 Part 2/SP](https://en.wikipedia.org/wiki/DivX) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | +| [MPEG-4 Part 2/ASP]() | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | | ✅ | ✅ | +| [H.264 8Bit](https://caniuse.com/#feat=mpeg4 'H264 Browser Support Reference') | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| [H.264 10Bit](https://caniuse.com/#feat=mpeg4 'H264 Browser Support Reference') | ✅ | ✅ | ❌ | 🔶12 | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | ✅ | | [H.265 8Bit](https://caniuse.com/#feat=hevc 'HEVC Browser Support Reference') | 🔶8 | ✅7 | ✅15 | 🔶1 | 🔶2 | ✅5 | 🔶1 | ✅6 | 🔶9 | ✅ | ✅ | | [H.265 10Bit](https://caniuse.com/#feat=hevc 'HEVC Browser Support Reference') | 🔶8 | ✅7 | ✅15 | 🔶1 | 🔶2 | 🔶5 | 🔶1 | ✅6 | 🔶9 | ✅ | ✅ | -| [VP9](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#VP9 'V9 Browser Support Reference') | ✅ | ✅ | ✅ | ✅10 | ✅3 | 🔶3 | ❌ | ✅13 | ✅ | ✅ | ✅ | -| [AV1](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#AV1 'AV1 Browser Support Reference') | ✅ | ✅ | ✅ | 🔶11 | ✅ | 🔶4 | ❌ | 🔶14 | ✅ | ✅ | ✅ | +| [VP9](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#VP9 'V9 Browser Support Reference') | ✅ | ✅ | ✅ | ✅10 | ✅3 | 🔶3 | ❌ | ✅13 | ✅ | ✅ | ✅ | +| [AV1](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#AV1 'AV1 Browser Support Reference') | ✅ | ✅ | ✅ | 🔶11 | ✅ | 🔶4 | ❌ | 🔶14 | ✅ | ✅ | ✅ | 1HEVC is only supported in MP4, M4V, and MOV containers.
@@ -198,7 +198,7 @@ If the container is unsupported, this will result in remuxing. The video and aud | Container | Chrome | Edge | Firefox | Safari | Android | Android TV | Kodi | Roku | | :-------------------------------------------------------------------: | :----: | :--: | :-----: | :----: | :-----: | :--------: | :--: | :--: | | [MP4](https://en.wikipedia.org/wiki/MPEG-4_Part_14)1 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| [MKV](https://en.wikipedia.org/wiki/Matroska)2, 3 | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | +| [MKV](https://en.wikipedia.org/wiki/Matroska)2, 3, 8 | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | | [WebM](https://en.wikipedia.org/wiki/WebM)3, 5, 6 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | [TS](https://en.wikipedia.org/wiki/MPEG_transport_stream)4 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | [OGG](https://en.wikipedia.org/wiki/Ogg)5, 7 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | @@ -216,3 +216,5 @@ If the container is unsupported, this will result in remuxing. The video and aud 6WebM on Safari requires at least Safari 14.
7OGG on Safari requires at least iOS 18.4 / macOS 15.4 +
+8MKV support in Firefox is broken and unusable currently, therefore disabled in Jellyfin until the support becomes more mature. From 3fd2c0d677529bde1e501ba4f88c3bc5d778138c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 16 Nov 2025 19:21:31 +0000 Subject: [PATCH 086/190] Update Linters --- package-lock.json | 170 +++++++++++++++++++++++----------------------- package.json | 6 +- 2 files changed, 88 insertions(+), 88 deletions(-) diff --git a/package-lock.json b/package-lock.json index eeeb7605..bf460440 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,11 +38,11 @@ "devDependencies": { "@docusaurus/module-type-aliases": "3.9.2", "@docusaurus/tsconfig": "3.9.2", - "@eslint/js": "9.38.0", + "@eslint/js": "9.39.1", "@types/react": "18.3.26", "@types/react-helmet": "6.1.11", "@types/react-router-dom": "5.3.3", - "eslint": "9.38.0", + "eslint": "9.39.1", "eslint-config-prettier": "10.1.8", "eslint-plugin-import": "2.32.0", "eslint-plugin-jsx-a11y": "6.10.2", @@ -55,7 +55,7 @@ "node-fetch": "3.3.2", "prettier": "3.6.2", "typescript": "5.9.3", - "typescript-eslint": "8.46.2", + "typescript-eslint": "8.46.3", "typescript-plugin-css-modules": "5.2.0" }, "engines": { @@ -3876,22 +3876,22 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.1.tgz", - "integrity": "sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.16.0" + "@eslint/core": "^0.17.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", - "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3939,9 +3939,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.38.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz", - "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==", + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", "dev": true, "license": "MIT", "engines": { @@ -3962,13 +3962,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", - "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.16.0", + "@eslint/core": "^0.17.0", "levn": "^0.4.1" }, "engines": { @@ -6074,17 +6074,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.2.tgz", - "integrity": "sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.3.tgz", + "integrity": "sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.46.2", - "@typescript-eslint/type-utils": "8.46.2", - "@typescript-eslint/utils": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2", + "@typescript-eslint/scope-manager": "8.46.3", + "@typescript-eslint/type-utils": "8.46.3", + "@typescript-eslint/utils": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -6098,7 +6098,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.46.2", + "@typescript-eslint/parser": "^8.46.3", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -6114,17 +6114,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.2.tgz", - "integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.3.tgz", + "integrity": "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2", + "@typescript-eslint/scope-manager": "8.46.3", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3", "debug": "^4.3.4" }, "engines": { @@ -6140,14 +6140,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.2.tgz", - "integrity": "sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.3.tgz", + "integrity": "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.2", - "@typescript-eslint/types": "^8.46.2", + "@typescript-eslint/tsconfig-utils": "^8.46.3", + "@typescript-eslint/types": "^8.46.3", "debug": "^4.3.4" }, "engines": { @@ -6162,14 +6162,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.2.tgz", - "integrity": "sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.3.tgz", + "integrity": "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2" + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6180,9 +6180,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.2.tgz", - "integrity": "sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.3.tgz", + "integrity": "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==", "dev": true, "license": "MIT", "engines": { @@ -6197,15 +6197,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.2.tgz", - "integrity": "sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.3.tgz", + "integrity": "sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2", - "@typescript-eslint/utils": "8.46.2", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3", + "@typescript-eslint/utils": "8.46.3", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -6222,9 +6222,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.2.tgz", - "integrity": "sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.3.tgz", + "integrity": "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==", "dev": true, "license": "MIT", "engines": { @@ -6236,16 +6236,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz", - "integrity": "sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.3.tgz", + "integrity": "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.46.2", - "@typescript-eslint/tsconfig-utils": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2", + "@typescript-eslint/project-service": "8.46.3", + "@typescript-eslint/tsconfig-utils": "8.46.3", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -6291,16 +6291,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.2.tgz", - "integrity": "sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.3.tgz", + "integrity": "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2" + "@typescript-eslint/scope-manager": "8.46.3", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6315,13 +6315,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz", - "integrity": "sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.3.tgz", + "integrity": "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/types": "8.46.3", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -10093,9 +10093,9 @@ } }, "node_modules/eslint": { - "version": "9.38.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz", - "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", + "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", "peer": true, @@ -10103,11 +10103,11 @@ "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.1", - "@eslint/core": "^0.16.0", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.38.0", - "@eslint/plugin-kit": "^0.4.0", + "@eslint/js": "9.39.1", + "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -21811,16 +21811,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.2.tgz", - "integrity": "sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==", + "version": "8.46.3", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.3.tgz", + "integrity": "sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.46.2", - "@typescript-eslint/parser": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2", - "@typescript-eslint/utils": "8.46.2" + "@typescript-eslint/eslint-plugin": "8.46.3", + "@typescript-eslint/parser": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3", + "@typescript-eslint/utils": "8.46.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" diff --git a/package.json b/package.json index 6d17f263..9b39fb3e 100644 --- a/package.json +++ b/package.json @@ -63,11 +63,11 @@ "devDependencies": { "@docusaurus/module-type-aliases": "3.9.2", "@docusaurus/tsconfig": "3.9.2", - "@eslint/js": "9.38.0", + "@eslint/js": "9.39.1", "@types/react": "18.3.26", "@types/react-helmet": "6.1.11", "@types/react-router-dom": "5.3.3", - "eslint": "9.38.0", + "eslint": "9.39.1", "eslint-config-prettier": "10.1.8", "eslint-plugin-import": "2.32.0", "eslint-plugin-jsx-a11y": "6.10.2", @@ -80,7 +80,7 @@ "node-fetch": "3.3.2", "prettier": "3.6.2", "typescript": "5.9.3", - "typescript-eslint": "8.46.2", + "typescript-eslint": "8.46.3", "typescript-plugin-css-modules": "5.2.0" } } From 1353667e204b20d8795f1c3014a187bb0283a696 Mon Sep 17 00:00:00 2001 From: BotBlake Date: Sun, 16 Nov 2025 20:29:08 +0100 Subject: [PATCH 087/190] STALE PR: Apply suggestions from code review Co-authored-by: felix920506 --- docs/general/administration/backup-and-restore.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/general/administration/backup-and-restore.md b/docs/general/administration/backup-and-restore.md index 042558ee..a60b1874 100644 --- a/docs/general/administration/backup-and-restore.md +++ b/docs/general/administration/backup-and-restore.md @@ -50,7 +50,7 @@ The Backup folder is located within your Jellyfin data directory which is locate After clicking on the `Create` button all data will be written into a new zip archive. -### Restore from Built-in Backup +### Restore from a Built-in Backup To restore from a Backup you can either use the webUI by navigating to the same view as for the step above and clicking on the restore button in the list of backups, or you can start jellyfin with the `--restore-archive PATH_TO_BACKUP_ZIP` argument. Note that when you start a restore from the webUI, you server will immediately restart for this process to take place and will be unavailable for that time. @@ -94,7 +94,7 @@ Taking a manual Backup essentially involves you copying all the data jellyfin re 3. Start up Jellyfin again, either after upgrading or on the current version. You now have a safe copy of your data in the path chosen in step 2. -### Restoring a Manual Backup +### Restoring from a Manual Backup This process assumes you followed the steps above to take the backup. From f66b77c369b87354aac4d7810038d24109440e5a Mon Sep 17 00:00:00 2001 From: felix920506 Date: Mon, 17 Nov 2025 16:19:13 +0800 Subject: [PATCH 088/190] Niels feedback --- docs/general/clients/codec-support.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/clients/codec-support.md b/docs/general/clients/codec-support.md index 31c6e2df..88b70f26 100644 --- a/docs/general/clients/codec-support.md +++ b/docs/general/clients/codec-support.md @@ -217,4 +217,4 @@ If the container is unsupported, this will result in remuxing. The video and aud
7OGG on Safari requires at least iOS 18.4 / macOS 15.4
-8MKV support in Firefox is broken and unusable currently, therefore disabled in Jellyfin until the support becomes more mature. +8MKV support in Firefox is disabled in Firefox as there are significant issues making it unusable for Jellyfin currently. [1](https://bugzilla.mozilla.org/show_bug.cgi?id=2000420) [2](https://bugzilla.mozilla.org/show_bug.cgi?id=1991746) From 5bf4f612b2ab69703564a11ac8755c7e714a47a7 Mon Sep 17 00:00:00 2001 From: felix920506 Date: Mon, 17 Nov 2025 16:20:57 +0800 Subject: [PATCH 089/190] typo / reword --- docs/general/clients/codec-support.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/clients/codec-support.md b/docs/general/clients/codec-support.md index 88b70f26..d14d080e 100644 --- a/docs/general/clients/codec-support.md +++ b/docs/general/clients/codec-support.md @@ -217,4 +217,4 @@ If the container is unsupported, this will result in remuxing. The video and aud
7OGG on Safari requires at least iOS 18.4 / macOS 15.4
-8MKV support in Firefox is disabled in Firefox as there are significant issues making it unusable for Jellyfin currently. [1](https://bugzilla.mozilla.org/show_bug.cgi?id=2000420) [2](https://bugzilla.mozilla.org/show_bug.cgi?id=1991746) +8MKV support in Firefox is currently disabled in Jellyfin, as there are significant issues making it unusable for Jellyfin. [1](https://bugzilla.mozilla.org/show_bug.cgi?id=2000420) [2](https://bugzilla.mozilla.org/show_bug.cgi?id=1991746) From 299d114db98076b345f12a3ecca843578a5a8736 Mon Sep 17 00:00:00 2001 From: evanreichard <30810613+evanreichard@users.noreply.github.com> Date: Tue, 18 Nov 2025 20:54:56 -0500 Subject: [PATCH 090/190] fix(docs): invalid debug logging file The documented file is invalid and causes ``` [01:47:57] [FTL] [1] : Failed to create/read logger configuration System.ArgumentException: A source source must be provided. (Parameter 'source') ``` --- docs/general/administration/troubleshooting.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/docs/general/administration/troubleshooting.md b/docs/general/administration/troubleshooting.md index add962bd..f2ce5be9 100644 --- a/docs/general/administration/troubleshooting.md +++ b/docs/general/administration/troubleshooting.md @@ -49,10 +49,7 @@ To enable debug logging, create the `logging.json` file and add the following co { "Serilog": { "MinimumLevel": { - "Default": "Debug", - "Override": { - "": "Debug" - } + "Default": "Debug" } } } From 940ded6f8736a79df70d885a1b04ad7b0268fec1 Mon Sep 17 00:00:00 2001 From: Allegra Date: Wed, 19 Nov 2025 01:41:10 -0500 Subject: [PATCH 091/190] Add information about docker tags and automatic updates (#1632) * feat(container): add information about docker tags and automatic updates * feat(tags): add tag descriptions to the docs instead of referencing the forum * fix: update internal links * fix: update internal links * remove added latest tags * adjust verbiage * remove tag from docker compose instructions * fix linting * apply suggested changes to container.md --------- Co-authored-by: BotBlake --- docs/general/installation/_container-docker-compose.md | 3 ++- docs/general/installation/_container-podman.md | 2 +- docs/general/installation/container.md | 8 ++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/general/installation/_container-docker-compose.md b/docs/general/installation/_container-docker-compose.md index 1dffa737..ef7f13ff 100644 --- a/docs/general/installation/_container-docker-compose.md +++ b/docs/general/installation/_container-docker-compose.md @@ -13,13 +13,14 @@ You WILL NOT receive any support for running Jellyfin in Docker on platforms oth ::: -Create a `docker-compose.yml` file with the following contents. Add in the UID and GID that you would like to run jellyfin as in the user line below, or remove the user line to use the default (root). +Create a `docker-compose.yml` file like the following. ```yml services: jellyfin: image: jellyfin/jellyfin container_name: jellyfin + # Optional - specify the uid and gid you would like Jellyfin to use instead of root user: uid:gid ports: - 8096:8096/tcp diff --git a/docs/general/installation/_container-podman.md b/docs/general/installation/_container-podman.md index d3de4682..ed36e531 100644 --- a/docs/general/installation/_container-podman.md +++ b/docs/general/installation/_container-podman.md @@ -44,7 +44,7 @@ The `--user` option will run with the provided user id and group id _inside_ the The `--userns keep-id` flag ensures that current user's id is mapped to the non-root user's id inside the container. This ensures that the permissions for directories bind-mounted inside the container are mapped correctly between the user running Podman and the user running Jellyfin inside the container. -Keep in mind that the `--label "io.containers.autoupdate=image"` flag will allow the container to be automatically updated via `podman auto-update`. +Keep in mind that the `--label "io.containers.autoupdate=image"` flag will allow the container to be automatically updated via `podman auto-update`, and a [backup](/docs/general/administration/backup-and-restore) will be required to restore a previous version. The `z` (shared volume) or `Z` (private volume) volume option and `relabel=shared` or `relabel=private` mount option tell Podman to relabel files inside the volumes as appropriate, for systems running SELinux. diff --git a/docs/general/installation/container.md b/docs/general/installation/container.md index a97e7caa..02f7b65c 100644 --- a/docs/general/installation/container.md +++ b/docs/general/installation/container.md @@ -19,6 +19,14 @@ hotio image: `ghcr.io/hotio/jellyfin`. Jellyfin distributes official container images on [Docker Hub](https://hub.docker.com/r/jellyfin/jellyfin/) and the [GitHub Container Registry](https://ghcr.io/jellyfin/jellyfin) for multiple architectures. These images are based on Debian and [built directly from the Jellyfin source code](https://github.com/jellyfin/jellyfin-packaging/blob/master/docker/Dockerfile). +Several tags are available tracking different builds and [version](/docs/general/contributing/release-procedure/#versioning) levels. + +- `latest` always tracks the latest stable release, including through major and minor version bumps +- `X` (e.g. `10`) tracks the major version, e.g. the latest 10.Y.Z +- `X.Y` (e.g. `10.11`) tracks the minor version, e.g. the latest 10.11.Z +- `X.Y.Z` (e.g. `10.11.0`) tracks a specific release +- `X.Y.Z.YYYYMMDD-HHMMSS` (e.g. `10.11.0.20251020-004604`) tracks a specific packaging build + Additionally, there are several third parties providing unofficial container images, including the [LinuxServer.io](https://www.linuxserver.io/) ([Dockerfile](https://github.com/linuxserver/docker-jellyfin/blob/master/Dockerfile)) project and [hotio](https://github.com/hotio) ([Dockerfile](https://github.com/hotio/jellyfin/blob/release/linux-amd64.Dockerfile)), which offer images based on Ubuntu and the official Jellyfin Ubuntu binary packages. ## Installation Instructions From 1f05404733b090c02e9284d811fdf84eadd87bf3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 Nov 2025 14:49:56 +0800 Subject: [PATCH 092/190] Update dependency sass to v1.94.0 (#1646) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index c484dc56..058c90a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "file-loader": "6.2.0", "react": "18.3.1", "react-dom": "18.3.1", - "sass": "1.93.2", + "sass": "1.94.0", "swiper": "12.0.3", "ua-parser-js": "2.0.6", "url-loader": "4.1.1" @@ -20112,9 +20112,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz", - "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==", + "version": "1.94.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.94.0.tgz", + "integrity": "sha512-Dqh7SiYcaFtdv5Wvku6QgS5IGPm281L+ZtVD1U2FJa7Q0EFRlq8Z3sjYtz6gYObsYThUOz9ArwFqPZx+1azILQ==", "license": "MIT", "peer": true, "dependencies": { diff --git a/package.json b/package.json index 01b463f8..935b5505 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "file-loader": "6.2.0", "react": "18.3.1", "react-dom": "18.3.1", - "sass": "1.93.2", + "sass": "1.94.0", "swiper": "12.0.3", "ua-parser-js": "2.0.6", "url-loader": "4.1.1" From 306d067c9f802939c74d1d344787cd829676195e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 Nov 2025 14:50:13 +0800 Subject: [PATCH 093/190] Update actions/checkout action to v5.0.1 (#1658) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/build.yml | 2 +- .github/workflows/lint.yml | 4 ++-- .github/workflows/test.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 13fc914c..a55b373c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,7 +19,7 @@ jobs: name: Build runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 with: ref: ${{ github.event.pull_request.head.sha || github.sha }} - uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index ec6d06ff..474a0d4f 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - name: Set up Node.js uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 @@ -32,7 +32,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out Git repository - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - name: Set up problem matcher uses: xt0rted/markdownlint-problem-matcher@1a5fabfb577370cfdf5af944d418e4be3ea06f27 # v3.0.0 - name: Run markdownlint diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2dbcbaad..0e32a6d5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - name: Set up Node.js uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 From 442e372a9bcad9fb67747788346bfb56db1baf9e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 Nov 2025 14:50:30 +0800 Subject: [PATCH 094/190] Update dependency typescript-eslint to v8.46.4 (#1659) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 124 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 63 insertions(+), 63 deletions(-) diff --git a/package-lock.json b/package-lock.json index 058c90a4..1107c5a0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,7 +55,7 @@ "node-fetch": "3.3.2", "prettier": "3.6.2", "typescript": "5.9.3", - "typescript-eslint": "8.46.3", + "typescript-eslint": "8.46.4", "typescript-plugin-css-modules": "5.2.0" }, "engines": { @@ -6074,17 +6074,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.3.tgz", - "integrity": "sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==", + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.4.tgz", + "integrity": "sha512-R48VhmTJqplNyDxCyqqVkFSZIx1qX6PzwqgcXn1olLrzxcSBDlOsbtcnQuQhNtnNiJ4Xe5gREI1foajYaYU2Vg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.46.3", - "@typescript-eslint/type-utils": "8.46.3", - "@typescript-eslint/utils": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3", + "@typescript-eslint/scope-manager": "8.46.4", + "@typescript-eslint/type-utils": "8.46.4", + "@typescript-eslint/utils": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -6098,7 +6098,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.46.3", + "@typescript-eslint/parser": "^8.46.4", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -6114,17 +6114,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.3.tgz", - "integrity": "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==", + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.4.tgz", + "integrity": "sha512-tK3GPFWbirvNgsNKto+UmB/cRtn6TZfyw0D6IKrW55n6Vbs7KJoZtI//kpTKzE/DUmmnAFD8/Ca46s7Obs92/w==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/typescript-estree": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3", + "@typescript-eslint/scope-manager": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4", "debug": "^4.3.4" }, "engines": { @@ -6140,14 +6140,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.3.tgz", - "integrity": "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==", + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.4.tgz", + "integrity": "sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.3", - "@typescript-eslint/types": "^8.46.3", + "@typescript-eslint/tsconfig-utils": "^8.46.4", + "@typescript-eslint/types": "^8.46.4", "debug": "^4.3.4" }, "engines": { @@ -6162,14 +6162,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.3.tgz", - "integrity": "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==", + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.4.tgz", + "integrity": "sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3" + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6180,9 +6180,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.3.tgz", - "integrity": "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==", + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.4.tgz", + "integrity": "sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==", "dev": true, "license": "MIT", "engines": { @@ -6197,15 +6197,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.3.tgz", - "integrity": "sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==", + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.4.tgz", + "integrity": "sha512-V4QC8h3fdT5Wro6vANk6eojqfbv5bpwHuMsBcJUJkqs2z5XnYhJzyz9Y02eUmF9u3PgXEUiOt4w4KHR3P+z0PQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/typescript-estree": "8.46.3", - "@typescript-eslint/utils": "8.46.3", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.4", + "@typescript-eslint/utils": "8.46.4", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -6222,9 +6222,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.3.tgz", - "integrity": "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==", + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.4.tgz", + "integrity": "sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==", "dev": true, "license": "MIT", "engines": { @@ -6236,16 +6236,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.3.tgz", - "integrity": "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==", + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.4.tgz", + "integrity": "sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.46.3", - "@typescript-eslint/tsconfig-utils": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/visitor-keys": "8.46.3", + "@typescript-eslint/project-service": "8.46.4", + "@typescript-eslint/tsconfig-utils": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -6291,16 +6291,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.3.tgz", - "integrity": "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==", + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.4.tgz", + "integrity": "sha512-AbSv11fklGXV6T28dp2Me04Uw90R2iJ30g2bgLz529Koehrmkbs1r7paFqr1vPCZi7hHwYxYtxfyQMRC8QaVSg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.3", - "@typescript-eslint/types": "8.46.3", - "@typescript-eslint/typescript-estree": "8.46.3" + "@typescript-eslint/scope-manager": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.4" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6315,13 +6315,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.3.tgz", - "integrity": "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==", + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.4.tgz", + "integrity": "sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/types": "8.46.4", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -21811,16 +21811,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.46.3", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.3.tgz", - "integrity": "sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA==", + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.4.tgz", + "integrity": "sha512-KALyxkpYV5Ix7UhvjTwJXZv76VWsHG+NjNlt/z+a17SOQSiOcBdUXdbJdyXi7RPxrBFECtFOiPwUJQusJuCqrg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.46.3", - "@typescript-eslint/parser": "8.46.3", - "@typescript-eslint/typescript-estree": "8.46.3", - "@typescript-eslint/utils": "8.46.3" + "@typescript-eslint/eslint-plugin": "8.46.4", + "@typescript-eslint/parser": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.4", + "@typescript-eslint/utils": "8.46.4" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" diff --git a/package.json b/package.json index 935b5505..8b0a4e0c 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "node-fetch": "3.3.2", "prettier": "3.6.2", "typescript": "5.9.3", - "typescript-eslint": "8.46.3", + "typescript-eslint": "8.46.4", "typescript-plugin-css-modules": "5.2.0" } } From 9986be9ef2fab81f497157e3de8f0335f61d7a3f Mon Sep 17 00:00:00 2001 From: felix920506 Date: Wed, 19 Nov 2025 15:16:04 +0800 Subject: [PATCH 095/190] markdownlint ignore old blogs --- .markdownlintignore | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .markdownlintignore diff --git a/.markdownlintignore b/.markdownlintignore new file mode 100644 index 00000000..fc44a181 --- /dev/null +++ b/.markdownlintignore @@ -0,0 +1,6 @@ +blog/2019/* +blog/2020/* +blog/2021/* +blog/2022/* +blog/2023/* +blog/2024/* \ No newline at end of file From c07a8f914cf02776a07cee4cd5d0b7c487085c2a Mon Sep 17 00:00:00 2001 From: felix920506 Date: Wed, 19 Nov 2025 15:16:11 +0800 Subject: [PATCH 096/190] disable md060 --- .markdownlint.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.markdownlint.yaml b/.markdownlint.yaml index 984249c9..603a10f9 100644 --- a/.markdownlint.yaml +++ b/.markdownlint.yaml @@ -17,3 +17,6 @@ MD026: # MD028/no-blanks-blockquote MD028: false + +# MD060/table-column-style +MD060: false From eaac90c29fd2569c2814f632003228bc38de07b3 Mon Sep 17 00:00:00 2001 From: Allegra Date: Wed, 19 Nov 2025 02:35:59 -0500 Subject: [PATCH 097/190] fix linting --- docs/general/administration/backup-and-restore.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/general/administration/backup-and-restore.md b/docs/general/administration/backup-and-restore.md index 601723af..d091cee6 100644 --- a/docs/general/administration/backup-and-restore.md +++ b/docs/general/administration/backup-and-restore.md @@ -24,7 +24,7 @@ There are two ways of backing up your Jellyfin data. One is with its built-in Ba Jellyfin's built-in backup system is able to create a backup while your system is online and running, as opposed to the manual process that **requires** you to stop Jellyfin beforehand. However in 10.11 we still recommend performing the backup process during a time of low activity and while no scan is currently active. -### Create a Backup +### Create a Built-in Backup To take a new Backup, enter the Jellyfin Dashboard, open the `Backups` tab and click on the `Create Backup` button. The popup will now ask you to select what data you want to backup. @@ -58,7 +58,7 @@ To restore from a Backup you can either use the webUI by navigating to the same Taking a manual Backup essentially involves you copying all the data jellyfin requires on your own. -### Create a Backup +### Create a Manual Backup 1. Stop the running Jellyfin server. This is extremely important, as otherwise the database will be locked and might not be recoverable when restoring. Note that this will interrupt any playback. - Any platform: Within the Jellyfin Dashboard, click "Shutdown". This should cleanly stop the process on all platforms, but if not, try one of the following. @@ -94,7 +94,7 @@ Taking a manual Backup essentially involves you copying all the data jellyfin re 3. Start up Jellyfin again, either after upgrading or on the current version. You now have a safe copy of your data in the path chosen in step 2. -### Restoring from a Manual Backup +### Restore from a Manual Backup This process assumes you followed the steps above to take the backup. From 27bdee1f32b6ac39152644a25aa3b5b2f107ebc2 Mon Sep 17 00:00:00 2001 From: felix920506 Date: Wed, 19 Nov 2025 16:04:37 +0800 Subject: [PATCH 098/190] opt out in individual files instead --- .markdownlintignore | 6 ------ blog/2020/06-21-packaging-updates.md | 10 ++++++---- blog/2020/10-05-android-next.md | 2 ++ 3 files changed, 8 insertions(+), 10 deletions(-) delete mode 100644 .markdownlintignore diff --git a/.markdownlintignore b/.markdownlintignore deleted file mode 100644 index fc44a181..00000000 --- a/.markdownlintignore +++ /dev/null @@ -1,6 +0,0 @@ -blog/2019/* -blog/2020/* -blog/2021/* -blog/2022/* -blog/2023/* -blog/2024/* \ No newline at end of file diff --git a/blog/2020/06-21-packaging-updates.md b/blog/2020/06-21-packaging-updates.md index 5e4ac148..a9b773e2 100644 --- a/blog/2020/06-21-packaging-updates.md +++ b/blog/2020/06-21-packaging-updates.md @@ -1,11 +1,13 @@ --- -title: "Packaging Updates for 10.6.0" -description: "Some backend packaging changes are here: what you should know" +title: 'Packaging Updates for 10.6.0' +description: 'Some backend packaging changes are here: what you should know' authors: joshuaboniface date: 2020-06-21 slug: packaging-updates --- + + Packaging and building binaries for releases and testing has long been an issue for us. From fighting with duct-tape-and-coat-hanger scripts, to testing breaking changes, to massaging official releases, how we were doing things for the last year-and-a-half needed some improvements. Luckily, today they are all completed. In this post, I'll detail the changes as well as what the entail for our users. @@ -24,7 +26,7 @@ The main difference is the naming - the `jellyfin-web` repository binaries are n ### Azure Pipelines builds -Our previous build infrastructure consisted of a veritable spaghetti factory of Bash, Python, and Docker scripts that were executed on our build server, a DigitalOcean droplet. For the most part, it worked, but the process was very fragile, opaque (I'm not even sure *I* understand how it all worked all the time, and I wrote it all!), and resource-intensive. +Our previous build infrastructure consisted of a veritable spaghetti factory of Bash, Python, and Docker scripts that were executed on our build server, a DigitalOcean droplet. For the most part, it worked, but the process was very fragile, opaque (I'm not even sure _I_ understand how it all worked all the time, and I wrote it all!), and resource-intensive. As we've moved more and more functions to Azure for testing, verification, linting, etc. in the various repositories, it became obvious that Azure Pipelines had a lot of flexibility, and would be able to perform nearly all of our build steps for us. This eliminated at least 2/3 of the build server, and gives us another cool option - unstable builds, which I'll touch on shortly. @@ -48,7 +50,7 @@ For the remaining platforms, including the archive packages for Windows, MacOS, One of the cool things that this new setup enables is "unstable" builds. For quite a while now, we've been providing (when not broken) "nightly" builds, which as their name implies are build every night if there were merged PRs from the previous day. However, these had a number of drawbacks. First, they broke a lot; second, on a busy day it would be possible for there to be up to a dozen separate PRs that made up the nightly changeset; third, they could often be totally messed up in terms of contents, for instance if the unsplit build grabbed the wrong version of Web. -The new split builds, Azure builds, and metapackages/metaimages instead let us do something far superior: build "unstable" releases for *every merged PR*. We don't have to worry about resource usage (Azure provides this), disk space, or other aspects of the build process. We can know immediately if something breaks. And most importantly, it lets anyone test our master branch in a very clear way, knowing *exactly* what version of the repository you are using and what the last merged PR was if something goes wrong. +The new split builds, Azure builds, and metapackages/metaimages instead let us do something far superior: build "unstable" releases for _every merged PR_. We don't have to worry about resource usage (Azure provides this), disk space, or other aspects of the build process. We can know immediately if something breaks. And most importantly, it lets anyone test our master branch in a very clear way, knowing _exactly_ what version of the repository you are using and what the last merged PR was if something goes wrong. Unstable builds are versioned based on the Azure build ID, which is in the format "[date].[id]", for example "20200620.12" for the 12th build on June 20th 2020. Thus this version string will tell you exactly which Azure build generated the binary, and thus which PR in which repository triggered it. For those binaries with changelogs (`.deb` and `.rpm` packages only for now), the changelog data includes the PR ID explicitly as well. diff --git a/blog/2020/10-05-android-next.md b/blog/2020/10-05-android-next.md index f09b0d96..d9e2ebe1 100644 --- a/blog/2020/10-05-android-next.md +++ b/blog/2020/10-05-android-next.md @@ -6,6 +6,8 @@ date: 2020-10-05 slug: android-next --- + + This will be a net benefit for users and developers alike! From f571dae0b882c69dbcc98e307c2fa700e51c8ef3 Mon Sep 17 00:00:00 2001 From: Allegra Date: Thu, 20 Nov 2025 11:55:28 -0500 Subject: [PATCH 099/190] fix minimum free space in backup folder --- docs/general/administration/backup-and-restore.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/backup-and-restore.md b/docs/general/administration/backup-and-restore.md index d091cee6..19735eab 100644 --- a/docs/general/administration/backup-and-restore.md +++ b/docs/general/administration/backup-and-restore.md @@ -33,7 +33,7 @@ To take a new Backup, enter the Jellyfin Dashboard, open the `Backups` tab and c - Subtitles. All extracted subtitles including downloaded ones. - Trickplay. All trickplay data that is stored not alongside media. -The Backup system will check for at least 4GB of free space in the backup folder where backups a written to. However this can easily not be enough if you also backup Subtitles and Trickplay so ensure you have enough free space there. +The Backup system will check for at least 5GB of free space in the backup folder where backups a written to. However this can easily not be enough if you also backup Subtitles and Trickplay so ensure you have enough free space there. The Backup folder is located within your Jellyfin data directory, by default: - Official Docker: `/config/data/backups` where `` is where your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. From a08f4d0353e8d5517f9f7fdd25948b2122a7a0a5 Mon Sep 17 00:00:00 2001 From: guiweber Date: Sun, 23 Nov 2025 12:04:24 +0100 Subject: [PATCH 100/190] Add documentation for external artist images The use of external artist images was previously not documented despite the functionality being present. These changes add how and where artist images can be put alongside the media files. I am not sure if other filenames than "folder" are accepted. Maybe someone familiar with the codebase could verify? For now I've only checked the "folder" filename as being accepted. --- docs/general/server/media/_metadata-images.md | 60 ++++++++++--------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/docs/general/server/media/_metadata-images.md b/docs/general/server/media/_metadata-images.md index f06135fd..4dd7942e 100644 --- a/docs/general/server/media/_metadata-images.md +++ b/docs/general/server/media/_metadata-images.md @@ -4,18 +4,23 @@ Images can either be provided as external files within the media folders, or embedded in the media files themselves. When external imaged are provided, they should be placed alongside the media files. When they are provided, they will take precedence over other sources. +Similar to media folders, an artist image can be placed in the root of an artist’s folder. It will be shown both when browsing artists and on the artist’s detail page. + + import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; ```txt - Album - ├── cover.jpg - ├── backdrop.webp - ├── logo.png - ├── Track 1.m4a - └── Track 2.m4a + Artist + ├── Album + │ ├── cover.jpg + │ ├── backdrop.webp + │ ├── logo.png + │ ├── Track 1.m4a + │ └── Track 2.m4a + └── folder.jpg ``` When no images are provided for music, Jellyfin will take the cover image from the first track that has an embedded cover image. @@ -49,7 +54,7 @@ Image types: | Type | Description | | -------- | --------------------------------------------------------------------------------------- | -| Primary | The primary cover image | +| Primary | The primary cover/artist image | | Backdrop | Background image in media page 1 | | Banner | Displayed when browsing library in banner mode. Video only. 2 | | Logo | Logo displayed on the top of a media item. | @@ -64,26 +69,27 @@ Image types: Unless otherwise noted, all filenames can be used either standalone (e.g. `logo.png`) or as a suffix (e.g. `movie-logo.png`) -| Filename | Type | Movies | Series | Season | Episode | Music | -| --------------------------- | -------- | --------------- | ------ | ------ | ------- | ----- | -| poster | Primary | ✅ 2 | ✅ | ✅ | | ✅ | -| folder | Primary | ✅ 2 | ✅ | ✅ | | ✅ | -| cover | Primary | ✅ 2 | ✅ | ✅ | | ✅ | -| default | Primary | ✅ 2 | ✅ | ✅ | | ✅ | -| movie | Primary | ✅ 2 | | | | | -| show | Primary | | ✅ | | | | -| jacket | Primary | | | | | ✅ | -| thumb (suffix) 1 | Primary | | | | ✅ | | -| backdrop | Backdrop | ✅ 2 | ✅ | ✅ | | ✅ | -| fanart | Backdrop | ✅ 2 | ✅ | ✅ | | ✅ | -| background | Backdrop | ✅ 2 | ✅ | ✅ | | ✅ | -| art | Backdrop | ✅ 2 | ✅ | ✅ | | ✅ | -| extrafanart (folder) | Backdrop | ✅ 2 | ✅ | ✅ | | ✅ | -| banner | Banner | ✅ | ✅ | ✅ | | ✅ | -| logo | Logo | ✅ 2 | ✅ | ✅ | | ✅ | -| clearlogo | Logo | ✅ 2 | ✅ | ✅ | | ✅ | -| landscape | Thumb | ✅ | ✅ | ✅ | | ✅ | -| thumb | Thumb | ✅ | ✅ | ✅ | | ✅ | +| Filename | Type | Movies | Series | Season | Episode | Music | Artist | +| ------------------------ | --------- | --------------- | ------ | ------ | ------- | ----- | ------ | +| poster | Primary | ✅ 2 | ✅ | ✅ | | ✅ | | +| folder | Primary | ✅ 2 | ✅ | ✅ | | ✅ | ✅ | +| cover | Primary | ✅ 2 | ✅ | ✅ | | ✅ | | +| default | Primary | ✅ 2 | ✅ | ✅ | | ✅ | | +| movie | Primary | ✅ 2 | | | | | | +| show | Primary | | ✅ | | | | | +| jacket | Primary | | | | | ✅ | | +| thumb (suffix) 1 | Primary | | | | ✅ | | | +| backdrop | Backdrop | ✅ 2 | ✅ | ✅ | | ✅ | | +| fanart | Backdrop | ✅ 2 | ✅ | ✅ | | ✅ | | +| background | Backdrop | ✅ 2 | ✅ | ✅ | | ✅ | | +| art | Backdrop | ✅ 2 | ✅ | ✅ | | ✅ | | +| extrafanart (folder) | Backdrop | ✅ 2 | ✅ | ✅ | | ✅ | | +| banner | Banner | ✅ | ✅ | ✅ | | ✅ | | +| logo | Logo | ✅ 2 | ✅ | ✅ | | ✅ | | +| clearlogo | Logo | ✅ 2 | ✅ | ✅ | | ✅ | | +| landscape | Thumb | ✅ | ✅ | ✅ | | ✅ | | +| thumb | Thumb | ✅ | ✅ | ✅ | | ✅ | | + 1 For example: `S01E01 Some Episode-thumb.jpg`
2 These file names can also be embedded in supported media containers (e.g. mkv) and will be used when the `Embedded Image Extractor` source is enabled for movies. From 8899326bb0a9ee86ab00b12a0d79ffce384ac0c9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 19:01:39 +0000 Subject: [PATCH 101/190] Update dependency typescript-eslint to v8.47.0 --- package-lock.json | 124 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 63 insertions(+), 63 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1107c5a0..3ee182de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,7 +55,7 @@ "node-fetch": "3.3.2", "prettier": "3.6.2", "typescript": "5.9.3", - "typescript-eslint": "8.46.4", + "typescript-eslint": "8.47.0", "typescript-plugin-css-modules": "5.2.0" }, "engines": { @@ -6074,17 +6074,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.46.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.4.tgz", - "integrity": "sha512-R48VhmTJqplNyDxCyqqVkFSZIx1qX6PzwqgcXn1olLrzxcSBDlOsbtcnQuQhNtnNiJ4Xe5gREI1foajYaYU2Vg==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.47.0.tgz", + "integrity": "sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.46.4", - "@typescript-eslint/type-utils": "8.46.4", - "@typescript-eslint/utils": "8.46.4", - "@typescript-eslint/visitor-keys": "8.46.4", + "@typescript-eslint/scope-manager": "8.47.0", + "@typescript-eslint/type-utils": "8.47.0", + "@typescript-eslint/utils": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -6098,7 +6098,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.46.4", + "@typescript-eslint/parser": "^8.47.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -6114,17 +6114,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.46.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.4.tgz", - "integrity": "sha512-tK3GPFWbirvNgsNKto+UmB/cRtn6TZfyw0D6IKrW55n6Vbs7KJoZtI//kpTKzE/DUmmnAFD8/Ca46s7Obs92/w==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.47.0.tgz", + "integrity": "sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.46.4", - "@typescript-eslint/types": "8.46.4", - "@typescript-eslint/typescript-estree": "8.46.4", - "@typescript-eslint/visitor-keys": "8.46.4", + "@typescript-eslint/scope-manager": "8.47.0", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0", "debug": "^4.3.4" }, "engines": { @@ -6140,14 +6140,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.46.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.4.tgz", - "integrity": "sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.47.0.tgz", + "integrity": "sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.4", - "@typescript-eslint/types": "^8.46.4", + "@typescript-eslint/tsconfig-utils": "^8.47.0", + "@typescript-eslint/types": "^8.47.0", "debug": "^4.3.4" }, "engines": { @@ -6162,14 +6162,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.4.tgz", - "integrity": "sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.47.0.tgz", + "integrity": "sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.4", - "@typescript-eslint/visitor-keys": "8.46.4" + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6180,9 +6180,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.4.tgz", - "integrity": "sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.47.0.tgz", + "integrity": "sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==", "dev": true, "license": "MIT", "engines": { @@ -6197,15 +6197,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.46.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.4.tgz", - "integrity": "sha512-V4QC8h3fdT5Wro6vANk6eojqfbv5bpwHuMsBcJUJkqs2z5XnYhJzyz9Y02eUmF9u3PgXEUiOt4w4KHR3P+z0PQ==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.47.0.tgz", + "integrity": "sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.4", - "@typescript-eslint/typescript-estree": "8.46.4", - "@typescript-eslint/utils": "8.46.4", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0", + "@typescript-eslint/utils": "8.47.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -6222,9 +6222,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.46.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.4.tgz", - "integrity": "sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.47.0.tgz", + "integrity": "sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==", "dev": true, "license": "MIT", "engines": { @@ -6236,16 +6236,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.4.tgz", - "integrity": "sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.47.0.tgz", + "integrity": "sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.46.4", - "@typescript-eslint/tsconfig-utils": "8.46.4", - "@typescript-eslint/types": "8.46.4", - "@typescript-eslint/visitor-keys": "8.46.4", + "@typescript-eslint/project-service": "8.47.0", + "@typescript-eslint/tsconfig-utils": "8.47.0", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -6291,16 +6291,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.46.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.4.tgz", - "integrity": "sha512-AbSv11fklGXV6T28dp2Me04Uw90R2iJ30g2bgLz529Koehrmkbs1r7paFqr1vPCZi7hHwYxYtxfyQMRC8QaVSg==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.47.0.tgz", + "integrity": "sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.4", - "@typescript-eslint/types": "8.46.4", - "@typescript-eslint/typescript-estree": "8.46.4" + "@typescript-eslint/scope-manager": "8.47.0", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6315,13 +6315,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.4.tgz", - "integrity": "sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.47.0.tgz", + "integrity": "sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/types": "8.47.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -21811,16 +21811,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.46.4", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.4.tgz", - "integrity": "sha512-KALyxkpYV5Ix7UhvjTwJXZv76VWsHG+NjNlt/z+a17SOQSiOcBdUXdbJdyXi7RPxrBFECtFOiPwUJQusJuCqrg==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.47.0.tgz", + "integrity": "sha512-Lwe8i2XQ3WoMjua/r1PHrCTpkubPYJCAfOurtn+mtTzqB6jNd+14n9UN1bJ4s3F49x9ixAm0FLflB/JzQ57M8Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.46.4", - "@typescript-eslint/parser": "8.46.4", - "@typescript-eslint/typescript-estree": "8.46.4", - "@typescript-eslint/utils": "8.46.4" + "@typescript-eslint/eslint-plugin": "8.47.0", + "@typescript-eslint/parser": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0", + "@typescript-eslint/utils": "8.47.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" diff --git a/package.json b/package.json index 8b0a4e0c..d6ffbfaf 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "node-fetch": "3.3.2", "prettier": "3.6.2", "typescript": "5.9.3", - "typescript-eslint": "8.46.4", + "typescript-eslint": "8.47.0", "typescript-plugin-css-modules": "5.2.0" } } From 5e75cffd2b3a1d1b76ae6c2a69b9d8ff6fc542a1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 25 Nov 2025 02:34:40 +0000 Subject: [PATCH 102/190] Update dependency @types/react to v18.3.27 --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1107c5a0..1b4e38eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,7 +39,7 @@ "@docusaurus/module-type-aliases": "3.9.2", "@docusaurus/tsconfig": "3.9.2", "@eslint/js": "9.39.1", - "@types/react": "18.3.26", + "@types/react": "18.3.27", "@types/react-helmet": "6.1.11", "@types/react-router-dom": "5.3.3", "eslint": "9.39.1", @@ -5921,14 +5921,14 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.26", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz", - "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", + "version": "18.3.27", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", + "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", "license": "MIT", "peer": true, "dependencies": { "@types/prop-types": "*", - "csstype": "^3.0.2" + "csstype": "^3.2.2" } }, "node_modules/@types/react-helmet": { @@ -8666,9 +8666,9 @@ "license": "CC0-1.0" }, "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, "node_modules/cytoscape": { diff --git a/package.json b/package.json index 8b0a4e0c..d38018eb 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "@docusaurus/module-type-aliases": "3.9.2", "@docusaurus/tsconfig": "3.9.2", "@eslint/js": "9.39.1", - "@types/react": "18.3.26", + "@types/react": "18.3.27", "@types/react-helmet": "6.1.11", "@types/react-router-dom": "5.3.3", "eslint": "9.39.1", From bf2be375b69a1a06c7f892bb7b85ccd7e02df03d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 25 Nov 2025 02:34:47 +0000 Subject: [PATCH 103/190] Update dependency sass to v1.94.1 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1107c5a0..ddadf8fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "file-loader": "6.2.0", "react": "18.3.1", "react-dom": "18.3.1", - "sass": "1.94.0", + "sass": "1.94.1", "swiper": "12.0.3", "ua-parser-js": "2.0.6", "url-loader": "4.1.1" @@ -20112,9 +20112,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.94.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.94.0.tgz", - "integrity": "sha512-Dqh7SiYcaFtdv5Wvku6QgS5IGPm281L+ZtVD1U2FJa7Q0EFRlq8Z3sjYtz6gYObsYThUOz9ArwFqPZx+1azILQ==", + "version": "1.94.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.94.1.tgz", + "integrity": "sha512-/YVm5FRQaRlr3oNh2LLFYne1PdPlRZGyKnHh1sLleOqLcohTR4eUUvBjBIqkl1fEXd1MGOHgzJGJh+LgTtV4KQ==", "license": "MIT", "peer": true, "dependencies": { diff --git a/package.json b/package.json index 8b0a4e0c..157c6152 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "file-loader": "6.2.0", "react": "18.3.1", "react-dom": "18.3.1", - "sass": "1.94.0", + "sass": "1.94.1", "swiper": "12.0.3", "ua-parser-js": "2.0.6", "url-loader": "4.1.1" From 63e1042d2744432a92fa950cee66c3af3db97cee Mon Sep 17 00:00:00 2001 From: guiweber Date: Tue, 25 Nov 2025 14:51:31 +0100 Subject: [PATCH 104/190] Fixed the Lint issues Fixed the Lint issues even though they were already present in the original file. --- docs/general/server/media/_metadata-images.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/general/server/media/_metadata-images.md b/docs/general/server/media/_metadata-images.md index 4dd7942e..d095259e 100644 --- a/docs/general/server/media/_metadata-images.md +++ b/docs/general/server/media/_metadata-images.md @@ -6,7 +6,6 @@ Images can either be provided as external files within the media folders, or emb Similar to media folders, an artist image can be placed in the root of an artist’s folder. It will be shown both when browsing artists and on the artist’s detail page. - import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -90,7 +89,6 @@ Unless otherwise noted, all filenames can be used either standalone (e.g. `logo. | landscape | Thumb | ✅ | ✅ | ✅ | | ✅ | | | thumb | Thumb | ✅ | ✅ | ✅ | | ✅ | | - 1 For example: `S01E01 Some Episode-thumb.jpg`
2 These file names can also be embedded in supported media containers (e.g. mkv) and will be used when the `Embedded Image Extractor` source is enabled for movies. From 9ed379f8f310c1b93de36785792e942d9c0d1eb9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 26 Nov 2025 15:11:21 +0000 Subject: [PATCH 105/190] Update actions/checkout action to v6 --- .github/workflows/build.yml | 2 +- .github/workflows/lint.yml | 4 ++-- .github/workflows/test.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a55b373c..1a05e2f9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,7 +19,7 @@ jobs: name: Build runs-on: ubuntu-latest steps: - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: ref: ${{ github.event.pull_request.head.sha || github.sha }} - uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 474a0d4f..8bf53b39 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 - name: Set up Node.js uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 @@ -32,7 +32,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out Git repository - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 - name: Set up problem matcher uses: xt0rted/markdownlint-problem-matcher@1a5fabfb577370cfdf5af944d418e4be3ea06f27 # v3.0.0 - name: Run markdownlint diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0e32a6d5..2e545f71 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 - name: Set up Node.js uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 From f71013559dc7fbfb0066efae3501fb7f13cbb85a Mon Sep 17 00:00:00 2001 From: retardgerman <78982850+retardgerman@users.noreply.github.com> Date: Wed, 26 Nov 2025 17:50:47 +0100 Subject: [PATCH 106/190] add streamyfin back to clients list --- src/data/clients.ts | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/data/clients.ts b/src/data/clients.ts index 8e83b300..2701c6ba 100644 --- a/src/data/clients.ts +++ b/src/data/clients.ts @@ -915,6 +915,39 @@ const thirdPartyClients: Array = [ url: 'https://monk-studio.com/finer' } ] + }, + { + id: 'streamyfin', + name: 'Streamyfin', + description: 'A modern Jellyfin client with support for downloads, Live TV, skip intro & credits, trickplay image and more!', + clientType: ClientType.ThirdParty, + deviceTypes: [DeviceType.Mobile], + licenseType: LicenseType.OpenSource, + platforms: [Platform.Android, Platform.IOS], + primaryLinks: [ + { + id: 'play-store', + name: 'Play Store', + url: 'https://play.google.com/store/apps/details?id=com.fredrikburmester.streamyfin' + }, + { + id: 'app-store', + name: 'App Store', + url: 'https://apps.apple.com/app/streamyfin/id6593660679' + } + ], + secondaryLinks: [ + { + id: 'github', + name: 'GitHub', + url: 'https://github.com/streamyfin/streamyfin' + }, + { + id: 'website', + name: 'Website', + url: 'https://streamyfin.app' + } + ] } ]; From 29c1eaea93624f2f72f68b9c851c14ded65002c3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 27 Nov 2025 04:42:44 +0000 Subject: [PATCH 107/190] Update dependency sass to v1.94.2 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6c8de5e7..d0259c20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "file-loader": "6.2.0", "react": "18.3.1", "react-dom": "18.3.1", - "sass": "1.94.1", + "sass": "1.94.2", "swiper": "12.0.3", "ua-parser-js": "2.0.6", "url-loader": "4.1.1" @@ -20112,9 +20112,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.94.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.94.1.tgz", - "integrity": "sha512-/YVm5FRQaRlr3oNh2LLFYne1PdPlRZGyKnHh1sLleOqLcohTR4eUUvBjBIqkl1fEXd1MGOHgzJGJh+LgTtV4KQ==", + "version": "1.94.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.94.2.tgz", + "integrity": "sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A==", "license": "MIT", "peer": true, "dependencies": { diff --git a/package.json b/package.json index e01f5639..ca5e6ee4 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "file-loader": "6.2.0", "react": "18.3.1", "react-dom": "18.3.1", - "sass": "1.94.1", + "sass": "1.94.2", "swiper": "12.0.3", "ua-parser-js": "2.0.6", "url-loader": "4.1.1" From 1506d1db7104151d42043839e0efe3e4e56c1f49 Mon Sep 17 00:00:00 2001 From: ItsAllAboutTheCode <52703+ItsAllAboutTheCode@users.noreply.github.com> Date: Sat, 22 Nov 2025 16:40:12 -0600 Subject: [PATCH 108/190] Adding back documentation for theme-media folders The theme-music and backdrops documentation that details how to use multiple extras of theme media was removed with the the documentation revamp in April 2025. This change adds back the documentation for the `theme-music` and `backdrops` folder. Co-authored-by: felix920506 --- .../server/media/_video-external-extras.md | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/docs/general/server/media/_video-external-extras.md b/docs/general/server/media/_video-external-extras.md index 588cb588..bec0159c 100644 --- a/docs/general/server/media/_video-external-extras.md +++ b/docs/general/server/media/_video-external-extras.md @@ -21,6 +21,8 @@ Supported folder types are: - `other` - Generic catch all for extras of an unknown type. - `extras` - Generic catch all for extras of an unknown type. - `trailers` +- `theme-music` +- `backdrops` ```txt Best_Movie_Ever (2019) @@ -35,10 +37,17 @@ Best_Movie_Ever (2019) Awesome TV Show (2024) ├── Season 1 │ ├── Awesome TV Show (2024) S01E01 episode name.mp4 -│ └── trailers -│ └── trailer1.mp4 -└── interviews - └── Interview with the Director.mp4 +│ ├── trailers +│ │ └── trailer1.mp4 +│ ├── theme-music +│ │ ├── Season 01 OP.mp3 +│ │ └── Season 01 ED.flac +│ └── backdrops +│ └── S1Intro.mkv +├── interviews +│ └── Interview with the Director.mp4 +└── theme-music + └── Series Opening.wav ``` ### File Name From e467e8c016a6ea5ef400e42e670c358923c362e5 Mon Sep 17 00:00:00 2001 From: Niels van Velzen Date: Sun, 30 Nov 2025 10:32:18 +0100 Subject: [PATCH 109/190] Lock markdownlint-cli version using package.json --- .github/workflows/lint.yml | 16 +- package-lock.json | 472 ++++++++++++++++++++++++++++++++++--- package.json | 2 + 3 files changed, 451 insertions(+), 39 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 8bf53b39..531c1240 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -27,13 +27,25 @@ jobs: - name: Run eslint run: npm run lint - lint: + markdownlint: name: Lint Markdown runs-on: ubuntu-latest steps: - name: Check out Git repository uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - name: Set up problem matcher uses: xt0rted/markdownlint-problem-matcher@1a5fabfb577370cfdf5af944d418e4be3ea06f27 # v3.0.0 + + - name: Set up Node.js + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 + with: + node-version: 20 + check-latest: true + cache: npm + + - name: Install Node.js dependencies + run: npm ci --no-audit + - name: Run markdownlint - run: npx --package markdownlint-cli markdownlint '**/*.md' --ignore node_modules + run: npm run lint:markdown diff --git a/package-lock.json b/package-lock.json index d0259c20..96832051 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,6 +52,7 @@ "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "5.2.0", "globals": "16.5.0", + "markdownlint-cli": "0.46.0", "node-fetch": "3.3.2", "prettier": "3.6.2", "typescript": "5.9.3", @@ -120,7 +121,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -1955,7 +1955,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -1978,7 +1977,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -2088,7 +2086,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -2510,7 +2507,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3152,7 +3148,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.2.tgz", "integrity": "sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw==", "license": "MIT", - "peer": true, "dependencies": { "@docusaurus/babel": "3.9.2", "@docusaurus/bundler": "3.9.2", @@ -3358,7 +3353,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", - "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -3502,7 +3496,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.2.tgz", "integrity": "sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag==", "license": "MIT", - "peer": true, "dependencies": { "@docusaurus/mdx-loader": "3.9.2", "@docusaurus/module-type-aliases": "3.9.2", @@ -4103,6 +4096,29 @@ "img-comparison-slider": "~8.0.0" } }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -4363,7 +4379,6 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", - "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -5257,7 +5272,6 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -5831,6 +5845,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/katex": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", + "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", @@ -5925,7 +5946,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -6119,7 +6139,6 @@ "integrity": "sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.47.0", "@typescript-eslint/types": "8.47.0", @@ -6544,7 +6563,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -6612,7 +6630,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -7338,7 +7355,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", @@ -7638,7 +7654,6 @@ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", @@ -8356,7 +8371,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -8676,7 +8690,6 @@ "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10" } @@ -9086,7 +9099,6 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -10098,7 +10110,6 @@ "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -10175,7 +10186,6 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", - "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -13358,9 +13368,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -13418,6 +13428,13 @@ "node": ">=6" } }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, "node_modules/jsonfile": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", @@ -13430,6 +13447,16 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -13678,6 +13705,16 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -13886,6 +13923,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, "node_modules/markdown-table": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", @@ -13896,6 +13951,171 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/markdownlint": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.39.0.tgz", + "integrity": "sha512-Xt/oY7bAiHwukL1iru2np5LIkhwD19Y7frlsiDILK62v3jucXCD6JXlZlwMG12HZOR+roHIVuJZrfCkOhp6k3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark": "4.0.2", + "micromark-core-commonmark": "2.0.3", + "micromark-extension-directive": "4.0.0", + "micromark-extension-gfm-autolink-literal": "2.1.0", + "micromark-extension-gfm-footnote": "2.1.0", + "micromark-extension-gfm-table": "2.1.1", + "micromark-extension-math": "3.1.0", + "micromark-util-types": "2.0.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/DavidAnson" + } + }, + "node_modules/markdownlint-cli": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.46.0.tgz", + "integrity": "sha512-4gxTNzPjpLnY7ftrEZD4flPY0QBkQLiqezb6KURFSkV+vPHFOsYw8OMtY6fu82Yt8ghtSrWegpYdq1ix25VFLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "~14.0.2", + "deep-extend": "~0.6.0", + "ignore": "~7.0.5", + "js-yaml": "~4.1.1", + "jsonc-parser": "~3.3.1", + "jsonpointer": "~5.0.1", + "markdown-it": "~14.1.0", + "markdownlint": "~0.39.0", + "minimatch": "~10.1.1", + "run-con": "~1.3.2", + "smol-toml": "~1.5.2", + "tinyglobby": "~0.2.15" + }, + "bin": { + "markdownlint": "markdownlint.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/markdownlint-cli/node_modules/commander": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/markdownlint-cli/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/markdownlint-cli/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/markdownlint/node_modules/micromark-extension-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", + "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/markdownlint/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/markdownlint/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/markdownlint/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/marked": { "version": "16.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-16.3.0.tgz", @@ -14325,6 +14545,13 @@ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", "license": "CC0-1.0" }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true, + "license": "MIT" + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -15006,6 +15233,85 @@ ], "license": "MIT" }, + "node_modules/micromark-extension-math": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", + "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/katex": "^0.16.0", + "devlop": "^1.0.0", + "katex": "^0.16.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-math/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-math/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-math/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/micromark-extension-mdx-expression": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", @@ -17382,7 +17688,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -18326,7 +18631,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -18880,7 +19184,6 @@ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -19030,6 +19333,16 @@ "node": ">=6" } }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/pupa": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", @@ -19197,7 +19510,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -19210,7 +19522,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -19255,7 +19566,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/react": "*" }, @@ -19284,7 +19594,6 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -19987,6 +20296,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/run-con": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.3.2.tgz", + "integrity": "sha512-CcfE+mYiTcKEzg0IqS08+efdnH0oJ3zV0wSUFBNrMHMuxCtXvBCLzCJHatwuXDcu/RlhjTziTo/a1ruQik6/Yg==", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~4.1.0", + "minimist": "^1.2.8", + "strip-json-comments": "~3.1.1" + }, + "bin": { + "run-con": "cli.js" + } + }, + "node_modules/run-con/node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -20116,7 +20451,6 @@ "resolved": "https://registry.npmjs.org/sass/-/sass-1.94.2.tgz", "integrity": "sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A==", "license": "MIT", - "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -20245,7 +20579,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -20763,6 +21096,19 @@ "node": ">=8" } }, + "node_modules/smol-toml": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.5.2.tgz", + "integrity": "sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, "node_modules/snake-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", @@ -21483,6 +21829,54 @@ "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", "license": "MIT" }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tinypool": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", @@ -21646,8 +22040,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", @@ -21801,7 +22194,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -21930,6 +22322,13 @@ "node": "*" } }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true, + "license": "MIT" + }, "node_modules/ufo": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", @@ -22527,7 +22926,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.0.tgz", "integrity": "sha512-hUtqAR3ZLVEYDEABdBioQCIqSoguHbFn1K7WlPPWSuXmx0031BD73PSE35jKyftdSh4YLDoQNgK4pqBt5Q82MA==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", diff --git a/package.json b/package.json index ca5e6ee4..2abc772e 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "write-translations": "docusaurus write-translations", "write-heading-ids": "docusaurus write-heading-ids", "lint": "eslint --ext .ts,.js,.json,.jsx,.tsx .", + "lint:markdown": "markdownlint **/*.md --ignore node_modules", "test:blog-urls": "node ./scripts/check-urls.mjs ./scripts/data/jellyfin-blog-urls.json", "test:docs-urls": "node ./scripts/check-urls.mjs ./scripts/data/jellyfin-docs-urls.json", "test:web-urls": "node ./scripts/check-urls.mjs ./scripts/data/jellyfin-web-urls.json" @@ -77,6 +78,7 @@ "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "5.2.0", "globals": "16.5.0", + "markdownlint-cli": "0.46.0", "node-fetch": "3.3.2", "prettier": "3.6.2", "typescript": "5.9.3", From da8fac8d2f608a9583f16b323bf474b4952c6178 Mon Sep 17 00:00:00 2001 From: Violet Caulfield <42452695+anultravioletaurora@users.noreply.github.com> Date: Sun, 30 Nov 2025 14:38:35 -0600 Subject: [PATCH 110/190] Add Jellify to Third Party Clients list --- src/data/clients.ts | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/data/clients.ts b/src/data/clients.ts index 67e19f30..65ef011d 100644 --- a/src/data/clients.ts +++ b/src/data/clients.ts @@ -994,6 +994,39 @@ const thirdPartyClients: Array = [ url: 'https://monk-studio.com/finer' } ] + }, + { + id: 'jellify', + name: 'Jellify', + description: 'A free and open source music player available for iOS and Android', + clientType: ClientType.ThirdParty, + deviceTypes: [DeviceType.Mobile, DeviceType.Desktop], + licenseType: LicenseType.OpenSource, + platforms: [Platform.MacOS, Platform.IOS, Platform.Android], + primaryLinks: [ + { + id: 'app-store', + name: 'App Store', + url: '', + }, + { + id: 'google-play', + name: 'Google Play', + url: 'https://play.google.com/store/apps/details?id=com.cosmonautical.jellify' + } + ], + secondaryLinks: [ + { + id: 'website', + name: 'Website', + url: 'https://jellify.app' + }, + { + id: 'github', + name: 'GitHub', + url: 'https://github.com/Jellify-Music/App' + } + ] } ]; From ae6ef24dec028a6be498b02162328c96bd182d9b Mon Sep 17 00:00:00 2001 From: DeuSCaNoN Date: Sun, 30 Nov 2025 21:42:37 -0800 Subject: [PATCH 111/190] Create chapter-images.md Document for Chapter Image feature --- .../general/server/metadata/chapter-images.md | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 docs/general/server/metadata/chapter-images.md diff --git a/docs/general/server/metadata/chapter-images.md b/docs/general/server/metadata/chapter-images.md new file mode 100644 index 00000000..76aded90 --- /dev/null +++ b/docs/general/server/metadata/chapter-images.md @@ -0,0 +1,30 @@ +--- +uid: server-metadata-chapter-images +title: Chapter Images +--- +NOTE: Not to be confused with chapters, which are the ticks you see in the timeline when watching a video. Chapter Images must be enabled; chapters can be displayed even when Chapter Images are disabled. + +# Chapter Images +Chapter images are a type of metadata for video media files stored in Jellyfin. They are images that correspond with chapters and give a preview of the video at that timestamp. +Jellyfin stores the chapter data in `/config/metadata/library///chapters'. + +# Getting Started +The feature is enabled per library. There are 2 ways to get to the library settings +1. When you add a new library, pick a video Content type, then scroll down to the bottom where you see "Chapter Images" +2. Click the 3 dots of an existing library and scroll down to the bottom where you see "Chapter Images" + +## Enable chapter image extraction +This will enable the Chapter image feature. + +## Extract chapter images during the library scan +This will change the scheduled extraction to happen in the "Scan Media Library" task instead of the "Extract Chapter Images" task. + +# Other Settings +In the dashboard, you can configure other behaviours of the chapter image feature. These settings are found in Libraries -> Metadata + +## Interval +This creates chapters at a given interval (0 will disable dummy chapters) if no chapters are detected in the media file. +NOTE: Not recommended to use small values here. This could slow down starting the video stream as the GUI will try to render all the chapters on the timeline. + +## Resolution +This will set the resolution of the image files that are extracted From a5fade198496bf7e60c8f22fff087951b05f3272 Mon Sep 17 00:00:00 2001 From: DeuSCaNoN Date: Sun, 30 Nov 2025 22:00:18 -0800 Subject: [PATCH 112/190] Small tweaks chapter-images.md Change some wording of phrases --- docs/general/server/metadata/chapter-images.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/general/server/metadata/chapter-images.md b/docs/general/server/metadata/chapter-images.md index 76aded90..4652f7fa 100644 --- a/docs/general/server/metadata/chapter-images.md +++ b/docs/general/server/metadata/chapter-images.md @@ -2,16 +2,16 @@ uid: server-metadata-chapter-images title: Chapter Images --- -NOTE: Not to be confused with chapters, which are the ticks you see in the timeline when watching a video. Chapter Images must be enabled; chapters can be displayed even when Chapter Images are disabled. +NOTE: Not to be confused with chapters, which are the ticks you see in the timeline when watching a video. Chapter Images must be enabled to be displayed; chapters can be displayed even when Chapter Images are disabled. # Chapter Images Chapter images are a type of metadata for video media files stored in Jellyfin. They are images that correspond with chapters and give a preview of the video at that timestamp. -Jellyfin stores the chapter data in `/config/metadata/library///chapters'. +Jellyfin stores the chapter images within the metadata directory, which should be located inside your server's config directory. # Getting Started The feature is enabled per library. There are 2 ways to get to the library settings 1. When you add a new library, pick a video Content type, then scroll down to the bottom where you see "Chapter Images" -2. Click the 3 dots of an existing library and scroll down to the bottom where you see "Chapter Images" +2. Click the 3 dots of an existing library and scroll down to the bottom, where you see "Chapter Images" ## Enable chapter image extraction This will enable the Chapter image feature. From c2368981571c75b3b4e9c27416c571c3aead0bdc Mon Sep 17 00:00:00 2001 From: DeuSCaNoN Date: Sun, 30 Nov 2025 22:06:31 -0800 Subject: [PATCH 113/190] chapter-images.md tweaks --- docs/general/server/metadata/chapter-images.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/general/server/metadata/chapter-images.md b/docs/general/server/metadata/chapter-images.md index 4652f7fa..f2168c4e 100644 --- a/docs/general/server/metadata/chapter-images.md +++ b/docs/general/server/metadata/chapter-images.md @@ -23,8 +23,8 @@ This will change the scheduled extraction to happen in the "Scan Media Library" In the dashboard, you can configure other behaviours of the chapter image feature. These settings are found in Libraries -> Metadata ## Interval -This creates chapters at a given interval (0 will disable dummy chapters) if no chapters are detected in the media file. -NOTE: Not recommended to use small values here. This could slow down starting the video stream as the GUI will try to render all the chapters on the timeline. +This creates dummy chapters at a given interval (0 will disable dummy chapters) if no chapters are detected in the media file. The value is in seconds. +NOTE: Not recommended to use small values here. Small intervals could slow down video playback as Jellyfin's webUI video player will try to render all the chapters on the timeline. ## Resolution This will set the resolution of the image files that are extracted From af0b6c964bee494e67cdd8e08a453577c381e439 Mon Sep 17 00:00:00 2001 From: DeuSCaNoN Date: Mon, 1 Dec 2025 15:21:26 -0800 Subject: [PATCH 114/190] Format chapter-images.md Make document easier to read --- docs/general/server/metadata/chapter-images.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/general/server/metadata/chapter-images.md b/docs/general/server/metadata/chapter-images.md index f2168c4e..00179e18 100644 --- a/docs/general/server/metadata/chapter-images.md +++ b/docs/general/server/metadata/chapter-images.md @@ -6,6 +6,7 @@ NOTE: Not to be confused with chapters, which are the ticks you see in the timel # Chapter Images Chapter images are a type of metadata for video media files stored in Jellyfin. They are images that correspond with chapters and give a preview of the video at that timestamp. + Jellyfin stores the chapter images within the metadata directory, which should be located inside your server's config directory. # Getting Started @@ -13,18 +14,19 @@ The feature is enabled per library. There are 2 ways to get to the library setti 1. When you add a new library, pick a video Content type, then scroll down to the bottom where you see "Chapter Images" 2. Click the 3 dots of an existing library and scroll down to the bottom, where you see "Chapter Images" -## Enable chapter image extraction +### Enable chapter image extraction This will enable the Chapter image feature. -## Extract chapter images during the library scan +### Extract chapter images during the library scan This will change the scheduled extraction to happen in the "Scan Media Library" task instead of the "Extract Chapter Images" task. # Other Settings In the dashboard, you can configure other behaviours of the chapter image feature. These settings are found in Libraries -> Metadata -## Interval +### Interval This creates dummy chapters at a given interval (0 will disable dummy chapters) if no chapters are detected in the media file. The value is in seconds. + NOTE: Not recommended to use small values here. Small intervals could slow down video playback as Jellyfin's webUI video player will try to render all the chapters on the timeline. -## Resolution +### Resolution This will set the resolution of the image files that are extracted From 72be231c09cd59d5eb6d1faf2559e6056dd9df1c Mon Sep 17 00:00:00 2001 From: Niels van Velzen Date: Tue, 2 Dec 2025 19:12:50 +0100 Subject: [PATCH 115/190] Remove DigitalOcean from sponsors section --- src/pages/contribute.module.scss | 13 ------------- src/pages/contribute.tsx | 11 +---------- 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/src/pages/contribute.module.scss b/src/pages/contribute.module.scss index d2f5501f..51dfc36e 100644 --- a/src/pages/contribute.module.scss +++ b/src/pages/contribute.module.scss @@ -1,16 +1,3 @@ -.button--digitalocean { - background-color: #0080ff; - border-color: #0080ff; -} -.button--digitalocean:hover { - background-color: #0073e6; - border-color: #0073e6; -} -.button--digitalocean:active { - background-color: #006dd9; - border-color: #006dd9; -} - .button--jetbrains { background-color: #fff; border-color: #fff; diff --git a/src/pages/contribute.tsx b/src/pages/contribute.tsx index dd328e55..a25cd622 100644 --- a/src/pages/contribute.tsx +++ b/src/pages/contribute.tsx @@ -1,5 +1,5 @@ import Link from '@docusaurus/Link'; -import { SiDigitalocean, SiJetbrains } from '@icons-pack/react-simple-icons'; +import { SiJetbrains } from '@icons-pack/react-simple-icons'; import Layout from '@theme/Layout'; import clsx from 'clsx'; import React from 'react'; @@ -53,15 +53,6 @@ export default function Contribute() {

Sponsors

- - - DigitalOcean - - Date: Tue, 2 Dec 2025 21:47:03 -0500 Subject: [PATCH 116/190] Add backup link (#1682) --- scripts/data/jellyfin-web-urls.json | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/data/jellyfin-web-urls.json b/scripts/data/jellyfin-web-urls.json index 98b00f8c..7083e6fa 100644 --- a/scripts/data/jellyfin-web-urls.json +++ b/scripts/data/jellyfin-web-urls.json @@ -1,4 +1,5 @@ [ + "/docs/general/administration/backup-and-restore", "/docs/general/administration/hardware-acceleration.html", "/docs/general/administration/hardware-acceleration/intel", "/docs/general/contributing/index.html", From fbdb4d786e82dc1e30b5ce62d37fb6f3792ee090 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 07:37:08 +0000 Subject: [PATCH 117/190] Update CI dependencies --- .github/workflows/build.yml | 4 ++-- .github/workflows/lint.yml | 8 ++++---- .github/workflows/test.yml | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1a05e2f9..dc1ef9fc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,10 +19,10 @@ jobs: name: Build runs-on: ubuntu-latest steps: - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: ref: ${{ github.event.pull_request.head.sha || github.sha }} - - uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 + - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 with: cache: npm node-version: 20 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 531c1240..4cce1426 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -12,10 +12,10 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Set up Node.js - uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 + uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 with: node-version: 20 check-latest: true @@ -32,13 +32,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out Git repository - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Set up problem matcher uses: xt0rted/markdownlint-problem-matcher@1a5fabfb577370cfdf5af944d418e4be3ea06f27 # v3.0.0 - name: Set up Node.js - uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 + uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 with: node-version: 20 check-latest: true diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2e545f71..9a175385 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,10 +20,10 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Set up Node.js - uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 + uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 with: node-version: 20 check-latest: true From a6cedb0aeb2760ec4a50603ac622191ddf8f0316 Mon Sep 17 00:00:00 2001 From: Violet Caulfield <42452695+anultravioletaurora@users.noreply.github.com> Date: Wed, 3 Dec 2025 14:39:35 -0600 Subject: [PATCH 118/190] add App Store link --- src/data/clients.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/clients.ts b/src/data/clients.ts index 65ef011d..3b7f1481 100644 --- a/src/data/clients.ts +++ b/src/data/clients.ts @@ -1007,7 +1007,7 @@ const thirdPartyClients: Array = [ { id: 'app-store', name: 'App Store', - url: '', + url: 'https://apps.apple.com/us/app/jellify/id6736884612', }, { id: 'google-play', From 26b393b5f64a8bf3c8ef5c74ec466492c6dacf08 Mon Sep 17 00:00:00 2001 From: Violet Caulfield <42452695+anultravioletaurora@users.noreply.github.com> Date: Wed, 3 Dec 2025 14:48:52 -0600 Subject: [PATCH 119/190] set GH link as primary secondary link --- src/data/clients.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/data/clients.ts b/src/data/clients.ts index 3b7f1481..392c4dee 100644 --- a/src/data/clients.ts +++ b/src/data/clients.ts @@ -1016,15 +1016,15 @@ const thirdPartyClients: Array = [ } ], secondaryLinks: [ - { - id: 'website', - name: 'Website', - url: 'https://jellify.app' - }, { id: 'github', name: 'GitHub', url: 'https://github.com/Jellify-Music/App' + }, + { + id: 'website', + name: 'Website', + url: 'https://jellify.app' } ] } From 7c6ac5cef78dc841572ea0af37540943fa44cf6d Mon Sep 17 00:00:00 2001 From: Violet Caulfield <42452695+anultravioletaurora@users.noreply.github.com> Date: Wed, 3 Dec 2025 15:22:30 -0600 Subject: [PATCH 120/190] Update clients.ts --- src/data/clients.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/clients.ts b/src/data/clients.ts index d995c753..3de5c913 100644 --- a/src/data/clients.ts +++ b/src/data/clients.ts @@ -921,9 +921,9 @@ const thirdPartyClients: Array = [ name: 'Jellify', description: 'A free and open source music player available for iOS and Android', clientType: ClientType.ThirdParty, - deviceTypes: [DeviceType.Mobile, DeviceType.Desktop], + deviceTypes: [DeviceType.Mobile], licenseType: LicenseType.OpenSource, - platforms: [Platform.MacOS, Platform.IOS, Platform.Android], + platforms: [Platform.IOS, Platform.Android], primaryLinks: [ { id: 'app-store', From 45a6bc8cd5b03e04073d1fd7d6306d2252e49ba8 Mon Sep 17 00:00:00 2001 From: Austin Riba Date: Thu, 4 Dec 2025 23:02:15 -0800 Subject: [PATCH 121/190] Add Gelly client --- src/data/clients.ts | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/data/clients.ts b/src/data/clients.ts index 8e83b300..e46efb7a 100644 --- a/src/data/clients.ts +++ b/src/data/clients.ts @@ -915,6 +915,29 @@ const thirdPartyClients: Array = [ url: 'https://monk-studio.com/finer' } ] + }, + { + id: 'gelly', + name: 'Gelly', + description: 'A light, native music client for Linux.', + clientType: ClientType.ThirdParty, + deviceTypes: [DeviceType.Desktop], + licenseType: LicenseType.OpenSource, + platforms: [Platform.Desktop, Platform.Linux], + primaryLinks: [ + { + id: 'flathub', + name: 'Flathub (Linux)', + url: 'https://flathub.org/apps/details/io.m51.Gelly' + } + ], + secondaryLinks: [ + { + id: 'github', + name: 'Github', + url: 'https://github.com/Fingel/gelly' + } + ] } ]; From 304019c60f886d232af8e54ee97d08aed6cfe64d Mon Sep 17 00:00:00 2001 From: retardgerman <78982850+retardgerman@users.noreply.github.com> Date: Fri, 5 Dec 2025 20:57:50 +0100 Subject: [PATCH 122/190] Resolve merge conflict in clients.ts --- src/data/clients.ts | 56 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/data/clients.ts b/src/data/clients.ts index 2701c6ba..70dcd374 100644 --- a/src/data/clients.ts +++ b/src/data/clients.ts @@ -948,6 +948,62 @@ const thirdPartyClients: Array = [ url: 'https://streamyfin.app' } ] + }, + { + id: 'gelly', + name: 'Gelly', + description: 'A light, native music client for Linux.', + clientType: ClientType.ThirdParty, + deviceTypes: [DeviceType.Desktop], + licenseType: LicenseType.OpenSource, + platforms: [Platform.Desktop, Platform.Linux], + primaryLinks: [ + { + id: 'flathub', + name: 'Flathub (Linux)', + url: 'https://flathub.org/apps/details/io.m51.Gelly' + } + ], + secondaryLinks: [ + { + id: 'github', + name: 'Github', + url: 'https://github.com/Fingel/gelly' + } + ] + }, + { + id: 'jellify', + name: 'Jellify', + description: 'A free and open source music player available for iOS and Android', + clientType: ClientType.ThirdParty, + deviceTypes: [DeviceType.Mobile], + licenseType: LicenseType.OpenSource, + platforms: [Platform.IOS, Platform.Android], + primaryLinks: [ + { + id: 'app-store', + name: 'App Store', + url: 'https://apps.apple.com/us/app/jellify/id6736884612' + }, + { + id: 'google-play', + name: 'Google Play', + url: 'https://play.google.com/store/apps/details?id=com.cosmonautical.jellify' + } + ], + secondaryLinks: [ + { + id: 'github', + name: 'GitHub', + url: 'https://github.com/Jellify-Music/App' + }, + { + id: 'website', + name: 'Website', + url: 'https://jellify.app' + } + ] } ]; From b485f4e0637f6ddee82526e95dc9f81bde02c405 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Fern=C3=A1ndez?= Date: Sun, 14 Dec 2025 20:17:36 +0100 Subject: [PATCH 123/190] Update Watchtower reference to fork (#1691) Signed-off-by: GitHub --- docs/general/clients/jellyfin-vue.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/general/clients/jellyfin-vue.md b/docs/general/clients/jellyfin-vue.md index be8ee9c1..6d872780 100644 --- a/docs/general/clients/jellyfin-vue.md +++ b/docs/general/clients/jellyfin-vue.md @@ -54,7 +54,7 @@ services: watchtower: container_name: watchtower - image: ghcr.io/containrrr/watchtower + image: ghcr.io/nicholas-fedor/watchtower volumes: - /var/run/docker.sock:/var/run/docker.sock environment: @@ -77,7 +77,9 @@ located where the `docker-compose.yml` file is. With this compose file: - Jellyfin Vue will be accessible on `8080` port of the machine that's running the containers -- Watchtower takes care of updating the container to the latest commit available on the [repository](https://github.com/jellyfin/jellyfin-vue). +- Watchtower (fork, [the original is unmaintained](https://github.com/containrrr/watchtower/issues/2067)) +takes care of updating the container to the latest commit available on the +[repository](https://github.com/jellyfin/jellyfin-vue). This is a good idea because: - As of now, stable releases don't exist and there have only been prereleases that don't necessarily meet a quality criteria, but [major development milestones](https://jellyfin.org/posts/vue-vue3/). From 0daaf908f69d49ee6c02bc4c478f33893f3b6af4 Mon Sep 17 00:00:00 2001 From: etki Date: Wed, 19 Nov 2025 21:40:37 +0100 Subject: [PATCH 124/190] Detailed specifics of multiversioned media folder structure --- docs/general/server/media/_video-multiversion.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/server/media/_video-multiversion.md b/docs/general/server/media/_video-multiversion.md index 9cc32b25..6f94f36a 100644 --- a/docs/general/server/media/_video-multiversion.md +++ b/docs/general/server/media/_video-multiversion.md @@ -2,7 +2,7 @@ ## Multiple Versions -Multiple versions of the same video can be stored together in the library using a file suffix in Movie and Music Video library types. The part before any suffixes **MUST** be exactly the same, including any years and/or metadata provider IDs. +Jellyfin supports storing multiple versions of the same video within a single movie folder by using filename suffixes. Each file **must** begin exactly with the parent folder name - including any year and/or metadata provider IDs - before adding a version label. This prefix must match character-for-character; otherwise, the files will be treated as separate movies. ```txt Movie (2021) [imdbid-tt12801262] From 6afdf672f8e9a25332b8027ec606ec5696069a86 Mon Sep 17 00:00:00 2001 From: Chris Hodapp <108633+clhodapp@users.noreply.github.com> Date: Thu, 18 Dec 2025 21:48:36 -0800 Subject: [PATCH 125/190] Remove outdated warnings about Kodi native mode --- docs/general/clients/kodi.md | 36 +++--------------------------------- 1 file changed, 3 insertions(+), 33 deletions(-) diff --git a/docs/general/clients/kodi.md b/docs/general/clients/kodi.md index e4d57760..07467278 100644 --- a/docs/general/clients/kodi.md +++ b/docs/general/clients/kodi.md @@ -91,40 +91,9 @@ To use Add-on mode, simply choose "Add-on" at the dialog and proceed to [Library #### Native Mode -:::caution - -Do not use Native mode! Use Addon-mode instead. - -Jellyfin 10.10 no longer provides the shared network folder via the API, and as such native mode does not get the required information to function. - -::: Native mode accesses your media files directly from the filesystem, bypassing the Jellyfin server during playback. Native mode needs more setup and configuration, but it can, on rare occasions, lead to better performance where network bandwidth is a limitation. It requires your media to be available to the device Kodi is running on over either NFS or Samba, and therefore should only be used on a LAN or over a VPN connection. -To use Native mode, first set up your libraries in Jellyfin with a remote path. - -:::caution - -Starting from Jellyfin 10.9 it is no longer possible to set the shared network folder. - -::: - -1. In the Jellyfin server, navigate to the Libraries section of the admin dashboard. - - Select an existing library (or create a new one) - - Select the media folder - - Enter the path to your network share in the "Shared network folder" textbox - - Possible formats: - - NFS - - `nfs://192.168.0.10:/path/to/media` - - Samba - - Guest User - `\\192.168.0.10\share_name` - - Custom User (Not Recommended) - `\\user:password@192.168.0.10\share_name` - - It's more secure to use the generic Guest mapping here and specify credentials from within Kodi - - Mounted share - - If you have mounted your network share, you can reference the local mount point. This can be more performant but generally means it only works for one type of operating system, given the difference between the file systems - - `/mnt/media` (Linux) - - `Z:\media` (Windows) - - `/Volumes/media` (Mac OS) -2. Configure libraries in Kodi +1. Configure libraries in Kodi - Skip the initial library selection. We need to add file shares to Kodi first - Within Kodi, navigate to the settings menu and select "File manager" - Select "Add source" @@ -134,7 +103,8 @@ Starting from Jellyfin 10.9 it is no longer possible to set the shared network f - Select your newly created location and choose "Ok" - Give your media source a name and choose "Ok" - Go to Add-ons -> Jellyfin -> Manage Libraries -> Add Libraries -3. Proceed to [Library Syncing](/docs/general/clients/kodi#library-syncing) +2. Proceed to [Library Syncing](/docs/general/clients/kodi#library-syncing) +3. Make sure to set up path replacements to rewrite paths on your Jellyfin server to the correct paths on your network share #### Library Syncing From 89d7a76a0de0c6a10658520d827cf6348fce0a97 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 19 Dec 2025 08:01:05 +0100 Subject: [PATCH 126/190] Update dependency markdownlint-cli to v0.47.0 (#1696) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 114 ++++++++++++++++++++++++++++++++++++++++++---- package.json | 2 +- 2 files changed, 105 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 96832051..78dba338 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,7 @@ "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "5.2.0", "globals": "16.5.0", - "markdownlint-cli": "0.46.0", + "markdownlint-cli": "0.47.0", "node-fetch": "3.3.2", "prettier": "3.6.2", "typescript": "5.9.3", @@ -121,6 +121,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -1955,6 +1956,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -1977,6 +1979,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -2086,6 +2089,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -2507,6 +2511,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3148,6 +3153,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.2.tgz", "integrity": "sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/babel": "3.9.2", "@docusaurus/bundler": "3.9.2", @@ -3353,6 +3359,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -3496,6 +3503,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.2.tgz", "integrity": "sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/mdx-loader": "3.9.2", "@docusaurus/module-type-aliases": "3.9.2", @@ -4379,6 +4387,7 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", + "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -5272,6 +5281,7 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -5946,6 +5956,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -6139,6 +6150,7 @@ "integrity": "sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.47.0", "@typescript-eslint/types": "8.47.0", @@ -6563,6 +6575,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -6630,6 +6643,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -7355,6 +7369,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", @@ -7654,6 +7669,7 @@ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", @@ -8371,6 +8387,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -8690,6 +8707,7 @@ "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10" } @@ -9099,6 +9117,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -10110,6 +10129,7 @@ "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -10186,6 +10206,7 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", + "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -11422,6 +11443,19 @@ "node": ">=6.9.0" } }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -13952,9 +13986,9 @@ } }, "node_modules/markdownlint": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.39.0.tgz", - "integrity": "sha512-Xt/oY7bAiHwukL1iru2np5LIkhwD19Y7frlsiDILK62v3jucXCD6JXlZlwMG12HZOR+roHIVuJZrfCkOhp6k3g==", + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.40.0.tgz", + "integrity": "sha512-UKybllYNheWac61Ia7T6fzuQNDZimFIpCg2w6hHjgV1Qu0w1TV0LlSgryUGzM0bkKQCBhy2FDhEELB73Kb0kAg==", "dev": true, "license": "MIT", "dependencies": { @@ -13965,7 +13999,8 @@ "micromark-extension-gfm-footnote": "2.1.0", "micromark-extension-gfm-table": "2.1.1", "micromark-extension-math": "3.1.0", - "micromark-util-types": "2.0.2" + "micromark-util-types": "2.0.2", + "string-width": "8.1.0" }, "engines": { "node": ">=20" @@ -13975,9 +14010,9 @@ } }, "node_modules/markdownlint-cli": { - "version": "0.46.0", - "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.46.0.tgz", - "integrity": "sha512-4gxTNzPjpLnY7ftrEZD4flPY0QBkQLiqezb6KURFSkV+vPHFOsYw8OMtY6fu82Yt8ghtSrWegpYdq1ix25VFLQ==", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.47.0.tgz", + "integrity": "sha512-HOcxeKFAdDoldvoYDofd85vI8LgNWy8vmYpCwnlLV46PJcodmGzD7COSSBlhHwsfT4o9KrAStGodImVBus31Bg==", "dev": true, "license": "MIT", "dependencies": { @@ -13988,7 +14023,7 @@ "jsonc-parser": "~3.3.1", "jsonpointer": "~5.0.1", "markdown-it": "~14.1.0", - "markdownlint": "~0.39.0", + "markdownlint": "~0.40.0", "minimatch": "~10.1.1", "run-con": "~1.3.2", "smol-toml": "~1.5.2", @@ -14037,6 +14072,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/markdownlint/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/markdownlint/node_modules/micromark-extension-directive": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", @@ -14116,6 +14164,39 @@ ], "license": "MIT" }, + "node_modules/markdownlint/node_modules/string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdownlint/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/marked": { "version": "16.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-16.3.0.tgz", @@ -17688,6 +17769,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -18631,6 +18713,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -19184,6 +19267,7 @@ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -19510,6 +19594,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -19522,6 +19607,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -19566,6 +19652,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/react": "*" }, @@ -19594,6 +19681,7 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -20451,6 +20539,7 @@ "resolved": "https://registry.npmjs.org/sass/-/sass-1.94.2.tgz", "integrity": "sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A==", "license": "MIT", + "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -20579,6 +20668,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -21870,6 +21960,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -22040,7 +22131,8 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/type-check": { "version": "0.4.0", @@ -22194,6 +22286,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -22926,6 +23019,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.0.tgz", "integrity": "sha512-hUtqAR3ZLVEYDEABdBioQCIqSoguHbFn1K7WlPPWSuXmx0031BD73PSE35jKyftdSh4YLDoQNgK4pqBt5Q82MA==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", diff --git a/package.json b/package.json index 2abc772e..d5bc7d36 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "5.2.0", "globals": "16.5.0", - "markdownlint-cli": "0.46.0", + "markdownlint-cli": "0.47.0", "node-fetch": "3.3.2", "prettier": "3.6.2", "typescript": "5.9.3", From eb0f11b8352f874b50888472b506b007abc94e63 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 19 Dec 2025 08:01:15 +0100 Subject: [PATCH 127/190] Update dependency ua-parser-js to v2.0.7 (#1694) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 78dba338..0032b0cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "react-dom": "18.3.1", "sass": "1.94.2", "swiper": "12.0.3", - "ua-parser-js": "2.0.6", + "ua-parser-js": "2.0.7", "url-loader": "4.1.1" }, "devDependencies": { @@ -22385,9 +22385,9 @@ "license": "MIT" }, "node_modules/ua-parser-js": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-2.0.6.tgz", - "integrity": "sha512-EmaxXfltJaDW75SokrY4/lXMrVyXomE/0FpIIqP2Ctic93gK7rlme55Cwkz8l3YZ6gqf94fCU7AnIkidd/KXPg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-2.0.7.tgz", + "integrity": "sha512-CFdHVHr+6YfbktNZegH3qbYvYgC7nRNEUm2tk7nSFXSODUu4tDBpaFpP1jdXBUOKKwapVlWRfTtS8bCPzsQ47w==", "funding": [ { "type": "opencollective", diff --git a/package.json b/package.json index d5bc7d36..bbfdf2bb 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "react-dom": "18.3.1", "sass": "1.94.2", "swiper": "12.0.3", - "ua-parser-js": "2.0.6", + "ua-parser-js": "2.0.7", "url-loader": "4.1.1" }, "browserslist": { From 46277363337f90f5842aaf6bd149a9df960f756b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 19 Dec 2025 08:01:46 +0100 Subject: [PATCH 128/190] Update dependency sass to v1.96.0 (#1693) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0032b0cd..7b7b2066 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "file-loader": "6.2.0", "react": "18.3.1", "react-dom": "18.3.1", - "sass": "1.94.2", + "sass": "1.96.0", "swiper": "12.0.3", "ua-parser-js": "2.0.7", "url-loader": "4.1.1" @@ -20535,9 +20535,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.94.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.94.2.tgz", - "integrity": "sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.96.0.tgz", + "integrity": "sha512-8u4xqqUeugGNCYwr9ARNtQKTOj4KmYiJAVKXf2CTIivTCR51j96htbMKWDru8H5SaQWpyVgTfOF8Ylyf5pun1Q==", "license": "MIT", "peer": true, "dependencies": { diff --git a/package.json b/package.json index bbfdf2bb..2e335567 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "file-loader": "6.2.0", "react": "18.3.1", "react-dom": "18.3.1", - "sass": "1.94.2", + "sass": "1.96.0", "swiper": "12.0.3", "ua-parser-js": "2.0.7", "url-loader": "4.1.1" From 3b5adb7547e78bc88327ffbf633586fe2c0e8e06 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 19 Dec 2025 08:02:06 +0100 Subject: [PATCH 129/190] Update dependency @easyops-cn/docusaurus-search-local to v0.52.2 (#1688) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7b7b2066..6d362b98 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "@docusaurus/plugin-svgr": "3.9.2", "@docusaurus/theme-classic": "3.9.2", "@docusaurus/theme-mermaid": "3.9.2", - "@easyops-cn/docusaurus-search-local": "0.52.1", + "@easyops-cn/docusaurus-search-local": "0.52.2", "@fontsource/noto-sans": "5.2.10", "@icons-pack/react-simple-icons": "13.8.0", "@img-comparison-slider/react": "8.0.2", @@ -3686,9 +3686,9 @@ } }, "node_modules/@easyops-cn/docusaurus-search-local": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.52.1.tgz", - "integrity": "sha512-pwfANjTLOQyAPc2Iz93WbG4OQM5C4COCWARbLAs79FIpIS38gHq3PrbDIX8f7oDhGQp1u6f8fr3K3u3+yZXZTA==", + "version": "0.52.2", + "resolved": "https://registry.npmjs.org/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.52.2.tgz", + "integrity": "sha512-oEHkHe/OWHFcJxOhicS5UqohDOyPieREH+oNoImL/VcdrPzDxT2LB5Scov6WMOpOyDcSMJ6QCvjj63PEhhU8Nw==", "license": "MIT", "dependencies": { "@docusaurus/plugin-content-docs": "^2 || ^3", diff --git a/package.json b/package.json index 2e335567..fc2a7b37 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@docusaurus/plugin-svgr": "3.9.2", "@docusaurus/theme-classic": "3.9.2", "@docusaurus/theme-mermaid": "3.9.2", - "@easyops-cn/docusaurus-search-local": "0.52.1", + "@easyops-cn/docusaurus-search-local": "0.52.2", "@fontsource/noto-sans": "5.2.10", "@icons-pack/react-simple-icons": "13.8.0", "@img-comparison-slider/react": "8.0.2", From 23367ff54a7750da691d2c34685d49ce3c468cf6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 19 Dec 2025 08:02:12 +0100 Subject: [PATCH 130/190] Update GitHub Artifact Actions (#1690) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dc1ef9fc..35a298a0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,7 +34,7 @@ jobs: npm ci --no-audit npm run build - name: Upload artifact - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 + uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 with: name: jellyfin-org__build path: build @@ -81,7 +81,7 @@ jobs: comment-tag: CFPages-deployment mode: recreate - name: Download workflow artifact - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 + uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0 with: name: jellyfin-org__build path: build From f6e6faf892d8414db9c62664a32971069a1e3f2b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 19 Dec 2025 08:06:32 +0100 Subject: [PATCH 131/190] Update dependency prettier to v3.7.4 (#1684) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6d362b98..e9db3303 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,7 +54,7 @@ "globals": "16.5.0", "markdownlint-cli": "0.47.0", "node-fetch": "3.3.2", - "prettier": "3.6.2", + "prettier": "3.7.4", "typescript": "5.9.3", "typescript-eslint": "8.47.0", "typescript-plugin-css-modules": "5.2.0" @@ -19262,9 +19262,9 @@ } }, "node_modules/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", + "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", "dev": true, "license": "MIT", "peer": true, diff --git a/package.json b/package.json index fc2a7b37..74909ffd 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "globals": "16.5.0", "markdownlint-cli": "0.47.0", "node-fetch": "3.3.2", - "prettier": "3.6.2", + "prettier": "3.7.4", "typescript": "5.9.3", "typescript-eslint": "8.47.0", "typescript-plugin-css-modules": "5.2.0" From 86b843c7bbfb3a926eb1d366c1ea66fa505e17ce Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 19 Dec 2025 08:06:44 +0100 Subject: [PATCH 132/190] Update dependency typescript-eslint to v8.49.0 (#1679) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 135 ++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 64 insertions(+), 73 deletions(-) diff --git a/package-lock.json b/package-lock.json index e9db3303..78410abc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,7 +56,7 @@ "node-fetch": "3.3.2", "prettier": "3.7.4", "typescript": "5.9.3", - "typescript-eslint": "8.47.0", + "typescript-eslint": "8.49.0", "typescript-plugin-css-modules": "5.2.0" }, "engines": { @@ -6105,18 +6105,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.47.0.tgz", - "integrity": "sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.49.0.tgz", + "integrity": "sha512-JXij0vzIaTtCwu6SxTh8qBc66kmf1xs7pI4UOiMDFVct6q86G0Zs7KRcEoJgY3Cav3x5Tq0MF5jwgpgLqgKG3A==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.47.0", - "@typescript-eslint/type-utils": "8.47.0", - "@typescript-eslint/utils": "8.47.0", - "@typescript-eslint/visitor-keys": "8.47.0", - "graphemer": "^1.4.0", + "@typescript-eslint/scope-manager": "8.49.0", + "@typescript-eslint/type-utils": "8.49.0", + "@typescript-eslint/utils": "8.49.0", + "@typescript-eslint/visitor-keys": "8.49.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" @@ -6129,7 +6128,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.47.0", + "@typescript-eslint/parser": "^8.49.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -6145,17 +6144,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.47.0.tgz", - "integrity": "sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.49.0.tgz", + "integrity": "sha512-N9lBGA9o9aqb1hVMc9hzySbhKibHmB+N3IpoShyV6HyQYRGIhlrO5rQgttypi+yEeKsKI4idxC8Jw6gXKD4THA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.47.0", - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/typescript-estree": "8.47.0", - "@typescript-eslint/visitor-keys": "8.47.0", + "@typescript-eslint/scope-manager": "8.49.0", + "@typescript-eslint/types": "8.49.0", + "@typescript-eslint/typescript-estree": "8.49.0", + "@typescript-eslint/visitor-keys": "8.49.0", "debug": "^4.3.4" }, "engines": { @@ -6171,14 +6170,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.47.0.tgz", - "integrity": "sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.49.0.tgz", + "integrity": "sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.47.0", - "@typescript-eslint/types": "^8.47.0", + "@typescript-eslint/tsconfig-utils": "^8.49.0", + "@typescript-eslint/types": "^8.49.0", "debug": "^4.3.4" }, "engines": { @@ -6193,14 +6192,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.47.0.tgz", - "integrity": "sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.49.0.tgz", + "integrity": "sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/visitor-keys": "8.47.0" + "@typescript-eslint/types": "8.49.0", + "@typescript-eslint/visitor-keys": "8.49.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6211,9 +6210,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.47.0.tgz", - "integrity": "sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.49.0.tgz", + "integrity": "sha512-8prixNi1/6nawsRYxet4YOhnbW+W9FK/bQPxsGB1D3ZrDzbJ5FXw5XmzxZv82X3B+ZccuSxo/X8q9nQ+mFecWA==", "dev": true, "license": "MIT", "engines": { @@ -6228,15 +6227,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.47.0.tgz", - "integrity": "sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.49.0.tgz", + "integrity": "sha512-KTExJfQ+svY8I10P4HdxKzWsvtVnsuCifU5MvXrRwoP2KOlNZ9ADNEWWsQTJgMxLzS5VLQKDjkCT/YzgsnqmZg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/typescript-estree": "8.47.0", - "@typescript-eslint/utils": "8.47.0", + "@typescript-eslint/types": "8.49.0", + "@typescript-eslint/typescript-estree": "8.49.0", + "@typescript-eslint/utils": "8.49.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -6253,9 +6252,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.47.0.tgz", - "integrity": "sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.49.0.tgz", + "integrity": "sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==", "dev": true, "license": "MIT", "engines": { @@ -6267,21 +6266,20 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.47.0.tgz", - "integrity": "sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.49.0.tgz", + "integrity": "sha512-jrLdRuAbPfPIdYNppHJ/D0wN+wwNfJ32YTAm10eJVsFmrVpXQnDWBn8niCSMlWjvml8jsce5E/O+86IQtTbJWA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.47.0", - "@typescript-eslint/tsconfig-utils": "8.47.0", - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/visitor-keys": "8.47.0", + "@typescript-eslint/project-service": "8.49.0", + "@typescript-eslint/tsconfig-utils": "8.49.0", + "@typescript-eslint/types": "8.49.0", + "@typescript-eslint/visitor-keys": "8.49.0", "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", + "tinyglobby": "^0.2.15", "ts-api-utils": "^2.1.0" }, "engines": { @@ -6322,16 +6320,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.47.0.tgz", - "integrity": "sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.49.0.tgz", + "integrity": "sha512-N3W7rJw7Rw+z1tRsHZbK395TWSYvufBXumYtEGzypgMUthlg0/hmCImeA8hgO2d2G4pd7ftpxxul2J8OdtdaFA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.47.0", - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/typescript-estree": "8.47.0" + "@typescript-eslint/scope-manager": "8.49.0", + "@typescript-eslint/types": "8.49.0", + "@typescript-eslint/typescript-estree": "8.49.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6346,13 +6344,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.47.0.tgz", - "integrity": "sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.49.0.tgz", + "integrity": "sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/types": "8.49.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -11732,13 +11730,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, "node_modules/gray-matter": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", @@ -22296,16 +22287,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.47.0.tgz", - "integrity": "sha512-Lwe8i2XQ3WoMjua/r1PHrCTpkubPYJCAfOurtn+mtTzqB6jNd+14n9UN1bJ4s3F49x9ixAm0FLflB/JzQ57M8Q==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.49.0.tgz", + "integrity": "sha512-zRSVH1WXD0uXczCXw+nsdjGPUdx4dfrs5VQoHnUWmv1U3oNlAKv4FUNdLDhVUg+gYn+a5hUESqch//Rv5wVhrg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.47.0", - "@typescript-eslint/parser": "8.47.0", - "@typescript-eslint/typescript-estree": "8.47.0", - "@typescript-eslint/utils": "8.47.0" + "@typescript-eslint/eslint-plugin": "8.49.0", + "@typescript-eslint/parser": "8.49.0", + "@typescript-eslint/typescript-estree": "8.49.0", + "@typescript-eslint/utils": "8.49.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" diff --git a/package.json b/package.json index 74909ffd..b29c5657 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "node-fetch": "3.3.2", "prettier": "3.7.4", "typescript": "5.9.3", - "typescript-eslint": "8.47.0", + "typescript-eslint": "8.49.0", "typescript-plugin-css-modules": "5.2.0" } } From e8cc90fbc0af685c7285881cf49946d13730a11b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 20 Dec 2025 03:05:45 +0000 Subject: [PATCH 133/190] Update Linters to v9.39.2 --- package-lock.json | 18 +++++++++--------- package.json | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 78410abc..2f1b4757 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,11 +38,11 @@ "devDependencies": { "@docusaurus/module-type-aliases": "3.9.2", "@docusaurus/tsconfig": "3.9.2", - "@eslint/js": "9.39.1", + "@eslint/js": "9.39.2", "@types/react": "18.3.27", "@types/react-helmet": "6.1.11", "@types/react-router-dom": "5.3.3", - "eslint": "9.39.1", + "eslint": "9.39.2", "eslint-config-prettier": "10.1.8", "eslint-plugin-import": "2.32.0", "eslint-plugin-jsx-a11y": "6.10.2", @@ -3940,9 +3940,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", - "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true, "license": "MIT", "engines": { @@ -10122,9 +10122,9 @@ } }, "node_modules/eslint": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", - "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", "peer": true, @@ -10135,7 +10135,7 @@ "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.1", + "@eslint/js": "9.39.2", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", diff --git a/package.json b/package.json index b29c5657..630292b0 100644 --- a/package.json +++ b/package.json @@ -64,11 +64,11 @@ "devDependencies": { "@docusaurus/module-type-aliases": "3.9.2", "@docusaurus/tsconfig": "3.9.2", - "@eslint/js": "9.39.1", + "@eslint/js": "9.39.2", "@types/react": "18.3.27", "@types/react-helmet": "6.1.11", "@types/react-router-dom": "5.3.3", - "eslint": "9.39.1", + "eslint": "9.39.2", "eslint-config-prettier": "10.1.8", "eslint-plugin-import": "2.32.0", "eslint-plugin-jsx-a11y": "6.10.2", From e2ef0f9052586ee175b47a8c69d05d097475d724 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Boh=C3=A1=C4=8D?= Date: Sat, 20 Dec 2025 12:28:11 +0100 Subject: [PATCH 134/190] Fix typo in metadata images documentation --- docs/general/server/media/_metadata-images.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/server/media/_metadata-images.md b/docs/general/server/media/_metadata-images.md index d095259e..855a0d59 100644 --- a/docs/general/server/media/_metadata-images.md +++ b/docs/general/server/media/_metadata-images.md @@ -2,7 +2,7 @@ ## Metadata Images -Images can either be provided as external files within the media folders, or embedded in the media files themselves. When external imaged are provided, they should be placed alongside the media files. When they are provided, they will take precedence over other sources. +Images can either be provided as external files within the media folders, or embedded in the media files themselves. When external images are provided, they should be placed alongside the media files. When they are provided, they will take precedence over other sources. Similar to media folders, an artist image can be placed in the root of an artist’s folder. It will be shown both when browsing artists and on the artist’s detail page. From 9b468298cd91345e13d3d955bf5d0b7ea919b46f Mon Sep 17 00:00:00 2001 From: BotBlake Date: Sat, 20 Dec 2025 18:31:49 +0100 Subject: [PATCH 135/190] Readd series notes (#1656) --- docs/general/server/media/_video-header.md | 2 +- docs/general/server/media/shows.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/general/server/media/_video-header.md b/docs/general/server/media/_video-header.md index 9a73c61d..1d8f37dd 100644 --- a/docs/general/server/media/_video-header.md +++ b/docs/general/server/media/_video-header.md @@ -4,4 +4,4 @@ Most common video formats are supported by Jellyfin, such as `mp4` and `mkv`. In `.iso` files and other disc image formats should work, but are not supported. It is recommended that disc image formats be remuxed into `mkv` containers, or extracted into `VIDEO_TS` or `BDMV` folders. -File names containing special characters WILL cause problems. The following characters are known to cause issues: `<`, `>`, `:`, `"`, `/`, `\`, `|`, `?`, `*` +File names should match the name listed by your metadata provider whenever possible. However, certain characters cannot be used as they are reserved by jellyfin. Including them WILL cause problems. The following characters are known to cause issues: `<`, `>`, `:`, `"`, `/`, `\`, `|`, `?`, `*` diff --git a/docs/general/server/media/shows.md b/docs/general/server/media/shows.md index 1b9b69b8..83747aee 100644 --- a/docs/general/server/media/shows.md +++ b/docs/general/server/media/shows.md @@ -57,7 +57,7 @@ The `year` and `external id` fields are optional, but they will help identify me - Example with external id: `Jellyfin Documentary [imdbid-tt00000000]` - Example with both year and external id: `Jellyfin Documentary (2030) [imdbid-tt00000000]` -The Season folders should be named `Season *`, with `*` being any number. For the best results, please pad the season number with `0`s at the front to make sure each entry has the same number of digits. For example: `Season 5` -> `Season 05`. +The Season folders should be named `Season *`, with `*` being any number. Do not abbreviate the `Season` name to `S01` or `SE01`. For the best results, please pad the season number with `0`s at the front to make sure each entry has the same number of digits. For example: `Season 5` -> `Season 05`. Also do not mix Season folders with episodes in the Shows folder. import VideoMetadataProviders from './\_video-metadata-providers.md'; From 0ef1b2d270fbc04b4facfe8125668860c3d22479 Mon Sep 17 00:00:00 2001 From: Florian Ruechel Date: Fri, 26 Dec 2025 22:52:26 +1030 Subject: [PATCH 136/190] Add link for Intel graphics architecture Intel's confusing naming between processor generations and graphics architecture makes it hard for users to know what they actually have. Searching the Intel website, I could not find a good link that describes these architectures and allows someone to find out which generation they have. However, Wikipedia has a nice table, allowing someone to determine their generation if they know the name of their GPU, e.g. from running `lspci`, or by looking up their CPU on the Intel website (in case of iGPU). Also fixed small typo --- .../post-install/transcoding/hardware-acceleration/intel.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/post-install/transcoding/hardware-acceleration/intel.md b/docs/general/post-install/transcoding/hardware-acceleration/intel.md index eee3a1d0..a75db6ed 100644 --- a/docs/general/post-install/transcoding/hardware-acceleration/intel.md +++ b/docs/general/post-install/transcoding/hardware-acceleration/intel.md @@ -777,7 +777,7 @@ More detail information about Intel video hardware can be found [on the Intel me :::note -Gen X refers to Intel graphics architechure instead of the CPU generation. (i.e. Gen 9 graphics ≠ 9th Gen processors) +Gen X refers to [Intel graphics architecture](https://en.wikipedia.org/wiki/Intel_Graphics_Technology) instead of the CPU generation. (i.e. Gen 9 graphics ≠ 9th Gen processors) ::: From f12b1eb7163fa3da84b9f76cd10ba9a81e3503e4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 26 Dec 2025 22:30:27 +0000 Subject: [PATCH 137/190] Update dependency sass to v1.97.1 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2f1b4757..cdc0c7de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "file-loader": "6.2.0", "react": "18.3.1", "react-dom": "18.3.1", - "sass": "1.96.0", + "sass": "1.97.1", "swiper": "12.0.3", "ua-parser-js": "2.0.7", "url-loader": "4.1.1" @@ -20526,9 +20526,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.96.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.96.0.tgz", - "integrity": "sha512-8u4xqqUeugGNCYwr9ARNtQKTOj4KmYiJAVKXf2CTIivTCR51j96htbMKWDru8H5SaQWpyVgTfOF8Ylyf5pun1Q==", + "version": "1.97.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.1.tgz", + "integrity": "sha512-uf6HoO8fy6ClsrShvMgaKUn14f2EHQLQRtpsZZLeU/Mv0Q1K5P0+x2uvH6Cub39TVVbWNSrraUhDAoFph6vh0A==", "license": "MIT", "peer": true, "dependencies": { diff --git a/package.json b/package.json index 630292b0..87cb1a8a 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "file-loader": "6.2.0", "react": "18.3.1", "react-dom": "18.3.1", - "sass": "1.96.0", + "sass": "1.97.1", "swiper": "12.0.3", "ua-parser-js": "2.0.7", "url-loader": "4.1.1" From ee122bb50b26e15632fdc6d0c17188749c1b77cb Mon Sep 17 00:00:00 2001 From: BotBlake Date: Sun, 28 Dec 2025 22:42:52 +0100 Subject: [PATCH 138/190] update arch urls --- src/data/downloads.tsx | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/data/downloads.tsx b/src/data/downloads.tsx index 1d6b797c..4b6a64e4 100644 --- a/src/data/downloads.tsx +++ b/src/data/downloads.tsx @@ -307,12 +307,7 @@ sudo apt install jellyfin`} { id: 'arch-stable-link', name: 'Arch Downloads', - url: 'https://archlinux.org/packages/?q=jellyfin' - }, - { - id: 'arch-aur-link', - name: 'AUR Downloads', - url: 'https://aur.archlinux.org/packages/?K=jellyfin' + url: 'https://archlinux.org/packages/extra/x86_64/jellyfin-server/' } ], unstableButtons: [ @@ -332,7 +327,7 @@ makepkg -si`} { id: 'arch-aur-link', name: 'AUR Downloads', - url: 'https://aur.archlinux.org/packages/?K=jellyfin' + url: 'https://aur.archlinux.org/packages/jellyfin-server-git' } ], otherButtons: [] From e3fb6e467c57b42d80c83b08fc91f45484866a8a Mon Sep 17 00:00:00 2001 From: DeuSCaNoN Date: Sun, 28 Dec 2025 22:35:31 -0800 Subject: [PATCH 139/190] Fix formatting of chapter-images.md --- .../general/server/metadata/chapter-images.md | 38 +++++++++++++++---- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/docs/general/server/metadata/chapter-images.md b/docs/general/server/metadata/chapter-images.md index 00179e18..3f44c93e 100644 --- a/docs/general/server/metadata/chapter-images.md +++ b/docs/general/server/metadata/chapter-images.md @@ -2,31 +2,53 @@ uid: server-metadata-chapter-images title: Chapter Images --- -NOTE: Not to be confused with chapters, which are the ticks you see in the timeline when watching a video. Chapter Images must be enabled to be displayed; chapters can be displayed even when Chapter Images are disabled. + +:::note + +Not to be confused with chapters, which are the ticks you see in the timeline when watching a video. Chapter Images must be enabled to be displayed; chapters can be displayed even when Chapter Images are disabled. + +::: # Chapter Images -Chapter images are a type of metadata for video media files stored in Jellyfin. They are images that correspond with chapters and give a preview of the video at that timestamp. + +Chapter images are a type of metadata for video media files stored in Jellyfin. They are images that correspond to chapters and give a preview of the video at that timestamp. Jellyfin stores the chapter images within the metadata directory, which should be located inside your server's config directory. -# Getting Started +## Getting Started + The feature is enabled per library. There are 2 ways to get to the library settings -1. When you add a new library, pick a video Content type, then scroll down to the bottom where you see "Chapter Images" -2. Click the 3 dots of an existing library and scroll down to the bottom, where you see "Chapter Images" +1. When you add a new library, pick a video Content type, then navigate to "Chapter Images" +2. Click the 3 dots of an existing library and then navigate to "Chapter Images" ### Enable chapter image extraction + This will enable the Chapter image feature. ### Extract chapter images during the library scan + This will change the scheduled extraction to happen in the "Scan Media Library" task instead of the "Extract Chapter Images" task. -# Other Settings +:::note + +Extracting chapter images can be computationally intensive and slow down library scans significantly - especially on large libraries. + +::: + +## Other Settings + In the dashboard, you can configure other behaviours of the chapter image feature. These settings are found in Libraries -> Metadata ### Interval + This creates dummy chapters at a given interval (0 will disable dummy chapters) if no chapters are detected in the media file. The value is in seconds. -NOTE: Not recommended to use small values here. Small intervals could slow down video playback as Jellyfin's webUI video player will try to render all the chapters on the timeline. +:::note + +Not recommended to use small values here. Small intervals could slow down video playback as Jellyfin's webUI video player will try to render all the chapters on the timeline. + +::: ### Resolution -This will set the resolution of the image files that are extracted + +This will set the resolution of the image files that are extracted. These images are used in a small preview window and will never take up the full screen, so setting a high resolution here is not necessary. From fbd80adb580fe7b392b6890d2aaab4ec1ad4b959 Mon Sep 17 00:00:00 2001 From: DeuSCaNoN Date: Mon, 29 Dec 2025 10:36:14 -0800 Subject: [PATCH 140/190] Remove unneeded title indent --- docs/general/server/metadata/chapter-images.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/general/server/metadata/chapter-images.md b/docs/general/server/metadata/chapter-images.md index 3f44c93e..24e56a63 100644 --- a/docs/general/server/metadata/chapter-images.md +++ b/docs/general/server/metadata/chapter-images.md @@ -9,8 +9,6 @@ Not to be confused with chapters, which are the ticks you see in the timeline wh ::: -# Chapter Images - Chapter images are a type of metadata for video media files stored in Jellyfin. They are images that correspond to chapters and give a preview of the video at that timestamp. Jellyfin stores the chapter images within the metadata directory, which should be located inside your server's config directory. From 73003cba4c8153d535fada0ab091f668d432c47e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 29 Dec 2025 18:47:28 +0000 Subject: [PATCH 141/190] Update dependency typescript-eslint to v8.50.1 --- package-lock.json | 130 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 66 insertions(+), 66 deletions(-) diff --git a/package-lock.json b/package-lock.json index cdc0c7de..43ce1a51 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,7 +56,7 @@ "node-fetch": "3.3.2", "prettier": "3.7.4", "typescript": "5.9.3", - "typescript-eslint": "8.49.0", + "typescript-eslint": "8.50.1", "typescript-plugin-css-modules": "5.2.0" }, "engines": { @@ -6105,17 +6105,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.49.0.tgz", - "integrity": "sha512-JXij0vzIaTtCwu6SxTh8qBc66kmf1xs7pI4UOiMDFVct6q86G0Zs7KRcEoJgY3Cav3x5Tq0MF5jwgpgLqgKG3A==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.50.1.tgz", + "integrity": "sha512-PKhLGDq3JAg0Jk/aK890knnqduuI/Qj+udH7wCf0217IGi4gt+acgCyPVe79qoT+qKUvHMDQkwJeKW9fwl8Cyw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.49.0", - "@typescript-eslint/type-utils": "8.49.0", - "@typescript-eslint/utils": "8.49.0", - "@typescript-eslint/visitor-keys": "8.49.0", + "@typescript-eslint/scope-manager": "8.50.1", + "@typescript-eslint/type-utils": "8.50.1", + "@typescript-eslint/utils": "8.50.1", + "@typescript-eslint/visitor-keys": "8.50.1", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" @@ -6128,7 +6128,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.49.0", + "@typescript-eslint/parser": "^8.50.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -6144,17 +6144,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.49.0.tgz", - "integrity": "sha512-N9lBGA9o9aqb1hVMc9hzySbhKibHmB+N3IpoShyV6HyQYRGIhlrO5rQgttypi+yEeKsKI4idxC8Jw6gXKD4THA==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.50.1.tgz", + "integrity": "sha512-hM5faZwg7aVNa819m/5r7D0h0c9yC4DUlWAOvHAtISdFTc8xB86VmX5Xqabrama3wIPJ/q9RbGS1worb6JfnMg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.49.0", - "@typescript-eslint/types": "8.49.0", - "@typescript-eslint/typescript-estree": "8.49.0", - "@typescript-eslint/visitor-keys": "8.49.0", + "@typescript-eslint/scope-manager": "8.50.1", + "@typescript-eslint/types": "8.50.1", + "@typescript-eslint/typescript-estree": "8.50.1", + "@typescript-eslint/visitor-keys": "8.50.1", "debug": "^4.3.4" }, "engines": { @@ -6170,14 +6170,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.49.0.tgz", - "integrity": "sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.50.1.tgz", + "integrity": "sha512-E1ur1MCVf+YiP89+o4Les/oBAVzmSbeRB0MQLfSlYtbWU17HPxZ6Bhs5iYmKZRALvEuBoXIZMOIRRc/P++Ortg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.49.0", - "@typescript-eslint/types": "^8.49.0", + "@typescript-eslint/tsconfig-utils": "^8.50.1", + "@typescript-eslint/types": "^8.50.1", "debug": "^4.3.4" }, "engines": { @@ -6192,14 +6192,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.49.0.tgz", - "integrity": "sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.50.1.tgz", + "integrity": "sha512-mfRx06Myt3T4vuoHaKi8ZWNTPdzKPNBhiblze5N50//TSHOAQQevl/aolqA/BcqqbJ88GUnLqjjcBc8EWdBcVw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.49.0", - "@typescript-eslint/visitor-keys": "8.49.0" + "@typescript-eslint/types": "8.50.1", + "@typescript-eslint/visitor-keys": "8.50.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6210,9 +6210,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.49.0.tgz", - "integrity": "sha512-8prixNi1/6nawsRYxet4YOhnbW+W9FK/bQPxsGB1D3ZrDzbJ5FXw5XmzxZv82X3B+ZccuSxo/X8q9nQ+mFecWA==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.50.1.tgz", + "integrity": "sha512-ooHmotT/lCWLXi55G4mvaUF60aJa012QzvLK0Y+Mp4WdSt17QhMhWOaBWeGTFVkb2gDgBe19Cxy1elPXylslDw==", "dev": true, "license": "MIT", "engines": { @@ -6227,15 +6227,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.49.0.tgz", - "integrity": "sha512-KTExJfQ+svY8I10P4HdxKzWsvtVnsuCifU5MvXrRwoP2KOlNZ9ADNEWWsQTJgMxLzS5VLQKDjkCT/YzgsnqmZg==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.50.1.tgz", + "integrity": "sha512-7J3bf022QZE42tYMO6SL+6lTPKFk/WphhRPe9Tw/el+cEwzLz1Jjz2PX3GtGQVxooLDKeMVmMt7fWpYRdG5Etg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.49.0", - "@typescript-eslint/typescript-estree": "8.49.0", - "@typescript-eslint/utils": "8.49.0", + "@typescript-eslint/types": "8.50.1", + "@typescript-eslint/typescript-estree": "8.50.1", + "@typescript-eslint/utils": "8.50.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -6252,9 +6252,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.49.0.tgz", - "integrity": "sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.50.1.tgz", + "integrity": "sha512-v5lFIS2feTkNyMhd7AucE/9j/4V9v5iIbpVRncjk/K0sQ6Sb+Np9fgYS/63n6nwqahHQvbmujeBL7mp07Q9mlA==", "dev": true, "license": "MIT", "engines": { @@ -6266,16 +6266,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.49.0.tgz", - "integrity": "sha512-jrLdRuAbPfPIdYNppHJ/D0wN+wwNfJ32YTAm10eJVsFmrVpXQnDWBn8niCSMlWjvml8jsce5E/O+86IQtTbJWA==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.50.1.tgz", + "integrity": "sha512-woHPdW+0gj53aM+cxchymJCrh0cyS7BTIdcDxWUNsclr9VDkOSbqC13juHzxOmQ22dDkMZEpZB+3X1WpUvzgVQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.49.0", - "@typescript-eslint/tsconfig-utils": "8.49.0", - "@typescript-eslint/types": "8.49.0", - "@typescript-eslint/visitor-keys": "8.49.0", + "@typescript-eslint/project-service": "8.50.1", + "@typescript-eslint/tsconfig-utils": "8.50.1", + "@typescript-eslint/types": "8.50.1", + "@typescript-eslint/visitor-keys": "8.50.1", "debug": "^4.3.4", "minimatch": "^9.0.4", "semver": "^7.6.0", @@ -6320,16 +6320,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.49.0.tgz", - "integrity": "sha512-N3W7rJw7Rw+z1tRsHZbK395TWSYvufBXumYtEGzypgMUthlg0/hmCImeA8hgO2d2G4pd7ftpxxul2J8OdtdaFA==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.50.1.tgz", + "integrity": "sha512-lCLp8H1T9T7gPbEuJSnHwnSuO9mDf8mfK/Nion5mZmiEaQD9sWf9W4dfeFqRyqRjF06/kBuTmAqcs9sewM2NbQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.49.0", - "@typescript-eslint/types": "8.49.0", - "@typescript-eslint/typescript-estree": "8.49.0" + "@typescript-eslint/scope-manager": "8.50.1", + "@typescript-eslint/types": "8.50.1", + "@typescript-eslint/typescript-estree": "8.50.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6344,13 +6344,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.49.0.tgz", - "integrity": "sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.50.1.tgz", + "integrity": "sha512-IrDKrw7pCRUR94zeuCSUWQ+w8JEf5ZX5jl/e6AHGSLi1/zIr0lgutfn/7JpfCey+urpgQEdrZVYzCaVVKiTwhQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.49.0", + "@typescript-eslint/types": "8.50.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -22035,9 +22035,9 @@ } }, "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.3.0.tgz", + "integrity": "sha512-6eg3Y9SF7SsAvGzRHQvvc1skDAhwI4YQ32ui1scxD1Ccr0G5qIIbUBT3pFTKX8kmWIQClHobtUdNuaBgwdfdWg==", "dev": true, "license": "MIT", "engines": { @@ -22287,16 +22287,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.49.0.tgz", - "integrity": "sha512-zRSVH1WXD0uXczCXw+nsdjGPUdx4dfrs5VQoHnUWmv1U3oNlAKv4FUNdLDhVUg+gYn+a5hUESqch//Rv5wVhrg==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.50.1.tgz", + "integrity": "sha512-ytTHO+SoYSbhAH9CrYnMhiLx8To6PSSvqnvXyPUgPETCvB6eBKmTI9w6XMPS3HsBRGkwTVBX+urA8dYQx6bHfQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.49.0", - "@typescript-eslint/parser": "8.49.0", - "@typescript-eslint/typescript-estree": "8.49.0", - "@typescript-eslint/utils": "8.49.0" + "@typescript-eslint/eslint-plugin": "8.50.1", + "@typescript-eslint/parser": "8.50.1", + "@typescript-eslint/typescript-estree": "8.50.1", + "@typescript-eslint/utils": "8.50.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" diff --git a/package.json b/package.json index 87cb1a8a..296f0e96 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "node-fetch": "3.3.2", "prettier": "3.7.4", "typescript": "5.9.3", - "typescript-eslint": "8.49.0", + "typescript-eslint": "8.50.1", "typescript-plugin-css-modules": "5.2.0" } } From 381bc393e3e06400139f667ac5de428d05a3a29a Mon Sep 17 00:00:00 2001 From: BotBlake Date: Mon, 29 Dec 2025 19:53:27 +0100 Subject: [PATCH 142/190] switch to docusaurus style headlines --- docs/general/server/metadata/media-segments.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/general/server/metadata/media-segments.md b/docs/general/server/metadata/media-segments.md index 261101ba..840035b8 100644 --- a/docs/general/server/metadata/media-segments.md +++ b/docs/general/server/metadata/media-segments.md @@ -3,8 +3,6 @@ uid: server-metadata-media-segments title: Media segments --- -# Media segments - Media segments are a type of metadata for media files stored in Jellyfin. Unlike chapters, which have no type, media segments can contain type information, allowing different actions based on the type of each segment. ## Getting started From 8ef75be4614d3b6c4d3510301fd59c7a8cef0ef2 Mon Sep 17 00:00:00 2001 From: BotBlake Date: Mon, 29 Dec 2025 19:59:50 +0100 Subject: [PATCH 143/190] reword "getting started" --- docs/general/server/metadata/media-segments.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/general/server/metadata/media-segments.md b/docs/general/server/metadata/media-segments.md index 840035b8..80f198ff 100644 --- a/docs/general/server/metadata/media-segments.md +++ b/docs/general/server/metadata/media-segments.md @@ -3,16 +3,15 @@ uid: server-metadata-media-segments title: Media segments --- -Media segments are a type of metadata for media files stored in Jellyfin. Unlike chapters, which have no type, media segments can contain type information, allowing different actions based on the type of each segment. +Media segments (first introduced in 10.10) are a type of metadata for media files stored in Jellyfin. Unlike chapters, which have no type, media segments can contain type information, allowing different actions based on the type of each segment. ## Getting started There's a few steps to follow if you want to use media segments: -1. Update your server to version 10.10 or above. -2. First, you'll need one or multiple plugins that can provide media segments. Read the [plugins section](#plugin-support) below to find out more. -3. Run the `Media segment scan` task in the dashboard to create segments immediately, this task also runs automatically in the background. -4. Enable actions for the different segment types, the way you do this differs per client, but they are generally found in the playback settings of the client. +1. Install one or multiple plugins that can provide media segments. Read the [plugins section](#plugin-support) below to find out more. +2. Run the `Media segment scan` task in the dashboard to create segments immediately, this task also runs automatically in the background. +3. Set actions for the different segment types, the way you do this differs per client, but they are generally found in the playback settings of the client. ## Types From 194516997e858bf4fdc3e1d680d8f1679bf16748 Mon Sep 17 00:00:00 2001 From: BotBlake Date: Mon, 29 Dec 2025 20:09:51 +0100 Subject: [PATCH 144/190] restructure of media-segments --- .../general/server/metadata/media-segments.md | 50 ++++++++----------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/docs/general/server/metadata/media-segments.md b/docs/general/server/metadata/media-segments.md index 80f198ff..e2ec6a0a 100644 --- a/docs/general/server/metadata/media-segments.md +++ b/docs/general/server/metadata/media-segments.md @@ -5,26 +5,6 @@ title: Media segments Media segments (first introduced in 10.10) are a type of metadata for media files stored in Jellyfin. Unlike chapters, which have no type, media segments can contain type information, allowing different actions based on the type of each segment. -## Getting started - -There's a few steps to follow if you want to use media segments: - -1. Install one or multiple plugins that can provide media segments. Read the [plugins section](#plugin-support) below to find out more. -2. Run the `Media segment scan` task in the dashboard to create segments immediately, this task also runs automatically in the background. -3. Set actions for the different segment types, the way you do this differs per client, but they are generally found in the playback settings of the client. - -## Types - -The following types are currently available: - -- Commercial -- Preview -- Recap -- Outro -- Intro - -## An example - A video that is 16 minutes (00:16:00) long could have the following segments: 1. From 00:00:00 until 00:03:08 there is an `Intro` segment. @@ -33,18 +13,30 @@ A video that is 16 minutes (00:16:00) long could have the following segments: Jellyfin can store this information and provide it to clients. Clients can then decide what they want to do with the provided information. +## Getting started + +There's a few steps to follow if you want to use media segments: + +1. Install one or multiple media segment providers. Read the [plugins section](#plugin-support) below to find out more. +2. Run the `Media segment scan` task in the dashboard to create segments immediately, this task also runs automatically in the background. +3. Set actions for the different segment types, the way you do this differs per client, but they are generally found in the playback settings of the client. + ## Creating media segments -Media segments are provided by plugins. Learn more in the [plugin support section](#plugin-support). +Media segments are provided by plugins. In general, they include a `begin` and `end`-Timestamp, followed by a `type.` -## Clients - -Media segments are supported by the web client, Android TV and Roku. - -Upon receiving media segment information from the server, clients can choose to provide any number of actions based on the segment type, such as showing a "skip" button to skip the section. Because it is still a new feature, client support is very sparse and will take some time to become more wide-spread. - -## Plugin support +### Plugins Plugins can utilize this system to store their information about intros, outros, commercials and all other types of segments. This information can then be used by clients to provide actions, such as a "skip" button in their user interface. This approach generalizes how segments are handled, so more platforms can be easily supported, without custom modifications to clients. -There is an official `Chapter Segments Provider` plugin that creates media segments from chapters. +There is an official `Chapter Segments Provider` plugin that creates media segments based on chapters and chapter-names. + +### Types + +The following types are currently available: + +- Commercial +- Preview +- Recap +- Outro +- Intro From 34f6a47e349b13e348c9e7985e7038c7ae9c8ed7 Mon Sep 17 00:00:00 2001 From: BotBlake Date: Mon, 29 Dec 2025 20:16:36 +0100 Subject: [PATCH 145/190] update link --- docs/general/server/metadata/media-segments.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/server/metadata/media-segments.md b/docs/general/server/metadata/media-segments.md index e2ec6a0a..9d0850d7 100644 --- a/docs/general/server/metadata/media-segments.md +++ b/docs/general/server/metadata/media-segments.md @@ -17,7 +17,7 @@ Jellyfin can store this information and provide it to clients. Clients can then There's a few steps to follow if you want to use media segments: -1. Install one or multiple media segment providers. Read the [plugins section](#plugin-support) below to find out more. +1. Install one or multiple media segment providers. Read the [plugins section](#plugins) below to find out more. 2. Run the `Media segment scan` task in the dashboard to create segments immediately, this task also runs automatically in the background. 3. Set actions for the different segment types, the way you do this differs per client, but they are generally found in the playback settings of the client. From d546cd9d4e246e658b8201044a4bdc297e65aa22 Mon Sep 17 00:00:00 2001 From: Andrew Rabert Date: Tue, 30 Dec 2025 23:32:34 -0500 Subject: [PATCH 146/190] Isolate PR build from secrets and token permissions Extract build steps to reusable __build.yml workflow. Call it from build.yml with permissions: {} to prevent untrusted PR code from accessing GITHUB_TOKEN. Secrets not passed to reusable workflow. --- .github/workflows/__build.yml | 41 +++++++++++++++++++++++++++++++++++ .github/workflows/build.yml | 40 +++++++--------------------------- 2 files changed, 49 insertions(+), 32 deletions(-) create mode 100644 .github/workflows/__build.yml diff --git a/.github/workflows/__build.yml b/.github/workflows/__build.yml new file mode 100644 index 00000000..e6f681a1 --- /dev/null +++ b/.github/workflows/__build.yml @@ -0,0 +1,41 @@ +name: Build + +on: + workflow_call: + inputs: + ref: + required: true + type: string + upload-pages-artifact: + required: false + type: boolean + default: false + +jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + with: + ref: ${{ inputs.ref }} + - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + with: + node-version: 20 + - name: Configure Pages + if: inputs.upload-pages-artifact + uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0 + - name: Run build + run: | + npm ci --no-audit + npm run build + - name: Upload artifact + uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + with: + name: jellyfin-org__build + path: build + - name: Upload pages artifact + if: inputs.upload-pages-artifact + uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4.0.0 + with: + path: build diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 35a298a0..68a219fd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,44 +9,20 @@ on: push: branches: [master] -permissions: - contents: read - pages: write - id-token: write - jobs: build: - name: Build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - with: - ref: ${{ github.event.pull_request.head.sha || github.sha }} - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 - with: - cache: npm - node-version: 20 - - name: Configure Pages - if: github.event_name == 'push' && github.repository == 'jellyfin/jellyfin.org' - uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0 - - name: Run build - run: | - npm ci --no-audit - npm run build - - name: Upload artifact - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 - with: - name: jellyfin-org__build - path: build - - name: Upload pages artifact - if: github.event_name == 'push' && github.repository == 'jellyfin/jellyfin.org' - uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4.0.0 - with: - path: build + uses: ./.github/workflows/__build.yml + permissions: {} + with: + ref: ${{ github.event.pull_request.head.sha || github.sha }} + upload-pages-artifact: ${{ github.event_name == 'push' && github.repository == 'jellyfin/jellyfin.org' }} deploy: if: github.event_name == 'push' && github.repository == 'jellyfin/jellyfin.org' name: Deploy to GitHub Pages + permissions: + pages: write + id-token: write concurrency: build-deploy-pages environment: name: github-pages From ba6a8d1b8b6699e3f8f0741b0196a7c43895e766 Mon Sep 17 00:00:00 2001 From: Andrew Rabert <6550543+andrewrabert@users.noreply.github.com> Date: Sat, 3 Jan 2026 00:41:53 -0500 Subject: [PATCH 147/190] Add Flathub verification token for Jellyfin Desktop (#1711) --- static/.well-known/org.flathub.VerifiedApps.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/static/.well-known/org.flathub.VerifiedApps.txt b/static/.well-known/org.flathub.VerifiedApps.txt index 21fe8d9f..dc76108f 100644 --- a/static/.well-known/org.flathub.VerifiedApps.txt +++ b/static/.well-known/org.flathub.VerifiedApps.txt @@ -1 +1,2 @@ d48b4366-63ef-487c-87f9-f08a26e23e6d +92811634-ec91-45d6-9495-5eb2effbc21f From dcd166b117f2179a3bcdb1655eadf579dc5a1940 Mon Sep 17 00:00:00 2001 From: Andrew Rabert Date: Sat, 3 Jan 2026 21:54:34 -0500 Subject: [PATCH 148/190] Fix .well-known exclusion in pages artifact upload-pages-artifact v4 excludes dotfiles, breaking .well-known https://github.com/actions/upload-pages-artifact/issues/129 --- .github/workflows/__build.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/__build.yml b/.github/workflows/__build.yml index e6f681a1..912e0864 100644 --- a/.github/workflows/__build.yml +++ b/.github/workflows/__build.yml @@ -34,8 +34,17 @@ jobs: with: name: jellyfin-org__build path: build + # Manual artifact creation because upload-pages-artifact v4 excludes dotfiles + # https://github.com/actions/upload-pages-artifact/issues/129 + - name: Create pages artifact + if: inputs.upload-pages-artifact + run: | + tar --dereference -cvf "$RUNNER_TEMP/artifact.tar" -C build . + gzip -9 "$RUNNER_TEMP/artifact.tar" - name: Upload pages artifact if: inputs.upload-pages-artifact - uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4.0.0 + uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 with: - path: build + name: github-pages + path: ${{ runner.temp }}/artifact.tar.gz + retention-days: 1 From 52bd28441ebf6ca055f976490f9dd099cc630525 Mon Sep 17 00:00:00 2001 From: Andrew Rabert <6550543+andrewrabert@users.noreply.github.com> Date: Sat, 3 Jan 2026 22:39:49 -0500 Subject: [PATCH 149/190] Fix pages artifact format (tar not tar.gz) (#1713) deploy-pages expects uncompressed tar, not gzipped --- .github/workflows/__build.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/__build.yml b/.github/workflows/__build.yml index 912e0864..757eca43 100644 --- a/.github/workflows/__build.yml +++ b/.github/workflows/__build.yml @@ -38,13 +38,11 @@ jobs: # https://github.com/actions/upload-pages-artifact/issues/129 - name: Create pages artifact if: inputs.upload-pages-artifact - run: | - tar --dereference -cvf "$RUNNER_TEMP/artifact.tar" -C build . - gzip -9 "$RUNNER_TEMP/artifact.tar" + run: tar --dereference --hard-dereference --directory build -cvf "$RUNNER_TEMP/artifact.tar" --exclude=.git --exclude=.github . - name: Upload pages artifact if: inputs.upload-pages-artifact uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 with: name: github-pages - path: ${{ runner.temp }}/artifact.tar.gz + path: ${{ runner.temp }}/artifact.tar retention-days: 1 From 1832bc6d8bc0127ca0887e35bba13136972adba9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 5 Jan 2026 19:34:04 +0000 Subject: [PATCH 150/190] Update dependency typescript-eslint to v8.51.0 --- package-lock.json | 136 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 69 insertions(+), 69 deletions(-) diff --git a/package-lock.json b/package-lock.json index 43ce1a51..733ea9d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,7 +56,7 @@ "node-fetch": "3.3.2", "prettier": "3.7.4", "typescript": "5.9.3", - "typescript-eslint": "8.50.1", + "typescript-eslint": "8.51.0", "typescript-plugin-css-modules": "5.2.0" }, "engines": { @@ -6105,20 +6105,20 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.50.1.tgz", - "integrity": "sha512-PKhLGDq3JAg0Jk/aK890knnqduuI/Qj+udH7wCf0217IGi4gt+acgCyPVe79qoT+qKUvHMDQkwJeKW9fwl8Cyw==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.51.0.tgz", + "integrity": "sha512-XtssGWJvypyM2ytBnSnKtHYOGT+4ZwTnBVl36TA4nRO2f4PRNGz5/1OszHzcZCvcBMh+qb7I06uoCmLTRdR9og==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.50.1", - "@typescript-eslint/type-utils": "8.50.1", - "@typescript-eslint/utils": "8.50.1", - "@typescript-eslint/visitor-keys": "8.50.1", + "@typescript-eslint/scope-manager": "8.51.0", + "@typescript-eslint/type-utils": "8.51.0", + "@typescript-eslint/utils": "8.51.0", + "@typescript-eslint/visitor-keys": "8.51.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6128,7 +6128,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.50.1", + "@typescript-eslint/parser": "^8.51.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -6144,17 +6144,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.50.1.tgz", - "integrity": "sha512-hM5faZwg7aVNa819m/5r7D0h0c9yC4DUlWAOvHAtISdFTc8xB86VmX5Xqabrama3wIPJ/q9RbGS1worb6JfnMg==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.51.0.tgz", + "integrity": "sha512-3xP4XzzDNQOIqBMWogftkwxhg5oMKApqY0BAflmLZiFYHqyhSOxv/cd/zPQLTcCXr4AkaKb25joocY0BD1WC6A==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.50.1", - "@typescript-eslint/types": "8.50.1", - "@typescript-eslint/typescript-estree": "8.50.1", - "@typescript-eslint/visitor-keys": "8.50.1", + "@typescript-eslint/scope-manager": "8.51.0", + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/typescript-estree": "8.51.0", + "@typescript-eslint/visitor-keys": "8.51.0", "debug": "^4.3.4" }, "engines": { @@ -6170,14 +6170,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.50.1.tgz", - "integrity": "sha512-E1ur1MCVf+YiP89+o4Les/oBAVzmSbeRB0MQLfSlYtbWU17HPxZ6Bhs5iYmKZRALvEuBoXIZMOIRRc/P++Ortg==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.51.0.tgz", + "integrity": "sha512-Luv/GafO07Z7HpiI7qeEW5NW8HUtZI/fo/kE0YbtQEFpJRUuR0ajcWfCE5bnMvL7QQFrmT/odMe8QZww8X2nfQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.50.1", - "@typescript-eslint/types": "^8.50.1", + "@typescript-eslint/tsconfig-utils": "^8.51.0", + "@typescript-eslint/types": "^8.51.0", "debug": "^4.3.4" }, "engines": { @@ -6192,14 +6192,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.50.1.tgz", - "integrity": "sha512-mfRx06Myt3T4vuoHaKi8ZWNTPdzKPNBhiblze5N50//TSHOAQQevl/aolqA/BcqqbJ88GUnLqjjcBc8EWdBcVw==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.51.0.tgz", + "integrity": "sha512-JhhJDVwsSx4hiOEQPeajGhCWgBMBwVkxC/Pet53EpBVs7zHHtayKefw1jtPaNRXpI9RA2uocdmpdfE7T+NrizA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.50.1", - "@typescript-eslint/visitor-keys": "8.50.1" + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/visitor-keys": "8.51.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6210,9 +6210,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.50.1.tgz", - "integrity": "sha512-ooHmotT/lCWLXi55G4mvaUF60aJa012QzvLK0Y+Mp4WdSt17QhMhWOaBWeGTFVkb2gDgBe19Cxy1elPXylslDw==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.51.0.tgz", + "integrity": "sha512-Qi5bSy/vuHeWyir2C8u/uqGMIlIDu8fuiYWv48ZGlZ/k+PRPHtaAu7erpc7p5bzw2WNNSniuxoMSO4Ar6V9OXw==", "dev": true, "license": "MIT", "engines": { @@ -6227,17 +6227,17 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.50.1.tgz", - "integrity": "sha512-7J3bf022QZE42tYMO6SL+6lTPKFk/WphhRPe9Tw/el+cEwzLz1Jjz2PX3GtGQVxooLDKeMVmMt7fWpYRdG5Etg==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.51.0.tgz", + "integrity": "sha512-0XVtYzxnobc9K0VU7wRWg1yiUrw4oQzexCG2V2IDxxCxhqBMSMbjB+6o91A+Uc0GWtgjCa3Y8bi7hwI0Tu4n5Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.50.1", - "@typescript-eslint/typescript-estree": "8.50.1", - "@typescript-eslint/utils": "8.50.1", + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/typescript-estree": "8.51.0", + "@typescript-eslint/utils": "8.51.0", "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6252,9 +6252,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.50.1.tgz", - "integrity": "sha512-v5lFIS2feTkNyMhd7AucE/9j/4V9v5iIbpVRncjk/K0sQ6Sb+Np9fgYS/63n6nwqahHQvbmujeBL7mp07Q9mlA==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.51.0.tgz", + "integrity": "sha512-TizAvWYFM6sSscmEakjY3sPqGwxZRSywSsPEiuZF6d5GmGD9Gvlsv0f6N8FvAAA0CD06l3rIcWNbsN1e5F/9Ag==", "dev": true, "license": "MIT", "engines": { @@ -6266,21 +6266,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.50.1.tgz", - "integrity": "sha512-woHPdW+0gj53aM+cxchymJCrh0cyS7BTIdcDxWUNsclr9VDkOSbqC13juHzxOmQ22dDkMZEpZB+3X1WpUvzgVQ==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.51.0.tgz", + "integrity": "sha512-1qNjGqFRmlq0VW5iVlcyHBbCjPB7y6SxpBkrbhNWMy/65ZoncXCEPJxkRZL8McrseNH6lFhaxCIaX+vBuFnRng==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.50.1", - "@typescript-eslint/tsconfig-utils": "8.50.1", - "@typescript-eslint/types": "8.50.1", - "@typescript-eslint/visitor-keys": "8.50.1", + "@typescript-eslint/project-service": "8.51.0", + "@typescript-eslint/tsconfig-utils": "8.51.0", + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/visitor-keys": "8.51.0", "debug": "^4.3.4", "minimatch": "^9.0.4", "semver": "^7.6.0", "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6320,16 +6320,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.50.1.tgz", - "integrity": "sha512-lCLp8H1T9T7gPbEuJSnHwnSuO9mDf8mfK/Nion5mZmiEaQD9sWf9W4dfeFqRyqRjF06/kBuTmAqcs9sewM2NbQ==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.51.0.tgz", + "integrity": "sha512-11rZYxSe0zabiKaCP2QAwRf/dnmgFgvTmeDTtZvUvXG3UuAdg/GU02NExmmIXzz3vLGgMdtrIosI84jITQOxUA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.50.1", - "@typescript-eslint/types": "8.50.1", - "@typescript-eslint/typescript-estree": "8.50.1" + "@typescript-eslint/scope-manager": "8.51.0", + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/typescript-estree": "8.51.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6344,13 +6344,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.50.1.tgz", - "integrity": "sha512-IrDKrw7pCRUR94zeuCSUWQ+w8JEf5ZX5jl/e6AHGSLi1/zIr0lgutfn/7JpfCey+urpgQEdrZVYzCaVVKiTwhQ==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.51.0.tgz", + "integrity": "sha512-mM/JRQOzhVN1ykejrvwnBRV3+7yTKK8tVANVN3o1O0t0v7o+jqdVu9crPy5Y9dov15TJk/FTIgoUGHrTOVL3Zg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.50.1", + "@typescript-eslint/types": "8.51.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -22035,9 +22035,9 @@ } }, "node_modules/ts-api-utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.3.0.tgz", - "integrity": "sha512-6eg3Y9SF7SsAvGzRHQvvc1skDAhwI4YQ32ui1scxD1Ccr0G5qIIbUBT3pFTKX8kmWIQClHobtUdNuaBgwdfdWg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true, "license": "MIT", "engines": { @@ -22287,16 +22287,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.50.1.tgz", - "integrity": "sha512-ytTHO+SoYSbhAH9CrYnMhiLx8To6PSSvqnvXyPUgPETCvB6eBKmTI9w6XMPS3HsBRGkwTVBX+urA8dYQx6bHfQ==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.51.0.tgz", + "integrity": "sha512-jh8ZuM5oEh2PSdyQG9YAEM1TCGuWenLSuSUhf/irbVUNW9O5FhbFVONviN2TgMTBnUmyHv7E56rYnfLZK6TkiA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.50.1", - "@typescript-eslint/parser": "8.50.1", - "@typescript-eslint/typescript-estree": "8.50.1", - "@typescript-eslint/utils": "8.50.1" + "@typescript-eslint/eslint-plugin": "8.51.0", + "@typescript-eslint/parser": "8.51.0", + "@typescript-eslint/typescript-estree": "8.51.0", + "@typescript-eslint/utils": "8.51.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" diff --git a/package.json b/package.json index 296f0e96..98746699 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "node-fetch": "3.3.2", "prettier": "3.7.4", "typescript": "5.9.3", - "typescript-eslint": "8.50.1", + "typescript-eslint": "8.51.0", "typescript-plugin-css-modules": "5.2.0" } } From d4df97e569648d1184ca4222a55bfb92eb200478 Mon Sep 17 00:00:00 2001 From: BotBlake Date: Mon, 5 Jan 2026 21:09:57 +0100 Subject: [PATCH 151/190] remove h2 heading from caddy page --- docs/general/post-install/networking/8_reverse-proxy/caddy.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/general/post-install/networking/8_reverse-proxy/caddy.md b/docs/general/post-install/networking/8_reverse-proxy/caddy.md index 41d2d017..7bb88ef5 100644 --- a/docs/general/post-install/networking/8_reverse-proxy/caddy.md +++ b/docs/general/post-install/networking/8_reverse-proxy/caddy.md @@ -4,8 +4,6 @@ title: Caddy sidebar-position: 1 --- -## Caddy - > **Note:** For HTTP/3 support, ensure UDP port 443 is forwarded/opened on your firewall, as HTTP/3 uses UDP. "[Caddy](https://caddyserver.com/), sometimes clarified as the Caddy web server, is an open source, HTTP/2-enabled web server written in Go. It uses the Go standard library for its HTTP functionality." - [Wikipedia]() From 87614f742bcaaa70917634c07758421a0c7cc78b Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 6 Jan 2026 09:55:53 -0500 Subject: [PATCH 152/190] State of the Fin 20260106 (#1710) * State of the Fin 20260105 * Add Android TV section * Add 10.11 status update * Add credits and minor cleanup * Don't blame max * Lead with happy new year * Add Jellyfin Desktop segment * Remove server todo * Update vNext segment title and author * Which witch is which * Update date --- blog/2026/01-06-state-of-the-fin/index.mdx | 150 +++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 blog/2026/01-06-state-of-the-fin/index.mdx diff --git a/blog/2026/01-06-state-of-the-fin/index.mdx b/blog/2026/01-06-state-of-the-fin/index.mdx new file mode 100644 index 00000000..77e0a701 --- /dev/null +++ b/blog/2026/01-06-state-of-the-fin/index.mdx @@ -0,0 +1,150 @@ +--- +title: State of the Fin 2026-01-06 +authors: + - thornbill +slug: state-of-the-fin-2026-01-06 +tags: [state-of-the-fin] +--- + +Happy New Year and welcome to the State of the Fin! +This new blog series will regularly basis highlight the ongoing development of Jellyfin and our official clients. +We aim to keep our community informed and engaged, so feel free to share your feedback or thoughts on our progress! + +{/* truncate */} + +## Project Updates + +### Jellyfin Turns 7 + +December marked Jellyfin's 7th anniversary! +A lot has changed in 7 years, but we remain steadfast in our commitment to Open Source and to being the best personal media server out there. +Special thanks to our developers, testers, moderators, and supporters for your invaluable contributions! +Here's to many more years of collaboration and streaming! + +### Versioning + +We received a substantial amount of feedback regarding our versioning scheme following the 10.11 release, particularly concerning the stability of what are perceived as 'minor' version updates. +This has prompted internal discussions about potentially revising our versioning scheme in the next major release. +While nothing has been finalized yet, we are considering 'dropping' the major version 10, which would make the next release 12.0. +Stay tuned for further updates as we navigate this feedback! + +## Development Updates + +### 10.11 Release Status + +Jellyfin 10.11 introduced a major [EF Core refactor](https://jellyfin.org/posts/efcore-refactoring-incoming/), consolidating the legacy `library.db` into a single unified `jellyfin.db`. +Following more than six months of development and an additional six months of release candidate testing, version [10.11.0](https://jellyfin.org/posts/jellyfin-release-10.11.0/) was released last year. +This extended testing period allowed us to mitigate most [refactoring](https://github.com/jellyfin/jellyfin/issues/13047) and [RC](https://github.com/jellyfin/jellyfin/issues/14350)-related issues prior to release. + +Even with this level of testing, issues were expected given the scale of the database change and the limited number of users reporting bugs. +These issues are currently being tracked on GitHub across three categories: + +1. [General bugs](https://github.com/jellyfin/jellyfin/issues/15045) +2. [Performance bugs](https://github.com/jellyfin/jellyfin/issues/15685) +3. [Migration and database bugs](https://github.com/jellyfin/jellyfin/issues/15686) + +We have been moving quickly to address these issues, delivering four additional point releases with over [100 changes](https://github.com/jellyfin/jellyfin/compare/v10.11.0...v10.11.5) since the initial 10.11.0 release. +To date, most point releases have focused on resolving general and migration-related issues. +The remaining migration issues are largely isolated, one-off cases and are unlikely to be resolved. +Most general issues have already been fixed, and the next bug-fix release is expected to include additional fixes for music metadata display issues and for watched status not being preserved when media is replaced or renamed. + +We are continuing to investigate ways to mitigate performance issues caused by client-side enumeration and filtering of large datasets. + +### Jellyfin Web vNext (aka 10.12 / 12.0) + +- **Default 'Experimental' Layout**: The 'Experimental' layout is now enabled by default for all non-TV devices, introducing a new navigation layout and updated UI components. +- **Theming Support Overhaul**: We are improving theming support by enabling easier runtime customization of default themes through CSS variables and simplifying the process for creating new bundled themes. +- **Community Acknowledgment**: Huge thanks to those reviewing, testing, and providing feedback on web pull requests. Your contributions are immensely helpful, as the review burden largely falls on me alone! + +\- [thornbill](https://github.com/thornbill) + +## Client Corner + +### Jellyfin Desktop + +We're rebranding the desktop application from Jellyfin Media Player to Jellyfin Desktop. +The most noteworthy change is the migration from Qt 5 to Qt 6. +This seems to have improved overall performance, though we're still working out issues regarding memory leaks due to the migration. + +Apart from the Qt migration, other noteworthy updates. + +- Saved servers and settings will not be migrated from Jellyfin Media Player. +- We've laid the foundation for switching servers with the addition of profiles CLI options. The long-term goal is to have a UI for this as well, but the timeline is TBD. +- A slew of bug fixes are included. + +The release is currently available on [Flathub](https://github.com/jellyfin/jellyfin-desktop) and in the [Arch Linux AUR](https://aur.archlinux.org/packages/jellyfin-desktop). +Stable builds for Windows and macOS builds are not currently available. +Other Linux distributions will likely be added, though we recommend using Flathub for the time being. +We are not currently supporting Ubuntu 24.04 LTS due to it being stuck on the older Qt 6.4 series, while our new dependency, mpvqt, requires at least Qt 6.5. + +\- [Andrew Rabert](https://github.com/andrewrabert) + +### Jellyfin for Android TV + +Two versions of the Android TV app have been released: [v0.19.5](https://github.com/jellyfin/jellyfin-androidtv/releases/tag/v0.19.5) and [v0.19.6](https://github.com/jellyfin/jellyfin-androidtv/releases/tag/v0.19.6)! +These updates contain various improvements to music transcoding. The app now properly displays durations again and allows for seeking when music is transcoding. These changes also solve the issue of lyrics not scrolling in certain cases. + +For video playback, we have improved the stability of Live TV and now support direct play for the VC-1 and AV1 codecs (if your device supports them). The AV1 support was already available on Android 10 and newer but now works on older Fire TV devices as well. + +\- [Niels van Velzen](https://github.com/nielsvanvelzen) + +### Jellyfin for Xbox + +The last two updates brought the long awaited full gamepad support and fixes for 4K and HDR. + +- **Gamepad support**: Gamepad navigation is now the default navigation type for the Jellyfin for Xbox app and requires a server version of 10.11 or higher to work. However as we cannot switch the input mode type while the app is running, the Jellyfin for Xbox app can no longer connect to older versions than 10.11. As this is a fundamental change in how the app works, there are still a few hiccups like the app not loading correctly and users reporting that the gamepad does not work at all. In those instances we recommend uninstalling and reinstalling the app. +- **Web UI TV mode**: For versions of Jellyfin earlier than 10.11.5 the web UI still runs in the desktop mode, which might look a bit odd. However, with Jellyfin 10.11.5, we have fixed a bug that now correctly sets the web UI to TV mode, so the UI should work a lot better. +- **4K and HDR**: For the last few versions, we have been working on enabling 4K and HDR for the app. This is done by integrating with the web UI and switching the HDMI modes. Sadly, this also comes at the cost of not being allowed to run in the background. To enable 4K support, we had to use a feature flag that allocates more video memory to the Jellyfin for Xbox app, making it incompatible with running in the background. +- **General Improvements**: Alongside the shiny new headline features, we have also been working on the code in general, adding small improvements and cleaning up a lot of code. The latest versions added log files and their upload to the Jellyfin server, tighter integrations with the web UI, a settings view that can be expanded for future features, version compatibility checking, a better server connection experience, and more. +- **Future**: When I took over the for the previous maintainer almost a year ago, I made a rough plan for the general development of the app. I always planned on keeping the app as a web wrapper because while the app is certainly more popular than most think, it does not have enough support in development to be a full UWP app. Nevertheless, there are a few features left on my to-do list: + - Localization to other languages + - Server discovery + - Desktop support + - Better decoder support + - Subtitle storage on-device + +\- [JPVenson](https://github.com/JPVenson) + +### Jellyfin for Roku + +[3.0.15](https://github.com/jellyfin/jellyfin-roku/releases/tag/3.0.15) was released on 2025-12-18 and is our last release before Roku's year-end publishing blackout. It fixes a bug with HDHomeRun Tuners. + +\- [1hitsong](https://github.com/1hitsong) + +### Swiftfin + +#### Swiftfin 1.4 is out now! + +This is a large release with a lot of changes under the hood. Our three highlight changes are: + +1. [Navigation & Routing Overhaul](https://github.com/jellyfin/Swiftfin/pull/1602) +2. [Jellyfin 10.11 Support](https://github.com/jellyfin/Swiftfin/pull/1772) +3. [Revamped Media Player Manager](https://github.com/jellyfin/Swiftfin/pull/1581) + +#### Swiftfin Roadmap + +A [roadmap / project board](https://github.com/orgs/jellyfin/projects/68) for Swiftfin is now available! + +Follow [this discussion](https://github.com/jellyfin/Swiftfin/discussions/1294) for information about the next tvOS release. + +To help organize Issues & PRs, Swiftfin now has milestones to help users identify which changes will be included in each release: + +- [Version 1.5](https://github.com/jellyfin/Swiftfin/milestone/2) + - Contains issues that should be resolved in version 1.5 of Swiftfin iOS. +- [tvOS Resync](https://github.com/jellyfin/Swiftfin/milestone/3) + - Contains tvOS-specific issues that will be resolved as part of our next [tvOS Release](https://github.com/jellyfin/Swiftfin/discussions/1294). + - _Issues that impact tvOS but are part of 1.4 or 1.5 will end up in the version milestone instead of this one. Once tvOS is released, it should mirror our existing 1.X structure and iOS._ + +A more detailed post about these changes can be found [on GitHub](https://github.com/jellyfin/Swiftfin/discussions/1832)! + +\- [JPKribs](https://github.com/JPKribs) + +### Other TV Platforms + +- The Tizen app was submitted for review, but unfortunately [failed testing](https://github.com/jellyfin/jellyfin-tizen/issues/222#issuecomment-3621581689). Additional work is needed to replicate the reported issues and correct them. +- Support for multiple **new** platforms is currently underway, and we will provide updates as progress is made. + +Wishing you all happy streaming in 2026 and beyond! +We look forward to another year filled with exciting updates and features for Jellyfin. + +\- thornbill and the Jellyfin Team From cd9e174bfeeea19883ddefacea8cc7982f9dba19 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 8 Jan 2026 21:27:30 +0000 Subject: [PATCH 153/190] Update dependency globals to v17 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 733ea9d8..2a3e1541 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,7 +51,7 @@ "eslint-plugin-promise": "7.2.1", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "5.2.0", - "globals": "16.5.0", + "globals": "17.0.0", "markdownlint-cli": "0.47.0", "node-fetch": "3.3.2", "prettier": "3.7.4", @@ -11619,9 +11619,9 @@ } }, "node_modules/globals": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", - "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.0.0.tgz", + "integrity": "sha512-gv5BeD2EssA793rlFWVPMMCqefTlpusw6/2TbAVMy0FzcG8wKJn4O+NqJ4+XWmmwrayJgw5TzrmWjFgmz1XPqw==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 98746699..a25bc49b 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "eslint-plugin-promise": "7.2.1", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "5.2.0", - "globals": "16.5.0", + "globals": "17.0.0", "markdownlint-cli": "0.47.0", "node-fetch": "3.3.2", "prettier": "3.7.4", From 366f15d0977a07f051e9491112d1371d45345319 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Jan 2026 18:45:27 +0000 Subject: [PATCH 154/190] Update dependency typescript-eslint to v8.52.0 --- package-lock.json | 166 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 84 insertions(+), 84 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2a3e1541..d02a1382 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,7 +56,7 @@ "node-fetch": "3.3.2", "prettier": "3.7.4", "typescript": "5.9.3", - "typescript-eslint": "8.51.0", + "typescript-eslint": "8.52.0", "typescript-plugin-css-modules": "5.2.0" }, "engines": { @@ -3820,9 +3820,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3852,9 +3852,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -6105,20 +6105,20 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.51.0.tgz", - "integrity": "sha512-XtssGWJvypyM2ytBnSnKtHYOGT+4ZwTnBVl36TA4nRO2f4PRNGz5/1OszHzcZCvcBMh+qb7I06uoCmLTRdR9og==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.52.0.tgz", + "integrity": "sha512-okqtOgqu2qmZJ5iN4TWlgfF171dZmx2FzdOv2K/ixL2LZWDStL8+JgQerI2sa8eAEfoydG9+0V96m7V+P8yE1Q==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.51.0", - "@typescript-eslint/type-utils": "8.51.0", - "@typescript-eslint/utils": "8.51.0", - "@typescript-eslint/visitor-keys": "8.51.0", - "ignore": "^7.0.0", + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.52.0", + "@typescript-eslint/type-utils": "8.52.0", + "@typescript-eslint/utils": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.2.0" + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6128,7 +6128,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.51.0", + "@typescript-eslint/parser": "^8.52.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -6144,18 +6144,18 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.51.0.tgz", - "integrity": "sha512-3xP4XzzDNQOIqBMWogftkwxhg5oMKApqY0BAflmLZiFYHqyhSOxv/cd/zPQLTcCXr4AkaKb25joocY0BD1WC6A==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.52.0.tgz", + "integrity": "sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.51.0", - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/typescript-estree": "8.51.0", - "@typescript-eslint/visitor-keys": "8.51.0", - "debug": "^4.3.4" + "@typescript-eslint/scope-manager": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6170,15 +6170,15 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.51.0.tgz", - "integrity": "sha512-Luv/GafO07Z7HpiI7qeEW5NW8HUtZI/fo/kE0YbtQEFpJRUuR0ajcWfCE5bnMvL7QQFrmT/odMe8QZww8X2nfQ==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.52.0.tgz", + "integrity": "sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.51.0", - "@typescript-eslint/types": "^8.51.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.52.0", + "@typescript-eslint/types": "^8.52.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6192,14 +6192,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.51.0.tgz", - "integrity": "sha512-JhhJDVwsSx4hiOEQPeajGhCWgBMBwVkxC/Pet53EpBVs7zHHtayKefw1jtPaNRXpI9RA2uocdmpdfE7T+NrizA==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.52.0.tgz", + "integrity": "sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/visitor-keys": "8.51.0" + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6210,9 +6210,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.51.0.tgz", - "integrity": "sha512-Qi5bSy/vuHeWyir2C8u/uqGMIlIDu8fuiYWv48ZGlZ/k+PRPHtaAu7erpc7p5bzw2WNNSniuxoMSO4Ar6V9OXw==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.52.0.tgz", + "integrity": "sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==", "dev": true, "license": "MIT", "engines": { @@ -6227,17 +6227,17 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.51.0.tgz", - "integrity": "sha512-0XVtYzxnobc9K0VU7wRWg1yiUrw4oQzexCG2V2IDxxCxhqBMSMbjB+6o91A+Uc0GWtgjCa3Y8bi7hwI0Tu4n5Q==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.52.0.tgz", + "integrity": "sha512-JD3wKBRWglYRQkAtsyGz1AewDu3mTc7NtRjR/ceTyGoPqmdS5oCdx/oZMWD5Zuqmo6/MpsYs0wp6axNt88/2EQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/typescript-estree": "8.51.0", - "@typescript-eslint/utils": "8.51.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.2.0" + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0", + "@typescript-eslint/utils": "8.52.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6252,9 +6252,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.51.0.tgz", - "integrity": "sha512-TizAvWYFM6sSscmEakjY3sPqGwxZRSywSsPEiuZF6d5GmGD9Gvlsv0f6N8FvAAA0CD06l3rIcWNbsN1e5F/9Ag==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.52.0.tgz", + "integrity": "sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==", "dev": true, "license": "MIT", "engines": { @@ -6266,21 +6266,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.51.0.tgz", - "integrity": "sha512-1qNjGqFRmlq0VW5iVlcyHBbCjPB7y6SxpBkrbhNWMy/65ZoncXCEPJxkRZL8McrseNH6lFhaxCIaX+vBuFnRng==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.52.0.tgz", + "integrity": "sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.51.0", - "@typescript-eslint/tsconfig-utils": "8.51.0", - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/visitor-keys": "8.51.0", - "debug": "^4.3.4", - "minimatch": "^9.0.4", - "semver": "^7.6.0", + "@typescript-eslint/project-service": "8.52.0", + "@typescript-eslint/tsconfig-utils": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.2.0" + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6320,16 +6320,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.51.0.tgz", - "integrity": "sha512-11rZYxSe0zabiKaCP2QAwRf/dnmgFgvTmeDTtZvUvXG3UuAdg/GU02NExmmIXzz3vLGgMdtrIosI84jITQOxUA==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.52.0.tgz", + "integrity": "sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.51.0", - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/typescript-estree": "8.51.0" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6344,13 +6344,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.51.0.tgz", - "integrity": "sha512-mM/JRQOzhVN1ykejrvwnBRV3+7yTKK8tVANVN3o1O0t0v7o+jqdVu9crPy5Y9dov15TJk/FTIgoUGHrTOVL3Zg==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.52.0.tgz", + "integrity": "sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/types": "8.52.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -20722,9 +20722,9 @@ } }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -22287,16 +22287,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.51.0.tgz", - "integrity": "sha512-jh8ZuM5oEh2PSdyQG9YAEM1TCGuWenLSuSUhf/irbVUNW9O5FhbFVONviN2TgMTBnUmyHv7E56rYnfLZK6TkiA==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.52.0.tgz", + "integrity": "sha512-atlQQJ2YkO4pfTVQmQ+wvYQwexPDOIgo+RaVcD7gHgzy/IQA+XTyuxNM9M9TVXvttkF7koBHmcwisKdOAf2EcA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.51.0", - "@typescript-eslint/parser": "8.51.0", - "@typescript-eslint/typescript-estree": "8.51.0", - "@typescript-eslint/utils": "8.51.0" + "@typescript-eslint/eslint-plugin": "8.52.0", + "@typescript-eslint/parser": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0", + "@typescript-eslint/utils": "8.52.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" diff --git a/package.json b/package.json index a25bc49b..e3a1eaee 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "node-fetch": "3.3.2", "prettier": "3.7.4", "typescript": "5.9.3", - "typescript-eslint": "8.51.0", + "typescript-eslint": "8.52.0", "typescript-plugin-css-modules": "5.2.0" } } From 0e3a42bad8f76a9e0c60214a94959dbca8b85493 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 13 Jan 2026 03:12:50 +0000 Subject: [PATCH 155/190] Update dependency sass to v1.97.2 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index d02a1382..6eb0e563 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "file-loader": "6.2.0", "react": "18.3.1", "react-dom": "18.3.1", - "sass": "1.97.1", + "sass": "1.97.2", "swiper": "12.0.3", "ua-parser-js": "2.0.7", "url-loader": "4.1.1" @@ -20526,9 +20526,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.97.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.1.tgz", - "integrity": "sha512-uf6HoO8fy6ClsrShvMgaKUn14f2EHQLQRtpsZZLeU/Mv0Q1K5P0+x2uvH6Cub39TVVbWNSrraUhDAoFph6vh0A==", + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.2.tgz", + "integrity": "sha512-y5LWb0IlbO4e97Zr7c3mlpabcbBtS+ieiZ9iwDooShpFKWXf62zz5pEPdwrLYm+Bxn1fnbwFGzHuCLSA9tBmrw==", "license": "MIT", "peer": true, "dependencies": { diff --git a/package.json b/package.json index e3a1eaee..ac9e278b 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "file-loader": "6.2.0", "react": "18.3.1", "react-dom": "18.3.1", - "sass": "1.97.1", + "sass": "1.97.2", "swiper": "12.0.3", "ua-parser-js": "2.0.7", "url-loader": "4.1.1" From 815f90f05172e8bac81961bb6cc53fefaf41d985 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 13 Jan 2026 11:59:45 +0100 Subject: [PATCH 156/190] Merge pull request #1603 from jellyfin/renovate/major-linters Update dependency eslint-plugin-react-hooks to v7 --- eslint.config.mjs | 2 +- package-lock.json | 58 ++++++++++++++++++++++++--- package.json | 2 +- src/pages/downloads/clients/index.tsx | 15 ++++--- 4 files changed, 62 insertions(+), 15 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 6c4b0956..ecca81fb 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -22,7 +22,7 @@ export default ts.config([ '**/*.json' ]), react.configs.flat.recommended, - reactHooks.configs['recommended-latest'], + reactHooks.configs.flat.recommended, ...ts.configs.recommended, jsxA11Y.flatConfigs.recommended, { diff --git a/package-lock.json b/package-lock.json index 6eb0e563..f897ce4b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,7 +50,7 @@ "eslint-plugin-prettier": "5.5.4", "eslint-plugin-promise": "7.2.1", "eslint-plugin-react": "7.37.5", - "eslint-plugin-react-hooks": "5.2.0", + "eslint-plugin-react-hooks": "7.0.1", "globals": "17.0.0", "markdownlint-cli": "0.47.0", "node-fetch": "3.3.2", @@ -10495,13 +10495,20 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", - "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, "engines": { - "node": ">=10" + "node": ">=18" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" @@ -12077,6 +12084,23 @@ "he": "bin/he" } }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, "node_modules/history": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", @@ -23760,6 +23784,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zod": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", + "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", diff --git a/package.json b/package.json index ac9e278b..f033c562 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "eslint-plugin-prettier": "5.5.4", "eslint-plugin-promise": "7.2.1", "eslint-plugin-react": "7.37.5", - "eslint-plugin-react-hooks": "5.2.0", + "eslint-plugin-react-hooks": "7.0.1", "globals": "17.0.0", "markdownlint-cli": "0.47.0", "node-fetch": "3.3.2", diff --git a/src/pages/downloads/clients/index.tsx b/src/pages/downloads/clients/index.tsx index 8485b739..9915b394 100644 --- a/src/pages/downloads/clients/index.tsx +++ b/src/pages/downloads/clients/index.tsx @@ -4,11 +4,11 @@ import { mdiFilter } from '@mdi/js'; import Icon from '@mdi/react'; import Layout from '@theme/Layout'; import clsx from 'clsx'; -import React, { useEffect, useState } from 'react'; +import React, { useMemo, useState } from 'react'; import ClientDetails from '../../../components/clients/ClientDetails'; import Pill from '../../../components/common/Pill'; -import { Client, Clients, DeviceType } from '../../../data/clients'; +import { Clients, DeviceType } from '../../../data/clients'; import Platform, { FeaturedClientPlatforms } from '../../../data/platform'; import styles from '../index.module.scss'; @@ -37,7 +37,6 @@ export default function ClientsPage({ recommended = true }: { recommended?: bool const location = useLocation(); const searchParams = new URLSearchParams(location.search); - const [filteredClients, setFilteredClients] = useState([...Clients]); const [filter, setFilterValue] = useState({ recommended, deviceTypes: (searchParams.get('type')?.split(',') ?? []) as DeviceType[], @@ -62,8 +61,8 @@ export default function ClientsPage({ recommended = true }: { recommended?: bool setFilterValue(filter); }; - useEffect(() => { - setFilteredClients( + const filteredClients = useMemo( + () => Clients.filter((client) => { let result = true; @@ -81,9 +80,9 @@ export default function ClientsPage({ recommended = true }: { recommended?: bool (filter.platforms.length === 0 || client.platforms.some((platform) => filter.platforms.includes(platform))); return result; - }) - ); - }, [filter, setFilteredClients]); + }), + [filter] + ); return ( From a760c8e9edd324b23a4f9f8eb3e14f1a338bdc49 Mon Sep 17 00:00:00 2001 From: BotBlake Date: Wed, 14 Jan 2026 09:36:59 +0100 Subject: [PATCH 157/190] add Iksas css sugestion Co-authored-by: Iksas --- src/css/custom.scss | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/css/custom.scss b/src/css/custom.scss index 47a96f4b..3a4db822 100644 --- a/src/css/custom.scss +++ b/src/css/custom.scss @@ -5,6 +5,15 @@ * work well for content-centric websites. */ +html { + /* Note: "normal" activates all common ligatures */ + font-variant-ligatures: normal; +} + +code { + font-variant-ligatures: none; +} + :root { /* base font */ --ifm-font-family-base: 'Noto Sans', sans-serif; From 5ca9a915a7109d24848798b02d29639bb4b486b3 Mon Sep 17 00:00:00 2001 From: BotBlake Date: Thu, 15 Jan 2026 09:25:14 +0100 Subject: [PATCH 158/190] add cspell gha --- .github/workflows/spellckeck.yml | 14 + cspell.config.mjs | 15 + package-lock.json | 948 +++++++++++++++++++++++++++++-- package.json | 1 + project-words.txt | 477 ++++++++++++++++ 5 files changed, 1414 insertions(+), 41 deletions(-) create mode 100644 .github/workflows/spellckeck.yml create mode 100644 cspell.config.mjs create mode 100644 project-words.txt diff --git a/.github/workflows/spellckeck.yml b/.github/workflows/spellckeck.yml new file mode 100644 index 00000000..fbd23bc5 --- /dev/null +++ b/.github/workflows/spellckeck.yml @@ -0,0 +1,14 @@ +name: 'Check spelling' +on: + pull_request: + push: + branches: [master] + +jobs: + spellcheck: # run the action + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + with: + persist-credentials: false + - uses: streetsidesoftware/cspell-action@24fa8d3096a314ce263f39578744e9d9f8d80acf # v8.1.2 diff --git a/cspell.config.mjs b/cspell.config.mjs new file mode 100644 index 00000000..905123cf --- /dev/null +++ b/cspell.config.mjs @@ -0,0 +1,15 @@ +import { defineConfig } from 'cspell'; + +export default defineConfig({ + version: '0.2', + files: ['**/*.md'], + dictionaryDefinitions: [ + { + name: 'project-words', + path: './project-words.txt', + addWords: true + } + ], + dictionaries: ['project-words'], + ignorePaths: ['node_modules', '/project-words.txt'] +}); diff --git a/package-lock.json b/package-lock.json index f897ce4b..6f356307 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,7 @@ "@mdx-js/react": "3.1.1", "@svgr/webpack": "8.1.0", "clsx": "2.1.1", + "cspell": "9.2.0", "docusaurus-plugin-sass": "0.2.6", "file-loader": "6.2.0", "react": "18.3.1", @@ -121,7 +122,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -1849,6 +1849,526 @@ "node": ">=0.1.90" } }, + "node_modules/@cspell/cspell-bundled-dicts": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-9.2.0.tgz", + "integrity": "sha512-e4qb78SQWqHkRw47W8qFJ3RPijhSLkADF+T0oH8xl3r/golq1RGp2/KrWOqGRRofUSTiIKYqaMX7mbAyFnOxyA==", + "license": "MIT", + "dependencies": { + "@cspell/dict-ada": "^4.1.1", + "@cspell/dict-al": "^1.1.1", + "@cspell/dict-aws": "^4.0.12", + "@cspell/dict-bash": "^4.2.1", + "@cspell/dict-companies": "^3.2.2", + "@cspell/dict-cpp": "^6.0.9", + "@cspell/dict-cryptocurrencies": "^5.0.5", + "@cspell/dict-csharp": "^4.0.7", + "@cspell/dict-css": "^4.0.18", + "@cspell/dict-dart": "^2.3.1", + "@cspell/dict-data-science": "^2.0.9", + "@cspell/dict-django": "^4.1.5", + "@cspell/dict-docker": "^1.1.15", + "@cspell/dict-dotnet": "^5.0.10", + "@cspell/dict-elixir": "^4.0.8", + "@cspell/dict-en_us": "^4.4.15", + "@cspell/dict-en-common-misspellings": "^2.1.3", + "@cspell/dict-en-gb-mit": "^3.1.5", + "@cspell/dict-filetypes": "^3.0.13", + "@cspell/dict-flutter": "^1.1.1", + "@cspell/dict-fonts": "^4.0.5", + "@cspell/dict-fsharp": "^1.1.1", + "@cspell/dict-fullstack": "^3.2.7", + "@cspell/dict-gaming-terms": "^1.1.2", + "@cspell/dict-git": "^3.0.7", + "@cspell/dict-golang": "^6.0.23", + "@cspell/dict-google": "^1.0.9", + "@cspell/dict-haskell": "^4.0.6", + "@cspell/dict-html": "^4.0.12", + "@cspell/dict-html-symbol-entities": "^4.0.4", + "@cspell/dict-java": "^5.0.12", + "@cspell/dict-julia": "^1.1.1", + "@cspell/dict-k8s": "^1.0.12", + "@cspell/dict-kotlin": "^1.1.1", + "@cspell/dict-latex": "^4.0.4", + "@cspell/dict-lorem-ipsum": "^4.0.5", + "@cspell/dict-lua": "^4.0.8", + "@cspell/dict-makefile": "^1.0.5", + "@cspell/dict-markdown": "^2.0.12", + "@cspell/dict-monkeyc": "^1.0.11", + "@cspell/dict-node": "^5.0.8", + "@cspell/dict-npm": "^5.2.12", + "@cspell/dict-php": "^4.0.15", + "@cspell/dict-powershell": "^5.0.15", + "@cspell/dict-public-licenses": "^2.0.14", + "@cspell/dict-python": "^4.2.19", + "@cspell/dict-r": "^2.1.1", + "@cspell/dict-ruby": "^5.0.9", + "@cspell/dict-rust": "^4.0.12", + "@cspell/dict-scala": "^5.0.8", + "@cspell/dict-shell": "^1.1.1", + "@cspell/dict-software-terms": "^5.1.4", + "@cspell/dict-sql": "^2.2.1", + "@cspell/dict-svelte": "^1.0.7", + "@cspell/dict-swift": "^2.0.6", + "@cspell/dict-terraform": "^1.1.3", + "@cspell/dict-typescript": "^3.2.3", + "@cspell/dict-vue": "^3.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-json-reporter": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-9.2.0.tgz", + "integrity": "sha512-qHdkW8eyknCSDEsqCG8OHBMal03LQf21H2LVWhtwszEQ4BQRKcWctc+VIgkO69F/jLaN2wi/yhhMufXWHAEzIg==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-types": "9.2.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-pipe": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-9.2.0.tgz", + "integrity": "sha512-RO3adcsr7Ek+4511nyEOWDhOYYU1ogRs1Mo5xx3kDIdcKAJzhFdGry35T2wqft4dPASLCXcemBrhoS+hdQ+z+Q==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-resolver": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-9.2.0.tgz", + "integrity": "sha512-0Xvwq0iezfO71Alw+DjsGxacAzydqOAxdXnY4JknHuxt2l8GTSMjRwj65QAflv3PN6h1QoRZEeWdiKtusceWAw==", + "license": "MIT", + "dependencies": { + "global-directory": "^4.0.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-service-bus": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-9.2.0.tgz", + "integrity": "sha512-ZDvcOTFk3cCVW+OjlkljeP7aSuV8tIguVn+GMco1/A+961hsEP20hngK9zJtyfpXqyvJKtvCVlyzS+z8VRrZGg==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-types": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-9.2.0.tgz", + "integrity": "sha512-hL4ltFwiARpFxlfXt4GiTWQxIFyZp4wrlp7dozZbitYO6QlYc5fwQ8jBc5zFUqknuH4gx/sCMLNXhAv3enNGZQ==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/dict-ada": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.1.1.tgz", + "integrity": "sha512-E+0YW9RhZod/9Qy2gxfNZiHJjCYFlCdI69br1eviQQWB8yOTJX0JHXLs79kOYhSW0kINPVUdvddEBe6Lu6CjGQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-al": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-al/-/dict-al-1.1.1.tgz", + "integrity": "sha512-sD8GCaZetgQL4+MaJLXqbzWcRjfKVp8x+px3HuCaaiATAAtvjwUQ5/Iubiqwfd1boIh2Y1/3EgM3TLQ7Q8e0wQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-aws": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-4.0.17.tgz", + "integrity": "sha512-ORcblTWcdlGjIbWrgKF+8CNEBQiLVKdUOFoTn0KPNkAYnFcdPP0muT4892h7H4Xafh3j72wqB4/loQ6Nti9E/w==", + "license": "MIT" + }, + "node_modules/@cspell/dict-bash": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.2.2.tgz", + "integrity": "sha512-kyWbwtX3TsCf5l49gGQIZkRLaB/P8g73GDRm41Zu8Mv51kjl2H7Au0TsEvHv7jzcsRLS6aUYaZv6Zsvk1fOz+Q==", + "license": "MIT", + "dependencies": { + "@cspell/dict-shell": "1.1.2" + } + }, + "node_modules/@cspell/dict-companies": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.2.10.tgz", + "integrity": "sha512-bJ1qnO1DkTn7JYGXvxp8FRQc4yq6tRXnrII+jbP8hHmq5TX5o1Wu+rdfpoUQaMWTl6balRvcMYiINDesnpR9Bw==", + "license": "MIT" + }, + "node_modules/@cspell/dict-cpp": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-6.0.15.tgz", + "integrity": "sha512-N7MKK3llRNoBncygvrnLaGvmjo4xzVr5FbtAc9+MFGHK6/LeSySBupr1FM72XDaVSIsmBEe7sDYCHHwlI9Jb2w==", + "license": "MIT" + }, + "node_modules/@cspell/dict-cryptocurrencies": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-5.0.5.tgz", + "integrity": "sha512-R68hYYF/rtlE6T/dsObStzN5QZw+0aQBinAXuWCVqwdS7YZo0X33vGMfChkHaiCo3Z2+bkegqHlqxZF4TD3rUA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-csharp": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-4.0.8.tgz", + "integrity": "sha512-qmk45pKFHSxckl5mSlbHxmDitSsGMlk/XzFgt7emeTJWLNSTUK//MbYAkBNRtfzB4uD7pAFiKgpKgtJrTMRnrQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-css": { + "version": "4.0.19", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.19.tgz", + "integrity": "sha512-VYHtPnZt/Zd/ATbW3rtexWpBnHUohUrQOHff/2JBhsVgxOrksAxJnLAO43Q1ayLJBJUUwNVo+RU0sx0aaysZfg==", + "license": "MIT" + }, + "node_modules/@cspell/dict-dart": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.3.2.tgz", + "integrity": "sha512-sUiLW56t9gfZcu8iR/5EUg+KYyRD83Cjl3yjDEA2ApVuJvK1HhX+vn4e4k4YfjpUQMag8XO2AaRhARE09+/rqw==", + "license": "MIT" + }, + "node_modules/@cspell/dict-data-science": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-2.0.13.tgz", + "integrity": "sha512-l1HMEhBJkPmw4I2YGVu2eBSKM89K9pVF+N6qIr5Uo5H3O979jVodtuwP8I7LyPrJnC6nz28oxeGRCLh9xC5CVA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-django": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.1.6.tgz", + "integrity": "sha512-SdbSFDGy9ulETqNz15oWv2+kpWLlk8DJYd573xhIkeRdcXOjskRuxjSZPKfW7O3NxN/KEf3gm3IevVOiNuFS+w==", + "license": "MIT" + }, + "node_modules/@cspell/dict-docker": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.17.tgz", + "integrity": "sha512-OcnVTIpHIYYKhztNTyK8ShAnXTfnqs43hVH6p0py0wlcwRIXe5uj4f12n7zPf2CeBI7JAlPjEsV0Rlf4hbz/xQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-dotnet": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.11.tgz", + "integrity": "sha512-LSVKhpFf/ASTWJcfYeS0Sykcl1gVMsv2Z5Eo0TnTMSTLV3738HH+66pIsjUTChqU6SF3gKPuCe6EOaRYqb/evA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-elixir": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.8.tgz", + "integrity": "sha512-CyfphrbMyl4Ms55Vzuj+mNmd693HjBFr9hvU+B2YbFEZprE5AG+EXLYTMRWrXbpds4AuZcvN3deM2XVB80BN/Q==", + "license": "MIT" + }, + "node_modules/@cspell/dict-en_us": { + "version": "4.4.27", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.4.27.tgz", + "integrity": "sha512-0y4vH2i5cFmi8sxkc4OlD2IlnqDznOtKczm4h6jA288g5VVrm3bhkYK6vcB8b0CoRKtYWKet4VEmHBP1yI+Qfw==", + "license": "MIT" + }, + "node_modules/@cspell/dict-en-common-misspellings": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.1.11.tgz", + "integrity": "sha512-2jcY494If1udvzd7MT2z/QH/RACUo/I02vIY4ttNdZhgYvUmRKhg8OBdrbzYo0lJOcc7XUb8rhIFQRHzxOSVeA==", + "license": "CC BY-SA 4.0" + }, + "node_modules/@cspell/dict-en-gb-mit": { + "version": "3.1.16", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb-mit/-/dict-en-gb-mit-3.1.16.tgz", + "integrity": "sha512-4PPdapCJslytxAVJu35Mv97qDyGmAQxtDE790T2bWNhcqN6gvRVAc/eTRaXkUIf21q1xCxxNNqpH4VfMup69rQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-filetypes": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.15.tgz", + "integrity": "sha512-uDMeqYlLlK476w/muEFQGBy9BdQWS0mQ7BJiy/iQv5XUWZxE2O54ZQd9nW8GyQMzAgoyg5SG4hf9l039Qt66oA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-flutter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-flutter/-/dict-flutter-1.1.1.tgz", + "integrity": "sha512-UlOzRcH2tNbFhZmHJN48Za/2/MEdRHl2BMkCWZBYs+30b91mWvBfzaN4IJQU7dUZtowKayVIF9FzvLZtZokc5A==", + "license": "MIT" + }, + "node_modules/@cspell/dict-fonts": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-4.0.5.tgz", + "integrity": "sha512-BbpkX10DUX/xzHs6lb7yzDf/LPjwYIBJHJlUXSBXDtK/1HaeS+Wqol4Mlm2+NAgZ7ikIE5DQMViTgBUY3ezNoQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-fsharp": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-fsharp/-/dict-fsharp-1.1.1.tgz", + "integrity": "sha512-imhs0u87wEA4/cYjgzS0tAyaJpwG7vwtC8UyMFbwpmtw+/bgss+osNfyqhYRyS/ehVCWL17Ewx2UPkexjKyaBA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-fullstack": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-3.2.7.tgz", + "integrity": "sha512-IxEk2YAwAJKYCUEgEeOg3QvTL4XLlyArJElFuMQevU1dPgHgzWElFevN5lsTFnvMFA1riYsVinqJJX0BanCFEg==", + "license": "MIT" + }, + "node_modules/@cspell/dict-gaming-terms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.1.2.tgz", + "integrity": "sha512-9XnOvaoTBscq0xuD6KTEIkk9hhdfBkkvJAIsvw3JMcnp1214OCGW8+kako5RqQ2vTZR3Tnf3pc57o7VgkM0q1Q==", + "license": "MIT" + }, + "node_modules/@cspell/dict-git": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-3.0.7.tgz", + "integrity": "sha512-odOwVKgfxCQfiSb+nblQZc4ErXmnWEnv8XwkaI4sNJ7cNmojnvogYVeMqkXPjvfrgEcizEEA4URRD2Ms5PDk1w==", + "license": "MIT" + }, + "node_modules/@cspell/dict-golang": { + "version": "6.0.26", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.26.tgz", + "integrity": "sha512-YKA7Xm5KeOd14v5SQ4ll6afe9VSy3a2DWM7L9uBq4u3lXToRBQ1W5PRa+/Q9udd+DTURyVVnQ+7b9cnOlNxaRg==", + "license": "MIT" + }, + "node_modules/@cspell/dict-google": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-google/-/dict-google-1.0.9.tgz", + "integrity": "sha512-biL65POqialY0i4g6crj7pR6JnBkbsPovB2WDYkj3H4TuC/QXv7Pu5pdPxeUJA6TSCHI7T5twsO4VSVyRxD9CA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-haskell": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-4.0.6.tgz", + "integrity": "sha512-ib8SA5qgftExpYNjWhpYIgvDsZ/0wvKKxSP+kuSkkak520iPvTJumEpIE+qPcmJQo4NzdKMN8nEfaeci4OcFAQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-html": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.14.tgz", + "integrity": "sha512-2bf7n+kS92g+cMKV0wr9o/Oq9n8JzU7CcrB96gIh2GHgnF+0xDOqO2W/1KeFAqOfqosoOVE48t+4dnEMkkoJ2Q==", + "license": "MIT" + }, + "node_modules/@cspell/dict-html-symbol-entities": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.5.tgz", + "integrity": "sha512-429alTD4cE0FIwpMucvSN35Ld87HCyuM8mF731KU5Rm4Je2SG6hmVx7nkBsLyrmH3sQukTcr1GaiZsiEg8svPA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-java": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.12.tgz", + "integrity": "sha512-qPSNhTcl7LGJ5Qp6VN71H8zqvRQK04S08T67knMq9hTA8U7G1sTKzLmBaDOFhq17vNX/+rT+rbRYp+B5Nwza1A==", + "license": "MIT" + }, + "node_modules/@cspell/dict-julia": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-julia/-/dict-julia-1.1.1.tgz", + "integrity": "sha512-WylJR9TQ2cgwd5BWEOfdO3zvDB+L7kYFm0I9u0s9jKHWQ6yKmfKeMjU9oXxTBxIufhCXm92SKwwVNAC7gjv+yA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-k8s": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.12.tgz", + "integrity": "sha512-2LcllTWgaTfYC7DmkMPOn9GsBWsA4DZdlun4po8s2ysTP7CPEnZc1ZfK6pZ2eI4TsZemlUQQ+NZxMe9/QutQxg==", + "license": "MIT" + }, + "node_modules/@cspell/dict-kotlin": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-kotlin/-/dict-kotlin-1.1.1.tgz", + "integrity": "sha512-J3NzzfgmxRvEeOe3qUXnSJQCd38i/dpF9/t3quuWh6gXM+krsAXP75dY1CzDmS8mrJAlBdVBeAW5eAZTD8g86Q==", + "license": "MIT" + }, + "node_modules/@cspell/dict-latex": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-4.0.4.tgz", + "integrity": "sha512-YdTQhnTINEEm/LZgTzr9Voz4mzdOXH7YX+bSFs3hnkUHCUUtX/mhKgf1CFvZ0YNM2afjhQcmLaR9bDQVyYBvpA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-lorem-ipsum": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-4.0.5.tgz", + "integrity": "sha512-9a4TJYRcPWPBKkQAJ/whCu4uCAEgv/O2xAaZEI0n4y1/l18Yyx8pBKoIX5QuVXjjmKEkK7hi5SxyIsH7pFEK9Q==", + "license": "MIT" + }, + "node_modules/@cspell/dict-lua": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.8.tgz", + "integrity": "sha512-N4PkgNDMu9JVsRu7JBS/3E/dvfItRgk9w5ga2dKq+JupP2Y3lojNaAVFhXISh4Y0a6qXDn2clA6nvnavQ/jjLA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-makefile": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-makefile/-/dict-makefile-1.0.5.tgz", + "integrity": "sha512-4vrVt7bGiK8Rx98tfRbYo42Xo2IstJkAF4tLLDMNQLkQ86msDlYSKG1ZCk8Abg+EdNcFAjNhXIiNO+w4KflGAQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-markdown": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@cspell/dict-markdown/-/dict-markdown-2.0.14.tgz", + "integrity": "sha512-uLKPNJsUcumMQTsZZgAK9RgDLyQhUz/uvbQTEkvF/Q4XfC1i/BnA8XrOrd0+Vp6+tPOKyA+omI5LRWfMu5K/Lw==", + "license": "MIT", + "peerDependencies": { + "@cspell/dict-css": "^4.0.19", + "@cspell/dict-html": "^4.0.14", + "@cspell/dict-html-symbol-entities": "^4.0.5", + "@cspell/dict-typescript": "^3.2.3" + } + }, + "node_modules/@cspell/dict-monkeyc": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-monkeyc/-/dict-monkeyc-1.0.12.tgz", + "integrity": "sha512-MN7Vs11TdP5mbdNFQP5x2Ac8zOBm97ARg6zM5Sb53YQt/eMvXOMvrep7+/+8NJXs0jkp70bBzjqU4APcqBFNAw==", + "license": "MIT" + }, + "node_modules/@cspell/dict-node": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-5.0.8.tgz", + "integrity": "sha512-AirZcN2i84ynev3p2/1NCPEhnNsHKMz9zciTngGoqpdItUb2bDt1nJBjwlsrFI78GZRph/VaqTVFwYikmncpXg==", + "license": "MIT" + }, + "node_modules/@cspell/dict-npm": { + "version": "5.2.29", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.2.29.tgz", + "integrity": "sha512-ZAef8JpYmbuHFT1zekj/YyImLPvZevjECw663EmG5GPePyNo4AfH8Dd2fFhaOyQ3P5I5LrkAhGwypnOfUxcssw==", + "license": "MIT" + }, + "node_modules/@cspell/dict-php": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.1.1.tgz", + "integrity": "sha512-EXelI+4AftmdIGtA8HL8kr4WlUE11OqCSVlnIgZekmTkEGSZdYnkFdiJ5IANSALtlQ1mghKjz+OFqVs6yowgWA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-powershell": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.15.tgz", + "integrity": "sha512-l4S5PAcvCFcVDMJShrYD0X6Huv9dcsQPlsVsBGbH38wvuN7gS7+GxZFAjTNxDmTY1wrNi1cCatSg6Pu2BW4rgg==", + "license": "MIT" + }, + "node_modules/@cspell/dict-public-licenses": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.15.tgz", + "integrity": "sha512-cJEOs901H13Pfy0fl4dCD1U+xpWIMaEPq8MeYU83FfDZvellAuSo4GqWCripfIqlhns/L6+UZEIJSOZnjgy7Wg==", + "license": "MIT" + }, + "node_modules/@cspell/dict-python": { + "version": "4.2.25", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.2.25.tgz", + "integrity": "sha512-hDdN0YhKgpbtZVRjQ2c8jk+n0wQdidAKj1Fk8w7KEHb3YlY5uPJ0mAKJk7AJKPNLOlILoUmN+HAVJz+cfSbWYg==", + "license": "MIT", + "dependencies": { + "@cspell/dict-data-science": "^2.0.13" + } + }, + "node_modules/@cspell/dict-r": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-r/-/dict-r-2.1.1.tgz", + "integrity": "sha512-71Ka+yKfG4ZHEMEmDxc6+blFkeTTvgKbKAbwiwQAuKl3zpqs1Y0vUtwW2N4b3LgmSPhV3ODVY0y4m5ofqDuKMw==", + "license": "MIT" + }, + "node_modules/@cspell/dict-ruby": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.1.0.tgz", + "integrity": "sha512-9PJQB3cfkBULrMLp5kSAcFPpzf8oz9vFN+QYZABhQwWkGbuzCIXSorHrmWSASlx4yejt3brjaWS57zZ/YL5ZQQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-rust": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.1.1.tgz", + "integrity": "sha512-fXiXnZH0wOaEVTKFRNaz6TsUGhuB8dAT0ubYkDNzRQCaV5JGSOebGb1v2x5ZrOSVp+moxWM/vdBfiNU6KOEaFQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-scala": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.9.tgz", + "integrity": "sha512-AjVcVAELgllybr1zk93CJ5wSUNu/Zb5kIubymR/GAYkMyBdYFCZ3Zbwn4Zz8GJlFFAbazABGOu0JPVbeY59vGg==", + "license": "MIT" + }, + "node_modules/@cspell/dict-shell": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-shell/-/dict-shell-1.1.2.tgz", + "integrity": "sha512-WqOUvnwcHK1X61wAfwyXq04cn7KYyskg90j4lLg3sGGKMW9Sq13hs91pqrjC44Q+lQLgCobrTkMDw9Wyl9nRFA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-software-terms": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-5.1.20.tgz", + "integrity": "sha512-TEk1xHvetTI4pv7Vzje1D322m6QEjaH2P6ucOOf6q7EJCppQIdC0lZSXkgHJAFU5HGSvEXSzvnVeW2RHW86ziQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-sql": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.2.1.tgz", + "integrity": "sha512-qDHF8MpAYCf4pWU8NKbnVGzkoxMNrFqBHyG/dgrlic5EQiKANCLELYtGlX5auIMDLmTf1inA0eNtv74tyRJ/vg==", + "license": "MIT" + }, + "node_modules/@cspell/dict-svelte": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-svelte/-/dict-svelte-1.0.7.tgz", + "integrity": "sha512-hGZsGqP0WdzKkdpeVLBivRuSNzOTvN036EBmpOwxH+FTY2DuUH7ecW+cSaMwOgmq5JFSdTcbTNFlNC8HN8lhaQ==", + "license": "MIT" + }, + "node_modules/@cspell/dict-swift": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-2.0.6.tgz", + "integrity": "sha512-PnpNbrIbex2aqU1kMgwEKvCzgbkHtj3dlFLPMqW1vSniop7YxaDTtvTUO4zA++ugYAEL+UK8vYrBwDPTjjvSnA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-terraform": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-terraform/-/dict-terraform-1.1.3.tgz", + "integrity": "sha512-gr6wxCydwSFyyBKhBA2xkENXtVFToheqYYGFvlMZXWjviynXmh+NK/JTvTCk/VHk3+lzbO9EEQKee6VjrAUSbA==", + "license": "MIT" + }, + "node_modules/@cspell/dict-typescript": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.2.3.tgz", + "integrity": "sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg==", + "license": "MIT" + }, + "node_modules/@cspell/dict-vue": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-3.0.5.tgz", + "integrity": "sha512-Mqutb8jbM+kIcywuPQCCaK5qQHTdaByoEO2J9LKFy3sqAdiBogNkrplqUK0HyyRFgCfbJUgjz3N85iCMcWH0JA==", + "license": "MIT" + }, + "node_modules/@cspell/dynamic-import": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-9.2.0.tgz", + "integrity": "sha512-2/k4LR8CQqbgIPQGELbCdt9xgg9+aQ7pMwOtllKvnFYBtwNiwqcZjlzAam2gtvD5DghKX2qrcSHG5A7YP5cX9A==", + "license": "MIT", + "dependencies": { + "@cspell/url": "9.2.0", + "import-meta-resolve": "^4.1.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/filetypes": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@cspell/filetypes/-/filetypes-9.2.0.tgz", + "integrity": "sha512-6wmCa3ZyI647H7F4w6kb9PCJ703JKSgFTB8EERTdIoGySbgVp5+qMIIoZ//wELukdjgcufcFZ5pBrhRDRsemRA==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/strong-weak-map": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-9.2.0.tgz", + "integrity": "sha512-5mpIMiIOCu4cBqy1oCTXISgJuOCQ6R/e38AkvnYWfmMIx7fCdx8n+mF52wX9m61Ng28Sq8VL253xybsWcCxHug==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/url": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@cspell/url/-/url-9.2.0.tgz", + "integrity": "sha512-plB0wwdAESqBl4xDAT2db2/K1FZHJXfYlJTiV6pkn0XffTGyg4UGLaSCm15NzUoPxdSmzqj5jQb7y+mB9kFK8g==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/@csstools/cascade-layer-name-parser": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", @@ -1956,7 +2476,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -1979,7 +2498,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -2089,7 +2607,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -2511,7 +3028,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3153,7 +3669,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.2.tgz", "integrity": "sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw==", "license": "MIT", - "peer": true, "dependencies": { "@docusaurus/babel": "3.9.2", "@docusaurus/bundler": "3.9.2", @@ -3359,7 +3874,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", - "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -3503,7 +4017,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.2.tgz", "integrity": "sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag==", "license": "MIT", - "peer": true, "dependencies": { "@docusaurus/mdx-loader": "3.9.2", "@docusaurus/module-type-aliases": "3.9.2", @@ -4387,7 +4900,6 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", - "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -5281,7 +5793,6 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -5956,7 +6467,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -6149,7 +6659,6 @@ "integrity": "sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.52.0", "@typescript-eslint/types": "8.52.0", @@ -6573,7 +7082,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -6641,7 +7149,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6874,6 +7381,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-timsort": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", + "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", + "license": "MIT" + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -7367,7 +7880,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", @@ -7575,6 +8087,33 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chalk-template": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.2.tgz", + "integrity": "sha512-2bxTP2yUH7AJj/VAXfcA+4IcWGdQ87HwBANLt5XxGTeomo8yG0y95N1um9i5StvhT/Bl0/2cARA5v1PpPXUxUA==", + "license": "MIT", + "dependencies": { + "chalk": "^5.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "node_modules/chalk-template/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -7667,7 +8206,6 @@ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", @@ -7767,6 +8305,43 @@ "node": ">=6" } }, + "node_modules/clear-module": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/clear-module/-/clear-module-4.1.2.tgz", + "integrity": "sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==", + "license": "MIT", + "dependencies": { + "parent-module": "^2.0.0", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clear-module/node_modules/parent-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz", + "integrity": "sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==", + "license": "MIT", + "dependencies": { + "callsites": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clear-module/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cli-boxes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", @@ -7911,6 +8486,20 @@ "node": ">= 6" } }, + "node_modules/comment-json": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.5.1.tgz", + "integrity": "sha512-taEtr3ozUmOB7it68Jll7s0Pwm+aoiHyXKrEC8SEodL4rNpdfDLqa7PfBlrgFoCNNdR8ImL+muti5IGvktJAAg==", + "license": "MIT", + "dependencies": { + "array-timsort": "^1.0.3", + "core-util-is": "^1.0.3", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/common-path-prefix": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", @@ -8281,6 +8870,243 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cspell": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-9.2.0.tgz", + "integrity": "sha512-AKzaFMem2jRcGpAY2spKP0z15jpZeX1WTDNHCDsB8/YvnhnOfWXc0S5AF+4sfU1cQgHWYGFOolMuTri0ZQdV+Q==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-json-reporter": "9.2.0", + "@cspell/cspell-pipe": "9.2.0", + "@cspell/cspell-types": "9.2.0", + "@cspell/dynamic-import": "9.2.0", + "@cspell/url": "9.2.0", + "chalk": "^5.4.1", + "chalk-template": "^1.1.0", + "commander": "^14.0.0", + "cspell-config-lib": "9.2.0", + "cspell-dictionary": "9.2.0", + "cspell-gitignore": "9.2.0", + "cspell-glob": "9.2.0", + "cspell-io": "9.2.0", + "cspell-lib": "9.2.0", + "fast-json-stable-stringify": "^2.1.0", + "flatted": "^3.3.3", + "semver": "^7.7.2", + "tinyglobby": "^0.2.14" + }, + "bin": { + "cspell": "bin.mjs", + "cspell-esm": "bin.mjs" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/streetsidesoftware/cspell?sponsor=1" + } + }, + "node_modules/cspell-config-lib": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-9.2.0.tgz", + "integrity": "sha512-Yc8+hT+uIWWCi6WMhOL6HDYbBCP2qig1tgKGThHVeOx6GviieV10TZ5kQ+P7ONgoqw2nmm7uXIC19dGYx3DblQ==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-types": "9.2.0", + "comment-json": "^4.2.5", + "smol-toml": "^1.4.1", + "yaml": "^2.8.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-config-lib/node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/cspell-dictionary": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-9.2.0.tgz", + "integrity": "sha512-lV4VtjsDtxu8LyCcb6DY7Br4e/Aw1xfR8QvjYhHaJ8t03xry9STey5Rkfp+lz+hlVevNcn3lfCaacGuXyD+lLg==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-pipe": "9.2.0", + "@cspell/cspell-types": "9.2.0", + "cspell-trie-lib": "9.2.0", + "fast-equals": "^5.2.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-gitignore": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-9.2.0.tgz", + "integrity": "sha512-gXDQZ7czTPwmEg1qtsUIjVEFm9IfgTO8rA02O8eYIveqjFixbSV3fIYOgoxZSZYxjt3O44m8+/zAFC1RE4CM/Q==", + "license": "MIT", + "dependencies": { + "@cspell/url": "9.2.0", + "cspell-glob": "9.2.0", + "cspell-io": "9.2.0" + }, + "bin": { + "cspell-gitignore": "bin.mjs" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-glob": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-9.2.0.tgz", + "integrity": "sha512-viycZDyegzW2AKPFqvX5RveqTrB0sKgexlCu2A8z8eumpYYor5sD1NP05VDOqkAF4hDuiGqkHn6iNo0L1wNgLw==", + "license": "MIT", + "dependencies": { + "@cspell/url": "9.2.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-glob/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/cspell-grammar": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-9.2.0.tgz", + "integrity": "sha512-qthAmWcNHpYAmufy7YWVg9xwrYANkVlI40bgC2uGd8EnKssm/qOPhqXXNS+kLf+q0NmJM5nMgRLhCC23xSp3JA==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-pipe": "9.2.0", + "@cspell/cspell-types": "9.2.0" + }, + "bin": { + "cspell-grammar": "bin.mjs" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-io": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-9.2.0.tgz", + "integrity": "sha512-oxKiqFLcz629FmOId8UpdDznpMvCgpuktg4nkD2G9pYpRh+fRLZpP4QtZPyvJqvpUIzFhIOznMeHjsiBYHOZUA==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-service-bus": "9.2.0", + "@cspell/url": "9.2.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-lib": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-9.2.0.tgz", + "integrity": "sha512-RnhDIsETw6Ex0UaK3PFoJ2FwWMWfJPtdpNpv1qgmJwoGD4CzwtIqPOLtZ24zqdCP8ZnNTF/lwV/9rZVqifYjsw==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-bundled-dicts": "9.2.0", + "@cspell/cspell-pipe": "9.2.0", + "@cspell/cspell-resolver": "9.2.0", + "@cspell/cspell-types": "9.2.0", + "@cspell/dynamic-import": "9.2.0", + "@cspell/filetypes": "9.2.0", + "@cspell/strong-weak-map": "9.2.0", + "@cspell/url": "9.2.0", + "clear-module": "^4.1.2", + "comment-json": "^4.2.5", + "cspell-config-lib": "9.2.0", + "cspell-dictionary": "9.2.0", + "cspell-glob": "9.2.0", + "cspell-grammar": "9.2.0", + "cspell-io": "9.2.0", + "cspell-trie-lib": "9.2.0", + "env-paths": "^3.0.0", + "fast-equals": "^5.2.2", + "gensequence": "^7.0.0", + "import-fresh": "^3.3.1", + "resolve-from": "^5.0.0", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-uri": "^3.1.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-lib/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cspell-lib/node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "license": "MIT" + }, + "node_modules/cspell-trie-lib": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-9.2.0.tgz", + "integrity": "sha512-6GHL1KvLQzcPBSNY6QWOabq8YwRJAnNKamA0O/tRKy+11Hy99ysD4xvfu3kKYPAcobp5ZykX4nudHxy8yrEvng==", + "license": "MIT", + "dependencies": { + "@cspell/cspell-pipe": "9.2.0", + "@cspell/cspell-types": "9.2.0", + "gensequence": "^7.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cspell/node_modules/commander": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/css-blank-pseudo": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", @@ -8385,7 +9211,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -8705,7 +9530,6 @@ "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10" } @@ -9115,7 +9939,6 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -9847,6 +10670,18 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/errno": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", @@ -10127,7 +10962,6 @@ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -10204,7 +11038,6 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", - "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -10958,6 +11791,15 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/fast-equals": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.0.tgz", + "integrity": "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -11253,7 +12095,6 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, "license": "ISC" }, "node_modules/follow-redirects": { @@ -11439,6 +12280,15 @@ "node": ">= 0.4" } }, + "node_modules/gensequence": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-7.0.0.tgz", + "integrity": "sha512-47Frx13aZh01afHJTB3zTtKIlFI6vWY+MYCN9Qpew6i52rfKjnhCF/l1YlC8UmEMvvntZZ6z4PiCcmyuedR2aQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -11610,6 +12460,30 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "license": "BSD-2-Clause" }, + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "license": "MIT", + "dependencies": { + "ini": "4.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-directory/node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/global-dirs": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", @@ -12514,6 +13388,16 @@ "node": ">=8" } }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -17784,7 +18668,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -18728,7 +19611,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -19282,7 +20164,6 @@ "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -19609,7 +20490,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -19622,7 +20502,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -19667,7 +20546,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/react": "*" }, @@ -19696,7 +20574,6 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -20554,7 +21431,6 @@ "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.2.tgz", "integrity": "sha512-y5LWb0IlbO4e97Zr7c3mlpabcbBtS+ieiZ9iwDooShpFKWXf62zz5pEPdwrLYm+Bxn1fnbwFGzHuCLSA9tBmrw==", "license": "MIT", - "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -20683,7 +21559,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -21205,7 +22080,6 @@ "version": "1.5.2", "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.5.2.tgz", "integrity": "sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">= 18" @@ -21938,7 +22812,6 @@ "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -21955,7 +22828,6 @@ "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, "license": "MIT", "engines": { "node": ">=12.0.0" @@ -21973,9 +22845,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -22146,8 +23016,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", @@ -22301,7 +23170,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -23034,7 +23902,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.0.tgz", "integrity": "sha512-hUtqAR3ZLVEYDEABdBioQCIqSoguHbFn1K7WlPPWSuXmx0031BD73PSE35jKyftdSh4YLDoQNgK4pqBt5Q82MA==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -23790,7 +24657,6 @@ "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", "dev": true, "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index f033c562..de921bb7 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "@mdx-js/react": "3.1.1", "@svgr/webpack": "8.1.0", "clsx": "2.1.1", + "cspell": "9.2.0", "docusaurus-plugin-sass": "0.2.6", "file-loader": "6.2.0", "react": "18.3.1", diff --git a/project-words.txt b/project-words.txt new file mode 100644 index 00000000..b378e16b --- /dev/null +++ b/project-words.txt @@ -0,0 +1,477 @@ +aabc +abled +actionban +actionunban +addrepo +airsafter +airsbefore +alac +albumartistsort +allports +alpn +alpn +analyzeduration +anthonylavado +apiclient +apsell +archlinux +armbian +armhf +asahi +aspectratio +aspm +atsc +audiodbalbumid +audiodbartistid +audiofin +autoclean +autoremove +autoscans +avhw +avsd +banip +bantime +barebones +Battlemage +BDMV +behaviour +behaviours +behindthescenes +blitter +Blitter +Broadwell +buildinfo +cachedir +Caddyfile +candry +cdart +Celeron +centurylinklabs +certbot +Certbot +certificateresolvers +certificatesresolvers +certonly +cewert +CGNAT +CHACHA +Cheatsheet +chevrotin +chromecast +Chromecast +chronyd +CIFS +clearart +clearlogo +clinfo +codenames +codesign +collectionnumber +colour +colours +comskip +configdir +confs +countrycode +cpus +criticrating +crosstool +cuda +customrating +customresponseheaders +CUVID +datasheet +dateadded +dden +dearmor +debuntu +deinterlacing +deletedscene +DHLEVEL +dhparams +DISABLEFILELOCKING +discart +displayepisode +displayorder +displayseason +directio +distros +dists +dkanada +dlna +DNSPLUGIN +Dockerfiles +downmix +Downmix +downmixes +downmixing +dpkg +DRTG +druscoe +drwxr +DUCKDNSTOKEN +DXVA +elrc +emby +enddate +enmod +ETSI +evermeet +executionpolicy +exposedbydefault +EXTINF +EXTM +extradomains +extrafanart +extrepo +failregex +fanart +fastcgi +favorited +fedor +ferferga +FFMPEGDIR +ffprobe +Fider +findtime +firewalld +firmware +firmwares +flac +Flathub +Flix +Floostream +focuscontainer +Fontawesome +forwardfor +Freccia +Freenode +frontpage +fsbs +ftab +fullchain +Geekbench +Geforce +geoblocking +Geoip +geolocation +getent +gifsicle +gpedit +GPGPU +gstreamer +HDHR +Headend +healthcheck +hitsong +hmac +Homerun +hostname +hostnames +hostwebclient +hotfixes +hotio +hoverable +hsbs +hsts +htab +HTPC +HTSP +httpchallenge +httpchk +hwaccel +imdb +imdbid +initscripts +inotify +ipban +IPTV +irqs +itid +iwalton +Izzy +jeffbridges +jellyfin +JELLYFINDIR +Jellyfins +Jellyseer +jfdiscord +jftest +jimdogx +joshuaboniface +journalctl +jpegd +jpege +Kaby +keyrings +keyserver +kodi +Kodi +lastplayed +Lavado +lavfi +ldconfig +leresolver +letsencrypt +libc +libmali +libnvcuvid +libnvidia +libplacebo +libva +llvmpipe +localappdata +localtitle +lockdata +lockedfields +logdir +logfile +logfiles +logpath +lshw +LSIO +lzma +machinectl +macvlan +MAINPID +Maxr +maxretry +Mbps +mcarlton +mediaserver +mergerfs +Metaarchives +Metaimages +Metapackages +metaarchive +metaarchives +metaimage +metaimages +metapackage +metapackages +mintls +mirrorbits +mirorrbits +mirrorinfo +mirrorlist +mirrorstats +mirrorsync +mkinitcpio +mmdb +mobi +modeset +mopidy +mpaa +Multicore +multiversion +Multiview +musicbox +musicbrainzalbumartistid +musicbrainzalbumid +musicbrainzartistid +musicbrainzreleasegroupid +myjellyfin +myvideos +nasm +Navi +ncmpcpp +newbaseurl +nftables +Niels +nielsvanvelzen +nightlies +Nightmode +noarch +noarchive +noautorunwebapp +nodesource +nodistro +noimageindex +nonfree +noninteractive +Nontranscoded +nosniff +nosnippet +notranslate +nowebclient +nssm +NVDEC +NVENC +nvidiactl +ocid +ocsp +offtopic +OLDFILES +Olivo +OMDB +onevpl +OPTOUT +originaltitle +outros +pacman +Palinuro +partnumber +parttype +𝘱𝘢𝘵𝘩 +PGID +PGSSUB +Pictureless +playcount +playerstats +Powerline +privkey +probesize +Profil +PROGRAMDATA +projectname +providernameid +publickey +PUID +Quadro +QUIC +Rabert +Radarr +radeon +Radeon +radeonsi +radeontop +RADV +ratelimits +rclone +RDNA +readthrough +Realtek +redir +redirections +redirector +redirectscheme +referer +releasedate +remoteip +remux +remuxed +remuxing +repofile +rescan +rffmpeg +rgba +rkmpp +RKMPP +rkrga +rkvdec +rkvenc +Robibero +rockchip +Ronin +rpmfusion +RSSDP +rsyncd +Ryzen +scrollbuttons +scroller +Scyfin +seasonnumber +secp +secretfilter +seekbar +SEMA +sendfile +Serilog +setsebool +shoutcast +showtitle +Skia +skylake +Skylake +Sonarr +sortname +sorttitle +soughtafter +Spacetech +specifishity +speedbumps +splashscreen +SSDP +storebadge +stripsecrets +subcc +subcomponents +subfolders +subheaders +subpackages +subteam +sudoedit +superfast +Swiftfin +synchronised +syncplay +sysconfig +Sysoev +systempaths +tailnet +thornbill +Tigerlake +timedatectl +TMDB +tmdbid +tmpfs +tonemapping +triaging +trickplay +Trixie +truenas +TSIG +TVDB +tvdbid +tvheadend +tvrageid +tvshow +TXTT +Ultrachromic +ultrafast +unban +unbanip +Uncorr +unsynchronised +Unsynchronized +upvote +usermod +userns +vaapi +vainfo +valhall +Vasily +vdpu +Velzen +Venson +vepu +veryfast +veryslow +videoid +videotoolbox +vitorsemeano +Vium +Vorbis +VORBIS +weba +webclient +webdir +Weblate +webroot +Webroot +Webstorm +webui +wheter +withcolor +withuserdata +wstunnel +xattr +Xbmc +XMLTV +xorg +Xorg +Xvolume +xvzf +ycbcr +youruser +yourusername From 301518fd8ee60c99cdb4b94f6e560242c16d9bb0 Mon Sep 17 00:00:00 2001 From: BotBlake Date: Thu, 15 Jan 2026 09:49:14 +0100 Subject: [PATCH 159/190] add config file to workflow --- .github/workflows/spellckeck.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/spellckeck.yml b/.github/workflows/spellckeck.yml index fbd23bc5..538eb672 100644 --- a/.github/workflows/spellckeck.yml +++ b/.github/workflows/spellckeck.yml @@ -12,3 +12,5 @@ jobs: with: persist-credentials: false - uses: streetsidesoftware/cspell-action@24fa8d3096a314ce263f39578744e9d9f8d80acf # v8.1.2 + with: + config: ./cspell.config.mjs From 541a63c85c8663850accded922473e07ec452ea2 Mon Sep 17 00:00:00 2001 From: BotBlake Date: Thu, 15 Jan 2026 10:04:31 +0100 Subject: [PATCH 160/190] shoulda used spellchecker --- .github/workflows/{spellckeck.yml => spellcheck.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{spellckeck.yml => spellcheck.yml} (100%) diff --git a/.github/workflows/spellckeck.yml b/.github/workflows/spellcheck.yml similarity index 100% rename from .github/workflows/spellckeck.yml rename to .github/workflows/spellcheck.yml From 006a7699708c03de048eec247b5933c320bd464d Mon Sep 17 00:00:00 2001 From: BotBlake Date: Thu, 15 Jan 2026 10:07:46 +0100 Subject: [PATCH 161/190] remove persist credentials --- .github/workflows/spellcheck.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/spellcheck.yml b/.github/workflows/spellcheck.yml index 538eb672..1888b1d9 100644 --- a/.github/workflows/spellcheck.yml +++ b/.github/workflows/spellcheck.yml @@ -9,8 +9,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - with: - persist-credentials: false - uses: streetsidesoftware/cspell-action@24fa8d3096a314ce263f39578744e9d9f8d80acf # v8.1.2 with: config: ./cspell.config.mjs From 8bc90135669fd4b8c51b3218546c44782a089886 Mon Sep 17 00:00:00 2001 From: BotBlake Date: Thu, 15 Jan 2026 10:37:16 +0100 Subject: [PATCH 162/190] cspell via eslint plugin --- eslint.config.mjs | 10 +- package-lock.json | 871 +++++++++++++++++++++++----------------------- package.json | 2 +- 3 files changed, 454 insertions(+), 429 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index ecca81fb..ae8a3776 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,3 +1,4 @@ +import cspellConfigs from '@cspell/eslint-plugin/configs'; import { globalIgnores } from 'eslint/config'; import react from 'eslint-plugin-react'; import reactHooks from 'eslint-plugin-react-hooks'; @@ -21,6 +22,7 @@ export default ts.config([ '**/yarn-error.log*', '**/*.json' ]), + cspellConfigs.recommended, react.configs.flat.recommended, reactHooks.configs.flat.recommended, ...ts.configs.recommended, @@ -51,7 +53,13 @@ export default ts.config([ rules: { 'no-unused-vars': 'off', - '@typescript-eslint/no-unused-vars': 'error' + '@typescript-eslint/no-unused-vars': 'error', + '@cspell/spellchecker': [ + 'error', + { + configFile: new URL('./cspell.config.mjs', import.meta.url).toString() + } + ] } } ]); diff --git a/package-lock.json b/package-lock.json index 6f356307..acfe1e2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,6 @@ "@mdx-js/react": "3.1.1", "@svgr/webpack": "8.1.0", "clsx": "2.1.1", - "cspell": "9.2.0", "docusaurus-plugin-sass": "0.2.6", "file-loader": "6.2.0", "react": "18.3.1", @@ -37,6 +36,7 @@ "url-loader": "4.1.1" }, "devDependencies": { + "@cspell/eslint-plugin": "9.6.0", "@docusaurus/module-type-aliases": "3.9.2", "@docusaurus/tsconfig": "3.9.2", "@eslint/js": "9.39.2", @@ -1849,148 +1849,32 @@ "node": ">=0.1.90" } }, - "node_modules/@cspell/cspell-bundled-dicts": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-9.2.0.tgz", - "integrity": "sha512-e4qb78SQWqHkRw47W8qFJ3RPijhSLkADF+T0oH8xl3r/golq1RGp2/KrWOqGRRofUSTiIKYqaMX7mbAyFnOxyA==", - "license": "MIT", - "dependencies": { - "@cspell/dict-ada": "^4.1.1", - "@cspell/dict-al": "^1.1.1", - "@cspell/dict-aws": "^4.0.12", - "@cspell/dict-bash": "^4.2.1", - "@cspell/dict-companies": "^3.2.2", - "@cspell/dict-cpp": "^6.0.9", - "@cspell/dict-cryptocurrencies": "^5.0.5", - "@cspell/dict-csharp": "^4.0.7", - "@cspell/dict-css": "^4.0.18", - "@cspell/dict-dart": "^2.3.1", - "@cspell/dict-data-science": "^2.0.9", - "@cspell/dict-django": "^4.1.5", - "@cspell/dict-docker": "^1.1.15", - "@cspell/dict-dotnet": "^5.0.10", - "@cspell/dict-elixir": "^4.0.8", - "@cspell/dict-en_us": "^4.4.15", - "@cspell/dict-en-common-misspellings": "^2.1.3", - "@cspell/dict-en-gb-mit": "^3.1.5", - "@cspell/dict-filetypes": "^3.0.13", - "@cspell/dict-flutter": "^1.1.1", - "@cspell/dict-fonts": "^4.0.5", - "@cspell/dict-fsharp": "^1.1.1", - "@cspell/dict-fullstack": "^3.2.7", - "@cspell/dict-gaming-terms": "^1.1.2", - "@cspell/dict-git": "^3.0.7", - "@cspell/dict-golang": "^6.0.23", - "@cspell/dict-google": "^1.0.9", - "@cspell/dict-haskell": "^4.0.6", - "@cspell/dict-html": "^4.0.12", - "@cspell/dict-html-symbol-entities": "^4.0.4", - "@cspell/dict-java": "^5.0.12", - "@cspell/dict-julia": "^1.1.1", - "@cspell/dict-k8s": "^1.0.12", - "@cspell/dict-kotlin": "^1.1.1", - "@cspell/dict-latex": "^4.0.4", - "@cspell/dict-lorem-ipsum": "^4.0.5", - "@cspell/dict-lua": "^4.0.8", - "@cspell/dict-makefile": "^1.0.5", - "@cspell/dict-markdown": "^2.0.12", - "@cspell/dict-monkeyc": "^1.0.11", - "@cspell/dict-node": "^5.0.8", - "@cspell/dict-npm": "^5.2.12", - "@cspell/dict-php": "^4.0.15", - "@cspell/dict-powershell": "^5.0.15", - "@cspell/dict-public-licenses": "^2.0.14", - "@cspell/dict-python": "^4.2.19", - "@cspell/dict-r": "^2.1.1", - "@cspell/dict-ruby": "^5.0.9", - "@cspell/dict-rust": "^4.0.12", - "@cspell/dict-scala": "^5.0.8", - "@cspell/dict-shell": "^1.1.1", - "@cspell/dict-software-terms": "^5.1.4", - "@cspell/dict-sql": "^2.2.1", - "@cspell/dict-svelte": "^1.0.7", - "@cspell/dict-swift": "^2.0.6", - "@cspell/dict-terraform": "^1.1.3", - "@cspell/dict-typescript": "^3.2.3", - "@cspell/dict-vue": "^3.0.5" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@cspell/cspell-json-reporter": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-9.2.0.tgz", - "integrity": "sha512-qHdkW8eyknCSDEsqCG8OHBMal03LQf21H2LVWhtwszEQ4BQRKcWctc+VIgkO69F/jLaN2wi/yhhMufXWHAEzIg==", - "license": "MIT", - "dependencies": { - "@cspell/cspell-types": "9.2.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@cspell/cspell-pipe": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-9.2.0.tgz", - "integrity": "sha512-RO3adcsr7Ek+4511nyEOWDhOYYU1ogRs1Mo5xx3kDIdcKAJzhFdGry35T2wqft4dPASLCXcemBrhoS+hdQ+z+Q==", - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/@cspell/cspell-resolver": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-9.2.0.tgz", - "integrity": "sha512-0Xvwq0iezfO71Alw+DjsGxacAzydqOAxdXnY4JknHuxt2l8GTSMjRwj65QAflv3PN6h1QoRZEeWdiKtusceWAw==", - "license": "MIT", - "dependencies": { - "global-directory": "^4.0.1" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@cspell/cspell-service-bus": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-9.2.0.tgz", - "integrity": "sha512-ZDvcOTFk3cCVW+OjlkljeP7aSuV8tIguVn+GMco1/A+961hsEP20hngK9zJtyfpXqyvJKtvCVlyzS+z8VRrZGg==", - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/@cspell/cspell-types": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-9.2.0.tgz", - "integrity": "sha512-hL4ltFwiARpFxlfXt4GiTWQxIFyZp4wrlp7dozZbitYO6QlYc5fwQ8jBc5zFUqknuH4gx/sCMLNXhAv3enNGZQ==", - "license": "MIT", - "engines": { - "node": ">=20" - } - }, "node_modules/@cspell/dict-ada": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.1.1.tgz", "integrity": "sha512-E+0YW9RhZod/9Qy2gxfNZiHJjCYFlCdI69br1eviQQWB8yOTJX0JHXLs79kOYhSW0kINPVUdvddEBe6Lu6CjGQ==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-al": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@cspell/dict-al/-/dict-al-1.1.1.tgz", "integrity": "sha512-sD8GCaZetgQL4+MaJLXqbzWcRjfKVp8x+px3HuCaaiATAAtvjwUQ5/Iubiqwfd1boIh2Y1/3EgM3TLQ7Q8e0wQ==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-aws": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-4.0.17.tgz", "integrity": "sha512-ORcblTWcdlGjIbWrgKF+8CNEBQiLVKdUOFoTn0KPNkAYnFcdPP0muT4892h7H4Xafh3j72wqB4/loQ6Nti9E/w==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-bash": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.2.2.tgz", "integrity": "sha512-kyWbwtX3TsCf5l49gGQIZkRLaB/P8g73GDRm41Zu8Mv51kjl2H7Au0TsEvHv7jzcsRLS6aUYaZv6Zsvk1fOz+Q==", + "dev": true, "license": "MIT", "dependencies": { "@cspell/dict-shell": "1.1.2" @@ -2000,210 +1884,238 @@ "version": "3.2.10", "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.2.10.tgz", "integrity": "sha512-bJ1qnO1DkTn7JYGXvxp8FRQc4yq6tRXnrII+jbP8hHmq5TX5o1Wu+rdfpoUQaMWTl6balRvcMYiINDesnpR9Bw==", - "license": "MIT" - }, - "node_modules/@cspell/dict-cpp": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-6.0.15.tgz", - "integrity": "sha512-N7MKK3llRNoBncygvrnLaGvmjo4xzVr5FbtAc9+MFGHK6/LeSySBupr1FM72XDaVSIsmBEe7sDYCHHwlI9Jb2w==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-cryptocurrencies": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-5.0.5.tgz", "integrity": "sha512-R68hYYF/rtlE6T/dsObStzN5QZw+0aQBinAXuWCVqwdS7YZo0X33vGMfChkHaiCo3Z2+bkegqHlqxZF4TD3rUA==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-csharp": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-4.0.8.tgz", "integrity": "sha512-qmk45pKFHSxckl5mSlbHxmDitSsGMlk/XzFgt7emeTJWLNSTUK//MbYAkBNRtfzB4uD7pAFiKgpKgtJrTMRnrQ==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-css": { "version": "4.0.19", "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.19.tgz", "integrity": "sha512-VYHtPnZt/Zd/ATbW3rtexWpBnHUohUrQOHff/2JBhsVgxOrksAxJnLAO43Q1ayLJBJUUwNVo+RU0sx0aaysZfg==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-dart": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.3.2.tgz", "integrity": "sha512-sUiLW56t9gfZcu8iR/5EUg+KYyRD83Cjl3yjDEA2ApVuJvK1HhX+vn4e4k4YfjpUQMag8XO2AaRhARE09+/rqw==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-data-science": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-2.0.13.tgz", "integrity": "sha512-l1HMEhBJkPmw4I2YGVu2eBSKM89K9pVF+N6qIr5Uo5H3O979jVodtuwP8I7LyPrJnC6nz28oxeGRCLh9xC5CVA==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-django": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.1.6.tgz", "integrity": "sha512-SdbSFDGy9ulETqNz15oWv2+kpWLlk8DJYd573xhIkeRdcXOjskRuxjSZPKfW7O3NxN/KEf3gm3IevVOiNuFS+w==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-docker": { "version": "1.1.17", "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.17.tgz", "integrity": "sha512-OcnVTIpHIYYKhztNTyK8ShAnXTfnqs43hVH6p0py0wlcwRIXe5uj4f12n7zPf2CeBI7JAlPjEsV0Rlf4hbz/xQ==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-dotnet": { "version": "5.0.11", "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.11.tgz", "integrity": "sha512-LSVKhpFf/ASTWJcfYeS0Sykcl1gVMsv2Z5Eo0TnTMSTLV3738HH+66pIsjUTChqU6SF3gKPuCe6EOaRYqb/evA==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-elixir": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.8.tgz", "integrity": "sha512-CyfphrbMyl4Ms55Vzuj+mNmd693HjBFr9hvU+B2YbFEZprE5AG+EXLYTMRWrXbpds4AuZcvN3deM2XVB80BN/Q==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-en_us": { "version": "4.4.27", "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.4.27.tgz", "integrity": "sha512-0y4vH2i5cFmi8sxkc4OlD2IlnqDznOtKczm4h6jA288g5VVrm3bhkYK6vcB8b0CoRKtYWKet4VEmHBP1yI+Qfw==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-en-common-misspellings": { "version": "2.1.11", "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.1.11.tgz", "integrity": "sha512-2jcY494If1udvzd7MT2z/QH/RACUo/I02vIY4ttNdZhgYvUmRKhg8OBdrbzYo0lJOcc7XUb8rhIFQRHzxOSVeA==", + "dev": true, "license": "CC BY-SA 4.0" }, "node_modules/@cspell/dict-en-gb-mit": { "version": "3.1.16", "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb-mit/-/dict-en-gb-mit-3.1.16.tgz", "integrity": "sha512-4PPdapCJslytxAVJu35Mv97qDyGmAQxtDE790T2bWNhcqN6gvRVAc/eTRaXkUIf21q1xCxxNNqpH4VfMup69rQ==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-filetypes": { "version": "3.0.15", "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.15.tgz", "integrity": "sha512-uDMeqYlLlK476w/muEFQGBy9BdQWS0mQ7BJiy/iQv5XUWZxE2O54ZQd9nW8GyQMzAgoyg5SG4hf9l039Qt66oA==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-flutter": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@cspell/dict-flutter/-/dict-flutter-1.1.1.tgz", "integrity": "sha512-UlOzRcH2tNbFhZmHJN48Za/2/MEdRHl2BMkCWZBYs+30b91mWvBfzaN4IJQU7dUZtowKayVIF9FzvLZtZokc5A==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-fonts": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-4.0.5.tgz", "integrity": "sha512-BbpkX10DUX/xzHs6lb7yzDf/LPjwYIBJHJlUXSBXDtK/1HaeS+Wqol4Mlm2+NAgZ7ikIE5DQMViTgBUY3ezNoQ==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-fsharp": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@cspell/dict-fsharp/-/dict-fsharp-1.1.1.tgz", "integrity": "sha512-imhs0u87wEA4/cYjgzS0tAyaJpwG7vwtC8UyMFbwpmtw+/bgss+osNfyqhYRyS/ehVCWL17Ewx2UPkexjKyaBA==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-fullstack": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-3.2.7.tgz", "integrity": "sha512-IxEk2YAwAJKYCUEgEeOg3QvTL4XLlyArJElFuMQevU1dPgHgzWElFevN5lsTFnvMFA1riYsVinqJJX0BanCFEg==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-gaming-terms": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.1.2.tgz", "integrity": "sha512-9XnOvaoTBscq0xuD6KTEIkk9hhdfBkkvJAIsvw3JMcnp1214OCGW8+kako5RqQ2vTZR3Tnf3pc57o7VgkM0q1Q==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-git": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-3.0.7.tgz", "integrity": "sha512-odOwVKgfxCQfiSb+nblQZc4ErXmnWEnv8XwkaI4sNJ7cNmojnvogYVeMqkXPjvfrgEcizEEA4URRD2Ms5PDk1w==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-golang": { "version": "6.0.26", "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.26.tgz", "integrity": "sha512-YKA7Xm5KeOd14v5SQ4ll6afe9VSy3a2DWM7L9uBq4u3lXToRBQ1W5PRa+/Q9udd+DTURyVVnQ+7b9cnOlNxaRg==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-google": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@cspell/dict-google/-/dict-google-1.0.9.tgz", "integrity": "sha512-biL65POqialY0i4g6crj7pR6JnBkbsPovB2WDYkj3H4TuC/QXv7Pu5pdPxeUJA6TSCHI7T5twsO4VSVyRxD9CA==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-haskell": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-4.0.6.tgz", "integrity": "sha512-ib8SA5qgftExpYNjWhpYIgvDsZ/0wvKKxSP+kuSkkak520iPvTJumEpIE+qPcmJQo4NzdKMN8nEfaeci4OcFAQ==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-html": { "version": "4.0.14", "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.14.tgz", "integrity": "sha512-2bf7n+kS92g+cMKV0wr9o/Oq9n8JzU7CcrB96gIh2GHgnF+0xDOqO2W/1KeFAqOfqosoOVE48t+4dnEMkkoJ2Q==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-html-symbol-entities": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.5.tgz", "integrity": "sha512-429alTD4cE0FIwpMucvSN35Ld87HCyuM8mF731KU5Rm4Je2SG6hmVx7nkBsLyrmH3sQukTcr1GaiZsiEg8svPA==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-java": { "version": "5.0.12", "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.12.tgz", "integrity": "sha512-qPSNhTcl7LGJ5Qp6VN71H8zqvRQK04S08T67knMq9hTA8U7G1sTKzLmBaDOFhq17vNX/+rT+rbRYp+B5Nwza1A==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-julia": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@cspell/dict-julia/-/dict-julia-1.1.1.tgz", "integrity": "sha512-WylJR9TQ2cgwd5BWEOfdO3zvDB+L7kYFm0I9u0s9jKHWQ6yKmfKeMjU9oXxTBxIufhCXm92SKwwVNAC7gjv+yA==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-k8s": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.12.tgz", "integrity": "sha512-2LcllTWgaTfYC7DmkMPOn9GsBWsA4DZdlun4po8s2ysTP7CPEnZc1ZfK6pZ2eI4TsZemlUQQ+NZxMe9/QutQxg==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-kotlin": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@cspell/dict-kotlin/-/dict-kotlin-1.1.1.tgz", "integrity": "sha512-J3NzzfgmxRvEeOe3qUXnSJQCd38i/dpF9/t3quuWh6gXM+krsAXP75dY1CzDmS8mrJAlBdVBeAW5eAZTD8g86Q==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-latex": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-4.0.4.tgz", "integrity": "sha512-YdTQhnTINEEm/LZgTzr9Voz4mzdOXH7YX+bSFs3hnkUHCUUtX/mhKgf1CFvZ0YNM2afjhQcmLaR9bDQVyYBvpA==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-lorem-ipsum": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-4.0.5.tgz", "integrity": "sha512-9a4TJYRcPWPBKkQAJ/whCu4uCAEgv/O2xAaZEI0n4y1/l18Yyx8pBKoIX5QuVXjjmKEkK7hi5SxyIsH7pFEK9Q==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-lua": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.8.tgz", "integrity": "sha512-N4PkgNDMu9JVsRu7JBS/3E/dvfItRgk9w5ga2dKq+JupP2Y3lojNaAVFhXISh4Y0a6qXDn2clA6nvnavQ/jjLA==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-makefile": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@cspell/dict-makefile/-/dict-makefile-1.0.5.tgz", "integrity": "sha512-4vrVt7bGiK8Rx98tfRbYo42Xo2IstJkAF4tLLDMNQLkQ86msDlYSKG1ZCk8Abg+EdNcFAjNhXIiNO+w4KflGAQ==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-markdown": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/@cspell/dict-markdown/-/dict-markdown-2.0.14.tgz", "integrity": "sha512-uLKPNJsUcumMQTsZZgAK9RgDLyQhUz/uvbQTEkvF/Q4XfC1i/BnA8XrOrd0+Vp6+tPOKyA+omI5LRWfMu5K/Lw==", + "dev": true, "license": "MIT", "peerDependencies": { "@cspell/dict-css": "^4.0.19", @@ -2216,42 +2128,49 @@ "version": "1.0.12", "resolved": "https://registry.npmjs.org/@cspell/dict-monkeyc/-/dict-monkeyc-1.0.12.tgz", "integrity": "sha512-MN7Vs11TdP5mbdNFQP5x2Ac8zOBm97ARg6zM5Sb53YQt/eMvXOMvrep7+/+8NJXs0jkp70bBzjqU4APcqBFNAw==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-node": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-5.0.8.tgz", "integrity": "sha512-AirZcN2i84ynev3p2/1NCPEhnNsHKMz9zciTngGoqpdItUb2bDt1nJBjwlsrFI78GZRph/VaqTVFwYikmncpXg==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-npm": { "version": "5.2.29", "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.2.29.tgz", "integrity": "sha512-ZAef8JpYmbuHFT1zekj/YyImLPvZevjECw663EmG5GPePyNo4AfH8Dd2fFhaOyQ3P5I5LrkAhGwypnOfUxcssw==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-php": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.1.1.tgz", "integrity": "sha512-EXelI+4AftmdIGtA8HL8kr4WlUE11OqCSVlnIgZekmTkEGSZdYnkFdiJ5IANSALtlQ1mghKjz+OFqVs6yowgWA==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-powershell": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.15.tgz", "integrity": "sha512-l4S5PAcvCFcVDMJShrYD0X6Huv9dcsQPlsVsBGbH38wvuN7gS7+GxZFAjTNxDmTY1wrNi1cCatSg6Pu2BW4rgg==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-public-licenses": { "version": "2.0.15", "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.15.tgz", "integrity": "sha512-cJEOs901H13Pfy0fl4dCD1U+xpWIMaEPq8MeYU83FfDZvellAuSo4GqWCripfIqlhns/L6+UZEIJSOZnjgy7Wg==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-python": { "version": "4.2.25", "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.2.25.tgz", "integrity": "sha512-hDdN0YhKgpbtZVRjQ2c8jk+n0wQdidAKj1Fk8w7KEHb3YlY5uPJ0mAKJk7AJKPNLOlILoUmN+HAVJz+cfSbWYg==", + "dev": true, "license": "MIT", "dependencies": { "@cspell/dict-data-science": "^2.0.13" @@ -2261,114 +2180,480 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/@cspell/dict-r/-/dict-r-2.1.1.tgz", "integrity": "sha512-71Ka+yKfG4ZHEMEmDxc6+blFkeTTvgKbKAbwiwQAuKl3zpqs1Y0vUtwW2N4b3LgmSPhV3ODVY0y4m5ofqDuKMw==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-ruby": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.1.0.tgz", "integrity": "sha512-9PJQB3cfkBULrMLp5kSAcFPpzf8oz9vFN+QYZABhQwWkGbuzCIXSorHrmWSASlx4yejt3brjaWS57zZ/YL5ZQQ==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-rust": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.1.1.tgz", "integrity": "sha512-fXiXnZH0wOaEVTKFRNaz6TsUGhuB8dAT0ubYkDNzRQCaV5JGSOebGb1v2x5ZrOSVp+moxWM/vdBfiNU6KOEaFQ==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-scala": { "version": "5.0.9", "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.9.tgz", "integrity": "sha512-AjVcVAELgllybr1zk93CJ5wSUNu/Zb5kIubymR/GAYkMyBdYFCZ3Zbwn4Zz8GJlFFAbazABGOu0JPVbeY59vGg==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-shell": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@cspell/dict-shell/-/dict-shell-1.1.2.tgz", "integrity": "sha512-WqOUvnwcHK1X61wAfwyXq04cn7KYyskg90j4lLg3sGGKMW9Sq13hs91pqrjC44Q+lQLgCobrTkMDw9Wyl9nRFA==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-software-terms": { "version": "5.1.20", "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-5.1.20.tgz", "integrity": "sha512-TEk1xHvetTI4pv7Vzje1D322m6QEjaH2P6ucOOf6q7EJCppQIdC0lZSXkgHJAFU5HGSvEXSzvnVeW2RHW86ziQ==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-sql": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.2.1.tgz", "integrity": "sha512-qDHF8MpAYCf4pWU8NKbnVGzkoxMNrFqBHyG/dgrlic5EQiKANCLELYtGlX5auIMDLmTf1inA0eNtv74tyRJ/vg==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-svelte": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@cspell/dict-svelte/-/dict-svelte-1.0.7.tgz", "integrity": "sha512-hGZsGqP0WdzKkdpeVLBivRuSNzOTvN036EBmpOwxH+FTY2DuUH7ecW+cSaMwOgmq5JFSdTcbTNFlNC8HN8lhaQ==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-swift": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-2.0.6.tgz", "integrity": "sha512-PnpNbrIbex2aqU1kMgwEKvCzgbkHtj3dlFLPMqW1vSniop7YxaDTtvTUO4zA++ugYAEL+UK8vYrBwDPTjjvSnA==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-terraform": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@cspell/dict-terraform/-/dict-terraform-1.1.3.tgz", "integrity": "sha512-gr6wxCydwSFyyBKhBA2xkENXtVFToheqYYGFvlMZXWjviynXmh+NK/JTvTCk/VHk3+lzbO9EEQKee6VjrAUSbA==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-typescript": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.2.3.tgz", "integrity": "sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg==", + "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-vue": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-3.0.5.tgz", "integrity": "sha512-Mqutb8jbM+kIcywuPQCCaK5qQHTdaByoEO2J9LKFy3sqAdiBogNkrplqUK0HyyRFgCfbJUgjz3N85iCMcWH0JA==", + "dev": true, "license": "MIT" }, - "node_modules/@cspell/dynamic-import": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-9.2.0.tgz", - "integrity": "sha512-2/k4LR8CQqbgIPQGELbCdt9xgg9+aQ7pMwOtllKvnFYBtwNiwqcZjlzAam2gtvD5DghKX2qrcSHG5A7YP5cX9A==", + "node_modules/@cspell/dict-zig": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-zig/-/dict-zig-1.0.0.tgz", + "integrity": "sha512-XibBIxBlVosU06+M6uHWkFeT0/pW5WajDRYdXG2CgHnq85b0TI/Ks0FuBJykmsgi2CAD3Qtx8UHFEtl/DSFnAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/eslint-plugin": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/eslint-plugin/-/eslint-plugin-9.6.0.tgz", + "integrity": "sha512-NvIQsyolU+efZAa1bJfmJD8iCAc882falpHGfgIkLeoaYcM4l76ZCuSNs5a2qx5q09goXfwLJ1zNjuNb/inDyA==", + "dev": true, "license": "MIT", "dependencies": { - "@cspell/url": "9.2.0", - "import-meta-resolve": "^4.1.0" + "@cspell/cspell-types": "9.6.0", + "@cspell/url": "9.6.0", + "cspell-lib": "9.6.0", + "synckit": "^0.11.11" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "eslint": "^7 || ^8 || ^9" + } + }, + "node_modules/@cspell/eslint-plugin/node_modules/@cspell/cspell-bundled-dicts": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-9.6.0.tgz", + "integrity": "sha512-gLNe9bB+5gMsTEhR9YPE0Wt122HR2EV+Q1j9W+MbwbeBJmpTWrgAP1ZdpvHOg+6LF6x/bD/EC9HfWdd/om8wXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/dict-ada": "^4.1.1", + "@cspell/dict-al": "^1.1.1", + "@cspell/dict-aws": "^4.0.17", + "@cspell/dict-bash": "^4.2.2", + "@cspell/dict-companies": "^3.2.10", + "@cspell/dict-cpp": "^7.0.2", + "@cspell/dict-cryptocurrencies": "^5.0.5", + "@cspell/dict-csharp": "^4.0.8", + "@cspell/dict-css": "^4.0.19", + "@cspell/dict-dart": "^2.3.2", + "@cspell/dict-data-science": "^2.0.13", + "@cspell/dict-django": "^4.1.6", + "@cspell/dict-docker": "^1.1.17", + "@cspell/dict-dotnet": "^5.0.11", + "@cspell/dict-elixir": "^4.0.8", + "@cspell/dict-en_us": "^4.4.27", + "@cspell/dict-en-common-misspellings": "^2.1.11", + "@cspell/dict-en-gb-mit": "^3.1.16", + "@cspell/dict-filetypes": "^3.0.15", + "@cspell/dict-flutter": "^1.1.1", + "@cspell/dict-fonts": "^4.0.5", + "@cspell/dict-fsharp": "^1.1.1", + "@cspell/dict-fullstack": "^3.2.7", + "@cspell/dict-gaming-terms": "^1.1.2", + "@cspell/dict-git": "^3.0.7", + "@cspell/dict-golang": "^6.0.26", + "@cspell/dict-google": "^1.0.9", + "@cspell/dict-haskell": "^4.0.6", + "@cspell/dict-html": "^4.0.14", + "@cspell/dict-html-symbol-entities": "^4.0.5", + "@cspell/dict-java": "^5.0.12", + "@cspell/dict-julia": "^1.1.1", + "@cspell/dict-k8s": "^1.0.12", + "@cspell/dict-kotlin": "^1.1.1", + "@cspell/dict-latex": "^4.0.4", + "@cspell/dict-lorem-ipsum": "^4.0.5", + "@cspell/dict-lua": "^4.0.8", + "@cspell/dict-makefile": "^1.0.5", + "@cspell/dict-markdown": "^2.0.14", + "@cspell/dict-monkeyc": "^1.0.12", + "@cspell/dict-node": "^5.0.8", + "@cspell/dict-npm": "^5.2.29", + "@cspell/dict-php": "^4.1.1", + "@cspell/dict-powershell": "^5.0.15", + "@cspell/dict-public-licenses": "^2.0.15", + "@cspell/dict-python": "^4.2.25", + "@cspell/dict-r": "^2.1.1", + "@cspell/dict-ruby": "^5.1.0", + "@cspell/dict-rust": "^4.1.1", + "@cspell/dict-scala": "^5.0.9", + "@cspell/dict-shell": "^1.1.2", + "@cspell/dict-software-terms": "^5.1.20", + "@cspell/dict-sql": "^2.2.1", + "@cspell/dict-svelte": "^1.0.7", + "@cspell/dict-swift": "^2.0.6", + "@cspell/dict-terraform": "^1.1.3", + "@cspell/dict-typescript": "^3.2.3", + "@cspell/dict-vue": "^3.0.5", + "@cspell/dict-zig": "^1.0.0" }, "engines": { "node": ">=20" } }, - "node_modules/@cspell/filetypes": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@cspell/filetypes/-/filetypes-9.2.0.tgz", - "integrity": "sha512-6wmCa3ZyI647H7F4w6kb9PCJ703JKSgFTB8EERTdIoGySbgVp5+qMIIoZ//wELukdjgcufcFZ5pBrhRDRsemRA==", + "node_modules/@cspell/eslint-plugin/node_modules/@cspell/cspell-pipe": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-9.6.0.tgz", + "integrity": "sha512-YNuY8NNXfE+8Qzknm2ps6QbrZLZu6rSZTZr3dYW3K6TK7+IFVlJ6e2Z9iKJTqp6aZ4AGU/r9QYGmNX4Oq4gZ0A==", + "dev": true, "license": "MIT", "engines": { "node": ">=20" } }, - "node_modules/@cspell/strong-weak-map": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-9.2.0.tgz", - "integrity": "sha512-5mpIMiIOCu4cBqy1oCTXISgJuOCQ6R/e38AkvnYWfmMIx7fCdx8n+mF52wX9m61Ng28Sq8VL253xybsWcCxHug==", + "node_modules/@cspell/eslint-plugin/node_modules/@cspell/cspell-resolver": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-9.6.0.tgz", + "integrity": "sha512-Gb2UWNmRpTOQGpYL4Q/LMw+b50KcRZcf/wJg6w0Yl3IT+F/uDNhNh1f5rHuTyGsbMsMxHJhsb2AoP+73GlbIfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-directory": "^4.0.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/eslint-plugin/node_modules/@cspell/cspell-service-bus": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-9.6.0.tgz", + "integrity": "sha512-DCuKKkySTEB8MPLTdoPMdmakYcx7XCsHz1YEMbzOcLqJCxXsRlRZg4qE9kRBee/2QY7eYA2kaYNgn/TDMooa4g==", + "dev": true, "license": "MIT", "engines": { "node": ">=20" } }, - "node_modules/@cspell/url": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@cspell/url/-/url-9.2.0.tgz", - "integrity": "sha512-plB0wwdAESqBl4xDAT2db2/K1FZHJXfYlJTiV6pkn0XffTGyg4UGLaSCm15NzUoPxdSmzqj5jQb7y+mB9kFK8g==", + "node_modules/@cspell/eslint-plugin/node_modules/@cspell/cspell-types": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-9.6.0.tgz", + "integrity": "sha512-JTqrD47tV+rWc1y2W8T0NTfWLQMlSWX4OF64/Jf3WbsOD+4UXVIfjRlzPry7+1Zekm6pa38+23jkDBytYpu8yw==", + "dev": true, "license": "MIT", "engines": { "node": ">=20" } }, + "node_modules/@cspell/eslint-plugin/node_modules/@cspell/dict-cpp": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-7.0.2.tgz", + "integrity": "sha512-dfbeERiVNeqmo/npivdR6rDiBCqZi3QtjH2Z0HFcXwpdj6i97dX1xaKyK2GUsO/p4u1TOv63Dmj5Vm48haDpuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/eslint-plugin/node_modules/@cspell/dynamic-import": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-9.6.0.tgz", + "integrity": "sha512-Lkn82wyGj2ltxeYfH2bEjshdes1fx3ouYUZxeW5i6SBBvEVJoSmr43AygI8A317UMIQxVj59qVBorrtGYcRI1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/url": "9.6.0", + "import-meta-resolve": "^4.2.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/eslint-plugin/node_modules/@cspell/filetypes": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/filetypes/-/filetypes-9.6.0.tgz", + "integrity": "sha512-CaWyk5j20H6sr+HCArtUY95jUQb7A/6W0GC4B4umnqoWvgqwR72duowLFa+w1K2C7tZg3GoV4Wf2cUn9jjt5FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/eslint-plugin/node_modules/@cspell/strong-weak-map": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-9.6.0.tgz", + "integrity": "sha512-9g8LCLv/2RrprGeGnFAaBETWq7ESnBcoMbvgNu+vZE58iF+pbFvP0qGgKvVeKEEpc2LZhNuHLsUH37MUS6DOQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/eslint-plugin/node_modules/@cspell/url": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/url/-/url-9.6.0.tgz", + "integrity": "sha512-257WOxh9vOYHAVgBNXRCdLEd+ldzlVbzcc9u+6DYoCDCNGe0OvOWOGsAfnUbMc9xEw48XgBlDYgOlPbjWGLOTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/eslint-plugin/node_modules/cspell-config-lib": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-9.6.0.tgz", + "integrity": "sha512-5ztvheawkmFXNHGN82iOOntU3T5mmlQBP/plgoKdBZ6+lSYrOJLkOyqxYyi7MrUBDtWrXPzFllkBrPNRDlbX/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-types": "9.6.0", + "comment-json": "^4.5.1", + "smol-toml": "^1.6.0", + "yaml": "^2.8.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/eslint-plugin/node_modules/cspell-dictionary": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-9.6.0.tgz", + "integrity": "sha512-wW0m1kLrbK6bRY/GrLUGKUUJ1Z4ZUgIb8LD4zNaECcvGviv9V7VcR3mEwUip3ZjoHa3ClzEoWgQ9gXrtac80Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-pipe": "9.6.0", + "@cspell/cspell-types": "9.6.0", + "cspell-trie-lib": "9.6.0", + "fast-equals": "^6.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/eslint-plugin/node_modules/cspell-glob": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-9.6.0.tgz", + "integrity": "sha512-KmEbKN0qdEamsEYbkFu7zjLYfw3hMmn9kmeh94IHr2kq6vWq5vNP5l1BuqmrUeFZlbNd07vj08IKAZHYsoGheQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/url": "9.6.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/eslint-plugin/node_modules/cspell-grammar": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-9.6.0.tgz", + "integrity": "sha512-jZVIM5/3eB9rWURDq+VXdYip+DmPuFzO+bqaRtzqT8w6YoOIGYbiIxdwvyyA9xdH7SmW8uqHJP5x4pzZju1lNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-pipe": "9.6.0", + "@cspell/cspell-types": "9.6.0" + }, + "bin": { + "cspell-grammar": "bin.mjs" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/eslint-plugin/node_modules/cspell-io": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-9.6.0.tgz", + "integrity": "sha512-wZuZzKOYIb698kVEINYjGaNFQu+AFZ945TORM3hapmPjez+vsHwl8m/pPpCHeGMpQtHMEDkX84AbQ7R55MRIwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-service-bus": "9.6.0", + "@cspell/url": "9.6.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/eslint-plugin/node_modules/cspell-lib": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-9.6.0.tgz", + "integrity": "sha512-m9rIv8hkQ3Dio4s80HQbM9cdxENcd6pS8j2AHWL50OSjJf3Xhw6/wMrIAGbwLHP15K6QZVU2eJ/abCzIJwjA4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-bundled-dicts": "9.6.0", + "@cspell/cspell-pipe": "9.6.0", + "@cspell/cspell-resolver": "9.6.0", + "@cspell/cspell-types": "9.6.0", + "@cspell/dynamic-import": "9.6.0", + "@cspell/filetypes": "9.6.0", + "@cspell/strong-weak-map": "9.6.0", + "@cspell/url": "9.6.0", + "clear-module": "^4.1.2", + "cspell-config-lib": "9.6.0", + "cspell-dictionary": "9.6.0", + "cspell-glob": "9.6.0", + "cspell-grammar": "9.6.0", + "cspell-io": "9.6.0", + "cspell-trie-lib": "9.6.0", + "env-paths": "^3.0.0", + "gensequence": "^8.0.8", + "import-fresh": "^3.3.1", + "resolve-from": "^5.0.0", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-uri": "^3.1.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/eslint-plugin/node_modules/cspell-trie-lib": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-9.6.0.tgz", + "integrity": "sha512-L7GSff5F9cF60QT78WsebVlb3sppi6jbvTHwsw7WF1jUN/ioAo7OzBYtYB7xkYeejcdVEpqfvf/ZOXPDp8x2Wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@cspell/cspell-types": "9.6.0" + } + }, + "node_modules/@cspell/eslint-plugin/node_modules/fast-equals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-6.0.0.tgz", + "integrity": "sha512-PFhhIGgdM79r5Uztdj9Zb6Tt1zKafqVfdMGwVca1z5z6fbX7DmsySSuJd8HiP6I1j505DCS83cLxo5rmSNeVEA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@cspell/eslint-plugin/node_modules/gensequence": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-8.0.8.tgz", + "integrity": "sha512-omMVniXEXpdx/vKxGnPRoO2394Otlze28TyxECbFVyoSpZ9H3EO7lemjcB12OpQJzRW4e5tt/dL1rOxry6aMHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/eslint-plugin/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@cspell/eslint-plugin/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@cspell/eslint-plugin/node_modules/smol-toml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.0.tgz", + "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/@cspell/eslint-plugin/node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/eslint-plugin/node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/@csstools/cascade-layer-name-parser": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", @@ -7385,6 +7670,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", + "dev": true, "license": "MIT" }, "node_modules/array-union": { @@ -8087,33 +8373,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk-template": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.2.tgz", - "integrity": "sha512-2bxTP2yUH7AJj/VAXfcA+4IcWGdQ87HwBANLt5XxGTeomo8yG0y95N1um9i5StvhT/Bl0/2cARA5v1PpPXUxUA==", - "license": "MIT", - "dependencies": { - "chalk": "^5.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/chalk/chalk-template?sponsor=1" - } - }, - "node_modules/chalk-template/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -8309,6 +8568,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/clear-module/-/clear-module-4.1.2.tgz", "integrity": "sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==", + "dev": true, "license": "MIT", "dependencies": { "parent-module": "^2.0.0", @@ -8325,6 +8585,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz", "integrity": "sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==", + "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.1.0" @@ -8337,6 +8598,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -8490,6 +8752,7 @@ "version": "4.5.1", "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.5.1.tgz", "integrity": "sha512-taEtr3ozUmOB7it68Jll7s0Pwm+aoiHyXKrEC8SEodL4rNpdfDLqa7PfBlrgFoCNNdR8ImL+muti5IGvktJAAg==", + "dev": true, "license": "MIT", "dependencies": { "array-timsort": "^1.0.3", @@ -8870,243 +9133,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cspell": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-9.2.0.tgz", - "integrity": "sha512-AKzaFMem2jRcGpAY2spKP0z15jpZeX1WTDNHCDsB8/YvnhnOfWXc0S5AF+4sfU1cQgHWYGFOolMuTri0ZQdV+Q==", - "license": "MIT", - "dependencies": { - "@cspell/cspell-json-reporter": "9.2.0", - "@cspell/cspell-pipe": "9.2.0", - "@cspell/cspell-types": "9.2.0", - "@cspell/dynamic-import": "9.2.0", - "@cspell/url": "9.2.0", - "chalk": "^5.4.1", - "chalk-template": "^1.1.0", - "commander": "^14.0.0", - "cspell-config-lib": "9.2.0", - "cspell-dictionary": "9.2.0", - "cspell-gitignore": "9.2.0", - "cspell-glob": "9.2.0", - "cspell-io": "9.2.0", - "cspell-lib": "9.2.0", - "fast-json-stable-stringify": "^2.1.0", - "flatted": "^3.3.3", - "semver": "^7.7.2", - "tinyglobby": "^0.2.14" - }, - "bin": { - "cspell": "bin.mjs", - "cspell-esm": "bin.mjs" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/streetsidesoftware/cspell?sponsor=1" - } - }, - "node_modules/cspell-config-lib": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-9.2.0.tgz", - "integrity": "sha512-Yc8+hT+uIWWCi6WMhOL6HDYbBCP2qig1tgKGThHVeOx6GviieV10TZ5kQ+P7ONgoqw2nmm7uXIC19dGYx3DblQ==", - "license": "MIT", - "dependencies": { - "@cspell/cspell-types": "9.2.0", - "comment-json": "^4.2.5", - "smol-toml": "^1.4.1", - "yaml": "^2.8.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/cspell-config-lib/node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, - "node_modules/cspell-dictionary": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-9.2.0.tgz", - "integrity": "sha512-lV4VtjsDtxu8LyCcb6DY7Br4e/Aw1xfR8QvjYhHaJ8t03xry9STey5Rkfp+lz+hlVevNcn3lfCaacGuXyD+lLg==", - "license": "MIT", - "dependencies": { - "@cspell/cspell-pipe": "9.2.0", - "@cspell/cspell-types": "9.2.0", - "cspell-trie-lib": "9.2.0", - "fast-equals": "^5.2.2" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/cspell-gitignore": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-9.2.0.tgz", - "integrity": "sha512-gXDQZ7czTPwmEg1qtsUIjVEFm9IfgTO8rA02O8eYIveqjFixbSV3fIYOgoxZSZYxjt3O44m8+/zAFC1RE4CM/Q==", - "license": "MIT", - "dependencies": { - "@cspell/url": "9.2.0", - "cspell-glob": "9.2.0", - "cspell-io": "9.2.0" - }, - "bin": { - "cspell-gitignore": "bin.mjs" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/cspell-glob": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-9.2.0.tgz", - "integrity": "sha512-viycZDyegzW2AKPFqvX5RveqTrB0sKgexlCu2A8z8eumpYYor5sD1NP05VDOqkAF4hDuiGqkHn6iNo0L1wNgLw==", - "license": "MIT", - "dependencies": { - "@cspell/url": "9.2.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/cspell-glob/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/cspell-grammar": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-9.2.0.tgz", - "integrity": "sha512-qthAmWcNHpYAmufy7YWVg9xwrYANkVlI40bgC2uGd8EnKssm/qOPhqXXNS+kLf+q0NmJM5nMgRLhCC23xSp3JA==", - "license": "MIT", - "dependencies": { - "@cspell/cspell-pipe": "9.2.0", - "@cspell/cspell-types": "9.2.0" - }, - "bin": { - "cspell-grammar": "bin.mjs" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/cspell-io": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-9.2.0.tgz", - "integrity": "sha512-oxKiqFLcz629FmOId8UpdDznpMvCgpuktg4nkD2G9pYpRh+fRLZpP4QtZPyvJqvpUIzFhIOznMeHjsiBYHOZUA==", - "license": "MIT", - "dependencies": { - "@cspell/cspell-service-bus": "9.2.0", - "@cspell/url": "9.2.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/cspell-lib": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-9.2.0.tgz", - "integrity": "sha512-RnhDIsETw6Ex0UaK3PFoJ2FwWMWfJPtdpNpv1qgmJwoGD4CzwtIqPOLtZ24zqdCP8ZnNTF/lwV/9rZVqifYjsw==", - "license": "MIT", - "dependencies": { - "@cspell/cspell-bundled-dicts": "9.2.0", - "@cspell/cspell-pipe": "9.2.0", - "@cspell/cspell-resolver": "9.2.0", - "@cspell/cspell-types": "9.2.0", - "@cspell/dynamic-import": "9.2.0", - "@cspell/filetypes": "9.2.0", - "@cspell/strong-weak-map": "9.2.0", - "@cspell/url": "9.2.0", - "clear-module": "^4.1.2", - "comment-json": "^4.2.5", - "cspell-config-lib": "9.2.0", - "cspell-dictionary": "9.2.0", - "cspell-glob": "9.2.0", - "cspell-grammar": "9.2.0", - "cspell-io": "9.2.0", - "cspell-trie-lib": "9.2.0", - "env-paths": "^3.0.0", - "fast-equals": "^5.2.2", - "gensequence": "^7.0.0", - "import-fresh": "^3.3.1", - "resolve-from": "^5.0.0", - "vscode-languageserver-textdocument": "^1.0.12", - "vscode-uri": "^3.1.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/cspell-lib/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cspell-lib/node_modules/vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", - "license": "MIT" - }, - "node_modules/cspell-trie-lib": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-9.2.0.tgz", - "integrity": "sha512-6GHL1KvLQzcPBSNY6QWOabq8YwRJAnNKamA0O/tRKy+11Hy99ysD4xvfu3kKYPAcobp5ZykX4nudHxy8yrEvng==", - "license": "MIT", - "dependencies": { - "@cspell/cspell-pipe": "9.2.0", - "@cspell/cspell-types": "9.2.0", - "gensequence": "^7.0.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/cspell/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/cspell/node_modules/commander": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", - "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", - "license": "MIT", - "engines": { - "node": ">=20" - } - }, "node_modules/css-blank-pseudo": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", @@ -10674,6 +10700,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "dev": true, "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -11791,15 +11818,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/fast-equals": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.0.tgz", - "integrity": "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -12095,6 +12113,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, "license": "ISC" }, "node_modules/follow-redirects": { @@ -12280,15 +12299,6 @@ "node": ">= 0.4" } }, - "node_modules/gensequence": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-7.0.0.tgz", - "integrity": "sha512-47Frx13aZh01afHJTB3zTtKIlFI6vWY+MYCN9Qpew6i52rfKjnhCF/l1YlC8UmEMvvntZZ6z4PiCcmyuedR2aQ==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -12464,6 +12474,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "dev": true, "license": "MIT", "dependencies": { "ini": "4.1.1" @@ -12479,6 +12490,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -13392,6 +13404,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "dev": true, "license": "MIT", "funding": { "type": "github", @@ -22080,6 +22093,7 @@ "version": "1.5.2", "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.5.2.tgz", "integrity": "sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">= 18" @@ -22812,6 +22826,7 @@ "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -22828,6 +22843,7 @@ "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, "license": "MIT", "engines": { "node": ">=12.0.0" @@ -22845,6 +22861,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" diff --git a/package.json b/package.json index de921bb7..4960f924 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,6 @@ "@mdx-js/react": "3.1.1", "@svgr/webpack": "8.1.0", "clsx": "2.1.1", - "cspell": "9.2.0", "docusaurus-plugin-sass": "0.2.6", "file-loader": "6.2.0", "react": "18.3.1", @@ -63,6 +62,7 @@ ] }, "devDependencies": { + "@cspell/eslint-plugin": "9.6.0", "@docusaurus/module-type-aliases": "3.9.2", "@docusaurus/tsconfig": "3.9.2", "@eslint/js": "9.39.2", From bc5d90b7e07d992c31cf3278b09281818de5700e Mon Sep 17 00:00:00 2001 From: BotBlake Date: Thu, 15 Jan 2026 11:19:58 +0100 Subject: [PATCH 163/190] seperate cspell job --- .github/workflows/lint.yml | 13 + .github/workflows/spellcheck.yml | 14 - package-lock.json | 811 ++++++++++++++++++------------- package.json | 2 +- 4 files changed, 477 insertions(+), 363 deletions(-) delete mode 100644 .github/workflows/spellcheck.yml diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 4cce1426..0267fda8 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -49,3 +49,16 @@ jobs: - name: Run markdownlint run: npm run lint:markdown + + cspell: + name: Check spelling + runs-on: ubuntu-latest + + steps: + - name: Check out Git repository + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + + - name: Run cspell + uses: streetsidesoftware/cspell-action@24fa8d3096a314ce263f39578744e9d9f8d80acf # v8.1.2 + with: + config: ./cspell.config.mjs diff --git a/.github/workflows/spellcheck.yml b/.github/workflows/spellcheck.yml deleted file mode 100644 index 1888b1d9..00000000 --- a/.github/workflows/spellcheck.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: 'Check spelling' -on: - pull_request: - push: - branches: [master] - -jobs: - spellcheck: # run the action - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - - uses: streetsidesoftware/cspell-action@24fa8d3096a314ce263f39578744e9d9f8d80acf # v8.1.2 - with: - config: ./cspell.config.mjs diff --git a/package-lock.json b/package-lock.json index acfe1e2b..60fa902c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,13 +36,13 @@ "url-loader": "4.1.1" }, "devDependencies": { - "@cspell/eslint-plugin": "9.6.0", "@docusaurus/module-type-aliases": "3.9.2", "@docusaurus/tsconfig": "3.9.2", "@eslint/js": "9.39.2", "@types/react": "18.3.27", "@types/react-helmet": "6.1.11", "@types/react-router-dom": "5.3.3", + "cspell": "9.6.0", "eslint": "9.39.2", "eslint-config-prettier": "10.1.8", "eslint-plugin-import": "2.32.0", @@ -1849,6 +1849,133 @@ "node": ">=0.1.90" } }, + "node_modules/@cspell/cspell-bundled-dicts": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-9.6.0.tgz", + "integrity": "sha512-gLNe9bB+5gMsTEhR9YPE0Wt122HR2EV+Q1j9W+MbwbeBJmpTWrgAP1ZdpvHOg+6LF6x/bD/EC9HfWdd/om8wXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/dict-ada": "^4.1.1", + "@cspell/dict-al": "^1.1.1", + "@cspell/dict-aws": "^4.0.17", + "@cspell/dict-bash": "^4.2.2", + "@cspell/dict-companies": "^3.2.10", + "@cspell/dict-cpp": "^7.0.2", + "@cspell/dict-cryptocurrencies": "^5.0.5", + "@cspell/dict-csharp": "^4.0.8", + "@cspell/dict-css": "^4.0.19", + "@cspell/dict-dart": "^2.3.2", + "@cspell/dict-data-science": "^2.0.13", + "@cspell/dict-django": "^4.1.6", + "@cspell/dict-docker": "^1.1.17", + "@cspell/dict-dotnet": "^5.0.11", + "@cspell/dict-elixir": "^4.0.8", + "@cspell/dict-en_us": "^4.4.27", + "@cspell/dict-en-common-misspellings": "^2.1.11", + "@cspell/dict-en-gb-mit": "^3.1.16", + "@cspell/dict-filetypes": "^3.0.15", + "@cspell/dict-flutter": "^1.1.1", + "@cspell/dict-fonts": "^4.0.5", + "@cspell/dict-fsharp": "^1.1.1", + "@cspell/dict-fullstack": "^3.2.7", + "@cspell/dict-gaming-terms": "^1.1.2", + "@cspell/dict-git": "^3.0.7", + "@cspell/dict-golang": "^6.0.26", + "@cspell/dict-google": "^1.0.9", + "@cspell/dict-haskell": "^4.0.6", + "@cspell/dict-html": "^4.0.14", + "@cspell/dict-html-symbol-entities": "^4.0.5", + "@cspell/dict-java": "^5.0.12", + "@cspell/dict-julia": "^1.1.1", + "@cspell/dict-k8s": "^1.0.12", + "@cspell/dict-kotlin": "^1.1.1", + "@cspell/dict-latex": "^4.0.4", + "@cspell/dict-lorem-ipsum": "^4.0.5", + "@cspell/dict-lua": "^4.0.8", + "@cspell/dict-makefile": "^1.0.5", + "@cspell/dict-markdown": "^2.0.14", + "@cspell/dict-monkeyc": "^1.0.12", + "@cspell/dict-node": "^5.0.8", + "@cspell/dict-npm": "^5.2.29", + "@cspell/dict-php": "^4.1.1", + "@cspell/dict-powershell": "^5.0.15", + "@cspell/dict-public-licenses": "^2.0.15", + "@cspell/dict-python": "^4.2.25", + "@cspell/dict-r": "^2.1.1", + "@cspell/dict-ruby": "^5.1.0", + "@cspell/dict-rust": "^4.1.1", + "@cspell/dict-scala": "^5.0.9", + "@cspell/dict-shell": "^1.1.2", + "@cspell/dict-software-terms": "^5.1.20", + "@cspell/dict-sql": "^2.2.1", + "@cspell/dict-svelte": "^1.0.7", + "@cspell/dict-swift": "^2.0.6", + "@cspell/dict-terraform": "^1.1.3", + "@cspell/dict-typescript": "^3.2.3", + "@cspell/dict-vue": "^3.0.5", + "@cspell/dict-zig": "^1.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-json-reporter": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-9.6.0.tgz", + "integrity": "sha512-5sY1lgAXS5xEOsjT5rREMADj7pHIt56XOL7xR80nNl0TwlpZbeBHhoB2aH5sirVTeodJFN5iraXNbVOYPPupPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-types": "9.6.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-pipe": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-9.6.0.tgz", + "integrity": "sha512-YNuY8NNXfE+8Qzknm2ps6QbrZLZu6rSZTZr3dYW3K6TK7+IFVlJ6e2Z9iKJTqp6aZ4AGU/r9QYGmNX4Oq4gZ0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-resolver": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-9.6.0.tgz", + "integrity": "sha512-Gb2UWNmRpTOQGpYL4Q/LMw+b50KcRZcf/wJg6w0Yl3IT+F/uDNhNh1f5rHuTyGsbMsMxHJhsb2AoP+73GlbIfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-directory": "^4.0.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-service-bus": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-9.6.0.tgz", + "integrity": "sha512-DCuKKkySTEB8MPLTdoPMdmakYcx7XCsHz1YEMbzOcLqJCxXsRlRZg4qE9kRBee/2QY7eYA2kaYNgn/TDMooa4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-types": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-9.6.0.tgz", + "integrity": "sha512-JTqrD47tV+rWc1y2W8T0NTfWLQMlSWX4OF64/Jf3WbsOD+4UXVIfjRlzPry7+1Zekm6pa38+23jkDBytYpu8yw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/@cspell/dict-ada": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.1.1.tgz", @@ -1887,6 +2014,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@cspell/dict-cpp": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-7.0.2.tgz", + "integrity": "sha512-dfbeERiVNeqmo/npivdR6rDiBCqZi3QtjH2Z0HFcXwpdj6i97dX1xaKyK2GUsO/p4u1TOv63Dmj5Vm48haDpuA==", + "dev": true, + "license": "MIT" + }, "node_modules/@cspell/dict-cryptocurrencies": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-5.0.5.tgz", @@ -2267,147 +2401,7 @@ "dev": true, "license": "MIT" }, - "node_modules/@cspell/eslint-plugin": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@cspell/eslint-plugin/-/eslint-plugin-9.6.0.tgz", - "integrity": "sha512-NvIQsyolU+efZAa1bJfmJD8iCAc882falpHGfgIkLeoaYcM4l76ZCuSNs5a2qx5q09goXfwLJ1zNjuNb/inDyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-types": "9.6.0", - "@cspell/url": "9.6.0", - "cspell-lib": "9.6.0", - "synckit": "^0.11.11" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "eslint": "^7 || ^8 || ^9" - } - }, - "node_modules/@cspell/eslint-plugin/node_modules/@cspell/cspell-bundled-dicts": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-9.6.0.tgz", - "integrity": "sha512-gLNe9bB+5gMsTEhR9YPE0Wt122HR2EV+Q1j9W+MbwbeBJmpTWrgAP1ZdpvHOg+6LF6x/bD/EC9HfWdd/om8wXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/dict-ada": "^4.1.1", - "@cspell/dict-al": "^1.1.1", - "@cspell/dict-aws": "^4.0.17", - "@cspell/dict-bash": "^4.2.2", - "@cspell/dict-companies": "^3.2.10", - "@cspell/dict-cpp": "^7.0.2", - "@cspell/dict-cryptocurrencies": "^5.0.5", - "@cspell/dict-csharp": "^4.0.8", - "@cspell/dict-css": "^4.0.19", - "@cspell/dict-dart": "^2.3.2", - "@cspell/dict-data-science": "^2.0.13", - "@cspell/dict-django": "^4.1.6", - "@cspell/dict-docker": "^1.1.17", - "@cspell/dict-dotnet": "^5.0.11", - "@cspell/dict-elixir": "^4.0.8", - "@cspell/dict-en_us": "^4.4.27", - "@cspell/dict-en-common-misspellings": "^2.1.11", - "@cspell/dict-en-gb-mit": "^3.1.16", - "@cspell/dict-filetypes": "^3.0.15", - "@cspell/dict-flutter": "^1.1.1", - "@cspell/dict-fonts": "^4.0.5", - "@cspell/dict-fsharp": "^1.1.1", - "@cspell/dict-fullstack": "^3.2.7", - "@cspell/dict-gaming-terms": "^1.1.2", - "@cspell/dict-git": "^3.0.7", - "@cspell/dict-golang": "^6.0.26", - "@cspell/dict-google": "^1.0.9", - "@cspell/dict-haskell": "^4.0.6", - "@cspell/dict-html": "^4.0.14", - "@cspell/dict-html-symbol-entities": "^4.0.5", - "@cspell/dict-java": "^5.0.12", - "@cspell/dict-julia": "^1.1.1", - "@cspell/dict-k8s": "^1.0.12", - "@cspell/dict-kotlin": "^1.1.1", - "@cspell/dict-latex": "^4.0.4", - "@cspell/dict-lorem-ipsum": "^4.0.5", - "@cspell/dict-lua": "^4.0.8", - "@cspell/dict-makefile": "^1.0.5", - "@cspell/dict-markdown": "^2.0.14", - "@cspell/dict-monkeyc": "^1.0.12", - "@cspell/dict-node": "^5.0.8", - "@cspell/dict-npm": "^5.2.29", - "@cspell/dict-php": "^4.1.1", - "@cspell/dict-powershell": "^5.0.15", - "@cspell/dict-public-licenses": "^2.0.15", - "@cspell/dict-python": "^4.2.25", - "@cspell/dict-r": "^2.1.1", - "@cspell/dict-ruby": "^5.1.0", - "@cspell/dict-rust": "^4.1.1", - "@cspell/dict-scala": "^5.0.9", - "@cspell/dict-shell": "^1.1.2", - "@cspell/dict-software-terms": "^5.1.20", - "@cspell/dict-sql": "^2.2.1", - "@cspell/dict-svelte": "^1.0.7", - "@cspell/dict-swift": "^2.0.6", - "@cspell/dict-terraform": "^1.1.3", - "@cspell/dict-typescript": "^3.2.3", - "@cspell/dict-vue": "^3.0.5", - "@cspell/dict-zig": "^1.0.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@cspell/eslint-plugin/node_modules/@cspell/cspell-pipe": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-9.6.0.tgz", - "integrity": "sha512-YNuY8NNXfE+8Qzknm2ps6QbrZLZu6rSZTZr3dYW3K6TK7+IFVlJ6e2Z9iKJTqp6aZ4AGU/r9QYGmNX4Oq4gZ0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/@cspell/eslint-plugin/node_modules/@cspell/cspell-resolver": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-9.6.0.tgz", - "integrity": "sha512-Gb2UWNmRpTOQGpYL4Q/LMw+b50KcRZcf/wJg6w0Yl3IT+F/uDNhNh1f5rHuTyGsbMsMxHJhsb2AoP+73GlbIfw==", - "dev": true, - "license": "MIT", - "dependencies": { - "global-directory": "^4.0.1" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@cspell/eslint-plugin/node_modules/@cspell/cspell-service-bus": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-9.6.0.tgz", - "integrity": "sha512-DCuKKkySTEB8MPLTdoPMdmakYcx7XCsHz1YEMbzOcLqJCxXsRlRZg4qE9kRBee/2QY7eYA2kaYNgn/TDMooa4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/@cspell/eslint-plugin/node_modules/@cspell/cspell-types": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-9.6.0.tgz", - "integrity": "sha512-JTqrD47tV+rWc1y2W8T0NTfWLQMlSWX4OF64/Jf3WbsOD+4UXVIfjRlzPry7+1Zekm6pa38+23jkDBytYpu8yw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/@cspell/eslint-plugin/node_modules/@cspell/dict-cpp": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-7.0.2.tgz", - "integrity": "sha512-dfbeERiVNeqmo/npivdR6rDiBCqZi3QtjH2Z0HFcXwpdj6i97dX1xaKyK2GUsO/p4u1TOv63Dmj5Vm48haDpuA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/eslint-plugin/node_modules/@cspell/dynamic-import": { + "node_modules/@cspell/dynamic-import": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-9.6.0.tgz", "integrity": "sha512-Lkn82wyGj2ltxeYfH2bEjshdes1fx3ouYUZxeW5i6SBBvEVJoSmr43AygI8A317UMIQxVj59qVBorrtGYcRI1w==", @@ -2421,7 +2415,7 @@ "node": ">=20" } }, - "node_modules/@cspell/eslint-plugin/node_modules/@cspell/filetypes": { + "node_modules/@cspell/filetypes": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/@cspell/filetypes/-/filetypes-9.6.0.tgz", "integrity": "sha512-CaWyk5j20H6sr+HCArtUY95jUQb7A/6W0GC4B4umnqoWvgqwR72duowLFa+w1K2C7tZg3GoV4Wf2cUn9jjt5FA==", @@ -2431,7 +2425,7 @@ "node": ">=20" } }, - "node_modules/@cspell/eslint-plugin/node_modules/@cspell/strong-weak-map": { + "node_modules/@cspell/strong-weak-map": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-9.6.0.tgz", "integrity": "sha512-9g8LCLv/2RrprGeGnFAaBETWq7ESnBcoMbvgNu+vZE58iF+pbFvP0qGgKvVeKEEpc2LZhNuHLsUH37MUS6DOQg==", @@ -2441,7 +2435,7 @@ "node": ">=20" } }, - "node_modules/@cspell/eslint-plugin/node_modules/@cspell/url": { + "node_modules/@cspell/url": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/@cspell/url/-/url-9.6.0.tgz", "integrity": "sha512-257WOxh9vOYHAVgBNXRCdLEd+ldzlVbzcc9u+6DYoCDCNGe0OvOWOGsAfnUbMc9xEw48XgBlDYgOlPbjWGLOTg==", @@ -2451,209 +2445,6 @@ "node": ">=20" } }, - "node_modules/@cspell/eslint-plugin/node_modules/cspell-config-lib": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-9.6.0.tgz", - "integrity": "sha512-5ztvheawkmFXNHGN82iOOntU3T5mmlQBP/plgoKdBZ6+lSYrOJLkOyqxYyi7MrUBDtWrXPzFllkBrPNRDlbX/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-types": "9.6.0", - "comment-json": "^4.5.1", - "smol-toml": "^1.6.0", - "yaml": "^2.8.2" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@cspell/eslint-plugin/node_modules/cspell-dictionary": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-9.6.0.tgz", - "integrity": "sha512-wW0m1kLrbK6bRY/GrLUGKUUJ1Z4ZUgIb8LD4zNaECcvGviv9V7VcR3mEwUip3ZjoHa3ClzEoWgQ9gXrtac80Wg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-pipe": "9.6.0", - "@cspell/cspell-types": "9.6.0", - "cspell-trie-lib": "9.6.0", - "fast-equals": "^6.0.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@cspell/eslint-plugin/node_modules/cspell-glob": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-9.6.0.tgz", - "integrity": "sha512-KmEbKN0qdEamsEYbkFu7zjLYfw3hMmn9kmeh94IHr2kq6vWq5vNP5l1BuqmrUeFZlbNd07vj08IKAZHYsoGheQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/url": "9.6.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@cspell/eslint-plugin/node_modules/cspell-grammar": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-9.6.0.tgz", - "integrity": "sha512-jZVIM5/3eB9rWURDq+VXdYip+DmPuFzO+bqaRtzqT8w6YoOIGYbiIxdwvyyA9xdH7SmW8uqHJP5x4pzZju1lNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-pipe": "9.6.0", - "@cspell/cspell-types": "9.6.0" - }, - "bin": { - "cspell-grammar": "bin.mjs" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@cspell/eslint-plugin/node_modules/cspell-io": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-9.6.0.tgz", - "integrity": "sha512-wZuZzKOYIb698kVEINYjGaNFQu+AFZ945TORM3hapmPjez+vsHwl8m/pPpCHeGMpQtHMEDkX84AbQ7R55MRIwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-service-bus": "9.6.0", - "@cspell/url": "9.6.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@cspell/eslint-plugin/node_modules/cspell-lib": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-9.6.0.tgz", - "integrity": "sha512-m9rIv8hkQ3Dio4s80HQbM9cdxENcd6pS8j2AHWL50OSjJf3Xhw6/wMrIAGbwLHP15K6QZVU2eJ/abCzIJwjA4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-bundled-dicts": "9.6.0", - "@cspell/cspell-pipe": "9.6.0", - "@cspell/cspell-resolver": "9.6.0", - "@cspell/cspell-types": "9.6.0", - "@cspell/dynamic-import": "9.6.0", - "@cspell/filetypes": "9.6.0", - "@cspell/strong-weak-map": "9.6.0", - "@cspell/url": "9.6.0", - "clear-module": "^4.1.2", - "cspell-config-lib": "9.6.0", - "cspell-dictionary": "9.6.0", - "cspell-glob": "9.6.0", - "cspell-grammar": "9.6.0", - "cspell-io": "9.6.0", - "cspell-trie-lib": "9.6.0", - "env-paths": "^3.0.0", - "gensequence": "^8.0.8", - "import-fresh": "^3.3.1", - "resolve-from": "^5.0.0", - "vscode-languageserver-textdocument": "^1.0.12", - "vscode-uri": "^3.1.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@cspell/eslint-plugin/node_modules/cspell-trie-lib": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-9.6.0.tgz", - "integrity": "sha512-L7GSff5F9cF60QT78WsebVlb3sppi6jbvTHwsw7WF1jUN/ioAo7OzBYtYB7xkYeejcdVEpqfvf/ZOXPDp8x2Wg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@cspell/cspell-types": "9.6.0" - } - }, - "node_modules/@cspell/eslint-plugin/node_modules/fast-equals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-6.0.0.tgz", - "integrity": "sha512-PFhhIGgdM79r5Uztdj9Zb6Tt1zKafqVfdMGwVca1z5z6fbX7DmsySSuJd8HiP6I1j505DCS83cLxo5rmSNeVEA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@cspell/eslint-plugin/node_modules/gensequence": { - "version": "8.0.8", - "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-8.0.8.tgz", - "integrity": "sha512-omMVniXEXpdx/vKxGnPRoO2394Otlze28TyxECbFVyoSpZ9H3EO7lemjcB12OpQJzRW4e5tt/dL1rOxry6aMHg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/@cspell/eslint-plugin/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@cspell/eslint-plugin/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@cspell/eslint-plugin/node_modules/smol-toml": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.0.tgz", - "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 18" - }, - "funding": { - "url": "https://github.com/sponsors/cyyynthia" - } - }, - "node_modules/@cspell/eslint-plugin/node_modules/vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/eslint-plugin/node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, "node_modules/@csstools/cascade-layer-name-parser": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", @@ -8373,6 +8164,35 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chalk-template": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.2.tgz", + "integrity": "sha512-2bxTP2yUH7AJj/VAXfcA+4IcWGdQ87HwBANLt5XxGTeomo8yG0y95N1um9i5StvhT/Bl0/2cARA5v1PpPXUxUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "node_modules/chalk-template/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -9133,6 +8953,281 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cspell": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-9.6.0.tgz", + "integrity": "sha512-Mpf0oT2KAHTIb3YPAXWhW64/4CZKW5Lka4j1YxCLK3jM3nenmIsY/ocrJvqCMF4+1eejRF0N55sT3XmrijI5YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-json-reporter": "9.6.0", + "@cspell/cspell-pipe": "9.6.0", + "@cspell/cspell-types": "9.6.0", + "@cspell/dynamic-import": "9.6.0", + "@cspell/url": "9.6.0", + "ansi-regex": "^6.2.2", + "chalk": "^5.6.2", + "chalk-template": "^1.1.2", + "commander": "^14.0.2", + "cspell-config-lib": "9.6.0", + "cspell-dictionary": "9.6.0", + "cspell-gitignore": "9.6.0", + "cspell-glob": "9.6.0", + "cspell-io": "9.6.0", + "cspell-lib": "9.6.0", + "fast-json-stable-stringify": "^2.1.0", + "flatted": "^3.3.3", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15" + }, + "bin": { + "cspell": "bin.mjs", + "cspell-esm": "bin.mjs" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/streetsidesoftware/cspell?sponsor=1" + } + }, + "node_modules/cspell-config-lib": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-9.6.0.tgz", + "integrity": "sha512-5ztvheawkmFXNHGN82iOOntU3T5mmlQBP/plgoKdBZ6+lSYrOJLkOyqxYyi7MrUBDtWrXPzFllkBrPNRDlbX/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-types": "9.6.0", + "comment-json": "^4.5.1", + "smol-toml": "^1.6.0", + "yaml": "^2.8.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-config-lib/node_modules/smol-toml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.0.tgz", + "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/cspell-config-lib/node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/cspell-dictionary": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-9.6.0.tgz", + "integrity": "sha512-wW0m1kLrbK6bRY/GrLUGKUUJ1Z4ZUgIb8LD4zNaECcvGviv9V7VcR3mEwUip3ZjoHa3ClzEoWgQ9gXrtac80Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-pipe": "9.6.0", + "@cspell/cspell-types": "9.6.0", + "cspell-trie-lib": "9.6.0", + "fast-equals": "^6.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-gitignore": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-9.6.0.tgz", + "integrity": "sha512-8GfmJuRBBvibyPHnNE2wYJAiQ/ceDYLD1X1sUQaCyj6hPMR7ChJiVhFPtS11hMqkjZ46OBMYTMGWqO792L9fEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/url": "9.6.0", + "cspell-glob": "9.6.0", + "cspell-io": "9.6.0" + }, + "bin": { + "cspell-gitignore": "bin.mjs" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-glob": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-9.6.0.tgz", + "integrity": "sha512-KmEbKN0qdEamsEYbkFu7zjLYfw3hMmn9kmeh94IHr2kq6vWq5vNP5l1BuqmrUeFZlbNd07vj08IKAZHYsoGheQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/url": "9.6.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-glob/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/cspell-grammar": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-9.6.0.tgz", + "integrity": "sha512-jZVIM5/3eB9rWURDq+VXdYip+DmPuFzO+bqaRtzqT8w6YoOIGYbiIxdwvyyA9xdH7SmW8uqHJP5x4pzZju1lNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-pipe": "9.6.0", + "@cspell/cspell-types": "9.6.0" + }, + "bin": { + "cspell-grammar": "bin.mjs" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-io": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-9.6.0.tgz", + "integrity": "sha512-wZuZzKOYIb698kVEINYjGaNFQu+AFZ945TORM3hapmPjez+vsHwl8m/pPpCHeGMpQtHMEDkX84AbQ7R55MRIwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-service-bus": "9.6.0", + "@cspell/url": "9.6.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-lib": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-9.6.0.tgz", + "integrity": "sha512-m9rIv8hkQ3Dio4s80HQbM9cdxENcd6pS8j2AHWL50OSjJf3Xhw6/wMrIAGbwLHP15K6QZVU2eJ/abCzIJwjA4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-bundled-dicts": "9.6.0", + "@cspell/cspell-pipe": "9.6.0", + "@cspell/cspell-resolver": "9.6.0", + "@cspell/cspell-types": "9.6.0", + "@cspell/dynamic-import": "9.6.0", + "@cspell/filetypes": "9.6.0", + "@cspell/strong-weak-map": "9.6.0", + "@cspell/url": "9.6.0", + "clear-module": "^4.1.2", + "cspell-config-lib": "9.6.0", + "cspell-dictionary": "9.6.0", + "cspell-glob": "9.6.0", + "cspell-grammar": "9.6.0", + "cspell-io": "9.6.0", + "cspell-trie-lib": "9.6.0", + "env-paths": "^3.0.0", + "gensequence": "^8.0.8", + "import-fresh": "^3.3.1", + "resolve-from": "^5.0.0", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-uri": "^3.1.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-lib/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cspell-lib/node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cspell-trie-lib": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-9.6.0.tgz", + "integrity": "sha512-L7GSff5F9cF60QT78WsebVlb3sppi6jbvTHwsw7WF1jUN/ioAo7OzBYtYB7xkYeejcdVEpqfvf/ZOXPDp8x2Wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@cspell/cspell-types": "9.6.0" + } + }, + "node_modules/cspell/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cspell/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cspell/node_modules/commander": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/css-blank-pseudo": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", @@ -11818,6 +11913,16 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/fast-equals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-6.0.0.tgz", + "integrity": "sha512-PFhhIGgdM79r5Uztdj9Zb6Tt1zKafqVfdMGwVca1z5z6fbX7DmsySSuJd8HiP6I1j505DCS83cLxo5rmSNeVEA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -12299,6 +12404,16 @@ "node": ">= 0.4" } }, + "node_modules/gensequence": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-8.0.8.tgz", + "integrity": "sha512-omMVniXEXpdx/vKxGnPRoO2394Otlze28TyxECbFVyoSpZ9H3EO7lemjcB12OpQJzRW4e5tt/dL1rOxry6aMHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", diff --git a/package.json b/package.json index 4960f924..151839a9 100644 --- a/package.json +++ b/package.json @@ -62,13 +62,13 @@ ] }, "devDependencies": { - "@cspell/eslint-plugin": "9.6.0", "@docusaurus/module-type-aliases": "3.9.2", "@docusaurus/tsconfig": "3.9.2", "@eslint/js": "9.39.2", "@types/react": "18.3.27", "@types/react-helmet": "6.1.11", "@types/react-router-dom": "5.3.3", + "cspell": "9.6.0", "eslint": "9.39.2", "eslint-config-prettier": "10.1.8", "eslint-plugin-import": "2.32.0", From 9a547465ae0c3d54f52a02a438ca31ba974973e9 Mon Sep 17 00:00:00 2001 From: BotBlake Date: Thu, 15 Jan 2026 11:21:32 +0100 Subject: [PATCH 164/190] remove cspell from eslint --- eslint.config.mjs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index ae8a3776..ecca81fb 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,4 +1,3 @@ -import cspellConfigs from '@cspell/eslint-plugin/configs'; import { globalIgnores } from 'eslint/config'; import react from 'eslint-plugin-react'; import reactHooks from 'eslint-plugin-react-hooks'; @@ -22,7 +21,6 @@ export default ts.config([ '**/yarn-error.log*', '**/*.json' ]), - cspellConfigs.recommended, react.configs.flat.recommended, reactHooks.configs.flat.recommended, ...ts.configs.recommended, @@ -53,13 +51,7 @@ export default ts.config([ rules: { 'no-unused-vars': 'off', - '@typescript-eslint/no-unused-vars': 'error', - '@cspell/spellchecker': [ - 'error', - { - configFile: new URL('./cspell.config.mjs', import.meta.url).toString() - } - ] + '@typescript-eslint/no-unused-vars': 'error' } } ]); From 2507c1ea8b3f74869d3f0201b89f8e4b7f21e145 Mon Sep 17 00:00:00 2001 From: BotBlake Date: Thu, 15 Jan 2026 11:36:38 +0100 Subject: [PATCH 165/190] fetch depth for cspell --- .github/workflows/lint.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 0267fda8..d9ed8e77 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -57,6 +57,8 @@ jobs: steps: - name: Check out Git repository uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + with: + fetch-depth: 0 - name: Run cspell uses: streetsidesoftware/cspell-action@24fa8d3096a314ce263f39578744e9d9f8d80acf # v8.1.2 From c6ec7e08a4726f705d56e089606a19d8d269f913 Mon Sep 17 00:00:00 2001 From: BotBlake Date: Thu, 15 Jan 2026 11:41:15 +0100 Subject: [PATCH 166/190] remove fetch depth --- .github/workflows/lint.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index d9ed8e77..0267fda8 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -57,8 +57,6 @@ jobs: steps: - name: Check out Git repository uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - with: - fetch-depth: 0 - name: Run cspell uses: streetsidesoftware/cspell-action@24fa8d3096a314ce263f39578744e9d9f8d80acf # v8.1.2 From a8e978ba872ad490b8af685d931348a56e9a8204 Mon Sep 17 00:00:00 2001 From: BotBlake Date: Thu, 15 Jan 2026 11:48:42 +0100 Subject: [PATCH 167/190] migrate cspell config to json --- .github/workflows/lint.yml | 2 +- cspell.config.mjs | 15 --------------- cspell.json | 14 ++++++++++++++ 3 files changed, 15 insertions(+), 16 deletions(-) delete mode 100644 cspell.config.mjs create mode 100644 cspell.json diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 0267fda8..df0bd6fb 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -61,4 +61,4 @@ jobs: - name: Run cspell uses: streetsidesoftware/cspell-action@24fa8d3096a314ce263f39578744e9d9f8d80acf # v8.1.2 with: - config: ./cspell.config.mjs + config: ./cspell.json diff --git a/cspell.config.mjs b/cspell.config.mjs deleted file mode 100644 index 905123cf..00000000 --- a/cspell.config.mjs +++ /dev/null @@ -1,15 +0,0 @@ -import { defineConfig } from 'cspell'; - -export default defineConfig({ - version: '0.2', - files: ['**/*.md'], - dictionaryDefinitions: [ - { - name: 'project-words', - path: './project-words.txt', - addWords: true - } - ], - dictionaries: ['project-words'], - ignorePaths: ['node_modules', '/project-words.txt'] -}); diff --git a/cspell.json b/cspell.json new file mode 100644 index 00000000..d21617f1 --- /dev/null +++ b/cspell.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json", + "version": "0.2", + "files": ["**/*.md"], + "dictionaryDefinitions": [ + { + "name": "project-words", + "path": "./project-words.txt", + "addWords": true + } + ], + "dictionaries": ["project-words"], + "ignorePaths": ["node_modules", "/project-words.txt"] +} From ca6f8ccbebc26e850c2459ecc405ac1940048dbf Mon Sep 17 00:00:00 2001 From: BotBlake Date: Thu, 15 Jan 2026 13:58:30 +0100 Subject: [PATCH 168/190] add mdx and tsx --- cspell.json | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/cspell.json b/cspell.json index d21617f1..93eb54d3 100644 --- a/cspell.json +++ b/cspell.json @@ -1,7 +1,7 @@ { "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json", "version": "0.2", - "files": ["**/*.md"], + "files": ["**/*.md", "**/*.mdx", "**/*.tsx"], "dictionaryDefinitions": [ { "name": "project-words", @@ -10,5 +10,16 @@ } ], "dictionaries": ["project-words"], - "ignorePaths": ["node_modules", "/project-words.txt"] + "ignorePaths": [ + "node_modules", + "/project-words.txt", + + "/blog/2019/*", + "/blog/2020/*", + "/blog/2021/*", + "/blog/2022/*", + "/blog/2023/*", + "/blog/2024/*", + "/blog/2025/*" + ] } From 5200d56f7752abfbadd17ba79e572db7f3d13584 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 Jan 2026 03:25:33 +0000 Subject: [PATCH 169/190] Update actions/setup-node action to v6.2.0 --- .github/workflows/__build.yml | 2 +- .github/workflows/lint.yml | 4 ++-- .github/workflows/test.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/__build.yml b/.github/workflows/__build.yml index 757eca43..0ab11116 100644 --- a/.github/workflows/__build.yml +++ b/.github/workflows/__build.yml @@ -19,7 +19,7 @@ jobs: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: ref: ${{ inputs.ref }} - - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 20 - name: Configure Pages diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 4cce1426..2690e06a 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -15,7 +15,7 @@ jobs: uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Set up Node.js - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 20 check-latest: true @@ -38,7 +38,7 @@ jobs: uses: xt0rted/markdownlint-problem-matcher@1a5fabfb577370cfdf5af944d418e4be3ea06f27 # v3.0.0 - name: Set up Node.js - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 20 check-latest: true diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9a175385..9ded1c06 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -23,7 +23,7 @@ jobs: uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Set up Node.js - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 20 check-latest: true From 4a4829334098c374cd5a00ab12b75d6fe9436dfc Mon Sep 17 00:00:00 2001 From: BotBlake Date: Fri, 16 Jan 2026 15:02:41 +0100 Subject: [PATCH 170/190] add GB lang to cspell --- cspell.json | 1 + project-words.txt | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/cspell.json b/cspell.json index 93eb54d3..9096b153 100644 --- a/cspell.json +++ b/cspell.json @@ -1,6 +1,7 @@ { "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json", "version": "0.2", + "language": "en, en-US, en-GB", "files": ["**/*.md", "**/*.mdx", "**/*.tsx"], "dictionaryDefinitions": [ { diff --git a/project-words.txt b/project-words.txt index b378e16b..983bd071 100644 --- a/project-words.txt +++ b/project-words.txt @@ -34,8 +34,6 @@ bantime barebones Battlemage BDMV -behaviour -behaviours behindthescenes blitter Blitter @@ -67,8 +65,6 @@ clinfo codenames codesign collectionnumber -colour -colours comskip configdir confs From 68a23d8099c88c1307cdef94b56fe56f450fbd09 Mon Sep 17 00:00:00 2001 From: BotBlake Date: Fri, 16 Jan 2026 19:13:32 +0100 Subject: [PATCH 171/190] Spelling fixes (#1724) --- .../general/administration/troubleshooting.md | 4 +- docs/general/clients/codec-support.md | 2 +- docs/general/clients/css-customization.md | 16 +-- docs/general/clients/kodi.md | 2 +- docs/general/contributing/issues.md | 2 +- .../general/installation/_container-podman.md | 2 +- docs/general/installation/advanced/truenas.md | 2 +- docs/general/installation/linux.md | 2 +- .../post-install/networking/2_tailscale.md | 6 +- .../networking/9_advanced/fail2ban.md | 10 +- docs/general/post-install/networking/index.md | 30 +++--- .../transcoding/hardware-acceleration/amd.md | 9 +- .../hardware-acceleration/index.md | 10 +- .../hardware-acceleration/intel.md | 19 +--- .../hardware-acceleration/known-issues.md | 9 +- .../hardware-acceleration/nvidia.md | 21 ++-- .../hardware-acceleration/rockchip.md | 8 +- docs/general/server/media/_metadata-images.md | 42 ++++---- docs/general/server/metadata/index.md | 4 +- docs/general/server/metadata/nfo.md | 98 +++++++++---------- docs/general/server/plugins/tvheadend.md | 5 +- docs/general/server/tasks.md | 2 +- docs/project/branding.md | 2 +- 23 files changed, 137 insertions(+), 170 deletions(-) diff --git a/docs/general/administration/troubleshooting.md b/docs/general/administration/troubleshooting.md index 2800911e..1dbfb6ce 100644 --- a/docs/general/administration/troubleshooting.md +++ b/docs/general/administration/troubleshooting.md @@ -224,7 +224,7 @@ You have 3 options to set the locking mode to: - `Optimistic` - Defines that all writes should be attempted and should be retried when they fail. - `Pessimistic` - Defines a behavior that always blocks all reads while any one write is done. -Stop your Jellyin server and navigate to its config directory. There are a lot of xml files, look for the `database.xml` file and edit the `LockingBehavior` option: +Stop your Jellyfin server and navigate to its config directory. There are a lot of xml files, look for the `database.xml` file and edit the `LockingBehavior` option: ```xml @@ -236,7 +236,7 @@ Stop your Jellyin server and navigate to its config directory. There are a lot o ``` -then start your jellyfin instance again. If this still does not help with the issues, you can try setting the `LockingBehavior` to `Pessimistic` instead but this comes with a significant performance impact so it is only recommended when `Optimistic` does not help with the issues. +then start your Jellyfin instance again. If this still does not help with the issues, you can try setting the `LockingBehavior` to `Pessimistic` instead but this comes with a significant performance impact so it is only recommended when `Optimistic` does not help with the issues. ### LXC specific issues diff --git a/docs/general/clients/codec-support.md b/docs/general/clients/codec-support.md index d14d080e..3e9d6207 100644 --- a/docs/general/clients/codec-support.md +++ b/docs/general/clients/codec-support.md @@ -48,7 +48,7 @@ The goal is to Direct Play all media. This means the container, video, audio and
12Need to be manually enabled in Settings > Playback > Enable H.264 High 10 Profile. Playback on Apple Silicon Macs with macOS version < 14 and Intel Macs with all macOS versions may result in blank frames if this is enabled.
-13VP9 is only availble with Swiftfin (VLCKit) player. +13VP9 is only available with Swiftfin (VLCKit) player.
14AV1 is enabled by default for Swiftfin (VLCKit). AV1 is disabled by default but can be enabled for Native (AVKit) using Custom Device Profiles. Enabling AV1 may result in a poor experience for SOCs prior to A17.
diff --git a/docs/general/clients/css-customization.md b/docs/general/clients/css-customization.md index 150dea95..010544db 100644 --- a/docs/general/clients/css-customization.md +++ b/docs/general/clients/css-customization.md @@ -95,7 +95,7 @@ This will affect the played/watched indicator. Replace the hex color with any va ![Screenshot of watched indicators with a custom transparent color applied](/images/docs/custom-css-transparentwatched.png) -### Transparant count indicators (eg. Series) +### Transparent count indicators (eg. Series) ```css /* Make count indicator icon dark and transparent */ @@ -736,19 +736,19 @@ Material Icons: - Outlined: ```css - @import url("https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Outline.css"); + @import url('https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Outline.css'); ``` - Rounded: ```css - @import url("https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/round.css"); + @import url('https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/round.css'); ``` - Sharp: ```css - @import url("https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Sharp.css"); + @import url('https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Sharp.css'); ``` Fontawesome Icons: @@ -756,25 +756,25 @@ Fontawesome Icons: - Solid: ```css - @import url("https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Font%20Awesome/solid.css"); + @import url('https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Font%20Awesome/solid.css'); ``` - Regular: ```css - @import url("https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Font%20Awesome/regular.css"); + @import url('https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Font%20Awesome/regular.css'); ``` - Light: ```css - @import url("https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Font%20Awesome/light.css"); + @import url('https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Font%20Awesome/light.css'); ``` - duotone: ```css - @import url("https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Font%20Awesome/duotone.css"); + @import url('https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Font%20Awesome/duotone.css'); ``` ## Community Links diff --git a/docs/general/clients/kodi.md b/docs/general/clients/kodi.md index 07467278..b9030cfc 100644 --- a/docs/general/clients/kodi.md +++ b/docs/general/clients/kodi.md @@ -28,7 +28,7 @@ The installation method for the repository varies depending on what kind of devi - If prompted, enter settings and enable "Unknown Sources", then go back to the Add-on Browser - Select the newly downloaded file and it will be installed -#### "Embedded" Devices (Android TV, Firestick, and other TV Boxes) +#### "Embedded" Devices (Android TV, FireTV Stick, and other TV Boxes) 1. Open Kodi, go to the settings menu, and navigate to "File manager" - Select "Add source" diff --git a/docs/general/contributing/issues.md b/docs/general/contributing/issues.md index 82139013..9e6d0c83 100644 --- a/docs/general/contributing/issues.md +++ b/docs/general/contributing/issues.md @@ -43,7 +43,7 @@ When writing a bug issue, please ensure you capture as much relevant detail as p Bugs should be tagged with `[bug]` at the beginning of their title. This will later be removed by the Jellyfin team when assigning labels. To assist in triaging, if you know which other [label(s)](/docs/general/contributing/issues#issue-labels) should be applied to your issue, please add them after the `[bug]` label. -Bugs should be reproduceable. That is, you should be able to have determined through troubleshooting how to replicate the issue. While one-time bugs should not be ignored, if they're difficult or impossible to reproduce, it's likely very hard to fix them. Please attempt to reproduce the bug before filing the issue and include the smallest test case you can to demonstrate it. +Bugs should be reproducible. That is, you should be able to have determined through troubleshooting how to replicate the issue. While one-time bugs should not be ignored, if they're difficult or impossible to reproduce, it's likely very hard to fix them. Please attempt to reproduce the bug before filing the issue and include the smallest test case you can to demonstrate it. If you ever need assistance for troubleshooting or opening an issue, please [contact the community](/docs/general/getting-help) and we'll try to help you out! diff --git a/docs/general/installation/_container-podman.md b/docs/general/installation/_container-podman.md index ed36e531..9a2a8ed3 100644 --- a/docs/general/installation/_container-podman.md +++ b/docs/general/installation/_container-podman.md @@ -29,7 +29,7 @@ Steps to run Jellyfin using Podman are similar to the Docker steps. 3. Open the necessary ports in your machine's firewall if you wish to permit access to the Jellyfin server from outside the host. This is not done automatically when using rootless Podman. - If your distribution uses `firewalld`, the following commands save and load a new firewall rule opening the HTTP port `8096` for TCP connections. Additionaly port 7359 UDP needs to be opened for auto discovery. + If your distribution uses `firewalld`, the following commands save and load a new firewall rule opening the HTTP port `8096` for TCP connections. Additionally port 7359 UDP needs to be opened for auto discovery. ```sh sudo firewall-cmd --add-port=8096/tcp --permanent diff --git a/docs/general/installation/advanced/truenas.md b/docs/general/installation/advanced/truenas.md index 3ff8ddd1..64baa650 100644 --- a/docs/general/installation/advanced/truenas.md +++ b/docs/general/installation/advanced/truenas.md @@ -527,7 +527,7 @@ You can also pull new images to use in the future. You can choose to pull from Jellyfin's [Docker Hub](https://hub.docker.com/r/jellyfin/jellyfin) or [GitHub Container Registry](https://github.com/jellyfin/jellyfin/pkgs/container/jellyfin). -- To pull from Docker Hub, use: `jellyfin/jellyin` +- To pull from Docker Hub, use: `jellyfin/jellyfin` - To pull from from GHCR, use: `ghcr.io/jellyfin/jellyfin` - [You can check this blog post for more info about GHCR:](/posts/jellyfin-release-10.9.0#key-release-notesbreaking-changes) - "Docker users: We now offer GitHub Container Registry (GHCR) as an alternative container registry in addition to Docker Hub. You can pull images from the new registry via URIs like `ghcr.io/jellyfin/jellyfin:latest`. Don't worry, we have no plans to drop Docker Hub as a container registry, but we feel providing both gives users more choice and flexibility." diff --git a/docs/general/installation/linux.md b/docs/general/installation/linux.md index 99dd0517..7466f92f 100644 --- a/docs/general/installation/linux.md +++ b/docs/general/installation/linux.md @@ -8,7 +8,7 @@ sidebar_position: 3 ## Debian / Ubuntu and derivatives To simplify deployment and help automate this for as many users as possible, we provide a BASH script to handle repo installation as well as installing Jellyfin on Debian / Ubuntu and derivatives. -All you need to do is run this command on your system (requires `curl`, or subsitute `curl` with `wget -O-`): +All you need to do is run this command on your system (requires `curl`, or substitute `curl` with `wget -O-`): ```sh curl https://repo.jellyfin.org/install-debuntu.sh | sudo bash diff --git a/docs/general/post-install/networking/2_tailscale.md b/docs/general/post-install/networking/2_tailscale.md index 8efd91a0..a9f9d766 100644 --- a/docs/general/post-install/networking/2_tailscale.md +++ b/docs/general/post-install/networking/2_tailscale.md @@ -30,13 +30,13 @@ Cons: Setup on server: 1. Install the Tailscale app on the client device. Instructions are available in [Tailscale's official install guide](https://tailscale.com/kb/1347/installation) -2. Login to the Tailscale client and connect to the tailnet. On Windows and macOS that can be done through the icon in the system tray. On Linux that can be done with the comnand `sudo tailscale up` +2. Login to the Tailscale client and connect to the tailnet. On Windows and macOS that can be done through the icon in the system tray. On Linux that can be done with the command `sudo tailscale up` 3. Find and note your Tailscale IP of the server according to the [Tailscale Documentation](https://tailscale.com/kb/1033/ip-and-dns-addresses?tab=linux#finding-your-tailscale-ip-address). This IP will be used for other devices to connect. The IP should start with 100 (e.g. 100.12.34.56). Setup on clients: 1. Install the Tailscale app on the client device. Instructions are available in [Tailscale's official install guide](https://tailscale.com/kb/1347/installation) -2. Login to the Tailscale client and connect to the tailnet. On Windows and macOS that can be done through the icon in the system tray. On Linux that can be done with the comnand `sudo tailscale up`. On mobile devices that can be done through the tailscale app. +2. Login to the Tailscale client and connect to the tailnet. On Windows and macOS that can be done through the icon in the system tray. On Linux that can be done with the command `sudo tailscale up`. On mobile devices that can be done through the tailscale app. 3. Type in the server IP from above into your browser or Jellyfin client of choice and connect. (e.g. 100.12.34.56:8096) ## Using Tailscale with a reverse proxy @@ -52,7 +52,7 @@ Setup on Jellyfin server: Setup on reverse proxy server: 1. Install the Tailscale app on the client device. Instructions are available in [Tailscale's official install guide](https://tailscale.com/kb/1347/installation) -2. Login to the tailscale client and connect to the tailnet. On Linux this can be done with the comnand `sudo tailscale up` +2. Login to the tailscale client and connect to the tailnet. On Linux this can be done with the command `sudo tailscale up` 3. Setup a reverse proxy of your choice and set the upstream server to the IP from above. Example [Caddy](./reverse-proxy/caddy) configuration: (Assuming server has Tailscale IP of 100.12.34.56) ```txt diff --git a/docs/general/post-install/networking/9_advanced/fail2ban.md b/docs/general/post-install/networking/9_advanced/fail2ban.md index acbbca99..f4129307 100644 --- a/docs/general/post-install/networking/9_advanced/fail2ban.md +++ b/docs/general/post-install/networking/9_advanced/fail2ban.md @@ -150,7 +150,7 @@ Replace `` with the actual IP address of your upstream serve iptables -C INPUT -j f2b- 2>/dev/null || iptables -I INPUT -j f2b-; \ iptables -I f2b- 1 -s -j DROP' && \ echo "Banned from jail via upstream proxy" >> /var/log/fail2ban.log - + # Option: actionunban # 1. Remove the banned IP from the dynamic chain # 2. Remove the chain if it becomes empty (cleanup) @@ -165,7 +165,7 @@ Replace `` with the actual IP address of your upstream serve echo "Unbanned from jail via upstream proxy and cleaned up chain if empty" >> /var/log/fail2ban.log ``` - After making chaneges, save and close the file. + After making changes, save and close the file. 2. **Update Fail2Ban Jails to Use the Dynamic Chain Action**: @@ -195,7 +195,7 @@ Replace `` with the actual IP address of your upstream serve action = proxy-iptables-dynamic ``` - After making chaneges, save and close the file. + After making changes, save and close the file. ### Step three: Add proxy IPs to Jellyfin @@ -211,7 +211,7 @@ Replace `` with the actual IP address of your upstream serve Open your Jellyfin server's dashboard, go to `Advanced` -> `Networking`, and then scroll down to `Known proxies`. - Enter your comma-seperated list of proxy IP ranges. You'll need to reboot the Jellyfin server as indicated. + Enter your comma-separated list of proxy IP ranges. You'll need to reboot the Jellyfin server as indicated. ### Step four: Restart Fail2Ban and Test the Setup @@ -257,7 +257,7 @@ Replace `` with the actual IP address of your upstream serve 6. **Verify Unban**: - Verify that the IP is removed from the corresponding jail's chain ('f2b-jail-name'): + Verify that the IP is removed from the corresponding jail's chain ('f2b-jail-name'): ```bash ssh root@ "iptables -L f2b-jellyfin" diff --git a/docs/general/post-install/networking/index.md b/docs/general/post-install/networking/index.md index 82db41d4..cf71adba 100644 --- a/docs/general/post-install/networking/index.md +++ b/docs/general/post-install/networking/index.md @@ -16,24 +16,24 @@ Neither does Jellyfin require an internet connection to run; however you should This section aims to provide an administrator with knowledge on what ports Jellyfin binds to and what purpose they serve. -| Port | Protocol | Configurable | Description | -|---|---|---|---| -| 8096 | TCP | ✔️ | Default HTTP | -| 8920 | TCP | ✔️ | Default HTTPS | -| 7359 | UDP | ❌ | Client Discovery | +| Port | Protocol | Configurable | Description | +| ---- | -------- | ------------ | ---------------- | +| 8096 | TCP | ✔️ | Default HTTP | +| 8920 | TCP | ✔️ | Default HTTPS | +| 7359 | UDP | ❌ | Client Discovery |
See details - **HTTP Traffic** (8096/TCP): - The web frontend can be accessed here. You can modify this setting from the **Networking** page in the admin settings. + The web frontend can be accessed here. You can modify this setting from the **Networking** page in the admin settings. - **HTTPS Traffic** (8920/TCP): - Used when https is enabled. By default this port will not be used. - This setting can also be modified from the **Networking** page to use a different port. + Used when https is enabled. By default this port will not be used. + This setting can also be modified from the **Networking** page to use a different port. - **Client Discovery** (7359/UDP): - Allows clients to discover Jellyfin on the local network. A broadcast message to this port will return detailed information about your server that includes name, ip-address and ID. + Allows clients to discover Jellyfin on the local network. A broadcast message to this port will return detailed information about your server that includes name, ip-address and ID.
@@ -67,18 +67,18 @@ Opening a port directly to the Internet is therefore insecure and not recommende There are different layers where a firewall can be placed: -| Layer | Example | Description | -| --- | --- | --- | -| Local | Docker, VM | Open ports at this layer to allow traffic from the Host to enter the Application | -| Host | physical machine, operating system | Open ports at this layer to allow traffic from the Network to enter the Host device | -| Network | Router | Open ports at this layer to allow traffic from the Internet to enter the Local Network | +| Layer | Example | Description | +| ------- | ---------------------------------- | -------------------------------------------------------------------------------------- | +| Local | Docker, VM | Open ports at this layer to allow traffic from the Host to enter the Application | +| Host | physical machine, operating system | Open ports at this layer to allow traffic from the Network to enter the Host device | +| Network | Router | Open ports at this layer to allow traffic from the Internet to enter the Local Network |
Port forwarding vs. opening a Port Whilst Routers often allow you to forward a port, firewalls typically only allow you to open one. The difference is within the Target. Opening a Port essentially just means that traffic on this Port will go through. -Forwarding a Port you typically do in NAT scenarios - traffic is coming in on your public IP Address, what device inside your network should recieve it. +Forwarding a Port you typically do in NAT scenarios - traffic is coming in on your public IP Address, what device inside your network should receive it. Sometimes, port forwarding also lets you map an external port to a different internal port.
diff --git a/docs/general/post-install/transcoding/hardware-acceleration/amd.md b/docs/general/post-install/transcoding/hardware-acceleration/amd.md index b042d2d1..18a4a352 100644 --- a/docs/general/post-install/transcoding/hardware-acceleration/amd.md +++ b/docs/general/post-install/transcoding/hardware-acceleration/amd.md @@ -38,13 +38,11 @@ Hardware accelerated HDR/DV to SDR tone-mapping is supported on **all AMD GPUs t There are two different methods that can be used on Windows and/or Linux. Pros and cons are listed below: 1. **OpenCL** - - Pros - Supports Dolby Vision P5, detailed fine-tuning options, widely supported hardware. - Cons - Zero-copy is not supported on Linux. 2. **Vulkan** - - Pros - Supports Dolby Vision P5, libplacebo renderer, ROCm OpenCL runtime is not required. - Cons - Linux only, zero-copy only supports Polaris+ GPUs. @@ -113,7 +111,7 @@ Encoding speed and quality: ## Windows Setups -Windows 10 64-bit and newer is recommeded. **AMF is not available in Windows Docker and WSL/WSL2.** +Windows 10 64-bit and newer is recommended. **AMF is not available in Windows Docker and WSL/WSL2.** ### Known Issues And Limitations On Windows @@ -126,7 +124,6 @@ Please refer to [this section](./known-issues.md#amd-on-windows) for known issue 2. Clean install the latest driver from [AMD Drivers and Support](https://www.amd.com/en/support). 3. Don't allow the GPU to be preempted by the Windows Remote desktop session. - - Type `gpedit.msc` in Win+R shortcut key dialog and run to open the "Local Group Policy Editor". - Navigate in the left tree **[Computer Configuration > Administrative Templates > Windows Components]** @@ -154,7 +151,6 @@ Please refer to [this section](./known-issues.md#amd-on-windows) for known issue Duplicate engine names indicate the GPU may have multiple video engines. ::: - - **3D** - 2D/3D engine or GPGPU workload - **Copy** - Blitter/Copy engine workload @@ -311,7 +307,6 @@ Root permission is required. ``` 2. User mode Mesa drivers are required to be manually installed for VA-API and RADV Vulkan: - - [libva-mesa-driver](https://archlinux.org/packages/extra/x86_64/libva-mesa-driver/) - [vulkan-radeon](https://archlinux.org/packages/extra/x86_64/vulkan-radeon/) @@ -404,7 +399,6 @@ Root permission is required. ``` 2. Use Docker command line **or** docker compose: - - Example command line: ```shell @@ -486,7 +480,6 @@ Root permission is required. ::: 1. Install the `radeontop` package. The name varies between distros. - - On Debian & Ubuntu: ```shell diff --git a/docs/general/post-install/transcoding/hardware-acceleration/index.md b/docs/general/post-install/transcoding/hardware-acceleration/index.md index b9b59bb4..3a14f80c 100644 --- a/docs/general/post-install/transcoding/hardware-acceleration/index.md +++ b/docs/general/post-install/transcoding/hardware-acceleration/index.md @@ -99,13 +99,13 @@ lshw -C display See the table below to pick the best hardware acceleration method for your hardware: -| GPU Vendor | Windows | macOS | Linux | -| ---------- | ------------------------------------------ | -------------------------- | -------------------------------------- | +| GPU Vendor | Windows | macOS | Linux | +| ---------- | --------------------------------------------- | -------------------------- | ----------------------------------------- | | AMD | [AMF (Windows)](./amd.md#windows-setups) | [VideoToolbox](./apple.md) | [VAAPI (AMD)](./amd.md#linux-setups) | -| Apple | N/A | [VideoToolbox](./apple.md) | N/A | +| Apple | N/A | [VideoToolbox](./apple.md) | N/A | | Intel | [QSV (Windows)](./intel.md#windows-setups) | [VideoToolbox](./apple.md) | [QSV (Linux)](./intel.md#linux-setups) | | Nvidia | [NVENC (Windows)](./nvidia.md#windows-setups) | N/A | [NVENC (Linux)](./nvidia.md#linux-setups) | -| Rockchip | N/A | N/A | [RKMPP](./rockchip.md) | +| Rockchip | N/A | N/A | [RKMPP](./rockchip.md) | ## Remote Hardware Acceleration @@ -127,7 +127,7 @@ Dolby Vision (P5 & P8) to SDR tone-mapping is supported in Jellyfin 10.8 and req - Intel VPP HDR10 tone-mapping is supported on Intel QSV and VA-API on Linux. -- VPP is prefered if both tone-mapping options are enabled. +- VPP is preferred if both tone-mapping options are enabled. - Rockchip RKMPP does support Dolby Vision tone-mapping Jellyfin 10.11 and later versions. diff --git a/docs/general/post-install/transcoding/hardware-acceleration/intel.md b/docs/general/post-install/transcoding/hardware-acceleration/intel.md index a75db6ed..da2e3291 100644 --- a/docs/general/post-install/transcoding/hardware-acceleration/intel.md +++ b/docs/general/post-install/transcoding/hardware-acceleration/intel.md @@ -54,13 +54,11 @@ Hardware accelerated HDR/DV to SDR tone-mapping is supported on **all Intel GPUs There are two different methods that can be used on Windows and/or Linux. Pros and cons are listed below: 1. **OpenCL** - - Pros - Supports Dolby Vision P5, detailed fine-tuning options, widely supported hardware. - Cons - The OpenCL runtime sometimes need to be manually installed on Linux. 2. **QSV VPP** - - Pros - Lower power consumption, realized by Intel fixed-function LUT hardware. - Cons - Poor tuning options, limited supported GPU models, **currently only available on Linux**. @@ -205,7 +203,7 @@ You only need to follow the [Windows Setups](./intel.md#windows-setups) and [Lin ## Windows Setups -Windows 10 64-bit and newer is recommeded. **QSV is not available on Windows Docker and WSL/WSL2.** +Windows 10 64-bit and newer is recommended. **QSV is not available on Windows Docker and WSL/WSL2.** ### Known Issues And Limitations On Windows @@ -218,7 +216,6 @@ Please refer to [this section](/docs/general/post-install/transcoding/hardware-a 2. Clean install the latest EXE or INF driver from [Intel download center](https://www.intel.com/content/www/us/en/download-center/home.html). 3. Don't allow the GPU to be preempted by the Windows Remote desktop session. - - Type `gpedit.msc` in Win+R shortcut key dialog and run to open the "Local Group Policy Editor". - Navigate in the left tree **[Computer Configuration > Administrative Templates > Windows Components]** @@ -246,7 +243,6 @@ Please refer to [this section](/docs/general/post-install/transcoding/hardware-a Duplicate engine names indicate the GPU may have multiple MFX video engines. ::: - - **3D** - 2D/3D engine, QSV VPP or GPGPU workload - **Copy** - Blitter/Copy engine workload @@ -349,7 +345,6 @@ Root permission is required. 7. Check the supported QSV / VA-API codecs: :::note - - `iHD driver` indicates support for the QSV and VA-API interfaces. - `i965 driver` indicates only support for the VA-API interface, which should only be used on pre-Broadwell platforms. @@ -407,7 +402,6 @@ Root permission is required. ``` 2. User mode Intel media drivers and the OpenCL runtime are required to be manually installed for enabling QSV / VA-API: - - [intel-media-driver](https://archlinux.org/packages/extra/x86_64/intel-media-driver/) - [intel-media-sdk](https://archlinux.org/packages/extra/x86_64/intel-media-sdk/) @@ -496,7 +490,6 @@ What you need to do is pass the host's `render` group id to Docker and modify th ``` 2. Use docker command line **or** docker compose: - - Example command line: ```shell @@ -565,7 +558,7 @@ This follows the same principles as for the Docker, with one small change that y The devices in Kubernetes are added as host path mounts, they are not separated into separate volumes like in the Docker example. -1. Example Kubernetes (API version 1) configuraton file written in YAML: +1. Example Kubernetes (API version 1) configuration file written in YAML: ```yaml # Example of an incomplete deployment spec @@ -635,7 +628,7 @@ This has been tested with LXC 3.0 and may or may not work with older versions. lxc config device add gpu gpu gid= ``` -4. Make sure you have the requied devices within the container: +4. Make sure you have the required devices within the container: ```shell $ lxc exec jellyfin -- ls -l /dev/dri @@ -668,7 +661,6 @@ This has been tested with LXC 3.0 and may or may not work with older versions. **Proxmox VE 7 or Older**: :::note - - Jellyfin needs to run in a **privileged** LXC container. - An existing unprivileged container can be converted to a privileged container by taking a backup and restoring it as privileged. @@ -706,7 +698,6 @@ Root permission is required. ::: 1. Install the `intel-gpu-tools` package **on the host system**, which is used for debugging Intel graphics driver on Linux. The name varies between distros. - - On Debian & Ubuntu: ```shell @@ -728,7 +719,6 @@ Root permission is required. Duplicate engine names indicate the GPU may have multiple MFX video engines. ::: - - **Render/3D** - 2D/3D engine, QSV VPP or GPGPU workload - **Blitter** - Blitter/Copy engine workload @@ -816,7 +806,6 @@ Root permission is required. ::: 1. Install the latest linux firmware packages **on the host system**. The name varies between distros. - - On Debian: ```shell @@ -845,7 +834,6 @@ Root permission is required. ``` 2. Add the required i915 kernel parameter on the host system to enable loading GuC and HuC firmware: - - Check the kernel module in use, goto step 3 if **xe** kernel driver is in use. :::note @@ -879,7 +867,6 @@ Root permission is required. ``` 3. Update the initramfs and grub. The commands varies between distros. - - On Debian & Ubuntu: ```shell diff --git a/docs/general/post-install/transcoding/hardware-acceleration/known-issues.md b/docs/general/post-install/transcoding/hardware-acceleration/known-issues.md index 52cf35fa..e099412b 100644 --- a/docs/general/post-install/transcoding/hardware-acceleration/known-issues.md +++ b/docs/general/post-install/transcoding/hardware-acceleration/known-issues.md @@ -16,7 +16,6 @@ This page lists all known issues and limitations of hardware acceleration with J 1. Some Linux distros intentionally disabled the H.264 and HEVC codecs from the Mesa VA-API driver. Known affected distros: - - [Fedora](https://www.phoronix.com/news/Fedora-Disable-Bad-VA-API) - [OpenSUSE](https://www.webpronews.com/fedora-and-opensuse-disable-gpu-accelerated-video-over-patent-concerns/) @@ -40,11 +39,9 @@ This page lists all known issues and limitations of hardware acceleration with J ## Intel on Linux 1. Intel Gen 11 [**Jasper Lake**](https://ark.intel.com/content/www/us/en/ark/products/codename/128823/products-formerly-jasper-lake.html) and [**Elkhart Lake**](https://ark.intel.com/content/www/us/en/ark/products/codename/128825/products-formerly-elkhart-lake.html) platforms (e.g. N5095, N5105, N6005, J6412) have quirks when using video encoders on Linux. The [Low-Power Encoding](./intel.md#low-power-encoding) mode MUST be configured and enabled for correct VBR and CBR bitrate control that is required by Jellyfin. - - Ticket: [https://gitlab.freedesktop.org/drm/intel/-/issues/8080](https://gitlab.freedesktop.org/drm/intel/-/issues/8080) 2. The default kernel 5.15 that comes with Ubuntu 22.04 LTS has a regression on Intel Gen 11 graphics (ICL, JSL and EHL) that prevents you from using the Low-Power encoding mode. Linux 5.16+ is not affected. - - Ticket: [https://gitlab.freedesktop.org/drm/intel/-/issues/4067](https://gitlab.freedesktop.org/drm/intel/-/issues/4067) - Fixed by: [drm/i915/gen11: Moving WAs to icl_gt_workarounds_init()](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=52255ef662a5d490678fbad64a735f88fcba564d) @@ -58,7 +55,6 @@ This page lists all known issues and limitations of hardware acceleration with J This will move you off a 5.15 kernel which could have other implications. If it breaks something you can return to the normal kernel by installing the linux-generic package. 3. The kernel range from 5.18 to 6.1.3 have an issue that locks up and resets the i915 kernel driver when using OpenCL based HDR/DV tone-mapping. Linux 5.18-, 6.0.18+, 6.1.4+ are not affected. - - Ticket: [https://gitlab.freedesktop.org/drm/intel/-/issues/7627](https://gitlab.freedesktop.org/drm/intel/-/issues/7627) - Fixed by: [drm/i915: improve the catch-all evict to handle lock contention](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3f882f2d4f689627c1566c2c92087bc3ff734953) @@ -80,7 +76,6 @@ This page lists all known issues and limitations of hardware acceleration with J 11. The kernel support for Intel Gen 13 (or Gen 20?) LNL and BMG / ARC B-series are incomplete before Linux 6.12. 12. The LTS kernel range 6.6.26 - 6.6.32 and the stable kernel range 6.8.5 - 6.9.3 have i915 driver bugs, which may cause problems on Intel Gen 12.5 DG2 / ARC A-series GPUs. If you are affected, please upgrade to kernel 6.6.33+ (LTS) or 6.9.4+. Ubuntu 24.04 with kernel versions 6.8.0-38 thru 6.8.0-41 are also affected by this issue. Upgrade to Ubuntu kernel 6.8.0-44+ if you are on the affected kernels. - - Issue: [https://github.com/jellyfin/jellyfin/issues/11380](https://github.com/jellyfin/jellyfin/issues/11380) - Ubuntu bug: [https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2072755](https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2072755) @@ -88,7 +83,7 @@ This page lists all known issues and limitations of hardware acceleration with J 14. Resizable-BAR is mandatory for hardware acceleration on BMG / ARC B-series cards, or the [media driver will crash the transcoder](https://github.com/intel/media-driver/issues/1893). -15. Intel Compute-Runtime currently uses LLVM 14 for compilation [as seen on the Intel bug report page](https://github.com/intel/intel-graphics-compiler/issues/289), making it unavailable in some distibutions like Debian Trixie [as seen on the Debian bug report page](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1072376). Intel provided releases [on the Intel GitHub page](https://github.com/intel/compute-runtime/releases) which only require matching a matching libc runtime may be used instead. +15. Intel Compute-Runtime currently uses LLVM 14 for compilation [as seen on the Intel bug report page](https://github.com/intel/intel-graphics-compiler/issues/289), making it unavailable in some distributions like Debian Trixie [as seen on the Debian bug report page](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1072376). Intel provided releases [on the Intel GitHub page](https://github.com/intel/compute-runtime/releases) which only require matching a matching libc runtime may be used instead. ## Nvidia @@ -106,4 +101,4 @@ This page lists all known issues and limitations of hardware acceleration with J - [https://github.com/ollama/ollama/issues/6928#issuecomment-2586208913](https://github.com/ollama/ollama/issues/6928#issuecomment-2586208913) 3. Docker desktop isn't supported by Nvidia Container Toolkit. - [https://github.com/NVIDIA/nvidia-container-toolkit/issues/219#issuecomment-1903941381](https://github.com/NVIDIA/nvidia-container-toolkit/issues/219#issuecomment-1903941381) - If you need a GUI, use the docker package and podman, or similar. + If you need a GUI, use the docker package and podman, or similar. diff --git a/docs/general/post-install/transcoding/hardware-acceleration/nvidia.md b/docs/general/post-install/transcoding/hardware-acceleration/nvidia.md index 0c20b8c9..7012ab31 100644 --- a/docs/general/post-install/transcoding/hardware-acceleration/nvidia.md +++ b/docs/general/post-install/transcoding/hardware-acceleration/nvidia.md @@ -67,7 +67,7 @@ Maxwell+ GPUs provide support for HEVC: :::note -Note that in Maxwell 2nd Gen series only the GM206 variants provide HEVC 10-bit decoding support. Its sucessor Pascal has full support for HEVC 10-bit and improved speed and quality. +Note that in Maxwell 2nd Gen series only the GM206 variants provide HEVC 10-bit decoding support. Its successor Pascal has full support for HEVC 10-bit and improved speed and quality. ::: @@ -113,7 +113,7 @@ NVENC/NVDEC performance tables: ## Windows Setups -Windows 10 64-bit and newer is recommeded. **In Jellyfin 10.10 the minimum required NVIDIA driver version is 522.25**. +Windows 10 64-bit and newer is recommended. **In Jellyfin 10.10 the minimum required NVIDIA driver version is 522.25**. ### Configure On Windows Host @@ -136,7 +136,6 @@ Refer to [Configure On Linux Host](./nvidia.md#configure-on-linux-host) and [Con 2. Open the "Task Manager" and navigate to the GPU page. 3. Check the occupancy of the engines as follows. - - **3D** - 2D/3D engine or CUDA/GPGPU workload - **Copy** - Blitter/Copy engine workload @@ -176,7 +175,6 @@ Root permission is required. ``` 3. Install the NVIDIA proprietary driver by following these links. Then install two extra packages for NVENC and NVDEC support: - - On Debian: [https://wiki.debian.org/NvidiaGraphicsDrivers](https://wiki.debian.org/NvidiaGraphicsDrivers) ```shell @@ -237,7 +235,6 @@ Root permission is required. ``` 2. Install the NVIDIA proprietary driver by following the link. Then install an extra package for NVENC and NVDEC support: - - [https://wiki.archlinux.org/title/NVIDIA#Installation](https://wiki.archlinux.org/title/NVIDIA#Installation) ```shell @@ -310,11 +307,9 @@ Root permission is required. 1. Install the NVIDIA proprietary driver on the host system. See above instructions. 2. Install the NVIDIA Container Toolkit on the host system by following this link: - - [https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#installation-guide](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#installation-guide) 3. Use the Docker command line **or** docker-compose: - - Example command line: ```shell @@ -355,7 +350,7 @@ Root permission is required. :::note - If you encounter the upsteam issue `CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected`, pass these extra devices to the Docker: + If you encounter the upstream issue `CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected`, pass these extra devices to the Docker: ```shell /dev/nvidia-caps:/dev/nvidia-caps @@ -464,7 +459,7 @@ The paths of Jellyfin config and data folders in the official and LSIO Docker im --environment=JELLYFIN_CONFIG_DIR=/etc/jellyfin --environment=JELLYFIN_LOG_DIR=/var/log/jellyfin --environment=JELLYFIN_CACHE_DIR=/var/cache/jellyfin - --volume=/your/path/to/data:/var/lib/jellyfin # Replace paths with actual paths on your host's filestystem + --volume=/your/path/to/data:/var/lib/jellyfin # Replace paths with actual paths on your host's filesystem --volume=/your/path/to/config:/etc/jellyfin --volume=/your/path/to/logs:/var/log/jellyfin --volume=/your/path/to/cache:/var/cache/jellyfin @@ -477,7 +472,7 @@ The paths of Jellyfin config and data folders in the official and LSIO Docker im ```sh [Unit] Description=jellyfin - + [Container] Image=docker.io/jellyfin/jellyfin:latest AutoUpdate=registry @@ -489,7 +484,7 @@ The paths of Jellyfin config and data folders in the official and LSIO Docker im Environment=JELLYFIN_CONFIG_DIR=/etc/jellyfin Environment=JELLYFIN_LOG_DIR=/var/log/jellyfin Environment=JELLYFIN_CACHE_DIR=/var/cache/jellyfin - Volume=/your/path/to/data:/var/lib/jellyfin # Replace paths with actual paths on your host's filestystem + Volume=/your/path/to/data:/var/lib/jellyfin # Replace paths with actual paths on your host's filesystem Volume=/your/path/to/config:/etc/jellyfin Volume=/your/path/to/logs:/var/log/jellyfin Volume=/your/path/to/cache:/var/cache/jellyfin @@ -497,10 +492,10 @@ The paths of Jellyfin config and data folders in the official and LSIO Docker im [Service] # Inform systemd of additional exit status SuccessExitStatus=0 143 - + [Install] # Start by default on boot - WantedBy=default.target + WantedBy=default.target ``` 5. Create the following udev rule to make sure the GPU devices are initialized before the container is started. diff --git a/docs/general/post-install/transcoding/hardware-acceleration/rockchip.md b/docs/general/post-install/transcoding/hardware-acceleration/rockchip.md index cfaf9182..3d04f0aa 100644 --- a/docs/general/post-install/transcoding/hardware-acceleration/rockchip.md +++ b/docs/general/post-install/transcoding/hardware-acceleration/rockchip.md @@ -155,7 +155,6 @@ Root permission is required. Only needed before using HDR tone-mapping on RK3588/3588S. This is done to ensure that the user space firmware and kernel driver versions match, otherwise OpenCL will not work properly. ::: - - For the 6.1 LTS kernel on [Ubuntu-Rockchip](https://github.com/Joshua-Riek/ubuntu-rockchip) & [Armbian](https://github.com/armbian) and the legacy 5.10 LTS kernel, install [v1.9-1-2131373](https://github.com/tsukumijima/libmali-rockchip/releases/download/v1.9-1-2131373/libmali-valhall-g610-g24p0-gbm_1.9-1_arm64.deb). - For the 6.1 LTS kernel on other SBC **vendor-made** distros, install [v1.9-1-55611b0](https://github.com/tsukumijima/libmali-rockchip/releases/download/v1.9-1-55611b0/libmali-valhall-g610-g13p0-gbm_1.9-1_arm64.deb). @@ -193,7 +192,7 @@ Root permission is required. ::: -1. Use Docker command line: (the extensive device names between `for...done` is used to ensure backward compatiblity) +1. Use Docker command line: (the extensive device names between `for...done` is used to ensure backward compatibility) ```shell sudo docker run -d \ @@ -233,7 +232,7 @@ Root permission is required. #### LXC (Linux Containers) -This setup might be useful for those, who use RK3588/3588S SoC as [Proxmox](https://www.proxmox.com/en/) host, where LXC is the official and the only supported way of doing lightweight virtualiztion with the help of system containers (LXC) vs application containers (docker). As of today Proxmox team does not support ARM platforms as hosts - and probably will never do - however successful deployments on ARM devices [are possible](https://github.com/jiangcuo/Proxmox-Port?tab=readme-ov-file). +This setup might be useful for those, who use RK3588/3588S SoC as [Proxmox](https://www.proxmox.com/en/) host, where LXC is the official and the only supported way of doing lightweight virtualization with the help of system containers (LXC) vs application containers (docker). As of today Proxmox team does not support ARM platforms as hosts - and probably will never do - however successful deployments on ARM devices [are possible](https://github.com/jiangcuo/Proxmox-Port?tab=readme-ov-file). LXC setup idea is a bit similar to docker - you need to pass the **device files** of VPU from host to LXC and enable the **privileged mode** (see also important "_note_" below about privileged LXC containers). @@ -251,7 +250,7 @@ LXC setup idea is a bit similar to docker - you need to pass the **device files* device /dev/mpp_service ``` - Example of the minumum requried extra (not full) container configuration to make VPU hardware accelearion working is presented below: + Example of the minimum required extra (not full) container configuration to make VPU hardware acceleration working is presented below: ```shell lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir @@ -273,7 +272,6 @@ LXC setup idea is a bit similar to docker - you need to pass the **device files* 2. Install supported [jellyfin package](https://jellyfin.org/docs/general/installation/linux) into LXC container or optionally you can even use an official docker image inside LXC container. 3. Verify OpenCL runtime status as following - example is collected from LXC runtime of Ubuntu Jammy - steps are the same as docker deployments: - - _libmali user-space drivers should be installed inside LXC container, otherwise opencl=ocl@rk device won't be initialized_ ```shell diff --git a/docs/general/server/media/_metadata-images.md b/docs/general/server/media/_metadata-images.md index 855a0d59..e98b6ef3 100644 --- a/docs/general/server/media/_metadata-images.md +++ b/docs/general/server/media/_metadata-images.md @@ -61,33 +61,33 @@ Image types: 1Multiple backdrop images can be used to cycle through several over time. Simply append a number to the end of the filename directly after or after a hyphen, e.g. `backdrop-1.jpg`, `backdrop2.jpg`. -2These can be added to both video and audio content, but are not used by any client for audio conent. +2These can be added to both video and audio content, but are not used by any client for audio content.
Filenames, their respective types and supported media types Unless otherwise noted, all filenames can be used either standalone (e.g. `logo.png`) or as a suffix (e.g. `movie-logo.png`) -| Filename | Type | Movies | Series | Season | Episode | Music | Artist | -| ------------------------ | --------- | --------------- | ------ | ------ | ------- | ----- | ------ | -| poster | Primary | ✅ 2 | ✅ | ✅ | | ✅ | | -| folder | Primary | ✅ 2 | ✅ | ✅ | | ✅ | ✅ | -| cover | Primary | ✅ 2 | ✅ | ✅ | | ✅ | | -| default | Primary | ✅ 2 | ✅ | ✅ | | ✅ | | -| movie | Primary | ✅ 2 | | | | | | -| show | Primary | | ✅ | | | | | -| jacket | Primary | | | | | ✅ | | -| thumb (suffix) 1 | Primary | | | | ✅ | | | -| backdrop | Backdrop | ✅ 2 | ✅ | ✅ | | ✅ | | -| fanart | Backdrop | ✅ 2 | ✅ | ✅ | | ✅ | | -| background | Backdrop | ✅ 2 | ✅ | ✅ | | ✅ | | -| art | Backdrop | ✅ 2 | ✅ | ✅ | | ✅ | | -| extrafanart (folder) | Backdrop | ✅ 2 | ✅ | ✅ | | ✅ | | -| banner | Banner | ✅ | ✅ | ✅ | | ✅ | | -| logo | Logo | ✅ 2 | ✅ | ✅ | | ✅ | | -| clearlogo | Logo | ✅ 2 | ✅ | ✅ | | ✅ | | -| landscape | Thumb | ✅ | ✅ | ✅ | | ✅ | | -| thumb | Thumb | ✅ | ✅ | ✅ | | ✅ | | +| Filename | Type | Movies | Series | Season | Episode | Music | Artist | +| --------------------------- | -------- | --------------- | ------ | ------ | ------- | ----- | ------ | +| poster | Primary | ✅ 2 | ✅ | ✅ | | ✅ | | +| folder | Primary | ✅ 2 | ✅ | ✅ | | ✅ | ✅ | +| cover | Primary | ✅ 2 | ✅ | ✅ | | ✅ | | +| default | Primary | ✅ 2 | ✅ | ✅ | | ✅ | | +| movie | Primary | ✅ 2 | | | | | | +| show | Primary | | ✅ | | | | | +| jacket | Primary | | | | | ✅ | | +| thumb (suffix) 1 | Primary | | | | ✅ | | | +| backdrop | Backdrop | ✅ 2 | ✅ | ✅ | | ✅ | | +| fanart | Backdrop | ✅ 2 | ✅ | ✅ | | ✅ | | +| background | Backdrop | ✅ 2 | ✅ | ✅ | | ✅ | | +| art | Backdrop | ✅ 2 | ✅ | ✅ | | ✅ | | +| extrafanart (folder) | Backdrop | ✅ 2 | ✅ | ✅ | | ✅ | | +| banner | Banner | ✅ | ✅ | ✅ | | ✅ | | +| logo | Logo | ✅ 2 | ✅ | ✅ | | ✅ | | +| clearlogo | Logo | ✅ 2 | ✅ | ✅ | | ✅ | | +| landscape | Thumb | ✅ | ✅ | ✅ | | ✅ | | +| thumb | Thumb | ✅ | ✅ | ✅ | | ✅ | | 1 For example: `S01E01 Some Episode-thumb.jpg`
2 These file names can also be embedded in supported media containers (e.g. mkv) and will be used when the `Embedded Image Extractor` source is enabled for movies. diff --git a/docs/general/server/metadata/index.md b/docs/general/server/metadata/index.md index 71ee4c7c..9c78cd6a 100644 --- a/docs/general/server/metadata/index.md +++ b/docs/general/server/metadata/index.md @@ -17,10 +17,10 @@ There are more official providers available in our [Plugin Catalog](/docs/genera :::caution Notice for Users in Mainland China 中国大陆地区用户请注意 -Because of external factors, certain metadata providers may not be accessable in mainland China.
+Because of external factors, certain metadata providers may not be accessible in mainland China.
由于外部因素,部分元数据提供者在中国大陆地区可能无法访问。 -Below is a list of known inaccessable providers:
+Below is a list of known inaccessible providers:
下方为已知无法访问的提供者: - The Movie Database (TMDb) diff --git a/docs/general/server/metadata/nfo.md b/docs/general/server/metadata/nfo.md index 155e20ed..430d90d1 100644 --- a/docs/general/server/metadata/nfo.md +++ b/docs/general/server/metadata/nfo.md @@ -37,54 +37,54 @@ It's currently not possible to disable .nfo metadata. Local metadata will always User data importing is only possible for a single user. This user can be set in the .nfo settings. ::: -| Tag | Note | -| ------------- | --------------------------------------------------------------------------------------------------------------------- | -| name | | -| title | same as name | -| localtitle | same as name | -| dateadded | | -| originaltitle | | -| sortname | | -| criticrating | | -| sorttitle | | -| plot | | -| biography | same as plot | -| review | same as plot | -| language | | -| watched | please see the note about user data | -| playcount | please see the note about user data | -| lastplayed | please see the note about user data | -| countrycode | | -| lockedfields | | -| tagline | | -| country | | -| mpaa | | -| customrating | | -| runtime | | -| aspectratio | | -| lockdata | | -| studio | multiple tags allowed | -| director | multiple tags allowed | -| credits | multiple tags allowed | -| writer | multiple tags allowed | -| actor | multiple tags allowed | -| trailer | kodi format | -| displayorder | | -| year | | -| rating | same as customrating | -| ratings | multiple child tags allowed; name attribute of each tag will specify wheter the rating is critics or community rating | -| aired | | -| formed | | -| premiered | | -| releasedate | | -| enddate | | -| genre | multiple tags allowed. These tags will be ignored for music albums and music artists. | -| tag | multiple tags allowed | -| style | multiple tags allowed | -| fileinfo | | -| uniqueid | type attribute specifies id provider | -| thumb | please see the [section about images](#image-paths-and-urls-in-nfo-files) | -| fanart | please see the [section about images](#image-paths-and-urls-in-nfo-files) | +| Tag | Note | +| ------------- | ---------------------------------------------------------------------------------------------------------------------- | +| name | | +| title | same as name | +| localtitle | same as name | +| dateadded | | +| originaltitle | | +| sortname | | +| criticrating | | +| sorttitle | | +| plot | | +| biography | same as plot | +| review | same as plot | +| language | | +| watched | please see the note about user data | +| playcount | please see the note about user data | +| lastplayed | please see the note about user data | +| countrycode | | +| lockedfields | | +| tagline | | +| country | | +| mpaa | | +| customrating | | +| runtime | | +| aspectratio | | +| lockdata | | +| studio | multiple tags allowed | +| director | multiple tags allowed | +| credits | multiple tags allowed | +| writer | multiple tags allowed | +| actor | multiple tags allowed | +| trailer | kodi format | +| displayorder | | +| year | | +| rating | same as customrating | +| ratings | multiple child tags allowed; name attribute of each tag will specify whether the rating is critics or community rating | +| aired | | +| formed | | +| premiered | | +| releasedate | | +| enddate | | +| genre | multiple tags allowed. These tags will be ignored for music albums and music artists. | +| tag | multiple tags allowed | +| style | multiple tags allowed | +| fileinfo | | +| uniqueid | type attribute specifies id provider | +| thumb | please see the [section about images](#image-paths-and-urls-in-nfo-files) | +| fanart | please see the [section about images](#image-paths-and-urls-in-nfo-files) | Provider id tags are supported as well if they follow the scheme: ``. @@ -99,7 +99,7 @@ Jellyfin can write metadata to .nfo files. To enable this option, select the "Nf | .nfo tag | Note | | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | | title | | -| id | IMDb id for movies, TVDb id for tv shows, | +| id | IMDb id for movies, TVDb id for tv shows, | | originaltitle | | | seasonnumber | only for tv show seasons | | showtitle | only for tv show episodes | diff --git a/docs/general/server/plugins/tvheadend.md b/docs/general/server/plugins/tvheadend.md index 7acd8e81..dc681c88 100644 --- a/docs/general/server/plugins/tvheadend.md +++ b/docs/general/server/plugins/tvheadend.md @@ -25,7 +25,7 @@ The objective of the guide is to configure the Jellyfin TVHeadend plugin to back - Change parameters: Rights,Channel number range,Channel tags,DVR configurations,Streaming profiles,Connection limits - Web interface: ✔ - Streaming: Basic,Advanced,HTSP - - Video recoder: Basic,HTSP,View all + - Video recorder: Basic,HTSP,View all - (Optional) Comment: Comment for the user (for example: User used by Jellyfin) - (Optional) Allowed networks: _Network address with network mask to allow_ (for example 127.0.0.1/32) - Press Save @@ -38,7 +38,7 @@ The objective of the guide is to configure the Jellyfin TVHeadend plugin to back :::note -The parameters Change parameters, Streaming and Video recoder must be marked as shown. Otherwise, Jellyfin can connect to TVHeadend but problems may arise when reproducing the content. +The parameters Change parameters, Streaming and Video recorder must be marked as shown. Otherwise, Jellyfin can connect to TVHeadend but problems may arise when reproducing the content. ::: @@ -56,7 +56,6 @@ By default the the _TVHeadend Hostname or IP Address_ section is configured by d ::: 3. Configure the channels for viewing in Jellyfin: even if Jellyfin manages to connect to TVHeadend, the guide will not be synchronized because there has to be a number assigned to the channels in TVHeadend. [Reference](https://emby.media/community/index.php?/topic/64583-no-channels-with-tvheadend-plugin/#entry642268) - - Manual mode - Go to Configuration > Channel/EPG > Channels - Select the channel to be changed and press Edit diff --git a/docs/general/server/tasks.md b/docs/general/server/tasks.md index dd12733a..bbdca368 100644 --- a/docs/general/server/tasks.md +++ b/docs/general/server/tasks.md @@ -11,7 +11,7 @@ Note: If your media files are unavailable when the `Clean up collections and pla ## Default Jellyfin Tasks -Below is a list of tasks that Jellyfin runs peoridically by default: +Below is a list of tasks that Jellyfin runs periodically by default: ### Libraries diff --git a/docs/project/branding.md b/docs/project/branding.md index 304f18f0..6413a5c7 100644 --- a/docs/project/branding.md +++ b/docs/project/branding.md @@ -37,7 +37,7 @@ As a general rule, "Jellyfin" should always be capitalized, but language, file, - C# class and project names, including their files and directories, should use capitalized `Jellyfin` as required by the C# case standards (camelCase or PascalCase). `Jellyfin.LiveTv`, `Jellyfin.sln` - Other code elements, where the code formatting or style requires lowercase, should use lowercase `jellyfin`. `jellyfinWebComponentsBowerPath` - The Git repository and non-C# files inside of it should use lowercase `jellyfin` for convenience on case-sensitive filesystems. `build-jellyfin.ps1` -- The final output binary, initscrips, and package names should use lowercase `jellyfin` for similar reasons as above. `jellyfin.dll`, `jellyfin_3.5.2-1_all.deb`, `jellyfin.zip` +- The final output binary, initscripts, and package names should use lowercase `jellyfin` for similar reasons as above. `jellyfin.dll`, `jellyfin_3.5.2-1_all.deb`, `jellyfin.zip` - Configuration directories can use either depending on operating system conventions. `/var/lib/jellyfin`, `AppData/Jellyfin` - The logo has no strict rules for capitalization, the style is dependent on aesthetics and font choice. From 28549c24b3877308a5793bb8e9be2a0a1778eb69 Mon Sep 17 00:00:00 2001 From: Hammy Havoc Date: Sat, 17 Jan 2026 23:49:41 +0000 Subject: [PATCH 172/190] Update docs/general/administration/storage.md Co-authored-by: BotBlake --- docs/general/administration/storage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/general/administration/storage.md b/docs/general/administration/storage.md index bd052e66..ece02cfc 100644 --- a/docs/general/administration/storage.md +++ b/docs/general/administration/storage.md @@ -20,7 +20,7 @@ To solve this, you have the following options: A database for a moderate-sized library can grow anywhere from 10 to 100 GB. -The [transcoding](/docs/general/post-install/transcoding) folder needs roughly the same size as the original media when transcoded at the same bitrate. A single 50 GB Blu-Ray remux by itself can take up to ~60 GB or as little as ~15 GB. If the transcoding folder is held on the same storage as the database, this must be taken into consideration to prevent running out of storage and thus corrupting your database. +The [transcoding](/docs/general/post-install/transcoding) folder typically requires about the same amount of space as the original media when transcoded at an equivalent bitrate. For example, a single 50 GB Blu-ray remux might consume as much as ~60 GB or as little as ~15 GB after transcoding. If the transcoding folder shares the same storage as the database, this should be accounted for to avoid any problems. ## Cloud Storage Providers From 72cd56c7980ed72348b986927063b16d6acb2464 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 19 Jan 2026 17:25:07 +0000 Subject: [PATCH 173/190] Update dependency typescript-eslint to v8.53.0 --- package-lock.json | 124 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 63 insertions(+), 63 deletions(-) diff --git a/package-lock.json b/package-lock.json index f897ce4b..f4589635 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,7 +56,7 @@ "node-fetch": "3.3.2", "prettier": "3.7.4", "typescript": "5.9.3", - "typescript-eslint": "8.52.0", + "typescript-eslint": "8.53.0", "typescript-plugin-css-modules": "5.2.0" }, "engines": { @@ -6105,17 +6105,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.52.0.tgz", - "integrity": "sha512-okqtOgqu2qmZJ5iN4TWlgfF171dZmx2FzdOv2K/ixL2LZWDStL8+JgQerI2sa8eAEfoydG9+0V96m7V+P8yE1Q==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.0.tgz", + "integrity": "sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.52.0", - "@typescript-eslint/type-utils": "8.52.0", - "@typescript-eslint/utils": "8.52.0", - "@typescript-eslint/visitor-keys": "8.52.0", + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/type-utils": "8.53.0", + "@typescript-eslint/utils": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" @@ -6128,7 +6128,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.52.0", + "@typescript-eslint/parser": "^8.53.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -6144,17 +6144,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.52.0.tgz", - "integrity": "sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.53.0.tgz", + "integrity": "sha512-npiaib8XzbjtzS2N4HlqPvlpxpmZ14FjSJrteZpPxGUaYPlvhzlzUZ4mZyABo0EFrOWnvyd0Xxroq//hKhtAWg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.52.0", - "@typescript-eslint/types": "8.52.0", - "@typescript-eslint/typescript-estree": "8.52.0", - "@typescript-eslint/visitor-keys": "8.52.0", + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", "debug": "^4.4.3" }, "engines": { @@ -6170,14 +6170,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.52.0.tgz", - "integrity": "sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.0.tgz", + "integrity": "sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.52.0", - "@typescript-eslint/types": "^8.52.0", + "@typescript-eslint/tsconfig-utils": "^8.53.0", + "@typescript-eslint/types": "^8.53.0", "debug": "^4.4.3" }, "engines": { @@ -6192,14 +6192,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.52.0.tgz", - "integrity": "sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.0.tgz", + "integrity": "sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.52.0", - "@typescript-eslint/visitor-keys": "8.52.0" + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6210,9 +6210,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.52.0.tgz", - "integrity": "sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.0.tgz", + "integrity": "sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA==", "dev": true, "license": "MIT", "engines": { @@ -6227,15 +6227,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.52.0.tgz", - "integrity": "sha512-JD3wKBRWglYRQkAtsyGz1AewDu3mTc7NtRjR/ceTyGoPqmdS5oCdx/oZMWD5Zuqmo6/MpsYs0wp6axNt88/2EQ==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.0.tgz", + "integrity": "sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.52.0", - "@typescript-eslint/typescript-estree": "8.52.0", - "@typescript-eslint/utils": "8.52.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0", + "@typescript-eslint/utils": "8.53.0", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, @@ -6252,9 +6252,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.52.0.tgz", - "integrity": "sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.0.tgz", + "integrity": "sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==", "dev": true, "license": "MIT", "engines": { @@ -6266,16 +6266,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.52.0.tgz", - "integrity": "sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.0.tgz", + "integrity": "sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.52.0", - "@typescript-eslint/tsconfig-utils": "8.52.0", - "@typescript-eslint/types": "8.52.0", - "@typescript-eslint/visitor-keys": "8.52.0", + "@typescript-eslint/project-service": "8.53.0", + "@typescript-eslint/tsconfig-utils": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", "debug": "^4.4.3", "minimatch": "^9.0.5", "semver": "^7.7.3", @@ -6320,16 +6320,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.52.0.tgz", - "integrity": "sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.0.tgz", + "integrity": "sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.52.0", - "@typescript-eslint/types": "8.52.0", - "@typescript-eslint/typescript-estree": "8.52.0" + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6344,13 +6344,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.52.0.tgz", - "integrity": "sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.0.tgz", + "integrity": "sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/types": "8.53.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -22311,16 +22311,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.52.0.tgz", - "integrity": "sha512-atlQQJ2YkO4pfTVQmQ+wvYQwexPDOIgo+RaVcD7gHgzy/IQA+XTyuxNM9M9TVXvttkF7koBHmcwisKdOAf2EcA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.53.0.tgz", + "integrity": "sha512-xHURCQNxZ1dsWn0sdOaOfCSQG0HKeqSj9OexIxrz6ypU6wHYOdX2I3D2b8s8wFSsSOYJb+6q283cLiLlkEsBYw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.52.0", - "@typescript-eslint/parser": "8.52.0", - "@typescript-eslint/typescript-estree": "8.52.0", - "@typescript-eslint/utils": "8.52.0" + "@typescript-eslint/eslint-plugin": "8.53.0", + "@typescript-eslint/parser": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0", + "@typescript-eslint/utils": "8.53.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" diff --git a/package.json b/package.json index f033c562..f5274fa7 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "node-fetch": "3.3.2", "prettier": "3.7.4", "typescript": "5.9.3", - "typescript-eslint": "8.52.0", + "typescript-eslint": "8.53.0", "typescript-plugin-css-modules": "5.2.0" } } From c217916ec44502bd127305303f0477f770981e3a Mon Sep 17 00:00:00 2001 From: "Joshua M. Boniface" Date: Mon, 19 Jan 2026 17:30:47 -0500 Subject: [PATCH 174/190] Add LLM/"AI" policy document (#1729) * Add LLM/"AI" policy document * Call out LLM metafiles * Fix linting issue --- docs/general/contributing/llm-policies.md | 49 +++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 docs/general/contributing/llm-policies.md diff --git a/docs/general/contributing/llm-policies.md b/docs/general/contributing/llm-policies.md new file mode 100644 index 00000000..bf813b84 --- /dev/null +++ b/docs/general/contributing/llm-policies.md @@ -0,0 +1,49 @@ +--- +uid: llm-policies +title: LLM/"AI" Policies +--- + +# Jellyfin LLM/"AI" Development Policy + +The rise of LLMs as a useful development tool over the last year or so has been significant. The power and flexibility of tools like Claude Code and ChatGPT have given a lot of functionality both to experienced developers and new developers alike. But there are trade-offs. + +The Jellyfin project has, from day one, had a major focus on code quality - readability, simplicity, conciseness. This is a mostly manual effort driven by a dedicated team of individuals, and is motivated by a desire to fix the code Jellyfin is based off of which, without beating a dead horse too much, was extremely fragile, spaghettified, and prone to over-engineered complexity. + +We are seeing a precipitous rise in contributors using AI within the Jellyfin ecosystem, both in the server and for clients, as well as a rise in criticism and concern about LLMs generally. At this time we are writing this policy to address exactly what we expect and desire with respect to contributions and interactions within our community that may use LLMs. These rules apply to all of our official projects and community spaces. + +## General Guidelines + +1. LLM output is **expressly prohibited** for any direct communication, including the following: + * issues or comments + * feature requests or comments + * pull request bodies or comments + * forum/chat/etc. posts or comments + + In short, if you are posting **any** of those things, the output must be your own words, explanation, description, etc., not a verbatim dump of an LLM's output. We expect you to understand what you're posting. Violating this rule will result in closure/deletion of the offending item(s). + + An exception will be made for **LLM-assisted translations** if you are having trouble accurately conveying your intent in English. Please explicitly note this ("I have translated this from MyLanguage with an LLM") and, if possible, post in your original language as well. + +2. LLM code contributions are subject to more granularity below, but the general principle is that "pure 'vibe coding' will be rejected" and "you are responsible for what you commit". We will review in that vein. If the **code looks terrible**, it will be **rejected as such**. + +## LLM Code Contributions to Official Projects + +The use of LLMs for code is controversial and open to much interpretation. These guidelines are our best effort attempt to ensure that knowledgeable developers who seek to use these tools as a legitimate aid are not overly-hindered, while also preventing an ongoing flood of slop contributions that violate our core ethos above. These apply to **all official Jellyfin projects**. + +1. Contributions should be **concise and focused**. If the PR claims to target X, and is also touching unrelated Y and Z, it will be rejected. This includes incidental changes to unrelated functionality, a hallmark of poorly-worded or too-general prompts. Similarly, a large PR must be **broken into multiple small, manageable commits** for review and history purposes. +2. Formatting and quality **standards must be upheld**. Excessive unhelpful comments, spaghetti code, spaces on empty lines, etc. will be interpreted as pure LLM output and rejected; you must **clean up the mess** before submitting. Also **do not commit LLM metafiles** (e.g. `.claude` configs) or any other editor-created non-code files. +3. You must **review the output** and be able to **explain** in the PR body - **without** LLM output as noted above - **what is being changed and why**. Your PR body (and, if applicable, commit bodies) should be providing context to other developers about why a change was made, and if your name is on it, we want **your** words and explanations, not an LLM's. If **you can't explain** what the LLM did, we are **not interested** in the change. +4. The changes must be **tested**. The code should build and run correctly, or it will be rejected. You should also **explicitly test the functionality being modified**. +5. You must be able and willing to **handle review feedback** and implement the suggested change(s) as required. What this means in practice is, if you do not know what has been changed or why (see #3), and thus can't implement suggested changes or discuss them **yourself**, then we are **not interested** in the change. Just dumping reviewer feedback into an LLM and expecting what comes out to be "good enough", is not. +6. **Features or refactors** require **an in-depth level of understanding** about what is being changed and why. It is obvious to our reviewers when changes are made without the developer making them understanding what is happening. These will be rejected. And as noted in #1, the PR must **contain multiple discrete commits**. _We_ will squash commits as deemed appropriate after review. Large changes must also follow our other development policies (discussion, review, implementation, testing process). +7. The **final discretion always lies with the reviewers**. If your PR is not capable of being reasonably reviewed, for any reason (over-complexity, size, squashed commits, etc.) it will be rejected, and this goes just as much for non-LLM-assisted PRs as it does for LLM-assisted PRs. You will be asked to split such a PR up into multiple PRs that each present a focused, concise set of changes instead. + +The golden rule is this: **do not just let an LLM lose on the codebase with a vague vibe prompt and then commit the results as-is**. This is lazy development, will **always** result in a **poor-quality contribution** from our perspective, and we are not at all interested in such slop. **Make an effort** or please do not bother. And again, you are free to use LLMs to **assist** you, but not as the sole source of code changes. + +## LLM-generated Tools, Clients, etc. Shared in the Community + +You are of course free to do whatever you wish for your own non-official projects. However, we will be enforcing the following rules for any **sharing of such projects within our communities**. + +1. Any primarily-LLM-developed projects should be **clearly marked as such**. It is up to users to decide if this is acceptable to them or not. If you used an LLM for secondary assistance (e.g. docs, formatting, etc.) in an obvious way, we would err towards disclosure as well. +2. You **must** respect and follow licenses. If you are basing your project off of existing code, **following its license is not optional**. You must **credit existing contributors in full** for **all contributions**. Do not **mangle the Git history**, and do not **commit pending 3rd party changes as your own** (i.e. by copying the code and then committing it). Doing so will result in, not just rejection, but a ban from our organization and community. We have a **zero tolerance policy** for code theft and bad-faith attribution attempts. +3. For members of the community, **do not report** LLM-generated tools, clients, etc. **on that basis alone**, and do not engage in anti-LLM "witch hunts". As mentioned above, this is **permitted** and it is your choice whether to "support" said tool/client/etc. or not. +4. We, the moderators, are not going to play "LLM police" about 3rd party projects by nitpicking to try to "find LLM contributions" that otherwise follow our rules here; this is tedious and a waste of our time and effort. What this means in practice is that rule #1 is up to the author, and rule #3 must be interpreted in that vein. If you **only suspect** a tool is LLM-generated and violates rule #1, then downvote/ignore it and move on. **Only if** we see **blatant breaking of rule #1** we will enforce it, but again we will not be going through code line by line playing the "was this LLM generated?" game. Rule #2 will always be enforced regardless of LLM-ness or not. From 927aa14992d17f23cff6f230438f8eea0734b7ba Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 20 Jan 2026 10:49:27 +0000 Subject: [PATCH 175/190] Update dependency ua-parser-js to v2.0.8 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index f4589635..b3e5f5c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "react-dom": "18.3.1", "sass": "1.97.2", "swiper": "12.0.3", - "ua-parser-js": "2.0.7", + "ua-parser-js": "2.0.8", "url-loader": "4.1.1" }, "devDependencies": { @@ -22400,9 +22400,9 @@ "license": "MIT" }, "node_modules/ua-parser-js": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-2.0.7.tgz", - "integrity": "sha512-CFdHVHr+6YfbktNZegH3qbYvYgC7nRNEUm2tk7nSFXSODUu4tDBpaFpP1jdXBUOKKwapVlWRfTtS8bCPzsQ47w==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-2.0.8.tgz", + "integrity": "sha512-BdnBM5waFormdrOFBU+cA90R689V0tWUWlIG2i30UXxElHjuCu5+dOV2Etw3547jcQ/yaLtPm9wrqIuOY2bSJg==", "funding": [ { "type": "opencollective", diff --git a/package.json b/package.json index f5274fa7..65642bf7 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "react-dom": "18.3.1", "sass": "1.97.2", "swiper": "12.0.3", - "ua-parser-js": "2.0.7", + "ua-parser-js": "2.0.8", "url-loader": "4.1.1" }, "browserslist": { From 6b63925327e4073c6a26b5d542fe84254f252bd7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 20 Jan 2026 18:55:36 +0000 Subject: [PATCH 176/190] Update dependency eslint-plugin-n to v17.23.2 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index b3e5f5c0..e60cc6de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,7 +46,7 @@ "eslint-config-prettier": "10.1.8", "eslint-plugin-import": "2.32.0", "eslint-plugin-jsx-a11y": "6.10.2", - "eslint-plugin-n": "17.23.1", + "eslint-plugin-n": "17.23.2", "eslint-plugin-prettier": "5.5.4", "eslint-plugin-promise": "7.2.1", "eslint-plugin-react": "7.37.5", @@ -10372,9 +10372,9 @@ } }, "node_modules/eslint-plugin-n": { - "version": "17.23.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.1.tgz", - "integrity": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==", + "version": "17.23.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.2.tgz", + "integrity": "sha512-RhWBeb7YVPmNa2eggvJooiuehdL76/bbfj/OJewyoGT80qn5PXdz8zMOTO6YHOsI7byPt7+Ighh/i/4a5/v7hw==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 65642bf7..6878bfa1 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "eslint-config-prettier": "10.1.8", "eslint-plugin-import": "2.32.0", "eslint-plugin-jsx-a11y": "6.10.2", - "eslint-plugin-n": "17.23.1", + "eslint-plugin-n": "17.23.2", "eslint-plugin-prettier": "5.5.4", "eslint-plugin-promise": "7.2.1", "eslint-plugin-react": "7.37.5", From 12f04b497ca7501dba353305ef8c2f1a20cc501f Mon Sep 17 00:00:00 2001 From: Niels van Velzen Date: Wed, 21 Jan 2026 15:04:39 +0100 Subject: [PATCH 177/190] Fix typo in redirect for external audio tracks --- redirects.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/redirects.ts b/redirects.ts index abab28d1..1f438cce 100644 --- a/redirects.ts +++ b/redirects.ts @@ -13,7 +13,7 @@ const redirects: ClientRedirects.Options['redirects'] = [ '/docs/general/server/media/subtitles.html', '/docs/general/server/media/external-files' ], - to: '/docs/general/server/media/movies#external-subtitles-and-audio-racks' + to: '/docs/general/server/media/movies#external-subtitles-and-audio-tracks' }, // Storage docs moved from the server guide to administrative docs { From f0252225e7d466aa7b35161052289b29cc1dd0dc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 21 Jan 2026 14:15:55 +0000 Subject: [PATCH 178/190] Update dependency eslint-plugin-prettier to v5.5.5 --- package-lock.json | 24 ++++++++++++------------ package.json | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index e60cc6de..9871e3b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ "eslint-plugin-import": "2.32.0", "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-n": "17.23.2", - "eslint-plugin-prettier": "5.5.4", + "eslint-plugin-prettier": "5.5.5", "eslint-plugin-promise": "7.2.1", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "7.0.1", @@ -10412,14 +10412,14 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", - "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz", + "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==", "dev": true, "license": "MIT", "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.11.7" + "prettier-linter-helpers": "^1.0.1", + "synckit": "^0.11.12" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -19294,9 +19294,9 @@ } }, "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", "dev": true, "license": "MIT", "dependencies": { @@ -21779,9 +21779,9 @@ } }, "node_modules/synckit": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", - "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 6878bfa1..5917264b 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "eslint-plugin-import": "2.32.0", "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-n": "17.23.2", - "eslint-plugin-prettier": "5.5.4", + "eslint-plugin-prettier": "5.5.5", "eslint-plugin-promise": "7.2.1", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "7.0.1", From e49922140d68d4cd31c150df49d1836c67a09ef2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 22 Jan 2026 03:00:56 +0000 Subject: [PATCH 179/190] Update dependency prettier to v3.8.0 --- package-lock.json | 58 +++++++++++++++++++++++++++++++++++++++-------- package.json | 2 +- 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 463d1b0d..6a18d33a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,7 +55,7 @@ "globals": "17.0.0", "markdownlint-cli": "0.47.0", "node-fetch": "3.3.2", - "prettier": "3.7.4", + "prettier": "3.8.0", "typescript": "5.9.3", "typescript-eslint": "8.53.0", "typescript-plugin-css-modules": "5.2.0" @@ -122,6 +122,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -1972,6 +1973,7 @@ "integrity": "sha512-JTqrD47tV+rWc1y2W8T0NTfWLQMlSWX4OF64/Jf3WbsOD+4UXVIfjRlzPry7+1Zekm6pa38+23jkDBytYpu8yw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=20" } @@ -2040,7 +2042,8 @@ "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.19.tgz", "integrity": "sha512-VYHtPnZt/Zd/ATbW3rtexWpBnHUohUrQOHff/2JBhsVgxOrksAxJnLAO43Q1ayLJBJUUwNVo+RU0sx0aaysZfg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@cspell/dict-dart": { "version": "2.3.2", @@ -2180,14 +2183,16 @@ "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.14.tgz", "integrity": "sha512-2bf7n+kS92g+cMKV0wr9o/Oq9n8JzU7CcrB96gIh2GHgnF+0xDOqO2W/1KeFAqOfqosoOVE48t+4dnEMkkoJ2Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@cspell/dict-html-symbol-entities": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.5.tgz", "integrity": "sha512-429alTD4cE0FIwpMucvSN35Ld87HCyuM8mF731KU5Rm4Je2SG6hmVx7nkBsLyrmH3sQukTcr1GaiZsiEg8svPA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@cspell/dict-java": { "version": "5.0.12", @@ -2385,7 +2390,8 @@ "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.2.3.tgz", "integrity": "sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@cspell/dict-vue": { "version": "3.0.5", @@ -2552,6 +2558,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -2574,6 +2581,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -2683,6 +2691,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3104,6 +3113,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3745,6 +3755,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.2.tgz", "integrity": "sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/babel": "3.9.2", "@docusaurus/bundler": "3.9.2", @@ -3950,6 +3961,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -4093,6 +4105,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.2.tgz", "integrity": "sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/mdx-loader": "3.9.2", "@docusaurus/module-type-aliases": "3.9.2", @@ -4976,6 +4989,7 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", + "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -5869,6 +5883,7 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -6543,6 +6558,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -6735,6 +6751,7 @@ "integrity": "sha512-npiaib8XzbjtzS2N4HlqPvlpxpmZ14FjSJrteZpPxGUaYPlvhzlzUZ4mZyABo0EFrOWnvyd0Xxroq//hKhtAWg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.53.0", "@typescript-eslint/types": "8.53.0", @@ -7158,6 +7175,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -7225,6 +7243,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -7957,6 +7976,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", @@ -8285,6 +8305,7 @@ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", @@ -9332,6 +9353,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -9651,6 +9673,7 @@ "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10" } @@ -10060,6 +10083,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -11084,6 +11108,7 @@ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -11160,6 +11185,7 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", + "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -18796,6 +18822,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -19739,6 +19766,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -20287,11 +20315,12 @@ } }, "node_modules/prettier": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", - "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.0.tgz", + "integrity": "sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -20618,6 +20647,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -20630,6 +20660,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -20674,6 +20705,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/react": "*" }, @@ -20702,6 +20734,7 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -21559,6 +21592,7 @@ "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.2.tgz", "integrity": "sha512-y5LWb0IlbO4e97Zr7c3mlpabcbBtS+ieiZ9iwDooShpFKWXf62zz5pEPdwrLYm+Bxn1fnbwFGzHuCLSA9tBmrw==", "license": "MIT", + "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -21687,6 +21721,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -22978,6 +23013,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -23148,7 +23184,8 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/type-check": { "version": "0.4.0", @@ -23302,6 +23339,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -24034,6 +24072,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.0.tgz", "integrity": "sha512-hUtqAR3ZLVEYDEABdBioQCIqSoguHbFn1K7WlPPWSuXmx0031BD73PSE35jKyftdSh4YLDoQNgK4pqBt5Q82MA==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -24789,6 +24828,7 @@ "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 7ed83cdc..e6a6edf1 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "globals": "17.0.0", "markdownlint-cli": "0.47.0", "node-fetch": "3.3.2", - "prettier": "3.7.4", + "prettier": "3.8.0", "typescript": "5.9.3", "typescript-eslint": "8.53.0", "typescript-plugin-css-modules": "5.2.0" From 965ad2cd462b240f752d2b2ee97107b2de12a380 Mon Sep 17 00:00:00 2001 From: BotBlake Date: Thu, 22 Jan 2026 20:41:30 +0100 Subject: [PATCH 180/190] fix scpell failure --- cspell.json | 2 ++ .../post-install/transcoding/index.mdx | 2 +- project-words.txt | 31 ++++++++++++++----- .../contribute/ContributorGuide.tsx | 4 +-- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/cspell.json b/cspell.json index 9096b153..d81048fa 100644 --- a/cspell.json +++ b/cspell.json @@ -2,6 +2,7 @@ "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json", "version": "0.2", "language": "en, en-US, en-GB", + "allowCompoundWords": true, "files": ["**/*.md", "**/*.mdx", "**/*.tsx"], "dictionaryDefinitions": [ { @@ -14,6 +15,7 @@ "ignorePaths": [ "node_modules", "/project-words.txt", + "/src/components/common/PlatformIcon.tsx", "/blog/2019/*", "/blog/2020/*", diff --git a/docs/general/post-install/transcoding/index.mdx b/docs/general/post-install/transcoding/index.mdx index 35073fcc..cac0f410 100644 --- a/docs/general/post-install/transcoding/index.mdx +++ b/docs/general/post-install/transcoding/index.mdx @@ -37,4 +37,4 @@ There are four types of playback; three of which involve transcoding. The type b When the source video is in HDR, it will need to be tone-mapped to SDR when transcoding, as Jellyfin currently doesn't support HDR to HDR tone-mapping, or passing through HDR metadata. While this can be done in software, it is very slow, and you may encounter situations where no modern consumer CPUs can transcode in real time. Therefore, a GPU -is always recommended, where even a basic Intel iGPU can handle as much load as a Ryzen 5800X for this usecase. +is always recommended, where even a basic Intel iGPU can handle as much load as a Ryzen 5800X for this use case. diff --git a/project-words.txt b/project-words.txt index 983bd071..7e1d1931 100644 --- a/project-words.txt +++ b/project-words.txt @@ -9,8 +9,9 @@ alac albumartistsort allports alpn -alpn analyzeduration +Anidb +Anilist anthonylavado apiclient apsell @@ -37,6 +38,7 @@ BDMV behindthescenes blitter Blitter +boxset Broadwell buildinfo cachedir @@ -85,12 +87,12 @@ deinterlacing deletedscene DHLEVEL dhparams +directio DISABLEFILELOCKING discart displayepisode displayorder displayseason -directio distros dists dkanada @@ -153,6 +155,7 @@ Geoip geolocation getent gifsicle +Gotify gpedit GPGPU gstreamer @@ -182,6 +185,7 @@ initscripts inotify ipban IPTV +ircs irqs itid iwalton @@ -201,8 +205,11 @@ jpege Kaby keyrings keyserver +Kinopoisk +Kitsu kodi Kodi +Kribs lastplayed Lavado lavfi @@ -210,6 +217,7 @@ ldconfig leresolver letsencrypt libc +libera libmali libnvcuvid libnvidia @@ -236,18 +244,18 @@ Mbps mcarlton mediaserver mergerfs -Metaarchives -Metaimages -Metapackages metaarchive metaarchives +Metaarchives metaimage metaimages +Metaimages metapackage metapackages +Metapackages mintls -mirrorbits mirorrbits +mirrorbits mirrorinfo mirrorlist mirrorstats @@ -258,6 +266,7 @@ mobi modeset mopidy mpaa +mpvqt Multicore multiversion Multiview @@ -266,6 +275,7 @@ musicbrainzalbumartistid musicbrainzalbumid musicbrainzartistid musicbrainzreleasegroupid +mycoolname myjellyfin myvideos nasm @@ -363,6 +373,7 @@ rpmfusion RSSDP rsyncd Ryzen +scrobble scrollbuttons scroller Scyfin @@ -374,6 +385,8 @@ SEMA sendfile Serilog setsebool +Shoko +Shokofin shoutcast showtitle Skia @@ -384,6 +397,7 @@ sortname sorttitle soughtafter Spacetech +spaghettified specifishity speedbumps splashscreen @@ -405,9 +419,11 @@ sysconfig Sysoev systempaths tailnet +Themerr thornbill Tigerlake timedatectl +Tizen TMDB tmdbid tmpfs @@ -460,6 +476,7 @@ webui wheter withcolor withuserdata +Wizdom wstunnel xattr Xbmc @@ -470,4 +487,4 @@ Xvolume xvzf ycbcr youruser -yourusername +yourusername \ No newline at end of file diff --git a/src/components/contribute/ContributorGuide.tsx b/src/components/contribute/ContributorGuide.tsx index cedb960d..82bbf978 100644 --- a/src/components/contribute/ContributorGuide.tsx +++ b/src/components/contribute/ContributorGuide.tsx @@ -84,7 +84,7 @@ export default function ContributorGuide() { {contributorOption === ContributorOption.Code && ( <>
- There are a couple ways to get involved with Jellyfin depending on your skillset. + There are a couple ways to get involved with Jellyfin depending on your skill set.