Merge branch 'master' into developers
@@ -1,48 +0,0 @@
|
||||
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
|
||||
@@ -11,24 +11,10 @@ on:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
uses: ./.github/workflows/__build.yml
|
||||
permissions: {}
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
||||
upload-pages-artifact: ${{ github.event_name == 'push' && github.repository == 'jellyfin/jellyfin.org' }}
|
||||
|
||||
deploy:
|
||||
if: github.event_name == 'push' && github.repository == 'jellyfin/jellyfin.org'
|
||||
name: Deploy to GitHub Pages
|
||||
permissions:
|
||||
pages: write
|
||||
id-token: write
|
||||
concurrency: build-deploy-pages
|
||||
environment:
|
||||
name: github-pages
|
||||
url: ${{ steps.deployment.outputs.page_url }}
|
||||
name: Build
|
||||
runs-on: ubuntu-latest
|
||||
needs: build
|
||||
permissions:
|
||||
contents: read
|
||||
steps:
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
@@ -44,20 +30,16 @@ jobs:
|
||||
uses: thollander/actions-comment-pull-request@24bffb9b452ba05a4f3f77933840a6a841d1b32b # v3.0.1
|
||||
if: github.event_name == 'pull_request'
|
||||
with:
|
||||
github-token: ${{ secrets.JF_BOT_TOKEN }}
|
||||
message: |
|
||||
## Cloudflare Pages deployment
|
||||
|
||||
| **Latest commit** | <code>${{ github.event.pull_request.head.sha || github.sha }}</code> |
|
||||
|-------------------|:-:|
|
||||
| **Status** | 🔄 Deploying... |
|
||||
| **Preview URL** | Not available |
|
||||
| **Type** | 🔀 Preview |
|
||||
pr-number: ${{ github.event.pull_request.number }}
|
||||
comment-tag: CFPages-deployment
|
||||
mode: recreate
|
||||
- name: Download workflow artifact
|
||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
|
||||
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
||||
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||
with:
|
||||
node-version-file: .nvmrc
|
||||
- name: Run build
|
||||
run: |
|
||||
npm ci --no-audit
|
||||
npm run build
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: jellyfin-org__build
|
||||
path: build
|
||||
|
||||
@@ -0,0 +1,148 @@
|
||||
name: deploy
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.workflow_run.head_branch || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
on:
|
||||
workflow_run:
|
||||
workflows:
|
||||
- build
|
||||
types:
|
||||
- completed
|
||||
|
||||
jobs:
|
||||
metadata:
|
||||
name: Metadata
|
||||
if: ${{ github.event.workflow_run.conclusion == 'success' && github.repository == 'jellyfin/jellyfin.org' }}
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
pr_number: ${{ steps.pr_number.outputs.pr_number }}
|
||||
steps:
|
||||
- name: Get Pull Request Number
|
||||
id: pr_number
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
|
||||
run: |
|
||||
API_RESPONSE=$(gh pr list --repo "${GITHUB_REPOSITORY}" --search "${HEAD_SHA}" --state open --json number)
|
||||
PR_NUMBER=$(echo "${API_RESPONSE}" | jq -r '.[0].number // ""')
|
||||
|
||||
echo "repository: ${GITHUB_REPOSITORY}"
|
||||
echo "sha: ${HEAD_SHA}"
|
||||
echo "response: ${API_RESPONSE}"
|
||||
echo "pr: ${PR_NUMBER}"
|
||||
|
||||
echo "pr_number=${PR_NUMBER}" >> "${GITHUB_OUTPUT}"
|
||||
|
||||
deploy:
|
||||
if: ${{ github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.head_branch == 'master' && github.repository == 'jellyfin/jellyfin.org' }}
|
||||
|
||||
name: Deploy to GitHub Pages
|
||||
permissions:
|
||||
actions: read
|
||||
pages: write
|
||||
id-token: write
|
||||
concurrency: build-deploy-pages
|
||||
environment:
|
||||
name: github-pages
|
||||
url: ${{ steps.deployment.outputs.page_url }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Configure Pages
|
||||
uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6.0.0
|
||||
|
||||
- name: Download workflow artifact
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
gh run download "${{ github.event.workflow_run.id }}" \
|
||||
--repo "${GITHUB_REPOSITORY}" \
|
||||
-n "jellyfin-org__build" \
|
||||
-D build
|
||||
|
||||
- name: Create pages artifact
|
||||
run: |
|
||||
tar --dereference --hard-dereference \
|
||||
--directory build \
|
||||
-cvf "$RUNNER_TEMP/artifact.tar" \
|
||||
--exclude=.git --exclude=.github .
|
||||
|
||||
- name: Upload pages artifact
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: github-pages
|
||||
path: ${{ runner.temp }}/artifact.tar
|
||||
retention-days: 1
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0
|
||||
|
||||
preview:
|
||||
needs: [metadata]
|
||||
if: ${{ github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.head_branch != 'master' }}
|
||||
|
||||
name: Deploy to Cloudflare Pages
|
||||
permissions:
|
||||
actions: read
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Set PR metadata
|
||||
id: pr
|
||||
run: |
|
||||
echo "number=${{ needs.metadata.outputs.pr_number }}" >> $GITHUB_OUTPUT
|
||||
echo "sha=${{ github.event.workflow_run.head_sha }}" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Download workflow artifact
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
gh run download "${{ github.event.workflow_run.id }}" \
|
||||
--repo "${GITHUB_REPOSITORY}" \
|
||||
-n "jellyfin-org__build" \
|
||||
-D build
|
||||
|
||||
- name: Add comment
|
||||
if: ${{ needs.metadata.outputs.pr_number != '' }}
|
||||
uses: thollander/actions-comment-pull-request@24bffb9b452ba05a4f3f77933840a6a841d1b32b # v3.0.1
|
||||
with:
|
||||
github-token: ${{ secrets.JF_BOT_TOKEN }}
|
||||
message: |
|
||||
## Cloudflare Pages deployment
|
||||
|
||||
| **Latest commit** | <code>${{ steps.pr.outputs.sha }}</code> |
|
||||
|-------------------|:-:|
|
||||
| **Status** | 🔄 Deploying... |
|
||||
| **Preview URL** | Not available |
|
||||
| **Type** | 🔀 Preview |
|
||||
pr-number: ${{ steps.pr.outputs.number }}
|
||||
comment-tag: CFPages-deployment
|
||||
mode: recreate
|
||||
- name: Publish to Cloudflare
|
||||
id: cf
|
||||
uses: cloudflare/wrangler-action@ebbaa1584979971c8614a24965b4405ff95890e0 # v4.0.0
|
||||
with:
|
||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||
command: >
|
||||
pages deploy build
|
||||
--project-name=jellyfin-org
|
||||
--branch=${{ github.event.workflow_run.head_repository.full_name }}/${{ github.event.workflow_run.head_branch }}
|
||||
--commit-hash=${{ steps.pr.outputs.sha }}
|
||||
|
||||
- name: Update status comment
|
||||
if: ${{ needs.metadata.outputs.pr_number != '' }}
|
||||
uses: thollander/actions-comment-pull-request@24bffb9b452ba05a4f3f77933840a6a841d1b32b # v3.0.1
|
||||
with:
|
||||
github-token: ${{ secrets.JF_BOT_TOKEN }}
|
||||
message: |
|
||||
## Cloudflare Pages deployment
|
||||
|
||||
| **Latest commit** | <code>${{ steps.pr.outputs.sha }}</code> |
|
||||
|-------------------|:-:|
|
||||
| **Status** | ${{ job.status == 'success' && '✅ Deployed!' || '❌ Failed!' }} |
|
||||
| **Preview URL** | ${{ steps.cf.outputs.deployment-url || 'Not available' }} |
|
||||
| **Type** | 🔀 Preview |
|
||||
pr-number: ${{ steps.pr.outputs.number }}
|
||||
comment-tag: CFPages-deployment
|
||||
mode: recreate
|
||||
@@ -12,13 +12,12 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Check out Git repository
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||
with:
|
||||
node-version: 20
|
||||
check-latest: true
|
||||
node-version-file: .nvmrc
|
||||
cache: npm
|
||||
|
||||
- name: Install Node.js dependencies
|
||||
@@ -32,16 +31,15 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check out Git repository
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
|
||||
- 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
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||
with:
|
||||
node-version: 20
|
||||
check-latest: true
|
||||
node-version-file: .nvmrc
|
||||
cache: npm
|
||||
|
||||
- name: Install Node.js dependencies
|
||||
@@ -49,3 +47,16 @@ jobs:
|
||||
|
||||
- name: Run markdownlint
|
||||
run: npm run lint:markdown
|
||||
|
||||
cspell:
|
||||
name: Check spelling
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Check out Git repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
|
||||
- name: Run cspell
|
||||
uses: streetsidesoftware/cspell-action@de2a73e963e7443969755b648a1008f77033c5b2 # v8.4.0
|
||||
with:
|
||||
config: ./cspell.json
|
||||
|
||||
@@ -20,13 +20,12 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Check out Git repository
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||
with:
|
||||
node-version: 20
|
||||
check-latest: true
|
||||
node-version-file: .nvmrc
|
||||
cache: npm
|
||||
|
||||
- name: Build and start test server
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
jellyfin:
|
||||
name: Jellyfin Team
|
||||
title: Jellyfin Team
|
||||
url: https://jellyfin.org/
|
||||
image_url: https://avatars.githubusercontent.com/u/45698031?s=200&v=4
|
||||
|
||||
1hitsong:
|
||||
name: 1hitsong
|
||||
title: Roku Team
|
||||
|
||||
@@ -19,6 +19,10 @@ Note that each of the repositories also has its own documentation on how to get
|
||||
|
||||
The best way to get going on some actual development is to look through the [issues list](https://github.com/jellyfin/jellyfin/issues) of the associated repository, find an issue you would like to work on, and start hacking! Issues are triaged regularly by the administrative team, and labels assigned that should help you find issues within your skill-set. Once you start working on an issue, please comment on it stating your intent to work on the issue, to avoid unnecessary duplication of work.
|
||||
|
||||
### Feature Proposals
|
||||
|
||||
New features or substantial changes to existing behavior affecting multiple sub-projects should first be proposed as a [Jellyfin Meta discussion](https://github.com/jellyfin/jellyfin-meta/discussions).
|
||||
|
||||
### Major Issue Types
|
||||
|
||||
A list of issue types can be found on the [issue guidelines](/developers/docs/contributing/issues#issue-labels) section.
|
||||
@@ -58,7 +62,14 @@ The first step is to set up a copy of the Git repository of the project you want
|
||||
|
||||
5. Build the Jellyfin Web project with NPM, and copy the location of the resulting `dist` folder.
|
||||
|
||||
6. In your `Jellyfin.Server` project add an environment variable named `JELLYFIN_WEB_DIR` with the value set to the full path of your `dist` folder.
|
||||
6. In your `Jellyfin.Server` project add an environment variable named `JELLYFIN_WEB_DIR` with the value set to the full path of your `dist` folder. You can set this path in your project by modifying the **environmentVariables** in the `Jellyfin.Server/Properties/launchSettings.json` file:
|
||||
|
||||
```json
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development",
|
||||
"JELLYFIN_WEB_DIR": "/path/to/your/jellyfin-web/dist"
|
||||
}
|
||||
```
|
||||
|
||||
You will now be ready to begin building or modifying the project.
|
||||
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
---
|
||||
uid: llm-policies
|
||||
title: LLM/"AI" Policies
|
||||
---
|
||||
|
||||
# Jellyfin LLM/"AI" Development Policy
|
||||
|
||||
The rise of LLMs as a useful development tool over the last year or so has been significant. The power and flexibility of tools like Claude Code and ChatGPT have given a lot of functionality both to experienced developers and new developers alike. But there are trade-offs.
|
||||
|
||||
The Jellyfin project has, from day one, had a major focus on code quality - readability, simplicity, conciseness. This is a mostly manual effort driven by a dedicated team of individuals, and is motivated by a desire to fix the code Jellyfin is based off of which, without beating a dead horse too much, was extremely fragile, spaghettified, and prone to over-engineered complexity.
|
||||
|
||||
We are seeing a precipitous rise in contributors using AI within the Jellyfin ecosystem, both in the server and for clients, as well as a rise in criticism and concern about LLMs generally. At this time we are writing this policy to address exactly what we expect and desire with respect to contributions and interactions within our community that may use LLMs. These rules apply to all of our official projects and community spaces.
|
||||
|
||||
## General Guidelines
|
||||
|
||||
1. LLM output is **expressly prohibited** for any direct communication, including the following:
|
||||
* issues or comments
|
||||
* feature requests or comments
|
||||
* pull request bodies or comments
|
||||
* forum/chat/etc. posts or comments
|
||||
|
||||
In short, if you are posting **any** of those things, the output must be your own words, explanation, description, etc., not a verbatim dump of an LLM's output. We expect you to understand what you're posting. Violating this rule will result in closure/deletion of the offending item(s).
|
||||
|
||||
An exception will be made for **LLM-assisted translations** if you are having trouble accurately conveying your intent in English. Please explicitly note this ("I have translated this from MyLanguage with an LLM") and, if possible, post in your original language as well.
|
||||
|
||||
2. LLM code contributions are subject to more granularity below, but the general principle is that "pure 'vibe coding' will be rejected" and "you are responsible for what you commit". We will review in that vein. If the **code looks terrible**, it will be **rejected as such**.
|
||||
|
||||
## LLM Code Contributions to Official Projects
|
||||
|
||||
The use of LLMs for code is controversial and open to much interpretation. These guidelines are our best effort attempt to ensure that knowledgeable developers who seek to use these tools as a legitimate aid are not overly-hindered, while also preventing an ongoing flood of slop contributions that violate our core ethos above. These apply to **all official Jellyfin projects**.
|
||||
|
||||
1. Contributions should be **concise and focused**. If the PR claims to target X, and is also touching unrelated Y and Z, it will be rejected. This includes incidental changes to unrelated functionality, a hallmark of poorly-worded or too-general prompts. Similarly, a large PR must be **broken into multiple small, manageable commits** for review and history purposes.
|
||||
2. Formatting and quality **standards must be upheld**. Excessive unhelpful comments, spaghetti code, spaces on empty lines, etc. will be interpreted as pure LLM output and rejected; you must **clean up the mess** before submitting. Also **do not commit LLM metafiles** (e.g. `.claude` configs) or any other editor-created non-code files.
|
||||
3. You must **review the output** and be able to **explain** in the PR body - **without** LLM output as noted above - **what is being changed and why**. Your PR body (and, if applicable, commit bodies) should be providing context to other developers about why a change was made, and if your name is on it, we want **your** words and explanations, not an LLM's. If **you can't explain** what the LLM did, we are **not interested** in the change.
|
||||
4. The changes must be **tested**. The code should build and run correctly, or it will be rejected. You should also **explicitly test the functionality being modified**.
|
||||
5. You must be able and willing to **handle review feedback** and implement the suggested change(s) as required. What this means in practice is, if you do not know what has been changed or why (see #3), and thus can't implement suggested changes or discuss them **yourself**, then we are **not interested** in the change. Just dumping reviewer feedback into an LLM and expecting what comes out to be "good enough", is not.
|
||||
6. **Features or refactors** require **an in-depth level of understanding** about what is being changed and why. It is obvious to our reviewers when changes are made without the developer making them understanding what is happening. These will be rejected. And as noted in #1, the PR must **contain multiple discrete commits**. _We_ will squash commits as deemed appropriate after review. Large changes must also follow our other development policies (discussion, review, implementation, testing process).
|
||||
7. The **final discretion always lies with the reviewers**. If your PR is not capable of being reasonably reviewed, for any reason (over-complexity, size, squashed commits, etc.) it will be rejected, and this goes just as much for non-LLM-assisted PRs as it does for LLM-assisted PRs. You will be asked to split such a PR up into multiple PRs that each present a focused, concise set of changes instead.
|
||||
|
||||
The golden rule is this: **do not just let an LLM loose on the codebase with a vague vibe prompt and then commit the results as-is**. This is lazy development, will **always** result in a **poor-quality contribution** from our perspective, and we are not at all interested in such slop. **Make an effort** or please do not bother. And again, you are free to use LLMs to **assist** you, but not as the sole source of code changes.
|
||||
|
||||
## LLM-generated Tools, Clients, etc. Shared in the Community
|
||||
|
||||
You are of course free to do whatever you wish for your own non-official projects. However, we will be enforcing the following rules for any **sharing of such projects within our communities**.
|
||||
|
||||
1. Any primarily-LLM-developed projects should be **clearly marked as such**. It is up to users to decide if this is acceptable to them or not. If you used an LLM for secondary assistance (e.g. docs, formatting, etc.) in an obvious way, we would err towards disclosure as well.
|
||||
2. You **must** respect and follow licenses. If you are basing your project off of existing code, **following its license is not optional**. You must **credit existing contributors in full** for **all contributions**. Do not **mangle the Git history**, and do not **commit pending 3rd party changes as your own** (i.e. by copying the code and then committing it). Doing so will result in, not just rejection, but a ban from our organization and community. We have a **zero tolerance policy** for code theft and bad-faith attribution attempts.
|
||||
3. For members of the community, **do not report** LLM-generated tools, clients, etc. **on that basis alone**, and do not engage in anti-LLM "witch hunts". As mentioned above, this is **permitted** and it is your choice whether to "support" said tool/client/etc. or not.
|
||||
4. We, the moderators, are not going to play "LLM police" about 3rd party projects by nitpicking to try to "find LLM contributions" that otherwise follow our rules here; this is tedious and a waste of our time and effort. What this means in practice is that rule #1 is up to the author, and rule #3 must be interpreted in that vein. If you **only suspect** a tool is LLM-generated and violates rule #1, then downvote/ignore it and move on. **Only if** we see **blatant breaking of rule #1** we will enforce it, but again we will not be going through code line by line playing the "was this LLM generated?" game. Rule #2 will always be enforced regardless of LLM-ness or not.
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json",
|
||||
"version": "0.2",
|
||||
"language": "en, en-US, en-GB",
|
||||
"allowCompoundWords": true,
|
||||
"files": ["**/*.md", "**/*.mdx", "**/*.tsx"],
|
||||
"dictionaryDefinitions": [
|
||||
{
|
||||
"name": "project-words",
|
||||
"path": "./project-words.txt",
|
||||
"addWords": true
|
||||
}
|
||||
],
|
||||
"dictionaries": ["project-words"],
|
||||
"ignorePaths": [
|
||||
"node_modules",
|
||||
"/project-words.txt",
|
||||
"/src/components/common/PlatformIcon.tsx",
|
||||
|
||||
"/blog/2019/*",
|
||||
"/blog/2020/*",
|
||||
"/blog/2021/*",
|
||||
"/blog/2022/*",
|
||||
"/blog/2023/*",
|
||||
"/blog/2024/*",
|
||||
"/blog/2025/*"
|
||||
]
|
||||
}
|
||||
@@ -31,7 +31,7 @@ To take a new Backup, enter the Jellyfin Dashboard, open the `Backups` tab and c
|
||||
- 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.
|
||||
- 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:
|
||||
|
||||
@@ -9,12 +9,6 @@ This page covers migrations of Jellyfin as well as migrations to Jellyfin.
|
||||
|
||||
Jellyfins internal databases cannot be copied or adjusted easily. Depending on your case there may be ways to work around this, for example by just migrating parts of the data, or because it's possible maintain the same file paths.
|
||||
|
||||
If that's not an option for you, there is also a script available to migrate the entire database without data loss, but it's not a turn-key solution.
|
||||
|
||||
## Full Database Migration
|
||||
|
||||
[Jellyfin Migrator](https://github.com/MMMZZZZ/Jellyfin-Migrator) is a third-party script that can migrate your entire installation from Windows to Linux or Linux Docker. It can also do other migrations, like a reorganization of your media files. All statistics, settings and metadata are preserved.
|
||||
|
||||
## Watched Status Migration
|
||||
|
||||
There are third-party scripts available that will use the API to copy watched status and users from one instance to another.
|
||||
|
||||
@@ -198,7 +198,7 @@ If the container is unsupported, this will result in remuxing. The video and aud
|
||||
| Container | Chrome | Edge | Firefox | Safari | Android | Android TV | Kodi | Roku |
|
||||
| :-------------------------------------------------------------------: | :----: | :--: | :-----: | :----: | :-----: | :--------: | :--: | :--: |
|
||||
| [MP4](https://en.wikipedia.org/wiki/MPEG-4_Part_14)<sup>1</sup> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| [MKV](https://en.wikipedia.org/wiki/Matroska)<sup>2, 3, 8</sup> | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |
|
||||
| [MKV](https://en.wikipedia.org/wiki/Matroska)<sup>2, 3, 8, 9</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> | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
@@ -218,3 +218,5 @@ If the container is unsupported, this will result in remuxing. The video and aud
|
||||
<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)
|
||||
<br />
|
||||
<sup>9</sup>MKV on Chrome requires at least Chrome 145.
|
||||
|
||||
@@ -5,9 +5,9 @@ title: CSS Customization
|
||||
|
||||
# CSS Customization
|
||||
|
||||
In `Dashboard > General`, the "Custom CSS" field can be used to override current CSS in Jellyfin's stylesheet.
|
||||
In `Dashboard > Branding`, the "Custom CSS" field can be used to override current CSS in Jellyfin's stylesheet.
|
||||
|
||||
[Custom CSS](https://developer.mozilla.org/en-US/docs/Web/CSS) provides customization such as changing colors, changing layouts, and item size and behavior. Below is a list of various tweaks that can be applied. The CSS tweaks work on both the web client, and the [Android application](https://play.google.com/store/apps/details?id=org.jellyfin.mobile&hl=en_US). The code will apply in the order that it is written, however `!important` will overrule everything. To learn more about `!important` and more, see [CSS Specificity](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity) or [specifishity](https://specifishity.com/). To implement these changes, go to `Dashboard > General > Custom CSS` to start.
|
||||
[Custom CSS](https://developer.mozilla.org/en-US/docs/Web/CSS) provides customization such as changing colors, changing layouts, and item size and behavior. Below is a list of various tweaks that can be applied. The CSS tweaks work on all clients that load Jellyfin-Web from the Server. The code will apply in the order that it is written, however `!important` will overrule everything. To learn more about `!important` and more, see [CSS Specificity](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity) or [specifishity](https://specifishity.com/). To implement these changes, go to `Dashboard > Branding > Custom CSS` to start.
|
||||
|
||||
If you have little or no experience with CSS, various resources and tutorials can be found online. Using the tweaks and examples below makes it quite easy to get started with making your own changes to your Jellyfin instance.
|
||||
|
||||
|
||||
@@ -0,0 +1,307 @@
|
||||
---
|
||||
uid: installation-advanced-kubernetes
|
||||
title: Kubernetes Deployment
|
||||
description: Deploy Jellyfin on Kubernetes using Helm
|
||||
sidebar_position: 7
|
||||
---
|
||||
|
||||
# Kubernetes Deployment
|
||||
|
||||
This guide covers deploying Jellyfin on Kubernetes using the [official Helm chart](https://github.com/jellyfin/jellyfin-helm/tree/master/charts/jellyfin).
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Kubernetes cluster (v1.19+)
|
||||
- Helm 3.x installed
|
||||
- `kubectl` configured for your cluster
|
||||
- Sufficient storage for media and configuration
|
||||
- Ingress controller (e.g. traefik) for external access (required for this tutorial, see [official docs](https://github.com/jellyfin/jellyfin-helm/tree/master/charts/jellyfin) for alternatives)
|
||||
|
||||
## Installation
|
||||
|
||||
### 1. Add Helm Repository
|
||||
|
||||
```bash
|
||||
helm repo add jellyfin https://jellyfin.github.io/jellyfin-helm
|
||||
helm repo update
|
||||
```
|
||||
|
||||
### 2. Custom Installation
|
||||
|
||||
For complete installation instructions and configuration options, see the [official Jellyfin Helm chart repository](https://github.com/jellyfin/jellyfin-helm/tree/master/charts/jellyfin).
|
||||
|
||||
Create a `values.yaml` file for customization:
|
||||
|
||||
```yaml
|
||||
# values.yaml
|
||||
replicaCount: 1
|
||||
|
||||
image:
|
||||
pullPolicy: IfNotPresent
|
||||
|
||||
persistence:
|
||||
config:
|
||||
enabled: true
|
||||
size: 5Gi
|
||||
storageClass: ''
|
||||
media:
|
||||
enabled: true
|
||||
size: 100Gi
|
||||
storageClass: ''
|
||||
|
||||
ingress:
|
||||
enabled: true
|
||||
className: 'traefik'
|
||||
hosts:
|
||||
- host: jellyfin.example.com
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
|
||||
resources:
|
||||
limits:
|
||||
cpu: 2000m
|
||||
memory: 4Gi
|
||||
requests:
|
||||
cpu: 500m
|
||||
memory: 1Gi
|
||||
|
||||
nodeSelector: {}
|
||||
tolerations: []
|
||||
affinity: {}
|
||||
```
|
||||
|
||||
Install with custom values:
|
||||
|
||||
```bash
|
||||
helm install jellyfin jellyfin/jellyfin -f values.yaml
|
||||
```
|
||||
|
||||
## Configuration Options
|
||||
|
||||
### Service Types
|
||||
|
||||
This guide covers ClusterIP service type (default) for internal access only, with external access via ingress controller. Alternatives include LoadBalancer and NodePort services.
|
||||
|
||||
### Persistence
|
||||
|
||||
#### Using Existing Persistent Volume Claims
|
||||
|
||||
```yaml
|
||||
persistence:
|
||||
config:
|
||||
enabled: true
|
||||
existingClaim: 'jellyfin-config-pvc'
|
||||
media:
|
||||
enabled: true
|
||||
existingClaim: 'jellyfin-media-pvc'
|
||||
```
|
||||
|
||||
#### Creating New PVCs via Helm
|
||||
|
||||
```yaml
|
||||
persistence:
|
||||
config:
|
||||
enabled: true
|
||||
size: 5Gi
|
||||
storageClass: 'fast-ssd'
|
||||
media:
|
||||
enabled: true
|
||||
size: 100Gi
|
||||
storageClass: 'slow-hdd'
|
||||
```
|
||||
|
||||
### Ingress
|
||||
|
||||
#### Basic Ingress Configuration
|
||||
|
||||
```yaml
|
||||
ingress:
|
||||
enabled: true
|
||||
className: 'traefik'
|
||||
hosts:
|
||||
- host: jellyfin.example.com
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
```
|
||||
|
||||
#### Advanced Ingress with TLS
|
||||
|
||||
```yaml
|
||||
ingress:
|
||||
enabled: true
|
||||
className: 'traefik'
|
||||
annotations:
|
||||
traefik.ingress.kubernetes.io/router.entrypoints: websecure
|
||||
traefik.ingress.kubernetes.io/router.middlewares: default-jellyfin-buffering@kubernetescrd
|
||||
hosts:
|
||||
- host: jellyfin.example.com
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
tls:
|
||||
- secretName: jellyfin-tls
|
||||
hosts:
|
||||
- jellyfin.example.com
|
||||
|
||||
apiVersion: traefik.io/v1alpha1
|
||||
kind: Middleware
|
||||
metadata:
|
||||
name: jellyfin-buffering
|
||||
namespace: default
|
||||
spec:
|
||||
buffering:
|
||||
maxRequestBodyBytes: 0
|
||||
```
|
||||
|
||||
## Accessing Jellyfin
|
||||
|
||||
### Port Forwarding (Development)
|
||||
|
||||
```bash
|
||||
kubectl port-forward svc/jellyfin 8096:8096
|
||||
```
|
||||
|
||||
Access at: `http://localhost:8096`
|
||||
|
||||
### External Access
|
||||
|
||||
Once ingress is configured, access Jellyfin at your configured domain (e.g., `https://jellyfin.example.com`).
|
||||
|
||||
## Monitoring
|
||||
|
||||
### Health Checks
|
||||
|
||||
The chart includes readiness and liveness probes:
|
||||
|
||||
```yaml
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /health
|
||||
port: http
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 10
|
||||
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /health
|
||||
port: http
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 5
|
||||
```
|
||||
|
||||
### Metrics
|
||||
|
||||
Enable Prometheus metrics if available:
|
||||
|
||||
```yaml
|
||||
metrics:
|
||||
enabled: true
|
||||
serviceMonitor:
|
||||
enabled: true
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
1. **Permission Denied**: Ensure proper security context for media access
|
||||
2. **Storage Issues**: Verify persistent volume claims are bound
|
||||
3. **Network Access**: Check service type and ingress configuration
|
||||
|
||||
### Debug Commands
|
||||
|
||||
```bash
|
||||
# Check pod status
|
||||
kubectl get pods -l app.kubernetes.io/name=jellyfin
|
||||
|
||||
# View logs
|
||||
kubectl logs -f deployment/jellyfin
|
||||
|
||||
# Check service
|
||||
kubectl get svc jellyfin
|
||||
|
||||
# Describe pod for events
|
||||
kubectl describe pod -l app.kubernetes.io/name=jellyfin
|
||||
```
|
||||
|
||||
## Upgrading
|
||||
|
||||
```bash
|
||||
# Update repository
|
||||
helm repo update
|
||||
|
||||
# Upgrade installation
|
||||
helm upgrade jellyfin jellyfin/jellyfin
|
||||
|
||||
# Check upgrade status
|
||||
helm status jellyfin
|
||||
```
|
||||
|
||||
## Uninstalling
|
||||
|
||||
```bash
|
||||
# Remove Helm release
|
||||
helm uninstall jellyfin
|
||||
|
||||
# Clean up persistent volumes (if needed)
|
||||
kubectl delete pvc -l app.kubernetes.io/name=jellyfin
|
||||
```
|
||||
|
||||
## Advanced Configuration
|
||||
|
||||
### Hardware Acceleration
|
||||
|
||||
For GPU acceleration, add device access and security context:
|
||||
|
||||
```yaml
|
||||
securityContext:
|
||||
privileged: true
|
||||
|
||||
resources:
|
||||
limits:
|
||||
gpu.intel.com/i915: 1
|
||||
# or nvidia.com/gpu: 1
|
||||
|
||||
extraVolumes:
|
||||
- name: dri
|
||||
hostPath:
|
||||
path: /dev/dri
|
||||
|
||||
extraVolumeMounts:
|
||||
- name: dri
|
||||
mountPath: /dev/dri
|
||||
```
|
||||
|
||||
### Multiple Media Sources
|
||||
|
||||
Mount multiple media sources using additional volumes:
|
||||
|
||||
```yaml
|
||||
volumes:
|
||||
- name: movies
|
||||
persistentVolumeClaim:
|
||||
claimName: movies-pvc
|
||||
- name: tv
|
||||
persistentVolumeClaim:
|
||||
claimName: tv-pvc
|
||||
|
||||
volumeMounts:
|
||||
- name: movies
|
||||
mountPath: /movies
|
||||
- name: tv
|
||||
mountPath: /tv
|
||||
```
|
||||
|
||||
### Custom Environment Variables
|
||||
|
||||
```yaml
|
||||
extraEnvVars:
|
||||
- name: JELLYFIN_PublishedServerUrl
|
||||
value: 'https://jellyfin.example.com'
|
||||
- name: JELLYFIN_CACHE_DIR
|
||||
value: '/cache'
|
||||
```
|
||||
|
||||
For more configuration options, see the [Jellyfin Helm chart documentation](https://github.com/jellyfin/jellyfin-helm/tree/master/charts/jellyfin).
|
||||
@@ -0,0 +1,61 @@
|
||||
---
|
||||
uid: installation-advanced-windows
|
||||
title: Windows Service
|
||||
description: Installing Jellyfin as a Windows Service.
|
||||
sidebar_position: 5
|
||||
---
|
||||
|
||||
:::note
|
||||
While a standard installation is recommended for most users, installing Jellyfin as a service is ideal for dedicated servers. This allows Jellyfin to start automatically at boot and remain active even when no users are logged into the system.
|
||||
:::
|
||||
|
||||
Running as a **Network Service** is preferred over **Local System** for the principle of least privilege. Follow these steps to ensure proper access without over-provisioning permissions.
|
||||
|
||||
### Installing as a Service
|
||||
|
||||
1. In the Windows installer, select **Install as a Service**.
|
||||
2. Choose the default install path, `C:\Program Files\Jellyfin\Server`.
|
||||
3. Choose the default data path, `C:\ProgramData\Jellyfin\Server`.
|
||||
4. Choose **Use Network Service account** for the account type.
|
||||
5. Uncheck **Start Service after Install**.
|
||||
6. Click **Install**.
|
||||
|
||||
### Configure Service Account Permissions
|
||||
|
||||
The service account needs access to Jellyfin's configuration files.
|
||||
|
||||
1. Navigate to `C:\ProgramData\`.
|
||||
2. Right-click the **Jellyfin** folder, and click **Properties** > **Security** > **Advanced**.
|
||||
3. Beside **Owner**, click **Change**, and enter `NETWORK SERVICE` in the text box. Click **OK**.
|
||||
4. Click **Add** under Principal. Click **Select a principal** and enter `NETWORK SERVICE` in the text box. Click **OK**.
|
||||
5. Under **Basic permissions** for the new principal, choose one of the following based on your security preference, then Click **OK**.
|
||||
* **Modify**: Allows Jellyfin to read, write, and delete its own data without granting it the power to change system permissions.
|
||||
* **Full Control**: Easiest for setup. Grants all rights, including the ability to change owner and permissions.
|
||||
6. Check the option **Replace all child object permission entries...**. Click **Apply**.
|
||||
7. Exit the menu.
|
||||
|
||||
### Configure Media Library Permissions
|
||||
|
||||
After setting up a media folder, you should grant the service account read & execute access to that folder to prevent "Path not found" errors.
|
||||
|
||||
1. Right-click your media folder, and click **Properties** > **Security** > **Advanced**.
|
||||
2. Click **Add** under Principal. Click **Select a principal** and enter `NETWORK SERVICE` in the text box. Click **OK**.
|
||||
3. Under **Basic permissions** for the new principal, choose based on how you want Jellyfin to interact with your files, then Click **OK**.
|
||||
* **Read & execute** (Recommended): Allows Jellyfin to see and play your media. This is the safest option as it prevents the server from accidentally deleting or modifying your original movie files.
|
||||
* **Modify**: Required only if you want to use `Delete` from within the Jellyfin UI, or if you want Jellyfin to save subtitles and `.nfo` metadata files directly into your movie folders.
|
||||
* **Full Control**: Not recommended for media folders. This grants administrative rights that the service does not need for playback.
|
||||
4. Check the option **Replace all child object permission entries...**. Click **Apply**.
|
||||
5. Exit the menu.
|
||||
|
||||
### Verify and Initialize
|
||||
|
||||
1. Press **Windows**+**R** and type "services.msc". Hit **Enter**.
|
||||
2. Find the **Jellyfin Server** service and verify the "Log On As" column shows **Network Service**.
|
||||
3. Right-click **Jellyfin Server** service and select **Start**.
|
||||
4. Navigate to http://localhost:8096 to complete the wizard.
|
||||
|
||||
### Troubleshooting
|
||||
|
||||
* **Missing ProgramData Folder:** If `C:\ProgramData\Jellyfin` does not exist yet, proceed to **Verify and Initialize** and follow steps 1 and 3. This will generate the necessary directory structure so you can then apply permissions.
|
||||
* **Empty Libraries:** If the setup wizard does not "see" your media, ensure the `NETWORK SERVICE` account has at least **List folder contents** permissions on the parent directory leading to your media folder (e.g., if media is in `D:\Media\Movies`, check permissions for `D:\Media`).
|
||||
* **Remote Access:** To allow other devices on your network to connect, you must add a Windows Firewall rule to allow **Inbound** traffic on TCP port `8096`. For detailed steps, see the [Networking Guide](../../post-install/networking/index.md).
|
||||
@@ -8,28 +8,28 @@ 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 substitute `curl` with `wget -O-`):
|
||||
|
||||
Download and verify the script, then execute it on your system (requires `curl` and `sha256sum`):
|
||||
|
||||
```sh
|
||||
curl https://repo.jellyfin.org/install-debuntu.sh | sudo bash
|
||||
curl -s https://repo.jellyfin.org/install-debuntu.sh -O && \
|
||||
curl -s https://repo.jellyfin.org/install-debuntu.sh.sha256sum -O && \
|
||||
sha256sum -c install-debuntu.sh.sha256sum
|
||||
```
|
||||
|
||||
:::note
|
||||
`install-debuntu.sh: OK` means the checksum is correct.
|
||||
|
||||
You can verify the script download integrity with (requires `sha256sum`):
|
||||
|
||||
```sh
|
||||
diff <( curl -s https://repo.jellyfin.org/install-debuntu.sh -o install-debuntu.sh; sha256sum install-debuntu.sh ) <( curl -s https://repo.jellyfin.org/install-debuntu.sh.sha256sum )
|
||||
```
|
||||
|
||||
An empty output means everything is correct. Then you can inspect the script to see what it does (optional but recommended) and execute it with:
|
||||
You can optionally inspect the script to see what it does before executing it:
|
||||
|
||||
```sh
|
||||
less install-debuntu.sh
|
||||
sudo bash install-debuntu.sh
|
||||
```
|
||||
|
||||
:::
|
||||
Then execute it with:
|
||||
|
||||
```sh
|
||||
sudo bash install-debuntu.sh
|
||||
```
|
||||
|
||||
:::note
|
||||
|
||||
@@ -37,6 +37,8 @@ The script tries to handle as many common derivatives as possible, including, at
|
||||
|
||||
:::
|
||||
|
||||
If you do not want to execute a script with superuser permissions, you can also install the Jellyfin software repository manually (using either [extrepo](/docs/general/installation/advanced/manual/#debian-using-extrepo) or the [fully manual method](/docs/general/installation/advanced/manual/#official-linux-repository-manual)).
|
||||
|
||||
## Other Distributions
|
||||
|
||||
For other distributions, [containers](/docs/general/installation/container) are the recommended way to install Jellyfin. There are also [community-maintained packages](/docs/general/installation/advanced/community) provided by 3rd parties if you would like to use them instead.
|
||||
|
||||
@@ -26,4 +26,4 @@ sidebar_position: 1
|
||||
|
||||
1. Go to [Add or remove programs](https://support.microsoft.com/en-us/windows/uninstall-or-remove-apps-and-programs-in-windows-4b55f974-2cc6-2d2b-d092-5905080eaf98) in Windows settings.
|
||||
2. Search for Jellyfin.
|
||||
3. Click Uninstall.
|
||||
3. Click Uninstall.
|
||||
@@ -42,18 +42,12 @@ Please read the [Let's Encrypt documentation](https://letsencrypt.org/docs/chall
|
||||
|
||||
The easiest way to reverse proxy to Jellyfin is with the `reverse-proxy` command:
|
||||
|
||||
```bash
|
||||
caddy reverse-proxy --from :5001 --to 127.0.0.1:8096
|
||||
```
|
||||
|
||||
That is a simple but production-ready plaintext HTTP reverse proxy.
|
||||
|
||||
If you have:
|
||||
|
||||
- permission to bind to low ports, and
|
||||
- a public domain name's DNS records pointed at your machine,
|
||||
|
||||
then you can serve over HTTPS just as easily:
|
||||
then you can serve over HTTPS easily:
|
||||
|
||||
```bash
|
||||
caddy reverse-proxy --from example.com --to 127.0.0.1:8096
|
||||
@@ -64,15 +58,7 @@ You will see Caddy provision a TLS certificate for your site and if it succeeds,
|
||||
### Caddyfile
|
||||
|
||||
If you want to use a config file, create a file called `Caddyfile` for the configuration.
|
||||
The first `reverse-proxy` command above is equivalent to the following options.
|
||||
|
||||
```txt
|
||||
:5001
|
||||
|
||||
reverse_proxy 127.0.0.1:8096
|
||||
```
|
||||
|
||||
To get HTTPS, simply change the first line to your domain name.
|
||||
The following config is equivalent to the command above.
|
||||
|
||||
```txt
|
||||
example.com
|
||||
|
||||
@@ -13,6 +13,7 @@ Jellyfin produces logs that can be monitored by Fail2ban to prevent brute-force
|
||||
- Jellyfin remotely accessible
|
||||
- Fail2ban installed and running
|
||||
- Knowing where the logs for Jellyfin are stored: by default `/var/log/jellyfin/` for desktop and `/config/log/` for docker containers.
|
||||
- Jellyfin log level set to `Info` (failed authentication entries are not logged at `Error`). This setting is can be found in `logging.json`
|
||||
|
||||
## Step one: create the jail
|
||||
|
||||
@@ -35,11 +36,53 @@ filter = jellyfin
|
||||
maxretry = 3
|
||||
bantime = 86400
|
||||
findtime = 43200
|
||||
logpath = /path_to_logs/jellyfin*.log
|
||||
logpath = /path_to_logs/log_*.log
|
||||
```
|
||||
|
||||
Save and exit nano.
|
||||
|
||||
Jellyfin rotates logs daily and `fail2ban` cannot detect the newly created log files without service restart or config reload.
|
||||
|
||||
To fix this you need a daily timer that `reloads` above fail2ban jellyfin jail whenever the logs are rotated at roughly around midnight.
|
||||
|
||||
```bash
|
||||
sudoedit /etc/systemd/system/fail2ban-jellyfin-reload.timer
|
||||
```
|
||||
Add this to the new file:
|
||||
```bash
|
||||
[Unit]
|
||||
Description=Reload Fail2Ban jellyfin jail daily
|
||||
|
||||
[Timer]
|
||||
OnCalendar=*-*-* 00:45:00
|
||||
Persistent=true
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
```
|
||||
Save and exit nano.
|
||||
|
||||
```bash
|
||||
sudoedit /etc/systemd/system/fail2ban-jellyfin-reload.service
|
||||
```
|
||||
Add this to the new file:
|
||||
```bash
|
||||
[Unit]
|
||||
Description=Reload Fail2Ban jellyfin jail
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/usr/bin/fail2ban-client reload jellyfin
|
||||
```
|
||||
Save and exit nano.
|
||||
|
||||
Enable and start the service:
|
||||
|
||||
```bash
|
||||
sudo systemctl enable --now fail2ban-jellyfin-reload.timer
|
||||
```
|
||||
|
||||
|
||||
Note:
|
||||
|
||||
1. If Jellyfin is running in a docker container, add the following to the `jellyfin.local` file:
|
||||
@@ -82,7 +125,7 @@ sudo systemctl status fail2ban
|
||||
Assuming you've at least one failed authentication attempt, you can test this new jail with `fail2ban-regex`:
|
||||
|
||||
```bash
|
||||
sudo fail2ban-regex /path_to_logs/*.log /etc/fail2ban/filter.d/jellyfin.conf --print-all-matched
|
||||
sudo fail2ban-regex /path_to_logs/log_*.log /etc/fail2ban/filter.d/jellyfin.conf --print-all-matched
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
@@ -57,6 +57,18 @@ This, however, requires the use of a public DNS server - The Jellyfin Server doe
|
||||
|
||||
</details>
|
||||
|
||||
### Allowing Access
|
||||
|
||||
Jellyfin provides flexible access control options. External access can either be completely disabled or selectively enabled for individual users.
|
||||
|
||||
For these controls to function correctly, Jellyfin must know which IP ranges should be considered part of the local network.
|
||||
These ranges can be configured under `Networking` -> `Local Networks` using comma-separated CIDR notation entries.
|
||||
|
||||
Global external access settings can be configured under `Networking` -> `Remote Access Settings`.
|
||||
User-specific external access permissions can be configured under `Users` -> `Edit User` -> `Allow remote connections to this server`.
|
||||
|
||||
Ensure that the configured access permissions align with the network scope defined in the local network settings.
|
||||
|
||||
### Firewall / Port Forwarding
|
||||
|
||||
Networks are usually divided from each other by firewalls. These block all incoming traffic and are meant to protect the network.
|
||||
@@ -100,7 +112,7 @@ Here is linked below how to open ports for:
|
||||
|
||||
Since Jellyfin is entirely self-hosted, you must manually expose it to the internet.
|
||||
To do so, you need a method to access the HTTP(S) ports remotely.
|
||||
Automatic discovery only works locally and should not be exposed externally
|
||||
Automatic discovery only works locally and should not be exposed externally.
|
||||
|
||||
To access a server remotely there will need to be a way to find it or its network on the internet.
|
||||
This can be done through the public IP Address of the Device or for IPv6 the Server's directly.
|
||||
|
||||
@@ -23,8 +23,7 @@ Set up an administrator account for managing the server. Choose a strong passwor
|
||||
Add media libraries at this page. Click on the + to add a library. Alternatively, click on "Next" without adding anything to skip this step and add media later.
|
||||

|
||||
|
||||
In the popup, chose a type on the "Content Type" dropdown, and set a display name in the "Display Name" field. Then, add some folders using the + button. If you don't see your media folders listed, you might have permission issues. You can get help on our [forum](https://forum.jellyfin.org/) or [chat rooms](/contact)
|
||||
Read more about media libraries at the [media libraries' documentation](/docs/general/server/libraries/)
|
||||
In the popup, chose a type on the "Content Type" dropdown, and set a display name in the "Display Name" field. Then, add some folders using the + button. If you don't see your media folders listed, you might have permission issues. You can get help on our [forum](https://forum.jellyfin.org/) or [chat rooms](/contact). Read more about media libraries at the [media libraries' documentation](/docs/general/server/libraries/).
|
||||

|
||||
|
||||
## Set a Preferred Metadata Language
|
||||
@@ -34,7 +33,11 @@ Select a preferred language and region for metadata fetching as the server-wide
|
||||
|
||||
## Networking Settings
|
||||
|
||||
Some basic options for networking can be set on this page. For most users, it is recommended to **enable** the "Allow remote access to this server" option, and **disable** the "Enable automatic port mapping" option.
|
||||
Some basic networking options can be configured on this page. For most users, it is recommended to **enable** the "Allow remote access to this server" option.
|
||||
Detailed information about remote access configuration can be found in our dedicated [Networking Guide](./networking/index.md#allowing-access).
|
||||
|
||||
Since "automatic port mapping" relies on UPnP, a protocol commonly associated with security concerns, it is recommended to **disable** this option unless it is specifically required.
|
||||
|
||||

|
||||
|
||||
## Next Steps
|
||||
|
||||
@@ -37,4 +37,4 @@ There are four types of playback; three of which involve transcoding. The type b
|
||||
When the source video is in HDR, it will need to be tone-mapped to SDR when transcoding, as Jellyfin currently
|
||||
doesn't support HDR to HDR tone-mapping, or passing through HDR metadata. While this can be done in software, it is
|
||||
very slow, and you may encounter situations where no modern consumer CPUs can transcode in real time. Therefore, a GPU
|
||||
is always recommended, where even a basic Intel iGPU can handle as much load as a Ryzen 5800X for this usecase.
|
||||
is always recommended, where even a basic Intel iGPU can handle as much load as a Ryzen 5800X for this use case.
|
||||
|
||||
@@ -58,19 +58,17 @@ Supported filenames are:
|
||||
|
||||
- `trailer`
|
||||
- `sample`
|
||||
- `theme` - Audio file of the theme song
|
||||
|
||||
```txt
|
||||
Best_Movie_Ever (2019)
|
||||
├── Best_Movie_Ever (2019) - 1080P.mp4
|
||||
└── theme.mp3
|
||||
└── trailer.mp4
|
||||
```
|
||||
|
||||
```txt
|
||||
Awesome TV Show (2024)
|
||||
├── Season 1
|
||||
│ ├── Awesome TV Show (2024) S01E01 episode name.mp4
|
||||
│ └── theme.flac
|
||||
└── sample.mp4
|
||||
```
|
||||
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
|
||||
Jellyfin fetches information about the media automatically from external metadata providers for most types of content.
|
||||
Movies and shows can be named with a metadata provider ID to improve matching.
|
||||
Movies and shows can be named with a metadata provider ID to improve matching.
|
||||
|
||||
```txt
|
||||
Movie Name (year) [metadata provider id]
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
<!-- markdownlint-disable MD041 -->
|
||||
|
||||
### Theme media
|
||||
|
||||
Theme media gives browsing your library a more audio-visual touch by playing Theme songs and/or Theme videos in the background while you're looking at your media listings.
|
||||
|
||||
:::tip
|
||||
|
||||
For these to play, users need to enable the option in their clients. In the WebUI and WebUI-based clients this is found in the User settings under Display > Libraries > Theme songs, and Theme videos, respectively. Implementations in third-party clients may differ.
|
||||
|
||||
:::
|
||||
|
||||
In case both Theme songs and Theme videos are found and enabled, Theme videos will be preferred and Theme songs will not play.
|
||||
|
||||
In the WebUI and WebUI-based clients, if there are multiple Theme media found, they will be shuffled when opening the listing. This cannot be changed.
|
||||
|
||||
#### Songs
|
||||
|
||||
- theme.ext
|
||||
- theme-music/\*
|
||||
|
||||
#### Videos
|
||||
|
||||
- backdrops/\*
|
||||
|
||||
:::tip
|
||||
|
||||
Just like any other media, Theme media will be transcoded when required or requested by the client. However, since transcoding can result in delay of Theme media playback, Web-standard formats like WebM (VP9/Opus) are recommended for a smooth experience, as they generally direct play.
|
||||
|
||||
:::
|
||||
|
||||
#### Example
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
|
||||
<Tabs>
|
||||
<TabItem value='movies' label='Movies'>
|
||||
```txt
|
||||
Movies
|
||||
└── Best_Movie_Ever (2019)
|
||||
├── backdrops
|
||||
│ └── bluray-menu.ext
|
||||
├── theme.ext
|
||||
└── theme-music
|
||||
└── awesome-soundtrack-song.ext
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem value='shows' label='Shows'>
|
||||
```txt
|
||||
Shows
|
||||
└── Series Name (2010)
|
||||
├── backdrops
|
||||
│ ├── S1Intro.ext
|
||||
│ └── S2Intro.ext
|
||||
├── Season 01
|
||||
│ ├── backdrops
|
||||
│ │ └── S1Intro.ext
|
||||
│ └── theme-music
|
||||
│ └── S1Intro.ext
|
||||
├── Season 02
|
||||
│ ├── backdrops
|
||||
│ │ └── S2Intro.ext
|
||||
│ └── theme.ext
|
||||
├── theme.ext
|
||||
└── theme-music
|
||||
├── intro-song.ext
|
||||
└── outro-song.ext
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
|
||||
@@ -13,7 +13,8 @@ Books should be organized by type (Audiobooks, Books, Comics), then optionally b
|
||||
Books
|
||||
├── Audiobooks
|
||||
│ ├── Author
|
||||
│ │ ├── Book1.flac
|
||||
│ │ ├── Book1
|
||||
│ │ │ └── Book1.flac
|
||||
│ │ └── Book2
|
||||
│ │ └── Book2.mp3
|
||||
│ └── Book3
|
||||
|
||||
@@ -77,6 +77,10 @@ import ExternalExtras from './\_video-external-extras.md';
|
||||
|
||||
<ExternalExtras />
|
||||
|
||||
import ThemeMedia from './\_video-theme-media.md';
|
||||
|
||||
<ThemeMedia />
|
||||
|
||||
import MetadataImages from './\_metadata-images.md';
|
||||
|
||||
<MetadataImages />
|
||||
|
||||
@@ -89,6 +89,10 @@ Specials can also be shown within a season if so desired. This can be helpful wh
|
||||
|
||||
Note that this will show them in both the `Specials` season, as well as the season specified.
|
||||
|
||||
import ThemeMedia from './\_video-theme-media.md';
|
||||
|
||||
<ThemeMedia />
|
||||
|
||||
import Video3D from './\_video-3d.md';
|
||||
|
||||
<Video3D />
|
||||
|
||||
@@ -337,6 +337,22 @@ Downloads Hebrew subtitles from WizdomSubs for your media files. This plugin pro
|
||||
|
||||
- [GitHub](https://github.com/DeDuplicate/Jellyfin_wizdomsubs_downloader)
|
||||
|
||||
#### SmartCovers
|
||||
|
||||
Fallback cover-image provider for books, audiobooks, and PDFs. Extracts covers from files locally (EPUB, PDF, audio embedded art) and fetches from Open Library and Google Books when local extraction fails.
|
||||
|
||||
**Links:**
|
||||
|
||||
- [GitHub](https://github.com/GeiserX/smart-covers)
|
||||
|
||||
#### WhisperSubs
|
||||
|
||||
Local AI-powered subtitle generation using whisper.cpp. Generates SRT subtitles for movies and TV shows using a local Whisper model — no cloud APIs, no subscriptions.
|
||||
|
||||
**Links:**
|
||||
|
||||
- [GitHub](https://github.com/GeiserX/whisper-subs)
|
||||
|
||||
## Repositories
|
||||
|
||||
import { OfficialPluginRepositories, ThirdPartyRepositories } from '../../../../src/data/pluginRepositories';
|
||||
|
||||
@@ -9,7 +9,7 @@ title: Branding
|
||||
|
||||
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.
|
||||
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/jellyfin) 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:
|
||||
|
||||
|
||||
@@ -22,18 +22,18 @@
|
||||
"test:web-urls": "node ./scripts/check-urls.mjs ./scripts/data/jellyfin-web-urls.json"
|
||||
},
|
||||
"dependencies": {
|
||||
"@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",
|
||||
"@docusaurus/core": "3.10.1",
|
||||
"@docusaurus/plugin-client-redirects": "3.10.1",
|
||||
"@docusaurus/plugin-content-blog": "3.10.1",
|
||||
"@docusaurus/plugin-content-docs": "3.10.1",
|
||||
"@docusaurus/plugin-content-pages": "3.10.1",
|
||||
"@docusaurus/plugin-sitemap": "3.10.1",
|
||||
"@docusaurus/plugin-svgr": "3.10.1",
|
||||
"@docusaurus/theme-classic": "3.10.1",
|
||||
"@docusaurus/theme-mermaid": "3.10.1",
|
||||
"@easyops-cn/docusaurus-search-local": "0.55.1",
|
||||
"@fontsource/noto-sans": "5.2.10",
|
||||
"@icons-pack/react-simple-icons": "13.8.0",
|
||||
"@icons-pack/react-simple-icons": "13.13.0",
|
||||
"@img-comparison-slider/react": "8.0.2",
|
||||
"@mdi/js": "7.4.47",
|
||||
"@mdi/react": "1.6.1",
|
||||
@@ -44,9 +44,9 @@
|
||||
"file-loader": "6.2.0",
|
||||
"react": "18.3.1",
|
||||
"react-dom": "18.3.1",
|
||||
"sass": "1.97.2",
|
||||
"swiper": "12.0.3",
|
||||
"ua-parser-js": "2.0.7",
|
||||
"sass": "1.99.0",
|
||||
"swiper": "12.1.4",
|
||||
"ua-parser-js": "2.0.9",
|
||||
"url-loader": "4.1.1"
|
||||
},
|
||||
"browserslist": {
|
||||
@@ -62,27 +62,29 @@
|
||||
]
|
||||
},
|
||||
"devDependencies": {
|
||||
"@docusaurus/module-type-aliases": "3.9.2",
|
||||
"@docusaurus/tsconfig": "3.9.2",
|
||||
"@eslint/js": "9.39.2",
|
||||
"@types/react": "18.3.27",
|
||||
"@docusaurus/module-type-aliases": "3.10.1",
|
||||
"@docusaurus/tsconfig": "3.10.1",
|
||||
"@eslint/js": "9.39.4",
|
||||
"@types/react": "18.3.28",
|
||||
"@types/react-helmet": "6.1.11",
|
||||
"@types/react-router-dom": "5.3.3",
|
||||
"eslint": "9.39.2",
|
||||
"caniuse-lite": "1.0.30001792",
|
||||
"cspell": "10.0.0",
|
||||
"eslint": "9.39.4",
|
||||
"eslint-config-prettier": "10.1.8",
|
||||
"eslint-plugin-import": "2.32.0",
|
||||
"eslint-plugin-jsx-a11y": "6.10.2",
|
||||
"eslint-plugin-n": "17.23.1",
|
||||
"eslint-plugin-prettier": "5.5.4",
|
||||
"eslint-plugin-promise": "7.2.1",
|
||||
"eslint-plugin-n": "17.24.0",
|
||||
"eslint-plugin-prettier": "5.5.5",
|
||||
"eslint-plugin-promise": "7.3.0",
|
||||
"eslint-plugin-react": "7.37.5",
|
||||
"eslint-plugin-react-hooks": "7.0.1",
|
||||
"globals": "17.0.0",
|
||||
"markdownlint-cli": "0.47.0",
|
||||
"eslint-plugin-react-hooks": "7.1.1",
|
||||
"globals": "17.6.0",
|
||||
"markdownlint-cli": "0.48.0",
|
||||
"node-fetch": "3.3.2",
|
||||
"prettier": "3.7.4",
|
||||
"typescript": "5.9.3",
|
||||
"typescript-eslint": "8.52.0",
|
||||
"prettier": "3.8.3",
|
||||
"typescript": "6.0.3",
|
||||
"typescript-eslint": "8.59.2",
|
||||
"typescript-plugin-css-modules": "5.2.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,486 @@
|
||||
aabc
|
||||
abled
|
||||
actionban
|
||||
actionunban
|
||||
addrepo
|
||||
airsafter
|
||||
airsbefore
|
||||
alac
|
||||
albumartistsort
|
||||
allports
|
||||
alpn
|
||||
analyzeduration
|
||||
AniDB
|
||||
AniList
|
||||
anthonylavado
|
||||
apiclient
|
||||
apsell
|
||||
archlinux
|
||||
armbian
|
||||
armhf
|
||||
asahi
|
||||
aspectratio
|
||||
aspm
|
||||
atsc
|
||||
audiodbalbumid
|
||||
audiodbartistid
|
||||
audiofin
|
||||
autoclean
|
||||
autoremove
|
||||
autoscans
|
||||
avhw
|
||||
avsd
|
||||
banip
|
||||
bantime
|
||||
barebones
|
||||
Battlemage
|
||||
BDMV
|
||||
behindthescenes
|
||||
blitter
|
||||
Blitter
|
||||
boxset
|
||||
Broadwell
|
||||
buildinfo
|
||||
cachedir
|
||||
Caddyfile
|
||||
candry
|
||||
cdart
|
||||
Celeron
|
||||
centurylinklabs
|
||||
certbot
|
||||
Certbot
|
||||
certificateresolvers
|
||||
certificatesresolvers
|
||||
certonly
|
||||
cewert
|
||||
CGNAT
|
||||
CHACHA
|
||||
Cheatsheet
|
||||
chevrotin
|
||||
chromecast
|
||||
Chromecast
|
||||
chronyd
|
||||
CIFS
|
||||
clearart
|
||||
clearlogo
|
||||
clinfo
|
||||
codenames
|
||||
codesign
|
||||
collectionnumber
|
||||
comskip
|
||||
configdir
|
||||
confs
|
||||
countrycode
|
||||
cpus
|
||||
criticrating
|
||||
crosstool
|
||||
cuda
|
||||
customrating
|
||||
customresponseheaders
|
||||
CUVID
|
||||
datasheet
|
||||
dateadded
|
||||
dden
|
||||
dearmor
|
||||
debuntu
|
||||
deinterlacing
|
||||
deletedscene
|
||||
DHLEVEL
|
||||
dhparams
|
||||
directio
|
||||
DISABLEFILELOCKING
|
||||
discart
|
||||
displayepisode
|
||||
displayorder
|
||||
displayseason
|
||||
distros
|
||||
dists
|
||||
dkanada
|
||||
dlna
|
||||
DNSPLUGIN
|
||||
Dockerfiles
|
||||
downmix
|
||||
Downmix
|
||||
downmixes
|
||||
downmixing
|
||||
dpkg
|
||||
DRTG
|
||||
druscoe
|
||||
drwxr
|
||||
DUCKDNSTOKEN
|
||||
DXVA
|
||||
elrc
|
||||
emby
|
||||
enddate
|
||||
enmod
|
||||
ETSI
|
||||
evermeet
|
||||
executionpolicy
|
||||
exposedbydefault
|
||||
EXTINF
|
||||
EXTM
|
||||
extradomains
|
||||
extrafanart
|
||||
extrepo
|
||||
failregex
|
||||
fanart
|
||||
fastcgi
|
||||
favorited
|
||||
fedor
|
||||
ferferga
|
||||
FFMPEGDIR
|
||||
ffprobe
|
||||
Fider
|
||||
findtime
|
||||
firewalld
|
||||
firmware
|
||||
firmwares
|
||||
flac
|
||||
Flathub
|
||||
Flix
|
||||
Floostream
|
||||
focuscontainer
|
||||
Fontawesome
|
||||
forwardfor
|
||||
Freccia
|
||||
Freenode
|
||||
frontpage
|
||||
fsbs
|
||||
ftab
|
||||
fullchain
|
||||
Geekbench
|
||||
Geforce
|
||||
geoblocking
|
||||
Geoip
|
||||
geolocation
|
||||
getent
|
||||
gifsicle
|
||||
Gotify
|
||||
gpedit
|
||||
GPGPU
|
||||
gstreamer
|
||||
HDHR
|
||||
Headend
|
||||
healthcheck
|
||||
hitsong
|
||||
hmac
|
||||
Homerun
|
||||
hostname
|
||||
hostnames
|
||||
hostwebclient
|
||||
hotfixes
|
||||
hotio
|
||||
hoverable
|
||||
hsbs
|
||||
hsts
|
||||
htab
|
||||
HTPC
|
||||
HTSP
|
||||
httpchallenge
|
||||
httpchk
|
||||
hwaccel
|
||||
imdb
|
||||
imdbid
|
||||
initscripts
|
||||
inotify
|
||||
ipban
|
||||
IPTV
|
||||
ircs
|
||||
irqs
|
||||
itid
|
||||
iwalton
|
||||
Izzy
|
||||
jeffbridges
|
||||
jellyfin
|
||||
JELLYFINDIR
|
||||
Jellyfins
|
||||
Jellyseer
|
||||
jfdiscord
|
||||
jftest
|
||||
jimdogx
|
||||
joshuaboniface
|
||||
journalctl
|
||||
jpegd
|
||||
jpege
|
||||
Kaby
|
||||
keyrings
|
||||
keyserver
|
||||
Kinopoisk
|
||||
Kitsu
|
||||
kodi
|
||||
Kodi
|
||||
Kribs
|
||||
kubernetescrd
|
||||
lastplayed
|
||||
Lavado
|
||||
lavfi
|
||||
ldconfig
|
||||
leresolver
|
||||
letsencrypt
|
||||
libc
|
||||
libera
|
||||
libmali
|
||||
libnvcuvid
|
||||
libnvidia
|
||||
libplacebo
|
||||
libva
|
||||
llvmpipe
|
||||
localappdata
|
||||
localtitle
|
||||
lockdata
|
||||
lockedfields
|
||||
logdir
|
||||
logfile
|
||||
logfiles
|
||||
logpath
|
||||
lshw
|
||||
LSIO
|
||||
lzma
|
||||
machinectl
|
||||
macvlan
|
||||
MAINPID
|
||||
Maxr
|
||||
maxretry
|
||||
Mbps
|
||||
mcarlton
|
||||
mediaserver
|
||||
mergerfs
|
||||
metaarchive
|
||||
metaimage
|
||||
metapackage
|
||||
metapackages
|
||||
Metapackages
|
||||
mintls
|
||||
mirrorbits
|
||||
mirrorinfo
|
||||
mirrorlist
|
||||
mirrorstats
|
||||
mirrorsync
|
||||
mkinitcpio
|
||||
mmdb
|
||||
mobi
|
||||
modeset
|
||||
mopidy
|
||||
mpaa
|
||||
mpvqt
|
||||
Multicore
|
||||
multiversion
|
||||
Multiview
|
||||
musicbox
|
||||
musicbrainzalbumartistid
|
||||
musicbrainzalbumid
|
||||
musicbrainzartistid
|
||||
musicbrainzreleasegroupid
|
||||
mycoolname
|
||||
myjellyfin
|
||||
myvideos
|
||||
nasm
|
||||
Navi
|
||||
ncmpcpp
|
||||
newbaseurl
|
||||
nftables
|
||||
Niels
|
||||
nielsvanvelzen
|
||||
nightlies
|
||||
Nightmode
|
||||
noarch
|
||||
noarchive
|
||||
noautorunwebapp
|
||||
nodesource
|
||||
nodistro
|
||||
noimageindex
|
||||
nonfree
|
||||
noninteractive
|
||||
Nontranscoded
|
||||
nosniff
|
||||
nosnippet
|
||||
notranslate
|
||||
nowebclient
|
||||
nssm
|
||||
NVDEC
|
||||
NVENC
|
||||
nvidiactl
|
||||
ocid
|
||||
ocsp
|
||||
offtopic
|
||||
OLDFILES
|
||||
Olivo
|
||||
OMDB
|
||||
onevpl
|
||||
OPTOUT
|
||||
originaltitle
|
||||
outros
|
||||
pacman
|
||||
Palinuro
|
||||
partnumber
|
||||
parttype
|
||||
𝘱𝘢𝘵𝘩
|
||||
PGID
|
||||
PGSSUB
|
||||
Pictureless
|
||||
playcount
|
||||
playerstats
|
||||
Powerline
|
||||
privkey
|
||||
probesize
|
||||
Profil
|
||||
PROGRAMDATA
|
||||
projectname
|
||||
providernameid
|
||||
publickey
|
||||
PUID
|
||||
Quadro
|
||||
QUIC
|
||||
Rabert
|
||||
Radarr
|
||||
radeon
|
||||
Radeon
|
||||
radeonsi
|
||||
radeontop
|
||||
RADV
|
||||
ratelimits
|
||||
rclone
|
||||
RDNA
|
||||
readthrough
|
||||
Realtek
|
||||
redir
|
||||
redirections
|
||||
redirector
|
||||
redirectscheme
|
||||
referer
|
||||
releasedate
|
||||
remoteip
|
||||
remux
|
||||
remuxed
|
||||
remuxing
|
||||
repofile
|
||||
rescan
|
||||
rffmpeg
|
||||
rgba
|
||||
rkmpp
|
||||
RKMPP
|
||||
rkrga
|
||||
rkvdec
|
||||
rkvenc
|
||||
Robibero
|
||||
rockchip
|
||||
Ronin
|
||||
rpmfusion
|
||||
RSSDP
|
||||
rsyncd
|
||||
Ryzen
|
||||
scrobble
|
||||
scrollbuttons
|
||||
scroller
|
||||
Scyfin
|
||||
seasonnumber
|
||||
secp
|
||||
secretfilter
|
||||
seekbar
|
||||
SEMA
|
||||
sendfile
|
||||
Serilog
|
||||
setsebool
|
||||
Shoko
|
||||
Shokofin
|
||||
shoutcast
|
||||
showtitle
|
||||
Skia
|
||||
skylake
|
||||
Skylake
|
||||
Sonarr
|
||||
sortname
|
||||
sorttitle
|
||||
soughtafter
|
||||
Spacetech
|
||||
spaghettified
|
||||
specifishity
|
||||
speedbumps
|
||||
splashscreen
|
||||
SSDP
|
||||
storebadge
|
||||
stripsecrets
|
||||
subcc
|
||||
subcomponents
|
||||
subfolders
|
||||
subheaders
|
||||
subpackages
|
||||
subteam
|
||||
sudoedit
|
||||
superfast
|
||||
Swiftfin
|
||||
synchronised
|
||||
syncplay
|
||||
sysconfig
|
||||
Sysoev
|
||||
systempaths
|
||||
tailnet
|
||||
Themerr
|
||||
thornbill
|
||||
Tigerlake
|
||||
timedatectl
|
||||
Tizen
|
||||
TMDB
|
||||
tmdbid
|
||||
tmpfs
|
||||
tonemapping
|
||||
triaging
|
||||
trickplay
|
||||
Trixie
|
||||
truenas
|
||||
TSIG
|
||||
TVDB
|
||||
tvdbid
|
||||
tvheadend
|
||||
tvrageid
|
||||
tvshow
|
||||
TXTT
|
||||
Ultrachromic
|
||||
ultrafast
|
||||
unban
|
||||
unbanip
|
||||
Uncorr
|
||||
unsynchronised
|
||||
Unsynchronized
|
||||
upvote
|
||||
usermod
|
||||
userns
|
||||
vaapi
|
||||
vainfo
|
||||
valhall
|
||||
Vasily
|
||||
vdpu
|
||||
Velzen
|
||||
Venson
|
||||
vepu
|
||||
veryfast
|
||||
veryslow
|
||||
videoid
|
||||
videotoolbox
|
||||
vitorsemeano
|
||||
Vium
|
||||
Vorbis
|
||||
VORBIS
|
||||
weba
|
||||
webclient
|
||||
webdir
|
||||
Weblate
|
||||
webroot
|
||||
Webroot
|
||||
Webstorm
|
||||
webui
|
||||
wheter
|
||||
withcolor
|
||||
withuserdata
|
||||
Wizdom
|
||||
wstunnel
|
||||
xattr
|
||||
Xbmc
|
||||
XMLTV
|
||||
xorg
|
||||
Xorg
|
||||
Xvolume
|
||||
xvzf
|
||||
ycbcr
|
||||
youruser
|
||||
yourusername
|
||||
@@ -13,7 +13,7 @@ const redirects: ClientRedirects.Options['redirects'] = [
|
||||
'/docs/general/server/media/subtitles.html',
|
||||
'/docs/general/server/media/external-files'
|
||||
],
|
||||
to: '/docs/general/server/media/movies#external-subtitles-and-audio-racks'
|
||||
to: '/docs/general/server/media/movies#external-subtitles-and-audio-tracks'
|
||||
},
|
||||
// Storage docs moved from the server guide to administrative docs
|
||||
{
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
import React from 'react';
|
||||
|
||||
import './ContactCard.scss';
|
||||
|
||||
const IrcCard = () => (
|
||||
<div className='card card--contact'>
|
||||
<div className='card__header'>
|
||||
<h3>IRC</h3>
|
||||
</div>
|
||||
<div className='card__body'>
|
||||
The official Matrix rooms are also bridged from Matrix to <a href='https://libera.chat'>Libera.chat</a> for
|
||||
convenience.
|
||||
<div className='alert alert--secondary margin-top--md'>
|
||||
<strong>NOTE:</strong> Matrix is the preferred chat platform. IRC is generally not recommended due to a lack of
|
||||
features and moderation controls.
|
||||
</div>
|
||||
<div className='container margin-top--md'>
|
||||
<div className='row'>
|
||||
<div className='col col--3 col--offset-3'>
|
||||
<h4>General Channels</h4>
|
||||
<ul>
|
||||
<li>
|
||||
<a href='ircs://irc.libera.chat:6697/#jellyfin'>#jellyfin</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href='ircs://irc.libera.chat:6697/#jellyfin-announce'>#jellyfin-announce</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href='ircs://irc.libera.chat:6697/#jellyfin-troubleshooting'>#jellyfin-troubleshooting</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href='ircs://irc.libera.chat:6697/#jellyfin-offtopic'>#jellyfin-offtopic</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href='ircs://irc.libera.chat:6697/#jellyfin-translate'>#jellyfin-translate</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div className='col col--3'>
|
||||
<h4>Development Channels</h4>
|
||||
<ul>
|
||||
<li>
|
||||
<a href='ircs://irc.libera.chat:6697/#jellyfin-documentation'>#jellyfin-documentation</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href='ircs://irc.libera.chat:6697/#jellyfin-dev'>#jellyfin-dev</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href='ircs://irc.libera.chat:6697/#jellyfin-dev-client'>#jellyfin-dev-client</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href='ircs://irc.libera.chat:6697/#jellyfin-dev-android'>#jellyfin-dev-android</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href='ircs://irc.libera.chat:6697/#jellyfin-dev-ios'>#jellyfin-dev-ios</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href='ircs://irc.libera.chat:6697/#jellyfin-vue'>#jellyfin-vue</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href='ircs://irc.libera.chat:6697/#jellyfin-dev-roku'>#jellyfin-dev-roku</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href='ircs://irc.libera.chat:6697/#jellyfin-dev-python'>#jellyfin-dev-python</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
export default IrcCard;
|
||||
@@ -84,7 +84,7 @@ export default function ContributorGuide() {
|
||||
{contributorOption === ContributorOption.Code && (
|
||||
<>
|
||||
<div className='margin-top--md'>
|
||||
There are a couple ways to get involved with Jellyfin depending on your skillset.
|
||||
There are a couple ways to get involved with Jellyfin depending on your skill set.
|
||||
</div>
|
||||
<div>
|
||||
<button
|
||||
@@ -467,7 +467,7 @@ export default function ContributorGuide() {
|
||||
|
||||
{otherOption === OtherOption.Troubleshoot && (
|
||||
<div className='margin-top--md'>
|
||||
We have a large and diverse userbase, with so many features that the combinations and configurations are
|
||||
We have a large and diverse user base, with so many features that the combinations and configurations are
|
||||
almost endless. But as a volunteer-run project, the contributors can often be limited in the help they can
|
||||
provide. If you are well-versed in Jellyfin's operation, we welcome you to try to help troubleshoot
|
||||
problems your fellow users are having. Troubleshooting generally occurs in our{' '}
|
||||
|
||||
@@ -4,14 +4,8 @@
|
||||
padding: 24pt 0;
|
||||
}
|
||||
|
||||
.landing-section:first-child {
|
||||
border-top: 1px solid #eee;
|
||||
}
|
||||
|
||||
.landing-section:nth-child(even) {
|
||||
background-color: #172138;
|
||||
border-top: 1px solid #eee;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
|
||||
.landing-section:last-child {
|
||||
|
||||
@@ -6,8 +6,12 @@
|
||||
*/
|
||||
|
||||
html {
|
||||
-moz-font-feature-settings: 'liga' on;
|
||||
font-feature-settings: 'liga';
|
||||
/* Note: "normal" activates all common ligatures */
|
||||
font-variant-ligatures: normal;
|
||||
}
|
||||
|
||||
code {
|
||||
font-variant-ligatures: none;
|
||||
}
|
||||
|
||||
:root {
|
||||
|
||||
@@ -121,5 +121,21 @@ export const ThirdPartyRepositories: Array<PluginRepository> = [
|
||||
includes: {
|
||||
'WizdomSubs Downloader': 'https://github.com/DeDuplicate/Jellyfin_wizdomsubs_downloader'
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'gh:GeiserX/smart-covers',
|
||||
name: "GeiserX's SmartCovers Repo",
|
||||
url: 'https://geiserx.github.io/smart-covers/manifest.json',
|
||||
includes: {
|
||||
SmartCovers: 'https://github.com/GeiserX/smart-covers'
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'gh:GeiserX/whisper-subs',
|
||||
name: "GeiserX's WhisperSubs Repo",
|
||||
url: 'https://geiserx.github.io/whisper-subs/manifest.json',
|
||||
includes: {
|
||||
WhisperSubs: 'https://github.com/GeiserX/whisper-subs'
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
@@ -1,16 +1,13 @@
|
||||
import Layout from '@theme/Layout';
|
||||
import React, { useState } from 'react';
|
||||
import React from 'react';
|
||||
|
||||
import DiscordCard from '../components/contact/DiscordCard';
|
||||
import IrcCard from '../components/contact/IrcCard';
|
||||
import MatrixCard from '../components/contact/MatrixCard';
|
||||
import ForumCard from '../components/contact/ForumCard';
|
||||
import TwitterCard from '../components/contact/TwitterCard';
|
||||
import MastodonCard from '../components/contact/MastodonCard';
|
||||
|
||||
export default function Contact() {
|
||||
const [isOtherChatVisible, setOtherChatVisible] = useState(false);
|
||||
|
||||
return (
|
||||
<Layout title='Contact'>
|
||||
<h1 className='text--center margin-top--lg'>Contact</h1>
|
||||
@@ -30,25 +27,6 @@ export default function Contact() {
|
||||
<DiscordCard />
|
||||
</div>
|
||||
</div>
|
||||
<div className='row'>
|
||||
<div className='col margin-bottom--md text--center'>
|
||||
<button
|
||||
className='button button--sm button--secondary button--outline'
|
||||
onClick={() => {
|
||||
setOtherChatVisible(!isOtherChatVisible);
|
||||
}}
|
||||
>
|
||||
Other
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
{isOtherChatVisible && (
|
||||
<div className='row'>
|
||||
<div className='col col--12 margin-bottom--md'>
|
||||
<IrcCard />
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
<div className='row'>
|
||||
<div className='col'>
|
||||
<h2>Social</h2>
|
||||
|
||||
@@ -13,13 +13,14 @@ import { UAParser } from 'ua-parser-js';
|
||||
import styles from './index.module.scss';
|
||||
import ExternalLinkIcon from '@theme/Icon/ExternalLink';
|
||||
|
||||
export default function DownloadsPage({ osType }: { osType?: OsType }) {
|
||||
export default function DownloadsPage(options: { osType?: OsType }) {
|
||||
const [isStableLinks, setIsStableLinks] = useState<boolean>(true);
|
||||
const [isStableHelpVisible, setIsStableHelpVisible] = useState<boolean>(false);
|
||||
const [activeButton, setActiveButton] = useState<string>();
|
||||
|
||||
const isBrowser = useIsBrowser();
|
||||
|
||||
let osType = options.osType;
|
||||
if (isBrowser && osType === undefined) {
|
||||
const parser = new UAParser(navigator.userAgent);
|
||||
const os = parser.getOS();
|
||||
@@ -139,13 +140,12 @@ export default function DownloadsPage({ osType }: { osType?: OsType }) {
|
||||
{isStableHelpVisible && (
|
||||
<Admonition type='tip' title='Stable or Unstable?'>
|
||||
<p>
|
||||
Generally, if you're a new user or don't want your server to change often, use the Stable version.
|
||||
If you want to help test the latest improvements and features and can handle some occasional breakage,
|
||||
use the Unstable version. New Unstable releases are published Weekly on Monday mornings (~05:00 UTC).
|
||||
NOTE: Always back up your existing configuration before testing Unstable releases as there is NO
|
||||
DOWNGRADE PATH; you must restore your Stable configuration from a backup.
|
||||
|
||||
For more details, [please see this documentation](/docs/general/testing/upgrading-and-downgrading).
|
||||
Generally, if you're a new user or don't want your server to change often, use the Stable
|
||||
version. If you want to help test the latest improvements and features and can handle some occasional
|
||||
breakage, use the Unstable version. New Unstable releases are published Weekly on Monday mornings
|
||||
(~05:00 UTC). NOTE: Always back up your existing configuration before testing Unstable releases as there
|
||||
is NO DOWNGRADE PATH; you must restore your Stable configuration from a backup. For more details,
|
||||
[please see this documentation](/docs/general/testing/upgrading-and-downgrading).
|
||||
</p>
|
||||
</Admonition>
|
||||
)}
|
||||
|
||||
@@ -28,7 +28,9 @@ export default function Home() {
|
||||
Download Now
|
||||
</Link>
|
||||
</div>
|
||||
<p><a href="/docs/general/community-standards/servers">Note: We do not run servers for users.</a></p>
|
||||
<p>
|
||||
<a href='/docs/general/community-standards/servers'>Note: We do not run servers for users.</a>
|
||||
</p>
|
||||
</Hero>
|
||||
<main>
|
||||
<HomepageFeatures />
|
||||
|
||||
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 141 KiB After Width: | Height: | Size: 166 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 24 KiB |