They said it can't be done, so I just did it!
Szenario
Nach einer Windows 10 Neuinstallation wurden bei mir die Laufwerkbuchstaben geändert und meine Medienbibliothek war plötzlich auf einem anderen Laufwerk. Jellyfin konnte darauf nicht mehr zugreifen und ich hätte alles neu konfigurieren bzw. scannen müssen.
Da ich die Benutzer und deren Daten nicht verlieren wollte, suchte ich nach einer Lösung im Netz und fand nur so ein paar Schnippsel (vorallem "Das geht nicht/ist kompliziert!") aber keine konkreten Antworten.
Nach ein bisschen hin und her überlegen, hatte ich eine Idee wie man das bewerkstelligen könnte. Jellyfin scheint zwar ziemlich chaotisch organisiert aber dennoch relativ einfach strukturiert zu sein. Es basiert auf .xml
-Steuerungsdateien und ein paar SQLite Datenbanken (wobei aber für dieses Szenario nur die data\library.db
benötig wird).
Wie es bei der Linux bzw. Docker Version von Jellyfin mit den Pfaden aussieht kann ich nicht beurteilen, aber ich denke, das Prinzip kann auch dort angewendet werden.
Das Prinzip funktioniert auch falls man seine Medienbibliothek neu strukturieren möchte, man muss dann halt die Pfade präziser angeben.
Wichtig: den doppelbackslash \\
beim Datenbankfeld data
nicht vergessen, da dies json-Daten sind!
Benötigte Hilfsmittel
Keine Angst, es braucht hier keine komplizierten Befehle oder exotische Programme!
Nachfolgend die beiden Programme die ich dazu benötigt habe (die sollten beide installiert sein):
Vorgehen
Vor Beginn muss der Jellyfin Server heruntergefahren werden falls dies nicht eh schon der Fall ist.
Anmerkung: Da ich gleichzeitig auch noch von der Installer/Service Version von Jellyfin auf die manuelle/portable Version umgestiegen bin, musste ich diese Verzeichnisse ebenfalls anpassen!
Da dieser Punkt zwingend als erstes ausgeführt werden muss habe ich ihn auch als erstes in dieser Anleitung aufgeführt.
Falls Du nur die Medienbibliothek anpassen willst/musst, kannst Du diesen Punkt überspringen.
Ich werde in dieser Anleitung meine Pfade und Verzeichnisse verwenden. Diese sind wie folgt:
- Altes Server
data
Verzeichnis:F:\Jellyfin
- Neues Server
data
Verzeichnis:G:\Jellyfin\data
- Altes Medien Verzeichnis:
F:\Toshiba
(weil ich vor Jellyfin meine Medienbibliothek auf einer externen Toshiba gespeichert hatte) - Neues Medien Verzeichnis:
E:\Toshiba
Für das Suchen und Ersetzen in den Dateien benutze ich Npp. Dort kann man nämlich Arbeitsbereiche (Verzeichnisse) definieren die dann Durchsuchbar sind.
Dazu lade ich das Jellyfin data
Verzeichnis als Arbeitsbereich in Npp. Dies ist das Verzeichnis in dem sich alle Unterordner wie cache
, config
, data
, etc. befinden.
Achtung: bevor man irgendwas ändert sollte man ein Backup davon machen!
Dazu geht man in Npp auf den Menüpunkt Datei
, wählt dann Verzeichnis als Arbeitsbereich öffnen...
und wählt das entsprechende Verzeichnis aus.
Dadurch öffent sich auf der rechten Seite eine neue Spalte in der der Verzeichnisbaum geladen ist.
Mit einem Rechtsklick auf den Ordner den man durchsuchen möchte öffent sich ein Kontext-Menü wo man In Dateien suchen...
auswählt.
Für das Ersetzen der Datenbankeinträge öffnet man die Datenbank data\library.db
im SQLite Browser
Server
Für das Suchen und Ersetzen des Server Pfads habe ich folgendes in die Suchmaske eingegeben:
- Suchen nach:
F:\Jellyfin
- Ersetzen durch:
G:\Jellyfin\data
- Filter:
!*.db !*.log
Der Filter ist wichtig da sonst auch gefundene Einträge in den *.db
und *.log
Dateien ersetzt werden!
Anschliessend klickt man auf Ersetzen in Dateien
. Dieser Vorgang kann einige Zeit in anspruch nehmen.
In dieser Zeit kann man die Datenbank Einträge anpassen.
Dazu klickt man im SQLite Browser auf die Registerkarte SQL ausführen
in der geöffneten Datenbank (siehe oben) und gibt folgendes ein:
UPDATE TypedBaseItems
SET data = REPLACE(data, 'F:\\Jellyfin', 'G:\\Jellyfin\\data')
WHERE data LIKE '%F:\\Jellyfin%';
Anschliessend führt man das Query mit einem klick auf das "Play"-Symbol aus.
Dies ist aber nur die halbe Arbeit. Man muss auch noch dieses Query ausführen:
UPDATE TypedBaseItems
SET Path = REPLACE(Path, 'F:\Jellyfin', 'G:\Jellyfin\data')
WHERE Path LIKE 'F:\Jellyfin%';
Um zu überprüfen ob alles geklappt hat, kann man mit den folgenden Queries nach den neuen Einträgen (und natürlich auch nach den alten) suchen:
SELECT * FROM TypedBaseItems WHERE "data" LIKE '%G:\\Jellyfin\\data%';
SELECT * FROM TypedBaseItems WHERE "Path" LIKE 'G:\Jellyfin\data%';
Medien
Für das Suchen und Ersetzen des Medien Pfads habe ich folgendes in die Suchmaske eingegeben:
- Suchen nach:
F:\Toshiba
- Ersetzen durch:
E:\Toshiba
- Filter:
!*.db !*.log
Der Filter ist wichtig da sonst auch gefundene Einträge in den *.db
und *.log
Dateien ersetzt werden!
Anschliessend klickt man auf Ersetzen in Dateien
. Dieser Vorgang kann einige Zeit in anspruch nehmen.
In dieser Zeit kann man die Datenbank Einträge anpassen.
Dazu klickt man im SQLite Browser in der geöffneten Datenbank (siehe oben) auf die Registerkarte SQL ausführen
und gibt folgendes ein:
UPDATE TypedBaseItems
SET data = REPLACE(data, 'F:\\Toshiba', 'E:\\Toshiba')
WHERE data LIKE '%F:\\Toshiba%';
Anschliessend führt man das Query mit einem klick auf das "Play"-Symbol aus.
Dies ist aber nur die halbe Arbeit. Man muss auch noch dieses Query ausführen:
UPDATE TypedBaseItems
SET Path = REPLACE(Path, 'F:\Toshiba', 'E:\Toshiba')
WHERE Path LIKE 'F:\Toshiba%';
Um zu überprüfen ob alles geklappt hat, kann man mit den folgenden Queries nach den neuen Einträgen (und natürlich auch nach den alten) suchen:
SELECT * FROM TypedBaseItems WHERE "data" LIKE '%E:\Toshiba%';
SELECT * FROM TypedBaseItems WHERE "Path" LIKE 'E:\Toshiba%';
Fazit
Nun kann man den Jellyfin Server wieder starten.
Er wird nun die ganze Mediathek erneut komplett scannen was zu einer ziemlichen Read/Write Belastung der Festplatte führt. Man sollte also bis zum Abschluss des Scans möglichst keine anderen Reads und Writes auf der Disk durchführen.
Ich war so schlau und hatte Server und Mediathek auf der selben SMR Disk untergebracht, das brachte die Disk in die Knie und der Scan lief auf den nächsten auf, dauerte also länger als 12h!
Ich habe den Server dann auf eine SSD verschoben, da dauerte der Scan dann noch ne knappe halbe Stunde.
Bei mir hat die Prozedur so wie ich sie hier beschrieben habe funktioniert.