Merge branch 'master' into developers
@@ -0,0 +1,24 @@
|
||||
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
|
||||
// README at: https://github.com/devcontainers/templates/tree/main/src/typescript-node
|
||||
{
|
||||
"name": "Node.js & TypeScript",
|
||||
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
|
||||
"image": "mcr.microsoft.com/devcontainers/typescript-node:4-22-bookworm",
|
||||
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
|
||||
|
||||
"postAttachCommand": "cat .vscode/extensions.json | jq -r .recommendations[] | xargs -n 1 code --install-extension",
|
||||
// Features to add to the dev container. More info: https://containers.dev/features.
|
||||
// "features": {},
|
||||
|
||||
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||
"forwardPorts": [3000]
|
||||
|
||||
// Use 'postCreateCommand' to run commands after the container is created.
|
||||
// "postCreateCommand": "yarn install",
|
||||
|
||||
// Configure tool-specific properties.
|
||||
// "customizations": {},
|
||||
|
||||
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
|
||||
// "remoteUser": "root"
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
.github/ @jellyfin/core
|
||||
blog/ @jellyfin/core
|
||||
src/data/ @jellyfin/core
|
||||
docs/general/contributing/direct-donations.mdx @jellyfin/core
|
||||
docs/general/about.md @jellyfin/core
|
||||
docs/general/community-standards.md @joshuaboniface
|
||||
docs/general/contributing/ @jellyfin/core
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
<!--
|
||||
Thank you for contributing to our documentation. We receive a lot of pull requests here, so we want to streamline this process.
|
||||
-->
|
||||
|
||||
**Changes**
|
||||
<!-- Describe a little about what you've changed and why. -->
|
||||
|
||||
**Copyediting**
|
||||
|
||||
To avoid "nitpicky" reviews, please ensure all of the following have been done for any non-trivial changes.
|
||||
|
||||
- [ ] I have run this PR [through a spellchecker](https://jellyfin.org/docs/general/contributing/documentation#please-self-review) (e.g. `aspell`).
|
||||
- [ ] I have re-read my PR at least twice and fixed any obvious mistakes I see.
|
||||
- [ ] I have received [out-of-band peer copyediting](https://jellyfin.org/docs/general/contributing/documentation#peer-copyediting) from someone in [#jellyfin-documentation](https://matrix.to/#/#jellyfin-documentation:matrix.org).
|
||||
|
||||
While you're waiting for someone to look at your pull request, How about looking at another one? You do not have to do this, but it will help ensure your PR is reviewed quickly in turn.
|
||||
|
||||
- [ ] I have provided [a *substantive* review of another documentation PR](https://jellyfin.org/docs/general/contributing/documentation#peer-reviews).
|
||||
|
||||
**Issues**
|
||||
|
||||
<!-- If applicable, please list any open issues that this PR addresses -->
|
||||
<!-- e.g. -->
|
||||
<!-- - closes #1234 -->
|
||||
@@ -0,0 +1,48 @@
|
||||
name: Build
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
ref:
|
||||
required: true
|
||||
type: string
|
||||
upload-pages-artifact:
|
||||
required: false
|
||||
type: boolean
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
with:
|
||||
ref: ${{ inputs.ref }}
|
||||
- uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
|
||||
with:
|
||||
node-version: 20
|
||||
- name: Configure Pages
|
||||
if: inputs.upload-pages-artifact
|
||||
uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0
|
||||
- name: Run build
|
||||
run: |
|
||||
npm ci --no-audit
|
||||
npm run build
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||
with:
|
||||
name: jellyfin-org__build
|
||||
path: build
|
||||
# Manual artifact creation because upload-pages-artifact v4 excludes dotfiles
|
||||
# https://github.com/actions/upload-pages-artifact/issues/129
|
||||
- name: Create pages artifact
|
||||
if: inputs.upload-pages-artifact
|
||||
run: tar --dereference --hard-dereference --directory build -cvf "$RUNNER_TEMP/artifact.tar" --exclude=.git --exclude=.github .
|
||||
- name: Upload pages artifact
|
||||
if: inputs.upload-pages-artifact
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||
with:
|
||||
name: github-pages
|
||||
path: ${{ runner.temp }}/artifact.tar
|
||||
retention-days: 1
|
||||
@@ -9,42 +9,20 @@ on:
|
||||
push:
|
||||
branches: [master]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pages: write
|
||||
id-token: write
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
||||
- uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
|
||||
with:
|
||||
cache: npm
|
||||
node-version: 20
|
||||
- uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0
|
||||
- name: Run build
|
||||
run: |
|
||||
npm ci --no-audit
|
||||
npm run build
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
with:
|
||||
name: jellyfin-org__build
|
||||
path: build
|
||||
- name: Upload pages artifact
|
||||
if: github.event_name == 'push'
|
||||
uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3.0.1
|
||||
with:
|
||||
path: build
|
||||
uses: ./.github/workflows/__build.yml
|
||||
permissions: {}
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
||||
upload-pages-artifact: ${{ github.event_name == 'push' && github.repository == 'jellyfin/jellyfin.org' }}
|
||||
|
||||
deploy:
|
||||
if: github.event_name == 'push'
|
||||
if: github.event_name == 'push' && github.repository == 'jellyfin/jellyfin.org'
|
||||
name: Deploy to GitHub Pages
|
||||
permissions:
|
||||
pages: write
|
||||
id-token: write
|
||||
concurrency: build-deploy-pages
|
||||
environment:
|
||||
name: github-pages
|
||||
@@ -79,7 +57,7 @@ jobs:
|
||||
comment-tag: CFPages-deployment
|
||||
mode: recreate
|
||||
- name: Download workflow artifact
|
||||
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
|
||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
|
||||
with:
|
||||
name: jellyfin-org__build
|
||||
path: build
|
||||
|
||||
@@ -12,10 +12,10 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Check out Git repository
|
||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
|
||||
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
|
||||
with:
|
||||
node-version: 20
|
||||
check-latest: true
|
||||
@@ -27,13 +27,25 @@ jobs:
|
||||
- name: Run eslint
|
||||
run: npm run lint
|
||||
|
||||
lint:
|
||||
markdownlint:
|
||||
name: Lint Markdown
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check out Git repository
|
||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
|
||||
- name: Set up problem matcher
|
||||
uses: xt0rted/markdownlint-problem-matcher@1a5fabfb577370cfdf5af944d418e4be3ea06f27 # v3.0.0
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
|
||||
with:
|
||||
node-version: 20
|
||||
check-latest: true
|
||||
cache: npm
|
||||
|
||||
- name: Install Node.js dependencies
|
||||
run: npm ci --no-audit
|
||||
|
||||
- name: Run markdownlint
|
||||
run: npx --package markdownlint-cli markdownlint '**/*.md' --ignore node_modules
|
||||
run: npm run lint:markdown
|
||||
|
||||
@@ -20,10 +20,10 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Check out Git repository
|
||||
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
|
||||
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
|
||||
with:
|
||||
node-version: 20
|
||||
check-latest: true
|
||||
|
||||
@@ -17,3 +17,6 @@ MD026:
|
||||
|
||||
# MD028/no-blanks-blockquote
|
||||
MD028: false
|
||||
|
||||
# MD060/table-column-style
|
||||
MD060: false
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
{
|
||||
"recommendations": ["esbenp.prettier-vscode", "davidanson.vscode-markdownlint", "unifiedjs.vscode-mdx"]
|
||||
"recommendations": [
|
||||
"esbenp.prettier-vscode",
|
||||
"davidanson.vscode-markdownlint",
|
||||
"unifiedjs.vscode-mdx",
|
||||
"streetsidesoftware.code-spell-checker"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -26,10 +26,18 @@ npm install
|
||||
|
||||
## Local Development
|
||||
|
||||
To run locally, please use:
|
||||
|
||||
```console
|
||||
npm start
|
||||
```
|
||||
|
||||
To run within a dev container we have to instruct the built-in host check to bind against all addresses:
|
||||
|
||||
```console
|
||||
npm run start -- --host 0.0.0.0
|
||||
```
|
||||
|
||||
This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
|
||||
|
||||
## Build
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
---
|
||||
title: "Packaging Updates for 10.6.0"
|
||||
description: "Some backend packaging changes are here: what you should know"
|
||||
title: 'Packaging Updates for 10.6.0'
|
||||
description: 'Some backend packaging changes are here: what you should know'
|
||||
authors: joshuaboniface
|
||||
date: 2020-06-21
|
||||
slug: packaging-updates
|
||||
---
|
||||
|
||||
<!-- markdownlint-disable MD001 -->
|
||||
|
||||
Packaging and building binaries for releases and testing has long been an issue for us. From fighting with duct-tape-and-coat-hanger scripts, to testing breaking changes, to massaging official releases, how we were doing things for the last year-and-a-half needed some improvements.
|
||||
|
||||
Luckily, today they are all completed. In this post, I'll detail the changes as well as what the entail for our users.
|
||||
@@ -24,7 +26,7 @@ The main difference is the naming - the `jellyfin-web` repository binaries are n
|
||||
|
||||
### Azure Pipelines builds
|
||||
|
||||
Our previous build infrastructure consisted of a veritable spaghetti factory of Bash, Python, and Docker scripts that were executed on our build server, a DigitalOcean droplet. For the most part, it worked, but the process was very fragile, opaque (I'm not even sure *I* understand how it all worked all the time, and I wrote it all!), and resource-intensive.
|
||||
Our previous build infrastructure consisted of a veritable spaghetti factory of Bash, Python, and Docker scripts that were executed on our build server, a DigitalOcean droplet. For the most part, it worked, but the process was very fragile, opaque (I'm not even sure _I_ understand how it all worked all the time, and I wrote it all!), and resource-intensive.
|
||||
|
||||
As we've moved more and more functions to Azure for testing, verification, linting, etc. in the various repositories, it became obvious that Azure Pipelines had a lot of flexibility, and would be able to perform nearly all of our build steps for us. This eliminated at least 2/3 of the build server, and gives us another cool option - unstable builds, which I'll touch on shortly.
|
||||
|
||||
@@ -48,7 +50,7 @@ For the remaining platforms, including the archive packages for Windows, MacOS,
|
||||
|
||||
One of the cool things that this new setup enables is "unstable" builds. For quite a while now, we've been providing (when not broken) "nightly" builds, which as their name implies are build every night if there were merged PRs from the previous day. However, these had a number of drawbacks. First, they broke a lot; second, on a busy day it would be possible for there to be up to a dozen separate PRs that made up the nightly changeset; third, they could often be totally messed up in terms of contents, for instance if the unsplit build grabbed the wrong version of Web.
|
||||
|
||||
The new split builds, Azure builds, and metapackages/metaimages instead let us do something far superior: build "unstable" releases for *every merged PR*. We don't have to worry about resource usage (Azure provides this), disk space, or other aspects of the build process. We can know immediately if something breaks. And most importantly, it lets anyone test our master branch in a very clear way, knowing *exactly* what version of the repository you are using and what the last merged PR was if something goes wrong.
|
||||
The new split builds, Azure builds, and metapackages/metaimages instead let us do something far superior: build "unstable" releases for _every merged PR_. We don't have to worry about resource usage (Azure provides this), disk space, or other aspects of the build process. We can know immediately if something breaks. And most importantly, it lets anyone test our master branch in a very clear way, knowing _exactly_ what version of the repository you are using and what the last merged PR was if something goes wrong.
|
||||
|
||||
Unstable builds are versioned based on the Azure build ID, which is in the format "[date].[id]", for example "20200620.12" for the 12th build on June 20th 2020. Thus this version string will tell you exactly which Azure build generated the binary, and thus which PR in which repository triggered it. For those binaries with changelogs (`.deb` and `.rpm` packages only for now), the changelog data includes the PR ID explicitly as well.
|
||||
|
||||
|
||||
@@ -6,6 +6,8 @@ date: 2020-10-05
|
||||
slug: android-next
|
||||
---
|
||||
|
||||
<!-- markdownlint-disable MD001 -->
|
||||
|
||||
This will be a net benefit for users and developers alike!
|
||||
|
||||
<!-- truncate -->
|
||||
|
||||
|
After Width: | Height: | Size: 182 KiB |
@@ -0,0 +1,104 @@
|
||||
---
|
||||
title: Jellyfin for iOS 1.7.0
|
||||
authors:
|
||||
- thornbill
|
||||
slug: ios-v1.7.0
|
||||
tags: [release, ios]
|
||||
---
|
||||
|
||||
Download support is (finally) coming to Jellyfin for iOS!
|
||||
|
||||
{/* truncate */}
|
||||
|
||||
Jellyfin for iOS version 1.7.0 delivers the long-awaited downloads feature. This update introduces global download support complete with
|
||||
Files app integration and sharing capabilities. Alongside this major new feature, the release brings additional technical improvements and
|
||||
expanded localization support. A complete list of changes, including their respective pull requests, can be found on
|
||||
[GitHub](https://github.com/jellyfin/jellyfin-expo/releases/tag/v1.7.0.8).
|
||||
|
||||
### Download support is here!
|
||||
|
||||
Direct downloads of all media types are now supported, working similarly to the Jellyfin web client and Android app. The download option
|
||||
will be presented in the standard UI for users with appropriate server permissions. When selected, an entry will appear in the new
|
||||
Downloads tab.
|
||||
|
||||
From the Downloads tab, users can:
|
||||
|
||||
- Open downloaded media in the Files app
|
||||
- Share directly to other apps (like VLC) for viewing/playing
|
||||
- Delete downloaded content
|
||||
|
||||
<center>
|
||||
<img
|
||||
src={require('./downloads.png').default}
|
||||
alt='Downloads tab with context menu showing downloaded item options'
|
||||
style={{ maxHeight: '600px' }}
|
||||
/>
|
||||
</center>
|
||||
|
||||
Additionally, downloaded media can be browsed directly from within the Files app by locating the Jellyfin directory under Downloads.
|
||||
|
||||
#### Transcoded downloads
|
||||
|
||||
Transcoded downloads have transitioned from an experimental to an alpha setting, allowing for broader community testing of this emerging
|
||||
capability. This feature enables transcoding of audio and video that cannot be played directly by the iOS media engine. The Jellyfin server
|
||||
will convert these files to a compatible format, also enabling playback of compatible videos directly within the app.
|
||||
|
||||
**Important notes for users:** Server-side support for transcoded downloads is currently very basic. You may encounter various issues, and
|
||||
the feature should be approached with this in mind. Currently, there are no options to control download quality, and in some cases,
|
||||
transcoded files may be significantly larger than the original source files. Please report any issues you encounter on
|
||||
[GitHub](https://github.com/jellyfin/jellyfin-ios/issues).
|
||||
|
||||
### Technical improvements
|
||||
|
||||
This release features several technical enhancements:
|
||||
|
||||
- **State Management Upgrade**: State management within the app has been migrated to [zustand](https://github.com/pmndrs/zustand) from
|
||||
mobx, resolving a major blocker for upgrading to the latest Expo and React Native versions.
|
||||
- **TypeScript Migration**: Continued migration to TypeScript improves overall code quality and maintainability.
|
||||
- **App Naming Consistency**: Updates made to the app name to ensure
|
||||
[consistent branding](https://github.com/jellyfin/jellyfin-meta/discussions/100).
|
||||
- **Expanded Localization**: Added support for Afrikaans and Basque languages, thanks to our community translators.
|
||||
- **Code Optimization**: Removed unused resources from the app.
|
||||
|
||||
### Supported iOS versions
|
||||
|
||||
**This release of the Jellyfin app will be the last major update to support iOS 12.** The next major release is planned to include an
|
||||
updated version of React Native, which will require us to increase the minimum supported iOS version to at least 15.1. Users with devices
|
||||
running older iOS versions will still be able to use the Jellyfin web interface, though future app updates will not be available for these
|
||||
devices.
|
||||
|
||||
## Contributors
|
||||
|
||||
Jellyfin is completely developed by volunteers, and could not be made without their great skills and dedication. Consider donating if you
|
||||
appreciate their work. A big shout-out to all contributors that made this release possible:
|
||||
|
||||
**Jellyfin Team**
|
||||
|
||||
- [@thornbill](https://github.com/thornbill) - Donate via [GitHub sponsors](https://github.com/sponsors/thornbill) or
|
||||
[BuyMeACoffee](https://coff.ee/thornbill)
|
||||
|
||||
**Other contributors**
|
||||
|
||||
- [@enigma0Z](https://github.com/enigma0Z)
|
||||
|
||||
And finally a big thank you to everyone who contributed translations, reported bugs, provided feedback and participated in beta testing!
|
||||
|
||||
### Helping out
|
||||
|
||||
If you have experience with React Native development and are interested in contributing, feel free to dive into the
|
||||
[source code](https://github.com/jellyfin/jellyfin-ios) and open a pull request. Likewise, if you have experience with
|
||||
JavaScript/TypeScript and React, [jellyfin-web](https://github.com/jellyfin/jellyfin-web) is always looking for additional contributors.
|
||||
Alternatively, you can help with translating the app into your own language on our
|
||||
[Weblate](https://translate.jellyfin.org/projects/jellyfin/jellyfin-expo/) instance.
|
||||
|
||||
## Downloads
|
||||
|
||||
Update your app now to check out these exciting new features! The AppStore will automatically update your Jellyfin app if you're already
|
||||
using it. New users can find the app on the Apple App Store.
|
||||
|
||||
<a href='https://apps.apple.com/us/app/jellyfin-mobile/id1480192618'>
|
||||
<img width='153' alt='Download on the App Store' src='/images/store-icons/app-store.svg' />
|
||||
</a>
|
||||
|
||||
You can also join our [TestFlight](https://testflight.apple.com/join/jJP75akQ) and help test new versions before they're released to the
|
||||
public.
|
||||
@@ -0,0 +1,107 @@
|
||||
---
|
||||
title: SQLite concurrency and why you should care about it
|
||||
authors:
|
||||
- JPVenson
|
||||
slug: SQLite-locking
|
||||
tags: [SQLite, jellyfin, locked-database]
|
||||
---
|
||||
|
||||
SQLite is a powerful database engine, but due to its design, it has limitations that should not be overlooked.
|
||||
|
||||
Jellyfin has used a SQLite-based database for storing most of its data for years, but it has also encountered issues on many systems. In this blog post, I will explain how we address these limitations and how developers using SQLite can apply the same solutions.
|
||||
|
||||
This will be a technical blog post intended for developers and everyone wanting to learn about concurrency.
|
||||
|
||||
Also Jellyfin's implementation of locking for SQLite should be fairly easy to be implemented into another EF Core application if you are facing the same issue.
|
||||
|
||||
\- JPVenson
|
||||
|
||||
{/* truncate */}
|
||||
|
||||
## The Premise
|
||||
|
||||
SQLite is a file-based database engine running within your application and allows you to store data in a relational structure.
|
||||
Overall it gives your application the means of storing structured data as a single file and without having to depend on another application to do so.
|
||||
Naturally this also comes at a price. If your application fully manages this file, the assumption must be made that your application is the sole owner of this file, and nobody else will tinker with it while you are writing data to it.
|
||||
|
||||
So an application that wants to use SQLite as its database needs to be the only one accessing it.
|
||||
Having established this fact, an important thought arises: if only a single write operation should be performed on a single file at a time, this rule must also apply to operations within the same application.
|
||||
|
||||
## The W-A-L mode
|
||||
|
||||
SQLite has a feature that tries to get around this limitation: the Write-Ahead-Log (WAL).
|
||||
The WAL is a separate file that acts as a journal of operations that should be applied to an SQLite file.
|
||||
This allows multiple parallel writes to take place and get enqueued into the WAL.
|
||||
When another part of the application wants to read data, it reads from the actual database, then scans the WAL for modifications and applies them on the fly.
|
||||
This is not a foolproof solution; there are still scenarios where WAL does not prevent locking conflicts.
|
||||
|
||||
## SQLite transactions
|
||||
|
||||
A transaction is supposed to ensure two things.
|
||||
Modifications made within a transaction can be reverted, either when something goes wrong or when the application decides it should and optionally a transaction may also block other readers from reading data that is modified within a transaction.
|
||||
This is where it gets spicy and we come to the real reason why I am writing this blog post.
|
||||
For some reason on some systems that run Jellyfin when a transaction takes place the SQLite engine reports the database is locked and instead of waiting for the transaction to be resolved the engine refuses to wait and just crashes.
|
||||
This seems to be a not uncommon issue and there are many reports to be found on the issue.
|
||||
|
||||
The factor that makes this issue so bad is that it does not happen reliably. So far we only have one team member where this can be (somewhat) reliably be reproduced which makes this an even worse a bug.
|
||||
From the reports this issue happens across all operating systems, drive speeds and with or without virtualization.
|
||||
So we do not have any deciding factor identified that even contributes to the likelihood of the issue happening.
|
||||
|
||||
## The Jellyfin factor
|
||||
|
||||
Having established the general theory on how SQLite behaves, we also have to look at the specifics of Jellyfins usage of SQLite.
|
||||
During normal operations on a recommended setup (Non-Networked Storage and preferably SSD) its unusual for any problems to arise, however the way Jellyfin utilises the SQLite db up to 10.11 is very suboptimal.
|
||||
In versions prior to 10.11 Jellyfin had a bug in its parallel task limit which resulted in exponential overscheduling of library scan operations which hammered the database engine with thousands of parallel write requests that an SQLite engine is simply not able to handle.
|
||||
While most SQLite engine implementations have retry behavior, they also have timeouts and checks in place to prevent limitless waiting so if we stress the engine enough, it just fails with an error.
|
||||
That and very long running and frankly unoptimized transactions could lead to the database just being overloaded with requests and flaking out.
|
||||
|
||||
## The solution
|
||||
|
||||
Since we moved the codebase over to EF Core proper, we have the tools to actually do something about this as EF Core gives us a structured abstraction level.
|
||||
EF Core supports a way of hooking into every command execution or transaction by creating [Interceptors](https://learn.microsoft.com/en-us/ef/core/logging-events-diagnostics/interceptors).
|
||||
With an interceptor we can finally do the straight forward idea of just "not" writing to the database in parallel in a transparent way to the caller.
|
||||
The overall idea is to have multiple strategies of locking. Because all levels of synchronization will inevitably come at the cost of performance, we only want to do it when it is really necessary.
|
||||
So, I decided on three locking strategies:
|
||||
|
||||
1. No-Lock
|
||||
2. Optimistic locking
|
||||
3. Pessimistic locking
|
||||
|
||||
As a default, the no-lock behavior does exactly what the name implies. Nothing. This is the default because my research shows that for 99% all of this is not an issue and every interaction at this level will slow down the whole application.
|
||||
|
||||
Both the optimistic and pessimistic behaviors use two interceptors—one for transactions and one for commands—and override `SaveChanges` in `JellyfinDbContext`.
|
||||
|
||||
### Optimistic locking behavior
|
||||
|
||||
Optimistic locking means to assume the operation in question will succeed and only handle issues afterwards. In essence this can be boiled down to "Try and Retry and Retry ..." for a set number of times until either we succeed with the operation or fail entirely.
|
||||
This still leaves the possibility that we will not actually be able to perform a write, but the introduced overhead is far less than the Pessimistic locking behavior.
|
||||
|
||||
The idea behind how this works is simple: every time two operations try to write to the database, one will always win. The other will fail, wait some time, then retry a few times.
|
||||
|
||||
Jellyfin uses the `Polly` library perform the retry behavior and will only retry operations it will find have been locked due to this exact issue.
|
||||
|
||||
### Pessimistic locking behavior
|
||||
|
||||
Pessimistic locking always locks when a write to SQLite should be performed. Essentially every time an transaction is started or a write operation on the database is done though EF Core, Jellyfin will wait until all other read operations are finished and then block all other operations may they be read or write until the write in question has been performed.
|
||||
This however means, that Jellyfin can only ever perform a single write to the database, even if it would technically does not need to.
|
||||
|
||||
In theory, an application should have no issue reading from table "Alice" while writing to table "Bob" however to eliminate all possible sources of concurrency related locking, Jellyfin will only ever allow a single write performed on its database in this mode.
|
||||
While this will absolutely result in the most stable operation, it will undoubtedly also be the slowest.
|
||||
|
||||
Jellyfin uses a [ReaderWriterLockSlim](https://learn.microsoft.com/en-us/dotnet/fundamentals/runtime-libraries/system-threading-readerwriterlockslim) to lock the operations, that means we allow an unlimited number of reads to happen concurrently while only one write may ever be done on the database.
|
||||
|
||||
### The future Smart locking behavior
|
||||
|
||||
In the future we might also consider combining both modes, to get the best of both worlds.
|
||||
|
||||
# The result
|
||||
|
||||
Initial testing showed that with both modes, we had great success in handling the underlying issue. While we are not yet sure why this happens only on some systems when others work, we at least now have an option for users previously left out of using Jellyfin.
|
||||
|
||||
When I was researching this topic, I found many reports all over the internet facing the same error but nobody was able to provide a conclusive explanation whats really happening here.
|
||||
There have been similar proposals made to handle it but there wasn't a "ready to drop in" solution that handles all the different cases or only code that required massive modifications to every EF Core query.
|
||||
Jellyfin's implementation of the locking behaviors should be a copy-paste solution for everyone having the same issues as its using interceptors and the caller has no idea of the actual locking behavior.
|
||||
|
||||
Best of luck,
|
||||
|
||||
\- JPVenson
|
||||
|
After Width: | Height: | Size: 53 KiB |
@@ -0,0 +1,152 @@
|
||||
---
|
||||
title: Jellyfin 10.11.0
|
||||
authors:
|
||||
- joshuaboniface
|
||||
slug: jellyfin-release-10.11.0
|
||||
tags: [release, server]
|
||||
---
|
||||
|
||||
We are pleased to bring you Jellyfin 10.11.0, our new stable release. This is probably one of, if not the, biggest and most impactful releases we've done yet, with some massive backend changes to improve performance and long-term expandability and maintainability. This release has been a long time coming, with over 6 months of development and another 6 months of RC testing, throwing our planned 6-month release schedule completely out of whack, but we definitely think the results are worth it - both for users right now, and for the long-term health of the project.
|
||||
|
||||
If you just want a quick summary of what you **need to know** (and you **DO** need to know!) to get your system upgraded and running, please read on to the "TL; DR" section just below, or keep reading for a full explanation of all the major features and improvements in Jellyfin 10.11.0! You can also view full changelogs on the [server](https://github.com/jellyfin/jellyfin/releases/tag/v10.11.0) and [web](https://github.com/jellyfin/jellyfin-web/releases/tag/v10.11.0) GitHub releases.
|
||||
|
||||
\- Joshua
|
||||
|
||||
{/* truncate */}
|
||||
|
||||
## TL; DR
|
||||
|
||||
**IT IS VERY IMPORTANT THAT YOU READ THIS SECTION BEFORE UPGRADING TO JELLYFIN 10.11.0!** Failure to do so may cause issues! Always feel free to [ask for help in our chat](/contact) if you are unclear or run into trouble.
|
||||
|
||||
1. As always for major upgrades, ensure you **STOP Jellyfin and take a [FULL MANUAL BACKUP OF YOUR DATA AND CONFIG DIRECTORIES](/docs/general/administration/backup-and-restore/#manual-backup) before upgrading**! While the upgrade process _should_ be seamless and has guardrails, we've seen a lot of strange bugs during RC testing and it's better to be safe than sorry.
|
||||
|
||||
2. You **MUST** be running Jellyfin 10.10.7 before upgrading to 10.11.0! You **may** be fine with Jellyfin 10.9.11 but this is less-extensively tested. **Upgrading from any other versions is NOT supported and WILL fail**; upgrade to 10.10.7 **first**, then upgrade to 10.11.0.
|
||||
|
||||
3. The initial upgrade will include **MULTIPLE LONG-RUNNING MIGRATIONS** that may take up to several hours depending on your library size and state. **DO NOT CANCEL OR INTERRUPT THE SYSTEM** during these migrations; let them run overnight if possible on very large libraries. You can use the new Startup UI and Log Viewer (see below) from your local network to view the progress during the upgrade, and please see the section below for more details on "why".
|
||||
|
||||
4. The upgrade will make a backup of your existing `library.db` file named `library.db.old`. This file can be used to recover should the upgrade fail. Once you have successfully upgraded and Jellyfin 10.11.0 is running smoothly, you may delete this backup. If you need to try the migrations again due to a failure, stop Jellyfin, rename this file back to `library.db`, then start Jellyfin again, and the migration will be re-attempted.
|
||||
|
||||
5. If you have adjusted the Library Page Size to anything other than the default of 100, we recommend putting it back for performance reasons before upgrading.
|
||||
|
||||
6. After upgrading, we strongly recommend running a **full library scan** to ensure that all data is correctly populated. Failure to do so may result in weird bugs if any metadata entries were corrupt or not properly migrated (rare but possible). Additionally, users should also perform a scan for missing metadata on their Music libraries, as this may be necessary for proper music functionality after the upgrade. While it may not be strictly required, performing this additional scan on other libraries is recommended to ensure everything functions correctly.
|
||||
|
||||
7. Jellyfin 10.11.0 is **NOT** compatible with 32-bit ARM systems (`armhf`), like 1st and 2nd generation Raspberry Pis or other low-end or old SBCs, or any ARM system running a 32-bit operating system. You **must** be running an ARM64 operating system to run Jellyfin 10.11.0 on ARM systems. See below for more information.
|
||||
|
||||
8. This release also fixes several security bugs, both for ourselves and from upstream projects like DotNET. We do recommend upgrading to 10.11.0 **as soon as possible**.
|
||||
|
||||
9. As always with major Jellyfin releases, bugs will exist, even after 6 months of RC testing. This is a second reminder to **take a full backup before upgrading**, as this is the only way to downgrade back to a previous version if you find that you need to.
|
||||
|
||||
And now on to the cool new features!
|
||||
|
||||
## The Library Database conversion to EF Core is complete!
|
||||
|
||||
For this one, a bit of backstory is required. For a long time, the backend of Jellyfin has been a mess of spaghetti, as historically pre-Jellyfin very little thought was put into long-term best-practices during development of new features and functionality. This manifested as a codebase completely littered with database calls, written as raw SQLite statements inside of other code, with effectively zero centralization of the database management functionality into an ORM (object-relational model system).
|
||||
|
||||
This had three major negative effects: (1) doing any changes to the database schemas required complex, error-prone manual migrations that were bespoke for each change, with little in the way of safeguards or guardrails and no downgrade support; (2) it was very difficult to add new functionality or change existing functionality without rewriting large swaths of unrelated code to take the new changes into account; and (3) it completely locked the system into the file-based SQLite system with no ability to support other database engines.
|
||||
|
||||
Enter EF Core, an ORM for .NET and C#, the framework and language Jellyfin is written in, that simplifies and helps manage the database for us, allowing us to remove all this legacy spaghetti and massively simplify the database handling within Jellyfin. It includes things like an automatic migration handler with versioning, standardized interfaces to the database calls, and the flexibility to use other backend database engines in the future.
|
||||
|
||||
The initial conversion work was started almost 5 years ago with some of the simpler databases, such as Users and Authentication, but the elephant of the conversion was the Library database: its massive complexity, sprawling reach, and reliance not only on the database but also on static XML files on-disk, meant that it was quite a thing to tackle, and the project stalled out for several years. Cue @JPVenson, who with less than 6 months involved in the project took on this massive project and drove it to completion.
|
||||
|
||||
The end result might not seem like much to a normal user: queries do get faster, and future changes should be less error-prone, but mostly this change is transparent. But on the backend and for the continued long-term development of Jellyfin, this is huge. The simplified database access will let us write cleaner, less error-prone code, implement new features, perform complex migrations, and more, much faster and with a minimum of effort, opening up a lot of new opportunities for advancement. We can then finally start tackling the absolutely massive mountain of open feature requests, many of which were nearly impossible before this change. For administrators, it also opens up new possibilities - not officially yet, but soon - for running Jellyfin backed by "real" database systems like PostgreSQL, providing new options for redundancy, load-balancing, and easier maintenance and administration. The future looks very bright!
|
||||
|
||||
### Deduplication and Migrations
|
||||
|
||||
The core of the migration involves a transfer of all Library data from the legacy `library.db` to the new structures within `jellyfin.db`. While this seems simple on the surface, as part of the conversion process we decided to actively try to improve the schema while we were at it, allowing us to simultaneously clean up a lot of the aforementioned spaghetti code. Thus the migration itself creates proper relational cross-references in the database, including foreign keys, for the first time.
|
||||
|
||||
The downside however is that inconsistent and logically corrupt library data is prone to cause problems during the migration, and this has been a source of many issues. The migration must not only restructure the data but fix these logical corruptions and clean up any data that "doesn't make sense" anymore, for example Media items with no parent or duplicated People data for multiple sets of media.
|
||||
|
||||
This deduplication and cleanup is very time intensive, and the scale of the cleanup depends heavily on how many logically inconsistent entries are present in the existing database. This essentially means that, the older your database is, and the more logically corrupted entries it has, the more the migration needs to work to clean all of it up, prolonging the migration process. This also makes it very hard to estimate how long the migration can take: a database with 300,000 entries but no issues can migrate in a matter of minutes, while one with just 30 series but severe inconsistencies can take multiple hours.
|
||||
|
||||
Thus, when it comes to running the migration, we reiterate letting it run during an off-peak period like overnight, and simply letting it run to completion; if it completes quickly, you're golden, and if not, you will avoid delaying users' access.
|
||||
|
||||
### Startup UI and Log Viewer
|
||||
|
||||
One nice little feature that grew out of the migration work and the corresponding long-running initial migration was our new Startup UI and Log Viewer. Before this feature, while Jellyfin was starting up and running through e.g. migrations, the system would appear dead - the UI would not load, and it appeared like very little was happening unless you had your log level set to debug. The Startup UI changes this by providing a simple startup WebUI which is only accessible in your configured local networks, and which will display the current status of the startup process and log messages while the system gets ready, giving you more peace of mind about what's going on. For small instances this might not even be visible, but for slow-to-start large instances this can be invaluable for tracking progress and debugging issues.
|
||||
|
||||

|
||||
|
||||
### Internal Backup & Restore Support
|
||||
|
||||
One of the first big benefits of the new backend is a very eagerly-awaited feature: internal, live Backup and Restore support! You can now take a full snapshot of your metadata database, back it up to external storage, and restore from it in the event of a major fault. You can also take regular backups just in case. This will greatly help both normal day-to-day maintenance, as well as upgrades in the future, always knowing that you have a good copy of the data.
|
||||
|
||||
The backup and restore system can only restore systems on which the backup was originally made, so this is not a tool to migrate from other OS's or 3rd party containers.
|
||||
|
||||

|
||||
|
||||
### Aggressive in-memory Database Caching
|
||||
|
||||
The new database engine is tuned to aggressively cache metadata in memory, to prevent slow disk reads from bottlenecking the system; this was a frequent problem in previous versions of Jellyfin and a point of regular complaint. In practice, this means that Jellyfin will use more RAM than before, up to the full size of your Library database. This RAM is not wasted however, as the speed-up is very noticeable, especially with large libraries, and the system will try to be as efficient as possible if other tasks require memory. This means that the memory will be given back when other programs need more memory. Be aware of this as you upgrade, as it will look like a lot more resource utilization.
|
||||
|
||||
### Improved Locking Behavior
|
||||
|
||||
The new database engine also enables several new locking modes; for most users, this is irrelevant, but users with frequent issues related to database locking can now tweak the settings. **More detail about this functionality can be found [in this blog post](/posts/SQLite-locking).**
|
||||
|
||||
## Removal of ARM32 (armhf) support
|
||||
|
||||
In Jellyfin 10.10.0, we deprecated ARM32 support and have fully removed it from Jellyfin 10.11.0; Jellyfin now requires an ARM64 operating system to run on ARM platforms. In practical terms, this means dropping support for very old or very low-end ARM SBCs (Raspberry Pi 1/2, etc.). We found consistently that these very old SBCs were absolutely terrible at running Jellyfin, even without transcoding, and we decided that dropping support would streamline our release processes and help ensure that users get the best experience out of the box. If you are still running on one of these systems, or on a newer ARM SBC that isn't running a 64-bit operating system, you will need to upgrade your hardware and/or reinstall a 64-bit operating system in order to upgrade to Jellyfin 10.11.0.
|
||||
|
||||
## Deprecation of internal TLS/SSL support
|
||||
|
||||
We are announcing the deprecation of internal TLS/SSL support in Jellyfin, which we are planning to remove in Jellyfin 10.12.0. The current internal TLS mechanisms are cumbersome and do not integrate well with external systems e.g. Let's Encrypt's `certbot`, which means manual work and manual restarts whenever a certificate needs to be updated. In addition, compiling in TLS support means dependencies on external libraries that complicate our packaged Linux binaries. We have always recommended [running Jellyfin behind a reverse proxy](/docs/general/post-install/networking/reverse-proxy/), all of which provide far better integration for TLS/SSL, so with our next release we will be removing this functionality. For anyone running a production-grade Internet-facing instance using TLS without a reverse proxy, now is the time to get that set up. Even with this removal, we are planning to still provide manual configuration options for the built-in Kestrel TLS system, which would serve as an alternative way to configure TLS, but it will not be exposed through the frontend UX and would be recommended only for very advanced, specific usecases; normal instances should move to reverse proxies.
|
||||
|
||||
## Free Space Checks
|
||||
|
||||
Jellyfin now actively checks the available free space for its configuration and data directories. If you have less than 2GB of free space in each data directory, Jellyfin now refuses to start to prevent data corruption. Additionally, checks are implemented to prevent certain path misconfigurations that are known to cause issues.
|
||||
|
||||
## New Features & Enhancements
|
||||
|
||||
We have several new features and enhancements to look forward to:
|
||||
|
||||
### User Experience
|
||||
|
||||
* Our search performance has been greatly improved, making it much quicker to find what you need.
|
||||
* The Favorites page will now list Live TV channels, Music Videos, Photo Albums, Photos, and Seasons in addition to the existing media types.
|
||||
* We now have HEVC decoding support for Firefox 134+. More info is available on the [client support page](/docs/general/clients/codec-support#video-compatibility).
|
||||
* Native styling of subtitles can be disabled.
|
||||
* Shows can be displayed grouped in collections when viewing libraries.
|
||||
* Theme media will now play in random order.
|
||||
* Guest stars can be assigned roles, e.g., Kelsey Grammer as Captain Morgan Bateson.
|
||||
* A customizable "splash screen" image can be set as a background on the login page.
|
||||
* The experimental layout has a redesigned navigation and controls for filtering and sorting libraries.
|
||||
|
||||
### Administrator Experience
|
||||
|
||||
* The dashboard now displays stats for the number of media items on the server and available storage space.
|
||||
* Media segment providers can be configured per library similar to other metadata providers.
|
||||
* AV1 decoding can be enabled for VideoToolbox hardware acceleration.
|
||||
* M3U tuners can be configured to use the native framerate.
|
||||
* Branding options are greatly expanded, including "splash screen" image support, extended disclaimer support, and custom CSS; even more is planned for the future to allow administrators to fully customize their user experience to your branding.
|
||||
* The migration of dashboard pages to our new tech stack is nearly complete with most pages being converted, offering a much simpler and clearer organizational layout.
|
||||
* When replacing files, Jellyfin will now recognize this and prune related data (chapters, trickplay files and extracted subtitles and attachments) on scan, making sure that these data will be re-generated, matching the new file.
|
||||
|
||||
### Transcoding and Media Handling
|
||||
|
||||
* We have moved to the new upstream FFmpeg 7.1, which brings many improvements.
|
||||
* We now support 3D LUT-based HDR tone-mapping on Intel HD/UHD graphics and Rockchip RK3588, improving performance.
|
||||
* We now support Dolby Vision Profile 5 tone-mapping on Rockchip RK3588.
|
||||
* We now have more accurate rendering of ASS/SSA subtitles when using hardware transcoding.
|
||||
* We now support AV1 hardware decoding for Apple VideoToolbox.
|
||||
* We have improved our dynamic HDR metadata handling, which involves properly detecting HDR10+ videos and selectively removing DoVi or HDR10+ metadata to avoid black screen on devices that only support a single type of dynamic HDR metadata.
|
||||
|
||||
## Client Development Changes
|
||||
|
||||
The following changes apply to all client application developers. Please review thoroughly and update your applications as required.
|
||||
|
||||
### HTTP API
|
||||
|
||||
* We've added a new option for developers to test their client with deprecated authorization methods disabled. We're planning to remove old authorization methods in 10.12.0. More details about how to authorize and to test are available in [this document](https://gist.github.com/nielsvanvelzen/ea047d9028f676185832e51ffaf12a6f).
|
||||
* The `OnPlaybackStart`, `OnPlaybackProgress` and `OnPlaybackStopped` operations are now deprecated. Use the `ReportPlaybackStart`, `ReportPlaybackProgress` and `ReportPlaybackStopped` operations instead, as the former will be removed in a future version.
|
||||
* A new `GetSystemStorage` operation has been added to retrieve information about the server storage.
|
||||
* A new `BackupApi` has been added to list, create, and restore backups.
|
||||
* Lyrics now contain cues to allow timing for individual words.
|
||||
* Parental ratings have now moved to the new `ratingScore` property which allows for subscores.
|
||||
* The server may now return `503 Service Unavailable` when a server startup/shutdown/restart is in progress. Clients should expect this code, react to the `Retry-After: sec` header, and retry the operation as needed.
|
||||
|
||||
### Plugins
|
||||
|
||||
* All database access **must** now be done through EF Core. Raw SQL will no longer be accepted by the server.
|
||||
* Plugins may now provide custom database access. This is a HIGHLY experimental API and is subject to changes, with a goal of stability in 10.12.0.
|
||||
* Metadata plugins should use the new interface for external URL providers to supply better naming for external metadata links.
|
||||
|
||||
Happy Watching!
|
||||
|
After Width: | Height: | Size: 59 KiB |
@@ -0,0 +1,133 @@
|
||||
---
|
||||
title: Jellyfin for Android TV 0.19
|
||||
authors:
|
||||
- nielsvanvelzen
|
||||
slug: androidtv-v0.19.0
|
||||
tags: [release, android-tv]
|
||||
---
|
||||
|
||||
From refreshed user interface elements to playback improvements, there are many changes across the board in the latest update of Jellyfin
|
||||
for Android TV.
|
||||
|
||||
{/* truncate */}
|
||||
|
||||
I'm glad to announce a brand new release of Jellyfin for Android TV. This time, we've made progress in many aspects of the app. Some more
|
||||
visible than others. This blog post will highlight some of the most notable changes. A complete list is available in the
|
||||
[GitHub changelog](https://github.com/jellyfin/jellyfin-androidtv/releases/tag/v0.19.0).
|
||||
|
||||
## 🔍 Search
|
||||
|
||||

|
||||
|
||||
The search functionality of the app was redesigned based on the new style of the app. This new look also introduces voice search! And
|
||||
this is only a first step of many to come. Future updates are planned to add search suggestions, in-library search and a revamp of how
|
||||
results are shown.
|
||||
|
||||
## 📺 Are you still watching?
|
||||
|
||||

|
||||
|
||||
By popular request, we now have a new inactivity popup. When enabled in the app preferences it will ask you if you're still watching TV when
|
||||
no input has been detected for a configurable amount of time or number of episodes. If you don't choose to continue watching the app will
|
||||
automatically close the video player, preventing entire series from being marked as watched overnight when you fall asleep!
|
||||
|
||||
## 📹 Video
|
||||
|
||||
A lot of effort was put into improving our video player. While not all our work was ready for this release yet, a lot of it was. We've
|
||||
made significant improvements in the detection of device HDR capabilities to more accurately transcode or direct play content. For Dolby
|
||||
Vision content we do require Jellyfin 10.11 and media has to be rescanned for these changes to fully work. Additionally we now support the
|
||||
VobSub and DVDSub subtitle formats without transcoding.
|
||||
|
||||
To both improve our detection algorithms and help troubleshoot playback issues we added a new troubleshoot mechanic. You'll find a new
|
||||
button in the advanced playback preferences to send a "media capability report" to the server. This report contains information about your
|
||||
device and its capabilities, together with the "device profile" that is sent to the Jellyfin server to decide whether transcoding or
|
||||
remuxing is necessary.
|
||||
|
||||
## 🎶 Music
|
||||
|
||||

|
||||
|
||||
It's now possible to fast forward, rewind or manually seek through your playing music. Various issues with managing the
|
||||
queue have been fixed, including remote control support.
|
||||
|
||||
## 🖼️ Photos
|
||||
|
||||

|
||||
|
||||
The photo viewer got upgrades with a fresh coat of paint. It now shows the file and album name too, making it easier to see what you're
|
||||
looking at. This also gives a small glimpse of how the video player will look in the future.
|
||||
|
||||
## ✨ Jellyfin 10.11
|
||||
|
||||
Jellyfin server version 10.11 just released, but don't be alarmed: this app release supports both Jellyfin 10.10 and 10.11, giving you the
|
||||
time to upgrade at your own pace. Some features, like the HDR improvement, do rely on Jellyfin 10.11, so upgrading is advised for
|
||||
the best experience.
|
||||
|
||||
## 🫳 Android 5 and below
|
||||
|
||||
**The 0.19.x releases will be the last ones supporting Android 5 and Android 5.1** due to updated vendor requirements. Based on our limited
|
||||
statistics, this affects less than 1% of our users. You will be able to keep using Jellyfin, but won't be able to receive future app
|
||||
updates. We recommend upgrading your device or using an external Android TV set-top box to receive future app updates.
|
||||
|
||||
## Made possible by you
|
||||
|
||||
Jellyfin is completely developed by volunteers, and couldn't be made without their great skills and dedication. Consider donating if you
|
||||
appreciate their work. A big shout-out to all contributors that made this release possible:
|
||||
|
||||
**Jellyfin Team**
|
||||
|
||||
- [@nielsvanvelzen](https://github.com/nielsvanvelzen) - Donate via [GitHub sponsors](https://github.com/sponsors/nielsvanvelzen) or
|
||||
[Buy Me a Coffee](https://buymeacoffee.com/nielsvanvelzen)
|
||||
- [@BotBlake](https://github.com/BotBlake)
|
||||
- [@linkandzelda91](https://github.com/linkandzelda91)
|
||||
|
||||
**Other contributors**
|
||||
|
||||
- [@tal\-sarid](https://github.com/tal-sarid)
|
||||
- [@dtrexler](https://github.com/dtrexler)
|
||||
- [@hdweiss](https://github.com/hdweiss)
|
||||
- [@kylep09](https://github.com/kylep09)
|
||||
- [@RubenTeixeira](https://github.com/RubenTeixeira)
|
||||
- [@clams4shoes](https://github.com/clams4shoes)
|
||||
- [@owochle](https://github.com/owochle)
|
||||
- [@ferrarimarco](https://github.com/ferrarimarco)
|
||||
- [@conihorse](https://github.com/conihorse)
|
||||
- [@ConnorS1110](https://github.com/ConnorS1110)
|
||||
- [@vahtos](https://github.com/vahtos)
|
||||
- [@claireratigan](https://github.com/claireratigan)
|
||||
- [@cani1see](https://github.com/cani1see)
|
||||
- [@osiris86](https://github.com/osiris86)
|
||||
- [@bin101](https://github.com/bin101)
|
||||
- [@EMohlin7](https://github.com/EMohlin7)
|
||||
- [@mkst](https://github.com/mkst)
|
||||
|
||||
And finally a big thank you to everyone who contributed translations, reported bugs, provided feedback and participated in beta testing!
|
||||
|
||||
### Helping out
|
||||
|
||||
If you have experience with Android TV development or with Kotlin and are interested in contributing yourself, feel free to dive into the
|
||||
[source code](https://github.com/jellyfin/jellyfin-androidtv) and open a pull request. Alternatively, you can help with translating the app
|
||||
into your own language on our [Weblate](https://translate.jellyfin.org/engage/jellyfin-android/) instance.
|
||||
|
||||
## Downloads
|
||||
|
||||
Update your app now to check out all these changes! The app stores will auto-update your Jellyfin app if you're already using the app. For
|
||||
new users, you can find the app on the app store of your platform.
|
||||
|
||||
<a className='margin-right--md' href='https://play.google.com/store/apps/details?id=org.jellyfin.androidtv'>
|
||||
<img width='153' alt='Jellyfin for Android TV on Google Play' src='/images/store-icons/google-play.png' />
|
||||
</a>
|
||||
|
||||
<a className='margin-right--md' href='https://www.amazon.com/gp/product/B07TX7Z725'>
|
||||
<img width='153' alt='Jellyfin for Fire TV at Amazon Appstore' src='/images/store-icons/amazon.png' />
|
||||
</a>
|
||||
|
||||
<a href='https://f-droid.org/en/packages/org.jellyfin.androidtv/'>
|
||||
<img width='153' alt='Jellyfin for Android TV on F-Droid' src='/images/store-icons/fdroid.png' />
|
||||
</a>
|
||||
|
||||
Direct downloads are available at [repo.jellyfin.org](https://repo.jellyfin.org/releases/client/androidtv/) or in the
|
||||
[GitHub release](https://github.com/jellyfin/jellyfin-androidtv/releases/latest).
|
||||
|
||||
You can also join our [beta program on Google Play](https://play.google.com/apps/testing/org.jellyfin.androidtv) and help test new versions
|
||||
before they're released to the public. [Read more](../../2021/07-24-android-betas.mdx) about our beta program.
|
||||
|
After Width: | Height: | Size: 489 KiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 967 KiB |
|
After Width: | Height: | Size: 598 KiB |
@@ -0,0 +1,150 @@
|
||||
---
|
||||
title: State of the Fin 2026-01-06
|
||||
authors:
|
||||
- thornbill
|
||||
slug: state-of-the-fin-2026-01-06
|
||||
tags: [state-of-the-fin]
|
||||
---
|
||||
|
||||
Happy New Year and welcome to the State of the Fin!
|
||||
This new blog series will regularly basis highlight the ongoing development of Jellyfin and our official clients.
|
||||
We aim to keep our community informed and engaged, so feel free to share your feedback or thoughts on our progress!
|
||||
|
||||
{/* truncate */}
|
||||
|
||||
## Project Updates
|
||||
|
||||
### Jellyfin Turns 7
|
||||
|
||||
December marked Jellyfin's 7th anniversary!
|
||||
A lot has changed in 7 years, but we remain steadfast in our commitment to Open Source and to being the best personal media server out there.
|
||||
Special thanks to our developers, testers, moderators, and supporters for your invaluable contributions!
|
||||
Here's to many more years of collaboration and streaming!
|
||||
|
||||
### Versioning
|
||||
|
||||
We received a substantial amount of feedback regarding our versioning scheme following the 10.11 release, particularly concerning the stability of what are perceived as 'minor' version updates.
|
||||
This has prompted internal discussions about potentially revising our versioning scheme in the next major release.
|
||||
While nothing has been finalized yet, we are considering 'dropping' the major version 10, which would make the next release 12.0.
|
||||
Stay tuned for further updates as we navigate this feedback!
|
||||
|
||||
## Development Updates
|
||||
|
||||
### 10.11 Release Status
|
||||
|
||||
Jellyfin 10.11 introduced a major [EF Core refactor](https://jellyfin.org/posts/efcore-refactoring-incoming/), consolidating the legacy `library.db` into a single unified `jellyfin.db`.
|
||||
Following more than six months of development and an additional six months of release candidate testing, version [10.11.0](https://jellyfin.org/posts/jellyfin-release-10.11.0/) was released last year.
|
||||
This extended testing period allowed us to mitigate most [refactoring](https://github.com/jellyfin/jellyfin/issues/13047) and [RC](https://github.com/jellyfin/jellyfin/issues/14350)-related issues prior to release.
|
||||
|
||||
Even with this level of testing, issues were expected given the scale of the database change and the limited number of users reporting bugs.
|
||||
These issues are currently being tracked on GitHub across three categories:
|
||||
|
||||
1. [General bugs](https://github.com/jellyfin/jellyfin/issues/15045)
|
||||
2. [Performance bugs](https://github.com/jellyfin/jellyfin/issues/15685)
|
||||
3. [Migration and database bugs](https://github.com/jellyfin/jellyfin/issues/15686)
|
||||
|
||||
We have been moving quickly to address these issues, delivering four additional point releases with over [100 changes](https://github.com/jellyfin/jellyfin/compare/v10.11.0...v10.11.5) since the initial 10.11.0 release.
|
||||
To date, most point releases have focused on resolving general and migration-related issues.
|
||||
The remaining migration issues are largely isolated, one-off cases and are unlikely to be resolved.
|
||||
Most general issues have already been fixed, and the next bug-fix release is expected to include additional fixes for music metadata display issues and for watched status not being preserved when media is replaced or renamed.
|
||||
|
||||
We are continuing to investigate ways to mitigate performance issues caused by client-side enumeration and filtering of large datasets.
|
||||
|
||||
### Jellyfin Web vNext (aka 10.12 / 12.0)
|
||||
|
||||
- **Default 'Experimental' Layout**: The 'Experimental' layout is now enabled by default for all non-TV devices, introducing a new navigation layout and updated UI components.
|
||||
- **Theming Support Overhaul**: We are improving theming support by enabling easier runtime customization of default themes through CSS variables and simplifying the process for creating new bundled themes.
|
||||
- **Community Acknowledgment**: Huge thanks to those reviewing, testing, and providing feedback on web pull requests. Your contributions are immensely helpful, as the review burden largely falls on me alone!
|
||||
|
||||
\- [thornbill](https://github.com/thornbill)
|
||||
|
||||
## Client Corner
|
||||
|
||||
### Jellyfin Desktop
|
||||
|
||||
We're rebranding the desktop application from Jellyfin Media Player to Jellyfin Desktop.
|
||||
The most noteworthy change is the migration from Qt 5 to Qt 6.
|
||||
This seems to have improved overall performance, though we're still working out issues regarding memory leaks due to the migration.
|
||||
|
||||
Apart from the Qt migration, other noteworthy updates.
|
||||
|
||||
- Saved servers and settings will not be migrated from Jellyfin Media Player.
|
||||
- We've laid the foundation for switching servers with the addition of profiles CLI options. The long-term goal is to have a UI for this as well, but the timeline is TBD.
|
||||
- A slew of bug fixes are included.
|
||||
|
||||
The release is currently available on [Flathub](https://github.com/jellyfin/jellyfin-desktop) and in the [Arch Linux AUR](https://aur.archlinux.org/packages/jellyfin-desktop).
|
||||
Stable builds for Windows and macOS builds are not currently available.
|
||||
Other Linux distributions will likely be added, though we recommend using Flathub for the time being.
|
||||
We are not currently supporting Ubuntu 24.04 LTS due to it being stuck on the older Qt 6.4 series, while our new dependency, mpvqt, requires at least Qt 6.5.
|
||||
|
||||
\- [Andrew Rabert](https://github.com/andrewrabert)
|
||||
|
||||
### Jellyfin for Android TV
|
||||
|
||||
Two versions of the Android TV app have been released: [v0.19.5](https://github.com/jellyfin/jellyfin-androidtv/releases/tag/v0.19.5) and [v0.19.6](https://github.com/jellyfin/jellyfin-androidtv/releases/tag/v0.19.6)!
|
||||
These updates contain various improvements to music transcoding. The app now properly displays durations again and allows for seeking when music is transcoding. These changes also solve the issue of lyrics not scrolling in certain cases.
|
||||
|
||||
For video playback, we have improved the stability of Live TV and now support direct play for the VC-1 and AV1 codecs (if your device supports them). The AV1 support was already available on Android 10 and newer but now works on older Fire TV devices as well.
|
||||
|
||||
\- [Niels van Velzen](https://github.com/nielsvanvelzen)
|
||||
|
||||
### Jellyfin for Xbox
|
||||
|
||||
The last two updates brought the long awaited full gamepad support and fixes for 4K and HDR.
|
||||
|
||||
- **Gamepad support**: Gamepad navigation is now the default navigation type for the Jellyfin for Xbox app and requires a server version of 10.11 or higher to work. However as we cannot switch the input mode type while the app is running, the Jellyfin for Xbox app can no longer connect to older versions than 10.11. As this is a fundamental change in how the app works, there are still a few hiccups like the app not loading correctly and users reporting that the gamepad does not work at all. In those instances we recommend uninstalling and reinstalling the app.
|
||||
- **Web UI TV mode**: For versions of Jellyfin earlier than 10.11.5 the web UI still runs in the desktop mode, which might look a bit odd. However, with Jellyfin 10.11.5, we have fixed a bug that now correctly sets the web UI to TV mode, so the UI should work a lot better.
|
||||
- **4K and HDR**: For the last few versions, we have been working on enabling 4K and HDR for the app. This is done by integrating with the web UI and switching the HDMI modes. Sadly, this also comes at the cost of not being allowed to run in the background. To enable 4K support, we had to use a feature flag that allocates more video memory to the Jellyfin for Xbox app, making it incompatible with running in the background.
|
||||
- **General Improvements**: Alongside the shiny new headline features, we have also been working on the code in general, adding small improvements and cleaning up a lot of code. The latest versions added log files and their upload to the Jellyfin server, tighter integrations with the web UI, a settings view that can be expanded for future features, version compatibility checking, a better server connection experience, and more.
|
||||
- **Future**: When I took over the for the previous maintainer almost a year ago, I made a rough plan for the general development of the app. I always planned on keeping the app as a web wrapper because while the app is certainly more popular than most think, it does not have enough support in development to be a full UWP app. Nevertheless, there are a few features left on my to-do list:
|
||||
- Localization to other languages
|
||||
- Server discovery
|
||||
- Desktop support
|
||||
- Better decoder support
|
||||
- Subtitle storage on-device
|
||||
|
||||
\- [JPVenson](https://github.com/JPVenson)
|
||||
|
||||
### Jellyfin for Roku
|
||||
|
||||
[3.0.15](https://github.com/jellyfin/jellyfin-roku/releases/tag/3.0.15) was released on 2025-12-18 and is our last release before Roku's year-end publishing blackout. It fixes a bug with HDHomeRun Tuners.
|
||||
|
||||
\- [1hitsong](https://github.com/1hitsong)
|
||||
|
||||
### Swiftfin
|
||||
|
||||
#### Swiftfin 1.4 is out now!
|
||||
|
||||
This is a large release with a lot of changes under the hood. Our three highlight changes are:
|
||||
|
||||
1. [Navigation & Routing Overhaul](https://github.com/jellyfin/Swiftfin/pull/1602)
|
||||
2. [Jellyfin 10.11 Support](https://github.com/jellyfin/Swiftfin/pull/1772)
|
||||
3. [Revamped Media Player Manager](https://github.com/jellyfin/Swiftfin/pull/1581)
|
||||
|
||||
#### Swiftfin Roadmap
|
||||
|
||||
A [roadmap / project board](https://github.com/orgs/jellyfin/projects/68) for Swiftfin is now available!
|
||||
|
||||
Follow [this discussion](https://github.com/jellyfin/Swiftfin/discussions/1294) for information about the next tvOS release.
|
||||
|
||||
To help organize Issues & PRs, Swiftfin now has milestones to help users identify which changes will be included in each release:
|
||||
|
||||
- [Version 1.5](https://github.com/jellyfin/Swiftfin/milestone/2)
|
||||
- Contains issues that should be resolved in version 1.5 of Swiftfin iOS.
|
||||
- [tvOS Resync](https://github.com/jellyfin/Swiftfin/milestone/3)
|
||||
- Contains tvOS-specific issues that will be resolved as part of our next [tvOS Release](https://github.com/jellyfin/Swiftfin/discussions/1294).
|
||||
- _Issues that impact tvOS but are part of 1.4 or 1.5 will end up in the version milestone instead of this one. Once tvOS is released, it should mirror our existing 1.X structure and iOS._
|
||||
|
||||
A more detailed post about these changes can be found [on GitHub](https://github.com/jellyfin/Swiftfin/discussions/1832)!
|
||||
|
||||
\- [JPKribs](https://github.com/JPKribs)
|
||||
|
||||
### Other TV Platforms
|
||||
|
||||
- The Tizen app was submitted for review, but unfortunately [failed testing](https://github.com/jellyfin/jellyfin-tizen/issues/222#issuecomment-3621581689). Additional work is needed to replicate the reported issues and correct them.
|
||||
- Support for multiple **new** platforms is currently underway, and we will provide updates as progress is made.
|
||||
|
||||
Wishing you all happy streaming in 2026 and beyond!
|
||||
We look forward to another year filled with exciting updates and features for Jellyfin.
|
||||
|
||||
\- thornbill and the Jellyfin Team
|
||||
@@ -33,6 +33,10 @@ joshuaboniface:
|
||||
title: Project Leader
|
||||
url: https://github.com/joshuaboniface
|
||||
image_url: https://avatars.githubusercontent.com/u/4031396?v=4
|
||||
socials:
|
||||
github: joshuaboniface
|
||||
mastodon: https://social.bonifacelabs.ca/@joshuaboniface
|
||||
reddit: https://reddit.com/u/djbon2112
|
||||
|
||||
mcarlton00:
|
||||
name: Matt Carlton
|
||||
@@ -70,7 +74,7 @@ JPVenson:
|
||||
thornbill:
|
||||
name: Bill Thornton
|
||||
page: true
|
||||
title: Core Team, Web Lead
|
||||
title: Core Team, Web and iOS Lead
|
||||
image_url: https://avatars.githubusercontent.com/u/3450688?v=4
|
||||
socials:
|
||||
github: thornbill
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
---
|
||||
uid: donate-directly
|
||||
title: Donations to individual developers
|
||||
---
|
||||
|
||||
import Link from '@docusaurus/Link';
|
||||
import { donations } from '../../../../src/data/donations';
|
||||
|
||||
Jellyfin is free and will always be free. We do not accept any money or benefit for any form of favor or feature and no implicit or explicit entitlement should be assumed or demanded when donating to Jellyfin or one of its developers.
|
||||
|
||||
That said the many developers or moderators accept donations purely as a sign of gratitude for their volunteer work on the project or officially related.
|
||||
|
||||
This table is not conclusive and if you are missing a specific person you want to donate to, please contact the developer directly.
|
||||
This list is also intentionally randomly ordered to avoid any appearance of favoring any one developer.
|
||||
|
||||
<Link to={donations.sort(() => Math.random() - 0.5)[0].links[0].url}>Pick for me, just somebody.</Link>
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<th>Username</th>
|
||||
<th>Role</th>
|
||||
<th>Donation Links</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
{donations
|
||||
.sort(() => Math.random() - 0.5)
|
||||
.map((element) => (
|
||||
<tr>
|
||||
<td>{element.title}</td>
|
||||
<td>
|
||||
<ul>
|
||||
{element.roles.map((role) => (
|
||||
<li>{role}</li>
|
||||
))}
|
||||
</ul>
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
{element.links.map((link) => (
|
||||
<li>
|
||||
<Link to={link.url}>{link.name}</Link>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
The rules for inclusion into this lists are being a currently active member of the Jellyfin Team and having shown a long term commitment towards the project as a whole.
|
||||
This can mean either significant contributions to the Jellyfin Server project, any officially recognised Clients or a Jellyfin-Labs project; or existing long commitments towards official moderation efforts as an community moderator in our chat or forum.
|
||||
|
||||
As with all official associations with the Jellyfin project, the Core team has the final say on any decision regarding modifications to this list.
|
||||
@@ -0,0 +1,30 @@
|
||||
---
|
||||
uid: documentation
|
||||
title: Contributing to Documentation
|
||||
---
|
||||
|
||||
# Contributing to Documentation
|
||||
|
||||
## What to change and Why
|
||||
|
||||
Documentation is fast-moving and ever-changing. Please think carefully about what you're changing and why; what will it contribute going forward? Extensive rewrites and new pages should be considered very carefully and coordinated in our [documentation Matrix room](/contact).
|
||||
|
||||
## Please Self-Review
|
||||
|
||||
Before finalizing your changes, please be courteous to reviewers and run your changes through, at least, a spellchecker (e.g. `apsell`) and potentially a grammar checker. AI is fine for this though please use it sparingly for _generating_ content. Make sure you re-read what comes out and adjust as required. We appreciate individual writing styles but the bulk of our review back-and-forth is over minor issues like this, so please do your part to get it right first.
|
||||
|
||||
## Peer Copyediting
|
||||
|
||||
For very large changes, we encourage the idea of peer copyediting. Instead of submitting a massive PR and then having back-and-forth line-by-line editing in there, we suggest placing your new/updated doc in a collaborative document editor such as [HackMD](https://hackmd.io) and sharing it in our [documentation Matrix room](/contact). You can then, between chat and the collaborative editor, obtain a line-by-line copyedit for spelling, grammar, and formatting, without back-and-forth in the PR. Once both sides are happy with the changes, a pull request can then be submitted.
|
||||
|
||||
While this does seem like "more work", for substantial changes this should ideally be a small part of the entire process, and will help ensure that final reviews go more smoothly.
|
||||
|
||||
## Peer Reviews
|
||||
|
||||
Due to the volume of pull requests to our documentation repo and the varying sizes of them, some pull requests will take a long time to review, and potentially languish as a result.
|
||||
|
||||
Before (or, immediately after) submitting a PR for review, we ask you to find another PR from another person, ideally one which is not already peer- or team-reviewed, and perform a thorough readthrough of the changes. Make sure they make sense to you, that the copyediting is good, and provide a GitHub review of it. If necessary please point out any change suggestions. This will help go a long way to helping your PR be reviewed, as the next contributor can review your PR in turn.
|
||||
|
||||
## Blog Posts
|
||||
|
||||
Blog posts are exclusively written by our team members; we do not accept outside blog posts under any circumstances. Blog posts should follow all the above processes, and further require final approval from the Core team in addition to regular documentation approvers. Blog posts may stay in draft or review status for some time, until the event they correlate with (e.g. a release); the date should always reflect the final (expected) publishing date.
|
||||
@@ -23,7 +23,7 @@ For general guidelines on how the project works, including how to set up your de
|
||||
|
||||
## Adding To Documentation
|
||||
|
||||
Documentation is incredibly helpful! All these docs are written using [Docusaurus](https://docusaurus.io/docs/markdown-features). You can find the raw markdown in the [documentation repository](https://github.com/jellyfin/jellyfin.org). Pull requests are welcome!
|
||||
Documentation is incredibly helpful! All these docs are written using [Docusaurus](https://docusaurus.io/docs/markdown-features). You can find the raw markdown in the [documentation repository](https://github.com/jellyfin/jellyfin.org). Pull requests are welcome, though please review our [documentation process](/docs/general/contributing/documentation) first!
|
||||
|
||||
## Translating
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ When writing a bug issue, please ensure you capture as much relevant detail as p
|
||||
|
||||
Bugs should be tagged with `[bug]` at the beginning of their title. This will later be removed by the Jellyfin team when assigning labels. To assist in triaging, if you know which other [label(s)](/developers/docs/contributing/issues#issue-labels) should be applied to your issue, please add them after the `[bug]` label.
|
||||
|
||||
Bugs should be reproduceable. That is, you should be able to have determined through troubleshooting how to replicate the issue. While one-time bugs should not be ignored, if they're difficult or impossible to reproduce, it's likely very hard to fix them. Please attempt to reproduce the bug before filing the issue and include the smallest test case you can to demonstrate it.
|
||||
Bugs should be reproducible. That is, you should be able to have determined through troubleshooting how to replicate the issue. While one-time bugs should not be ignored, if they're difficult or impossible to reproduce, it's likely very hard to fix them. Please attempt to reproduce the bug before filing the issue and include the smallest test case you can to demonstrate it.
|
||||
|
||||
If you ever need assistance for troubleshooting or opening an issue, please [contact the community](/docs/general/getting-help) and we'll try to help you out!
|
||||
|
||||
|
||||
@@ -17,31 +17,70 @@ Backups may also come in handy if you hit a bug. For instance, if a bug in the n
|
||||
|
||||
Finally, administrative mistakes, normal operation issues (e.g. filling up a disk), or general bit rot can cause corruption or issues that require a backup to be restored. It's always better to have one than not.
|
||||
|
||||
## Taking a Backup
|
||||
There are two ways of backing up your Jellyfin data. One is with its built-in Backup/Restore system and the other is manually.
|
||||
|
||||
## Built-in Backup
|
||||
|
||||
Jellyfin's built-in backup system is able to create a backup while your system is online and running, as opposed to the manual process that **requires** you to stop Jellyfin beforehand.
|
||||
However in 10.11 we still recommend performing the backup process during a time of low activity and while no scan is currently active.
|
||||
|
||||
### Create a Built-in Backup
|
||||
|
||||
To take a new Backup, enter the Jellyfin Dashboard, open the `Backups` tab and click on the `Create Backup` button. The popup will now ask you to select what data you want to backup.
|
||||
|
||||
- Database. Always enabled. Will contain all data from the jellyfin.db or used database provider.
|
||||
- Metadata. The contents of the metadata folder and depending on your selected options may contain metadata images.
|
||||
- Subtitles. All extracted subtitles including downloaded ones.
|
||||
- Trickplay. All trickplay data that is stored not alongside media.
|
||||
|
||||
The Backup system will check for at least 5GB of free space in the backup folder where backups a written to. However this can easily not be enough if you also backup Subtitles and Trickplay so ensure you have enough free space there.
|
||||
The Backup folder is located within your Jellyfin data directory, by default:
|
||||
|
||||
- Official Docker: `<volume path>/config/data/backups` where `<volume path>` is where your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`.
|
||||
- LinuxServer.io Docker: `<volume path>/config/data/data/backups` where `<volume path>` is where your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`.
|
||||
- Debian/Ubuntu packages: `/var/lib/jellyfin/data/backups`.
|
||||
- RPMFusion Fedora/CentOS packages: `/var/lib/jellyfin/data/backups`.
|
||||
- Windows User Install: `%LOCALAPPDATA%\Jellyfin\data\backups` (`C:\Users\<Username>\AppData\Local\Jellyfin\data\backups`)
|
||||
- Windows Service Install: `%PROGRAMDATA%\Jellyfin\Server\data\backups` (`C:\ProgramData\Jellyfin\Server\data\backups`)
|
||||
- MacOS Installer (.dmg): Data is stored in one of these paths; back up whichever one(s) exist: `~/.config/jellyfin/data/backups`, `~/.local/share/jellyfin/data/backups`, `~/Library/Application Support/Jellyfin/data/backups`:
|
||||
- Portable Installs:
|
||||
- Linux: Data is stored in `~/.local/share/jellyfin/data/backups`.
|
||||
- Windows: Data and config is in `C:\Users\<Username>\AppData\Local\jellyfin\data\backups`, using `%LOCALAPPDATA%`.
|
||||
- MacOS: Data is stored in these paths; back up whichever one(s) exist: `~/.config/jellyfin/data/backups`, `~/.local/share/jellyfin/data/backups`, `~/Library/Application Support/Jellyfin/data/backups`.
|
||||
|
||||
After clicking on the `Create` button all data will be written into a new zip archive.
|
||||
|
||||
### Restore from a Built-in Backup
|
||||
|
||||
To restore from a Backup you can either use the webUI by navigating to the same view as for the step above and clicking on the restore button in the list of backups, or you can start jellyfin with the `--restore-archive PATH_TO_BACKUP_ZIP` argument. Note that when you start a restore from the webUI, your server will immediately restart for this process to take place and will be unavailable for that time.
|
||||
|
||||
## Manual Backup
|
||||
|
||||
Taking a manual Backup essentially involves you copying all the data jellyfin requires on your own.
|
||||
|
||||
### Create a Manual Backup
|
||||
|
||||
1. Stop the running Jellyfin server. This is extremely important, as otherwise the database will be locked and might not be recoverable when restoring. Note that this will interrupt any playback.
|
||||
|
||||
* Any platform: Within the Jellyfin Dashboard, click "Shutdown". This should cleanly stop the process on all platforms, but if not, try one of the following.
|
||||
* Docker: `docker stop jellyfin`
|
||||
* Debian/Ubuntu packages: `sudo systemctl stop jellyfin` or `sudo service jellyfin stop`
|
||||
* Windows Installer: Right-click the Tray app, and select "Quit"; or, in Process Manager, find the Jellyfin process and terminate it.
|
||||
* MacOS Installer (.dmg): In Activity Monitor, find the Jellyfin process and terminate it.
|
||||
* Portable Installs (regardless of platform): Stop the running `jellyfin` or `jellyfin.exe` program, however it was started.
|
||||
- Any platform: Within the Jellyfin Dashboard, click "Shutdown". This should cleanly stop the process on all platforms, but if not, try one of the following.
|
||||
- Docker: `docker stop jellyfin`
|
||||
- Debian/Ubuntu packages: `sudo systemctl stop jellyfin` or `sudo service jellyfin stop`
|
||||
- Windows Installer: Right-click the Tray app, and select "Quit"; or, in Process Manager, find the Jellyfin process and terminate it.
|
||||
- MacOS Installer (.dmg): In Activity Monitor, find the Jellyfin process and terminate it.
|
||||
- Portable Installs (regardless of platform): Stop the running `jellyfin` or `jellyfin.exe` program, however it was started.
|
||||
|
||||
2. Copy your data and configuration directories to a destination of your choice. What you name the copies is up to you; personally, I like to use dated and versioned directory names e.g. `jellyfin.2024-05-01_10.8.13`. Where these files are also depends on the platform; generally these follow the [XDG Directory Specification](https://specifications.freedesktop.org/basedir-spec/latest/) for platforms that support it. For more information see [the configuration documentation](/docs/general/administration/configuration/#server-paths).
|
||||
|
||||
**NOTE**: These are default locations; if you've changed your data or config paths, use those instead.
|
||||
|
||||
* Official Docker: Wherever your `/data` and `/config` volumes are sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`.
|
||||
* LinuxServer.io Docker: Data and config are wherever your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`.
|
||||
* Debian/Ubuntu packages: Data is in `/var/lib/jellyfin` and config is in `/etc/jellyfin`; these are defined in `/etc/default/jellyfin`.
|
||||
* RPMFusion Fedora/CentOS packages: Data is in `/var/lib/jellyfin` and config is in `/etc/jellyfin`; these are defined in `/etc/sysconfig/jellyfin`.
|
||||
* Windows Tray/Installer (.exe): Data and config is in `%PROGRAMDATA%\Jellyfin\Server` (`C:\ProgramData\Jellyfin\Server`) or `%LOCALAPPDATA%\Jellyfin` (`C:\Users\<Username>\AppData\Local\Jellyfin`).
|
||||
* MacOS Installer (.dmg): Data is stored in one of these paths; back up whichever one(s) exist: `~/.config/jellyfin/`, `~/.local/share/jellyfin/`, `~/Library/Application Support/Jellyfin/`.
|
||||
* Portable Installs:
|
||||
* Linux: Data is stored in `~/.local/share/jellyfin` and config in `~/.local/share/jellyfin`.
|
||||
* Windows: Data and config is in `C:\Users\<Username>\AppData\Local\Jellyfin`, using `%LOCALAPPDATA%`.
|
||||
* MacOS: Data is stored in these paths; back up whichever one(s) exist: `~/.config/jellyfin/`, `~/.local/share/jellyfin/`, `~/Library/Application Support/Jellyfin/`.
|
||||
- Official Docker: The data directory is wherever your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. This directory contains the config directory as well.
|
||||
- LinuxServer.io Docker: The config directory is wherever your `/config` volume is sourced from; this is set in your `docker-compose.yml` or in your `-v` options to `docker run`. This directory contains the data directory as well.
|
||||
- Debian/Ubuntu packages: The data directory is `/var/lib/jellyfin` and the config directory is `/etc/jellyfin`; these are defined in `/etc/default/jellyfin`.
|
||||
- RPMFusion Fedora/CentOS packages: The data directory is `/var/lib/jellyfin` and the config directory is `/etc/jellyfin`; these are defined in `/etc/sysconfig/jellyfin`.
|
||||
- Windows Tray/Installer (.exe): The data directory is `%PROGRAMDATA%\Jellyfin\Server` (`C:\ProgramData\Jellyfin\Server`) or `%LOCALAPPDATA%\Jellyfin` (`C:\Users\<Username>\AppData\Local\Jellyfin`). This directory contains the config directory as well.
|
||||
- MacOS Installer (.dmg): Data is stored in one of these paths; back up whichever one(s) exist: `~/.config/jellyfin/`, `~/.local/share/jellyfin/`, `~/Library/Application Support/Jellyfin/`.
|
||||
- Portable Installs:
|
||||
- Linux: The data and config directories are both `~/.local/share/jellyfin`.
|
||||
- Windows: The data directory is `%LOCALAPPDATA%\jellyfin` (`C:\Users\<Username>\AppData\Local\jellyfin`). This directory contains the config directory as well.
|
||||
- MacOS: Data is stored in these paths; back up whichever one(s) exist: `~/.config/jellyfin/`, `~/.local/share/jellyfin/`, `~/Library/Application Support/Jellyfin/`.
|
||||
|
||||
As an example, on Debian, you can do this with these commands to make a copy of both directories into a single target directory:
|
||||
|
||||
@@ -55,7 +94,7 @@ Finally, administrative mistakes, normal operation issues (e.g. filling up a dis
|
||||
|
||||
3. Start up Jellyfin again, either after upgrading or on the current version. You now have a safe copy of your data in the path chosen in step 2.
|
||||
|
||||
## Restoring a Backup
|
||||
### Restore from a Manual Backup
|
||||
|
||||
This process assumes you followed the steps above to take the backup.
|
||||
|
||||
@@ -68,7 +107,3 @@ This process assumes you followed the steps above to take the backup.
|
||||
4. If required, downgrade Jellyfin to the same version as your backup now.
|
||||
|
||||
5. Start up Jellyfin again. It should start cleanly with the old data, assuming versions are correct. If you downgraded this may happen automatically.
|
||||
|
||||
## The Future
|
||||
|
||||
Long-term, we have plans to provide an official backup and restore plugin bundled with Jellyfin, however this requires the completion of our EFCore rewrite, which is currently slated for our next major release 10.11.0. Once that becomes available, this document will be updated to reflect the process using that plugin.
|
||||
|
||||
@@ -19,7 +19,7 @@ Documentation for the available command line options can be obtained by adding t
|
||||
|
||||
## Server Paths
|
||||
|
||||
The file paths used by the server are determined according to the rules outlined below. In general, the [XDG specification](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html) is followed by default for non-Windows systems.
|
||||
The file paths used by the server are determined according to the rules outlined below. In general, the [XDG specification](https://specifications.freedesktop.org/basedir-spec/latest/) is followed by default for non-Windows systems.
|
||||
|
||||
### Data Directory
|
||||
|
||||
|
||||
@@ -5,11 +5,11 @@ title: Hardware Selection
|
||||
|
||||
# Selecting Appropriate Hardware
|
||||
|
||||
This page covers what you need to know in order to select appropriate hardware for a Jellyfin server and take full advantage of its features (e. g. hardware acceleration).
|
||||
The following is intended to help you choose appropriate hardware for a Jellyfin server and take full advantage of its features (e.g. hardware acceleration).
|
||||
|
||||
## TL;DR
|
||||
## Simple Guide
|
||||
|
||||
Below is a list of recommended specs to run Jellyfin. Even though Jellyfin will work on even lower end hardware, the following specs are recommended for a good experience.
|
||||
Below is a list of recommended specs to run Jellyfin. Whilst Jellyfin can work on relatively low-end hardware, the following specs are recommended for a good experience.
|
||||
|
||||
### Shared Items
|
||||
|
||||
@@ -17,48 +17,48 @@ Some component recommendations do not change regardless of the hardware configur
|
||||
|
||||
- Storage: 100GB SSD for your OS, Jellyfin files and transcoding cache.<sup>1</sup> Consider adding more on Windows 11, or if you have many large media files that need transcoding.
|
||||
- Networking: Gigabit Ethernet Adapter or faster, WiFi or Powerline not recommended.
|
||||
- Internet Connection: At least 20mbps upload bandwidth for remote access.<sup>2</sup>
|
||||
- Internet Connection: At least 20 Mbps upload bandwidth for remote access.<sup>2</sup>
|
||||
|
||||
<sup>1</sup>Your largest media file times the max number of concurrent streams all your users will consume can be used as a rule of thumb for the transcoding file size. <br />
|
||||
<sup>2</sup>If you have less than 100mbps of total upload bandwidth, a bandwidth limit of 70% of your upload speed for Jellyfin is recommended to avoid affecting normal internet usage. This option can be found in the dashboard.
|
||||
<sup>2</sup>If you have less than 100 Mbps of total upload bandwidth, a bandwidth limit of 70% of your upload speed for Jellyfin is recommended to avoid affecting internet usage outside of Jellyfin. This option can be found in the Jellyfin Server `Dashboard`.
|
||||
|
||||
### Hardware Encoder Quality
|
||||
|
||||
Different vendors have different hardware encoder implementations and produce different results. Usually, newer generations within the same vendor will provide better results. The following is a quick comparison on the quality between vendors on modern products.
|
||||
|
||||
Apple ≥ Intel ≥ Nvidia >>> AMD<sup>\*</sup>
|
||||
Apple ≥ Intel ≥ NVIDIA >>> AMD<sup>\*</sup>
|
||||
|
||||
<sup>\*</sup> This only represents the default Jellyfin settings. The quality may be different depending on your exact configuration.
|
||||
|
||||
### Server with Integrated Graphics
|
||||
|
||||
If you are not planning to use a dedicated graphics card, the following specs are recommended:
|
||||
If you do not intend to use a dedicated graphics card, the following specs are recommended:
|
||||
|
||||
- CPU: Intel Core i5-11400, Intel Pentium Gold G7400, Intel N100, Apple M series or newer (excluding Intel J/M/N/Y series up to 11th gen)
|
||||
- RAM: 8GB System RAM (Consider adding more on Windows 11)
|
||||
- Graphics: Intel UHD 710, Apple M series or newer
|
||||
|
||||
AMD is **NOT** recommended if you plan to use integrated graphics for Jellyfin.
|
||||
AMD is **NOT** recommended if you intend to use integrated graphics for Jellyfin.
|
||||
|
||||
:::caution
|
||||
|
||||
Intel 7-10th gen CPUs have been removed from this list, since the toolkit for these generations has been deprecated by Intel. If you own 7-10th gen CPUs with integrated graphics, please continue to use them for Jellyfin, as they are still perfectly capable of performing the task. If you are making a purchase decision, please consider something else instead.
|
||||
Intel 7-10th gen CPUs have been removed from this list, since the toolkit for these generations has been deprecated by Intel. If you own a 7-10th gen CPU with integrated graphics, please continue to use them for Jellyfin, as they are still perfectly capable of performing the task. If you are making a purchase decision, you may wish to consider alternatives.
|
||||
|
||||
:::
|
||||
|
||||
### Server with Dedicated Graphics
|
||||
|
||||
If you are planning to use a dedicated graphics card (including upgrading an old system with a dedicated GPU), the following specs are recommended:
|
||||
If you intend to use a dedicated graphics card (including upgrading an old system with a dedicated GPU), the following specs are recommended:
|
||||
|
||||
- CPU: Intel Core i5-2300, AMD FX-8100 or better (Geekbench 6 Multicore 1500 or better), CPU Vendor / Performance will **NOT** affect hardware encode speed or quality
|
||||
- RAM: 8GB (4GB should be enough for a server running Linux without a GUI)
|
||||
- Graphics: Intel Arc A series or newer, Nvidia GTX16/RTX20 series or newer (Excluding GTX1650), **AMD is NOT recommended**.
|
||||
- CPU: Intel Core i5-2300,AMD FX-8100 or better (Geekbench 6 Multicore 1500 or better), CPU Vendor / Performance will **NOT** affect hardware encode speed or quality
|
||||
- RAM: 8GB. (4GB may be sufficient for a Linux server without its own GUI.)
|
||||
- Graphics: Intel Arc A series or newer, NVIDIA GTX16/RTX20 series or newer (Excluding GTX1650), **AMD is NOT recommended**.
|
||||
|
||||
Intel Drivers are much easier to install on Linux, with many distributions including them by default. If you do not need CUDA for other applications, it is highly recommended that you stick with Intel Graphics on Linux.
|
||||
|
||||
:::caution
|
||||
|
||||
Intel ARC B series cards require ReBar to be enabled. This means you must use it on a platform with Intel 10th gen, AMD Ryzen 3000 series or newer.
|
||||
Intel ARC B-series cards require ReBar to be enabled. This means you must use it on a platform with Intel 10th gen, AMD Ryzen 3000 series or newer. Intel ARC A-series cards do not require ReBar to function, however, ReBar should be enabled for optimal performance.
|
||||
|
||||
:::
|
||||
|
||||
@@ -70,21 +70,21 @@ where a Ryzen 9 5950X cannot handle even a single video stream. Please read [the
|
||||
|
||||
### Low Power Servers
|
||||
|
||||
For users with expensive power or running servers on battery power:
|
||||
For users with expensive electricity, or running battery-powered servers:
|
||||
|
||||
- Intel 12th gen or above N series platforms
|
||||
- Apple M Series mac mini
|
||||
- Apple M Series Mac mini
|
||||
- Rockchip RK3588 / RK3588S SBC (**Advanced Users Only**)
|
||||
|
||||
### Potentially Problematic Hardware
|
||||
|
||||
These hardware platforms might lead to a poor Jellyfin experience. Please be careful to avoid them when shopping for hardware.
|
||||
|
||||
- Intel "Atom" CPUs: Intel J/M/N/Y series low power CPUs up to 11th gen use a different architecture than higher end parts, leading to subpar performance despite what their names might suggest. Please be careful about these parts when shopping for a system to run Jellyfin.
|
||||
- Prebuilt NAS devices: The software environment on most Prebuilt NAS devices often causes 3rd party software to be hard to install and not work properly. They also often have low end processors that are too slow for a good Jellyfin experience (Intel Atom, Realtek ARM CPUs etc.).
|
||||
- Most Single Board Computers (SBC): Most SBCs (Including Raspberry Pis and **especially the Pi 5**) are too slow to provide a good Jellyfin experience since they often lack proper support for hardware acceleration. If You really want to run Jellyfin on an SBC, please look at models based on the following platforms: Rockchip RK3588 / RK3588S, Intel Core, Intel 12th gen N series
|
||||
- Intel "Atom" CPUs: Intel J/M/N/Y series low power CPUs up to 11th gen use a different architecture than higher end parts, leading to subpar performance despite what their names might suggest. It is advised to avoid using these parts in a Jellyfin Server.
|
||||
- Prebuilt NAS Appliances: The software environment on most prebuilt NAS appliances often makes third-party software more challenging to install, sometimes even preventing it from working properly despite a successful installation. They may have low-end processors that are too slow for an acceptable Jellyfin experience. (e.g. Intel Atom, Realtek ARM CPUs, etc.).
|
||||
- Most Single Board Computers (SBC): Most SBCs (including the Raspberry Pi, **especially the Raspberry Pi 5**) are too slow to provide an acceptable Jellyfin experience as they often lack proper support for hardware acceleration. If you really want to run Jellyfin on an SBC, you may wish to consider models based on the following platforms: Rockchip RK3588 / RK3588S, Intel Core, Intel 12th gen N series
|
||||
- AMD Graphics: AMD Graphics have poor encoder quality and poor driver support. **This applies even on Linux**.
|
||||
- Low end GPUs: Certain low end GPUs (eg. GT1030, RX6400) don't have hardware encoding available. These models can't be used for Jellyfin hardware acceleration.
|
||||
- Low-end GPUs: Certain low-end GPUs (e.g. GT1030, RX6400) are not capable of hardware encoding. These models cannot be used for hardware acceleration for a Jellyfin Server.
|
||||
|
||||
## Detailed Guide
|
||||
|
||||
@@ -95,94 +95,95 @@ The CPU will be responsible for many tasks, notably:
|
||||
- Transcoding Audio
|
||||
- Decoding video in unsupported codecs
|
||||
|
||||
Audio codecs are very lightweight and most CPUs should be able to handle them without issues (Ryzen 5950X FLAC -> AAC transcoding runs at ~110x real time). Please note that they will only use one core.
|
||||
Whilst most audio codecs will only utilize a single core, they are very lightweight and most CPUs should be able to handle them without issues. (e.g. a Ryzen 5950X transcoding `FLAC -> AAC` runs at ~110x real-time.)
|
||||
|
||||
Video in unsupported codecs are usually older formats that are easier to decode. Assuming hardware acceleration is properly configured, any modern CPU with 4 threads should be able to handle the workload.
|
||||
|
||||
However, newer codecs can also require software decoding if there are no available hardware decoders. HEVC, VP9 and AV1 can be **VERY** demanding even on modern CPUs if hardware acceleration isn't available. This is why a hardware platform capable of HEVC 10bit hardware decoding is strongly recommended.
|
||||
However, newer codecs can also require software decoding if there are no available hardware decoders. HEVC, VP9 and AV1 can be **VERY** demanding even on modern CPUs if hardware acceleration is not available on a Jellyfin Server. This is why a hardware platform capable of HEVC 10bit hardware decoding is strongly recommended.
|
||||
|
||||
In our custom `jellyfin-ffmpeg` fork, the dav1d decoder is enabled, leading to faster software decoding compared to HEVC or VP9. However, it will still use significantly more resources compared to software decoding H.264 or older codecs. Since we have a more efficient AV1 software decoder, and AV1 media isn't common yet, you shouldn't worry about AV1 when shopping for hardware.
|
||||
In our custom `jellyfin-ffmpeg` fork, the dav1d decoder is enabled, leading to faster software decoding compared to HEVC or VP9. However, it will still use significantly more resources compared to software decoding H.264 and older codecs. Since we have a more efficient AV1 software decoder, and AV1 media isn't common yet, you shouldn't worry about AV1 when choosing components for your Jellyfin Server.
|
||||
|
||||
#### Integrated Graphics
|
||||
|
||||
Integrated graphics can be useful for transcoding video. Please refer to [the GPU section](/docs/general/administration/hardware-selection#graphics-cards-gpus) for a guide.
|
||||
Integrated graphics can be useful for transcoding video. For more information, please refer to [the GPU section](/docs/general/administration/hardware-selection#graphics-cards-gpus).
|
||||
|
||||
#### Resizable BAR
|
||||
|
||||
[Resizable Bar (ReBAR)](https://www.intel.com/content/www/us/en/support/articles/000090831/graphics.html) is a PCI Express feature that optimizes access to PCIe devices. This feature requires support from both the platform and the device. Intel 10th gen or above and AMD Ryzen 3000 Series or above have support for this feature.
|
||||
[Resizable Bar (ReBAR)](https://www.intel.com/content/www/us/en/support/articles/000090831/graphics.html) is a PCI Express feature that optimizes access to PCIe devices. This feature requires support from both the platform and the device. Support for this feature is respectively available beginning with Intel 10th gen and AMD Ryzen 3000 Series.
|
||||
|
||||
In BIOS settings of motherboards, it may also be called `Smart Access Memory` or `Clever Access Memory`
|
||||
|
||||
When using Intel ARC Graphics, Resizable BAR is recommended. Disabling it will result in a 10% reduction in transcoding performance. However, given how fast the media engine on Intel ARC is, this will not be a problem for the vast majority of users.
|
||||
When using Intel ARC Graphics, Resizable BAR is recommended. Disabling it will result in a 10% reduction in transcoding performance. However, given how fast the media engine on Intel ARC is, this should not be a problem for the average deployment.
|
||||
|
||||
#### Software HDR to SDR Tone-mapping
|
||||
|
||||
If there is no GPU available, the CPU can also be used to tone-map HDR content to SDR. **This can be very demanding on
|
||||
If there is no GPU available on a Jellyfin Server, the CPU can also be used to tone-map HDR content to SDR. **This can be very demanding on
|
||||
the CPU, therefore a GPU is ALWAYS recommended.** When using software tone-mapping, a software encoder will always be
|
||||
used. Tone-mapping 4K 60fps Dolby Vision content to 4K 60fps H264 SDR requires a Ryzen 9 5950X for faster than real time
|
||||
transcoding. If you would like to output in H265 or AV1, you may end up in situations where no current desktop CPUs have
|
||||
enough performance.
|
||||
used. Tone-mapping 4K 60fps Dolby Vision content to 4K 60fps H264 SDR requires a Ryzen 9 5950X for faster than real-time
|
||||
transcoding. You may find current desktop CPUs do not offer adequate performance if you seek to provide streams in H.265 or AV1.
|
||||
|
||||
### System Memory (RAM)
|
||||
|
||||
As a general rule of thumb, at least 8GB is recommended for most configurations. For a Linux server running without a GUI, 4GB should be enough.
|
||||
As a general recommendation, at least 8GB is recommended for the average deployment. For a Linux server running without a GUI, 4GB may be enough.
|
||||
|
||||
It is recommended to add more memory on Windows 11 due to the OS being heavier.
|
||||
It is recommended to add more memory when using Windows 11 due to the OS being heavier.
|
||||
|
||||
### Graphics Cards (GPUs)
|
||||
|
||||
With modern systems, the media engines are usually located on the GPUs. Therefore, the available hardware acceleration options are determined by the choice of GPU.
|
||||
|
||||
Encoder Quality: Apple ≥ Intel ≥ Nvidia >>> AMD<sup>\*</sup>
|
||||
Encoder Quality: Apple ≥ Intel ≥ NVIDIA >>> AMD<sup>\*</sup>
|
||||
|
||||
<sup>\*</sup> This only represents the default Jellyfin settings. The quality may be different depending on your exact configuration.
|
||||
|
||||
Intel is always recommended on non-apple hardware for the following reasons:
|
||||
Intel is always recommended on non-Apple hardware for the following reasons:
|
||||
|
||||
- Intel provides a good quality encoder, slightly better than Nvidia and significantly better than AMD.
|
||||
- Intel drivers and the compute environment is much easier to setup than both Nvidia and AMD
|
||||
- Intel provides a good quality encoder, slightly better than NVIDIA and significantly better than AMD.
|
||||
- Intel drivers and the compute environment is much easier to setup than both NVIDIA and AMD
|
||||
|
||||
AMD is not recommended because of poor quality H.264 and H.265(HEVC) output, as well as being hard to setup the compute environment. While AMD has significantly improved AV1 encoder quality, you are still more likely to transcode to H.264 or H.265 than to AV1 due to compatibility.
|
||||
AMD is not recommended due to poor quality H.264 and H.265 (HEVC) output, as well as being hard to set up the compute environment. While AMD has significantly improved AV1 encoder quality, you are still more likely to transcode to H.264 or H.265 than to AV1 due to the hardware capabilities of the average Jellyfin client.
|
||||
|
||||
A list of common codecs can be found in the [codec support documentation](/docs/general/clients/codec-support/).
|
||||
|
||||
The following is a list of video codecs Jellyfin supports transcoding to:
|
||||
|
||||
- H.264 (Most common transcode target)
|
||||
- H.265 (Limited support by clients)
|
||||
- AV1 (New in 10.9, supported by most modern browsers)
|
||||
- H.264 (most common transcode target)
|
||||
- H.265 (Jellyfin clients have limited support)
|
||||
- AV1 (new in Jellyfin v10.9, supported by most modern browsers)
|
||||
|
||||
For decoding support, the more codecs the better. However, there are only a few codecs that media is commonly available in. The most important one to look for is HEVC 10bit decoding support, as it can be very demanding on the CPU to decode.
|
||||
A greater number of codecs is desirable for decoding support. With that said, media is generally available in a small number of codecs. The most important one to look for is HEVC 10bit decoding support, as decoding can be CPU intensive.
|
||||
|
||||
#### Intel Graphics
|
||||
|
||||
Please refer to [this table](https://en.wikipedia.org/wiki/Intel_Quick_Sync_Video#Hardware_decoding_and_encoding) for supported codecs.
|
||||
|
||||
Intel CPUs with a model description that ends with F don't have integrated graphics. These are intended to be used with a dedicated graphics card. Please beware if you intend to use Intel integrated graphics.
|
||||
Intel CPUs with a model name that ends with `F` do not have integrated graphics. These are intended to be used with a dedicated graphics card, meaning that if you wish to use Intel integrated graphics, this is not an appropriate choice of component for your Jellyfin Server.
|
||||
|
||||
If you are planning to use Linux with Intel 12/13th Gen integrated graphics or ARC, these GPUs only work on Linux Kernel 6.2 or newer. Please check your distribution to make sure it has a supported Linux Kernel version. Please read [Known Intel limitations on Linux](/docs/general/post-install/transcoding/hardware-acceleration/known-issues#intel-on-linux) for more info.
|
||||
If you intend to use Linux with Intel 12/13th gen integrated graphics or ARC, these GPUs only work on Linux Kernel 6.2 or newer. Please check your distribution to make sure it has a supported Linux Kernel version. Further information: [Known Intel limitations on Linux](/docs/general/post-install/transcoding/hardware-acceleration/known-issues#intel-on-linux).
|
||||
|
||||
:::caution
|
||||
|
||||
Intel 10th gen and older integrated graphics are losing support for QSV on Linux due to the SDK for these platforms being deprecated by Intel. If you own 7-10th gen CPUs with integrated graphics, please continue to use them for Jellyfin. If you are making a purchase decision, please choose a newer CPU if you plan on using Intel integrated graphics.
|
||||
Intel 10th gen and older integrated graphics are losing support for QSV on Linux due to the SDK for these platforms being deprecated by Intel. If you own 7-10th gen CPUs with integrated graphics, please continue to use them for Jellyfin. If you are making a purchase decision, you may wish to consider a newer CPU if you plan on using Intel integrated graphics.
|
||||
|
||||
:::
|
||||
|
||||
#### Nvidia Graphics
|
||||
#### NVIDIA Graphics
|
||||
|
||||
Please refer to [this table](https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new) for supported codecs.
|
||||
|
||||
Certain low end cards (e.g. GT 1030) don't have encoding hardware. Please be careful when choosing a GPU.
|
||||
Certain low-end cards (e.g. GT 1030) do not have encoding hardware. Please be careful when choosing a GPU.
|
||||
|
||||
#### AMD Graphics
|
||||
|
||||
AMD graphics is not recommended for Jellyfin, but the information is still provided for convenience. Please refer to [this article](https://en.wikipedia.org/wiki/Video_Coding_Engine) for supported codecs.
|
||||
AMD graphics is not recommended for Jellyfin, this information is solely provided for reference. Further reading on AMD VCE supported codecs: [https://en.wikipedia.org/wiki/Video_Coding_Engine](https://en.wikipedia.org/wiki/Video_Coding_Engine).
|
||||
|
||||
Certain low end cards (e.g. RX 6400, RX 6500) don't have encoding hardware. Please be careful when choosing a GPU.
|
||||
Certain low-end cards (e.g., RX 6400, RX 6500) do not have encoding hardware. Please be careful when choosing a GPU.
|
||||
|
||||
Many AMD CPUs don't have integrated graphics. These are intended to be used with a dedicated graphics card.
|
||||
Many AMD CPUs do not have integrated graphics. These are intended to be used with a dedicated graphics card.
|
||||
|
||||
For Ryzen 1000 ~ 5000 Series, desktop CPUs with a model description that ends with G have integrated graphics while other desktop CPUs do NOT. For Ryzen 7000 Series, desktop CPUs with a model description that ends with F do NOT have integrated graphics while others do.
|
||||
For Ryzen 1000 - 5000 Series, only desktop CPUs with a model description that ends with `G` have integrated graphics—other Ryzen 1000-5000 desktop CPUs do NOT.
|
||||
|
||||
For Ryzen 7000 Series, desktop CPUs with a model description that ends with `F` do NOT have integrated graphics, whereas the rest do.
|
||||
|
||||
Please check the product page of your CPU for more info.
|
||||
|
||||
@@ -202,17 +203,17 @@ Supported codecs are listed below:
|
||||
|
||||
✅ = Encode + Decode, 🔶 = Decode Only, ❌ = Not Supported.
|
||||
|
||||
<sup>1</sup> Although the hardware does support AV1 decoding, [ffmpeg does not support it yet](https://trac.ffmpeg.org/ticket/10642).
|
||||
<sup>1</sup> Although the hardware does support AV1 decoding, [ffmpeg does not yet support it](https://trac.ffmpeg.org/ticket/10642).
|
||||
|
||||
:::caution
|
||||
|
||||
No Apple Silicon media engine drivers currently exist for non-macOS operating systems. You will NOT be able to use hardware acceleration if you are running [Asahi Linux](https://asahilinux.org/).
|
||||
No Apple Silicon media engine drivers currently exist for non-macOS operating systems. You will NOT be able to use hardware acceleration if the server is running [Asahi Linux](https://asahilinux.org/).
|
||||
|
||||
:::
|
||||
|
||||
#### Rockchip VPU
|
||||
|
||||
Currently only the VPU on RK3588/3588S SoC is recommended. It can handle most common video codecs, including AV1 decode.
|
||||
Currently only the VPU on RK3588/3588S SoC is recommended, which can handle most common video codecs, including AV1 decode.
|
||||
|
||||
Supported codecs are listed below:
|
||||
|
||||
@@ -233,16 +234,18 @@ Supported codecs are listed below:
|
||||
|
||||
### Storage
|
||||
|
||||
There are two general types of storage that can be used on a Jellyfin server. Media libraries and Jellyfin files require different performance characteristics.
|
||||
There are two general types of storage that can be used on a Jellyfin Server. Media files and Jellyfin files respectively require specific hardware to optimize performance.
|
||||
|
||||
#### Media Storage
|
||||
|
||||
Anything with higher sequential access speed than bitrate of media will work. This storage can be a network share or a cloud storage service mounted on the Jellyfin host if desired.
|
||||
Anything with higher sequential access speed than bitrate of media is acceptable. If desired, this storage may be a network share, or a cloud storage service mounted on the Jellyfin Server host.
|
||||
|
||||
#### Jellyfin Files
|
||||
|
||||
Jellyfin files will see lots of random access, therefore SSDs are recommended for Jellyfin files. AVOID mechanical drives that use [SMR (Shingled Magnetic Recording)](https://en.wikipedia.org/wiki/Shingled_magnetic_recording) as they will result in a VERY poor experience.
|
||||
The files for Jellyfin itself (i.e., not your media files) will see a lot of random access, therefore SSDs are recommended for these files. AVOID mechanical drives that use [SMR (Shingled Magnetic Recording)](https://en.wikipedia.org/wiki/Shingled_magnetic_recording) as they will result in a VERY poor experience.
|
||||
|
||||
### Networking
|
||||
|
||||
Networking is for connecting your Jellyfin server to other devices. It is recommended that the server be connected to the internet via Ethernet cables. Wi-Fi or Powerline solutions are NOT recommended.
|
||||
Networking is for connecting your Jellyfin server to other devices. It is recommended that the Jellyfin Server be connected to your network via Ethernet cable for optimal performance. Wi-Fi or Powerline solutions for a Jellyfin Server are NOT recommended and will result in an especially poor experience.
|
||||
|
||||
Jellyfin Server is not designed to be exposed directly to the internet. Ensure it remains protected behind a properly configured firewall or other secure network environment.
|
||||
|
||||
@@ -3,11 +3,13 @@ uid: server-storage
|
||||
title: Storage
|
||||
---
|
||||
|
||||
## Storage
|
||||
|
||||
Jellyfin is designed to directly read media from the filesystem. A network storage device that is using samba or NFS must be directly mounted to the OS. The Jellyfin database should also be stored locally and not on a network storage device.
|
||||
|
||||
### NFS
|
||||
:::caution
|
||||
There are [scheduled maintenance tasks](/docs/general/server/tasks) which remove items from your library if triggered while your media storage is unavailable.
|
||||
:::
|
||||
|
||||
## NFS
|
||||
|
||||
In case you encounter performance issues where files take a long time to start playing while using NFSv3, you might be running in an issue with .NET locking without NFSv3 having locking enabled.
|
||||
|
||||
@@ -18,18 +20,40 @@ To solve this, you have the following options:
|
||||
- Enable the lock service.
|
||||
- Use NFSv4 which has built-in lock support.
|
||||
|
||||
## Docker or VMs
|
||||
## Docker and VMs
|
||||
|
||||
For storage, a moderate size library database can grow anywhere from 10 to 100 GB. The [transcoding](/docs/general/post-install/transcoding) folder needs roughly the same size as the original media if it's being transcoded at the same bitrate. A single 50GB Blu-Ray Remux by itself can take up to approximately 60GB or as little as 15GB, depending on the quality selected. If the transcoding folder is held on the same storage as the database, this must be taken into consideration.
|
||||
A database for a moderate-sized library can grow anywhere from 10 to 100 GB.
|
||||
|
||||
## Cloud
|
||||
The [transcoding](/docs/general/post-install/transcoding) folder typically requires about the same amount of space as the original media when transcoded at an equivalent bitrate. For example, a single 50 GB Blu-ray remux might consume as much as ~60 GB or as little as ~15 GB after transcoding. If the transcoding folder shares the same storage as the database, this should be accounted for to avoid any problems.
|
||||
|
||||
A popular choice for cloud storage has been the program [rclone](https://rclone.org/downloads/). It is supported on most Operating Systems. To facilitate combining local and cloud filesystems, rclone can be paired with another program such as [mergerfs](https://github.com/trapexit/mergerfs). For cloud storage, it is recommended to disable image extraction as this requires downloading the entire file to perform this task.
|
||||
## Cloud Storage Providers
|
||||
|
||||
### MergerFS
|
||||
[rclone](https://rclone.org/downloads/) is a popular choice for integrating cloud storage with a Jellyfin Server. rclone is supported on most operating systems. To combine local and cloud filesystems, rclone can be paired with another program such as [mergerfs](https://github.com/trapexit/mergerfs).
|
||||
|
||||
When using cloud storage, it is recommended to disable image extraction as it requires downloading the entire file.
|
||||
|
||||
## MergerFS
|
||||
|
||||
MergerFS isn't meant for everything, [see here](https://github.com/trapexit/mergerfs#what-should-mergerfs-not-be-used-for) for more.
|
||||
|
||||
- rclone recommended [config](https://forum.rclone.org/t/my-best-rclone-config-mount-for-plex/7441).
|
||||
|
||||
To modify and examine your mergerfs mount, here's a quick [guide](https://zackreed.me/mergerfs-neat-tricks).
|
||||
|
||||
## Filesystem Considerations
|
||||
|
||||
For certain filesystems, optimizations are highly recommended for acceptable performance.
|
||||
|
||||
### ZFS
|
||||
|
||||
Whilst development is being done on further database providers, in the current implementation of Jellyfin Server, the database uses SQLite. ZFS uses a default record size of `128 K`. This is sub-optimal for the SQLite database.
|
||||
|
||||
Ideally, you should use a record size of `4 K` or `8 K` on the dataset that contains your Jellyfin Server SQLite database. This is easily configured when running Jellyfin Server within a Docker container as you are able to easily change bind mounts and can set various datasets for each path as appropriate.
|
||||
|
||||
The record size for your media file dataset(s) must not be using `4 K` or `8 K`, otherwise you will likely encounter performance issues as your database scales.
|
||||
|
||||
For ZFS datasets containing large media files (i.e., not the dataset containing the Jellyfin Server SQLite database), a record size of `1 M` is likely appropriate for optimal performance.
|
||||
|
||||
Note that changing the record size on an existing ZFS dataset will not change the existing data within it, meaning performance will not be any different for anything but newly-written changes into the dataset. As such, it is recommended to rewrite your data into the dataset to take advantage of the change in record size; otherwise, the configuration change will not yield the expected change in performance.
|
||||
|
||||
As ZFS snapshots can use a lot of storage over time without a sensible `destroy` schedule, there may be a temptation to keep your data on a mechanical drive instead of an SSD. Do not use ZFS-formatted mechanical drives to store your Jellyfin Server data (everything except your media files), as this will result in poor performance. An SSD is strongly recommended.
|
||||
|
||||
@@ -49,10 +49,7 @@ To enable debug logging, create the `logging.json` file and add the following co
|
||||
{
|
||||
"Serilog": {
|
||||
"MinimumLevel": {
|
||||
"Default": "Debug",
|
||||
"Override": {
|
||||
"": "Debug"
|
||||
}
|
||||
"Default": "Debug"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -216,3 +213,31 @@ If your active devices section in the dashboard is not showing progress of the c
|
||||
```bash
|
||||
timedatectl set-ntp true
|
||||
```
|
||||
|
||||
## Database Locked Errors
|
||||
|
||||
When encountering issues with failed scans or inconsistent data, check your log file(s) for errors like "Database Locked". If you encounter those you should first check your parallel scan task limit in your admin dashboard and set that lower. If its set to 0 set it to 1/2 your cores. If that does not help, you can set the locking mode instead (keep the task limit to a reasonable low number too).
|
||||
|
||||
You have 3 options to set the locking mode to:
|
||||
|
||||
- `NoLock` - This is the default mode which should work for most users
|
||||
- `Optimistic` - Defines that all writes should be attempted and should be retried when they fail.
|
||||
- `Pessimistic` - Defines a behavior that always blocks all reads while any one write is done.
|
||||
|
||||
Stop your Jellyfin server and navigate to its config directory. There are a lot of xml files, look for the `database.xml` file and edit the `LockingBehavior` option:
|
||||
|
||||
```xml
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<DatabaseConfigurationOptions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
<DatabaseType>Jellyfin-SQLite</DatabaseType>
|
||||
// highlight-start
|
||||
<LockingBehavior>Optimistic</LockingBehavior>
|
||||
// highlight-end
|
||||
</DatabaseConfigurationOptions>
|
||||
```
|
||||
|
||||
then start your Jellyfin instance again. If this still does not help with the issues, you can try setting the `LockingBehavior` to `Pessimistic` instead but this comes with a significant performance impact so it is only recommended when `Optimistic` does not help with the issues.
|
||||
|
||||
### LXC specific issues
|
||||
|
||||
It has been brought to the team's attention that there are issues with LXC specifically. If you are getting such errors on LXC after setting lock mode to `Optimistic`, it is recommended that you migrate to full virtualization (virtual machines) or Docker. There is unlikely to be a solution for LXC any time soon, and we will be unable to provide any support for database locked problems on LXC.
|
||||
|
||||
@@ -13,16 +13,16 @@ The goal is to Direct Play all media. This means the container, video, audio and
|
||||
|
||||
[Test your browser's compatibility for any codec profile.](https://cconcolato.github.io/media-mime-support/)
|
||||
|
||||
| Sorted by efficiency (excluding bit depth) | Chrome | Edge | Firefox | Safari | Android | Android TV | iOS | SwiftFin (iOS) | [Roku](https://developer.roku.com/docs/specs/media/streaming-specifications.md) | Kodi | Jellyfin Media Player |
|
||||
| ------------------------------------------------------------------------------------------------------------------ | -------------- | -------------- | ------- | --------------- | -------------- | -------------- | -------------- | --------------- | ------------------------------------------------------------------------------- | ---- | --------------------- |
|
||||
| [MPEG-4 Part 2/SP](https://en.wikipedia.org/wiki/DivX) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |
|
||||
| [MPEG-4 Part 2/ASP](<https://en.wikipedia.org/wiki/MPEG-4_Part_2#Advanced_Simple_Profile_(ASP)>) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | | ✅ | ✅ |
|
||||
| [H.264 8Bit](https://caniuse.com/#feat=mpeg4 'H264 Browser Support Reference') | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| [H.264 10Bit](https://caniuse.com/#feat=mpeg4 'H264 Browser Support Reference') | ✅ | ✅ | ❌ | 🔶<sup>12</sup> | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | ✅ |
|
||||
| [H.265 8Bit](https://caniuse.com/#feat=hevc 'HEVC Browser Support Reference') | 🔶<sup>8</sup> | ✅<sup>7</sup> | ❌ | 🔶<sup>1</sup> | 🔶<sup>2</sup> | ✅<sup>5</sup> | 🔶<sup>1</sup> | ✅<sup>6</sup> | 🔶<sup>9</sup> | ✅ | ✅ |
|
||||
| [H.265 10Bit](https://caniuse.com/#feat=hevc 'HEVC Browser Support Reference') | 🔶<sup>8</sup> | ✅<sup>7</sup> | ❌ | 🔶<sup>1</sup> | 🔶<sup>2</sup> | 🔶<sup>5</sup> | 🔶<sup>1</sup> | ✅<sup>6</sup> | 🔶<sup>9</sup> | ✅ | ✅ |
|
||||
| [VP9](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#VP9 'V9 Browser Support Reference') | ✅ | ✅ | ✅ | ✅<sup>10</sup> | ✅<sup>3</sup> | 🔶<sup>3</sup> | ❌ | ✅<sup>13</sup> | ✅ | ✅ | ✅ |
|
||||
| [AV1](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#AV1 'AV1 Browser Support Reference') | ✅ | ✅ | ✅ | 🔶<sup>11</sup> | ✅ | 🔶<sup>4</sup> | ❌ | 🔶<sup>14</sup> | ✅ | ✅ | ✅ |
|
||||
| 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)>) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | | ✅ | ✅ |
|
||||
| [H.264 8Bit](https://caniuse.com/#feat=mpeg4 'H264 Browser Support Reference') | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| [H.264 10Bit](https://caniuse.com/#feat=mpeg4 'H264 Browser Support Reference') | ✅ | ✅ | ❌ | 🔶<sup>12</sup> | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | ✅ |
|
||||
| [H.265 8Bit](https://caniuse.com/#feat=hevc 'HEVC Browser Support Reference') | 🔶<sup>8</sup> | ✅<sup>7</sup> | ✅<sup>15</sup> | 🔶<sup>1</sup> | 🔶<sup>2</sup> | ✅<sup>5</sup> | 🔶<sup>1</sup> | ✅<sup>6</sup> | 🔶<sup>9</sup> | ✅ | ✅ |
|
||||
| [H.265 10Bit](https://caniuse.com/#feat=hevc 'HEVC Browser Support Reference') | 🔶<sup>8</sup> | ✅<sup>7</sup> | ✅<sup>15</sup> | 🔶<sup>1</sup> | 🔶<sup>2</sup> | 🔶<sup>5</sup> | 🔶<sup>1</sup> | ✅<sup>6</sup> | 🔶<sup>9</sup> | ✅ | ✅ |
|
||||
| [VP9](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#VP9 'V9 Browser Support Reference') | ✅ | ✅ | ✅ | ✅<sup>10</sup> | ✅<sup>3</sup> | 🔶<sup>3</sup> | ❌ | ✅<sup>13</sup> | ✅ | ✅ | ✅ |
|
||||
| [AV1](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Video_codecs#AV1 'AV1 Browser Support Reference') | ✅ | ✅ | ✅ | 🔶<sup>11</sup> | ✅ | 🔶<sup>4</sup> | ❌ | 🔶<sup>14</sup> | ✅ | ✅ | ✅ |
|
||||
|
||||
<sup>1</sup>HEVC is only supported in MP4, M4V, and MOV containers.
|
||||
<br />
|
||||
@@ -48,10 +48,11 @@ The goal is to Direct Play all media. This means the container, video, audio and
|
||||
<br />
|
||||
<sup>12</sup>Need to be manually enabled in Settings > Playback > Enable H.264 High 10 Profile. Playback on Apple Silicon Macs with macOS version < 14 and Intel Macs with all macOS versions may result in blank frames if this is enabled.
|
||||
<br />
|
||||
<sup>13</sup>VP9 is only availble with Swiftfin (VLCKit) player.
|
||||
<sup>13</sup>VP9 is only available with Swiftfin (VLCKit) player.
|
||||
<br />
|
||||
<sup>14</sup>AV1 is enabled by default for Swiftfin (VLCKit). AV1 is disabled by default but can be enabled for Native (AVKit) using Custom Device Profiles. Enabling AV1 may result in a poor experience for SOCs prior to A17.
|
||||
<br />
|
||||
<sup>15</sup>Requires Firefox 134+ for Windows, 136+ for macOS, and 137+ for Linux. On Windows 11 22H2+ and Windows 10 1507-1709, you can play H.265 (HEVC) video natively. Windows 10 1803+ and Windows 11 21H2 need the [HEVC video extension from Microsoft Store](https://apps.microsoft.com/detail/9nmzlz57r3t7). Linux requires system ffmpeg for support.
|
||||
|
||||
[Format Cheatsheet:](https://en.wikipedia.org/wiki/MPEG-4#MPEG-4_Parts)
|
||||
|
||||
@@ -65,6 +66,26 @@ The goal is to Direct Play all media. This means the container, video, audio and
|
||||
<br />
|
||||
<sup>2</sup><a href="https://en.wikipedia.org/wiki/MPEG-4_Part_17">MPEG-4 Part 17: MP4TT Subtitles</a>
|
||||
|
||||
### HDR Support
|
||||
|
||||
HDR is only supported on a very limited range of devices:
|
||||
|
||||
- iOS Devices with an HDR capable internal display can display HDR content when using a browser or the Jellyfin iOS App (not Swiftfin) as long as the codec is supported by the client. All of them support HEVC and VP9, while AV1 is supported on newer devices. HDR10, Dolby Vision and HLG are supported.
|
||||
|
||||
- Android devices running either the official Android App or using Chrome can display HDR content if the device supports HDR and the source format. Format support depends on device.
|
||||
|
||||
- Macs running macOS that support HDR can play HDR content when using Safari, Chrome or Firefox on an HDR capable display as long as the source codec is supported. Safari has the most complete support, including HDR10, Dolby Vision (including P5) and HLG. Chrome and Firefox only support HDR10. Chrome supports HDR10 on HEVC, VP9 and AV1. Firefox only supports HDR on VP9 and AV1 content. Please refer to [the list of Macs that support HDR](https://support.apple.com/en-us/102205) to check if your device is supported. On non-Apple displays, other HDR formats will be tone-mapped to HDR10 by the client device.
|
||||
|
||||
- Windows PCs with an HDR display with HDR enabled in the settings using Edge or Chrome. Dolby Vision only works in Edge and requires [the Dolby Vision add-on from the Microsoft Store](https://apps.microsoft.com/detail/9pltg1lwphlf) to be installed. Edge generally produces better colors than Chrome when playing HDR content.
|
||||
|
||||
- Android TV devices with HDR support running the official Android TV App. HDR format support depends on the specific device you are running.
|
||||
|
||||
- WebOS devices (Newer LG Smart TVs) running the official WebOS client supports HDR. However, [mkv containers are known to cause issues](https://github.com/jellyfin/jellyfin-web/issues/4678). Please enable the force remux mkv to mp4 option in the client settings as a workaround.
|
||||
|
||||
- Some Chromium-based browsers on Linux will attempt Client-side HDR to SDR tonemapping. This generally looks very bad. There will be no server side involvement when this is happening.
|
||||
|
||||
Devices not listed above do not support HDR on any official client. Any HDR content will have to be converted to SDR by the server for proper playback on these clients. For more info, please refer to our [tone-mapping documentation](/docs/general/post-install/transcoding/#hdr-to-sdr-tone-mapping)
|
||||
|
||||
## [Audio Compatibility](https://en.wikipedia.org/wiki/Comparison_of_video_container_formats#Audio_coding_formats_support "Wikipedia's audio codec tables")
|
||||
|
||||
If the audio codec is unsupported or incompatible (such as playing a 5.1 channel stream on a stereo device), the audio codec must be transcoded. This is not nearly as intensive as video transcoding.
|
||||
@@ -177,7 +198,7 @@ If the container is unsupported, this will result in remuxing. The video and aud
|
||||
| Container | Chrome | Edge | Firefox | Safari | Android | Android TV | Kodi | Roku |
|
||||
| :-------------------------------------------------------------------: | :----: | :--: | :-----: | :----: | :-----: | :--------: | :--: | :--: |
|
||||
| [MP4](https://en.wikipedia.org/wiki/MPEG-4_Part_14)<sup>1</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| [MKV](https://en.wikipedia.org/wiki/Matroska)<sup>2, 3</sup> | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |
|
||||
| [MKV](https://en.wikipedia.org/wiki/Matroska)<sup>2, 3, 8</sup> | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |
|
||||
| [WebM](https://en.wikipedia.org/wiki/WebM)<sup>3, 5, 6</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| [TS](https://en.wikipedia.org/wiki/MPEG_transport_stream)<sup>4</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| [OGG](https://en.wikipedia.org/wiki/Ogg)<sup>5, 7</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
@@ -195,3 +216,5 @@ If the container is unsupported, this will result in remuxing. The video and aud
|
||||
<sup>6</sup>WebM on Safari requires at least Safari 14.
|
||||
<br />
|
||||
<sup>7</sup>OGG on Safari requires at least iOS 18.4 / macOS 15.4
|
||||
<br />
|
||||
<sup>8</sup>MKV support in Firefox is currently disabled in Jellyfin, as there are significant issues making it unusable for Jellyfin. [1](https://bugzilla.mozilla.org/show_bug.cgi?id=2000420) [2](https://bugzilla.mozilla.org/show_bug.cgi?id=1991746)
|
||||
|
||||
@@ -76,6 +76,7 @@ This will affect the played/watched indicator. Replace the hex color with any va
|
||||
### Green Indicators
|
||||
|
||||
```css
|
||||
/* Make watched icon green */
|
||||
.playedIndicator {
|
||||
background: #5dd000;
|
||||
}
|
||||
@@ -87,14 +88,14 @@ This will affect the played/watched indicator. Replace the hex color with any va
|
||||
|
||||
```css
|
||||
/* Make watched icon dark and transparent */
|
||||
.indicator {
|
||||
.playedIndicator {
|
||||
background: #00000058 !important;
|
||||
}
|
||||
```
|
||||
|
||||

|
||||
|
||||
### Transparant count indicators (eg. Series)
|
||||
### Transparent count indicators (eg. Series)
|
||||
|
||||
```css
|
||||
/* Make count indicator icon dark and transparent */
|
||||
@@ -735,19 +736,19 @@ Material Icons:
|
||||
- Outlined:
|
||||
|
||||
```css
|
||||
@import url("https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Outline.css");
|
||||
@import url('https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Outline.css');
|
||||
```
|
||||
|
||||
- Rounded:
|
||||
|
||||
```css
|
||||
@import url("https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/round.css");
|
||||
@import url('https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/round.css');
|
||||
```
|
||||
|
||||
- Sharp:
|
||||
|
||||
```css
|
||||
@import url("https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Sharp.css");
|
||||
@import url('https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Sharp.css');
|
||||
```
|
||||
|
||||
Fontawesome Icons:
|
||||
@@ -755,25 +756,25 @@ Fontawesome Icons:
|
||||
- Solid:
|
||||
|
||||
```css
|
||||
@import url("https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Font%20Awesome/solid.css");
|
||||
@import url('https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Font%20Awesome/solid.css');
|
||||
```
|
||||
|
||||
- Regular:
|
||||
|
||||
```css
|
||||
@import url("https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Font%20Awesome/regular.css");
|
||||
@import url('https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Font%20Awesome/regular.css');
|
||||
```
|
||||
|
||||
- Light:
|
||||
|
||||
```css
|
||||
@import url("https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Font%20Awesome/light.css");
|
||||
@import url('https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Font%20Awesome/light.css');
|
||||
```
|
||||
|
||||
- duotone:
|
||||
|
||||
```css
|
||||
@import url("https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Font%20Awesome/duotone.css");
|
||||
@import url('https://cdn.jsdelivr.net/gh/prayag17/Jellyfin-Icons/Font%20Awesome/duotone.css');
|
||||
```
|
||||
|
||||
## Community Links
|
||||
|
||||
@@ -53,6 +53,21 @@ The final decision for inclusion is at the discretion of the Jellyfin Contributo
|
||||
|
||||
- The client must fill a significant void in the current first-party client offerings. Must be a high-quality client on a popular platform.
|
||||
|
||||
### Removal from the clients list
|
||||
|
||||
We strive to maintain an up-to-date and accurate client list; however, we do not wish to remove clients without just cause. To ensure the integrity and relevance of the client list, we will conduct regular maintenance.
|
||||
The Jellyfin team reserves the right to remove any listed client at any time.
|
||||
|
||||
Typically, a client will be removed if any of the following criteria are met:
|
||||
|
||||
- The client no longer fulfills the inclusion criteria outlined above.
|
||||
- The client is no longer maintained or does not support the latest stable version of the Jellyfin server.
|
||||
- The client is malfunctioning (key features are not operating correctly).
|
||||
|
||||
In general, the team will attempt to contact the maintainers of a listed client prior to removal. However, if this is not feasible (e.g., the maintainers cannot be reached), the team may proceed with removal without prior notice.
|
||||
|
||||
Additionally, there are situations where contacting maintainers is unnecessary, such as in cases of malware distribution or violations of community guidelines. In these instances, clients will be removed from the list without notification.
|
||||
|
||||
## Supported Browsers
|
||||
|
||||
Our goal is to provide support for the two most recent versions of these browsers.
|
||||
|
||||
@@ -54,7 +54,7 @@ services:
|
||||
|
||||
watchtower:
|
||||
container_name: watchtower
|
||||
image: ghcr.io/containrrr/watchtower
|
||||
image: ghcr.io/nicholas-fedor/watchtower
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
environment:
|
||||
@@ -77,7 +77,9 @@ located where the `docker-compose.yml` file is.
|
||||
With this compose file:
|
||||
|
||||
- Jellyfin Vue will be accessible on `8080` port of the machine that's running the containers
|
||||
- Watchtower takes care of updating the container to the latest commit available on the [repository](https://github.com/jellyfin/jellyfin-vue).
|
||||
- Watchtower (fork, [the original is unmaintained](https://github.com/containrrr/watchtower/issues/2067))
|
||||
takes care of updating the container to the latest commit available on the
|
||||
[repository](https://github.com/jellyfin/jellyfin-vue).
|
||||
This is a good idea because:
|
||||
- As of now, stable releases don't exist and there have only been prereleases that don't necessarily meet a quality criteria, but
|
||||
[major development milestones](https://jellyfin.org/posts/vue-vue3/).
|
||||
|
||||
@@ -28,7 +28,7 @@ The installation method for the repository varies depending on what kind of devi
|
||||
- If prompted, enter settings and enable "Unknown Sources", then go back to the Add-on Browser
|
||||
- Select the newly downloaded file and it will be installed
|
||||
|
||||
#### "Embedded" Devices (Android TV, Firestick, and other TV Boxes)
|
||||
#### "Embedded" Devices (Android TV, FireTV Stick, and other TV Boxes)
|
||||
|
||||
1. Open Kodi, go to the settings menu, and navigate to "File manager"
|
||||
- Select "Add source"
|
||||
@@ -91,40 +91,9 @@ To use Add-on mode, simply choose "Add-on" at the dialog and proceed to [Library
|
||||
|
||||
#### Native Mode
|
||||
|
||||
:::caution
|
||||
|
||||
Do not use Native mode! Use Addon-mode instead.
|
||||
|
||||
Jellyfin 10.10 no longer provides the shared network folder via the API, and as such native mode does not get the required information to function.
|
||||
|
||||
:::
|
||||
Native mode accesses your media files directly from the filesystem, bypassing the Jellyfin server during playback. Native mode needs more setup and configuration, but it can, on rare occasions, lead to better performance where network bandwidth is a limitation. It requires your media to be available to the device Kodi is running on over either NFS or Samba, and therefore should only be used on a LAN or over a VPN connection.
|
||||
|
||||
To use Native mode, first set up your libraries in Jellyfin with a remote path.
|
||||
|
||||
:::caution
|
||||
|
||||
Starting from Jellyfin 10.9 it is no longer possible to set the shared network folder.
|
||||
|
||||
:::
|
||||
|
||||
1. In the Jellyfin server, navigate to the Libraries section of the admin dashboard.
|
||||
- Select an existing library (or create a new one)
|
||||
- Select the media folder
|
||||
- Enter the path to your network share in the "Shared network folder" textbox
|
||||
- Possible formats:
|
||||
- NFS
|
||||
- `nfs://192.168.0.10:/path/to/media`
|
||||
- Samba
|
||||
- Guest User - `\\192.168.0.10\share_name`
|
||||
- Custom User (Not Recommended) - `\\user:password@192.168.0.10\share_name`
|
||||
- It's more secure to use the generic Guest mapping here and specify credentials from within Kodi
|
||||
- Mounted share
|
||||
- If you have mounted your network share, you can reference the local mount point. This can be more performant but generally means it only works for one type of operating system, given the difference between the file systems
|
||||
- `/mnt/media` (Linux)
|
||||
- `Z:\media` (Windows)
|
||||
- `/Volumes/media` (Mac OS)
|
||||
2. Configure libraries in Kodi
|
||||
1. Configure libraries in Kodi
|
||||
- Skip the initial library selection. We need to add file shares to Kodi first
|
||||
- Within Kodi, navigate to the settings menu and select "File manager"
|
||||
- Select "Add source"
|
||||
@@ -134,7 +103,8 @@ Starting from Jellyfin 10.9 it is no longer possible to set the shared network f
|
||||
- Select your newly created location and choose "Ok"
|
||||
- Give your media source a name and choose "Ok"
|
||||
- Go to Add-ons -> Jellyfin -> Manage Libraries -> Add Libraries
|
||||
3. Proceed to [Library Syncing](/docs/general/clients/kodi#library-syncing)
|
||||
2. Proceed to [Library Syncing](/docs/general/clients/kodi#library-syncing)
|
||||
3. Make sure to set up path replacements to rewrite paths on your Jellyfin server to the correct paths on your network share
|
||||
|
||||
#### Library Syncing
|
||||
|
||||
|
||||
@@ -48,4 +48,4 @@ Please see our [requesting features](/developers/docs/contributing/issues#reques
|
||||
|
||||
All we can ask is you [use Jellyfin](/docs/general/installation), [report any bugs](/developers/docs/contributing/issues#reporting-bugs), and tell your friends about us!
|
||||
Really, we're just people volunteering our time to help build a better media system, so joining the community is the best way to show your support.
|
||||
We do offer a donations page [on OpenCollective](https://opencollective.com/jellyfin), however please note that these funds are **only** used for infrastructure. All our developers are unpaid volunteers on principle.
|
||||
We do offer a donations page [on OpenCollective](https://opencollective.com/jellyfin), however please note that these funds are **only** used for infrastructure. All our developers are unpaid volunteers on principle. Many individual developers that are active in the project accept [donations](/docs/general/contributing/direct-donations.mdx) however.
|
||||
|
||||
@@ -56,7 +56,8 @@ Using host networking (`--net=host`) is optional but required in order to use DL
|
||||
docker run -d \
|
||||
--name jellyfin \
|
||||
--user uid:gid \
|
||||
--net=host \
|
||||
-p 8096:8096/tcp \
|
||||
-p 7359:7359/udp \
|
||||
--volume /path/to/config:/config \ # Alternatively --volume jellyfin-config:/config
|
||||
--volume /path/to/cache:/cache \ # Alternatively --volume jellyfin-cache:/cache
|
||||
--mount type=bind,source=/path/to/media,target=/media \
|
||||
|
||||
@@ -13,15 +13,18 @@ You WILL NOT receive any support for running Jellyfin in Docker on platforms oth
|
||||
|
||||
:::
|
||||
|
||||
Create a `docker-compose.yml` file with the following contents. Add in the UID and GID that you would like to run jellyfin as in the user line below, or remove the user line to use the default (root).
|
||||
Create a `docker-compose.yml` file like the following.
|
||||
|
||||
```yml
|
||||
services:
|
||||
jellyfin:
|
||||
image: jellyfin/jellyfin
|
||||
container_name: jellyfin
|
||||
# Optional - specify the uid and gid you would like Jellyfin to use instead of root
|
||||
user: uid:gid
|
||||
network_mode: 'host'
|
||||
ports:
|
||||
- 8096:8096/tcp
|
||||
- 7359:7359/udp
|
||||
volumes:
|
||||
- /path/to/config:/config
|
||||
- /path/to/cache:/cache
|
||||
|
||||
@@ -17,6 +17,7 @@ Steps to run Jellyfin using Podman are similar to the Docker steps.
|
||||
--label "io.containers.autoupdate=registry" \
|
||||
--name myjellyfin \
|
||||
--publish 8096:8096/tcp \
|
||||
--publish 7359:7359/udp \
|
||||
--rm \
|
||||
--user $(id -u):$(id -g) \
|
||||
--userns keep-id \
|
||||
@@ -28,10 +29,11 @@ Steps to run Jellyfin using Podman are similar to the Docker steps.
|
||||
|
||||
3. Open the necessary ports in your machine's firewall if you wish to permit access to the Jellyfin server from outside the host.
|
||||
This is not done automatically when using rootless Podman.
|
||||
If your distribution uses `firewalld`, the following commands save and load a new firewall rule opening the HTTP port `8096` for TCP connections.
|
||||
If your distribution uses `firewalld`, the following commands save and load a new firewall rule opening the HTTP port `8096` for TCP connections. Additionally port 7359 UDP needs to be opened for auto discovery.
|
||||
|
||||
```sh
|
||||
sudo firewall-cmd --add-port=8096/tcp --permanent
|
||||
sudo firewall-cmd --add-port=7359/udp --permanent
|
||||
sudo firewall-cmd --reload
|
||||
```
|
||||
|
||||
@@ -42,7 +44,7 @@ The `--user` option will run with the provided user id and group id _inside_ the
|
||||
The `--userns keep-id` flag ensures that current user's id is mapped to the non-root user's id inside the container.
|
||||
This ensures that the permissions for directories bind-mounted inside the container are mapped correctly between the user running Podman and the user running Jellyfin inside the container.
|
||||
|
||||
Keep in mind that the `--label "io.containers.autoupdate=image"` flag will allow the container to be automatically updated via `podman auto-update`.
|
||||
Keep in mind that the `--label "io.containers.autoupdate=image"` flag will allow the container to be automatically updated via `podman auto-update`, and a [backup](/docs/general/administration/backup-and-restore) will be required to restore a previous version.
|
||||
|
||||
The `z` (shared volume) or `Z` (private volume) volume option and `relabel=shared` or `relabel=private` mount option tell Podman to relabel files inside the volumes as appropriate, for systems running SELinux.
|
||||
|
||||
|
||||
@@ -361,25 +361,13 @@ The repository is the preferred way to obtain Jellyfin on Debian and Ubuntu syst
|
||||
|
||||
2. Download the desired `jellyfin-server`, `jellyfin-web`, and `jellyfin-ffmpeg` `.deb` packages from the repository; `jellyfin` is a metapackage and is not required.
|
||||
|
||||
3. Install the downloaded `.deb` packages:
|
||||
3. Install the downloaded `.deb` packages with `apt` to handle dependency resolution:
|
||||
|
||||
```sh
|
||||
sudo dpkg -i jellyfin_*.deb jellyfin-ffmpeg_*.deb
|
||||
sudo apt install ./jellyfin-server_*.deb ./jellyfin-web_*.deb ./jellyfin-ffmpeg_*.deb
|
||||
```
|
||||
|
||||
:::note
|
||||
|
||||
This step may throw errors; continue to the next step to resolve them.
|
||||
|
||||
:::
|
||||
|
||||
4. Use `apt` to install any missing dependencies:
|
||||
|
||||
```sh
|
||||
sudo apt -f install
|
||||
```
|
||||
|
||||
5. Manage the Jellyfin system service:
|
||||
4. Manage the Jellyfin system service:
|
||||
|
||||
```sh
|
||||
sudo systemctl {action} jellyfin
|
||||
|
||||
@@ -527,7 +527,7 @@ You can also pull new images to use in the future.
|
||||
|
||||
You can choose to pull from Jellyfin's [Docker Hub](https://hub.docker.com/r/jellyfin/jellyfin) or [GitHub Container Registry](https://github.com/jellyfin/jellyfin/pkgs/container/jellyfin).
|
||||
|
||||
- To pull from Docker Hub, use: `jellyfin/jellyin`
|
||||
- To pull from Docker Hub, use: `jellyfin/jellyfin`
|
||||
- To pull from from GHCR, use: `ghcr.io/jellyfin/jellyfin`
|
||||
- [You can check this blog post for more info about GHCR:](/posts/jellyfin-release-10.9.0#key-release-notesbreaking-changes)
|
||||
- "Docker users: We now offer GitHub Container Registry (GHCR) as an alternative container registry in addition to Docker Hub. You can pull images from the new registry via URIs like `ghcr.io/jellyfin/jellyfin:latest`. Don't worry, we have no plans to drop Docker Hub as a container registry, but we feel providing both gives users more choice and flexibility."
|
||||
|
||||
@@ -19,10 +19,20 @@ hotio image: `ghcr.io/hotio/jellyfin`.
|
||||
Jellyfin distributes official container images on [Docker Hub](https://hub.docker.com/r/jellyfin/jellyfin/) and the [GitHub Container Registry](https://ghcr.io/jellyfin/jellyfin) for multiple architectures.
|
||||
These images are based on Debian and [built directly from the Jellyfin source code](https://github.com/jellyfin/jellyfin-packaging/blob/master/docker/Dockerfile).
|
||||
|
||||
Several tags are available tracking different builds and [version](/docs/general/contributing/release-procedure/#versioning) levels.
|
||||
|
||||
- `latest` always tracks the latest stable release, including through major and minor version bumps
|
||||
- `X` (e.g. `10`) tracks the major version, e.g. the latest 10.Y.Z
|
||||
- `X.Y` (e.g. `10.11`) tracks the minor version, e.g. the latest 10.11.Z
|
||||
- `X.Y.Z` (e.g. `10.11.0`) tracks a specific release
|
||||
- `X.Y.Z.YYYYMMDD-HHMMSS` (e.g. `10.11.0.20251020-004604`) tracks a specific packaging build
|
||||
|
||||
Additionally, there are several third parties providing unofficial container images, including the [LinuxServer.io](https://www.linuxserver.io/) ([Dockerfile](https://github.com/linuxserver/docker-jellyfin/blob/master/Dockerfile)) project and [hotio](https://github.com/hotio) ([Dockerfile](https://github.com/hotio/jellyfin/blob/release/linux-amd64.Dockerfile)), which offer images based on Ubuntu and the official Jellyfin Ubuntu binary packages.
|
||||
|
||||
## Installation Instructions
|
||||
|
||||
Replace `uid:gid` if you want to run jellyfin as a specific user/group. Exclude the `user` argument entirely if you want to use the default user.
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
import DockerCli from './\_container-docker-cli.md';
|
||||
|
||||
@@ -8,7 +8,7 @@ sidebar_position: 3
|
||||
## Debian / Ubuntu and derivatives
|
||||
|
||||
To simplify deployment and help automate this for as many users as possible, we provide a BASH script to handle repo installation as well as installing Jellyfin on Debian / Ubuntu and derivatives.
|
||||
All you need to do is run this command on your system (requires `curl`, or subsitute `curl` with `wget -O-`):
|
||||
All you need to do is run this command on your system (requires `curl`, or substitute `curl` with `wget -O-`):
|
||||
|
||||
```sh
|
||||
curl https://repo.jellyfin.org/install-debuntu.sh | sudo bash
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
---
|
||||
uid: network-tailscale
|
||||
title: Tailscale
|
||||
sidebar-position: 3
|
||||
---
|
||||
|
||||
# Tailscale
|
||||
|
||||
[Tailscale](https://tailscale.com) is a VPN based on Wireguard which offers easy configuration and high performance. It provides an effective alternative in situations where opening ports is undesirable or not feasible, such as when the network is behind a carrier-grade NAT (CGNAT), or if your ISP blocks incoming traffic on certain ports.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
A Tailscale account is required for Tailscale to work. An account can be created on the [Tailscale Website](https://tailscale.com)
|
||||
|
||||
## Using Tailscale Directly
|
||||
|
||||
Tailscale can be directly used to connect multiple devices together.
|
||||
|
||||
Pros:
|
||||
|
||||
- No changing router or network settings required.
|
||||
- No Public IP or additional servers required.
|
||||
|
||||
Cons:
|
||||
|
||||
- Every client needs to have the Tailscale software installed
|
||||
- Needs extra, complex configuration to block clients from connecting to each other.
|
||||
- Requires an account with a 3rd party provider.
|
||||
|
||||
Setup on server:
|
||||
|
||||
1. Install the Tailscale app on the client device. Instructions are available in [Tailscale's official install guide](https://tailscale.com/kb/1347/installation)
|
||||
2. Login to the Tailscale client and connect to the tailnet. On Windows and macOS that can be done through the icon in the system tray. On Linux that can be done with the command `sudo tailscale up`
|
||||
3. Find and note your Tailscale IP of the server according to the [Tailscale Documentation](https://tailscale.com/kb/1033/ip-and-dns-addresses?tab=linux#finding-your-tailscale-ip-address). This IP will be used for other devices to connect. The IP should start with 100 (e.g. 100.12.34.56).
|
||||
|
||||
Setup on clients:
|
||||
|
||||
1. Install the Tailscale app on the client device. Instructions are available in [Tailscale's official install guide](https://tailscale.com/kb/1347/installation)
|
||||
2. Login to the Tailscale client and connect to the tailnet. On Windows and macOS that can be done through the icon in the system tray. On Linux that can be done with the command `sudo tailscale up`. On mobile devices that can be done through the tailscale app.
|
||||
3. Type in the server IP from above into your browser or Jellyfin client of choice and connect. (e.g. 100.12.34.56:8096)
|
||||
|
||||
## Using Tailscale with a reverse proxy
|
||||
|
||||
Tailscale can also be used to connect between a server and a remote reverse proxy. While it is possible to setup a traditional VPN connection between the remote reverse proxy and the Jellyfin server, it can be tricky. Tailscale provides an easy way to set up such a connection.
|
||||
|
||||
Setup on Jellyfin server:
|
||||
|
||||
1. Follow the `Setup on server` section in the [Using Tailscale Directly](#using-tailscale-directly) section to setup Tailscale on the Jellyfin server host.
|
||||
2. Complete the setup on the reverse proxy server below.
|
||||
3. Open the Dashboard of the Jellyfin server and go to Networking. Add the reverse proxy Tailscale IP to the `known proxies` setting. This is explained in detail in our [reverse proxy guide](./8_reverse-proxy/index.md#forwarded-for-headers).
|
||||
|
||||
Setup on reverse proxy server:
|
||||
|
||||
1. Install the Tailscale app on the client device. Instructions are available in [Tailscale's official install guide](https://tailscale.com/kb/1347/installation)
|
||||
2. Login to the tailscale client and connect to the tailnet. On Linux this can be done with the command `sudo tailscale up`
|
||||
3. Setup a reverse proxy of your choice and set the upstream server to the IP from above. Example [Caddy](./reverse-proxy/caddy) configuration: (Assuming server has Tailscale IP of 100.12.34.56)
|
||||
|
||||
```txt
|
||||
example.com
|
||||
|
||||
redir /jellyfin /jellyfin/
|
||||
reverse_proxy /jellyfin/* 100.12.34.56:8096
|
||||
```
|
||||
|
||||
4. Find and note your Tailscale IP of the reverse proxy server according to the [Tailscale Documentation](https://tailscale.com/kb/1033/ip-and-dns-addresses?tab=linux#finding-your-tailscale-ip-address). This IP must be added to the Jellyfin server’s `known proxies` setting. The IP should start with 100 (e.g. 100.65.43.21).
|
||||
@@ -22,7 +22,7 @@ Since UPnP is a standard Protocol expected to be on UDP port 1900, its not possi
|
||||
Make sure to open this port to your local network. You will find more information about how to do this in the [Firewall guide](./index.md#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.
|
||||
This means that clients will not be able 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.
|
||||
|
||||
|
||||
@@ -4,8 +4,6 @@ title: Caddy
|
||||
sidebar-position: 1
|
||||
---
|
||||
|
||||
## Caddy
|
||||
|
||||
> **Note:** For HTTP/3 support, ensure UDP port 443 is forwarded/opened on your firewall, as HTTP/3 uses UDP.
|
||||
|
||||
"[Caddy](https://caddyserver.com/), sometimes clarified as the Caddy web server, is an open source, HTTP/2-enabled web server written in Go. It uses the Go standard library for its HTTP functionality." - [Wikipedia](<https://en.wikipedia.org/wiki/Caddy_(web_server)>)
|
||||
|
||||
@@ -7,7 +7,7 @@ title: Nginx
|
||||
|
||||
## Nginx from a subdomain (jellyfin.example.org)
|
||||
|
||||
Create the file `/etc/nginx/sites-available/jellyfin` which will forward requests to Jellyfin. After you've finished, you will need to symlink this file to /etc/nginx/sites-enabled and then reload nginx. This example assumes you've already acquired certifications as documented in our [Let's Encrypt](https://jellyfin.org/docs/general/networking/letsencrypt#nginx) guide.
|
||||
Create the file `/etc/nginx/sites-available/jellyfin` which will forward requests to Jellyfin. After you've finished, you will need to symlink this file to /etc/nginx/sites-enabled and then reload nginx. This example assumes you've already acquired certifications as documented in our [Let's Encrypt](https://jellyfin.org/docs/general/networking/letsencrypt#nginx) guide.
|
||||
|
||||
Note that a server listening on http port 80 is required for the Certbot / Let's Encrypt certificate renewal process.
|
||||
|
||||
@@ -51,7 +51,7 @@ server {
|
||||
# See: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
|
||||
# Enforces https content and restricts JS/CSS to origin
|
||||
# External Javascript (such as cast_sender.js for Chromecast) must be whitelisted.
|
||||
add_header Content-Security-Policy "default-src https: data: blob: ; img-src 'self' https://* ; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' https://www.gstatic.com https://www.youtube.com blob:; worker-src 'self' blob:; connect-src 'self'; object-src 'none'; frame-ancestors 'self'; font-src 'self'";
|
||||
add_header Content-Security-Policy "default-src https: data: blob: ; img-src 'self' https://* ; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' https://www.gstatic.com https://www.youtube.com blob:; worker-src 'self' blob:; connect-src 'self'; object-src 'none'; font-src 'self'";
|
||||
|
||||
location / {
|
||||
# Proxy main Jellyfin traffic
|
||||
@@ -94,7 +94,7 @@ server {
|
||||
|
||||
### Censor sensitive information in logs
|
||||
|
||||
This censors any 'api_key' URL parameter from the logfile.
|
||||
This censors any 'api_key' or 'ApiKey' URL parameter from the logfile.
|
||||
|
||||
```conf
|
||||
#Must be in HTTP block
|
||||
@@ -105,6 +105,7 @@ log_format stripsecrets '$remote_addr $host - $remote_user [$time_local] '
|
||||
|
||||
map $request $secretfilter {
|
||||
~*^(?<prefix1>.*[\?&]api_key=)([^&]*)(?<suffix1>.*)$ "${prefix1}***$suffix1";
|
||||
~*^(?<prefix1>.*[\?&]ApiKey=)([^&]*)(?<suffix1>.*)$ "${prefix1}***$suffix1";
|
||||
default $request;
|
||||
}
|
||||
|
||||
@@ -112,20 +113,3 @@ map $request $secretfilter {
|
||||
#Insert into all servers where you want filtering (e.g HTTP + HTTPS block)
|
||||
access_log /var/log/nginx/access.log stripsecrets;
|
||||
```
|
||||
|
||||
### Nginx Proxy Manager
|
||||
|
||||
[Nginx Proxy Manager](https://nginxproxymanager.com/) provides an easy-to-use web GUI for Nginx.
|
||||
|
||||
Create a proxy host and point it to your Jellyfin server's IP address and http port (usually 8096)
|
||||
|
||||
Enable "Block Common Exploits", and "Websockets Support". Configure the access list if you intend to use them. Otherwise leave it on "publicly accessible".
|
||||
|
||||
In the "Advanced" tab, enter the following in "Custom Nginx Configuration". This is optional, but recommended if you intend to make Jellyfin accessible outside of your home.
|
||||
|
||||
```config
|
||||
# Disable buffering when the nginx proxy gets very resource heavy upon streaming
|
||||
proxy_buffering off;
|
||||
```
|
||||
|
||||
In the "SSL" tab, use the jellyfin.example.org certificate that you created with Nginx Proxy Manager and enable "Force SSL", "HTTP/2 Support", "HSTS Enabled", "HSTS Subdomains".
|
||||
|
||||
@@ -150,7 +150,7 @@ Replace `<upstream-server-ip>` with the actual IP address of your upstream serve
|
||||
iptables -C INPUT -j f2b-<name> 2>/dev/null || iptables -I INPUT -j f2b-<name>; \
|
||||
iptables -I f2b-<name> 1 -s <ip> -j DROP' && \
|
||||
echo "Banned <ip> from jail <name> via upstream proxy" >> /var/log/fail2ban.log
|
||||
|
||||
|
||||
# Option: actionunban
|
||||
# 1. Remove the banned IP from the dynamic chain
|
||||
# 2. Remove the chain if it becomes empty (cleanup)
|
||||
@@ -165,7 +165,7 @@ Replace `<upstream-server-ip>` with the actual IP address of your upstream serve
|
||||
echo "Unbanned <ip> from jail <name> via upstream proxy and cleaned up chain if empty" >> /var/log/fail2ban.log
|
||||
```
|
||||
|
||||
After making chaneges, save and close the file.
|
||||
After making changes, save and close the file.
|
||||
|
||||
2. **Update Fail2Ban Jails to Use the Dynamic Chain Action**:
|
||||
|
||||
@@ -195,7 +195,7 @@ Replace `<upstream-server-ip>` with the actual IP address of your upstream serve
|
||||
action = proxy-iptables-dynamic
|
||||
```
|
||||
|
||||
After making chaneges, save and close the file.
|
||||
After making changes, save and close the file.
|
||||
|
||||
### Step three: Add proxy IPs to Jellyfin
|
||||
|
||||
@@ -211,7 +211,7 @@ Replace `<upstream-server-ip>` with the actual IP address of your upstream serve
|
||||
|
||||
Open your Jellyfin server's dashboard, go to `Advanced` -> `Networking`, and then scroll down to `Known proxies`.
|
||||
|
||||
Enter your comma-seperated list of proxy IP ranges. You'll need to reboot the Jellyfin server as indicated.
|
||||
Enter your comma-separated list of proxy IP ranges. You'll need to reboot the Jellyfin server as indicated.
|
||||
|
||||
### Step four: Restart Fail2Ban and Test the Setup
|
||||
|
||||
@@ -257,7 +257,7 @@ Replace `<upstream-server-ip>` with the actual IP address of your upstream serve
|
||||
|
||||
6. **Verify Unban**:
|
||||
|
||||
Verify that the IP is removed from the corresponding jail's chain ('f2b-jail-name'):
|
||||
Verify that the IP is removed from the corresponding jail's chain ('f2b-jail-name'):
|
||||
|
||||
```bash
|
||||
ssh root@<upstream-server-ip> "iptables -L f2b-jellyfin"
|
||||
|
||||
@@ -16,24 +16,24 @@ Neither does Jellyfin require an internet connection to run; however you should
|
||||
|
||||
This section aims to provide an administrator with knowledge on what ports Jellyfin binds to and what purpose they serve.
|
||||
|
||||
| Port | Protocol | Configurable | Description |
|
||||
|---|---|---|---|
|
||||
| 8096 | TCP | ✔️ | Default HTTP |
|
||||
| 8920 | TCP | ✔️ | Default HTTPS |
|
||||
| 7359 | UDP | ❌ | Client Discovery |
|
||||
| Port | Protocol | Configurable | Description |
|
||||
| ---- | -------- | ------------ | ---------------- |
|
||||
| 8096 | TCP | ✔️ | Default HTTP |
|
||||
| 8920 | TCP | ✔️ | Default HTTPS |
|
||||
| 7359 | UDP | ❌ | Client Discovery |
|
||||
|
||||
<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.
|
||||
The web frontend can be accessed here. You can modify this setting from the **Networking** page in the admin settings.
|
||||
|
||||
- **HTTPS Traffic** (8920/TCP):
|
||||
Used when https is enabled. By default this port will not be used.
|
||||
This setting can also be modified from the **Networking** page to use a different port.
|
||||
Used when https is enabled. By default this port will not be used.
|
||||
This setting can also be modified from the **Networking** page to use a different port.
|
||||
|
||||
- **Client Discovery** (7359/UDP):
|
||||
Allows clients to discover Jellyfin on the local network. A broadcast message to this port will return detailed information about your server that includes name, ip-address and ID.
|
||||
Allows clients to discover Jellyfin on the local network. A broadcast message to this port will return detailed information about your server that includes name, ip-address and ID.
|
||||
|
||||
</details>
|
||||
|
||||
@@ -67,18 +67,18 @@ Opening a port directly to the Internet is therefore insecure and not recommende
|
||||
|
||||
There are different layers where a firewall can be placed:
|
||||
|
||||
| Layer | Example | Description |
|
||||
| --- | --- | --- |
|
||||
| Local | Docker, VM | Open ports at this layer to allow traffic from the Host to enter the Application |
|
||||
| Host | physical machine, operating system | Open ports at this layer to allow traffic from the Network to enter the Host device |
|
||||
| Network | Router | Open ports at this layer to allow traffic from the Internet to enter the Local Network |
|
||||
| Layer | Example | Description |
|
||||
| ------- | ---------------------------------- | -------------------------------------------------------------------------------------- |
|
||||
| Local | Docker, VM | Open ports at this layer to allow traffic from the Host to enter the Application |
|
||||
| Host | physical machine, operating system | Open ports at this layer to allow traffic from the Network to enter the Host device |
|
||||
| Network | Router | Open ports at this layer to allow traffic from the Internet to enter the Local Network |
|
||||
|
||||
<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.
|
||||
Forwarding a Port you typically do in NAT scenarios - traffic is coming in on your public IP Address, what device inside your network should receive it.
|
||||
Sometimes, port forwarding also lets you map an external port to a different internal port.
|
||||
|
||||
</details>
|
||||
|
||||
@@ -38,13 +38,11 @@ Hardware accelerated HDR/DV to SDR tone-mapping is supported on **all AMD GPUs t
|
||||
There are two different methods that can be used on Windows and/or Linux. Pros and cons are listed below:
|
||||
|
||||
1. **OpenCL**
|
||||
|
||||
- Pros - Supports Dolby Vision P5, detailed fine-tuning options, widely supported hardware.
|
||||
|
||||
- Cons - Zero-copy is not supported on Linux.
|
||||
|
||||
2. **Vulkan**
|
||||
|
||||
- Pros - Supports Dolby Vision P5, libplacebo renderer, ROCm OpenCL runtime is not required.
|
||||
|
||||
- Cons - Linux only, zero-copy only supports Polaris+ GPUs.
|
||||
@@ -113,7 +111,7 @@ Encoding speed and quality:
|
||||
|
||||
## Windows Setups
|
||||
|
||||
Windows 10 64-bit and newer is recommeded. **AMF is not available in Windows Docker and WSL/WSL2.**
|
||||
Windows 10 64-bit and newer is recommended. **AMF is not available in Windows Docker and WSL/WSL2.**
|
||||
|
||||
### Known Issues And Limitations On Windows
|
||||
|
||||
@@ -126,7 +124,6 @@ Please refer to [this section](./known-issues.md#amd-on-windows) for known issue
|
||||
2. Clean install the latest driver from [AMD Drivers and Support](https://www.amd.com/en/support).
|
||||
|
||||
3. Don't allow the GPU to be preempted by the Windows Remote desktop session.
|
||||
|
||||
- Type `gpedit.msc` in Win+R shortcut key dialog and run to open the "Local Group Policy Editor".
|
||||
|
||||
- Navigate in the left tree **[Computer Configuration > Administrative Templates > Windows Components]**
|
||||
@@ -154,7 +151,6 @@ Please refer to [this section](./known-issues.md#amd-on-windows) for known issue
|
||||
Duplicate engine names indicate the GPU may have multiple video engines.
|
||||
|
||||
:::
|
||||
|
||||
- **3D** - 2D/3D engine or GPGPU workload
|
||||
|
||||
- **Copy** - Blitter/Copy engine workload
|
||||
@@ -311,7 +307,6 @@ Root permission is required.
|
||||
```
|
||||
|
||||
2. User mode Mesa drivers are required to be manually installed for VA-API and RADV Vulkan:
|
||||
|
||||
- [libva-mesa-driver](https://archlinux.org/packages/extra/x86_64/libva-mesa-driver/)
|
||||
|
||||
- [vulkan-radeon](https://archlinux.org/packages/extra/x86_64/vulkan-radeon/)
|
||||
@@ -404,7 +399,6 @@ Root permission is required.
|
||||
```
|
||||
|
||||
2. Use Docker command line **or** docker compose:
|
||||
|
||||
- Example command line:
|
||||
|
||||
```shell
|
||||
@@ -486,7 +480,6 @@ Root permission is required.
|
||||
:::
|
||||
|
||||
1. Install the `radeontop` package. The name varies between distros.
|
||||
|
||||
- On Debian & Ubuntu:
|
||||
|
||||
```shell
|
||||
|
||||
@@ -61,7 +61,7 @@ Macs from 2017 and later, excluding the MacBook Air (13-inch, 2017), support dec
|
||||
|
||||
### Transcode AV1
|
||||
|
||||
There is no hardware accelerated path for AV1 on macOS at the moment. Although the M3 series added AV1 decoding support, [ffmpeg does not support it yet](https://trac.ffmpeg.org/ticket/10642).
|
||||
Starting with the M3 series, Apple Silicon-based Mac supports hardware-accelerated decoding of AV1 video.
|
||||
|
||||
### Performance Consideration
|
||||
|
||||
|
||||
@@ -99,13 +99,13 @@ lshw -C display
|
||||
|
||||
See the table below to pick the best hardware acceleration method for your hardware:
|
||||
|
||||
| GPU Vendor | Windows | macOS | Linux |
|
||||
| ---------- | ------------------------------------------ | -------------------------- | -------------------------------------- |
|
||||
| GPU Vendor | Windows | macOS | Linux |
|
||||
| ---------- | --------------------------------------------- | -------------------------- | ----------------------------------------- |
|
||||
| AMD | [AMF (Windows)](./amd.md#windows-setups) | [VideoToolbox](./apple.md) | [VAAPI (AMD)](./amd.md#linux-setups) |
|
||||
| Apple | N/A | [VideoToolbox](./apple.md) | N/A |
|
||||
| Apple | N/A | [VideoToolbox](./apple.md) | N/A |
|
||||
| Intel | [QSV (Windows)](./intel.md#windows-setups) | [VideoToolbox](./apple.md) | [QSV (Linux)](./intel.md#linux-setups) |
|
||||
| Nvidia | [NVENC (Windows)](./nvidia.md#windows-setups) | N/A | [NVENC (Linux)](./nvidia.md#linux-setups) |
|
||||
| Rockchip | N/A | N/A | [RKMPP](./rockchip.md) |
|
||||
| Rockchip | N/A | N/A | [RKMPP](./rockchip.md) |
|
||||
|
||||
## Remote Hardware Acceleration
|
||||
|
||||
@@ -127,7 +127,7 @@ Dolby Vision (P5 & P8) to SDR tone-mapping is supported in Jellyfin 10.8 and req
|
||||
|
||||
- Intel VPP HDR10 tone-mapping is supported on Intel QSV and VA-API on Linux.
|
||||
|
||||
- VPP is prefered if both tone-mapping options are enabled.
|
||||
- VPP is preferred if both tone-mapping options are enabled.
|
||||
|
||||
- Rockchip RKMPP does support Dolby Vision tone-mapping Jellyfin 10.11 and later versions.
|
||||
|
||||
|
||||
@@ -54,13 +54,11 @@ Hardware accelerated HDR/DV to SDR tone-mapping is supported on **all Intel GPUs
|
||||
There are two different methods that can be used on Windows and/or Linux. Pros and cons are listed below:
|
||||
|
||||
1. **OpenCL**
|
||||
|
||||
- Pros - Supports Dolby Vision P5, detailed fine-tuning options, widely supported hardware.
|
||||
|
||||
- Cons - The OpenCL runtime sometimes need to be manually installed on Linux.
|
||||
|
||||
2. **QSV VPP**
|
||||
|
||||
- Pros - Lower power consumption, realized by Intel fixed-function LUT hardware.
|
||||
|
||||
- Cons - Poor tuning options, limited supported GPU models, **currently only available on Linux**.
|
||||
@@ -205,7 +203,7 @@ You only need to follow the [Windows Setups](./intel.md#windows-setups) and [Lin
|
||||
|
||||
## Windows Setups
|
||||
|
||||
Windows 10 64-bit and newer is recommeded. **QSV is not available on Windows Docker and WSL/WSL2.**
|
||||
Windows 10 64-bit and newer is recommended. **QSV is not available on Windows Docker and WSL/WSL2.**
|
||||
|
||||
### Known Issues And Limitations On Windows
|
||||
|
||||
@@ -218,7 +216,6 @@ Please refer to [this section](/docs/general/post-install/transcoding/hardware-a
|
||||
2. Clean install the latest EXE or INF driver from [Intel download center](https://www.intel.com/content/www/us/en/download-center/home.html).
|
||||
|
||||
3. Don't allow the GPU to be preempted by the Windows Remote desktop session.
|
||||
|
||||
- Type `gpedit.msc` in Win+R shortcut key dialog and run to open the "Local Group Policy Editor".
|
||||
|
||||
- Navigate in the left tree **[Computer Configuration > Administrative Templates > Windows Components]**
|
||||
@@ -246,7 +243,6 @@ Please refer to [this section](/docs/general/post-install/transcoding/hardware-a
|
||||
Duplicate engine names indicate the GPU may have multiple MFX video engines.
|
||||
|
||||
:::
|
||||
|
||||
- **3D** - 2D/3D engine, QSV VPP or GPGPU workload
|
||||
|
||||
- **Copy** - Blitter/Copy engine workload
|
||||
@@ -325,6 +321,12 @@ Root permission is required.
|
||||
|
||||
5. Check the version of `intel-opencl-icd` thats the Linux distro provides:
|
||||
|
||||
:::note
|
||||
|
||||
This package may not be available for newer distros since it [currently relies on LLVM 14](https://github.com/intel/intel-graphics-compiler/issues/289), which may not available in releases like Debian Trixie. If this is the case a release from the [Intel compute-runtime repository](https://github.com/intel/compute-runtime/releases) may be used instead.
|
||||
|
||||
:::
|
||||
|
||||
```shell
|
||||
$ apt policy intel-opencl-icd
|
||||
|
||||
@@ -343,7 +345,6 @@ Root permission is required.
|
||||
7. Check the supported QSV / VA-API codecs:
|
||||
|
||||
:::note
|
||||
|
||||
- `iHD driver` indicates support for the QSV and VA-API interfaces.
|
||||
|
||||
- `i965 driver` indicates only support for the VA-API interface, which should only be used on pre-Broadwell platforms.
|
||||
@@ -401,7 +402,6 @@ Root permission is required.
|
||||
```
|
||||
|
||||
2. User mode Intel media drivers and the OpenCL runtime are required to be manually installed for enabling QSV / VA-API:
|
||||
|
||||
- [intel-media-driver](https://archlinux.org/packages/extra/x86_64/intel-media-driver/)
|
||||
|
||||
- [intel-media-sdk](https://archlinux.org/packages/extra/x86_64/intel-media-sdk/)
|
||||
@@ -490,7 +490,6 @@ What you need to do is pass the host's `render` group id to Docker and modify th
|
||||
```
|
||||
|
||||
2. Use docker command line **or** docker compose:
|
||||
|
||||
- Example command line:
|
||||
|
||||
```shell
|
||||
@@ -559,7 +558,7 @@ This follows the same principles as for the Docker, with one small change that y
|
||||
|
||||
The devices in Kubernetes are added as host path mounts, they are not separated into separate volumes like in the Docker example.
|
||||
|
||||
1. Example Kubernetes (API version 1) configuraton file written in YAML:
|
||||
1. Example Kubernetes (API version 1) configuration file written in YAML:
|
||||
|
||||
```yaml
|
||||
# Example of an incomplete deployment spec
|
||||
@@ -629,7 +628,7 @@ This has been tested with LXC 3.0 and may or may not work with older versions.
|
||||
lxc config device add <CONTAINER_NAME> gpu gpu gid=<GID_OF_HOST_RENDER_GROUP>
|
||||
```
|
||||
|
||||
4. Make sure you have the requied devices within the container:
|
||||
4. Make sure you have the required devices within the container:
|
||||
|
||||
```shell
|
||||
$ lxc exec jellyfin -- ls -l /dev/dri
|
||||
@@ -662,7 +661,6 @@ This has been tested with LXC 3.0 and may or may not work with older versions.
|
||||
**Proxmox VE 7 or Older**:
|
||||
|
||||
:::note
|
||||
|
||||
- Jellyfin needs to run in a **privileged** LXC container.
|
||||
|
||||
- An existing unprivileged container can be converted to a privileged container by taking a backup and restoring it as privileged.
|
||||
@@ -700,7 +698,6 @@ Root permission is required.
|
||||
:::
|
||||
|
||||
1. Install the `intel-gpu-tools` package **on the host system**, which is used for debugging Intel graphics driver on Linux. The name varies between distros.
|
||||
|
||||
- On Debian & Ubuntu:
|
||||
|
||||
```shell
|
||||
@@ -722,7 +719,6 @@ Root permission is required.
|
||||
Duplicate engine names indicate the GPU may have multiple MFX video engines.
|
||||
|
||||
:::
|
||||
|
||||
- **Render/3D** - 2D/3D engine, QSV VPP or GPGPU workload
|
||||
|
||||
- **Blitter** - Blitter/Copy engine workload
|
||||
@@ -771,7 +767,7 @@ More detail information about Intel video hardware can be found [on the Intel me
|
||||
|
||||
:::note
|
||||
|
||||
Gen X refers to Intel graphics architechure instead of the CPU generation. (i.e. Gen 9 graphics ≠ 9th Gen processors)
|
||||
Gen X refers to [Intel graphics architecture](https://en.wikipedia.org/wiki/Intel_Graphics_Technology) instead of the CPU generation. (i.e. Gen 9 graphics ≠ 9th Gen processors)
|
||||
|
||||
:::
|
||||
|
||||
@@ -810,7 +806,6 @@ Root permission is required.
|
||||
:::
|
||||
|
||||
1. Install the latest linux firmware packages **on the host system**. The name varies between distros.
|
||||
|
||||
- On Debian:
|
||||
|
||||
```shell
|
||||
@@ -839,7 +834,6 @@ Root permission is required.
|
||||
```
|
||||
|
||||
2. Add the required i915 kernel parameter on the host system to enable loading GuC and HuC firmware:
|
||||
|
||||
- Check the kernel module in use, goto step 3 if **xe** kernel driver is in use.
|
||||
|
||||
:::note
|
||||
@@ -873,7 +867,6 @@ Root permission is required.
|
||||
```
|
||||
|
||||
3. Update the initramfs and grub. The commands varies between distros.
|
||||
|
||||
- On Debian & Ubuntu:
|
||||
|
||||
```shell
|
||||
|
||||
@@ -16,7 +16,6 @@ This page lists all known issues and limitations of hardware acceleration with J
|
||||
1. Some Linux distros intentionally disabled the H.264 and HEVC codecs from the Mesa VA-API driver.
|
||||
|
||||
Known affected distros:
|
||||
|
||||
- [Fedora](https://www.phoronix.com/news/Fedora-Disable-Bad-VA-API)
|
||||
|
||||
- [OpenSUSE](https://www.webpronews.com/fedora-and-opensuse-disable-gpu-accelerated-video-over-patent-concerns/)
|
||||
@@ -40,11 +39,9 @@ This page lists all known issues and limitations of hardware acceleration with J
|
||||
## Intel on Linux
|
||||
|
||||
1. Intel Gen 11 [**Jasper Lake**](https://ark.intel.com/content/www/us/en/ark/products/codename/128823/products-formerly-jasper-lake.html) and [**Elkhart Lake**](https://ark.intel.com/content/www/us/en/ark/products/codename/128825/products-formerly-elkhart-lake.html) platforms (e.g. N5095, N5105, N6005, J6412) have quirks when using video encoders on Linux. The [Low-Power Encoding](./intel.md#low-power-encoding) mode MUST be configured and enabled for correct VBR and CBR bitrate control that is required by Jellyfin.
|
||||
|
||||
- Ticket: [https://gitlab.freedesktop.org/drm/intel/-/issues/8080](https://gitlab.freedesktop.org/drm/intel/-/issues/8080)
|
||||
|
||||
2. The default kernel 5.15 that comes with Ubuntu 22.04 LTS has a regression on Intel Gen 11 graphics (ICL, JSL and EHL) that prevents you from using the Low-Power encoding mode. Linux 5.16+ is not affected.
|
||||
|
||||
- Ticket: [https://gitlab.freedesktop.org/drm/intel/-/issues/4067](https://gitlab.freedesktop.org/drm/intel/-/issues/4067)
|
||||
|
||||
- Fixed by: [drm/i915/gen11: Moving WAs to icl_gt_workarounds_init()](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=52255ef662a5d490678fbad64a735f88fcba564d)
|
||||
@@ -58,7 +55,6 @@ This page lists all known issues and limitations of hardware acceleration with J
|
||||
This will move you off a 5.15 kernel which could have other implications. If it breaks something you can return to the normal kernel by installing the linux-generic package.
|
||||
|
||||
3. The kernel range from 5.18 to 6.1.3 have an issue that locks up and resets the i915 kernel driver when using OpenCL based HDR/DV tone-mapping. Linux 5.18-, 6.0.18+, 6.1.4+ are not affected.
|
||||
|
||||
- Ticket: [https://gitlab.freedesktop.org/drm/intel/-/issues/7627](https://gitlab.freedesktop.org/drm/intel/-/issues/7627)
|
||||
|
||||
- Fixed by: [drm/i915: improve the catch-all evict to handle lock contention](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3f882f2d4f689627c1566c2c92087bc3ff734953)
|
||||
@@ -80,7 +76,6 @@ This page lists all known issues and limitations of hardware acceleration with J
|
||||
11. The kernel support for Intel Gen 13 (or Gen 20?) LNL and BMG / ARC B-series are incomplete before Linux 6.12.
|
||||
|
||||
12. The LTS kernel range 6.6.26 - 6.6.32 and the stable kernel range 6.8.5 - 6.9.3 have i915 driver bugs, which may cause problems on Intel Gen 12.5 DG2 / ARC A-series GPUs. If you are affected, please upgrade to kernel 6.6.33+ (LTS) or 6.9.4+. Ubuntu 24.04 with kernel versions 6.8.0-38 thru 6.8.0-41 are also affected by this issue. Upgrade to Ubuntu kernel 6.8.0-44+ if you are on the affected kernels.
|
||||
|
||||
- Issue: [https://github.com/jellyfin/jellyfin/issues/11380](https://github.com/jellyfin/jellyfin/issues/11380)
|
||||
- Ubuntu bug: [https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2072755](https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2072755)
|
||||
|
||||
@@ -88,6 +83,8 @@ This page lists all known issues and limitations of hardware acceleration with J
|
||||
|
||||
14. Resizable-BAR is mandatory for hardware acceleration on BMG / ARC B-series cards, or the [media driver will crash the transcoder](https://github.com/intel/media-driver/issues/1893).
|
||||
|
||||
15. Intel Compute-Runtime currently uses LLVM 14 for compilation [as seen on the Intel bug report page](https://github.com/intel/intel-graphics-compiler/issues/289), making it unavailable in some distributions like Debian Trixie [as seen on the Debian bug report page](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1072376). Intel provided releases [on the Intel GitHub page](https://github.com/intel/compute-runtime/releases) which only require matching a matching libc runtime may be used instead.
|
||||
|
||||
## Nvidia
|
||||
|
||||
1. Consumer targeted [Geforce and some entry-level Quadro](https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new) cards have an artificial limit on the number of concurrent NVENC encoding sessions. This restriction can be circumvented by applying an [unofficial patch](https://github.com/keylase/nvidia-patch) to the NVIDIA Linux and Windows driver.
|
||||
@@ -104,4 +101,4 @@ This page lists all known issues and limitations of hardware acceleration with J
|
||||
- [https://github.com/ollama/ollama/issues/6928#issuecomment-2586208913](https://github.com/ollama/ollama/issues/6928#issuecomment-2586208913)
|
||||
3. Docker desktop isn't supported by Nvidia Container Toolkit.
|
||||
- [https://github.com/NVIDIA/nvidia-container-toolkit/issues/219#issuecomment-1903941381](https://github.com/NVIDIA/nvidia-container-toolkit/issues/219#issuecomment-1903941381)
|
||||
If you need a GUI, use the docker package and podman, or similar.
|
||||
If you need a GUI, use the docker package and podman, or similar.
|
||||
|
||||
@@ -67,7 +67,7 @@ Maxwell+ GPUs provide support for HEVC:
|
||||
|
||||
:::note
|
||||
|
||||
Note that in Maxwell 2nd Gen series only the GM206 variants provide HEVC 10-bit decoding support. Its sucessor Pascal has full support for HEVC 10-bit and improved speed and quality.
|
||||
Note that in Maxwell 2nd Gen series only the GM206 variants provide HEVC 10-bit decoding support. Its successor Pascal has full support for HEVC 10-bit and improved speed and quality.
|
||||
|
||||
:::
|
||||
|
||||
@@ -113,7 +113,7 @@ NVENC/NVDEC performance tables:
|
||||
|
||||
## Windows Setups
|
||||
|
||||
Windows 10 64-bit and newer is recommeded. **In Jellyfin 10.10 the minimum required NVIDIA driver version is 522.25**.
|
||||
Windows 10 64-bit and newer is recommended. **In Jellyfin 10.10 the minimum required NVIDIA driver version is 522.25**.
|
||||
|
||||
### Configure On Windows Host
|
||||
|
||||
@@ -136,7 +136,6 @@ Refer to [Configure On Linux Host](./nvidia.md#configure-on-linux-host) and [Con
|
||||
2. Open the "Task Manager" and navigate to the GPU page.
|
||||
|
||||
3. Check the occupancy of the engines as follows.
|
||||
|
||||
- **3D** - 2D/3D engine or CUDA/GPGPU workload
|
||||
|
||||
- **Copy** - Blitter/Copy engine workload
|
||||
@@ -176,7 +175,6 @@ Root permission is required.
|
||||
```
|
||||
|
||||
3. Install the NVIDIA proprietary driver by following these links. Then install two extra packages for NVENC and NVDEC support:
|
||||
|
||||
- On Debian: [https://wiki.debian.org/NvidiaGraphicsDrivers](https://wiki.debian.org/NvidiaGraphicsDrivers)
|
||||
|
||||
```shell
|
||||
@@ -237,7 +235,6 @@ Root permission is required.
|
||||
```
|
||||
|
||||
2. Install the NVIDIA proprietary driver by following the link. Then install an extra package for NVENC and NVDEC support:
|
||||
|
||||
- [https://wiki.archlinux.org/title/NVIDIA#Installation](https://wiki.archlinux.org/title/NVIDIA#Installation)
|
||||
|
||||
```shell
|
||||
@@ -310,11 +307,9 @@ Root permission is required.
|
||||
1. Install the NVIDIA proprietary driver on the host system. See above instructions.
|
||||
|
||||
2. Install the NVIDIA Container Toolkit on the host system by following this link:
|
||||
|
||||
- [https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#installation-guide](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#installation-guide)
|
||||
|
||||
3. Use the Docker command line **or** docker-compose:
|
||||
|
||||
- Example command line:
|
||||
|
||||
```shell
|
||||
@@ -355,7 +350,7 @@ Root permission is required.
|
||||
|
||||
:::note
|
||||
|
||||
If you encounter the upsteam issue `CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected`, pass these extra devices to the Docker:
|
||||
If you encounter the upstream issue `CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected`, pass these extra devices to the Docker:
|
||||
|
||||
```shell
|
||||
/dev/nvidia-caps:/dev/nvidia-caps
|
||||
@@ -464,7 +459,7 @@ The paths of Jellyfin config and data folders in the official and LSIO Docker im
|
||||
--environment=JELLYFIN_CONFIG_DIR=/etc/jellyfin
|
||||
--environment=JELLYFIN_LOG_DIR=/var/log/jellyfin
|
||||
--environment=JELLYFIN_CACHE_DIR=/var/cache/jellyfin
|
||||
--volume=/your/path/to/data:/var/lib/jellyfin # Replace paths with actual paths on your host's filestystem
|
||||
--volume=/your/path/to/data:/var/lib/jellyfin # Replace paths with actual paths on your host's filesystem
|
||||
--volume=/your/path/to/config:/etc/jellyfin
|
||||
--volume=/your/path/to/logs:/var/log/jellyfin
|
||||
--volume=/your/path/to/cache:/var/cache/jellyfin
|
||||
@@ -477,7 +472,7 @@ The paths of Jellyfin config and data folders in the official and LSIO Docker im
|
||||
```sh
|
||||
[Unit]
|
||||
Description=jellyfin
|
||||
|
||||
|
||||
[Container]
|
||||
Image=docker.io/jellyfin/jellyfin:latest
|
||||
AutoUpdate=registry
|
||||
@@ -489,7 +484,7 @@ The paths of Jellyfin config and data folders in the official and LSIO Docker im
|
||||
Environment=JELLYFIN_CONFIG_DIR=/etc/jellyfin
|
||||
Environment=JELLYFIN_LOG_DIR=/var/log/jellyfin
|
||||
Environment=JELLYFIN_CACHE_DIR=/var/cache/jellyfin
|
||||
Volume=/your/path/to/data:/var/lib/jellyfin # Replace paths with actual paths on your host's filestystem
|
||||
Volume=/your/path/to/data:/var/lib/jellyfin # Replace paths with actual paths on your host's filesystem
|
||||
Volume=/your/path/to/config:/etc/jellyfin
|
||||
Volume=/your/path/to/logs:/var/log/jellyfin
|
||||
Volume=/your/path/to/cache:/var/cache/jellyfin
|
||||
@@ -497,10 +492,10 @@ The paths of Jellyfin config and data folders in the official and LSIO Docker im
|
||||
[Service]
|
||||
# Inform systemd of additional exit status
|
||||
SuccessExitStatus=0 143
|
||||
|
||||
|
||||
[Install]
|
||||
# Start by default on boot
|
||||
WantedBy=default.target
|
||||
WantedBy=default.target
|
||||
```
|
||||
|
||||
5. Create the following udev rule to make sure the GPU devices are initialized before the container is started.
|
||||
|
||||
@@ -155,7 +155,6 @@ Root permission is required.
|
||||
Only needed before using HDR tone-mapping on RK3588/3588S. This is done to ensure that the user space firmware and kernel driver versions match, otherwise OpenCL will not work properly.
|
||||
|
||||
:::
|
||||
|
||||
- For the 6.1 LTS kernel on [Ubuntu-Rockchip](https://github.com/Joshua-Riek/ubuntu-rockchip) & [Armbian](https://github.com/armbian) and the legacy 5.10 LTS kernel, install [v1.9-1-2131373](https://github.com/tsukumijima/libmali-rockchip/releases/download/v1.9-1-2131373/libmali-valhall-g610-g24p0-gbm_1.9-1_arm64.deb).
|
||||
|
||||
- For the 6.1 LTS kernel on other SBC **vendor-made** distros, install [v1.9-1-55611b0](https://github.com/tsukumijima/libmali-rockchip/releases/download/v1.9-1-55611b0/libmali-valhall-g610-g13p0-gbm_1.9-1_arm64.deb).
|
||||
@@ -193,7 +192,7 @@ Root permission is required.
|
||||
|
||||
:::
|
||||
|
||||
1. Use Docker command line: (the extensive device names between `for...done` is used to ensure backward compatiblity)
|
||||
1. Use Docker command line: (the extensive device names between `for...done` is used to ensure backward compatibility)
|
||||
|
||||
```shell
|
||||
sudo docker run -d \
|
||||
@@ -233,7 +232,7 @@ Root permission is required.
|
||||
|
||||
#### LXC (Linux Containers)
|
||||
|
||||
This setup might be useful for those, who use RK3588/3588S SoC as [Proxmox](https://www.proxmox.com/en/) host, where LXC is the official and the only supported way of doing lightweight virtualiztion with the help of system containers (LXC) vs application containers (docker). As of today Proxmox team does not support ARM platforms as hosts - and probably will never do - however successful deployments on ARM devices [are possible](https://github.com/jiangcuo/Proxmox-Port?tab=readme-ov-file).
|
||||
This setup might be useful for those, who use RK3588/3588S SoC as [Proxmox](https://www.proxmox.com/en/) host, where LXC is the official and the only supported way of doing lightweight virtualization with the help of system containers (LXC) vs application containers (docker). As of today Proxmox team does not support ARM platforms as hosts - and probably will never do - however successful deployments on ARM devices [are possible](https://github.com/jiangcuo/Proxmox-Port?tab=readme-ov-file).
|
||||
|
||||
LXC setup idea is a bit similar to docker - you need to pass the **device files** of VPU from host to LXC and enable the **privileged mode** (see also important "_note_" below about privileged LXC containers).
|
||||
|
||||
@@ -251,7 +250,7 @@ LXC setup idea is a bit similar to docker - you need to pass the **device files*
|
||||
device /dev/mpp_service
|
||||
```
|
||||
|
||||
Example of the minumum requried extra (not full) container configuration to make VPU hardware accelearion working is presented below:
|
||||
Example of the minimum required extra (not full) container configuration to make VPU hardware acceleration working is presented below:
|
||||
|
||||
```shell
|
||||
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
|
||||
@@ -273,7 +272,6 @@ LXC setup idea is a bit similar to docker - you need to pass the **device files*
|
||||
|
||||
2. Install supported [jellyfin package](https://jellyfin.org/docs/general/installation/linux) into LXC container or optionally you can even use an official docker image inside LXC container.
|
||||
3. Verify OpenCL runtime status as following - example is collected from LXC runtime of Ubuntu Jammy - steps are the same as docker deployments:
|
||||
|
||||
- _libmali user-space drivers should be installed inside LXC container, otherwise opencl=ocl@rk device won't be initialized_
|
||||
|
||||
```shell
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
|
||||
## Metadata Images
|
||||
|
||||
Images can either be provided as external files within the media folders, or embedded in the media files themselves. When external imaged are provided, they should be placed alongside the media files. When they are provided, they will take precedence over other sources.
|
||||
Images can either be provided as external files within the media folders, or embedded in the media files themselves. When external images are provided, they should be placed alongside the media files. When they are provided, they will take precedence over other sources.
|
||||
|
||||
Similar to media folders, an artist image can be placed in the root of an artist’s folder. It will be shown both when browsing artists and on the artist’s detail page.
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
@@ -10,12 +12,14 @@ import TabItem from '@theme/TabItem';
|
||||
<Tabs>
|
||||
<TabItem value='music' label='Music'>
|
||||
```txt
|
||||
Album
|
||||
├── cover.jpg
|
||||
├── backdrop.webp
|
||||
├── logo.png
|
||||
├── Track 1.m4a
|
||||
└── Track 2.m4a
|
||||
Artist
|
||||
├── Album
|
||||
│ ├── cover.jpg
|
||||
│ ├── backdrop.webp
|
||||
│ ├── logo.png
|
||||
│ ├── Track 1.m4a
|
||||
│ └── Track 2.m4a
|
||||
└── folder.jpg
|
||||
```
|
||||
When no images are provided for music, Jellyfin will take the cover image from the first track that has an embedded cover image.
|
||||
</TabItem>
|
||||
@@ -49,7 +53,7 @@ Image types:
|
||||
|
||||
| Type | Description |
|
||||
| -------- | --------------------------------------------------------------------------------------- |
|
||||
| Primary | The primary cover image |
|
||||
| Primary | The primary cover/artist image |
|
||||
| Backdrop | Background image in media page <sup>1</sup> |
|
||||
| Banner | Displayed when browsing library in banner mode. Video only. <sup>2</sup> |
|
||||
| Logo | Logo displayed on the top of a media item. |
|
||||
@@ -57,33 +61,33 @@ Image types:
|
||||
|
||||
<sup>1</sup>Multiple backdrop images can be used to cycle through several over time. Simply append a number to the end of the filename directly after or after a hyphen, e.g. `backdrop-1.jpg`, `backdrop2.jpg`.
|
||||
|
||||
<sup>2</sup>These can be added to both video and audio content, but are not used by any client for audio conent.
|
||||
<sup>2</sup>These can be added to both video and audio content, but are not used by any client for audio content.
|
||||
|
||||
<details>
|
||||
<summary>Filenames, their respective types and supported media types</summary>
|
||||
|
||||
Unless otherwise noted, all filenames can be used either standalone (e.g. `logo.png`) or as a suffix (e.g. `movie-logo.png`)
|
||||
|
||||
| Filename | Type | Movies | Series | Season | Episode | Music |
|
||||
| --------------------------- | -------- | --------------- | ------ | ------ | ------- | ----- |
|
||||
| poster | Primary | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ |
|
||||
| folder | Primary | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ |
|
||||
| cover | Primary | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ |
|
||||
| default | Primary | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ |
|
||||
| movie | Primary | ✅ <sup>2</sup> | | | | |
|
||||
| show | Primary | | ✅ | | | |
|
||||
| jacket | Primary | | | | | ✅ |
|
||||
| thumb (suffix) <sup>1</sup> | Primary | | | | ✅ | |
|
||||
| backdrop | Backdrop | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ |
|
||||
| fanart | Backdrop | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ |
|
||||
| background | Backdrop | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ |
|
||||
| art | Backdrop | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ |
|
||||
| extrafanart (folder) | Backdrop | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ |
|
||||
| banner | Banner | ✅ | ✅ | ✅ | | ✅ |
|
||||
| logo | Logo | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ |
|
||||
| clearlogo | Logo | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ |
|
||||
| landscape | Thumb | ✅ | ✅ | ✅ | | ✅ |
|
||||
| thumb | Thumb | ✅ | ✅ | ✅ | | ✅ |
|
||||
| Filename | Type | Movies | Series | Season | Episode | Music | Artist |
|
||||
| --------------------------- | -------- | --------------- | ------ | ------ | ------- | ----- | ------ |
|
||||
| poster | Primary | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ | |
|
||||
| folder | Primary | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ | ✅ |
|
||||
| cover | Primary | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ | |
|
||||
| default | Primary | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ | |
|
||||
| movie | Primary | ✅ <sup>2</sup> | | | | | |
|
||||
| show | Primary | | ✅ | | | | |
|
||||
| jacket | Primary | | | | | ✅ | |
|
||||
| thumb (suffix) <sup>1</sup> | Primary | | | | ✅ | | |
|
||||
| backdrop | Backdrop | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ | |
|
||||
| fanart | Backdrop | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ | |
|
||||
| background | Backdrop | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ | |
|
||||
| art | Backdrop | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ | |
|
||||
| extrafanart (folder) | Backdrop | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ | |
|
||||
| banner | Banner | ✅ | ✅ | ✅ | | ✅ | |
|
||||
| logo | Logo | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ | |
|
||||
| clearlogo | Logo | ✅ <sup>2</sup> | ✅ | ✅ | | ✅ | |
|
||||
| landscape | Thumb | ✅ | ✅ | ✅ | | ✅ | |
|
||||
| thumb | Thumb | ✅ | ✅ | ✅ | | ✅ | |
|
||||
|
||||
<sup>1</sup> For example: `S01E01 Some Episode-thumb.jpg` <br />
|
||||
<sup>2</sup> These file names can also be embedded in supported media containers (e.g. mkv) and will be used when the `Embedded Image Extractor` source is enabled for movies.
|
||||
|
||||
@@ -22,9 +22,9 @@ 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
|
||||
Series Name A (2022) S01E01 Some Episode.3d.ftab.mp4
|
||||
Series Name A (2022) S01E02 Some Other Episode.3d.ftab.mp4
|
||||
Series Name A (2022) 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.
|
||||
|
||||
@@ -21,6 +21,8 @@ Supported folder types are:
|
||||
- `other` - Generic catch all for extras of an unknown type.
|
||||
- `extras` - Generic catch all for extras of an unknown type.
|
||||
- `trailers`
|
||||
- `theme-music`
|
||||
- `backdrops`
|
||||
|
||||
```txt
|
||||
Best_Movie_Ever (2019)
|
||||
@@ -34,11 +36,18 @@ Best_Movie_Ever (2019)
|
||||
```txt
|
||||
Awesome TV Show (2024)
|
||||
├── Season 1
|
||||
│ ├── S01E01 episode name.mp4
|
||||
│ └── trailers
|
||||
│ └── trailer1.mp4
|
||||
└── interviews
|
||||
└── Interview with the Director.mp4
|
||||
│ ├── Awesome TV Show (2024) S01E01 episode name.mp4
|
||||
│ ├── trailers
|
||||
│ │ └── trailer1.mp4
|
||||
│ ├── theme-music
|
||||
│ │ ├── Season 01 OP.mp3
|
||||
│ │ └── Season 01 ED.flac
|
||||
│ └── backdrops
|
||||
│ └── S1Intro.mkv
|
||||
├── interviews
|
||||
│ └── Interview with the Director.mp4
|
||||
└── theme-music
|
||||
└── Series Opening.wav
|
||||
```
|
||||
|
||||
### File Name
|
||||
@@ -60,7 +69,7 @@ Best_Movie_Ever (2019)
|
||||
```txt
|
||||
Awesome TV Show (2024)
|
||||
├── Season 1
|
||||
│ ├── S01E01 episode name.mp4
|
||||
│ ├── Awesome TV Show (2024) S01E01 episode name.mp4
|
||||
│ └── theme.flac
|
||||
└── sample.mp4
|
||||
```
|
||||
@@ -99,9 +108,9 @@ Best_Movie_Ever (2019)
|
||||
```
|
||||
|
||||
```txt
|
||||
Awesome TV Show (2024)
|
||||
Series Name A (2024)
|
||||
├── Season 1
|
||||
│ ├── S01E01 episode name.mp4
|
||||
│ ├── Series Name A (2024) S01E01 episode name.mp4
|
||||
│ └── Preview Trailer.trailer.mp4
|
||||
└── making of awesome tv show-behindthescenes.mp4
|
||||
└── making of Series Name A-behindthescenes.mp4
|
||||
```
|
||||
|
||||
@@ -5,23 +5,23 @@
|
||||
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
|
||||
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
|
||||
Shows
|
||||
└── Series Name A (2021)
|
||||
└── Season 1
|
||||
├── Series Name A (2021) S01E01 Title.avi
|
||||
├── Series Name A (2021) S01E01 Title.ja.ass
|
||||
└── Series Name A (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 `.`
|
||||
|
||||
@@ -4,4 +4,4 @@ Most common video formats are supported by Jellyfin, such as `mp4` and `mkv`. In
|
||||
|
||||
`.iso` files and other disc image formats should work, but are not supported. It is recommended that disc image formats be remuxed into `mkv` containers, or extracted into `VIDEO_TS` or `BDMV` folders.
|
||||
|
||||
File names containing special characters WILL cause problems. The following characters are known to cause issues: `<`, `>`, `:`, `"`, `/`, `\`, `|`, `?`, `*`
|
||||
File names should match the name listed by your metadata provider whenever possible. However, certain characters cannot be used as they are reserved by jellyfin. Including them WILL cause problems. The following characters are known to cause issues: `<`, `>`, `:`, `"`, `/`, `\`, `|`, `?`, `*`
|
||||
|
||||
@@ -2,16 +2,13 @@
|
||||
|
||||
### Metadata providers
|
||||
|
||||
Jellyfin fetches information about the media automatically from external metadata providers. The following metadata providers are supported:
|
||||
Jellyfin fetches information about the media automatically from external metadata providers for most types of content.
|
||||
Movies and shows can be named with a metadata provider ID to improve matching.
|
||||
Movies and shows can be named with a metadata provider ID to improve matching.
|
||||
|
||||
- [TheMovieDB (TMDB)](https://www.themoviedb.org/)
|
||||
- [TheTVDB (TVDB)](https://www.thetvdb.com/) (Shows Only)
|
||||
- [OMDb API (OMDB)](https://www.omdbapi.com/) (English Only)
|
||||
```txt
|
||||
Movie Name (year) [metadata provider id]
|
||||
Series Name (year) [metadata provider id]
|
||||
```
|
||||
|
||||
Movies and show series can be named with a metadata provider ID to improve matching. They can be added to a file name in the following format:
|
||||
|
||||
- `[imdbid-tt12345678]`
|
||||
- `[tmdbid-12345]`
|
||||
- `[tvdbid-67890]`
|
||||
|
||||
Multiple IDs can be added in the same file / folder. e.g. `Jellyfin Documentary [imdbid-tt00000000] [tmdbid-00000].mkv`
|
||||
Read more about it in the [metadata provider identifiers section](/docs/general/server/metadata/identifiers.md).
|
||||
|
||||
@@ -12,10 +12,10 @@ Movie Name (2010)
|
||||
```
|
||||
|
||||
```txt
|
||||
Show (2025)
|
||||
Series Name A (2025)
|
||||
└──Season 1
|
||||
├── S01E01-part-1.mkv
|
||||
└── S01E01-part-2.mkv
|
||||
├── Series Name A (2025) S01E01-part-1.mkv
|
||||
└── Series Name A (2025) S01E01-part-2.mkv
|
||||
```
|
||||
|
||||
The separator is optional between `<parttype>` and `<partnumber>`. `<partnumber>` can be any number, or the letters a-d.
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
## Multiple Versions
|
||||
|
||||
Multiple versions of the same video can be stored together in the library using a file suffix in Movie and Music Video library types. The part before any suffixes **MUST** be exactly the same, including any years and/or metadata provider IDs.
|
||||
Jellyfin supports storing multiple versions of the same video within a single movie folder by using filename suffixes. Each file **must** begin exactly with the parent folder name - including any year and/or metadata provider IDs - before adding a version label. This prefix must match character-for-character; otherwise, the files will be treated as separate movies.
|
||||
|
||||
```txt
|
||||
Movie (2021) [imdbid-tt12801262]
|
||||
|
||||
@@ -13,8 +13,7 @@ Books should be organized by type (Audiobooks, Books, Comics), then optionally b
|
||||
Books
|
||||
├── Audiobooks
|
||||
│ ├── Author
|
||||
│ │ ├── Book1
|
||||
│ │ │ └── Book1.flac
|
||||
│ │ ├── Book1.flac
|
||||
│ │ └── Book2
|
||||
│ │ └── Book2.mp3
|
||||
│ └── Book3
|
||||
|
||||
@@ -1,18 +1,22 @@
|
||||
---
|
||||
uid: server-media-excluding-directory
|
||||
title: Excluding a directory
|
||||
title: Excluding Files and Directories
|
||||
---
|
||||
|
||||
# Excluding a directory
|
||||
# Excluding Files and Directories
|
||||
|
||||
Directories, and their respective media files, can be excluded from the library scan. This can be achieved by placing a `.ignore` file in the directory you want to exclude. As a result, the directory, and it's subdirectories, will be excluded from being scanned and shown to the end user.
|
||||
Directories and files can be set for exclusion from Jellyfin media library scans, permitting you to include non-tracked files and directories within your media library. This is done by using `.ignore` (dot-ignore) files within your media library directories.
|
||||
|
||||
:::tip
|
||||
|
||||
When placing a `.ignore` file inside a directory, make sure to refresh/ rescan the metadata afterwards for it to be applied.
|
||||
When creating or updating a `.ignore` file, ensure that you refresh/rescan the library afterwards for it to be applied.
|
||||
|
||||
:::
|
||||
|
||||
## Excluding whole directories
|
||||
|
||||
To exclude an entire directory, place an **empty** file named `.ignore` inside the directory. This directory, and all files and subdirectories within it, will be excluded.
|
||||
|
||||
The example given below results in the directories `Season 03` and `OST` being ignored:
|
||||
|
||||
```txt
|
||||
@@ -30,8 +34,26 @@ Shows
|
||||
└── ...
|
||||
```
|
||||
|
||||
## Excluding specific files or subdirectories
|
||||
|
||||
When a `.ignore` file is **not empty**, it is treated as a list of items to ignore using the [same format as a Git `.gitignore` file](https://git-scm.com/docs/gitignore#_pattern_format).
|
||||
|
||||
:::caution
|
||||
|
||||
Currently, placing a `.ignore` file inside an [`Extras`](/docs/general/server/media/shows#extras-folders) directory [does not work](https://github.com/jellyfin/jellyfin/issues/9571).
|
||||
This is a new feature in Jellyfin 10.11.x and later; older versions did not care about the contents of `.ignore` files. Legacy non-empty `.ignore` files must be manually corrected or they will stop functioning as expected.
|
||||
|
||||
:::
|
||||
|
||||
For example, a `.ignore` containing the following:
|
||||
|
||||
```txt
|
||||
*.avi
|
||||
sample.mkv
|
||||
specials/
|
||||
```
|
||||
|
||||
Will trigger Jellyfin to ignore:
|
||||
|
||||
* any file that ends with `.avi`.
|
||||
* any file named exactly `sample.mkv`.
|
||||
* the subdirectory `specials` and all files under it.
|
||||
|
||||
@@ -41,17 +41,17 @@ Movies
|
||||
The folder containing the movie should be named in the following format:
|
||||
|
||||
```txt
|
||||
Movie Name (year) [external id]
|
||||
Movie Name (year) [metadata provider id]
|
||||
```
|
||||
|
||||
The `year` and `external id` fields are optional, but they will help identify media more reliably.
|
||||
The `year` and `metadata provider id` fields are optional, but they will help identify media more reliably.
|
||||
|
||||
The video files within the folder should have the same name as the folder. I.e. if the folder is named `Super Fun Movie`, the video file within should be named `Super Fun Movie.mp4` (or any other extension), optionally with tags defined below.
|
||||
|
||||
- Example with name only: `Jellyfin Documentary.mkv`
|
||||
- Example with year: `Jellyfin Documentary (2030).mkv`
|
||||
- Example with external id: `Jellyfin Documentary [imdbid-tt00000000].mkv`
|
||||
- Example with both year and external id: `Jellyfin Documentary (2030) [imdbid-tt00000000].mkv`
|
||||
- Example with metadata provider id: `Jellyfin Documentary [imdbid-tt00000000].mkv`
|
||||
- Example with both year and metadata provider id: `Jellyfin Documentary (2030) [imdbid-tt00000000].mkv`
|
||||
|
||||
import VideoMetadataProviders from './\_video-metadata-providers.md';
|
||||
|
||||
|
||||
@@ -47,17 +47,17 @@ Each video file may contain multiple episodes. However, they will be shown as a
|
||||
The series folder should be named in the following format:
|
||||
|
||||
```txt
|
||||
Series Name (year) [external id]
|
||||
Series Name (year) [metadata provider id]
|
||||
```
|
||||
|
||||
The `year` and `external id` fields are optional, but they will help identify media more reliably.
|
||||
The `year` and `metadata provider id` fields are optional, but they will help identify media more reliably.
|
||||
|
||||
- Example with name only: `Jellyfin Documentary.mkv`
|
||||
- Example with year: `Jellyfin Documentary (2030)`
|
||||
- Example with external id: `Jellyfin Documentary [imdbid-tt00000000]`
|
||||
- Example with both year and external id: `Jellyfin Documentary (2030) [imdbid-tt00000000]`
|
||||
- Example with metadata provider id: `Jellyfin Documentary [imdbid-tt00000000]`
|
||||
- Example with both year and metadata provider id: `Jellyfin Documentary (2030) [imdbid-tt00000000]`
|
||||
|
||||
The Season folders should be named `Season *`, with `*` being any number. For the best results, please pad the season number with `0`s at the front to make sure each entry has the same number of digits. For example: `Season 5` -> `Season 05`.
|
||||
The Season folders should be named `Season *`, with `*` being any number. Do not abbreviate the `Season` name to `S01` or `SE01`. For the best results, please pad the season number with `0`s at the front to make sure each entry has the same number of digits. For example: `Season 5` -> `Season 05`. Also do not mix Season folders with episodes in the Shows folder.
|
||||
|
||||
import VideoMetadataProviders from './\_video-metadata-providers.md';
|
||||
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
---
|
||||
uid: server-metadata-chapter-images
|
||||
title: Chapter Images
|
||||
---
|
||||
|
||||
:::note
|
||||
|
||||
Not to be confused with chapters, which are the ticks you see in the timeline when watching a video. Chapter Images must be enabled to be displayed; chapters can be displayed even when Chapter Images are disabled.
|
||||
|
||||
:::
|
||||
|
||||
Chapter images are a type of metadata for video media files stored in Jellyfin. They are images that correspond to chapters and give a preview of the video at that timestamp.
|
||||
|
||||
Jellyfin stores the chapter images within the metadata directory, which should be located inside your server's config directory.
|
||||
|
||||
## Getting Started
|
||||
|
||||
The feature is enabled per library. There are 2 ways to get to the library settings
|
||||
1. When you add a new library, pick a video Content type, then navigate to "Chapter Images"
|
||||
2. Click the 3 dots of an existing library and then navigate to "Chapter Images"
|
||||
|
||||
### Enable chapter image extraction
|
||||
|
||||
This will enable the Chapter image feature.
|
||||
|
||||
### Extract chapter images during the library scan
|
||||
|
||||
This will change the scheduled extraction to happen in the "Scan Media Library" task instead of the "Extract Chapter Images" task.
|
||||
|
||||
:::note
|
||||
|
||||
Extracting chapter images can be computationally intensive and slow down library scans significantly - especially on large libraries.
|
||||
|
||||
:::
|
||||
|
||||
## Other Settings
|
||||
|
||||
In the dashboard, you can configure other behaviours of the chapter image feature. These settings are found in Libraries -> Metadata
|
||||
|
||||
### Interval
|
||||
|
||||
This creates dummy chapters at a given interval (0 will disable dummy chapters) if no chapters are detected in the media file. The value is in seconds.
|
||||
|
||||
:::note
|
||||
|
||||
Not recommended to use small values here. Small intervals could slow down video playback as Jellyfin's webUI video player will try to render all the chapters on the timeline.
|
||||
|
||||
:::
|
||||
|
||||
### Resolution
|
||||
|
||||
This will set the resolution of the image files that are extracted. These images are used in a small preview window and will never take up the full screen, so setting a high resolution here is not necessary.
|
||||
@@ -0,0 +1,60 @@
|
||||
---
|
||||
uid: metadata-provider-identifiers
|
||||
title: Metadata Provider Identifiers
|
||||
---
|
||||
|
||||
# Metadata Provider Identifiers
|
||||
|
||||
To improve the accuracy of media identification, you can manually specify a metadata provider identifier for each movie or show. Each metadata provider uses a unique identifier for its content, and adding these identifiers greatly improves media identification. Identifiers can be specified in your movie/show file or folder name. Multiple identifiers can be specified. For example:
|
||||
|
||||
```txt
|
||||
Movies
|
||||
├── Best_Movie_Ever (1994) [tmdbid-680] [imdbid-1234]
|
||||
│ ├── Best_Movie_Ever (1994) [tmdbid-680].mp4
|
||||
└── Movie (2021) [imdbid-tt12801262]
|
||||
└── Movie (2021) [imdbid-tt12801262].mp4
|
||||
Shows
|
||||
└── Series Name (2018) [tvdbid-79168]
|
||||
├── Season 01
|
||||
| ├── Series Name B S01E01.mkv
|
||||
| └── Series Name B S01E02.mkv
|
||||
└── Season 02
|
||||
├── Series Name B S02E01-E02.mkv
|
||||
└── Series Name B S02E03.mkv
|
||||
```
|
||||
|
||||
## Supported Metadata Providers
|
||||
|
||||
The following metadata providers are supported:
|
||||
|
||||
- [The Movie DB (TMDB)](https://www.themoviedb.org/)
|
||||
- [The TV Database (TVDB)](https://www.thetvdb.com/) (Shows Only)
|
||||
- [OMDb API (OMDB)](https://www.omdbapi.com/) (English Only)
|
||||
|
||||
## Finding Metadata Provider Identifiers
|
||||
|
||||
Below are instructions on how to find metadata provider identifiers for each supported provider.
|
||||
|
||||
### The Movie Database (TMDB)
|
||||
|
||||
The identifier is found in the URL of the title. For example:
|
||||
|
||||
URL: `https://www.themoviedb.org/movie/569094-spider-man-across-the-spider-verse`
|
||||
|
||||
Identifier: `[tmdbid-569094]`
|
||||
|
||||
### The TV Database (TVDB)
|
||||
|
||||
The identifier is found on the main page of the title. For example:
|
||||
|
||||

|
||||
|
||||
Identifier: `[tvdbid-266189]`
|
||||
|
||||
### OMDb API (OMDB)
|
||||
|
||||
OMDB provider uses Internet Movie Database (IMDB) IDs as identifiers. The identifier is found in the URL of the title. For example:
|
||||
|
||||
URL: `https://www.imdb.com/title/tt9362722/`
|
||||
|
||||
Identifier: `[imdbid-tt9362722]`
|
||||
@@ -17,10 +17,10 @@ There are more official providers available in our [Plugin Catalog](/docs/genera
|
||||
|
||||
:::caution Notice for Users in Mainland China 中国大陆地区用户请注意
|
||||
|
||||
Because of external factors, certain metadata providers may not be accessable in mainland China. <br />
|
||||
Because of external factors, certain metadata providers may not be accessible in mainland China. <br />
|
||||
由于外部因素,部分元数据提供者在中国大陆地区可能无法访问。
|
||||
|
||||
Below is a list of known inaccessable providers: <br />
|
||||
Below is a list of known inaccessible providers: <br />
|
||||
下方为已知无法访问的提供者:
|
||||
|
||||
- The Movie Database (TMDb)
|
||||
|
||||
@@ -3,30 +3,7 @@ uid: server-metadata-media-segments
|
||||
title: Media segments
|
||||
---
|
||||
|
||||
# Media segments
|
||||
|
||||
Media segments are a type of metadata for media files stored in Jellyfin. Unlike chapters, which have no type, media segments can contain type information, allowing different actions based on the type of each segment.
|
||||
|
||||
## Getting started
|
||||
|
||||
There's a few steps to follow if you want to use media segments:
|
||||
|
||||
1. Update your server to version 10.10 or above.
|
||||
2. First, you'll need one or multiple plugins that can provide media segments. Read the [plugins section](#plugin-support) below to find out more.
|
||||
3. Run the `Media segment scan` task in the dashboard to create segments immediately, this task also runs automatically in the background.
|
||||
4. Enable actions for the different segment types, the way you do this differs per client, but they are generally found in the playback settings of the client.
|
||||
|
||||
## Types
|
||||
|
||||
The following types are currently available:
|
||||
|
||||
- Commercial
|
||||
- Preview
|
||||
- Recap
|
||||
- Outro
|
||||
- Intro
|
||||
|
||||
## An example
|
||||
Media segments (first introduced in 10.10) are a type of metadata for media files stored in Jellyfin. Unlike chapters, which have no type, media segments can contain type information, allowing different actions based on the type of each segment.
|
||||
|
||||
A video that is 16 minutes (00:16:00) long could have the following segments:
|
||||
|
||||
@@ -36,18 +13,30 @@ A video that is 16 minutes (00:16:00) long could have the following segments:
|
||||
|
||||
Jellyfin can store this information and provide it to clients. Clients can then decide what they want to do with the provided information.
|
||||
|
||||
## Getting started
|
||||
|
||||
There's a few steps to follow if you want to use media segments:
|
||||
|
||||
1. Install one or multiple media segment providers. Read the [plugins section](#plugins) below to find out more.
|
||||
2. Run the `Media segment scan` task in the dashboard to create segments immediately, this task also runs automatically in the background.
|
||||
3. Set actions for the different segment types, the way you do this differs per client, but they are generally found in the playback settings of the client.
|
||||
|
||||
## Creating media segments
|
||||
|
||||
Media segments are provided by plugins. Learn more in the [plugin support section](#plugin-support).
|
||||
Media segments are provided by plugins. In general, they include a `begin` and `end`-Timestamp, followed by a `type.`
|
||||
|
||||
## Clients
|
||||
|
||||
Media segments are currently only supported by the web client.
|
||||
|
||||
Upon receiving media segment information from the server, clients can choose to provide any number of actions based on the segment type, such as showing a "skip" button to skip the section. Because it is still a new feature, client support is very sparse and will take some time to become more wide-spread.
|
||||
|
||||
## Plugin support
|
||||
### Plugins
|
||||
|
||||
Plugins can utilize this system to store their information about intros, outros, commercials and all other types of segments. This information can then be used by clients to provide actions, such as a "skip" button in their user interface. This approach generalizes how segments are handled, so more platforms can be easily supported, without custom modifications to clients.
|
||||
|
||||
There is an official `Chapter Segments Provider` plugin that creates media segments from chapters.
|
||||
There is an official `Chapter Segments Provider` plugin that creates media segments based on chapters and chapter-names.
|
||||
|
||||
### Types
|
||||
|
||||
The following types are currently available:
|
||||
|
||||
- Commercial
|
||||
- Preview
|
||||
- Recap
|
||||
- Outro
|
||||
- Intro
|
||||
|
||||
@@ -37,54 +37,54 @@ It's currently not possible to disable .nfo metadata. Local metadata will always
|
||||
User data importing is only possible for a single user. This user can be set in the .nfo settings.
|
||||
:::
|
||||
|
||||
| Tag | Note |
|
||||
| ------------- | --------------------------------------------------------------------------------------------------------------------- |
|
||||
| name | |
|
||||
| title | same as name |
|
||||
| localtitle | same as name |
|
||||
| dateadded | |
|
||||
| originaltitle | |
|
||||
| sortname | |
|
||||
| criticrating | |
|
||||
| sorttitle | |
|
||||
| plot | |
|
||||
| biography | same as plot |
|
||||
| review | same as plot |
|
||||
| language | |
|
||||
| watched | please see the note about user data |
|
||||
| playcount | please see the note about user data |
|
||||
| lastplayed | please see the note about user data |
|
||||
| countrycode | |
|
||||
| lockedfields | |
|
||||
| tagline | |
|
||||
| country | |
|
||||
| mpaa | |
|
||||
| customrating | |
|
||||
| runtime | |
|
||||
| aspectratio | |
|
||||
| lockdata | |
|
||||
| studio | multiple tags allowed |
|
||||
| director | multiple tags allowed |
|
||||
| credits | multiple tags allowed |
|
||||
| writer | multiple tags allowed |
|
||||
| actor | multiple tags allowed |
|
||||
| trailer | kodi format |
|
||||
| displayorder | |
|
||||
| year | |
|
||||
| rating | same as customrating |
|
||||
| ratings | multiple child tags allowed; name attribute of each tag will specify wheter the rating is critics or community rating |
|
||||
| aired | |
|
||||
| formed | |
|
||||
| premiered | |
|
||||
| releasedate | |
|
||||
| enddate | |
|
||||
| genre | multiple tags allowed. These tags will be ignored for music albums and music artists. |
|
||||
| tag | multiple tags allowed |
|
||||
| style | multiple tags allowed |
|
||||
| fileinfo | |
|
||||
| uniqueid | type attribute specifies id provider |
|
||||
| thumb | please see the [section about images](#image-paths-and-urls-in-nfo-files) |
|
||||
| fanart | please see the [section about images](#image-paths-and-urls-in-nfo-files) |
|
||||
| Tag | Note |
|
||||
| ------------- | ---------------------------------------------------------------------------------------------------------------------- |
|
||||
| name | |
|
||||
| title | same as name |
|
||||
| localtitle | same as name |
|
||||
| dateadded | |
|
||||
| originaltitle | |
|
||||
| sortname | |
|
||||
| criticrating | |
|
||||
| sorttitle | |
|
||||
| plot | |
|
||||
| biography | same as plot |
|
||||
| review | same as plot |
|
||||
| language | |
|
||||
| watched | please see the note about user data |
|
||||
| playcount | please see the note about user data |
|
||||
| lastplayed | please see the note about user data |
|
||||
| countrycode | |
|
||||
| lockedfields | |
|
||||
| tagline | |
|
||||
| country | |
|
||||
| mpaa | |
|
||||
| customrating | |
|
||||
| runtime | |
|
||||
| aspectratio | |
|
||||
| lockdata | |
|
||||
| studio | multiple tags allowed |
|
||||
| director | multiple tags allowed |
|
||||
| credits | multiple tags allowed |
|
||||
| writer | multiple tags allowed |
|
||||
| actor | multiple tags allowed |
|
||||
| trailer | kodi format |
|
||||
| displayorder | |
|
||||
| year | |
|
||||
| rating | same as customrating |
|
||||
| ratings | multiple child tags allowed; name attribute of each tag will specify whether the rating is critics or community rating |
|
||||
| aired | |
|
||||
| formed | |
|
||||
| premiered | |
|
||||
| releasedate | |
|
||||
| enddate | |
|
||||
| genre | multiple tags allowed. These tags will be ignored for music albums and music artists. |
|
||||
| tag | multiple tags allowed |
|
||||
| style | multiple tags allowed |
|
||||
| fileinfo | |
|
||||
| uniqueid | type attribute specifies id provider |
|
||||
| thumb | please see the [section about images](#image-paths-and-urls-in-nfo-files) |
|
||||
| fanart | please see the [section about images](#image-paths-and-urls-in-nfo-files) |
|
||||
|
||||
Provider id tags are supported as well if they follow the scheme: `<PROVIDER_NAME`+ `id>`.
|
||||
|
||||
@@ -99,7 +99,7 @@ Jellyfin can write metadata to .nfo files. To enable this option, select the "Nf
|
||||
| .nfo tag | Note |
|
||||
| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
|
||||
| title | |
|
||||
| id | IMDb id for movies, TVDb id for tv shows, |
|
||||
| id | IMDb id for movies, TVDb id for tv shows, |
|
||||
| originaltitle | |
|
||||
| seasonnumber | only for tv show seasons |
|
||||
| showtitle | only for tv show episodes |
|
||||
@@ -126,7 +126,6 @@ Jellyfin can write metadata to .nfo files. To enable this option, select the "Nf
|
||||
| imdb_id | only for TV shows |
|
||||
| imdbid | for all other media types |
|
||||
| tvdbid | |
|
||||
| idmbid | |
|
||||
| tmdbid | |
|
||||
| language | |
|
||||
| countrycode | |
|
||||
|
||||
@@ -329,6 +329,14 @@ Enhance Jellyfin with sonic analysis and smart song clustering, replacing Instan
|
||||
|
||||
- [GitHub](https://github.com/NeptuneHub/audiomuse-ai-plugin)
|
||||
|
||||
#### WizdomSubs Downloader
|
||||
|
||||
Downloads Hebrew subtitles from WizdomSubs for your media files. This plugin provides automatic subtitle downloading for Hebrew-speaking users.
|
||||
|
||||
**Links:**
|
||||
|
||||
- [GitHub](https://github.com/DeDuplicate/Jellyfin_wizdomsubs_downloader)
|
||||
|
||||
## Repositories
|
||||
|
||||
import { OfficialPluginRepositories, ThirdPartyRepositories } from '../../../../src/data/pluginRepositories';
|
||||
|
||||
@@ -25,7 +25,7 @@ The objective of the guide is to configure the Jellyfin TVHeadend plugin to back
|
||||
- Change parameters: Rights,Channel number range,Channel tags,DVR configurations,Streaming profiles,Connection limits
|
||||
- Web interface: ✔
|
||||
- Streaming: Basic,Advanced,HTSP
|
||||
- Video recoder: Basic,HTSP,View all
|
||||
- Video recorder: Basic,HTSP,View all
|
||||
- (Optional) Comment: Comment for the user (for example: User used by Jellyfin)
|
||||
- (Optional) Allowed networks: _Network address with network mask to allow_ (for example 127.0.0.1/32)
|
||||
- Press Save
|
||||
@@ -38,7 +38,7 @@ The objective of the guide is to configure the Jellyfin TVHeadend plugin to back
|
||||
|
||||
:::note
|
||||
|
||||
The parameters Change parameters, Streaming and Video recoder must be marked as shown. Otherwise, Jellyfin can connect to TVHeadend but problems may arise when reproducing the content.
|
||||
The parameters Change parameters, Streaming and Video recorder must be marked as shown. Otherwise, Jellyfin can connect to TVHeadend but problems may arise when reproducing the content.
|
||||
|
||||
:::
|
||||
|
||||
@@ -56,7 +56,6 @@ By default the the _TVHeadend Hostname or IP Address_ section is configured by d
|
||||
:::
|
||||
|
||||
3. Configure the channels for viewing in Jellyfin: even if Jellyfin manages to connect to TVHeadend, the guide will not be synchronized because there has to be a number assigned to the channels in TVHeadend. [Reference](https://emby.media/community/index.php?/topic/64583-no-channels-with-tvheadend-plugin/#entry642268)
|
||||
|
||||
- Manual mode
|
||||
- Go to Configuration > Channel/EPG > Channels
|
||||
- Select the channel to be changed and press Edit
|
||||
|
||||
@@ -7,9 +7,11 @@ title: Tasks
|
||||
|
||||
Tasks are operations that are scheduled to run periodically. They can also be triggered manually by clicking the run button on the right.
|
||||
|
||||
Note: If your media files are unavailable when the `Clean up collections and playlists` task runs (e.g. a network share not yet mounted) your playlists will be lost. By default it runs at Jellyfin startup.
|
||||
|
||||
## Default Jellyfin Tasks
|
||||
|
||||
Below is a list of tasks that Jellyfin runs peoridically by default:
|
||||
Below is a list of tasks that Jellyfin runs periodically by default:
|
||||
|
||||
### Libraries
|
||||
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
---
|
||||
uid: contrib-branding
|
||||
title: Branding
|
||||
---
|
||||
|
||||
# Branding
|
||||
|
||||
## Usage of the Jellyfin name & logo
|
||||
|
||||
The name "Jellyfin" and the primary logo (two integrated triangular shapes, a stylized "fin") are trademarks in Canada, the United States, the European Union, and China of "Jellyfin, Inc.", an Ontario, Canada-based not-for-profit corporation.
|
||||
|
||||
A perpetual, no cost license is hereby granted to all members of the Jellyfin organization ("team") and projects under [our GitHub account](https://github.com/jelyfin) to use the name and logo in furtherance of the Jellyfin project.
|
||||
|
||||
For all others, you are **not** free to use the name "Jellyfin" or our logo without the explicit permission of the [project leadership team](/docs/general/about#core-team), with the following exceptions:
|
||||
|
||||
- Any instance of the Jellyfin software running for any purpose **accessible for no fee to its users** is granted an implicit license to use the name and logo for that purpose. If you charge for access to your server in any form, you are **required to change the branding of the server** in some way to clearly identify that the server owner is not "Jellyfin" as a project, and provide at least one method of contact for the server. For Jellyfin 10.10.x or before, you may use the Login Disclaimer field for this purpose; for Jellyfin 10.11.x and newer, you may use the Login Disclaimer and/or change the logo and name of the instance for this purpose. For example, a login disclaimer such as `This server is run by https://someprovider.org. For assistance, please see https://someprovider.org/contact.` is acceptable.
|
||||
|
||||
- The name "Jellyfin" **may** be used within another project as an affix to demonstrate compatibility; for example "_Awesome Client for Jellyfin_" is permitted. You may **not** use the name directly, in a way that makes the program appear to be an official client; for example "_Jellyfin MyPlatform_" is not permitted. Using subcomponents of the name (i.e. "Jelly", or "fin") coupled with additional words are permitted; for example, "Jellyseer", "Audiofin", or the like.
|
||||
|
||||
- All 3rd party projects **should** use their own logo to clearly differentiate it, but **exceptions may be granted** for free-and-libre-open-source (FLOSS) projects by contacting the leadership team, with a goal towards official project status. The logo _colours_ are not subject to trademark, and the purple-blue gradient theme may be used with another logo shape for identification as part of the Jellyfin ecosystem without limitation.
|
||||
|
||||
- Any **fork** of Jellyfin or an official client application for public distribution **must** use a different name and logo.
|
||||
|
||||
- The name "Jellyfin" and the logo **may** be used to describe or name communities or groups for users of the software, for instance community groups on social media or other sites.
|
||||
|
||||
- The name "Jellyfin" and the logo **may** be used to describe the program in any form of media without restriction.
|
||||
|
||||
- Any other uses shall be judged on a good-faith basis; if unsure, please contact the leadership team for advice.
|
||||
|
||||
## Writing Style
|
||||
|
||||
The name "Jellyfin" is always written thus. It is not "JellyFin", "Jelly Fin", or any similar form.
|
||||
|
||||
As a general rule, "Jellyfin" should always be capitalized, but language, file, or system conventions may trump this convention. Specific examples include:
|
||||
|
||||
- Writing referring to the project in the abstract should use capitalized `Jellyfin` at all times. `I contribute to Jellyfin and you should too!`
|
||||
- C# class and project names, including their files and directories, should use capitalized `Jellyfin` as required by the C# case standards (camelCase or PascalCase). `Jellyfin.LiveTv`, `Jellyfin.sln`
|
||||
- Other code elements, where the code formatting or style requires lowercase, should use lowercase `jellyfin`. `jellyfinWebComponentsBowerPath`
|
||||
- The Git repository and non-C# files inside of it should use lowercase `jellyfin` for convenience on case-sensitive filesystems. `build-jellyfin.ps1`
|
||||
- The final output binary, initscripts, and package names should use lowercase `jellyfin` for similar reasons as above. `jellyfin.dll`, `jellyfin_3.5.2-1_all.deb`, `jellyfin.zip`
|
||||
- Configuration directories can use either depending on operating system conventions. `/var/lib/jellyfin`, `AppData/Jellyfin`
|
||||
- The logo has no strict rules for capitalization, the style is dependent on aesthetics and font choice.
|
||||
|
||||
## Icons and Visual Assets
|
||||
|
||||
:::warning
|
||||
|
||||
Jellyfin is currently rebranding, as such these guidelines (including the logo) are outdated. Join our [#jellyfin-ui-ux](https://matrix.to/#/#jellyfin-ui-ux:matrix.org) chat on Matrix for any questions.
|
||||
|
||||
:::
|
||||
|
||||
All iconography and other resources can be found in the [jellyfin-ux](https://github.com/jellyfin/jellyfin-ux) repository.
|
||||
|
||||
- Icons
|
||||
- Banners
|
||||
- Fonts
|
||||
|
||||
### Logo
|
||||
|
||||
When using the full version of the logo, the text should only be placed to the right of the icon.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
The design for the logo uses a gradient for the infill, and if the non-transparent logo is chosen there is an optional background color.
|
||||
|
||||
- Gradient Start: `#AA5CC3`
|
||||
- Gradient End: `#00A4DC`
|
||||
- Background Color: `#000B25`
|
||||
|
||||
### Theme
|
||||
|
||||
- Background Color: `#101010`
|
||||
- Accent Color: `#00A4DC`
|
||||
|
||||
### Fonts
|
||||
|
||||
The banner uses the [Plus Jakarta Sans](https://fonts.google.com/specimen/Plus+Jakarta+Sans) font.
|
||||
@@ -15,7 +15,6 @@ const config: Config = {
|
||||
baseUrl: '/',
|
||||
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',
|
||||
@@ -106,7 +105,10 @@ Site content is licensed <a href='http://creativecommons.org/licenses/by-nd/4.0/
|
||||
}
|
||||
},
|
||||
markdown: {
|
||||
mermaid: true
|
||||
mermaid: true,
|
||||
hooks: {
|
||||
onBrokenMarkdownLinks: process.env.CI ? 'throw' : 'warn'
|
||||
}
|
||||
},
|
||||
plugins: [
|
||||
// Main content
|
||||
|
||||
@@ -22,7 +22,7 @@ export default ts.config([
|
||||
'**/*.json'
|
||||
]),
|
||||
react.configs.flat.recommended,
|
||||
reactHooks.configs['recommended-latest'],
|
||||
reactHooks.configs.flat.recommended,
|
||||
...ts.configs.recommended,
|
||||
jsxA11Y.flatConfigs.recommended,
|
||||
{
|
||||
|
||||
@@ -16,35 +16,37 @@
|
||||
"write-translations": "docusaurus write-translations",
|
||||
"write-heading-ids": "docusaurus write-heading-ids",
|
||||
"lint": "eslint --ext .ts,.js,.json,.jsx,.tsx .",
|
||||
"lint:markdown": "markdownlint **/*.md --ignore node_modules",
|
||||
"test:blog-urls": "node ./scripts/check-urls.mjs ./scripts/data/jellyfin-blog-urls.json",
|
||||
"test:docs-urls": "node ./scripts/check-urls.mjs ./scripts/data/jellyfin-docs-urls.json",
|
||||
"test:web-urls": "node ./scripts/check-urls.mjs ./scripts/data/jellyfin-web-urls.json"
|
||||
},
|
||||
"dependencies": {
|
||||
"@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.52.1",
|
||||
"@fontsource/noto-sans": "5.2.7",
|
||||
"@icons-pack/react-simple-icons": "13.7.0",
|
||||
"@docusaurus/core": "3.9.2",
|
||||
"@docusaurus/plugin-client-redirects": "3.9.2",
|
||||
"@docusaurus/plugin-content-blog": "3.9.2",
|
||||
"@docusaurus/plugin-content-docs": "3.9.2",
|
||||
"@docusaurus/plugin-content-pages": "3.9.2",
|
||||
"@docusaurus/plugin-sitemap": "3.9.2",
|
||||
"@docusaurus/plugin-svgr": "3.9.2",
|
||||
"@docusaurus/theme-classic": "3.9.2",
|
||||
"@docusaurus/theme-mermaid": "3.9.2",
|
||||
"@easyops-cn/docusaurus-search-local": "0.52.2",
|
||||
"@fontsource/noto-sans": "5.2.10",
|
||||
"@icons-pack/react-simple-icons": "13.8.0",
|
||||
"@img-comparison-slider/react": "8.0.2",
|
||||
"@mdi/js": "7.4.47",
|
||||
"@mdi/react": "1.6.1",
|
||||
"@mdx-js/react": "3.1.0",
|
||||
"@mdx-js/react": "3.1.1",
|
||||
"@svgr/webpack": "8.1.0",
|
||||
"clsx": "2.1.1",
|
||||
"docusaurus-plugin-sass": "0.2.6",
|
||||
"file-loader": "6.2.0",
|
||||
"react": "18.3.1",
|
||||
"react-dom": "18.3.1",
|
||||
"sass": "1.92.1",
|
||||
"swiper": "11.2.10",
|
||||
"sass": "1.97.2",
|
||||
"swiper": "12.0.3",
|
||||
"ua-parser-js": "2.0.7",
|
||||
"url-loader": "4.1.1"
|
||||
},
|
||||
"browserslist": {
|
||||
@@ -60,26 +62,27 @@
|
||||
]
|
||||
},
|
||||
"devDependencies": {
|
||||
"@docusaurus/module-type-aliases": "3.8.1",
|
||||
"@docusaurus/tsconfig": "3.8.1",
|
||||
"@eslint/js": "9.34.0",
|
||||
"@types/react": "18.3.23",
|
||||
"@docusaurus/module-type-aliases": "3.9.2",
|
||||
"@docusaurus/tsconfig": "3.9.2",
|
||||
"@eslint/js": "9.39.2",
|
||||
"@types/react": "18.3.27",
|
||||
"@types/react-helmet": "6.1.11",
|
||||
"@types/react-router-dom": "5.3.3",
|
||||
"eslint": "9.34.0",
|
||||
"eslint": "9.39.2",
|
||||
"eslint-config-prettier": "10.1.8",
|
||||
"eslint-plugin-import": "2.32.0",
|
||||
"eslint-plugin-jsx-a11y": "6.10.2",
|
||||
"eslint-plugin-n": "17.21.3",
|
||||
"eslint-plugin-n": "17.23.1",
|
||||
"eslint-plugin-prettier": "5.5.4",
|
||||
"eslint-plugin-promise": "7.2.1",
|
||||
"eslint-plugin-react": "7.37.5",
|
||||
"eslint-plugin-react-hooks": "5.2.0",
|
||||
"globals": "16.3.0",
|
||||
"eslint-plugin-react-hooks": "7.0.1",
|
||||
"globals": "17.0.0",
|
||||
"markdownlint-cli": "0.47.0",
|
||||
"node-fetch": "3.3.2",
|
||||
"prettier": "3.6.2",
|
||||
"typescript": "5.9.2",
|
||||
"typescript-eslint": "8.40.0",
|
||||
"prettier": "3.7.4",
|
||||
"typescript": "5.9.3",
|
||||
"typescript-eslint": "8.52.0",
|
||||
"typescript-plugin-css-modules": "5.2.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
[
|
||||
"/docs/general/administration/backup-and-restore",
|
||||
"/docs/general/administration/hardware-acceleration.html",
|
||||
"/docs/general/administration/hardware-acceleration/intel",
|
||||
"/docs/general/contributing/index.html",
|
||||
|
||||
@@ -132,3 +132,10 @@ a.pills__item:not(.pills__item--active) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.tabs-container {
|
||||
border: 1px solid #fff4;
|
||||
background-color: #fff1;
|
||||
border-radius: 8px;
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
@@ -410,57 +410,6 @@ const thirdPartyClients: Array<Client> = [
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'preserve',
|
||||
name: 'Preserve',
|
||||
description: 'A music client inspired by players such as foobar2000 or Clementine.',
|
||||
clientType: ClientType.ThirdParty,
|
||||
deviceTypes: [DeviceType.Desktop],
|
||||
licenseType: LicenseType.OpenSource,
|
||||
platforms: [Platform.Browser, Platform.Desktop],
|
||||
primaryLinks: [
|
||||
{
|
||||
id: 'browser',
|
||||
name: 'Open in browser',
|
||||
url: 'https://preserveplayer.com/'
|
||||
},
|
||||
{
|
||||
id: 'gl-downloads',
|
||||
name: 'GitLab Downloads',
|
||||
url: 'https://gitlab.com/tonyfinn/preserve/-/releases'
|
||||
}
|
||||
],
|
||||
secondaryLinks: [
|
||||
{
|
||||
id: 'gitlab',
|
||||
name: 'GitLab',
|
||||
url: 'https://gitlab.com/tonyfinn/preserve'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'sonixd',
|
||||
name: 'Sonixd',
|
||||
description: 'A full-featured Subsonic/Jellyfin compatible desktop music player.',
|
||||
clientType: ClientType.ThirdParty,
|
||||
deviceTypes: [DeviceType.Desktop],
|
||||
licenseType: LicenseType.OpenSource,
|
||||
platforms: [Platform.Desktop],
|
||||
primaryLinks: [
|
||||
{
|
||||
id: 'install',
|
||||
name: 'Installation Guide',
|
||||
url: 'https://github.com/jeffvli/sonixd#install'
|
||||
}
|
||||
],
|
||||
secondaryLinks: [
|
||||
{
|
||||
id: 'github',
|
||||
name: 'GitHub',
|
||||
url: 'https://github.com/jeffvli/sonixd'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'supersonic',
|
||||
name: 'Supersonic',
|
||||
@@ -515,7 +464,7 @@ const thirdPartyClients: Array<Client> = [
|
||||
{
|
||||
id: 'tauon-music-box',
|
||||
name: 'Tauon Music Box',
|
||||
description: "A modern streamlined music player for desktop with a minimal interface that is packed with features!",
|
||||
description: 'A modern streamlined music player for desktop with a minimal interface that is packed with features!',
|
||||
clientType: ClientType.ThirdParty,
|
||||
deviceTypes: [DeviceType.Desktop],
|
||||
licenseType: LicenseType.OpenSource,
|
||||
@@ -808,34 +757,6 @@ const thirdPartyClients: Array<Client> = [
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'web-scrobbler',
|
||||
name: 'Web Scrobbler',
|
||||
description: 'Web Scrobbler helps online music listeners to scrobble their playback history.',
|
||||
clientType: ClientType.ThirdParty,
|
||||
deviceTypes: [],
|
||||
licenseType: LicenseType.OpenSource,
|
||||
platforms: [Platform.Browser],
|
||||
primaryLinks: [
|
||||
{
|
||||
id: 'install',
|
||||
name: 'Installation Guide',
|
||||
url: 'https://github.com/web-scrobbler/web-scrobbler#installation'
|
||||
}
|
||||
],
|
||||
secondaryLinks: [
|
||||
{
|
||||
id: 'github',
|
||||
name: 'GitHub',
|
||||
url: 'https://github.com/web-scrobbler/web-scrobbler'
|
||||
},
|
||||
{
|
||||
id: 'website',
|
||||
name: 'Website',
|
||||
url: 'https://webscrobbler.com'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'jellybook',
|
||||
name: 'JellyBook',
|
||||
@@ -926,27 +847,27 @@ const thirdPartyClients: Array<Client> = [
|
||||
]
|
||||
},
|
||||
{
|
||||
id: "fladder",
|
||||
name: "Fladder",
|
||||
description: "A simple, cross-platform Jellyfin frontend built on top of Flutter.",
|
||||
id: 'fladder',
|
||||
name: 'Fladder',
|
||||
description: 'A simple, cross-platform Jellyfin frontend built on top of Flutter.',
|
||||
clientType: ClientType.ThirdParty,
|
||||
deviceTypes: [DeviceType.Mobile, DeviceType.Desktop],
|
||||
licenseType: LicenseType.OpenSource,
|
||||
platforms: [Platform.Linux, Platform.Windows, Platform.MacOS, Platform.Android, Platform.Browser],
|
||||
primaryLinks: [
|
||||
{
|
||||
id: "play-store",
|
||||
name: "Play Store",
|
||||
url: "https://play.google.com/store/apps/details?id=nl.jknaapen.fladder",
|
||||
},
|
||||
id: 'play-store',
|
||||
name: 'Play Store',
|
||||
url: 'https://play.google.com/store/apps/details?id=nl.jknaapen.fladder'
|
||||
}
|
||||
],
|
||||
secondaryLinks: [
|
||||
{
|
||||
id: "github",
|
||||
name: "GitHub",
|
||||
url: "https://github.com/DonutWare/Fladder",
|
||||
},
|
||||
],
|
||||
id: 'github',
|
||||
name: 'GitHub',
|
||||
url: 'https://github.com/DonutWare/Fladder'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'symfonium',
|
||||
@@ -994,10 +915,96 @@ const thirdPartyClients: Array<Client> = [
|
||||
url: 'https://monk-studio.com/finer'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'streamyfin',
|
||||
name: 'Streamyfin',
|
||||
description: 'A modern Jellyfin client with support for downloads, Live TV, skip intro & credits, trickplay image and more!',
|
||||
clientType: ClientType.ThirdParty,
|
||||
deviceTypes: [DeviceType.Mobile],
|
||||
licenseType: LicenseType.OpenSource,
|
||||
platforms: [Platform.Android, Platform.IOS],
|
||||
primaryLinks: [
|
||||
{
|
||||
id: 'play-store',
|
||||
name: 'Play Store',
|
||||
url: 'https://play.google.com/store/apps/details?id=com.fredrikburmester.streamyfin'
|
||||
},
|
||||
{
|
||||
id: 'app-store',
|
||||
name: 'App Store',
|
||||
url: 'https://apps.apple.com/app/streamyfin/id6593660679'
|
||||
}
|
||||
],
|
||||
secondaryLinks: [
|
||||
{
|
||||
id: 'github',
|
||||
name: 'GitHub',
|
||||
url: 'https://github.com/streamyfin/streamyfin'
|
||||
},
|
||||
{
|
||||
id: 'website',
|
||||
name: 'Website',
|
||||
url: 'https://streamyfin.app'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'gelly',
|
||||
name: 'Gelly',
|
||||
description: 'A light, native music client for Linux.',
|
||||
clientType: ClientType.ThirdParty,
|
||||
deviceTypes: [DeviceType.Desktop],
|
||||
licenseType: LicenseType.OpenSource,
|
||||
platforms: [Platform.Desktop, Platform.Linux],
|
||||
primaryLinks: [
|
||||
{
|
||||
id: 'flathub',
|
||||
name: 'Flathub (Linux)',
|
||||
url: 'https://flathub.org/apps/details/io.m51.Gelly'
|
||||
}
|
||||
],
|
||||
secondaryLinks: [
|
||||
{
|
||||
id: 'github',
|
||||
name: 'Github',
|
||||
url: 'https://github.com/Fingel/gelly'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'jellify',
|
||||
name: 'Jellify',
|
||||
description: 'A free and open source music player available for iOS and Android',
|
||||
clientType: ClientType.ThirdParty,
|
||||
deviceTypes: [DeviceType.Mobile],
|
||||
licenseType: LicenseType.OpenSource,
|
||||
platforms: [Platform.IOS, Platform.Android],
|
||||
primaryLinks: [
|
||||
{
|
||||
id: 'app-store',
|
||||
name: 'App Store',
|
||||
url: 'https://apps.apple.com/us/app/jellify/id6736884612'
|
||||
},
|
||||
{
|
||||
id: 'google-play',
|
||||
name: 'Google Play',
|
||||
url: 'https://play.google.com/store/apps/details?id=com.cosmonautical.jellify'
|
||||
}
|
||||
],
|
||||
secondaryLinks: [
|
||||
{
|
||||
id: 'github',
|
||||
name: 'GitHub',
|
||||
url: 'https://github.com/Jellify-Music/App'
|
||||
},
|
||||
{
|
||||
id: 'website',
|
||||
name: 'Website',
|
||||
url: 'https://jellify.app'
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
export const Clients: Array<Client> = [
|
||||
...officialClients,
|
||||
...thirdPartyClients
|
||||
];
|
||||
export const Clients: Array<Client> = [...officialClients, ...thirdPartyClients];
|
||||
|
||||
@@ -0,0 +1,197 @@
|
||||
type Link = {
|
||||
name: string;
|
||||
url: string;
|
||||
};
|
||||
|
||||
export type DonationTarget = {
|
||||
title: string;
|
||||
roles: Array<string>;
|
||||
links: Array<Link>;
|
||||
};
|
||||
|
||||
export enum MiscRoles {
|
||||
Mod = 'Moderator',
|
||||
CommunityMod = 'Community Moderator',
|
||||
CoreTeam = 'Core Team',
|
||||
ReleaseManager = 'Release Manager',
|
||||
InfastructureAdmin = 'Infastructure Administrator',
|
||||
ProjectLeader = 'Project Leader',
|
||||
Tooling = 'Tooling/Packaging Developer'
|
||||
}
|
||||
|
||||
export enum Projects {
|
||||
Server = 'Jellyfin Server',
|
||||
Xbox = 'Jellyfin for Xbox',
|
||||
Roku = 'Jellyfin for Roku',
|
||||
ATV = 'Jellyfin for Android TV',
|
||||
Android = 'Jellyfin for Android',
|
||||
Swiftfin = 'Swiftfin',
|
||||
Vue = 'Jellyfin Vue',
|
||||
JellyfinWeb = 'Jellyfin Web',
|
||||
IOS = 'Jellyfin for iOS',
|
||||
Kodi = 'Jellyfin for Kodi'
|
||||
}
|
||||
|
||||
export enum ProjectRole {
|
||||
SubprojectLead = 'Subproject Lead',
|
||||
Contributor = 'Contributor'
|
||||
}
|
||||
|
||||
export enum SponsorTypes {
|
||||
GithubSponsor = 'Github Sponsors',
|
||||
BuyMeACoffee = 'Buy Me a Coffee',
|
||||
Patreon = 'Patreon',
|
||||
Liberapay = 'Liberapay',
|
||||
KoFi = 'ko-fi'
|
||||
}
|
||||
|
||||
function GetProjectRole(project: Projects, roleInProject: ProjectRole) {
|
||||
return `${project} ${roleInProject}`;
|
||||
}
|
||||
|
||||
export const donations: Array<DonationTarget> = [
|
||||
{
|
||||
title: 'Jean-Pierre Bachmann (JPVenson)',
|
||||
roles: [
|
||||
GetProjectRole(Projects.Xbox, ProjectRole.SubprojectLead),
|
||||
GetProjectRole(Projects.Server, ProjectRole.Contributor),
|
||||
MiscRoles.Mod
|
||||
],
|
||||
links: [
|
||||
{
|
||||
url: 'https://coff.ee/venson',
|
||||
name: SponsorTypes.BuyMeACoffee
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
title: '1hitsong',
|
||||
roles: [GetProjectRole(Projects.Roku, ProjectRole.SubprojectLead)],
|
||||
links: [
|
||||
{
|
||||
url: 'https://coff.ee/1hitsong',
|
||||
name: SponsorTypes.BuyMeACoffee
|
||||
},
|
||||
{
|
||||
url: 'https://github.com/sponsors/1hitsong',
|
||||
name: SponsorTypes.GithubSponsor
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'Niels van Velzen',
|
||||
roles: [
|
||||
MiscRoles.CoreTeam,
|
||||
GetProjectRole(Projects.ATV, ProjectRole.SubprojectLead),
|
||||
GetProjectRole(Projects.Android, ProjectRole.SubprojectLead)
|
||||
],
|
||||
links: [
|
||||
{
|
||||
url: 'https://github.com/sponsors/nielsvanvelzen',
|
||||
name: SponsorTypes.GithubSponsor
|
||||
},
|
||||
{
|
||||
url: 'https://coff.ee/nielsvanvelzen',
|
||||
name: SponsorTypes.BuyMeACoffee
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'Tim Gels',
|
||||
roles: [MiscRoles.CommunityMod, GetProjectRole(Projects.Xbox, ProjectRole.Contributor)],
|
||||
links: [
|
||||
{
|
||||
url: 'https://github.com/sponsors/TimGels',
|
||||
name: SponsorTypes.GithubSponsor
|
||||
},
|
||||
{
|
||||
url: 'https://coff.ee/timgels',
|
||||
name: SponsorTypes.BuyMeACoffee
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'Joshua Boniface',
|
||||
roles: [MiscRoles.ProjectLeader, MiscRoles.ReleaseManager, MiscRoles.InfastructureAdmin],
|
||||
links: [
|
||||
{
|
||||
url: 'https://github.com/sponsors/joshuaboniface',
|
||||
name: SponsorTypes.GithubSponsor
|
||||
},
|
||||
{
|
||||
url: 'https://patreon.com/joshuaboniface',
|
||||
name: SponsorTypes.Patreon
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'Ethan Pippin',
|
||||
roles: [GetProjectRole(Projects.Swiftfin, ProjectRole.SubprojectLead)],
|
||||
links: [
|
||||
{
|
||||
url: 'https://github.com/sponsors/LePips',
|
||||
name: SponsorTypes.GithubSponsor
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'Fernando Fernández (ferferga)',
|
||||
roles: [GetProjectRole(Projects.Vue, ProjectRole.SubprojectLead)],
|
||||
links: [
|
||||
{
|
||||
url: 'https://github.com/sponsors/ferferga',
|
||||
name: SponsorTypes.GithubSponsor
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'Bill Thornton',
|
||||
roles: [
|
||||
MiscRoles.CoreTeam,
|
||||
GetProjectRole(Projects.JellyfinWeb, ProjectRole.SubprojectLead),
|
||||
GetProjectRole(Projects.IOS, ProjectRole.SubprojectLead)
|
||||
],
|
||||
links: [
|
||||
{
|
||||
url: 'https://github.com/sponsors/thornbill',
|
||||
name: SponsorTypes.GithubSponsor
|
||||
},
|
||||
{
|
||||
url: 'https://coff.ee/thornbill',
|
||||
name: SponsorTypes.BuyMeACoffee
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'Bond_009',
|
||||
roles: [MiscRoles.CoreTeam, GetProjectRole(Projects.Server, ProjectRole.Contributor)],
|
||||
links: [
|
||||
{
|
||||
url: 'https://liberapay.com/Bond_009',
|
||||
name: SponsorTypes.Liberapay
|
||||
},
|
||||
{
|
||||
url: 'https://github.com/sponsors/Bond-009',
|
||||
name: SponsorTypes.GithubSponsor
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'Odd Stråbø',
|
||||
roles: [GetProjectRole(Projects.Kodi, ProjectRole.SubprojectLead), MiscRoles.Tooling],
|
||||
links: [
|
||||
{
|
||||
url: 'https://github.com/sponsors/oddstr13',
|
||||
name: SponsorTypes.GithubSponsor
|
||||
},
|
||||
{
|
||||
url: 'https://ko-fi.com/oddstr13',
|
||||
name: SponsorTypes.KoFi
|
||||
},
|
||||
{
|
||||
url: 'https://buymeacoffee.com/oddstr13',
|
||||
name: SponsorTypes.BuyMeACoffee
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
@@ -307,12 +307,7 @@ sudo apt install jellyfin`}
|
||||
{
|
||||
id: 'arch-stable-link',
|
||||
name: 'Arch Downloads',
|
||||
url: 'https://archlinux.org/packages/?q=jellyfin'
|
||||
},
|
||||
{
|
||||
id: 'arch-aur-link',
|
||||
name: 'AUR Downloads',
|
||||
url: 'https://aur.archlinux.org/packages/?K=jellyfin'
|
||||
url: 'https://archlinux.org/packages/extra/x86_64/jellyfin-server/'
|
||||
}
|
||||
],
|
||||
unstableButtons: [
|
||||
@@ -332,7 +327,7 @@ makepkg -si`}
|
||||
{
|
||||
id: 'arch-aur-link',
|
||||
name: 'AUR Downloads',
|
||||
url: 'https://aur.archlinux.org/packages/?K=jellyfin'
|
||||
url: 'https://aur.archlinux.org/packages/jellyfin-server-git'
|
||||
}
|
||||
],
|
||||
otherButtons: []
|
||||
|
||||
@@ -113,5 +113,13 @@ export const ThirdPartyRepositories: Array<PluginRepository> = [
|
||||
includes: {
|
||||
'AudioMuse-AI': 'https://github.com/neptunehub/audiomuse-ai-plugin'
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'gh:DeDuplicate/Jellyfin_wizdomsubs_downloader',
|
||||
name: "DeDuplicate's WizdomSubs Downloader Repo",
|
||||
url: 'https://raw.githubusercontent.com/DeDuplicate/Jellyfin_wizdomsubs_downloader/refs/heads/main/manifest.json',
|
||||
includes: {
|
||||
'WizdomSubs Downloader': 'https://github.com/DeDuplicate/Jellyfin_wizdomsubs_downloader'
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
@@ -1,16 +1,3 @@
|
||||
.button--digitalocean {
|
||||
background-color: #0080ff;
|
||||
border-color: #0080ff;
|
||||
}
|
||||
.button--digitalocean:hover {
|
||||
background-color: #0073e6;
|
||||
border-color: #0073e6;
|
||||
}
|
||||
.button--digitalocean:active {
|
||||
background-color: #006dd9;
|
||||
border-color: #006dd9;
|
||||
}
|
||||
|
||||
.button--jetbrains {
|
||||
background-color: #fff;
|
||||
border-color: #fff;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import Link from '@docusaurus/Link';
|
||||
import { SiDigitalocean, SiJetbrains } from '@icons-pack/react-simple-icons';
|
||||
import { SiJetbrains } from '@icons-pack/react-simple-icons';
|
||||
import Layout from '@theme/Layout';
|
||||
import clsx from 'clsx';
|
||||
import React from 'react';
|
||||
@@ -53,15 +53,6 @@ export default function Contribute() {
|
||||
|
||||
<h3>Sponsors</h3>
|
||||
<div className={styles['sponsor-list']}>
|
||||
<a
|
||||
href='https://www.digitalocean.com'
|
||||
className={clsx('button', 'button--lg', styles['button--digitalocean'])}
|
||||
style={{ display: 'inline-flex' }}
|
||||
>
|
||||
<SiDigitalocean size={28} className='margin-right--sm' />
|
||||
DigitalOcean
|
||||
</a>
|
||||
|
||||
<a
|
||||
href='https://www.jetbrains.com'
|
||||
className={clsx('button', 'button--lg', styles['button--jetbrains'])}
|
||||
|
||||
@@ -4,11 +4,11 @@ import { mdiFilter } from '@mdi/js';
|
||||
import Icon from '@mdi/react';
|
||||
import Layout from '@theme/Layout';
|
||||
import clsx from 'clsx';
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import React, { useMemo, useState } from 'react';
|
||||
|
||||
import ClientDetails from '../../../components/clients/ClientDetails';
|
||||
import Pill from '../../../components/common/Pill';
|
||||
import { Client, Clients, DeviceType } from '../../../data/clients';
|
||||
import { Clients, DeviceType } from '../../../data/clients';
|
||||
import Platform, { FeaturedClientPlatforms } from '../../../data/platform';
|
||||
|
||||
import styles from '../index.module.scss';
|
||||
@@ -37,7 +37,6 @@ export default function ClientsPage({ recommended = true }: { recommended?: bool
|
||||
const location = useLocation();
|
||||
const searchParams = new URLSearchParams(location.search);
|
||||
|
||||
const [filteredClients, setFilteredClients] = useState<Client[]>([...Clients]);
|
||||
const [filter, setFilterValue] = useState<ClientFilter>({
|
||||
recommended,
|
||||
deviceTypes: (searchParams.get('type')?.split(',') ?? []) as DeviceType[],
|
||||
@@ -62,8 +61,8 @@ export default function ClientsPage({ recommended = true }: { recommended?: bool
|
||||
setFilterValue(filter);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
setFilteredClients(
|
||||
const filteredClients = useMemo(
|
||||
() =>
|
||||
Clients.filter((client) => {
|
||||
let result = true;
|
||||
|
||||
@@ -81,9 +80,9 @@ export default function ClientsPage({ recommended = true }: { recommended?: bool
|
||||
(filter.platforms.length === 0 || client.platforms.some((platform) => filter.platforms.includes(platform)));
|
||||
|
||||
return result;
|
||||
})
|
||||
);
|
||||
}, [filter, setFilteredClients]);
|
||||
}),
|
||||
[filter]
|
||||
);
|
||||
|
||||
return (
|
||||
<Layout title='Clients'>
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import React from 'react';
|
||||
|
||||
import DownloadsPage from './server';
|
||||
import { OsType } from '../../data/downloads';
|
||||
|
||||
export default function LinuxDownloads() {
|
||||
return <DownloadsPage />;
|
||||
return <DownloadsPage osType={OsType.Linux} />;
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import useIsBrowser from '@docusaurus/useIsBrowser';
|
||||
import Link from '@docusaurus/Link';
|
||||
import clsx from 'clsx';
|
||||
import React, { useState } from 'react';
|
||||
@@ -7,15 +8,35 @@ import Admonition from '@theme-original/Admonition';
|
||||
import Pill from '../../components/common/Pill';
|
||||
import DownloadDetails from '../../components/downloads/DownloadDetails';
|
||||
import { Downloads, OsType } from '../../data/downloads';
|
||||
import { UAParser } from 'ua-parser-js';
|
||||
|
||||
import styles from './index.module.scss';
|
||||
import ExternalLinkIcon from '@theme/Icon/ExternalLink';
|
||||
|
||||
export default function DownloadsPage({ osType = OsType.Linux }: { osType?: OsType }) {
|
||||
export default function DownloadsPage({ osType }: { osType?: OsType }) {
|
||||
const [isStableLinks, setIsStableLinks] = useState<boolean>(true);
|
||||
const [isStableHelpVisible, setIsStableHelpVisible] = useState<boolean>(false);
|
||||
const [activeButton, setActiveButton] = useState<string>();
|
||||
|
||||
const isBrowser = useIsBrowser();
|
||||
|
||||
if (isBrowser && osType === undefined) {
|
||||
const parser = new UAParser(navigator.userAgent);
|
||||
const os = parser.getOS();
|
||||
switch (os.name) {
|
||||
case 'macOS':
|
||||
osType = OsType.MacOS;
|
||||
break;
|
||||
case 'Windows':
|
||||
osType = OsType.Windows;
|
||||
break;
|
||||
case 'Linux':
|
||||
default:
|
||||
osType = OsType.Linux;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<Layout title='Downloads'>
|
||||
<h1 className='text--center margin-top--lg'>Downloads</h1>
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
d48b4366-63ef-487c-87f9-f08a26e23e6d
|
||||
92811634-ec91-45d6-9495-5eb2effbc21f
|
||||
|
||||
|
After Width: | Height: | Size: 10 KiB |