Projekt Bildergalerie

Projekt Bildergalerie

Die Überschrift zu diesem Artikel ist sehr allgemein. Dennoch steckt für mich besonders viel dahinter. Seit dem Sommer vergangenen Jahres versuche ich, soweit es mir möglich ist, den Einsatz von Drittsoftware zu minimieren. Im Grunde genommen hätte ich gerne meine eigene Linux-Distribution und wäre nur auf den Linux-Kernel angewiesen. Aber davon bin ich Lichtjahre entfernt. Also muss ich mich mit dem, was so vorhanden ist, zufrieden geben und mich selber auf die Hinterbeine setzen, um eine Alternative zu dem zu schaffen, was mich stört.

In einen anderen Artikel habe ich davon berichtet, dass ich mich von aufwendigen Datenbanken bzw. Datenbanksystemen lösen möchte. Ganz ohne Datenbank geht es nicht, daher konzentriere ich mich nun, da wo es geht, auf textbasierte Dateien und da, wo es nicht geht, auf SQLite3. Das hat auch damit zu tun, dass ich mich von Blog- und Contentmanagementsystem verabschiede bzw. schon verabschiedet habe. Ich habe weder WordPress, noch Joomla!, noch sonst irgendein System von Dritten im Einsatz. Ich nutze Hugo, Generator für statische HTML-Seiten, und eben meine eigenen Scripte für die Darstellung meiner lokalen Webseiten und Auswertung meiner Datenspeicher.

Im Einsatz hatte ich aber noch webbrowserbasierte Galeriesoftware: Coppermine und Piwigo. Aktuell ist Piwigo nur noch, weil ich es nicht sofort gemacht habe, auf meiner Webseite für die Grüne Hölle im Einsatz. Aber auch dort wird diese Galeriesoftware bald entfernt werden. Die Coppermine habe ich seit ca. 8 Jahren im Einsatz. Diese Software hat ihren Zenit wohl erreicht, wird, soweit ich weiß, nicht mehr weiterentwickelt und läuft nicht mit PHP7.4x. Ungeachtet dessen war es mein Wunsch, schon vor einiger Zeit, mich auch von der Software für Bildergalerien zu lösen und was eigenes auf die Beine zu stellen.

Nicht webbrowserbasierte Software wie DigiKam, gThumb oder Gwenview finde ich für den dauerhaften Einsatz grausam.

Es ist mir tatsächlich gelungen, mich auf die eigenen Beine zu stellen.Sehr schlicht sehr einfach, aber für die Umsetzung meiner Idee brauchte ich dann doch lange Zeit. Durch den Computercrash am 22.05.2020 hat das Projekt aber mächtig an Fahrt aufnehmen müssen. Der Ausstieg aus der Galeriesoftware Piwigo und Coppermine sollte weich sein - nicht mit dem Dampfhammer vorangetrieben.

Also, die Grundlage für das Projekt war der Wunsch, mich von Drittsoftware zu lösen und die Geschicke in die eigenen Hände zu nehmen. Dazu braucht man aber auch Ideen und eine gewisse Vorstellungskraft. Es ist aber auch hier so ähnlich wie beim Essen: der Appetit kommt meist erst noch.

Die Ideen und Wünsche können so beschrieben werden:

  • Alle Bilddateien zu einem Thema, welches es auch immer ist, liegen in einem separaten Ordner.
  • Alben (virtuell) differenzieren Teilbereiche in den Thema (z.B. Garten oder Radfahren oder Naturbilder usw.) und sollen die Vielzahl an Ordnern reduzieren.
  • Alle Bilddateien haben einen gleichartigen Aufbau des Dateinamens ohne Sonderzeichen, Leerzeichen und ähnlichen Kram, der einem das Leben als Programmierer nur schwer macht.
  • Zu allen Bildern sollen zur Laufzeit Thumbnails erstellt werden, die geladen werden und Bestandteil des Links zum jeweiligen Originalbild werden (also keine Erstellung vorher).
  • Die Anzeige der Galerien, ich nenne die Sammlung von Bildern nun Bildersets, soll im Webbrowser erfolgen.

Kernpunkt des Ganzen ist, und das ist für mich als reiner Nichtprogrammierer schon eine Hürde, das ich nur ein PHP-Script haben möchte, um alle Bilderseits in allen Themen und deren Teilbereichen erreichen zu können.

Bei den ersten Versuchen hatte ich noch darauf gesetzt, dass ich zu allen Bildersets auch entsprechende Ordner und auch entsprechende HTML-/PHP-Scripte erstelle. Das wäre aber ein enormer Aufwand, den ich mir nicht antun wollte. Ich möchte ein Bilderset nur einmal anpacken müssen, um es vorzubereiten, bevor es im Browser angeschaut werden kann.

Auch hier wieder Ideen und Vorstellungen dazu:

  • Herstellung von eindeutigen mit Konventionen belegten Dateinamen für die Bilder.
  • Zwischenlagerung in einem tmp-Verzeichnis.
  • Prüfung, ob das Thema bereits vorhanden ist. Wenn nicht, dann einen Ordner anlegen und das Thema sowie den Ordner in einer Datenbanktabelle erfassen (mehr dazu weiter unten).
  • Erstellung eines virtuellen Albums (als Teilbereich eines Themas) in einer Datenbanktabelle und Zuordnung zu einem Thema.

Was hat das mit der Ordnertabelle nun auf sich?

Wer wie ich seit Jahrzehnten digitale Informationen vorhält und mitschleppt, der hat mehr als ein Mal seine Strukturen auf dem Computer anpassen wollen oder anpassen müssen. Das mache ich natürlich auch, um die bestmögliche Ordnung zu haben. Zudem habe ich als Privatmann nicht die Ressourcen, die ein Unternehmen hat und muss also mit meinem Plattenplatz gut haushalten.

Daher stelle ich mir vor, dass die Bildersets alle unter einem fixen Ordner zusammengefasst sein werden. Nennen wir ihn privatgalerie. Unter dem Ordner privatgalerie gibt es nun eine gewissen Anzahl von Unterordnern, die wiederum auch Unterordner haben könnten. Da ich meine Bildergalerien, die ich erstellen werde, für PHP-Scripte erreichbar machen muss, müssen die Bilder zwangsweise auf dem Webserver liegen bzw. vom Webserver erreichbar sein. Damit ich genug Plattenplatz vorhalten kann, habe ich die Partitionen weiterer in meinem Desktop-PC befindlichen SSD-Laufwerken in den Webserver eingebunden. Meine Bildergalerien liegen also nicht auf der Partition mit der ich boote, sondern auf einer eigenen SSD. Diese SSD hat das Label galerie und wird auch so gemountet. So weit, so gut.

Ändert sich meine Infrastruktur, und ich müsste die Galerie auf eine andere Partition verschieben, die dann auch noch anders heißen könnte, habe ich wieder Änderungsbedarfe an den PHP-Scripts. Das will ich vermeiden. Meine Idee ist, dass ich den Ordner bzw. den Pfad auftrenne, nämlich in einen variablen und einen fixen Teil.

Den fixen Teil habe ich ja schon beschrieben, der variable Teil ist der Teil von der Basis bis zum fixen Teil. Sofern sich der variable Teil mal ändern, kann ich via Script oder auf der Konsole einen Update-Befehl setzen, der in der Ordnertabelle den neuen variablen Pfadteil setzt. Das ordinäre PHP-Script für die Anzeige der Bildersets bekommt davon nichts mit.

Nehmen wir mal an, es gibt folgenden Pfad, der zu einem Bilderset führt (nur als Beispiel):

/media/jopii/galerie/bilder/privatgalerie/

Der variable Teil dieses Pfades wäre nun: /media/jopii/galerie
Der fixe Teil dieses Pfades wäre daher: /bilder/privatgalerie/

Meine Hoffnung ist, dass ich den fixen Teil nie ändern muss, weil sich meine Hardware verändert.

Mein Wunsch, eine Art von One-Script-Variante zu haben, bedingt ebenfalls, dass ich den Zugang zu den Bildern einmalig beschreiben muss. Und darum hat sich für mich diese Ordnertabelle angeboten. Wie soll ich auch sonst an die Ordner kommen und die Bilder daraus im Browser anzeigen lassen.

Soweit meine Idee und meine Vorstellung.


Umgesetzt habe ich das Ganze mit HTML, CSS, PHP, JavaScript und SQLite3. Und ich konnte mir den One-Script-Wunsch erfüllen.

Tatsächlich?

Ja, aber ich hatte etwas Entscheidendes vergessen. Wie bitte kommen die Bilder aus dem Ordner über die Datenbank in den Browser?

Es besteht die Möglichkeit, dass in einem Ordner gespeicherte Bilddateien via PHP-Script angezeigt werden. Das konnte ich auch umsetzen. Sehr einfach in der Art und Weise. Aber mir fehlten Informationen. Welche?

  • Speicherbedarf des Bildes
  • Breite des Bildes
  • Höhe des Bildes
  • Erstellungsdatum des Bildes

Auch das ist über ein PHP-Script zu ermitteln. Aber soll das immer zur Laufzeit erfolgen?

Nein, soll es nicht.

In der angelegten SQLite3-Datenbank befinden sich 4 Tabellen:

  • Thema
  • Album
  • Ordner
  • Bilder

Und es gibt 4 Formular, in denen Werte eingetragen werden können, um sie dann in die jeweiligen Tabellen einzutragen.

  • Formular für die Erfassung eines Thema (sollten nicht allzu viele werden)
  • Formular für die Erfassung eines Albums (das werden schon einige werden)
  • Formular für die Erfassung der Ordnerstrukturteile fix und variable (werden analog zum Album erfasst)
  • Formular für die Erfassung eines Bildes (davon wird es Tausende geben)

Tausende von Bildern?

Ach Du Schrecken. Dann werde ich ja nie fertig!

Doch, werde ich, denn es gibt ein fünftes Formular, mit dem alle notwendigen Informationen an ein Script übergeben werden, welches dann die Eintragung der vielen Bilder in die Datenbank vornimmt und die dazu passenden Bilder dann aus dem tmp-Orner (na, schon vergessen, wurde oben erwähnt) in den Zielordner verschiebt. Jau, das funktioniert tatsächlich. Ich finde das genial.

Hier die Prozess-Schritte, die notwendig sind (auch scriptinerne):

  • Speicherung der Bilddateien im tmp-Ordner (manuell)
  • Aufruf Formular
  • Verbindungsaufbau zur Datenbank
  • 3 Select-Querys für die
  • … Auswahl Thema über eine Selectbox
  • … Auswahl Album über eine Selectbox
  • … Auswahl Ordner über eine Selectbox
  • Absenden des Formulars
  • Alle Inhalte der Formularfelder sind in Variablen gespeichert (!wichtig)
  • scriptintern: Bereinigung der Dateinamen (Leerzeichen, Sonderzeichen usw., alles nur ein Kleinbuchstaben)
  • scriptintern: Ermittlung der Breite in Pixeln
  • scriptintern: Ermittlung der Höhe in Pixeln
  • scriptintern: Ermittlung der Größe in KiloByte
  • scriptintern: Ermittlung des Erstellungs- oder Änderungsdatums
  • Alle scriptintern ermittelten Werte sind in Variablen gespeichert (!wichtig)
  • Zusammenstellung des Insert-Statements mit den Variablen-Namen
  • Absetzen des Insert-Statements mit den gefüllten Variablen und Füllung der Tabelle Bilder
  • Alle Bildateien werden aus dem tmp-Ordner in den fixen Zielordner verschoben

FERTIG!

So gut und strukturiert habe ich meine Bilder selbst in den professionellen Galerien nicht aufbauen können. Ok, mir fehlen die Thumbnails, vielleicht auch Zwischengrößen. Aber ich kann alles selber bestimmen.

Das Festhalten von Breite und Höhe der Bilddatei ist insofern wichtg, weil ich damit ermitteln kann, ob ein Bild im Hoch- oder Querformat vorliegt. In den auswertbaren Bilddaten habe ich diese Info nicht gefunden.

Wichtig wird diese Information dann, wenn es daran geht, dass ich die Erstellung von Thumbnails angehe. Das fehlt nämlich noch. Derzeit werden alle Bilder eines Sets direkt in den Browser geladen. Zwar verkleinert zur Ansicht, aber eben mit voller Größe. Der Ladevorgang wird heftig, wenn es mehrere Dutzend Bilder in einem Album sind. Daher muss ich das Thema Thumbnail noch schnell lösen. Wie es geht, weiß ich. Ich muss es nur noch umsetzen und in den zuvor dargestellten Ablauf integrieren. Und zwar nach der Befüllung der Datenbank und vor dem Verschieben in den Zielordner. Der Dateiname für das Thumbnail ist identisch mit dem Bilddateinamen, aber ergänzt um den Präfix **thumb_**.

Mit dem oben erwähnten One-Script habe ich mehr oder weniger eine dynamische Webseite. Sobald ich ein Thema anklicke, wird in der Datenbank eine Abfrage gestartet, die mir alle zu dem Thema zugeordneten Alben mit einem Link in die linke Sidebar ausgibt. Kicke ich auf den Link, der dem Album mitgegeben wurde, erscheinen alle Bilder (hier nur die Thumbnails in Zukunft), die dem Album zugeordnet sind. Die Bilder können dann über eine Lightbox (JavaScript) angesehen werden.

Ok, es sind zwei Scripts, die ich habe. Das eine ist die Webseite, das andere ist das Auswertungsscript für die Anzeige der Bilder.

Das ist alles sehr einfach gehalten und hat noch sehr viel Potenzial für Erweiterungen oder gar Änderungen, wenn etwas mal nicht so gut ist, wie ich es vorher gemeint hatte.

Aber was fällt eigentlich auf?

Meine tolle Idee ist mottenzerfressen, denn sie ist schon alt. Hunderte von klugen Köpfen habe Tools für die Verwaltung und Darstellung von Bildern und Galerien vor mir entwickelt. Im Grunde genommen mache ich nichts anderes.

Ich sehe den Vorteil darin, dass ich weiß, was das Tool macht, dass ich es verändern kann wie ich es will und dass ich sagen kann: meins, ich habe das Tool selber programmiert!

Man kann mich gerne einen Spinner nennen, aber ich hatte Spaß wie eine dicke Tütt (Huhn) und werde ihn auch weiterhin haben.

Geschrieben am 04.06.2020


Analog dazu habe ich eine Playliste für Video- und Audiodateien programmiert, die ebenfalls im Webbrowser läuft.