Remote Gallery Album mit lokalem Ordner synchronisieren
Die meistverbreitete PHP Galerie Software ist derzeit wohl Gallery 2. Sie bietet viele Funktionen inklusive Cooliris (vormals PicLens). Es gibt sogar ein Protokoll mit dem man die Galerie remote administrieren kann. Dieses Protokoll unterstützt allerdings leider nicht das löschen von Bildern.
Mit einem kleinen Skript, das lediglich bash und curl benötigt und somit auf so ziemlich jedem Unix laufen sollte, kann man nun einen Ordner auf dem lokalen Filesystem mit einem Album synchronisieren. Mit dem launchd unter OS X bzw. cron oder famd unter Linux kann man den Ordner überwachen lassen, so dass man einfach per Drag&Drop Bilder in den Ordner ziehen kann und die Bilder automatisch hochgeladen und integriert werden. Wenn man aus dem Ordner Bilder löscht, werden diese auch vollautomatisch aus dem Album gelöscht.
Für das Hochladen verwendet das Skript das Gallery Remote Protokoll. Zum Löschen muss man ein wenig tricksen und die Bedienung des Web-Browsers emulieren.
Zunächst muss man in der Gallery ein zu synchronisierendes Album anlegen. Ich habe es "Paste" genannt. Desweiteren braucht das Skript Benutzernamen und Passwort um auf das Album zugreifen zu dürfen.
sync (damit man unter OS X doppelklicken kann, verwende ich kein .sh im Dateinamen)
#!/bin/sh
#
# Gallery Sync by lilalinux, Freeware
#
# Don't forget to backup!
# Bitte Daten sichern!
#
### Configurable part
USER=HIER_DER_BENUTZERNAME
PASS=HIER_DAS_PASSWORT
BASE_URL=http://www.example.com/main.php?
ALBUM=HIER_DER_ALBUMNAME
### End of configurable part
URL=${BASE_URL}g2_controller=remote:GalleryRemote
URL2=${BASE_URL}g2_controller=core.ItemDeleteSingle
TOP=$(pwd)
DIR=$(dirname $0)
cd ${DIR}
ALBUM_NUM=$(curl -F 'g2_form[cmd]=fetch-albums' -F 'g2_form[protocol_version]=2.0' -F 'g2_form[no_perms]=yes' ${URL} 2> /dev/null | egrep "^album.title.[0-9]+=${ALBUM}" | cut -d '=' -f 1 |cut -d '.' -f 3)
ALBUM_NAME=$(curl -F 'g2_form[cmd]=fetch-albums' -F 'g2_form[protocol_version]=2.0' -F 'g2_form[no_perms]=yes' ${URL} 2> /dev/null | grep "album.name.${ALBUM_NUM}=" | cut -d '=' -f 2)
curl -F 'g2_form[cmd]=fetch-album-images' -F 'g2_form[protocol_version]=2.4' -F "g2_form[set_albumName]=${ALBUM_NAME}" -F 'g2_form[albums_too]=no' ${URL} 2>/dev/null | grep 'image.title' | cut -d '=' -f 2 | sort > tmp_remote
curl -F 'g2_form[cmd]=fetch-album-images' -F 'g2_form[protocol_version]=2.4' -F "g2_form[set_albumName]=${ALBUM_NAME}" -F 'g2_form[albums_too]=no' ${URL} 2>/dev/null > tmp_remote2
ls -1 | egrep -i '[.](jpg|png)$' | sort > tmp_local
grep tmp_local -v -f tmp_remote > tmp_new
grep tmp_remote -v -f tmp_local > tmp_del
AUTH_TOKEN=$(curl -c cookie.txt -F 'g2_form[cmd]=login' -F 'g2_form[protocol_version]=2.0' -F "g2_form[uname]=${USER}" -F "g2_form[password]=${PASS}" ${URL} 2>/dev/null | grep auth_token | cut -d '=' -f 2)
while read IMG_NAME
do
echo "Uploading ${IMG_NAME}..."
AUTH_TOKEN=$(curl --cookie cookie.txt -c cookie.txt -F 'g2_form[cmd]=add-item' -F 'g2_form[protocol_version]=2.0' -F "g2_form[set_albumName]=${ALBUM_NAME}" -F "g2_userfile=@${IMG_NAME}" -F "g2_userfile_name=${IMG_NAME}" -F 'g2_form[auto_rotate]=yes' "${URL}&g2_authToken=${AUTH_TOKEN}" 2>/dev/null | grep auth_token | cut -d '=' -f 2)
done < tmp_new
while read IMG_NAME
do
echo "Deleting ${IMG_NAME}..."
curl -F 'g2_form[cmd]=fetch-album-images' -F 'g2_form[protocol_version]=2.4' -F "g2_form[set_albumName]=${ALBUM_NAME}" -F 'g2_form[albums_too]=no' ${URL} 2>/dev/null > tmp_remote2
IMG_NUM=$(cat tmp_remote2 | egrep "image.title.[0-9]*=${IMG_NAME}" | cut -d '=' -f 1 |cut -d '.' -f 3)
IMG_ID=$(cat tmp_remote2 | egrep "image.name.${IMG_NUM}" | cut -d '=' -f 2)
AUTH_TOKEN=$(curl -c cookie.txt -F 'g2_form[cmd]=login' -F 'g2_form[protocol_version]=2.0' -F "g2_form[uname]=${USER}" -F "g2_form[password]=${PASS}" ${URL} 2>/dev/null | grep auth_token | cut -d '=' -f 2)
curl -o foo --cookie cookie.txt -c cookie.txt "${URL2}&g2_authToken=${AUTH_TOKEN}&g2_itemId=${IMG_ID}&g2_pageId=${ALBUM_NAME}" 2>/dev/null
done < tmp_del
rm -f tmp tmp_local tmp_remote tmp_remote2 tmp_new tmp_del cookie.txt
cd ${TOP}
Verwendung
Das Skript lokal in den zu synchronisierenden Ordner stecken und die vier Variablen am Anfang der Datei konfigurieren.
Damit das Skript automatisch ausgeführt wird, muss je nach Betriebssystem der Ordner überwacht werden. Ich zeige als nächstes wie das mit Bordmitteln unter OS X funktioniert.
~/Library/LaunchAgents/net.lilalinux.gallery.sync.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
<dict>
<key>Label</key>
<string>net.lilalinux.gallery.sync</string>
<key>ProgramArguments</key>
<array>
<string>/Users/lilalinux/Desktop/gallery/sync</string>
</array>
<key>OnDemand</key>
<true/>
<key>WatchPaths</key>
<array>
<string>/Users/lilalinux/Desktop/gallery/</string>
</array>
</dict>
</plist>
Aktivierung der Überwachung auf hinzufügen und löschen im launchd
In dem Schnipsel oben müsst Ihr noch den Pfad zu Eurem Folder anpassen!
Hiermit aktiviert Ihr dann die Überwachung:
launchctl load ~/Library/LaunchAgents/net.lilalinux.gallery.sync.plist
(Zum Entladen einfach load durch unload ersetzen)