Skip to content

Jellyfin🔗

Jellyfin on tasuta meediasüsteem, mis annab teile kontrolli oma meedia haldamise ja voogedastuse üle. See on alternatiivne Emby-le ja Plex-ile, pakkudes meediat pühendatud serverist lõppkasutaja seadmetesse mitme rakenduse kaudu

Lisaks on kasutusel Proxmox host käest edasi jagatud AMD iGPU, et oleks parem Trickplay genereerimise aeg ja, et see kasutaks vähem CPU.
Saab ka sama juhendit kasutada ka dGPU edastamiseks LXCsse.

Seadistus🔗

Jellyfin Compose fail
# Jellyfin
jellyfin:
    image: lscr.io/linuxserver/jellyfin:latest
    container_name: jellyfin
    devices:
    - /dev/dri/renderD128:/dev/dri/renderD128 # AMD iGPU proxmox host käest
    environment:
    - PUID=0
    - PGID=0
    - TZ=Europe/Tallinn
    group_add:
    - "108" # render group
    - "44" # video group, ei map-i 'video' gruppi hostist LXC-sse, kuna transkoodimiseks on peamiselt vaja 'render' gruppi. Dockeris 'video' grupi lisamine on igaks juhuks, kuid ligipääs 'card' seadmetele võib olla piiratud."
    volumes:
    - ./jellyfin:/config
    - ./media/movies:/movies
    - ./media/tv-shows:/tv-shows
    ports:
    - 8096:8096
    cpus: '2.0' # et sitt ei tapaks kogu LXC ära kui ffprobe v library scan jookseb...
    mem_limit: 5G # mem limit, et cache ei kasvaks lõpmatuseni
    restart: unless-stopped

GPU kasutamine🔗

Kõigepealt mainin, et tegemist on unprivileged LXC-ga.

Proxmox host🔗

Kontrolli kas proxmox saab AMD iGPU kätte:
lspci -nnk | grep -EA3 'VGA|3D|Display'
Siin võiks kuvada, et kasutab driver amdgpu.

Vaata mis seadme faili nimi on:
ls -l /dev/dri

Failid mis algavad õiguste tabelis C... ja on gruppidega render ja video on õiged asjad.
renderD128 võiks olla faili nimi kui muid GPUsid ei ole ühendatud:

# ls -l /dev/dri
total 0
drwxr-xr-x 2 root root         80 Mar  8 00:40 by-path
crw-rw---- 1 root video  226,   1 Mar  8 02:06 card1
crw-rw-rw- 1 root render 226, 128 Mar  8 00:40 renderD128

Installi draiverid:
apt update
apt install mesa-va-drivers vainfo -y

Kui tegemist mingi vana seadmega, siis võibolla on vajalik installida ka va-driver-all.

Kontroll:
vainfo --display drm --device /dev/dri/renderD128
Piisaks ka lihtsalt vainfo, aga kui tegemist headless serveriga, siis see on parem.
NB! Vajab tegelt restart teha peale installi, sest enne ei pruugi kuvada korrektset infot, aga selle sammu võib viimaseks jätta.

Nii proxmox host kui ka LXC masinas saa 'render' gruppi id:
getent group render
Proxmox sai 104
LXC sai 108

NB! Asenda need numbrid oma getent group render väljundiga!

Lisa proxmox-i root kasutajal õigus kaardistada hosti GID 104 konteinerisse:
echo "root:104:1" >> /etc/subgid Kui see rida juba olemas on, ei tohi seda duplikeerida.
Saad kontrollida:
grep root /etc/subgid

Gruppi ID-de põhjal lisa lxc id.conf faili järgmine info: nano /etc/pve/lxc/sinu_lxc_id.conf

# --- GPU Passthrough Configuration ---
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file

# Example with the whole folder passed through, not used because file mount is more precise and safer.
# lxc.cgroup2.devices.allow: c 226:* rwm
# lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir

# --- ID Mapping for Host(104) to LXC(108) ---
lxc.idmap: u 0 100000 65536

# 1. Map Container GIDs 0-107 to Host 100000-100107
lxc.idmap: g 0 100000 108

# 2. Map Container GID 108 (render) to Host GID 104 (render)
lxc.idmap: g 108 104 1

# 3. Map Container GIDs 109-65535 to Host 100109-165535
lxc.idmap: g 109 100109 65427

Jellyfin LXC🔗

installi draiverid:
apt update
apt install mesa-va-drivers vainfo -y

Saa 'video' gruppi id:
getent group video
Debian/Ubuntu puhul on video tavaliselt 44

Lisa compose faili jellyfin-ile juurde devices ja group_add:

devices:
      - /dev/dri:/dev/dri
group_add:
      - "108" # render group
      - "44" # video group, ei map-i 'video' gruppi hostist LXC-sse, kuna transkoodimiseks on peamiselt vaja 'render' gruppi. Dockeris 'video' grupi lisamine on igaks juhuks, kuid ligipääs 'card' seadmetele võib olla piiratud."

Tee LXC-le restart, draiveri install nõuab seda.

Kontrolli kas töötab:
docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/vainfo --display drm --device /dev/dri/renderD128
Kui kuvab erinevaid codec-e, siis korras.

Kui tahad 100% kindel olla, siis lae alla radeontop rakendus Proxmox peale ja pane Jellyfin-is Trickplay või Transcode jooksma ja Proxmox shell-i sisesta:
radeontop

Jellyfin WebUI🔗

Transcoding🔗

Mine jellyfin-is Dashboard > Playback > Transcoding
Lülita sisse Hardware acceleration ja vali VAAPI

VAAPI seadmeks vali renderD128 ja lülita sisse kõik codec-id mida seade toetab
Enamus tänapäevased seadmed peaks toetama kõike. AV1 tugi on olemas vaid uuematel (RDNA2/3 arhitektuuriga) kaartidel.

Pane linnuke "Enable hardware encoding" ette

Muid sätteid ma ei näppinud, aga võid:
Testida ja võibolla muuta H.265 / 264 CRF numbrit madalamaks
Linnuke panna "Allow subtitle extraction on the fly" sisse lülitada

Trickplay🔗

Mine Jellyfin-is Dashboard > Playback > Trickplay

Lülita sisse esimesed kahele linnukese kasti:
"Enable hardware decode"
"Enable hardware accelerated MJPEG encoding"

Lisaks võid panna linnukese järgmisse kasti ka kui tahad, et asi liiguks kiiremini kui sul on väga palju filme/saateid
"Only generate images from key frames"

Kõige alla soovitan ka muuta "FFmpeg Thread" numbrit
Mul on LXC-le antud 8 lõimu ja Jellyfin-ile antud 2 tuuma (mis peaks kaasama ka lõimud ehk kokku 4 lõimu?)
Kui jätab selle 0 peale, siis see kasutab kõike mis kätte saab ja võib tõmmata LXC umbe

Troubleshoot🔗

Kui millegipärsat ei tööta, siis proovi järgmisi soovitusi

  1. Anna õigus ligipääsuks (ma tegele ei ole kindel kas see on vajalik):
    chmod 666 /dev/dri/renderD128
  2. Kui proxmox ei taha iGPU kasutada, siis võib aidata kui lisad amdgpu modules conf faili:
    echo "amdgpu" >> /etc/modules-load.d/amdgpu.conf
    Või kui sa ei ole root kontoga:
    sudo sh -c 'echo "amdgpu" >> /etc/modules-load.d/amdgpu.conf'
    Peale resa võiks lspci käsk kuvada "kernel driver in use: amdgpu"
  3. I dunno :)

Jellyfin webui kaudu🔗

Doc pooleli

Lisa conf rakenduses endas🔗

Custom CSS sätted🔗

Loe enne

Custom CSS-id võivad pidevalt katki minna
Kui on mingi viga siis enamus ajast lehe või rakenduse refresh teeb korda

Backdrops teeb ilusamaks

Peab olema sisse lülitatud üks kontopõhine säte! Töötab ka ilma, aga nii on palju ilusam
Settings > Display > Libraries > Backdrops
Kuna see on veits buggy säte mis lülitab iseennast välja vahest, siis kasutan pluginat selle force-imiseks

Abyss-Jellyfin

Projekt siin - https://github.com/AumGupta/abyss-jellyfin
Aga customisation tehtud tema veebilehe abiga - https://aumgupta.github.io/abyss-jellyfin/#customise

@import url('https://cdn.jsdelivr.net/gh/AumGupta/abyss-jellyfin@main/abyss.css');

/* Accent colour 
   Format: R, G, B  (no rgb() wrapper)
   Used for highlights, active states, progress bars. */
:root {
    --abyss-accent:    255, 100, 120;
    --abyss-radius:    12px;
    --abyss-indicator: 55, 55, 55;
}

/* Custom font: Import any Google Font and override body. */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap');

body {
    font-family: "Inter", sans-serif;
}

Alternatiivid🔗
Ultrachromic

CSS võetud siit > https://github.com/CTalvio/Ultrachromic ja lisasin ka mõne enda muudatuse:

/* Ultrachromic by CTalvio */

/* Recommended */
@import url('https://cdn.jsdelivr.net/gh/CTalvio/Ultrachromic/fixes.css');
@import url('https://cdn.jsdelivr.net/gh/CTalvio/Ultrachromic/jf_font.css');

/* Required */
@import url('https://cdn.jsdelivr.net/gh/CTalvio/Ultrachromic/base.css');
@import url('https://cdn.jsdelivr.net/gh/CTalvio/Ultrachromic/accentlist.css');

/* Rounding */
@import url('https://cdn.jsdelivr.net/gh/CTalvio/Ultrachromic/rounding.css');

/* Smaller cast list */
@import url('https://cdn.jsdelivr.net/gh/CTalvio/Ultrachromic/smallercast.css');

/* Compact episode list */
@import url('https://cdn.jsdelivr.net/gh/CTalvio/Ultrachromic/episodelist/episodes_grid.css');

/* Transparent top bar */
@import url('https://cdn.jsdelivr.net/gh/CTalvio/Ultrachromic/header/header_transparent.css');

/* Login screen */
@import url('https://cdn.jsdelivr.net/gh/CTalvio/Ultrachromic/login/login_minimalistic.css');

/* Input fields */
@import url('https://cdn.jsdelivr.net/gh/CTalvio/Ultrachromic/fields/fields_border.css');

/* Watched / Unwatched indicators */
@import url('https://cdn.jsdelivr.net/gh/CTalvio/Ultrachromic/cornerindicator/indicator_corner.css');

/* Skin type */
@import url('https://cdn.jsdelivr.net/gh/CTalvio/Ultrachromic/type/dark_withaccent.css');

/* Title page */
@import url('https://cdn.jsdelivr.net/gh/CTalvio/Ultrachromic/titlepage/title_banner-logo.css');

/* Progress bar */
@import url('https://cdn.jsdelivr.net/gh/CTalvio/Ultrachromic/progress/floating.css');

/* Style backdrop (personal: removed blur) */
.backdropImage {filter: saturate(120%) contrast(120%) brightness(40%);}

/* Login background not used because the image is 1080p, jellyfin will not handle it well */

/* Accent and roundingd */
:root {--accent: 98, 121, 205;}
:root {--rounding: 12px;}

/* Remove the gay ass play button from the middle of the image!!! */
.cardOverlayButton.cardOverlayButton-hover.itemAction.paper-icon-button-light.cardOverlayFab-primary,
.listItemImageButton.itemAction.paper-icon-button-light{
     display:none;
}
Elegant fin

CSS võetud siit - https://github.com/lscambo13/ElegantFin

/* Elegantin Skin */
@import url("https://cdn.jsdelivr.net/gh/lscambo13/ElegantFin@main/Theme/ElegantFin-jellyfin-theme-build-latest-minified.css");

/* Elegantin Media Bar Plugin */
@import url("https://cdn.jsdelivr.net/gh/lscambo13/ElegantFin@main/Theme/assets/add-ons/media-bar-plugin-support-latest-min.css");

/* Material Icon for LG + Some other Effects like Hover Change Layout of button.. */
:root{
--overlayPlayButtonPosition: 50%;
--cardHoverEffect: none;
--extraCardButtonsVisibility: block;
--iconPack: 'Material Icons';
}

Pluginad🔗

Plugin repod🔗

Pluginad mida ma kasutan nõuavad neid reposid:
Jellyfin Stable (official pluginad):
https://repo.jellyfin.org/files/plugin/manifest.json
File Transformation plugin (vajalik):
https://www.iamparadox.dev/jellyfin/plugins/manifest.json
Jellyfin-enhanced (nõuab vajalikku pluginat):
https://github.com/n00bcodr/Jellyfin-Enhanced
Jellyfin Tweaks (Force Enable Backdrops jaoks kasutan):
https://raw.githubusercontent.com/n00bcodr/JellyfinTweaks/main/manifest.json

Pluginad mida installida🔗
  • General

    • Chapter Segments Provider
    • Custom Tabs
    • DLNA - ei tea kas tegelt vajalik
    • File Transformation
    • Home Screen Sections
    • Jellyfin Tweaks
    • JellyfinEnhanced
    • Kodi Sync Queue
    • Media Bar
    • Playback Reporting
    • Plugin Pages
    • Reports
    • Session Cleaner
    • Simkl - valikuline, tracking service
    • Trakt - valikuline, tracking service
    • Transcode Killer
  • Metadata

    • AniDB
    • AniList
    • AniSearch
    • Artwork
    • Fanart
    • Kitsu
    • Open Subtitles - Nõuab kontot, asendatud Bazarr-iga
    • TMDb Box Sets
    • Tvmaze
    • TheTBDB
Pluginate seadistamine (tähestiku järjekorras)🔗
  • AniDB
    AniDB_settings
  • AniList
    AniList_settings
  • AniSearch
    AniSearch_settings
  • Custom Tabs
    Display Text:
    > Requests
    HTML content:
    <iframe src="https://request.timmo.ee" style="width: 100%; height: 100%; border: none; position: absolute; top: 0; left: 0;"></iframe>
    
  • Jellyfin Tweaks
    Jellyfin_Teaks_settings
  • OMDb
    Lülita sisse
  • Open Subtitles
    Kontot vaja kui tahad nende käest sube alla laadida, aga ma kasutan nüüd Bazarr
  • Session Cleaner
    30 päeva
  • TheTVDB
    TheTVDB_settings
  • Transcode Killer
    Muutsin 1x1 reso peale, võibolla aitab sellega kui läheb transcode tööle isegi kui ei tohiks