Immich-Integration

Immich-Integration für das Foto-Widget

1. Kontext & Ziel

Gladys wird bald ein Foto-Widget für das Dashboard (box.type = 'photo') haben, das
eine Diashow aus einer manuell eingegebenen Liste von URLs ({ url, caption }) anzeigt. Die Bilder werden
über einen Proxy-Server (GET /api/v1/dashboard/photo/proxy?url=) abgerufen, um remote
zugänglich zu bleiben (Gladys Plus).

Ziel: Dem Benutzer ermöglichen, diese Diashow automatisch von einem Immich-Server
(selbstgehostetes Fotomanagement) zu speisen.

Der Benutzer verbindet sein Immich einmal und wählt dann eine dynamische Quelle (ein Album,
oder seine Erinnerungen „an diesem Tag“); das Widget zeigt die entsprechenden Fotos an und
aktualisiert sich selbstständig.

Umfang v1

  • Quellen: Album nach Wahl + Erinnerungen „an diesem Tag“
  • Bildqualität: Vorschau (~1440px)
  • Architektur: vollständiger Immich-Service (Konfigurationsseite + authentifizierter Proxy)

2. Die Immich-API — was sie ermöglicht

2.1 Authentifizierung

  • Alle Anfragen enthalten den Header x-api-key: <key>.
  • Der Schlüssel wird in Immich generiert: Account Settings → API Keys. Minimale benötigte
    Berechtigungen: album.read, asset.read, memory.read.
  • Basis-URL = Adresse des Immich-Servers, z. B. http://192.168.1.20:2283. Alle unten genannten
    Pfade sind mit /api präfixiert.

Strukturierender Punkt: Der aktuelle Proxy von Gladys (dashboard.getPhoto.js) macht ein GET ohne
Header
→ er kann nicht mit Immich kommunizieren. Es wird also ein dedizierter Immich-Proxy
benötigt, der x-api-key injiziert und auf die konfigurierte Basis-URL verweist.

2.2 Auswahl welcher Fotos angezeigt werden sollen (die Quellen)

Quelle Endpunkt Nützliche Antwort
Liste der Alben GET /api/albums [{ id, albumName, assetCount, albumThumbnailAssetId, shared }] — dient zur Befüllung des Album-Auswahlmenüs
Inhalt eines Albums GET /api/albums/{id} { albumName, assets: [{ id, type, originalFileName, fileCreatedAt, exifInfo }] }
Erinnerungen „an diesem Tag“ GET /api/memories [{ id, type:"on_this_day", memoryAt, data:{ year }, assets:[{ id, ... }] }] — eine Gruppe pro Jahr, das am gleichen Datum stattfand

2.3 Abrufen der Bilddatei eines Assets

Jedes Foto ist durch eine UUID asset.id identifiziert. Drei Varianten:

Variante Endpunkt Verwendung
Vorschau (~1440px) :white_check_mark: v1 GET /api/assets/{id}/thumbnail?size=preview Guter Kompromiss aus Qualität und Größe für eine Diashow
Miniaturansicht GET /api/assets/{id}/thumbnail?size=thumbnail Kleine Miniaturansicht (Zeitleiste)
Original GET /api/assets/{id}/original Maximale Qualität, potenziell große Dateien (>5 MB)

Antwort = binärer Bildstrom image/*. Der Immich-Proxy konvertiert ihn in das bereits vom
Widget erwartete Format: "<contentType>;base64,<data>".

2.4 Asset-Felder, die für die Bildunterschrift genutzt werden können

originalFileName, fileCreatedAt / localDateTime, und exifInfo (description, city,
dateTimeOriginal). Ermöglicht die automatische Generierung einer Bildunterschrift (z. B. „Rom — 12. August 2019“).

3. Erwartetes funktionales Verhalten

3.1 Verbindung der Integration (einmalig)

  • Neue Karte Immich in der Liste der Integrationen.
  • Konfigurationsseite, die Server-URL + API-Schlüssel anfordert.
  • Button „Verbindung testen“ → ruft GET /api/albums auf, um URL + Schlüssel zu validieren, und
    zeigt eine klare Fehlermeldung an, falls fehlgeschlagen (URL nicht erreichbar, 401 ungültiger Schlüssel).

3.2 Konfiguration des Widgets (durch den Benutzer, beim Bearbeiten des Dashboards)

Das Foto-Widget erhält eine Auswahl der Quellenart:

  1. Manuelle URLs — aktuelles Verhalten, unverändert (volle Rückwärtskompatibilität).
  2. Immich — Album — ein Dropdown-Menü listet die Alben (über GET /api/albums) auf; der
    Benutzer wählt eines aus.
  3. Immich — Erinnerungen — zeigt die Fotos an, die von GET /api/memories zurückgegeben werden
    („vor X Jahren, an diesem Tag“).

Bestehende Optionen bleiben erhalten und sind auf alle Modi anwendbar: Einrahmen (cover/contain),
Intervall des Durchlaufens, Anzeige/Ausblenden der Bildunterschriften, Titel des Widgets.

Für die Immich-Modi kann die Bildunterschrift automatisch generiert werden aus den Metadaten des Assets (Datum + Ort) statt manuell eingegeben.

3.3 Anzeige (Laufzeit)

  • Beim Öffnen löst das Widget die Immich-Quelle in Liste von Assets (Album oder Erinnerungen) auf,
    und zeigt dann jedes Bild als Vorschau über den authentifizierten Immich-Proxy an.
  • Diashow: Automatisches Durchlaufen gemäß dem Intervall, Vorwärts-/Rückwärtsnavigation und
    Indikatoren (bereits in PhotoBox.jsx vorhanden).
  • Bildcache im Speicher + Vorladen des nächsten Bildes (bereits vorhanden), unverändert.
  • Aktualisierung der Liste: Die Liste der Assets (insbesondere „Erinnerungen“, die sich täglich ändern) wird
    periodisch / beim Einbetten des Widgets erneut abgefragt, zu entscheiden.

3.4 Grenzfälle & funktionale Entscheidungen zur Validierung

  • Leeres Album / leere Erinnerungen des Tages → expliziter Leerzustand (Nachricht), kein Fehler.
  • Videos in einem Album (asset.type = VIDEO) → gefiltert (nur IMAGE beibehalten) oder
    Anzeige ihres Posters? → zu entscheiden (Vorschlag: Videos in v1 ignorieren).
  • Große Alben → Begrenzung der Anzahl der geladenen Assets (z. B. Obergrenze + eventuelle
    zufällige Reihenfolge), um Tausende von Einträgen zu vermeiden? → zu entscheiden.
  • Anzeigereihenfolge: Chronologisch (nach fileCreatedAt), umgekehrt oder zufällig?
    → zu entscheiden (Vorschlag: zuerst die neuesten).
  • 5-MB-Grenze des Proxys: Die Vorschau bleibt deutlich unter der Grenze, daher beibehalten. Nur
    überprüfen, wenn wir später den Modus „Original“ oder Video hinzufügen.

4. API-Quellen (Referenz)

  • Immich-API-Dokumentation: API | Immich · Endpunkte: Immich - API Documentation
  • Alben: getAllAlbums, getAlbumInfo · Erinnerungen: searchMemories (GET /api/memories)
  • Bild: viewAsset / GET /api/assets/{id}/thumbnail?size=preview
  • Zufällig (Referenz): POST /api/search/random · Metadaten: POST /api/search/metadata

5. Offene Fragen vor der Implementierung

  1. Videos in Alben: Ignorieren oder ein Poster anzeigen? (Vorschlag: Ignorieren in v1)
  2. Anzeigereihenfolge: Umgekehrt chronologisch, chronologisch oder zufällig?
  3. Obergrenze der Anzahl der Fotos pro Quelle (Performance)?
  4. Bildunterschrift: Automatisch generiert (Datum + Ort) standardmäßig oder keine Bildunterschrift für Immich?

Modellideen

Ich habe gerade Manus darauf gestartet. Mal sehen, ob das zu einem brauchbaren Ergebnis führt!

Erste Version erstellt von Manus 1.6.

Ich werde heute keine Gelegenheit haben, es zu testen, aber wenn jemand es kaum erwarten kann, es auszuprobieren, ist ein Testbild auf dem GitHub-Repository verfügbar.

Von der Integrationsseite auf die Schaltfläche „Von GitHub installieren“ klicken und den Link einfügen:

https://github.com/gboulvin/Gladys-Immich

Ich konnte die Verbindung testen und sie funktioniert, aber beim Hinzufügen eines Geräts bekomme ich diesen Fehler:

Die Integration hat ein unvollständiges oder ungültiges Gerät veröffentlicht: Gladys hat sich geweigert, es zu speichern.

Technische Details:

HTTP 422 — <!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="robots" content="nofollow,noarchive,noindex">
  <title data-l10n>Unprocessable Entity</title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
  <!--  -->
  <meta name="title" content="422: Unprocessable Entity">
  <meta name="description" content="">
  <meta property="og:title" content="422: Unprocessable Entity">
  <meta property="og:description" content="">
  <meta property="og:locale" content="en_US">
  <meta property="twitter:title" content="422: Unprocessable Entity">
  <meta property="twitter:description" content="">
  <meta name="format-detection" content="telephone=no">
  <style>
    :root {
      --color-bg-primary: #ffffff;
      --color-text-primary: #000000;
      --color-text-emphasis: #333333;
      --color-text-heading: #444444;
      --color-text-secondary: #555555;
      --color-text-subtle: #888888;
      --color-illust-ink: #263238;
 …

Die zweite Iteration (0.1.2) ist bereit und bei mir getestet.

  1. Erstellen Sie einen API-Schlüssel in Ihrem Immich-Server
  2. Füllen Sie die Felder in der Immich-Externen Integration aus
  3. Speichern, Verbindung testen und Diashow aktualisieren
  4. Im Tab « Entdeckung » Gerät speichern (Name ändern, falls gewünscht). Es ist möglich, den Raum im Tab « Geräte » zu wählen
  5. Man muss eine… « Immich-Kamera » im gewünschten Dashboard hinzufügen und los geht’s!

Ich veröffentliche im Store, Go für euer Feedback!

Edit:

Ich werde noch testen, aber ich denke, ich bekomme ein besseres Ergebnis, wenn ich die Kamera zum Dashboard hinzufüge, bevor ich die Diashow aktualisiere. Es scheint, dass, wenn man zuerst aktualisiert, das Foto zu groß ist, während es in der umgekehrten Reihenfolge reduziert wird.

Edit 2: Nein, es ist nur so, dass das Bild sehr groß ist, wenn es im Hochformat ist…

Ich erhalte einen Fehler, wenn ich die UUID eines Albums eingebe:

[2026-08-13T22:03:12.795Z] [ERROR] [immich-slideshow] Failed to publish the next Immich slide EmptyPhotoSourceError: No images are available in „MonAlbum“.
    at ImmichSlideshow.next (file:///app/src/slideshow.js:118:13)
    at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
    at async publishNextSlide (file:///app/src/devices/slideshowCamera.js:61:17)
    at async publish (file:///app/src/devices/slideshowCamera.js:118:9) {
  code: 'EMPTY_SOURCE'
}

Trotzdem habe ich Bilder in diesem Album

Wenn ich die Quelle auf „Souvenirs - Ce jour là“ setze, funktioniert alles einwandfrei :slight_smile:

Ein weiteres kleines Problem: Es gibt kein Cover in der Integration

Und falls möglich, wäre es schön, in den Verbesserungen mehrere Alben hinzufügen zu können – ein Album pro Gerät wäre meiner Meinung nach cool :grinning_face:

Ich hatte auch diesen Fehler:

[2026-08-13T22:09:51.808Z] [ERROR] [immich-slideshow] Failed to publish the next Immich slide Error: publishCameraImage: maximum image size is 153600 bytes (150 KB)
    at GladysIntegration.publishCameraImage (/app/node_modules/@gladysassistant/integration-sdk/lib/gladys-integration.js:606:13)
    at publishNextSlide (file:///app/src/devices/slideshowCamera.js:63:16)
    at async publish (file:///app/src/devices/slideshowCamera.js:118:9)
[2026-08-13T22:10:51.644Z] [INFO] [immich-slideshow] Published „20250812_123806_1800.jpeg“ from Memories — on this day

Hallo!

Danke für dein Feedback!

Ja, ich weiß, aber ich verstehe nicht warum. Wenn ich im Entwicklermodus starte, habe ich sie, aber nicht in der Release. Ich habe das gleiche Problem mit den anderen Integrationen, die entwickelt oder in Entwicklung sind…

Ansonsten schaue ich mir das heute noch an :wink:

Voilà, Update verfügbar.

Es ist nun möglich, die UUIDs der letzten 50 Alben aufzulisten, viel praktischer! Dazu ist eine neue Aktion am Ende der Konfigurationsseite verfügbar.

Achtung, es muss nun das asset.read in den Berechtigungen des API-Schlüssels in Immich aktiviert sein.

Darum kümmere ich mich heute Abend :wink:

Und für das Cover, vielleicht funktioniert es beim nächsten Mal, ich habe gute Hoffnung :smiley:

Der Bug ist gut behoben :wink:
Danke @GBoulvin
Und danke im Voraus für den Rest :grinning_face:

Et hop! Neue Version!

  • Möglichkeit, mehrere Alben auszuwählen
  • Möglichkeit, eine Bildunterschrift anzuzeigen
  • Endlich ein Coverbild (aber äh… Vielleicht werde ich es in einer zukünftigen Version ändern, da es nicht besonders lesbar ist) Edit: Und außerdem ist es keine Videodiaschau. Naja…

Das klingt interessant, aber da ich keinen Immich-Server habe, hätte jemand einen einfachen Leitfaden, um diesen Server einzurichten?

Mit Docker: Docker Compose [Recommended] | Immich
Und du findest die anderen Installationsarten.
Ich habe Installer Immich sur un NAS Synology (Guide complet 2026) - Cachem befolgt, aber dafür braucht man einen Synology-NAS.

Ich habe die Immich-Dokumentation befolgt.

Im Großen und Ganzen muss man einen Ordner auswählen, in dem die Fotos gespeichert werden, und dann den Docker-Befehl ausführen (ich erinnere mich nicht mehr genau, aber es gibt zunächst eine Datei zum Herunterladen, die man bearbeiten und dann den Befehl ausführen muss).

Edit: @mutmut war schneller :smiley: Es ist auf meinem Beelink S13 installiert.

Danke für diese Version @GBoulvin

Eigentlich sah ich hier die Möglichkeit, mehrere Geräte zu haben, um ein Album über ein Gerät und ein anderes Album über ein anderes Gerät abzuspielen:

Vielleicht ist meine Anfrage nicht relevant, aber das können wir sicherlich diskutieren :wink:

Ahhh, verstanden!

Ich werde Manus morgen fragen :innocent:

Danke für diese schöne Integration :clap:
Ich denke, es wäre langfristig interessanter, wenn das Fotos-Widget diese zusätzliche Fotoquelle berücksichtigt (statt die Kamera wiederzuverwenden).

Was denkst du? In diesem Fall könnte ich ein Feature-Request im Core von Gladys + SDK stellen :thinking:

Ich nehme an, dass es Gladys ist, die Immich verschmutzt, und nicht die Erstellung von Snapshots. Ich denke, das wäre auch in Bezug auf die Ressourcen besser…

Ja, genau. Ich überlasse dir das, ich fühle mich dazu nicht in der Lage!

Das ist erledigt!

Persönlich bin ich nicht überzeugt, da es nur die Möglichkeit gibt, einen zweiten Server zu konfigurieren, der mit einer zweiten Slideshow verbunden ist, aber es funktioniert wie gewünscht :wink:

Hier: Widget Photo - sources issues d'intégrations (Immich)