Kategorien
Tutorials

Poster in Plex entsperren

Wer einmal in Plex das Poster (Cover) für einen Film oder eine Serie manuell geändert hat und später auf lokale Poster (Filme: https://support.plex.tv/articles/200220677-local-media-assets-movies/, Serien: https://support.plex.tv/articles/200220717-local-media-assets-tv-shows/) umsteigen möchte, wird feststellen, dass die lokalen Poster ignoriert werden. Hintergrund ist, dass Plex die Poster für den entsprechenden Film oder Serie im Hintergrund gesperrt hat. Über die Datenbank können diese gesperrten Poster wieder freigegeben werden.

Inhaltsverzeichnis

Getestet wurde dieser Artikel unter Plex Media Server 1.42.1.10060.
Für den Artikel wurde eine Plex-Installation auf einer Synology DiskStation mit DSM 7 verwendet. Abgesehen von den Pfadangaben sollte das gezeigte Vorgehen so aber auch unter anderen Konstellationen funktionieren.

Datenbankstruktur

Plex Media Server bringt seinen eigenen SQLite Befehlszeileninterpreter mit. Änderungen an der Plex-Datenbank über DB Browser for SQLite sind nur sehr eingeschränkt möglich. Zumindest aber eignet sich DB Browser for SQLite, um sich die Datenbank anzusehen.

In der Tabelle metadata_items in der Spalte user_fields sind die Informationen über gesperrte Felder gespeichert. Es eignet sich die Spalte user_fields nach dem Begriff locked zu filtern:

Alle gesperrten Felder werden in der Spalte user_fields gespeichert. Jedes Feld bekommt dabei seine eigene ID.

Die ID 9 steht dabei für das gesperrte Poster. Um das Poster wieder freizugeben, muss also die 9 entfernt werden. Doch das kann nur über die Plex-eigene SQLite Kommandozeile erledigt werden.

Die Plex-Datenbank befindet sich im Plex Media Server data directory unter "Plug-in Support\Databases". Dort ist es die Datei com.plexapp.plugins.library.db.

Plex SQLite

In folgendem Artikel ist erklärt, wie das Plex SQLite Tool funktioniert: https://support.plex.tv/articles/repair-a-corrupted-database/#toc-0

Zunächst sollte der Plex Serverdienst beendet werden. Auch benötige ich in meinem Beispiel SSH-Zugriff, um die Kommandozeile verwenden zu können.

Das Plex SQLite Tool "Plex SQLite" befindet sich in meinem Beispiel (Synology NAS mit DSM 7) unter /var/packages/PlexMediaServer/target/.

Das Tool Plex SQLite wird für SQL-Querys benötigt.
Wo sich das Plex SQLite Tool befindet, ist hier beschrieben: https://support.plex.tv/articles/repair-a-corrupted-database/#toc-1

Ein Befehl ist wie folgt aufgebaut:
PLEXSQLITETOOL DATENBANKPFAD "SQLQUERY"

Ich wechsle zunächst in das Verzeichnis, in dem das Plex SQLite Tool liegt:

cd /var/packages/PlexMediaServer/target/

Als nächstes bauen wir Stück für Stück den benötigten Befehl (PLEXSQLITETOOL DATENBANKPFAD "SQLQUERY") zusammen.

PLEXSQLITETOOL ist durch Plex SQLite zu ersetzen. Da ich mich unter Linux befinde und Leerzeichen escapen muss, lautet der erste Teil des Befehls also wie folgt: ./Plex\ SQLite

Das SQLite Tool erwartet als ersten Parameter den Pfad zur Datenbank. In meinem Beispiel also: /volume1/PlexMediaServer/AppData/Plex\ Media\ Server/Plug-in\ Support/Databases/com.plexapp.plugins.library.db

Die Plex-Datenbank befindet sich im Plex Media Server data directory unter "Plug-in Support/Databases" und heißt com.plexapp.plugins.library.db.

Aktuell sieht der Befehl wie folgt aus:
./Plex\ SQLite /volume1/PlexMediaServer/AppData/Plex\ Media\ Server/Plug-in\ Support/Databases/com.plexapp.plugins.library.db "SQLQUERY"

Der Backslash "\" vor dem Leerzeichen dient dazu, die Leerzeichen zu escapen, damit diese korrekterweise als Teil des Pfades interpretiert werden.

Fehlt also nur noch der SQL-Query. Ich habe hier einen SQL-Query vorbereitet, der das Poster für alle Medieninhalte (Filme, Serien, Musik, etc.) freigibt:

UPDATE metadata_items SET user_fields = CASE WHEN user_fields = 'lockedFields=9' THEN 'lockedFields=' ELSE REPLACE(REPLACE(user_fields, '|9', ''), '9|', '') END WHERE user_fields LIKE '%lockedFields%' AND user_fields LIKE '%9%'

Der gesamte Befehl lautet also wie folgt:

./Plex\ SQLite /volume1/PlexMediaServer/AppData/Plex\ Media\ Server/Plug-in\ Support/Databases/com.plexapp.plugins.library.db "UPDATE metadata_items SET user_fields = CASE WHEN user_fields = 'lockedFields=9' THEN 'lockedFields=' ELSE REPLACE(REPLACE(user_fields, '|9', ''), '9|', '') END WHERE user_fields LIKE '%lockedFields%' AND user_fields LIKE '%9%'"
Der Befehl kann einfach als Einzeiler abgeschickt werden.
Der SQL-Query muss in doppelten Anführungszeichen stehen. Wenn Anführungszeichen im eigentlichen SQL-Query benötigt werden, sind einfache Hochkommata zu verwenden.

Wenn ich jetzt in der Datenbank nachschaue, sind die 9en verschwunden:

Die ID 9 wurde restlos entfernt. Es sind jetzt keine Poster mehr gesperrt.

Die Poster sind nun wieder entsperrt. Nachdem der Plex Serverdienst wieder gestartet wurde, wird beim nächsten Refresh der Metadaten das Poster durch ein eventuell lokal hinterlegtes Poster ersetzt.


Weiterführende Links
https://www.reddit.com/r/PleX/comments/onwnbe/comment/h5uyocz/
https://www.reddit.com/r/PleX/comments/6a1185/comment/i47uyyb/

Seit mehreren Jahren begeistere ich mich privat und beruflich für die IT. Das habe ich dann auch zum Anlass genommen, diesen Blog ins Leben zu rufen, um dort praxisnahe Tutorials über verschiedene IT-Themen zu schreiben und meine selbst geschriebene Software zu veröffentlichen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert