PIWIGO FOTOBESCHRIJVINGEN TOEVOEGEN met script PWG-DESC ============================================================================================== pwg_desc version 1.0 Ben Makkink 11 januari 2017 Een script om Piwigo foto's van een bijschrift te voorzien middels import in MySQL ============================================================================================== Op de Piwigo Server wordt met het script een lijst gemaakt van alle foto's in Piwigo die nog geen beschrijving (description) hebben. In deze lijst wordt ook de grootte van elk fotobestand vermeld. De lijst wordt opgeslagen als een tab-delimited tekstbestand en in de webroot (/var/www/html/) geplaatst. Een PC met samba access tot de website kan dit bestand 'nwe_pwg_fotos.txt' nu openen. Op een PC wordt het bestand 'fotoindex.xls' geopend en de inhoud van 'nwe_pwg_fotos.txt' als tekst geplakt in de sheet 'upload'. Nu kan in deze sheet de kolom 'beschrijving' ingevuld worden. Na alles opgeslagen te hebben, worden de kolommen met fototitel en de beschrijving (zonder header) geplakt in de sheet 'descriptions'. Dit sheet wordt vervolgens opgeslagen als een tab-delimited tekstbestand 'descriptions.txt' in de webroot van de Piwigo Server. In het Excel werkboek wordt nog de sheet 'fotoindex' bijgewerkt, waarna de sheet 'upload' weer leeggemaakt kan worden. Terug op de Piwigo Server wordt nu middels het script de inhoud van het tekstbestand '/var/www/html/descriptions.txt' geimporteerd in de Piwigo MySQL-tabel 'xls-decriptions'. Nu wordt er eerst gecontroleerd of in de import foto's voorkomen die niet in Piwigo bestaan. Als dat zo is wordt de import onderbroken met de instructie dit voor de in de lijst genoemde foto(s) eerst te corrigeren. Als dit in orde is worden middels een MySQL-UPDATE de 'descriptions' toegevoegd aan de foto's. Foto's die al een 'description' hebben worden hierbij ongemoeid gelaten, dus er wordt alleen een beschrijving toegevoegd als het veld 'description' leeg of null is. Er is een optie toegevoegd tbv het wijzigen/updaten van reeds bestaande bechrijvingen. Hiertoe worden bestaande beschrijvingen (te selecteren per Piwigo-map) geexporteerd en opgeslagen als tab-delimited tekstbestand 'descriptions_.txt in de webroot voor bewerken in sheet 'descriptions' van 'fotoindex.xls'. Na het exporteren kunnen de beschrijvingen in Piwigo verwijderd worden, zodat na bewerken in Excel de nieuwe beschrijvingen zoals hierbovenbeschreven opnieuw geimporteerd kunnen worden. Procedurestappen ============================================================================================== 1. Op Piwigo Server: Open script 'pwg-desc', selecteer optie 1 en creeer tekstbestand 'nwe_pwg_fotos.txt' in /var/www/html. Note: Selecteer optie 2 als alleen gezocht moet worden in de map 'Erica' 2. Op netwerk PC: Open samba drive 'Website' en open 'nwe_fotos.txt' in KLADBLOK. Kopieer de inhoud. 3. Open 'fotoindex.xls' sheet 'upload' en plak inhoud van het klembord als tekst in de kolommen A en B. (Plak>Speciaal>Tekst) 4. Maak de beschrijvingen in kolom E en vul ook kolom G (gallery-map) in. 5. Sla het werkboek nu eerst op! 6. Kopieer van sheet 'upload' de kolommen D en H zonder de header (rij 1), ga naar sheet 'descriptions' en Plak>Speciaal>Waarden in kolommen A en B. 7. Sla sheet 'descriptions' op: Opslaan Als>Tekst (tab is scheidingsteken) op de Website met de naam 'descriptions.txt' (/var/www/html/descriptions.txt) 8. Sluit op de netwerk PC het Excelbestand 'descriptions.txt' en heropen 'fotoindex.xls' en maak hier het werk af: Kopieer van sheet 'descriptions'de kolommen D-H (behalve rij 1) en Plak>Speciaal>Waarden op de eerste lege regel van sheet 'fotoindex'. Klik in sheet 'upload' op macroknop 'Wis Upload'. Sla vervolgens het werkboek op. De fotoindex is nu bijgewerkt met de laatste gegevens en klaar voor een volgende sessie. 9. Piwigo Server: Selecteer in script 'pwg-desc' optie 3 en importeer de inhoud van het bestand '/var/www/html/descriptions.txt' in de Piwigo tabel 'xls-decriptions' 10.Piwigo Server: Selecteer in script 'pwg-desc' optie 4 en de records van foto's zonder beschrijvingen worden nu bijgewerkt. 11.Open Piwigo in een webrowser en de foto's zullen nu de beschrijvingen vermelden. Met optie 5 kunnen bestaande beschrijvingen van een te specificeren map geexporteerd worden. In het script 'pwg-desc' de MySQL nader bekeken ============================================================================================== Optie 1: Exporteer lijst van foto's die geen 'description' hebben naar /var/www/html/nwe_pwg_fotos.txt ---------------------------------------------------------------------------------------------- Eerst wordt er gekeken of er foto's zijn zonder beschrijving: SELECT COUNT(file)FROM pi_images WHERE (pi_images.comment IS NULL OR pi_images.comment='') AND (pi_images.file LIKE '%.jpg' OR pi_images.file LIKE '%.JPG') AND pi_images.path NOT LIKE '%thumbs% In Piwigo kan een leeg veld zowel NULL als gewoon leeg zijn. Als er records gevonden worden dan worden deze op het scherm getoond. Tevens kunnen deze naar een tekstbestand geschreven worden: SELECT pi_images.file,pi_images.filesize INTO OUTFILE '/var/lib/mysql/nwe_pwg_fotos.txt' FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n' \ FROM pi_images WHERE (pi_images.comment is NULL OR pi_images.comment='') AND (pi_images.file LIKE '%.jpg' OR pi_images.file LIKE '%.JPG') AND pi_images.path NOT LIKE '%thumbs%' ORDER BY pi_images.file Hierbij moet opgemerkt worden dat MySQL geen toegang heeft tot de webroot en de outfile dus eerst in /var/lib/mysql/ geplaatst wordt. Dit wordt later met het shellscript verplaatst naar de webroot. ---------------------------------------------------------------------------------------------- Optie 2: Exporteer lijst van foto's die in map 'Erica' geen 'description' hebben naar /var/www/html/nwe_pwg_fotos.txt ---------------------------------------------------------------------------------------------- Controleer of er beschrijvingen zijn voor foto's die (nog) niet in Album 'Erica' bestaan: SELECT COUNT(file) FROM pi_images WHERE (pi_images.comment is NULL OR pi_images.comment='') AND (pi_images.file LIKE '%.jpg' OR pi_images.file LIKE '%.JPG') AND pi_images.path LIKE '%/erica/%' In Piwigo kan een leeg veld zowel NULL als gewoon leeg zijn. Als er records gevonden worden dan worden deze op het scherm getoond. Tevens kunnen deze naar een tekstbestand geschreven worden: SELECT pi_images.file,pi_images.filesize INTO OUTFILE '/var/lib/mysql/nwe_pwg_fotos.txt' FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n' \ FROM pi_images WHERE (pi_images.comment is NULL OR pi_images.comment='') AND (pi_images.file LIKE '%.jpg' OR pi_images.file LIKE '%.JPG') AND pi_images.path LIKE '%/erica/%' ORDER BY pi_images.file Hierbij moet opgemerkt worden dat MySQL geen toegang heeft tot de webroot en de outfile dus eerst in /tmp/ geplaatst wordt. Dit wordt later met het shellscript verplaatst naar de webroot. ---------------------------------------------------------------------------------------------- Optie 3: Importeer in table 'xls_descriptions' de records uit het bestand 'descriptions.txt' ---------------------------------------------------------------------------------------------- Maak de table 'xls_descriptions' als deze nog niet bestaat: CREATE TABLE IF NOT EXISTS xls_descriptions (file varchar(128), comment text); Als de tafel wel bestaat maak deze dan leeg: DELETE FROM xls_descriptions; Laad de data uit het tab-delimited tekstbestand: LOAD DATA LOCAL INFILE '/var/www/html/descriptions.txt' INTO TABLE xls_descriptions CHARACTER SET latin1 FIELDS TERMINATED BY '\t' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n'; ---------------------------------------------------------------------------------------------- Optie 4: Update Piwigo foto's zonder 'description' met import in 'xls_descriptions' ---------------------------------------------------------------------------------------------- Controleer of er beschrijvingen zijn voor foto's die (nog) niet in Piwigo bestaan. De volgende query geeft een lijst van images met beschrijvingen die (nog) niet in de Piwigo galerij voorkomen (orphins). En als ze voorkomen wordt een tijdelijk bestandje 'pwg-desc' aangemaakt in /tmp/ omdat de in een while-do-done loop gezette variabelen buiten de loop vergeten worden. Het tijdelijke bestand doet dienst als 'vlag' voor de daarna volgende 'if-then-else' Als eerste wordt een eventueel nog aanwezige 'vlag' verwijderd: if [ -f /tmp/pwg-desc ]; then rm -rf /tmp/pwg-desc; fi; Vervolgens wordt er op orphin beschrijvingen gecontroleerd en zo ja dan wordt 'vlag' gezet: SELECT xls_descriptions.file FROM xls_descriptions LEFT JOIN pi_images ON xls_descriptions.file = pi_images.file WHERE pi_images.file is null |\ while read V ; do echo " " $V; echo 1 > /tmp/pwg-desc; done; Als bovenstaande query geen orphin bestanden oplevert wordt geen bestand /tmp/pwg-desc aangemaakt. In dat geval kan de import plaatsvinden: if [ ! -f /tmp/pwg-desc ]; then De dan volgende query geeft het aantal foto's in Piwigo die een update met 'description' gaan krijgen: SELECT COUNT(pi_images.file) FROM pi_images,xls_descriptions WHERE (pi_images.file=xls_descriptions.file) AND (pi_images.comment IS NULL OR pi_images.comment=''); Als besloten wordt de update uit te voeren: UPDATE pi_images, xls_descriptions SET pi_images.comment=xls_descriptions.comment WHERE (pi_images.file=xls_descriptions.file) AND (pi_images.comment IS NULL or pi_images.comment=''); ---------------------------------------------------------------------------------------------- Optie 5: Exporteer bestaande 'descriptions' van foto's in zelf te specificeren Piwigo-map, met na de export de optie de Piwigo-descriptions te verwijderen als voorbereiding voor re-import met opties 3 en 4 ---------------------------------------------------------------------------------------------- Vraag gebruiker de naam van de map (bijv. 2015/wandelen) in te voeren. dit wordt opgeslagen in de variabele $invoer. Eerst wordt er gekeken of er foto's in gegeven map zijn zonder beschrijving: path="'%"$invoer"%'"; SELECT COUNT(file) FROM pi_images WHERE (pi_images.file LIKE '%.jpg' OR pi_images.file LIKE '%.JPG') AND pi_images.path LIKE $path; Als er records gevonden worden dan worden deze op het scherm getoond. Tevens kunnen deze naar een tekstbestand geschreven worden: SELECT pi_images.file,pi_images.comment INTO OUTFILE '/var/lib/mysql/exp_pwg_desc.txt' FIELDS TERMINATED BY '\t' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' \ FROM pi_images WHERE (pi_images.file LIKE '%.jpg' OR pi_images.file LIKE '%.JPG') AND pi_images.path LIKE $path ORDER BY pi_images.file; Om gallery voor te bereiden voor re-import moeten de bestaande beschrijvingen verwijderd worden: UPDATE pi_images SET pi_images.comment=NULL WHERE (pi_images.file LIKE '%.jpg' OR pi_images.file LIKE '%.JPG') AND pi_images.path LIKE $path; ==============================================================================================