Merge branch 'master' into transcode-quality-explainer

This commit is contained in:
felix920506
2025-07-14 16:45:30 +08:00
committed by GitHub
71 changed files with 2567 additions and 3053 deletions
-20
View File
@@ -1,20 +0,0 @@
# Dependencies
/node_modules
# Production
/build
# Generated files
.docusaurus
.cache-loader
# Misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
-34
View File
@@ -1,34 +0,0 @@
{
"env": {
"browser": true,
"es2021": true,
"node": true
},
"extends": [
"eslint:recommended",
"plugin:react/recommended",
"plugin:react-hooks/recommended",
"plugin:jsx-a11y/recommended"
],
"globals": {
"JSX": "readonly"
},
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaFeatures": {
"jsx": true
},
"ecmaVersion": 12,
"sourceType": "module"
},
"plugins": ["react", "@typescript-eslint", "jsx-a11y"],
"rules": {
"no-unused-vars": "off",
"@typescript-eslint/no-unused-vars": "error"
},
"settings": {
"react": {
"version": "detect"
}
}
}
+2 -2
View File
@@ -13,7 +13,7 @@ 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 efficency (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 |
| 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](<https://en.wikipedia.org/wiki/MPEG-4_Part_2#Advanced_Simple_Profile_(ASP)>) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | | ✅ | ✅ |
@@ -30,7 +30,7 @@ The goal is to Direct Play all media. This means the container, video, audio and
<br />
<sup>3</sup>May be (partially) dependent on Hardware support (can be compensated with CPU decoding on Android). Most new Android phones in the higher price range and many "4K" Android TV devices have VP9 hardware decoding support. Refer to you manufacturer for supported codecs.
<br />
<sup>4</sup>Needs atleast Android TV 10.
<sup>4</sup>Needs at least Android TV 10.
<br />
<sup>5</sup>As of <a href="https://github.com/jellyfin/jellyfin-androidtv/pull/671">version 0.12</a>, HEVC is enabled on all devices running Android 5.0+, but early generations of the Amazon Fire may not work yet. 10Bit may be supported depending on your device. Before Client 0.12, HEVC support was enabled on specific devices.
<br />
+2 -2
View File
@@ -390,11 +390,11 @@ The episode previews in season view are sized based on horizontal resolution. Th
This will drastically change the style of cast info into something very similar to how Plex approaches it. This override will lead to somewhat smaller thumbnails, and also works with all themes.
```css
/* Shrink and square (or round) cast thumnails */
/* Shrink and square (or round) cast thumbnails */
#castContent .card.overflowPortraitCard.personCard.card-hoverable.card-withuserdata {width: 4.2cm !important; font-size: 90% !important;}
#castContent .card.overflowPortraitCard.personCard.card-withuserdata {width: 4.2cm !important; font-size: 90% !important;}
/* Correct image aspect ratio behaviour, set border-radius to zero for square tiles */
/* Correct image aspect ratio behavior, set border-radius to zero for square tiles */
#castContent .cardContent-button.cardImageContainer.coveredImage.cardContent.cardContent-shadow.itemAction.lazy {background-size: cover; !important; border-radius: 2.5cm;}
#castContent .cardContent-button.cardImageContainer.coveredImage.defaultCardBackground.defaultCardBackground1.cardContent.cardContent-shadow.itemAction {background-size: cover; !important; border-radius: 2.5cm;}
#castContent .cardContent-button.cardImageContainer.coveredImage.defaultCardBackground.defaultCardBackground2.cardContent.cardContent-shadow.itemAction {background-size: cover; !important; border-radius: 2.5cm;}
+1 -1
View File
@@ -179,7 +179,7 @@ JellyCon behaves more like a standard Kodi streaming add-on. Media is accessed p
### Configuring Home
Many Kodi skins allow for customizing of the home menu with custom nodes and widgets. However, all of these use slightly different layouts and terminology. Rather than a step-by-step guide, this section serves as an barebones introduction to customizing a skin.
Many Kodi skins allow for customizing of the home menu with custom nodes and widgets. However, all of these use slightly different layouts and terminology. Rather than a step-by-step guide, this section serves as a barebones introduction to customizing a skin.
#### Examples
+3 -3
View File
@@ -10,7 +10,7 @@ Jellyfin is a maze of clients, plugins, and other useful projects. These source
## [Jellyfin Server](https://github.com/jellyfin/jellyfin)
1. .ci: `Azure Pipelines Build definitions`
2. DvdLib: `DVD Anaylzer`
2. DvdLib: `DVD Analyzer`
3. Emby.Dlna: `DLNA support for the server`
- Profiles: `DLNA Profiles for clients`
4. Emby.Drawing: `image processor managing the image encoder and image cache paths`
@@ -25,7 +25,7 @@ Jellyfin is a maze of clients, plugins, and other useful projects. These source
- MediaInfoHelper.cs: `logic for the stream builder that determines method of playback such as Direct Play or Transcoding`
10. Jellyfin.Data: `models used in the Entity Framework Core Database schema`
11. Jellyfin.Drawing.Skia: `image manipulation like resizing images, making image collages`
12. Jellyfin.Networking: `managing network interaces and settings`
12. Jellyfin.Networking: `managing network interfaces and settings`
13. Jellyfin.Server.Implementations: `like Emby.Server.Implementations, implementations using the EF Core Database`
14. Jellyfin.Server: `main server project that starts the whole server`
15. MediaBrowser.Common: `common methods used throughout the server`
@@ -37,7 +37,7 @@ Jellyfin is a maze of clients, plugins, and other useful projects. These source
21. MediaBrowser.XbmcMetadata: `metadata provider and saver for local .nfo files`
22. RSSDP: [RSSDP library](https://github.com/Yortw/RSSDP)`, including custom changes, for the Simple Service Discovery (SSDP) protocol`
23. apiclient: `files used for generating the axios API client`
24. deployment: `files used while building Jellyfin for different plattforms`
24. deployment: `files used while building Jellyfin for different platforms`
25. tests: `multiple Unit Test projects testing Jellyfin functionality`
26. Dockerfile.* `Dockerfiles defining the Jellyfin Docker image`
@@ -112,9 +112,11 @@ Builds in RPM package format are provided by RPM Fusion. Official packages are n
The Gentoo ebuild repository includes the Jellyfin package which can be installed like other software:
```sh
emerge www-apps/jellyfin
emerge --ask www-apps/jellyfin-bin
```
For more information, refer to the [Gentoo wiki](https://wiki.gentoo.org/wiki/Jellyfin).
## NixOS
NixOS has a [module for Jellyfin](https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/services/misc/jellyfin.nix),
+51 -14
View File
@@ -5,30 +5,67 @@ description: Install on Synology NAS.
sidebar_position: 2
---
For [Synology](https://www.synology.com/en-us/dsm), Jellyfin is installed using Docker.
# Installation on Synology
![Docker image add from url](/images/docs/install-synology-1.png)
:::caution Pre-built NAS Devices
![add from url window](/images/docs/install-synology-2.png)
Many pre-built NAS devices are underpowered. We generally do not recommend running Jellyfin on those devices.
See: [Hardware Selection](/docs/general/administration/hardware-selection) for more information.
![choose tag window](/images/docs/install-synology-3.png)
:::
For [Synology](https://www.synology.com/en-us/dsm), Jellyfin is installed using Docker. In this guide, the Synology Container Manager will be used to install Jellyfin.
Create the container.
## Prerequisites
![create container general settings](/images/docs/install-synology-4.png)
Everything is done through the Synology web interface.
This guide assumes you have already set up your Synology NAS and have access to the web interface. And your Synology NAS is running DSM 7.0 or newer.
Install the "Container Manager" package from the Synology Package Center.
Open the Package Center and search for "Container Manager" to find the package.
For further information read this [guide](https://kb.synology.com/en-global/DSM/help/DSM/PkgManApp/install_buy?version=7).
![create container advance settings](/images/docs/install-synology-5.png)
The creation and initialization of a volume will not be touched in this guide. Further information is provided by [Synology](https://kb.synology.com/en-global/DSM/help/DSM/StorageManager/volume_create_volume?version=7)
Use Advanced Settings to add mount points to your media and config.
## Installation
![add mounts window](/images/docs/install-synology-6.png)
The installation is done with the Synology Container Manager.
If you don't see the icon in the main menu after the installation of `Container Manager`, it can be found by clicking the top left corner of the main menu.
![advance settings showing mount added](/images/docs/install-synology-7.png)
### Downloading the Jellyfin Image
Host Mode is required for HdHR and DLNA. Use bridge mode if running multiple instances.
Navigate to the "Registry" tab and search for "Jellyfin". You should see the official jellyfin/jellyfin image. Click on it and then click "Download".
![advance settings network tab](/images/docs/install-synology-8.png)
![Downloading the Image](/images/docs/advanced/synology/install-synology-0.png)
![create container summary](/images/docs/install-synology-9.png)
A new window will open and a Jellyfin version can be selected for installation. The latest version is recommended. Click `Apply` after selection a version.
Browse to `http://SERVER_IP:8096` to access the web client.
![Downloading the Image](/images/docs/advanced/synology/install-synology-1.png)
After the image is downloaded, it can be found in the `Image` tab.
### Creating the Container
Navigate to the `Container` tab and click `Create`.
Select the `Jellyfin` image and give the container a name. This is mainly for identification purposes and can be set to anything desired. `auto-restart` can be enabled to automatically start Jellyfin when the NAS boots.
Resource limits can also be set for the container. It is recommended that all CPU resources and at least 4GB of ram be allocated to the Jellyfin container.
Click `Next` to proceed to the next step.
![Creating the Container](/images/docs/advanced/synology/install-synology-2.png)
#### Network and Port Settings
For the [Network Settings](https://jellyfin.org/docs/general/post-install/networking/dlna#general) and [Port Settings](https://jellyfin.org/docs/general/post-install/networking/#port-bindings) please refer their respected guides.
#### Volume Settings
This setting maps, directories on the host within the container. Use this setting to allow Jellyfin access to media and a place to store application data.
To add a volume, click "Add Folder" and select the folder desired. The mount point is set in the middle column and the directory will be accessible at this path within the container. For media files, `/media` can be used, and for config files, `/config` can be used.
#### Example
Your settings should look like this:
![Advanced Settings](/images/docs/advanced/synology/install-synology-3.png)
![Advanced Settings](/images/docs/advanced/synology/install-synology-4.png)
Click `Next` to proceed to the next step.
Settings can be reviewed on this screen. Check the `Run this container after the wizard is finished` checkbox and click `Apply` if everything looks correct. The container should now be shown in the `Container` tab.
Browse to `http://SERVER_IP:8096` in a browser on a other device to finish setting up the Jellyfin server.
If a different port was used, replace `8096` with the port used instead.
@@ -133,7 +133,7 @@ services:
- Unless you set the container to run as root, you need to add the render group ID to the container with `group_add`.
- In case the render group's ID is not `107` on all SCALE servers by default, go to your system shell and run the following command to get your render group's ID: `cat /etc/group | grep render`
- Jellyfin's auto discovery ports should also be configured if possible.
- [See more info here](/docs/general/post-install/networking/#static-ports)
- [See more info here](/docs/general/post-install/networking/#port-bindings)
<details>
<summary>Docker Compose Options</summary>
@@ -1,37 +0,0 @@
---
uid: network-dlna
title: DLNA
sidebar-position: 2
---
## DLNA
DLNA is based on uPnP.
DLNA will send a broadcast signal from Jellyfin.
This broadcast is limited to Jellyfin's current subnet.
If you are using docker, the network should use Host Mode, otherwise the broadcast signal will only be sent in the bridged network inside of docker.
If DLNA fails to bind properly, the message `[ERR] Failed to bind to port 1900: "Address already in use". DLNA will be unavailable` should appear in the logs.
Setting `Alive message interval (seconds)` to 30 seconds also appears to help discovery for some clients.
If a base URL is set, try removing it and restarting the server.
### DLNA Logging
Use these entries in `logging.default.json` to turn on DLNA debug logs.
```json
{
"Serilog": {
"MinimumLevel": {
"Default": "Warning",
"Override": {
"Microsoft": "Warning",
"System": "Warning",
"Jellyfin.Plugin.Dlna": "Debug"
}
}
}
}
```
@@ -0,0 +1,54 @@
---
uid: network-dlna
title: DLNA
sidebar-position: 2
---
DLNA support has been moved to a first party plugin and is not included in a Jellyfin base install since 10.9.
If you want to use DLNA, please install the plugin from the official Plugin catalog.
To do so simply navigate to the admin dashboard, open the Catalog and install the [DLNA Plugin](https://github.com/jellyfin/jellyfin-plugin-dlna). Plugins maintained by the Jellyfin Project will be available in there by default.
Make sure to restart your Jellyfin-Server to complete the plugin installation.
## General
**Requirements:**
- Docker Host-networking (if Docker is used)
- 1900 udp
DLNA is based on UPnP.
Therefore it will make use of its **Service Discovery** (SSDP) running on Port 1900 UDP.
Since UPnP is a standard Protocol expected to be on UDP port 1900, its not possible to configure this.
Make sure to open this port to your local network. You will find more information about how to do this in the [Firewall guide](./#firewall--port-forwarding).
DLNA discovery works by sending a broadcast to the current subnet and waiting for DLNA Servers to respond.
This means that Clients will not be abled to find your server if it is not in the same subnet.
Using DLNA remotely is not possible.
If you are using Docker, the network should use **Host Mode**, otherwise the broadcast signal will not reach the bridged network inside of Docker.
## Troubleshooting
- If DLNA fails to bind properly, the message `[ERR] Failed to bind to port 1900: "Address already in use". DLNA will be unavailable` should appear in the logs.
- Setting `Alive message interval (seconds)` to 30 seconds also appears to help discovery for some clients.
- If a base URL is set, try removing it and restarting the server.
## DLNA Logging
Use these entries in `logging.default.json` to turn on DLNA debug logs.
```json
{
"Serilog": {
"MinimumLevel": {
"Default": "Warning",
"Override": {
"Microsoft": "Warning",
"System": "Warning",
"Jellyfin.Plugin.Dlna": "Debug"
}
}
}
}
```
@@ -0,0 +1,2 @@
label: 'Reverse Proxy'
position: 2.1
@@ -3,8 +3,6 @@ uid: network-reverse-proxy-apache
title: Apache
---
## Apache HTTP Server Project
"The [Apache HTTP Server Project](https://httpd.apache.org/) is an effort to develop and maintain an open-source HTTP server for modern operating systems including UNIX and Windows. The goal of this project is to provide a secure, efficient and extensible server that provides HTTP services in sync with the current HTTP standards."
```conf
@@ -36,11 +34,17 @@ title: Apache
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
ProxyPass "/socket" "ws://SERVER_IP_ADDRESS:8096/socket"
ProxyPassReverse "/socket" "ws://SERVER_IP_ADDRESS:8096/socket"
# Apache should be able to know when to change protocols (between WebSocket and HTTP)
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket
RewriteRule /(.*) ws://SERVER_IP_ADDRESS:8096/socket/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket
RewriteRule /(.*) http://SERVER_IP_ADDRESS:8096/$1 [P,L]
ProxyPass "/" "http://SERVER_IP_ADDRESS:8096/"
ProxyPassReverse "/" "http://SERVER_IP_ADDRESS:8096/"
# Sometimes, Jellyfin requires clients to empty their cache to display and function correctly.
# This header tells clients not to keep any cache and is quite strict on that.
# This might also fix some syncplay issues (#5485 and #8140 @ https://github.com/jellyfin/jellyfin-web/issues/)
# Header set Cache-Control "no-store, no-cache, must-revalidate, max-age=0"
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/DOMAIN_NAME/fullchain.pem
@@ -60,7 +64,7 @@ title: Apache
</IfModule>
```
If you encouter errors, you may have to enable `mod_proxy`, `mod_ssl`, `proxy_wstunnel`, `http2`, `headers` and `remoteip` support manually.
If you encounter errors, you may have to enable `mod_proxy`, `mod_ssl`, `proxy_wstunnel`, `http2`, `headers` and `remoteip` support manually.
```bash
sudo a2enmod proxy proxy_http ssl proxy_wstunnel remoteip http2 headers
@@ -4,7 +4,9 @@ title: Caddy
sidebar-position: 1
---
# Caddy
## 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](<https://en.wikipedia.org/wiki/Caddy_(web_server)>)
@@ -38,7 +40,7 @@ Please proceed with caution when using this option:
Please read the [Let's Encrypt documentation](https://letsencrypt.org/docs/challenge-types/) for more info.
:::
## One-liners
### One-liners
The easiest way to reverse proxy to Jellyfin is with the `reverse-proxy` command:
@@ -61,7 +63,7 @@ caddy reverse-proxy --from example.com --to 127.0.0.1:8096
You will see Caddy provision a TLS certificate for your site and if it succeeds, you can then access your Jellyfin server over HTTPS with your domain name.
## Caddyfile
### Caddyfile
If you want to use a config file, create a file called `Caddyfile` for the configuration.
The first `reverse-proxy` command above is equivalent to the following options.
@@ -3,7 +3,7 @@ uid: network-reverse-proxy-haproxy
title: HAProxy
---
## HAProxy
> **Note:** For HTTP/3 support, ensure UDP port 443 is forwarded/opened on your firewall, as HTTP/3 uses UDP.
"[Haproxy](https://www.haproxy.com/) is a free, open source software that provides a high availability load balancer and proxy server for TCP and HTTP-based applications that spreads requests across multiple servers.[1] It is written in C[2] and has a reputation for being fast and efficient (in terms of processor and memory usage)." - [Wikipedia](https://en.wikipedia.org/wiki/HAProxy)
@@ -0,0 +1,64 @@
---
uid: reverse-proxy-index
title: Reverse Proxy
---
A proxy server is meant to catch and forward outgoing traffic. A reverse proxy does the same, but for incoming network traffic.
It can serve as an entry point to various services and will internally forward the traffic to your service.
This opens the ability to do rule specific routing, for example subdomain routing, ip geoblocking, ratelimits or url forwarding.
It is also possible to centralize DNS and SSL management on the reverse proxy, streamlining all routing-wise configuration.
Additionally, reverse proxies offer extended access logging, so it is always clear who, when and where a network request came from and went to.
## Running Jellyfin Behind a Reverse Proxy
Important things to note when using Jellyfin behind a reverse proxy.
### Logging
Be careful when logging requests with your reverse proxy. Jellyfin sometimes sends authentication information as part of the URL (e.g. `api_key` parameter), so logging the full request path can expose secrets to your logfile.
We recommend that you either protect your logfiles or do not log full request URLs or censor sensitive data from the logfile.
Our [proxy guides](./#guides) include examples on how to censor sensitive information from a logfile.
### Forwarded-For Headers
When traffic is forwarded through a reverse proxy, Jellyfin sees the proxys IP address rather than the clients.
This introduces potential security risks and can also break compatibility, since Jellyfin will not be able to differentiate between local and remote connections.
Therefore, if set up incorrectly, all limitations for external access will not work.
Therefore, the IP address(es) of your reverse proxy must be configured under “Known Proxies” in Jellyfins **Network** settings.
This allows Jellyfin to respect the `X-Forwarded-For`, `X-Forwarded-Proto`, and `X-Forwarded-Host` headers and use the associated value as the source IP address. By default, Jellyfin will discard all forwarded-for headers that do not originate from a "known Proxy". This is so that malicious devices will not be able to hide their IP address by providing a forwarded-for header.
This assumes that the reverse proxy is set up to include this header, which is not always the case by default.
If issues with source IP forwarding appear, this should be checked.
### Websockets
Jellyfin makes use of Websockets for various things. Not all reverse proxies allow this by default. It is important to make sure Websockets are allowed for your Jellyfin server.
## Guides
We recommend using [Caddy](https://caddyserver.com/) for its ease of use, especially with https. We provide a [guide](./caddy/) for configuring Caddy with Jellyfin.
If you do not want to use Caddy, some other popular options for reverse proxy systems are [Nginx](https://www.nginx.com), [Traefik](https://traefik.io), [Haproxy](https://www.haproxy.com) and [Apache](https://httpd.apache.org). Note that these have a greater learning curve than the recommended reverse proxy Caddy. You can find respective guides here:
- [Nginx](./nginx)
- [Traefik](./traefik)
- [HAProxy](./haproxy)
- [Apache](./apache)
While not a reverse proxy, Let's Encrypt can be used independently or with a reverse proxy to provide SSL certificates.
- [Let's Encrypt](../advanced/letsencrypt)
When following these guides, be sure to replace the following variables with your information.
- `DOMAIN_NAME`: Your public domain name to access Jellyfin on (e.g. jellyfin.example.com)
- `example.com`: The domain name Jellyfin services will run under (e.g. example.com)
- `SERVER_IP_ADDRESS`: The IP address of your Jellyfin server (if the reverse proxy is on the same server use 127.0.0.1)
In addition, the examples are configured for use with Let's Encrypt certificates. If you have a certificate from another source, change the SSL configuration from `/etc/letsencrypt/DOMAIN_NAME/` to the location of your certificate and key.
Ports 80 (TCP) and 443 (TCP) need to be opened on your router and firewall. (pointing to the proxy server)
For HTTP/3 support (QUIC), also forward/open UDP port 443.
@@ -3,8 +3,6 @@ uid: network-reverse-proxy-nginx
title: Nginx
---
## Nginx
"[Nginx](https://www.nginx.com/) (pronounced "engine X") is a web server which can also be used as a reverse proxy, load balancer, mail proxy and HTTP cache. The software was created by Igor Sysoev and first publicly released in 2004.[9] A company of the same name was founded in 2011 to provide support and Nginx plus paid software." - [Wikipedia](https://en.wikipedia.org/wiki/Nginx)
## Nginx from a subdomain (jellyfin.example.org)
@@ -96,7 +94,7 @@ server {
### Censor sensitive information in logs
This censors any <code>api_key</code> URL parameter from the logfile.
This censors any 'api_key' URL parameter from the logfile.
```conf
#Must be in HTTP block
@@ -115,7 +113,7 @@ map $request $secretfilter {
access_log /var/log/nginx/access.log stripsecrets;
```
## Nginx Proxy Manager
### Nginx Proxy Manager
[Nginx Proxy Manager](https://nginxproxymanager.com/) provides an easy-to-use web GUI for Nginx.
@@ -1,10 +1,8 @@
---
uid: network-reverse-proxy-traefik
title: Traefik v2.x
title: Traefik
---
## Traefik v2.x
[Traefik](https://traefik.io/) is a modern HTTP reverse proxy and load balancer that makes deploying microservices easy. Traefik integrates with your existing infrastructure components (ie: Docker) and generally configures itself dynamically as services are added or removed.
This document provides a complete configuration of Traefik v2.x and Jellyfin. It uses a number of files including a `docker-compose.yml` file, `traefik.toml` (your Traefik static configuration), `traefik-provider.toml` (a file-based provider for Traefik), `traefik.log` (an optional log file), `.env` (the environment which may be needed for your ACME/LetsEncrypt providers), and `acme.json` (the state data for your ACME/LetsEncrypt certificate). The files should all be created in the **same** directory. Alternately, alter the paths in the volume section of the `traefik` service in `docker-compose.yml`. You can optionally jam some of the traefik.toml file into labels for the traefik service in `docker-compose.yml`, however this method is much clearer and easier to comment.
@@ -23,7 +21,7 @@ Traefik has many options for the configuration of LetsEncrypt using your choice
The configuration below creates a Traefik v2.x installation with access at entryPoint ports 80 (labelled 'http'), 443 (labeled 'https'), and 9999 (labeled 'secure'). Unrelated to this Jellyfin configuration, it redirects all traffic from http (port 80) to https (port 443) to ensure all data is encrypted. As for Jellyfin, it makes the service accessible without a path on the secure entry point. This configuration is intended to be used as a starting point and some adaptation is likely required for your configuration. If you want Jellyfin to be accessible without using a port (using the default https port), simply change 'secure' to 'https' in `docker-compose.yml` where indicated and remove the ':9999' from the SSLHost parameter. If you want Jellyfin to be accessible with a path, simply add the PathPrefix (i.e. '/jellyfin') and see the note near the end of this document about configuring Jellyfin.
### docker-compose.yml
## docker-compose.yml
```yml
services:
@@ -134,7 +132,7 @@ TOML files can't support environment variables, so all values must be hard coded
:::
### traefik.toml
## traefik.toml
```toml
[log]
@@ -226,7 +224,7 @@ TOML files can't support environment variables, so all values must be hard coded
Due to a [quirk](https://github.com/containous/traefik/issues/5559) in Traefik, you cannot dynamically route to containers when network_mode=host. We have created a static route to the docker host (192.168.1.xx:8096) in `traefik-provider.toml`. The use of host networking (as in this doc) or macvlan are required to use DLNA or an HdHomeRun so it can utilize the multicast network. `traefik-provider.toml` defines the jellyfin-svc@file service which we are pointing the router to in the `docker-compose.yml` file. You can not set a URL in `docker-compose.yml` which is why we set up this service externally. Be sure to update the IP address below to the IP address of the host on the local network (in this case, 192.168.1.xx).
### traefik-provider.toml
## traefik-provider.toml
```toml
[http]
@@ -261,7 +259,7 @@ Due to a [quirk](https://github.com/containous/traefik/issues/5559) in Traefik,
minVersion = "VersionTLS13"
```
### .env
## .env
```bash
RFC2136_NAMESERVER=...
@@ -1,2 +1,2 @@
label: 'Advanced Networking'
position: 3.5
position: 2.3
@@ -3,20 +3,18 @@ uid: network-fail2ban
title: fail2ban
---
## Fail2ban
[Fail2ban](https://github.com/fail2ban/fail2ban) is an intrusion prevention software framework that protects computer servers from brute-force attacks.
Fail2ban operates by monitoring log files (e.g. /var/log/auth.log, /var/log/apache/access.log, etc.) for selected entries and running scripts based on their content.
Jellyfin produces logs that can be monitored by Fail2ban to prevent brute-force attacks on your machine.
### Requirements
## Requirements
- Jellyfin remotely accessible
- Fail2ban installed and running
- Knowing where the logs for Jellyfin are stored: by default `/var/log/jellyfin/` for desktop and `/config/log/` for docker containers.
### Step one: create the jail
## Step one: create the jail
You need to create a jail for Fail2ban. If you're on Ubuntu and use nano as editor, run:
@@ -52,7 +50,7 @@ Note:
2. If you're running Jellyfin on a non-standard port, then change the port from `80,443` to the relevant port say `8096,8920`
### Step two: create the filter
## Step two: create the filter
The filter contains a set of rules which Fail2ban will use to identify a failed authentication attempt. Create the filter by running:
@@ -79,7 +77,7 @@ Check fail2ban is running:
sudo systemctl status fail2ban
```
### Step three: test
## Step three: test
Assuming you've at least one failed authentication attempt, you can test this new jail with `fail2ban-regex`:
@@ -265,7 +263,7 @@ Replace `<upstream-server-ip>` with the actual IP address of your upstream serve
ssh root@<upstream-server-ip> "iptables -L f2b-jellyfin"
```
### Step four: Monitor Logs
### Step five: Monitor Logs
Monitor the Fail2Ban log to ensure that actions are being executed properly:
@@ -3,8 +3,6 @@ uid: network-ipban
title: IPBan
---
## IPBan
[IPBan](https://github.com/DigitalRuby/IPBan) is an intrusion prevention much like fail2ban, but multi-platform
Install with one command on windows (elevated powershell prompt)
@@ -3,17 +3,15 @@ uid: network-letsencrypt
title: Let's Encrypt
---
## LetsEncrypt with Certbot
LetsEncrypt is a service that provides free SSL/TLS certificates to users. Certbot is a client that makes this easy to accomplish and automate. In addition, it has plugins for Apache and Nginx that make automating certificate generation even easier.
Installation instructions for most Linux distributions can be found on the [Certbot](https://certbot.eff.org/docs/install.html#operating-system-packages) website.
Once the packages are installed, you're ready to generate a new certificate.
### Apache
## Apache
#### Certbot Apache Plugin
### Certbot Apache Plugin
After installing Certbot and the Apache plugin, certificate generation is accomplished by with the following command.
@@ -29,9 +27,9 @@ Add a job to cron so the certificate will be renewed automatically.
echo "0 0 * * * root certbot renew --quiet --no-self-upgrade --post-hook 'systemctl reload apache2'" | sudo tee -a /etc/cron.d/renew_certbot
```
#### Certbot Webroot
### Certbot Webroot
##### Debian
#### Debian
If the certbot apache plugin doesn't work with your config, use webroot instead.
@@ -49,11 +47,11 @@ Run the certbot command as root:
sudo certbot certonly --webroot -w /var/www/html --agree-tos --email YOUR_EMAIL -d DOMAIN_NAME
```
### Caddy
## Caddy
Caddy automatically handles obtaining an SSL certificate from Let's Encrypt when provided with a domain name. No manual action is required.
### HAProxy
## HAProxy
HAProxy doesn't currently have a Certbot plugin. To get around this, run Certbot in standalone mode and proxy traffic through your network.
@@ -73,7 +71,7 @@ cat /etc/letsencrypt/live/DOMAIN_NAME/fullchain.pem /etc/letsencrypt/live/DOMAIN
Uncomment `bind *:443` and the redirect section in the configuration, then reload the service.
#### Automatic Certificate Renewal
### Automatic Certificate Renewal
Place the following script in `/usr/local/bin/` to automatically update your SSL certificate.
@@ -102,7 +100,7 @@ Add a job to cron so the certificate will be renewed automatically.
@monthly /usr/bin/certbot renew --renew-hook "/usr/local/bin/letsencrypt-renew.sh" >> /var/log/letsencrypt-renewal.log
```
### Nginx
## Nginx
After installing Certbot and the Nginx plugin with `sudo apt install certbot python3-certbot-nginx`, generate the certificate.
@@ -122,7 +120,7 @@ Add a job to cron so the certificate will be renewed automatically.
echo "0 0 * * * root certbot renew --quiet --no-self-upgrade --post-hook 'systemctl reload nginx'" | sudo tee -a /etc/cron.d/renew_certbot
```
### Let's Encrypt and Docker
## Let's Encrypt and Docker
This section assumes that Jellyfin is running in a Docker container (on Linux). This section also assumes that you wish to run Let's Encrypt in a Docker container as well. The Linuxserver/swag Docker container has a built-in nginx webserver to handle the reverse proxy.
@@ -3,11 +3,16 @@ uid: monitoring
title: Monitoring
---
## Monitoring
Jellyfin has two monitoring and metrics endpoints built-in: a basic health check endpoint and a Prometheus-compatible metrics endpoint.
### Health check endpoint
## Health check endpoint
:::note
The health endpoint will not function as expected while the server is still starting up.
Monitoring/ Watchdog programs could therefore kill the server when its running migrations.
:::
Jellyfin exposes the `/health` endpoint designated for checking the status of the underlying service. Currently this will verify HTTP and database connectivity and return a `200 OK` response if successful. You can see this for yourself by using `curl`:
@@ -17,7 +22,7 @@ curl -i http://myserver:8096/health
The `-i` option tells `curl` to also print the HTTP response code and headers.
### Prometheus metrics
## Prometheus metrics
Jellyfin can make [Prometheus](https://prometheus.io/) metrics available at `/metrics`, but this is turned off by default to avoid unintentionally leaking this information on the public internet. To enable it, you will need to edit `/etc/jellyfin/system.xml` and change this line from `false` to `true`:
@@ -25,4 +30,4 @@ Jellyfin can make [Prometheus](https://prometheus.io/) metrics available at `/me
<EnableMetrics>false</EnableMetrics>
```
If you have a [reverse proxy](..#running-jellyfin-behind-a-reverse-proxy) configured, you can configure it to block access to the `/metrics` endpoint except for your internal network.
If you have a [reverse proxy](../reverse-proxy/) configured, you can configure it to block access to the `/metrics` endpoint except for your internal network.
+125 -102
View File
@@ -3,123 +3,150 @@ uid: network-index
title: Networking
---
# Networking
As a server software, Jellyfin offers different services over the network.
Specifically Jellyfin supports the streaming of content and comes packed with a web-Client. - This will work purely over the HTTP(S) ports.
This section describes how to get basic connectivity to a Jellyfin server, and also some more advanced networking scenarios.
Additionally, in local networks, Jellyfin offers various Auto-Discovery services. These will not work outside your local subnet.
## Connectivity
As a fully self-hosted software, Jellyfin runs independently from the Internet.
You do not have to make your server accessible through the internet.
Neither does Jellyfin require an internet connection to run; however you should note that it will load metadata from various Providers, which will not work without an Internet connection.
Many clients will automatically discover servers running on the same LAN and display them on login. If you are outside the network when you connect you can type in the complete IP address or domain name in the server field with the correct port to continue to the login page. You can find the default ports below to access the web frontend.
## Port Bindings
HTTP and HTTPS are the primary means of connecting to the server. When using HTTPS, self-signed certs are not recommended. Please use a trusted certificate authority such as [Let's Encrypt](./advanced/letsencrypt).
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 |
<details>
<summary>See details</summary>
- **HTTP Traffic** (8096/TCP):
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.
- **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.
</details>
## Accessing Jellyfin
This section focusses on how to make Jellyfin Available within Networks.
Here you will find descriptions on how to make Jellyfin accessible both only locally and through the Internet.
In general, Jellyfin will be available locally on the specified port over the host-ip - e.g. `http://10.0.0.2:8096`.
However its also possible to create a local DNS entry that will point to your Jellyfin-Server - e.g. `http://jellyfin.local:8096`.
<details>
<summary>Learn more about limitations with local DNS</summary>
Devices like Google Chromecast or Google Streamer use hardcoded DNS Servers - therefore they will not make use of your local DNS entries.
There are multiple workarounds for this issue.
The easiest involves the usage of IPv6 Entries in the public DNS.
Since IPv6 addresses do not differentiate between local and public, the address will be abled to be resolved locally.
This, however, requires the use of a public DNS server - The Jellyfin Server does not have to be accessible from the outside though!
</details>
### Firewall / Port Forwarding
Networks are usually divided from each other by firewalls. These block all incoming traffic and are meant to protect the network.
To access Jellyfin through these boundaries, its ports need to be forwarded / opened in the respective firewalls.
Note that opening a port gives full access to that port to the next higher Network.
Opening a port directly to the Internet is therefore insecure and not recommended.
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 |
<details>
<summary>Port forwarding vs. opening a Port</summary>
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.
Sometimes, port forwarding also lets you map an external port to a different internal port.
</details>
<details>
<summary>How to open a Port</summary>
How exactly a port will be opened depends on your firewall software and its UI.
Here is linked below how to open ports for:
- [Windows Firewall](https://learn.microsoft.com/en-us/sql/reporting-services/report-server/configure-a-firewall-for-report-server-access?view=sql-server-ver16#open-ports-in-windows-firewall)
- [firewalld](https://firewalld.org/documentation/howto/open-a-port-or-service.html)
- [Uncomplicated Firewall](https://wiki.ubuntu.com/UncomplicatedFirewall#Basic_Usage) (ufw)
- [nftables](https://wiki.nftables.org/wiki-nftables/index.php/Main_Page)
</details>
### External Access
Since Jellyfin is entirely self-hosted, you must manually expose it to the internet.
To do so, you need a method to access the HTTP(S) ports remotely.
Automatic discovery only works locally and should not be exposed externally
To access a server remotely there will need to be a way to find it or its network on the internet.
This can be done through the public IP Address of the Device or for IPv6 the Server's directly.
To store the IP Address, the easiest option would be to use a Domain and rely on DNS to resolve it.
This can also be used to store the 'current IP Address' in the case of a dynamic public IP Address.
However its not mandatory to use a Domain.
There are multiple ways of exposing Jellyfin to the outside - the most common ones are:
- forwarding its Ports directly to the internet (not recommended!)
- forwarding through a Reverse Proxy
- using a VPN connection to enter the Network
- use a VPS to Reverse Proxy to your home network
Learn more about reverse proxies in our dedicated [Reverse Proxy guide](./reverse-proxy/).
### SSL / https
Using https to access the Server is recommended.
By default, HTTPS is disabled because it requires an SSL certificate.
SSL Certificates are usually issued by a third party and verify that the Server and URL are assigned to another.
Please use a trusted certificate authority such as [Let's Encrypt](./advanced/letsencrypt) when using https.
:::caution
In order for Chromecast to work on your local LAN, the easiest solution is to use IPv6 instead of IPv4.
For IPv4, you need to use NAT reflection to redirect to your local LAN IPv4 or add a override rules to your local DNS server to point to your local LAN IPv4 (for example 192.168.1.10) of Jellyfin.
Because Chromecasts have hardcoded Google DNS servers, you need to block Chromecast from reaching these servers (8.8.8.8) so it makes use of your local DNS server instead.
For a public routable IPv6 (not a link-local or ULA) there is no difference between public or local. Such IPv6 address is simultaneously publicly routable and accessible from the local LAN.
Because of that, there is no blocking, redirecting or DNS override needed.
Self-signed certificates pose security and compatibility issues and are strongly discouraged.
:::
### Port Bindings
While Jellyfin supports HTTPS, it is strongly recommended to handle HTTPS termination separately on a reverse proxy. You can find more info on how to set this up on our [Reverse Proxy](./reverse-proxy/) page.
This document aims to provide an administrator with knowledge on what ports Jellyfin binds to and what purpose they serve.
#### Static Ports
- 8096/tcp is used by default for HTTP traffic. You can change this in the dashboard.
- 8920/tcp is used by default for HTTPS traffic. You can change this in the dashboard.
- 1900/udp is used for service auto-discovery. This is not configurable.
- 7359/udp is also used for auto-discovery. This is not configurable.
**HTTP Traffic:** 8096
The web frontend can be accessed here for debugging SSL certificate issues on your local network. You can modify this setting from the **Networking** page in the settings.
**HTTPS Traffic:** 8920
This setting can also be modified from the **Networking** page to use a different port.
**Service Discovery:** 1900
Since client auto-discover would break if this option were configurable, you cannot change this in the settings at this time. DLNA also uses this port and is required to be in the local subnet.
**Client Discovery:** 7359 UDP
Allows clients to discover Jellyfin on the local network. A broadcast message to this port with `Who is JellyfinServer?` will get a JSON response that includes the server address, ID, and name.
#### Dynamic Ports
Live TV devices will often use a random UDP port for HDHomeRun devices. The server will select an unused port on startup to connect to these tuner devices.
### Monitoring Endpoints
See [monitoring](./advanced/monitoring) for details on the monitoring endpoints that Jellyfin provides.
## Running Jellyfin Behind a Reverse Proxy
It's possible to run Jellyfin behind another server acting as a reverse proxy. With a reverse proxy setup, this server handles all network traffic and proxies it back to Jellyfin. This provides the benefits of using DNS names and not having to remember port numbers, as well as easier integration and management of SSL certificates.
In cases when you would like to not use host networking with docker, you may use the gateway ip as a known proxy to fix ip resolution for clients logging in.
:::caution
In order for a reverse proxy to have the maximum benefit, you should have a publicly routable IP address and a domain with DNS set up correctly.
These examples assume you want to run Jellyfin under a sub-domain (e.g. jellyfin.example.com), but are easily adapted for the root domain if desired.
:::
:::caution
Be careful when logging requests with your reverse proxy. Jellyfin sometimes sends authentication information as part of the URL (e.g `api_key` parameter), so logging the full request path can expose secrets to your logfile.
We recommend that you either protect your logfiles or do not log full request URLs or censor sensitive data from the logfile.
The nginx documentation below includes an example how to censor sensitive information from a logfile.
:::
Some popular options for reverse proxy systems are [Apache](https://httpd.apache.org), [Caddy](https://caddyserver.com), [Haproxy](https://www.haproxy.com), [Nginx](https://www.nginx.com) and [Traefik](https://traefik.io).
- [Apache](./advanced/apache)
- [Caddy](./caddy)
- [HAProxy](./advanced/haproxy)
- [Nginx](./advanced/nginx)
- [Traefik](./advanced/traefik)
While not a reverse proxy, Let's Encrypt can be used independently or with a reverse proxy to provide SSL certificates.
- [Let's Encrypt](./advanced/letsencrypt)
When following this guide, be sure to replace the following variables with your information.
- `DOMAIN_NAME`: Your public domain name to access Jellyfin on (e.g. jellyfin.example.com)
- `example.com`: The domain name Jellyfin services will run under (e.g. example.com)
- `SERVER_IP_ADDRESS`: The IP address of your Jellyfin server (if the reverse proxy is on the same server use 127.0.0.1)
In addition, the examples are configured for use with Let's Encrypt certificates. If you have a certificate from another source, change the SSL configuration from `/etc/letsencrypt/DOMAIN_NAME/` to the location of your certificate and key.
Ports 80 and 443 (pointing to the proxy server) need to be opened on your router and firewall.
### Known Proxies
When a reverse proxy handles incoming http requests it terminates the request and then creates a new request to your jellyfin server. This will result in jellyfin seeing the sender IP as the ip of the reverse proxy instead of the actual client. To compensate for that, reverse proxies set the original sender IP in a header. This header is usually one of `X-Forwarded-For`, `X-Forwarded-Proto` or `X-Forwarded-Host` all 3 are supported by jellyfin. However as blindly trusting those headers from any source is a security risk, Jellyfin has to be configured to trust your reverse proxy. For jellyfin to know which reverse proxy is trusted, the IP, Hostname or Subnet has to be set in the `Known Proxies` (under Admin Dashboard -> Networking) setting. You can add multiple IP's/Subnets/Hostnames by seperating them with a comma (`,`) like `192.168.178.5,10.10.0.6,127.0.0.0/26,MyReverseProxyHostname`.
This is required for reverse proxies as otherwise all incoming traffic will be seen as originating from your reverse proxy which can be a security risk.
Changes to the KnownProxies setting requires a server restart after saving to take effect.
**It's strongly recommend that you check your SSL strength and server security at [SSLLabs](https://www.ssllabs.com/ssltest/analyze.html) if you are exposing these services to the internet.**
### Base URL
Running Jellyfin with a path (e.g. `https://example.com/jellyfin`) is supported by the Android and web clients.
Running Jellyfin with a path (e.g. `https://example.com/jellyfin`) is supported.
:::caution
Base URL is known to break HDHomeRun, DLNA, Sonarr, Radarr, Chromecast, and MrMC.
Base URL is known to break HDHomeRun, the [DLNA plugin](./dlna/), Sonarr, Radarr, and MrMC.
:::
The Base URL setting in the **Networking** page is an advanced setting used to specify the URL prefix that your Jellyfin instance can be accessed at. In effect, it adds this URL fragment to the start of any URL path. For instance, if you have a Jellyfin server at `http://myserver` and access its main page `http://myserver/web/index.html`, setting a Base URL of `/jellyfin` will alter this main page to `http://myserver/jellyfin/web/index.html`. This can be useful if administrators want to access multiple Jellyfin instances under a single domain name, or if the Jellyfin instance lives only at a subpath to another domain with other services listening on `/`.
The Base URL setting is a setting used to specify the URL prefix that your Jellyfin instance can be accessed at. In effect, it adds this URL fragment to the start of any URL path. For instance, if you have a Jellyfin server at `http://myserver` and access its main page `http://myserver/web/index.html`, setting a Base URL of `/jellyfin` will alter this main page to `http://myserver/jellyfin/web/index.html`. This can be useful if administrators want to access multiple Jellyfin instances under a single domain name, or if the Jellyfin instance lives only at a subpath to another domain with other services listening on `/`.
The entered value on the configuration page will be normalized to include a leading `/` if this is missing.
@@ -129,10 +156,6 @@ There are three main caveats to this setting.
1. When setting a new Base URL (i.e. from `/` to `/baseurl`) or changing a Base URL (i.e. from `/baseurl` to `/newbaseurl`), the Jellyfin web server will automatically handle redirects to avoid displaying users invalid pages. For instance, accessing a server with a Base URL of `/jellyfin` on the `/` path will automatically append the `/jellyfin` Base URL. However, entirely removing a Base URL (i.e. from `/baseurl` to `/`, an empty value in the configuration) will not - all URLs with the old Base URL path will become invalid and throw 404 errors. This should be kept in mind when removing an existing Base URL.
2. Client applications generally, for now, do not handle the Base URL redirects implicitly. Therefore, for instance in the Android app, the `Host` setting _must_ include the BaseURL as well (e.g. `http://myserver:8096/baseurl`), or the connection will fail.
2. Client applications generally, for now, do not handle the Base URL redirects implicitly. Therefore, for instance in the Android TV app, the `Host` setting _must_ include the BaseURL as well (e.g. `http://myserver:8096/baseurl`), or the connection will fail.
3. Any reverse proxy configurations must be updated to handle a new Base URL. Generally, passing `/` back to the Jellyfin instance will work fine in all cases and the paths will be normalized, and this is the standard configuration in our examples. Keep this in mind however when doing more advanced routing.
### Final Steps
It's strongly recommend that you check your SSL strength and server security at [SSLLabs](https://www.ssllabs.com/ssltest/analyze.html) if you are exposing these services to the internet.
@@ -105,11 +105,11 @@ Please refer to these links:
Due to the lack of B-frame support, the encoding quality of the AMD H.264 hardware encoder has been unsatisfactory. Although RX 6000/VCN3.0 brings back the B-frame support, the quality improvement is not great.
The AMD HEVC encoder is far better than the AMD H.264 encoder, and the new AMD AV1 encoding support on RX 7000/VCN4.0 seems to be the savior of AMD encoding quality. Nonetheless they are currently no match for Intel QSV and NVIDIA NVENC. VCN4.0 additionally improved the encoding speed drastically.
The AMD HEVC encoder is far better than the AMD H.264 encoder, and the new AMD AV1 encoding support on RX 7000/VCN4.0 seems to be the savior of AMD encoding quality. Nonetheless they are currently no match for Intel QSV and NVIDIA NVENC. VCN4.0 additionally improved the encoding speed drastically. The encoding quality has been greatly improved in VCN5.0, and it also fixes the issue in VCN4.0 where the AV1 encoder required a height of 64 (1080p wrongly encoded as 1082p with black pixels).
Encoding speed and quality:
- VCN4(RX 7000) > VCN3/VCN2(RX 6000/RX 5000/Renoir) > VCN1/VCE(Raven/Picasso/GCN GPUs)
- VCN5(RX 9000) >> VCN4(RX 7000) > VCN3/VCN2(RX 6000/RX 5000/Renoir) > VCN1/VCE(Raven/Picasso/GCN GPUs)
## Windows Setups
@@ -370,7 +370,7 @@ sudo mv jellyfin-ffmpeg /usr/lib
sudo ldd -v /usr/lib/jellyfin-ffmpeg/ffmpeg
```
Install other necessary Intel driver packages and their dependencies that contain these key words:
Install other necessary Mesa driver packages and their dependencies that contain these key words:
- Mesa libva vaapi driver - RadeonSI
@@ -148,7 +148,7 @@ Dolby Vision (P5 & P8) to SDR tone-mapping is supported in Jellyfin 10.8 and req
- VPP is prefered if both tone-mapping options are enabled.
- Rockchip RKMPP currently only support HDR10 and HLG tone-mapping.
- Rockchip RKMPP does support Dolby Vision tone-mapping Jellyfin 10.11 and later versions.
:::
@@ -408,13 +408,13 @@ 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/community/x86_64/intel-media-driver/)
- [intel-media-driver](https://archlinux.org/packages/extra/x86_64/intel-media-driver/)
- [intel-media-sdk](https://archlinux.org/packages/community/x86_64/intel-media-sdk/)
- [intel-media-sdk](https://archlinux.org/packages/extra/x86_64/intel-media-sdk/)
- [onevpl-intel-gpu](https://archlinux.org/packages/community/x86_64/onevpl-intel-gpu/)
- [onevpl-intel-gpu](https://archlinux.org/packages/extra/x86_64/onevpl-intel-gpu/)
- [intel-compute-runtime](https://archlinux.org/packages/community/x86_64/intel-compute-runtime/)
- [intel-compute-runtime](https://archlinux.org/packages/extra/x86_64/intel-compute-runtime/)
- [libva-intel-driver](https://archlinux.org/packages/extra/x86_64/libva-intel-driver/)
@@ -93,9 +93,9 @@ Please refer to these links:
Encoding quality:
- H.264 & HEVC - Ada/Ampere/Turing > Turing TU117/Volta/Pascal > Maxwell
- H.264 & HEVC - Blackwell/Ada/Ampere/Turing > Turing TU117/Volta/Pascal > Maxwell
- AV1 - Ada Lovelace only
- AV1 - Ada Lovelace and Blackwell only
Decoding & Encoding speed within the same generation:
@@ -107,9 +107,9 @@ Decoding & Encoding speed within the same generation:
NVENC/NVDEC performance tables:
- [NVENC Performance - NVIDIA Docs](https://docs.nvidia.com/video-technologies/video-codec-sdk/12.0/nvenc-application-note/index.html#nvenc-performance)
- [NVENC Performance - NVIDIA Docs](https://docs.nvidia.com/video-technologies/video-codec-sdk/13.0/nvenc-application-note/index.html#nvenc-performance)
- [NVDEC Performance - NVIDIA Docs](https://docs.nvidia.com/video-technologies/video-codec-sdk/12.0/nvdec-application-note/index.html#nvdec-performance)
- [NVDEC Performance - NVIDIA Docs](https://docs.nvidia.com/video-technologies/video-codec-sdk/13.0/nvdec-application-note/index.html#nvdec-performance)
## Windows Setups
@@ -71,7 +71,7 @@ AV1 is a royalty-free, future-proof video codec. It saves a lot of storage space
Rockchip added support for AV1 acceleration in their latest SoCs:
- **Decoding AV1 8/10-bit** - Rockchip RK3588/3588S SoC.
- **Decoding AV1 8/10-bit** - Rockchip RK3588/3588S and RK3576 SoC.
- **Encoding AV1 8/10-bit** - As of the RK3588 series, there is no Rockchip SoC that supports AV1 encoder.
@@ -85,6 +85,8 @@ Please refer to these links:
- Rk3588/3588S supports up to 1080p@480fps or 4k@120fps transcoding.
- RK3576 has roughly half the transcoding capacity of RK3588. However, due to the pixel format limitations of its RGA hardware, it lacks tone-mapping capabilities.
- RK356x has the resolution limit of the encoder, which is 1080p@100fps. It cannot meet the needs of real-time 4k encoding.
- RK33xx and older are not recommended, their encoders are only H.264 1080p@30fps.
@@ -154,7 +156,7 @@ Root permission is required.
:::
- 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-2d267b0](https://github.com/tsukumijima/libmali-rockchip/releases/download/v1.9-1-2d267b0/libmali-valhall-g610-g13p0-gbm_1.9-1_arm64.deb).
- 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).
@@ -163,7 +165,7 @@ Root permission is required.
```shell
sudo /usr/lib/jellyfin-ffmpeg/ffmpeg -v debug -init_hw_device rkmpp=rk -init_hw_device opencl=ocl@rk
arm_release_ver: g13p0-01eac0, rk_so_ver: 10
arm_release_ver: g24p0-00eac0, rk_so_ver: 8
[AVHWDeviceContext @ 0xaaaae8321360] 1 OpenCL platforms found.
[AVHWDeviceContext @ 0xaaaae8321360] 1 OpenCL devices found on platform "ARM Platform".
[AVHWDeviceContext @ 0xaaaae8321360] 0.0: ARM Platform / Mali-G610 r0p0
@@ -195,7 +197,8 @@ Root permission is required.
```shell
sudo docker run -d \
--privileged \
--security-opt systempaths=unconfined \
--security-opt apparmor=unconfined \
--name=jellyfin \
--volume /path/to/config:/config \
--volume /path/to/cache:/cache \
@@ -307,7 +310,7 @@ LXC setup idea is a bit similar to docker - you need to pass the **device files*
### Verify On Linux
There is no reliable way to read the occupancy of the VPU on Rockchip SoC.
For the BSP kernel **older than 6.1.84**, there is no reliable way to read the load/utilization of the VPU on Rockchip SoC.
But you can still verify this by reading other engines, such as the RGA (2D hwaccel blitter).
@@ -319,7 +322,27 @@ Root permission is required.
1. Play a video in the Jellyfin web client and trigger a video transcoding by setting a lower resolution or bitrate.
2. Use `sudo watch -n 1 cat /sys/kernel/debug/rkrga/load` command to check the occupancy of RGA engines.
2. VPU load/utilization: run `sudo sh -c "echo 1000 > /proc/mpp_service/load_interval" && sudo watch -n 1 cat /proc/mpp_service/load`
```shell
Every 1.0s: cat /proc/mpp_service/load
fdb51000.avsd-plus load: 0.00% utilization: 0.00%
fdb50400.vdpu load: 0.00% utilization: 0.00%
fdb50000.vepu load: 0.00% utilization: 0.00%
fdb90000.jpegd load: 0.00% utilization: 0.00%
fdba0000.jpege-core load: 0.00% utilization: 0.00%
fdba4000.jpege-core load: 0.00% utilization: 0.00%
fdba8000.jpege-core load: 0.00% utilization: 0.00%
fdbac000.jpege-core load: 0.00% utilization: 0.00%
fdbb0000.iep load: 0.00% utilization: 0.00%
fdbd0000.rkvenc-core load: 98.26% utilization: 97.25%
fdbe0000.rkvenc-core load: 10.78% utilization: 10.69%
fdc38100.rkvdec-core load: 17.41% utilization: 17.09%
fdc48100.rkvdec-core load: 17.64% utilization: 17.30%
fdc70000.av1d load: 0.00% utilization: 0.00%
```
3. RGA load: run `sudo watch -n 1 cat /sys/kernel/debug/rkrga/load`
```shell
Every 1.0s: cat /sys/kernel/debug/rkrga/load
@@ -0,0 +1,5 @@
<!-- markdownlint-disable MD041 -->
## External Images
Please refer to the [external images section of the music docs](/docs/general/server/media/music#external-images) while we work on a comprehensive page for external images
+38
View File
@@ -0,0 +1,38 @@
<!-- markdownlint-disable MD041 -->
## 3D Videos
3D Videos are identified using flags in the file name. To identify 3D content by filename, the first tag is `3D`, which must be combined with one of the following tags to specify the specific 3D format:
| Format | Flag |
| ---------------------- | ------------- |
| half side by side | `hsbs` |
| full side by side | `fsbs` |
| half top and bottom | `htab` |
| full top and bottom | `ftab` |
| Multiview Video Coding | `mvc` |
| Anaglyph | Not Supported |
The tags are case-insensitive and must be surrounded by either a space, hyphen `-`, dot `.`, or underscore `_`.
```txt
Awesome 3D Movie (2022).3D.FTAB.mp4
Awesome 3D Movie (2022)_3D_htab.mp4
Awesome 3D Movie (2022)-3d-hsbs.mp4
```
```txt
S01E01 Some Episode.3d.ftab.mp4
S01E02 Some Other Episode.3d.ftab.mp4
S01E03 Yet another episode.3d.hsbs.mp4
```
Additionally, 3D filename tags can be combined with the grouping functionality in movie and music video libraries. All text before the hyphen must match the folder name.
```txt
Movies
└── Awesome 3D Movie (2022)
├── Awesome 3D Movie (2022) - 3D_FTAB.mp4
├── Awesome 3D Movie (2022) - 3D.hsbs.mp4
└── Awesome 3D Movie (2022) - 1080p.mp4
```
@@ -0,0 +1,107 @@
<!-- markdownlint-disable MD041 -->
## Extras
Extras can be added to movies, show series, show seasons, and music videos in a few different ways, as listed below.
### Extras Folders
One of the cleanest ways of adding extras is to place them in subfolders within your media folders.
Supported folder types are:
- `behind the scenes`
- `deleted scenes`
- `interviews`
- `scenes`
- `samples`
- `shorts`
- `featurettes`
- `clips`
- `other` - Generic catch all for extras of an unknown type.
- `extras` - Generic catch all for extras of an unknown type.
- `trailers`
```txt
Best_Movie_Ever (2019)
├── Best_Movie_Ever (2019).mp4
├── behind the scenes
│ └── Finding the right score.mp4
└── extras
└── Home recreation.mp4
```
```txt
Awesome TV Show (2024)
├── Season 1
│ ├── S01E01 episode name.mp4
│ └── trailers
│ └── trailer1.mp4
└── interviews
└── Interview with the Director.mp4
```
### File Name
Some types of extras support a special option if you only have a single of that type. These options are to name the filename a specific word when stored in the same folder.
Supported filenames are:
- `trailer`
- `sample`
- `theme` - Audio file of the theme song
```txt
Best_Movie_Ever (2019)
├── Best_Movie_Ever (2019) - 1080P.mp4
└── theme.mp3
```
```txt
Awesome TV Show (2024)
├── Season 1
│ ├── S01E01 episode name.mp4
│ └── theme.flac
└── sample.mp4
```
### File Suffix
If you would rather keep everything in a single folder, you can append special suffixes to the filename which Jellyfin picks up and uses to identify the file as an extra. Note that, with a few noted exceptions, these suffixes **DO NOT** contain any spaces.
<!-- markdownlint-disable MD038 -->
- `-trailer`
- `.trailer`
- `_trailer`
- ` trailer` - This is a space followed by the word `trailer`
- `-sample`
- `.sample`
- `_sample`
- ` sample` - This is a space followed by the word `sample`
- `-scene`
- `-clip`
- `-interview`
- `-behindthescenes`
- `-deleted`
- `-deletedscene`
- `-featurette`
- `-short`
- `-other`
- `-extra`
<!-- markdownlint-enable MD038 -->
```txt
Best_Movie_Ever (2019)
├── Best_Movie_Ever (2019) - 1080P.mp4
├── Preview Trailer.trailer.mp4
└── Making of The Best Movie Ever-behindthescenes.mp4
```
```txt
Awesome TV Show (2024)
├── Season 1
│ ├── S01E01 episode name.mp4
│ └── Preview Trailer.trailer.mp4
└── making of awesome tv show-behindthescenes.mp4
```
@@ -0,0 +1,39 @@
<!-- markdownlint-disable MD041 -->
## External Subtitles and Audio Tracks
External Subtitles and audio tracks can be added with file suffixes.
```txt
/Movies
/Film (1986)
Film.mkv
Film.default.srt
Film.default.en.forced.ass
Film.forced.en.dts
Film.en.sdh.srt
Film.English Commentary.en.mp3
```
```txt
/Shows
/Show (2021)
/Season 1
Show (2021) S01E01 Title.avi
Show (2021) S01E01 Title.ja.ass
Show (2021) S01E01 Title.commentary.ja.aac
```
Each title/flag field can be a generic string, or a special flag. A file can have multiple flags, separated with `.`
| Type | Flag |
| ---------------- | ------------------- |
| Default | `default` |
| Forced | `forced`, `foreign` |
| Hearing Impaired | `sdh`, `cc`, `hi` |
`hi` collides with the Hindi language abbreviation. `hi` by itself will resolve as a Hindi language track, while `hi` in addition to another language identifier (such as `title.en.hi.srt`) will use the other language and tag it as hearing impaired.
Flags are ignored on containers with more than one stream.
Any arbitrary text not parsable to a language or flag will be combined and used as the title of the stream (if there is not a stream title already embedded in the file metadata). The last file in the above example will be parsed as an English mp3 audio stream with the title `English Commentary`.
@@ -0,0 +1,7 @@
<!-- markdownlint-disable MD041 -->
Most common video formats are supported by Jellyfin, such as `mp4` and `mkv`. In addition, `VIDEO_TS` and `BDMV` folders are supported for movies and music videos. `VIDEO_TS` or `BDMV` folders do not support multiple versions, multiple parts or external subtitle/audio tracks.
`.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: `<`, `>`, `:`, `"`, `/`, `\`, `|`, `?`, `*`
@@ -0,0 +1,17 @@
<!-- markdownlint-disable MD041 -->
### Metadata providers
Jellyfin fetches information about the media automatically from external metadata providers. The following metadata providers are supported:
- [TheMovieDB (TMDB)](https://www.themoviedb.org/)
- [TheTVDB (TVDB)](https://www.thetvdb.com/) (Shows Only)
- [OMDb API (OMDB)](https://www.omdbapi.com/) (English Only)
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`
@@ -0,0 +1,41 @@
<!-- markdownlint-disable MD041 -->
## Multiple Parts
Content that is split into multiple files can be stacked together if named correctly. Files should be named as follows:
```txt
Movie Name (2010)
├── Movie Name-cd1.mkv
├── Movie Name-cd2.mkv
└── Movie Name-cd3.mkv
```
```txt
Show (2025)
└──Season 1
├── S01E01-part-1.mkv
└── S01E01-part-2.mkv
```
The separator is optional between `<parttype>` and `<partnumber>`. `<partnumber>` can be any number, or the letters a-d.
Supported part types are:
- `cd`
- `dvd`
- `part`
- `pt`
- `disc`
- `disk`
Supported separators are:
<!-- markdownlint-disable MD038 -->
- ` ` (space)
- `.` (period)
- `-` (dash)
- `_` (underscore)
This does not work with multiple versions or merging.
@@ -0,0 +1,33 @@
<!-- markdownlint-disable MD041 -->
## 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.
```txt
Movie (2021) [imdbid-tt12801262]
├── Movie (2021) [imdbid-tt12801262] - 2160p.mp4
├── Movie (2021) [imdbid-tt12801262] - 1080p.mp4
└── Movie (2021) [imdbid-tt12801262] - Directors Cut.mp4
```
To distinguish between versions, each filename needs to have a space, hyphen, space, and then a label. Labels are not predetermined and can be made up by the user. The hyphen is required. Periods, commas and other characters are not supported.
Labels can optionally be placed between brackets with the same result as seen below.
```txt
Movies
└── Best_Movie_Ever (2019)
├── Best_Movie_Ever (2019) - [1080P].mp4
├── Best_Movie_Ever (2019) - [720P].mp4
└── Best_Movie_Ever (2019) - [Directors Cut].mp4
```
If labels are not added to the end of filenames, as shown above, each file will be treated as a unique movie and not a version of the same movie.
Movie versions are presented in an alphabetically sorted list. An exception applies to resolution names, which are sorted in descending order from highest to lowest resolution. A version name qualifies as a resolution name when ending with either a `p` or an `i`. The first movie version in the list is the one selected by default. An example of sorting as seen below.
- Resolution sorting: `1080p`, `2160p`, `360p`, `480p`, `720p``2160p`, `1080p`, `720p`, `480p`, `360p`
- Named versions sorting: `Extended Cut`, `Cinematic Cut`, `Director's Cut``Cinematic Cut`, `Director's Cut`, `Extended Cut`
To group media manually, long-click or right-click media to highlight then select additional media to merge. Use the new bar that appears to 'Group Versions'.
@@ -1,84 +0,0 @@
---
uid: server-media-external-files
title: External files
---
# External files
Audio and subtitles will usually be embedded within your video container file (e.g. mkv), but the server also supports loading audio and subtitle streams from external files.
The server supports reading either single files or containers like mka (Matroska Audio) or mks (Matroska Subtitle) with one or more streams.
:::note
External audio files and containers are supported on Jellyfin 10.8 and later.
:::
## Naming
Jellyfin will search for external files that exactly match the video filename.
They can optionally include a language which will only be used if the language cannot be determined from the file metadata.
If multiple languages are defined within the filename the last one will be used and the others ignored.
### Simple example
```txt
/Movies
/Film (1946)
Film.mkv
Film.vtt
Film.aac
Film.mka
Film.mks
Film.en.ac3
Film.de.srt
Film.en.dts
Film.german.ac3
```
### Naming Flags
:::note
Support for naming flags is coming with the next feature release for Jellyfin. Until then it is recommended you avoid adding additional flags. This is especially true for `hi` flags (see note below).
:::
Additional flags can be appended to the filename (separated by the `.` delimiter) to add metadata. Supported metadata and flags are:
- Default: `default`
- Marks the stream as the default.
- Forced: `forced`, `foreign`
- Marks the subtitle stream as forced, typically used for translation of segments of audio/text that differ from the primary language.
- Hearing Impaired (Jellyfin 10.9+): `sdh`, `cc`, `hi`
- Indicates that the subtitle stream has additional information to help viewers that are hearing impaired.
:::note
`hi` collides with the Hindi language abbreviation. `hi` by itself will resolve as a Hindi language track, while `hi` in conjunction with another language identifier (such as `title.en.hi.srt`) will use the other language and tag it as hearing impaired.
:::
Flags are ignored on containers with more than one stream.
Any arbitrary text not parsable to a language or flag will be combined and used as the title of the stream (if there is not a stream title already embedded in the file metadata).
### Extended example with flags and stream title
```txt
/Movies
/Film (1986)
Film.mkv
Film.default.srt
Film.default.en.forced.ass
Film.forced.en.dts
Film.en.sdh.srt
Film.English Commentary.en.mp3
```
:::note
The last file will parse to an English mp3 audio stream with the title `English Commentary`.
:::
@@ -0,0 +1,8 @@
---
uid: server-media-mixed-movies-and-shows
title: Mixed Movies and Shows
---
# Mixed Movies and Shows
This library type is broken and deprecated. It is not recommended to use this.
+43 -265
View File
@@ -5,300 +5,78 @@ title: Movies
# Movies
Movies must be in the library root directory or in a subfolder for the individual films. Not following this structure may lead to misidentification or missing media. Subfolders allow for organization of metadata and images. Adding the year at the end in parentheses will yield the best results when scraping metadata.
Movies can be added to a Jellyfin server using the "Movies" library type.
:::tip
import VideoHeader from './\_video-header.md';
In order to help with identifying a movie, Jellyfin can make use of media provider identifiers. This can be specified in your movie's file or folder name, for example: `Film (2010) [imdbid-tt0106145].mp4` or `Film (2018) [tmdbid-65567]`
<VideoHeader />
:::
## Organization
```txt
Movies
├── Film (1990).mp4
├── Film (1994).mp4
├── Film (2008)
│   └── Film.mkv
└── Film (2010)
├── Film-cd1.avi
└── Film-cd2.avi
```
:::caution ISO Files and other Disc Images
While Jellyfin _should_ work with .iso files and other images, it is **explicitly** unsupported. It is recommended that those be extracted to BDMV or VIDEO_TS folders or remuxed to .mkv video files. Regardless of the source format, menus are not supported and only the main titles will be played.
:::
## Multiple Versions of a Movie
Multiple versions of a movie can be stored together and presented as a single title. Place each movie version in the same folder and give each version a name with the folder name as a prefix as seen below.
:::note
The prefix has to be an exact match of the folder name for the versioning to work, that includes any media provider identifiers such as `[imdbid-tt12801262]`
:::
Movies should be organized into individual folders for each movie. The folder can optionally contain extra files.
```txt
Movies
├── Best_Movie_Ever (2019)
│ ├── Best_Movie_Ever (2019) - 1080P.mp4
│ ├── Best_Movie_Ever (2019) - 720P.mp4
── Best_Movie_Ever (2019) - Directors Cut.mp4
│ ├── Best_Movie_Ever (2019).mp4
│ ├── Best_Movie_Ever (2019).nfo
── Best_Movie_Ever (2019).en_us.srt
│ ├── cover.png
│ └── theme.mp3
└── Movie (2021) [imdbid-tt12801262]
├── Movie (2021) [imdbid-tt12801262] - 2160p.mp4
── Movie (2021) [imdbid-tt12801262] - 1080p.mp4
└── Movie (2021) [imdbid-tt12801262] - Directors Cut.mp4
├── backdrop.jpg
── VIDEO_TS
├── VIDEO_TS.BUP
├── VIDEO_TS.IFO
├── VIDEO_TS.VOB
├── VTS_01_0.BUP
├── VTS_01_0.IFO
├── VTS_01_0.VOB
├── VTS_01_1.VOB
└── VTS_01_2.VOB
```
To distinguish between versions, each filename needs to have a space, hyphen, space, and then a label. Labels are not predetermined and can be made up by the user.
### Naming
:::note
The hyphen is required. Periods, commas and other characters are not supported.
:::
Additionally, labels can be placed between brackets with the same result as seen below.
The folder containing the movie should be named in the following format:
```txt
Movies
└── Best_Movie_Ever (2019)
├── Best_Movie_Ever (2019) - [1080P].mp4
├── Best_Movie_Ever (2019) - [720P].mp4
└── Best_Movie_Ever (2019) - [Directors Cut].mp4
Movie Name (year) [external id]
```
If labels are not added to the end of filenames, as shown above, each file will be treated as a unique movie and not a version of the same movie.
The `year` and `external id` fields are optional, but they will help identify media more reliably.
### Order of Versions
The video files within the folder should have the same name has 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.
Movie versions are presented in an alphabetically sorted list. An exception applies to resolution names, which are sorted in descending order from highest to lowest resolution. A version name qualifies as a resolution name when ending with either a `p` or an `i`.
- 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`
:::note
import VideoMetadataProviders from './\_video-metadata-providers.md';
The first movie version in the list is the one selected by default.
<VideoMetadataProviders />
:::
import ExternalStreams from './\_video-external-streams.md';
#### Examples of Sorting
<ExternalStreams />
- `1080p`, `2160p`, `360p`, `480p`, `720p``2160p`, `1080p`, `720p`, `480p`, `360p`
- `Extended Cut`, `Cinematic Cut`, `Director's Cut``Cinematic Cut`, `Director's Cut`, `Extended Cut`
import Multiversion from './\_video-multiversion.md';
:::note
<Multiversion />
To group media manually, long-click or right-click media to highlight then select additional media to merge. Use the new bar that appears to 'Group Versions'.
import Video3D from './\_video-3d.md';
:::
<Video3D />
## Movies Split Across Multiple Parts
import Multipart from './\_video-multipart.md';
Movies that are split into multiple files can be stacked together if named correctly. Files should be named as follows:
<Multipart />
- `Movie Name (2010)/Movie Name<separator><parttype><separator><partnumber>.mkv`
import ExternalExtras from './\_video-external-extras.md';
The separator is optional between `<parttype>` and `<partnumber>`. `<partnumber>` can be any number, or the letters a-d.
<ExternalExtras />
Supported part types are:
import ExternalImages from './\_external-images.md';
- `cd`
- `dvd`
- `part`
- `pt`
- `disc`
- `disk`
Supported separators are:
- `(space)`
- `. (period)`
- `- (dash)`
- `_ (underscore)`
:::note
This does not work in conjunction with multiple versions or merging.
:::
## Movie Extras
Movie extras can include deleted scenes, interviews, and other various things that you would want to include alongside your movie. Jellyfin supports several different methods of adding these files.
### Extras Folders
One of the cleanest ways of adding extras is to place them in subfolders within your movie folder.
Supported folder types are:
- `behind the scenes`
- `deleted scenes`
- `interviews`
- `scenes`
- `samples`
- `shorts`
- `featurettes`
- `clips`
- `other` - Generic catch all for extras of an unknown type.
- `extras` - Generic catch all for extras of an unknown type.
- `trailers`
```txt
Movies
└── Best_Movie_Ever (2019)
├── Best_Movie_Ever (2019) - 1080P.mp4
├── Best_Movie_Ever (2019) - 720P.mp4
├── Best_Movie_Ever (2019) - Directors Cut.mp4
├── behind the scenes
│ ├── Making of the Best Movie Ever.mp4
│ └── Finding the right score.mp4
├── interviews
│ └── Interview with the Director.mp4
└── extras
└── Home recreation.mp4
```
### File Name
Some types of extras support a special option if you only have a single of that type. These options are to name the filename a specific word when stored in the same folder as the movie.
Supported filenames are:
- `trailer`
- `sample`
- `theme` - Audio file of the theme song
```txt
Movies
└── Best_Movie_Ever (2019)
├── Best_Movie_Ever (2019) - 1080P.mp4
├── sample.mp4
├── theme.mp3
└── trailer.mp4
```
### File Suffix
If you would rather keep everything in a single folder, you can append special suffixes to the filename which Jellyfin picks up and uses to identify the file as an extra. Note that, with a few noted exceptions, these suffixes **DO NOT** contain any spaces.
<!-- markdownlint-disable MD038 -->
- `-trailer`
- `.trailer`
- `_trailer`
- ` trailer` - This is a space followed by the word `trailer`
- `-sample`
- `.sample`
- `_sample`
- ` sample` - This is a space followed by the word `sample`
- `-scene`
- `-clip`
- `-interview`
- `-behindthescenes`
- `-deleted`
- `-deletedscene`
- `-featurette`
- `-short`
- `-other`
- `-extra`
<!-- markdownlint-enable MD038 -->
```txt
Movies
└── Best_Movie_Ever (2019)
├── Best_Movie_Ever (2019) - 1080P.mp4
├── That clip that I want everyone to see-clip.mp4
├── Release Trailer-trailer.mp4
├── Preview Trailer.trailer.avi
├── Release Trailer 2_trailer.avi
├── Teaser.sample.mp4
├── Favorite Scene-scene.mp4
├── The Best Ever-clip.mp4
├── Making of The Best Movie Ever-behindthescenes.mp4
├── Not the best scene-deleted.mp4
├── Theme Song Music Video-featurette.mp4
└── Art of the Best Movie Ever-short.mp4
```
## 3D Movies
The parser can recognize 3D files automatically if the proper tags are added to the file name, or you can manually assign the 3D attribute to a file using Jellyfin's metadata editor to select the correct 3D format. The metadata editor is accessible from the context menu on each item.
To identify 3D content by filename, the first tag is `3D`, which must be combined with one of the following tags to specify the specific 3D format:
- `hsbs` = half side by side
- `fsbs` = full side by side
- `htab` = half top and bottom
- `ftab` = full top and bottom
- `mvc` = Multiview Video Coding
The tags are case-insensitive and must be surrounded by either a space, hyphen `-`, dot `.` or underscore `_`.
```txt
Awesome 3D Movie (2022).3D.FTAB.mp4
```
```txt
Awesome 3D Movie (2022)_3D_htab.mp4
```
```txt
Awesome 3D Movie (2022)-3d-hsbs.mp4
```
Additionally, 3D filename tags can be combined with the grouping functionality documented above. All text before the hyphen must match the folder name.
```txt
Movies
└── Awesome 3D Movie (2022)
├── Awesome 3D Movie (2022) - 3D_FTAB.mp4
├── Awesome 3D Movie (2022) - 3D.hsbs.mp4
└── Awesome 3D Movie (2022) - 1080p.mp4
```
:::note
There is no tag for anaglyph 3D content.
:::
## Images
The following files may also be embedded into video containers that support it (such as mkv) and will be read out by the `Embedded Image Extractor` if enabled as an `Image Extractor` on the library configuration page.
### Poster
- folder.ext
- poster.ext
- cover.ext
- default.ext
- movie.ext
Examples:
Movie (2010)/poster.jpg
### Backdrop
- backdrop.ext
- fanart.ext
- background.ext
- art.ext
- extrafanart/\*.ext
Examples:
Movie (2010)/fanart.jpg _for the first backdrop image_
Movie (2010)/extrafanart/fanart1.jpg, Movie (2010)/extrafanart/fanart2.jpg, _etc for additional backdrop images_
### Logo
- logo.ext
- clearlogo.ext
Example:
Movie (2010)/logo.png
<ExternalImages />
+36 -7
View File
@@ -1,14 +1,19 @@
---
uid: server-media-music-videos
title: Music videos
title: Music Videos
---
# Music videos
# Music Videos
The `Music videos` library type can be used to organize music videos.
Music videos can be added to a Jellyfin server using the "Music Videos" library type.
The music videos are organized into folders, and the folder structure will be presented
directly to the users.
import VideoHeader from './\_video-header.md';
<VideoHeader />
## Organization
Music videos are organized mostly the same as movies, with a few key differences - no external metadata providers are available by default, and multi layer folders are supported.
```txt
MusicVideos
@@ -30,6 +35,30 @@ MusicVideos
└── Song 4.avi
```
No metadata scraping from online providers will be performed. By default, the file names will be used as the title, and the last modified date of the files on the file system will be used as the release date. Jellyfin can be configured to use Embedded titles when they are present instead.
### Naming
NFO files can be provided to provide information such as Title, Artist and Release Date. NFO files will take priority over other sources when they are present.
The folders and video files can be named however you want, since no metadata fetching is performed. The folder and file names will be displayed as the name of the item in Jellyfin.
import ExternalStreams from './\_video-external-streams.md';
<ExternalStreams />
import Multiversion from './\_video-multiversion.md';
<Multiversion />
import Video3D from './\_video-3d.md';
<Video3D />
import Multipart from './\_video-multipart.md';
<Multipart />
import ExternalExtras from './\_video-external-extras.md';
<ExternalExtras />
import ExternalImages from './\_external-images.md';
<ExternalImages />
+36 -216
View File
@@ -1,17 +1,19 @@
---
uid: server-media-shows
title: Shows
title: TV Shows
---
# Shows
# TV Shows
The most common naming scheme for shows is categorizing the files by series and then season. Another common method is simply using series folders, especially for shows that are organized by air date and those without seasons. Adding the year at the end in parentheses will yield the best results when scraping metadata.
TV Shows can be added to Jellyfin using the "Shows" library type.
:::tip
import VideoHeader from './\_video-header.md';
In order to help with identifying a series, Jellyfin can make use of media provider identifiers. This can be specified in your show's folder name, for example: `Series Name (2018) [tmdbid-65567]` or `Series Name (2018) [tvdbid-65567]` (`imdbid` is not supported for shows)
<VideoHeader />
:::
## Organization
Shows should be organized into series folders, then into season folders under each series.
```txt
Shows
@@ -38,36 +40,43 @@ Shows
└── Series Name B S02E03.mkv
```
:::note
Each video file may contain multiple episodes. However, they will be shown as a single entry containing metadata from multiple episodes. It is recommended that the video files be split into individual episodes using a tool like [MKVToolNix](https://mkvtoolnix.download)
Avoid special characters such as \* in M\*A\*S\*H, use MASH instead.
### Naming
:::
The series folder should be named in the following format:
:::note
```txt
Series Name (year) [external id]
```
Do not mix episodes inside season folders and episodes on the Series root folder.
The `year` and `external id` fields are optional, but they will help identify media more reliably.
Do not abbreviate the Season folder with `S01` or `SE01` or alike.
- 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]`
:::
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`.
:::note
import VideoMetadataProviders from './\_video-metadata-providers.md';
Season folders shouldn't contain the series name, otherwise Jellyfin can in certain cases (Stargate SG-1 due to the dash and one, for instance) misdetect your episodes and put them all under the same season.
<VideoMetadataProviders />
:::
import ExternalStreams from './\_video-external-streams.md';
## Show Specials
<ExternalStreams />
import ExternalExtras from './\_video-external-extras.md';
<ExternalExtras />
### Show Specials
Show specials can be added in the `Season 00` folder. If supported by your metadata provider those files will be matched. In case your metadata provider does not provide information about the special, it is recommended to use a name which describes the content of the special instead of naming it `Series Name S00Exy.mkv`. This is done to avoid wrong metadata being pulled for the special and to provide a proper presentation.
:::note
Episode numbering for specials may vary from metadata provider to metadata provider.
:::
Specials can also be shown within a season if so desired. This can be helpful when they are part of a continued storyline during the season. This requires 2 settings:
1. The option `Display specials within their series they aired in` under `Dashboard -> Library -> Display` must be enabled
@@ -80,203 +89,14 @@ Specials can also be shown within a season if so desired. This can be helpful wh
Note that this will show them in both the `Specials` season, as well as the season specified.
## Episodes Split Across Multiple Parts
import Video3D from './\_video-3d.md';
Episodes that are split into multiple files can be stacked together if named correctly. Files should be named as follows:
<Video3D />
- `Series Name (2010)/Season 02/Series Name (2010) S02E01<separator><parttype><separator><partnumber>.mkv`
import Multipart from './\_video-multipart.md';
The separator is optional between `<parttype>` and `<partnumber>`. `<partnumber>` can be any number, or the letters a-d.
<Multipart />
Supported part types are:
import ExternalImages from './\_external-images.md';
- `cd`
- `dvd`
- `part`
- `pt`
- `disc`
- `disk`
Supported separators are:
- `(space)`
- `. (period)`
- `- (dash)`
- `_ (underscore)`
## Show Extras
Show extras can include deleted scenes, interviews, and other various things that you would want to include alongside your show. Extras can be added at both the series and season level. Jellyfin supports several different methods of adding these files.
:::note
Season level extras are only supported when season folders are used.
:::
### Extras Folders
One of the cleanest ways of adding extras is to place them in subfolders within your show or season folder.
Supported folder types are:
- `behind the scenes`
- `deleted scenes`
- `interviews`
- `scenes`
- `samples`
- `shorts`
- `featurettes`
- `clips`
- `other` - Generic catch all for extras of an unknown type.
- `extras` - Generic catch all for extras of an unknown type.
- `trailers`
```txt
Shows
└── Series Name (2010)
├── Season 01
│ ├── Series Name S01E01.mkv
│ ├── Series Name S01E02.mkv
│ ├── featurettes
│ │ └── Some Featurette.mkv
│ └── interviews
│ └── Interview with the Director.mp4
├── Season 02
│ ├── Series Name S02E01.mkv
│ ├── Series Name S02E02.mkv
│ └── behind the scenes
│ └── Behind the Scenes.mp4
└── extras
└── Fantastic Extra.mkv
```
### File Suffix
If you would rather keep everything in a single folder, you can append special suffixes to the filename which Jellyfin picks up and uses to identify the file as an extra. Unless noted, these suffixes **DO NOT** contain any spaces.
<!-- markdownlint-disable MD038 -->
- `-trailer`
- `.trailer`
- `_trailer`
- ` trailer` - This is a space followed by the word `trailer`
- `-scene`
- `-clip`
- `-interview`
- `-behindthescenes`
- `-deleted`
- `-deletedscene`
- `-featurette`
- `-short`
- `-other`
- `-extra`
<!-- markdownlint-enable MD038 -->
```txt
Shows
└── Series Name (2010)
├── Season 01
│ ├── Series Name S01E01.mkv
│ ├── Series Name S01E02.mkv
│ ├── Alternate Ending-deleted.mkv
│ └── Interview with the Director-interview.mp4
└── Fantastic Extra-extra.mkv
└── Making the Show-featurette.mp4
```
:::note
Trailers support a special option if you only have a single file of that type per series/season. The option is to name the filename 'trailer.ext' when stored in the same folder as the series or season.
:::
## 3D Videos
Please refer to ['3D Movies' in the movies section](/docs/general/server/media/movies#3d-movies)
## Images
Posters, Backdrops, and Logos may also be embedded into video containers that support it (such as mkv) and will be read out by the `Embedded Image Extractor` if enabled as an `Image Extractor` on the library configuration page.
### Poster
- folder.ext
- poster.ext
- cover.ext
- default.ext
- show.ext
Examples:
- Series Name:
- Series Name (2010)/poster.jpg
- Season posters:
- Numbered seasons:
- Series Name (2010)/Season 01/cover.jpg
- Series Name (2010)/season1-poster.jpg
- Specials:
- Series Name (2010)/season-specials-poster.jpg
### Backdrop
- backdrop.ext
- fanart.ext
- background.ext
- art.ext
- extrafanart/\*.ext
Examples:
Series Name (2010)/fanart.jpg _for the first backdrop image_
Series Name (2010)/extrafanart/fanart1.jpg, Series Name (2010)/extrafanart/fanart2.jpg, _etc for additional backdrop images_
### Banner
- banner.ext
Example:
Series Name (2010)/banner.jpg
### Thumb
- thumb.ext
- landscape.ext
Examples:
Series Name (2010)/landscape.jpg
Series Name (2010)/Season 01/episode filename-thumb.jpg _for the thumbnail of an episode named "episode filename.mkv"_
### Logo
- logo.ext
- clearlogo.ext
Example:
Series Name (2010)/logo.png
## Other
### Theme Videos
- backdrops/\*
Example:
Series Name (2010)/backdrops/S1Intro.ext
### Theme Music
- theme.ext
- theme-music/\*
Examples:
Series Name (2010)/theme.ext
Series Name (2010)/theme-music/intro-song.ext
<ExternalImages />
+1 -1
View File
@@ -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 moves, 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 |
+51 -10
View File
@@ -5,24 +5,65 @@ title: Quick Connect
# Quick Connect
Starting with Jellyfin server version 10.7.0 and supported clients, you can use Quick Connect to sign into your account without the need of a password. You need to previously be logged into a supported client, like the default Jellyfin Web Client.
**Quick Connect** is a feature that allows users to sign in to clients **without entering a username or password**. Instead, a temporary **Quick Connect code** is generated and used to authorize login from an already authenticated client.
## Enabling Quick Connect
This feature streamlines the sign-in process, especially on devices with limited input options (like TVs or set-top boxes).
To use Quick Connect, the Jellyfin server admin has to enable this feature in the server dashboard.
## Disabling Quick Connect (Server)
Settings > Dashboard > General > Enable Quick Connect on this server
By default, Quick Connect is enabled.
To disable it, follow these steps:
1. Go to the **Admin Dashboard** on your Jellyfin server.
`Settings` > `Dashboard`
2. Navigate to the **General** Tab
3. Uncheck the box:
**Enable Quick Connect on this server**
## Supported Clients
Quick Connect functionality is supported in two contexts:
| Client | Log In | Authorize Others |
|----------------------|--------|------------------|
| JellyCon | ✅ | ❌ |
| Jellyfin Android | ✅ | ✅ |
| Jellyfin Android TV | ✅ | ❌ |
| Jellyfin Kodi | ❌ | ❌ |
| Jellyfin Media Player| ✅ | ✅ |
| Jellyfin Mobile (iOS)| ✅ | ✅ |
| Jellyfin MPV Shim | ❌ | ❌ |
| Jellyfin Roku | ✅ | ❌ |
| Jellyfin UWP | ✅ | ✅ |
| Jellyfin Vue | ❌ | ❌ |
| Jellyfin Web | ✅ | ✅ |
| Jellyfin WebOS | ✅ | ✅ |
| Swiftfin (iOS) | ✅ | ✅ |
| Swiftfin (tvOS) | ✅ | ❌ |
## Using Quick Connect
To sign in to a supported client, you have to enter the Quick Connect code in your user settings.
The Quick Connect process involves two devices:
Settings > Quick Connect
- **Device A**: A new client where you want to log in.
- **Device B**: An already authenticated client (such as your browser, phone, etc.).
![Quick Connect sign in](https://user-images.githubusercontent.com/12074633/115973526-aecc6000-a523-11eb-9ed6-59bee41bac7b.png)
### On Device A (New Device - the one you want to log into)
If the code is validated successfully, your new device will be signed in without entering your Jellyfin username or password on the new device.
1. Open the Jellyfin client and choose **Quick Connect** (usually found on the login screen).
On some clients, you will first need to press **Manual Login**; others may display the quick-connect code directly.
2. A **6-character code** will be displayed. Keep this screen open.
The client will generate a 6 digit code, which you have to enter in the already signed in client in your user settings.
![Quick Connect code example](/images/docs/server/quick-connect/quick-connect-code.png)
![Quick Connect error](https://user-images.githubusercontent.com/12074633/115973542-c99ed480-a523-11eb-9d61-17ccd628e123.png)
### On Device B (Already Logged-In Device)
1. Open Jellyfin and go to:
`Settings` > `Quick Connect`
2. Enter the 6-character code from Device A and confirm.
3. If successful, Device A will be logged in automatically—no need to enter a username or password.
![Quick Connect code entry screen](/images/docs/server/quick-connect/quick-connect-entry.png)
> If the code is invalid or expired, you will see an error message and must try again.
@@ -121,6 +121,8 @@ These options allow you to restrict access to specific content by this user or t
`Block items with tags` Allows you to always hide items when they contain specific tags, you can add tags to items by editing their metadata.
`Allow items with tags` Allows you to only show items that contain specific tags, you can add tags to items by editing their metadata.
`Access Schedule` Allows you to set the timeframe(s) where this user is allowed to login, media can only play during the timeframe and will be stopped past it.
### Password
+4 -2
View File
@@ -13,8 +13,10 @@ const config: Config = {
tagline: 'The Free Software Media System',
url: 'https://jellyfin.org',
baseUrl: '/',
onBrokenLinks: 'warn',
onBrokenMarkdownLinks: 'warn',
onBrokenAnchors: process.env.CI ? 'throw' : 'warn',
onBrokenLinks: process.env.CI ? 'throw' : 'warn',
onBrokenMarkdownLinks: process.env.CI ? 'throw' : 'warn',
onDuplicateRoutes: process.env.CI ? 'throw' : 'warn',
favicon: 'images/favicon.ico',
organizationName: 'jellyfin',
projectName: 'jellyfin.org',
+57
View File
@@ -0,0 +1,57 @@
import { globalIgnores } from 'eslint/config';
import react from 'eslint-plugin-react';
import reactHooks from 'eslint-plugin-react-hooks';
import ts from 'typescript-eslint';
import jsxA11Y from 'eslint-plugin-jsx-a11y';
import globals from 'globals';
export default ts.config([
globalIgnores([
'node_modules',
'build',
'**/.docusaurus',
'**/.cache-loader',
'**/.DS_Store',
'**/.env.local',
'**/.env.development.local',
'**/.env.test.local',
'**/.env.production.local',
'**/npm-debug.log*',
'**/yarn-debug.log*',
'**/yarn-error.log*',
'**/*.json'
]),
react.configs.flat.recommended,
reactHooks.configs['recommended-latest'],
...ts.configs.recommended,
jsxA11Y.flatConfigs.recommended,
{
languageOptions: {
globals: {
...globals.browser,
...globals.node,
JSX: 'readonly'
},
ecmaVersion: 12,
sourceType: 'module',
parserOptions: {
ecmaFeatures: {
jsx: true
}
}
},
settings: {
react: {
version: 'detect'
}
},
rules: {
'no-unused-vars': 'off',
'@typescript-eslint/no-unused-vars': 'error'
}
}
]);
+1586 -2144
View File
File diff suppressed because it is too large Load Diff
+29 -29
View File
@@ -21,18 +21,18 @@
"test:web-urls": "node ./scripts/check-urls.mjs ./scripts/data/jellyfin-web-urls.json"
},
"dependencies": {
"@docusaurus/core": "3.7.0",
"@docusaurus/plugin-client-redirects": "3.7.0",
"@docusaurus/plugin-content-blog": "3.7.0",
"@docusaurus/plugin-content-docs": "3.7.0",
"@docusaurus/plugin-content-pages": "3.7.0",
"@docusaurus/plugin-sitemap": "3.7.0",
"@docusaurus/plugin-svgr": "3.7.0",
"@docusaurus/theme-classic": "3.7.0",
"@docusaurus/theme-mermaid": "3.7.0",
"@easyops-cn/docusaurus-search-local": "0.49.2",
"@docusaurus/core": "3.8.1",
"@docusaurus/plugin-client-redirects": "3.8.1",
"@docusaurus/plugin-content-blog": "3.8.1",
"@docusaurus/plugin-content-docs": "3.8.1",
"@docusaurus/plugin-content-pages": "3.8.1",
"@docusaurus/plugin-sitemap": "3.8.1",
"@docusaurus/plugin-svgr": "3.8.1",
"@docusaurus/theme-classic": "3.8.1",
"@docusaurus/theme-mermaid": "3.8.1",
"@easyops-cn/docusaurus-search-local": "0.51.1",
"@fontsource/noto-sans": "5.2.7",
"@icons-pack/react-simple-icons": "12.8.0",
"@icons-pack/react-simple-icons": "13.3.0",
"@img-comparison-slider/react": "8.0.2",
"@mdi/js": "7.4.47",
"@mdi/react": "1.6.1",
@@ -43,8 +43,8 @@
"file-loader": "6.2.0",
"react": "18.3.1",
"react-dom": "18.3.1",
"sass": "1.89.0",
"swiper": "11.2.7",
"sass": "1.89.2",
"swiper": "11.2.10",
"url-loader": "4.1.1"
},
"browserslist": {
@@ -60,26 +60,26 @@
]
},
"devDependencies": {
"@docusaurus/module-type-aliases": "3.7.0",
"@docusaurus/tsconfig": "3.7.0",
"@types/react": "18.3.22",
"@docusaurus/module-type-aliases": "3.8.1",
"@docusaurus/tsconfig": "3.8.1",
"@eslint/js": "9.30.1",
"@types/react": "18.3.23",
"@types/react-helmet": "6.1.11",
"@types/react-router-dom": "5.3.3",
"@typescript-eslint/eslint-plugin": "7.1.1",
"@typescript-eslint/parser": "7.1.1",
"eslint": "8.57.0",
"eslint-config-prettier": "9.1.0",
"eslint-config-standard": "17.1.0",
"eslint-plugin-import": "2.29.1",
"eslint-plugin-jsx-a11y": "6.8.0",
"eslint-plugin-node": "11.1.0",
"eslint-plugin-prettier": "5.1.3",
"eslint-plugin-promise": "6.1.1",
"eslint-plugin-react": "7.34.0",
"eslint-plugin-react-hooks": "4.6.0",
"eslint": "9.30.1",
"eslint-config-prettier": "10.1.5",
"eslint-plugin-import": "2.32.0",
"eslint-plugin-jsx-a11y": "6.10.2",
"eslint-plugin-n": "17.21.0",
"eslint-plugin-prettier": "5.5.1",
"eslint-plugin-promise": "7.2.1",
"eslint-plugin-react": "7.37.5",
"eslint-plugin-react-hooks": "5.2.0",
"globals": "16.3.0",
"node-fetch": "3.3.2",
"prettier": "3.5.3",
"prettier": "3.6.2",
"typescript": "5.8.3",
"typescript-eslint": "8.35.1",
"typescript-plugin-css-modules": "5.1.0"
}
}
+11 -7
View File
@@ -8,8 +8,12 @@ const redirects: ClientRedirects.Options['redirects'] = [
},
// Jellyfin 10.8 and below linked to this subtitle docs page
{
from: ['/docs/general/server/media/subtitles', '/docs/general/server/media/subtitles.html'],
to: '/docs/general/server/media/external-files'
from: [
'/docs/general/server/media/subtitles',
'/docs/general/server/media/subtitles.html',
'/docs/general/server/media/external-files'
],
to: '/docs/general/server/media/movies#external-subtitles-and-audio-racks'
},
// Storage docs moved from the server guide to administrative docs
{
@@ -46,7 +50,7 @@ const redirects: ClientRedirects.Options['redirects'] = [
// "traefik2" moved
{
from: ['/docs/general/networking/traefik2', '/docs/general/networking/traefik'],
to: '/docs/general/post-install/networking/advanced/traefik'
to: '/docs/general/post-install/networking/reverse-proxy/traefik'
},
// Internet radio moved to live tv
{
@@ -78,11 +82,11 @@ const redirects: ClientRedirects.Options['redirects'] = [
},
{
from: '/docs/general/networking/apache',
to: '/docs/general/post-install/networking/advanced/apache'
to: '/docs/general/post-install/networking/reverse-proxy/apache'
},
{
from: '/docs/general/networking/caddy',
to: '/docs/general/post-install/networking/caddy'
to: '/docs/general/post-install/networking/reverse-proxy/caddy'
},
{
from: '/docs/general/networking/dlna',
@@ -94,7 +98,7 @@ const redirects: ClientRedirects.Options['redirects'] = [
},
{
from: '/docs/general/networking/haproxy',
to: '/docs/general/post-install/networking/advanced/haproxy'
to: '/docs/general/post-install/networking/reverse-proxy/haproxy'
},
{
from: '/docs/general/networking/letsencrypt',
@@ -106,7 +110,7 @@ const redirects: ClientRedirects.Options['redirects'] = [
},
{
from: '/docs/general/networking/nginx',
to: '/docs/general/post-install/networking/advanced/nginx'
to: '/docs/general/post-install/networking/reverse-proxy/nginx'
},
// quick start replaced with post install
{
+1
View File
@@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-require-imports */
const fs = require('fs');
const path = require('path');
+7 -2
View File
@@ -1,5 +1,4 @@
import {
SiAmazonfiretv,
SiAndroid,
SiApple,
SiAppletv,
@@ -71,7 +70,13 @@ const PlatformIcon = ({
return <SiFedora size={size} className={className} />;
case Platform.FireOS:
return <SiAmazonfiretv size={size} className={className} />;
// Not available in simple-icons because it was removed (https://github.com/simple-icons/simple-icons/pull/13056)
// using the SVG from an older version instead
return (
<svg xmlns='http://www.w3.org/2000/svg' width={size} height={size} className={className} viewBox='0 0 24 24'>
<path d='M20.196 15.12c.265.337-.294 1.73-.542 2.353-.077.19.085.266.257.123 1.106-.926 1.39-2.867 1.166-3.149-.226-.277-2.16-.516-3.341.314-.183.127-.151.304.05.279.665-.08 2.147-.257 2.41.08m-.858.981c-2.064 1.523-5.056 2.333-7.632 2.333-3.611 0-6.862-1.334-9.322-3.555-.194-.176-.02-.414.21-.28 2.655 1.545 5.939 2.477 9.328 2.477 2.287 0 4.803-.476 7.115-1.458.348-.147.642.231.3.483m2.034-3.155a.388.388 0 0 1-.201-.04c-.041-.026-.087-.1-.133-.225l-1.734-4.355a1.79 1.79 0 0 0-.046-.117.266.266 0 0 1-.023-.108c0-.084.049-.128.146-.128h.58c.098 0 .165.014.205.04.04.026.082.102.127.226l1.344 3.823 1.343-3.823c.046-.124.089-.2.128-.226a.402.402 0 0 1 .205-.04h.54c.1 0 .148.044.148.128a.3.3 0 0 1-.025.108c-.016.04-.032.078-.044.117l-1.727 4.355c-.045.124-.09.199-.132.225a.388.388 0 0 1-.201.04zm-3.644.068c-.929 0-1.392-.463-1.392-1.392V8.739h-.706c-.13 0-.197-.066-.197-.196v-.246a.22.22 0 0 1 .045-.147c.03-.031.086-.055.171-.067l.717-.09.127-1.215c.013-.13.082-.196.207-.196h.41c.13 0 .196.066.196.196v1.196h1.276c.13 0 .195.065.195.197v.372c0 .13-.064.196-.195.196h-1.276v2.834c0 .243.055.411.162.51.108.098.293.147.555.147.124 0 .277-.016.46-.049.099-.02.164-.03.197-.03.052 0 .088.014.108.044.02.03.029.077.029.142v.266a.366.366 0 0 1-.04.19c-.026.043-.078.078-.157.103a3.018 3.018 0 0 1-.892.118m-4.665-2.976c.006-.052.011-.137.011-.255 0-.399-.094-.698-.28-.901-.186-.204-.46-.306-.818-.306-.412 0-.732.123-.962.369-.228.245-.36.61-.392 1.093zm-.942 3.07c-.803 0-1.411-.222-1.824-.667-.412-.444-.616-1.102-.616-1.972 0-.83.204-1.475.616-1.937.413-.46.988-.691 1.728-.691.62 0 1.098.176 1.432.524.332.351.5.846.5 1.487 0 .21-.017.422-.05.638-.014.077-.034.13-.064.156-.029.027-.077.04-.142.04h-3.08c.013.563.154.977.418 1.245.265.268.674.403 1.23.403.196 0 .385-.014.564-.04a5.04 5.04 0 0 0 .682-.166l.117-.035a.284.284 0 0 1 .09-.016c.085 0 .125.06.125.177v.276c0 .085-.012.144-.037.18a.441.441 0 0 1-.167.114 3.38 3.38 0 0 1-.701.205 4.236 4.236 0 0 1-.82.079m-5.424-.147c-.13 0-.195-.066-.195-.197v-4.58c0-.13.064-.195.195-.195h.432c.064 0 .116.012.153.039.036.025.06.076.072.146l.07.55c.176-.19.343-.34.499-.452a1.725 1.725 0 0 1 1.02-.323c.079 0 .158.003.235.01.112.014.168.072.168.176v.53c0 .117-.058.177-.178.177-.058 0-.114-.004-.17-.01a1.638 1.638 0 0 0-.18-.01c-.524 0-.973.157-1.346.47v3.472c0 .131-.066.197-.195.197zm-2.249 0c-.13 0-.196-.066-.196-.197v-4.58c0-.13.066-.195.196-.195h.579c.13 0 .195.064.195.195v4.58c0 .131-.065.197-.195.197zm.295-5.856c-.19 0-.339-.054-.447-.16a.581.581 0 0 1-.161-.428c0-.176.054-.318.16-.426.11-.109.257-.163.448-.163.189 0 .337.054.446.163.107.108.16.25.16.426a.581.581 0 0 1-.16.427.608.608 0 0 1-.446.161m-3.625 5.856c-.132 0-.197-.066-.197-.197v-4.01H.195c-.13 0-.195-.066-.195-.197v-.245c0-.065.014-.114.043-.147.03-.033.088-.055.173-.07l.705-.087v-.804c0-1.091.523-1.638 1.57-1.638.248 0 .51.036.784.109.072.019.122.047.152.088.029.038.044.107.044.205v.255c0 .124-.048.186-.148.186-.058 0-.14-.01-.248-.029-.11-.02-.23-.03-.369-.03-.3 0-.51.057-.633.172-.121.115-.181.303-.181.564v.903h1.324c.131 0 .197.064.197.195v.373c0 .13-.066.197-.197.197H1.892v4.01c0 .131-.065.197-.196.197Z' />
</svg>
);
case Platform.Gentoo:
return <SiGentoo size={size} className={className} />;
+8 -2
View File
@@ -1,7 +1,7 @@
import Link from '@docusaurus/Link';
import clsx from 'clsx';
import React from 'react';
import { SiAndroid, SiApple, SiRoku, SiAmazon, SiKodi } from '@icons-pack/react-simple-icons';
import { SiAndroid, SiApple, SiRoku, SiKodi } from '@icons-pack/react-simple-icons';
import Icon from '@mdi/react';
import { mdiPlusThick, mdiMonitor, mdiWeb } from '@mdi/js';
@@ -52,7 +52,13 @@ export default function ClientSection() {
to='/downloads/clients?platform=Fire TV'
className={clsx('col', 'fill--white', styles['client-icon'], 'margin-top--md')}
>
<SiAmazon color='#ffffff' size={48} />
{/*
Not available in simple-icons because it was removed (https://github.com/simple-icons/simple-icons/pull/13056)
Using the SVG from an older version instead
*/}
<svg xmlns='http://www.w3.org/2000/svg' width={48} height={48} viewBox='0 0 24 24'>
<path d='M.045 18.02c.072-.116.187-.124.348-.022 3.636 2.11 7.594 3.166 11.87 3.166 2.852 0 5.668-.533 8.447-1.595l.315-.14c.138-.06.234-.1.293-.13.226-.088.39-.046.525.13.12.174.09.336-.12.48-.256.19-.6.41-1.006.654-1.244.743-2.64 1.316-4.185 1.726a17.617 17.617 0 01-10.951-.577 17.88 17.88 0 01-5.43-3.35c-.1-.074-.151-.15-.151-.22 0-.047.021-.09.051-.13zm6.565-6.218c0-1.005.247-1.863.743-2.577.495-.71 1.17-1.25 2.04-1.615.796-.335 1.756-.575 2.912-.72.39-.046 1.033-.103 1.92-.174v-.37c0-.93-.105-1.558-.3-1.875-.302-.43-.78-.65-1.44-.65h-.182c-.48.046-.896.196-1.246.46-.35.27-.575.63-.675 1.096-.06.3-.206.465-.435.51l-2.52-.315c-.248-.06-.372-.18-.372-.39 0-.046.007-.09.022-.15.247-1.29.855-2.25 1.82-2.88.976-.616 2.1-.975 3.39-1.05h.54c1.65 0 2.957.434 3.888 1.29.135.15.27.3.405.48.12.165.224.314.283.45.075.134.15.33.195.57.06.254.105.42.135.51.03.104.062.3.076.615.01.313.02.493.02.553v5.28c0 .376.06.72.165 1.036.105.313.21.54.315.674l.51.674c.09.136.136.256.136.36 0 .12-.06.226-.18.314-1.2 1.05-1.86 1.62-1.963 1.71-.165.135-.375.15-.63.045a6.062 6.062 0 01-.526-.496l-.31-.347a9.391 9.391 0 01-.317-.42l-.3-.435c-.81.886-1.603 1.44-2.4 1.665-.494.15-1.093.227-1.83.227-1.11 0-2.04-.343-2.76-1.034-.72-.69-1.08-1.665-1.08-2.94l-.05-.076zm3.753-.438c0 .566.14 1.02.425 1.364.285.34.675.512 1.155.512.045 0 .106-.007.195-.02.09-.016.134-.023.166-.023.614-.16 1.08-.553 1.424-1.178.165-.28.285-.58.36-.91.09-.32.12-.59.135-.8.015-.195.015-.54.015-1.005v-.54c-.84 0-1.484.06-1.92.18-1.275.36-1.92 1.17-1.92 2.43l-.035-.02zm9.162 7.027c.03-.06.075-.11.132-.17.362-.243.714-.41 1.05-.5a8.094 8.094 0 011.612-.24c.14-.012.28 0 .41.03.65.06 1.05.168 1.172.33.063.09.099.228.099.39v.15c0 .51-.149 1.11-.424 1.8-.278.69-.664 1.248-1.156 1.68-.073.06-.14.09-.197.09-.03 0-.06 0-.09-.012-.09-.044-.107-.12-.064-.24.54-1.26.806-2.143.806-2.64 0-.15-.03-.27-.087-.344-.145-.166-.55-.257-1.224-.257-.243 0-.533.016-.87.046-.363.045-.7.09-1 .135-.09 0-.148-.014-.18-.044-.03-.03-.036-.047-.02-.077 0-.017.006-.03.02-.063v-.06z' />
</svg>
<div className='margin-top--sm'>Amazon</div>
</Link>
<Link
+1
View File
@@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-require-imports */
import React, { ComponentType, HTMLProps, ReactNode } from 'react';
import { Navigation } from 'swiper/modules';
import { Swiper, SwiperSlide } from 'swiper/react';
+1 -1
View File
@@ -352,7 +352,7 @@ makepkg -si`}
details: (
<>
<pre>
<code>emerge www-apps/jellyfin</code>
<code>emerge --ask www-apps/jellyfin-bin</code>
</pre>
<p className='margin-bottom--none'>
Once installed, Jellyfin will be running as a service. Manage it with{' '}
Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB