Przejdź do treści
fansuby

API / Poradniki

Automatyzacja z Jellyfinem

Skrypt dociąga polskie napisy do odcinków w Twojej bibliotece, a potem prosi Jellyfina o odświeżenie, żeby od razu je zobaczył.

  • 10 minut
  • Python 3
  • klucz API
  • Jellyfin
Skrypt korzysta z fansuby_sub.py z poradnika Napisy do jednego pliku wideo. Trzymaj oba pliki w jednym katalogu.

Jak to się łączy

Jellyfin rozpoznaje zewnętrzne napisy po nazwie: plik Odcinek.pl.srt obok Odcinek.mkv pojawia się w odtwarzaczu jako polskie napisy. Nasz skrypt zapisuje je właśnie tak. Jellyfin musi tylko przeskanować bibliotekę, i to załatwia jedno wywołanie jego API na końcu.

Czego potrzebujesz

  • Pythona 3.9+ z biblioteką requests na maszynie, która widzi katalog z anime.
  • Klucza API fansuby.
  • Klucza API Jellyfina: panel administracyjny, Zaawansowane, Klucze API, nowy klucz. Nazwij go np. „fansuby”.
  • Odcinków z nazwami w postaci Tytuł - 05.mkv.

Zrób to

  1. Krok 1: Ustaw klucze i adres Jellyfina

    Terminal
    export FANSUBY_KEY="fsb_…"
    export JELLYFIN_URL="http://localhost:8096"
    export JELLYFIN_KEY="…"

    Klucz utworzysz w ustawieniach konta. W PowerShellu wpisz $env:FANSUBY_KEY="fsb_…".

  2. Krok 2: Zapisz skrypt

    Wklej kod do pliku fansuby_jellyfin.py.

    fansuby_jellyfin.py
    #!/usr/bin/env python3
    """Uzupełnia polskie napisy w katalogu z anime i odświeża bibliotekę Jellyfina."""
    import os
    import sys
    import time
    from pathlib import Path
    
    import requests
    
    from fansuby_sub import fetch_for
    
    JELLYFIN = os.environ["JELLYFIN_URL"].rstrip("/")  # np. http://localhost:8096
    VIDEO = {".mkv", ".mp4", ".avi"}
    
    downloaded = 0
    for video in sorted(Path(sys.argv[1]).rglob("*")):
        if video.suffix.lower() not in VIDEO:
            continue
        result = fetch_for(video)
        if result.startswith("pobrano"):
            downloaded += 1
            print(f"{video.name}: {result}")
            time.sleep(2.5)  # pobieranie ma limit 30 plików na minutę
    
    if downloaded:
        refresh = requests.post(
            f"{JELLYFIN}/Library/Refresh",
            headers={"X-Emby-Token": os.environ["JELLYFIN_KEY"]},
            timeout=15,
        )
        refresh.raise_for_status()
        print(f"Odświeżono Jellyfina (nowych napisów: {downloaded})")
    else:
        print("Nic nowego")
  3. Krok 3: Uruchom go na katalogu biblioteki

    Podaj ten sam katalog, który Jellyfin ma w bibliotece, tak jak widzi go maszyna ze skryptem. Jeśli Jellyfin działa w Dockerze, chodzi o ścieżkę na hoście, nie wewnątrz kontenera.

    Terminal
    python3 fansuby_jellyfin.py /media/anime
    Wynik
    [Erai-raws] Sousou no Frieren - 01 [720p].mkv: pobrano (Erai-raws, srt)
    [SubsPlease] Jujutsu Kaisen - 01 (1080p) [AB12CD34].mkv: pobrano (SubsPlease, srt)
    Odświeżono Jellyfina (nowych napisów: 2)

    Przy następnym uruchomieniu skrypt pominie odcinki, które mają już napisy, i nie będzie niepotrzebnie odświeżał Jellyfina.

  4. Krok 4: Puszczaj go regularnie

    Raz dziennie wystarczy. Na Linuksie wpis w crontabie:

    crontab -e
    0 4 * * * FANSUBY_KEY=fsb_… JELLYFIN_URL=http://localhost:8096 JELLYFIN_KEY=… python3 /opt/fansuby/fansuby_jellyfin.py /media/anime >> /var/log/fansuby.log 2>&1

Warto wiedzieć

W odtwarzaczu włącz napisy z listy: pojawią się jako zewnętrzne, po polsku. Jeśli nie widać ich od razu, odśwież stronę klienta albo poczekaj chwilę na koniec skanowania.
Przy remisie serwer woli napisy ASS, bo mają pełne style. Część klientów Jellyfina wypala je wtedy w obrazie, co obciąża serwer. Jeśli to problem, dopisz do zapytania w fansuby_sub.py parametr "format": "srt". Szczegóły w poradniku Jak wybrać napisy.
Klucze trzymaj w crontabie lub pliku z uprawnieniami tylko dla Ciebie. Do tego zadania zrób osobne klucze w fansuby i w Jellyfinie, żeby w razie czego usunąć je bez ruszania reszty.

Co dalej

↑↓ wybórEnter otwórz