Piwigo hacks

Piwigo je open source PHP aplikace pro fotogalerii. Kromě fotografií umí uložit (a někdy i zobrazit) i jiné formáty. Poté, co byla zhybernovaná Menalto Gallery a prakticky ukončený její vývoj, Piwigo začíná nabírat stále více uživatelů. Oproti Menalto Gallery má Piwigo jednu výhodu. Její hlavní vývojář provozuje komerční službu piwigo.com, která běží na tomto opensource softwaru a nabízí provoz galerie jako službu.

Piwigo logo

Virtuální vs fyzická alba

Piwigo umí spravovat data ve dvou poměrně odlišných strukturách. První jsou virtuální alba (v adresáři /upload/), ve kterých adresářová hiearchie pro uložení souborů odpovídá datumu jejich pořízení a názvy souborů jsou odvozeny z timestampu a náhodného řetězce nebo možná sumy souboru (příklad: upload/2014/01/13/20140113180811-2c53fe2d.jpg). Alba u virtuálních alb se určují pouze záznamem v SQL databázi. Správa souborů - upload, přesun apod. je plně v kompetenci Piwiga.

Druhou možností jsou fyzická alba (adresář /galleries/), při kterých je na uživateli, aby sám vytvářel strukturu adresářů (=alb) a do nich nějakým způsobem (FTP, SCP, ...) zapisoval data. Piwigo v tomto případě neprovádí žádné změny v těchto souborech a adresářích. I o tom, že jste něco přidali, se Piwigo dozví, až když provedete ruční synchronizaci (Quick Sync z admin homepage nebo Synchronizace v admin menu). Při synchronizaci si Piwigo znovu ošahá soubory a adresáře a přidá nebo odebere položky z databáze.

Výhody fyzických alb: adresářová struktura kdykoliv exportovatelná (ovšem bez metadat) pouhým zkopírováním, možnost rsyncu s vlastním úložištěm jinde, upload více adresářů/alb najednou

Výhody virtuálních alb: ke správě stačí browser bez pluginů (formulář pro upload je poměrně zdařilý), bez synchronizačního kroku, obsáhlejší možnosti správy v Piwigo, zachování metadat souborů při přesunu či přejmenování alba, fotografie mohou být ve více albech zároveň

Z fyzických alb na virtuální lze zmigrovat poměrně jednoduše pomocí oficiálního Virtualize pluginu (jen pozor na práva souborů a adresářů v /galleries/).
Z virtuálních alb na fyzická je to o něco složitější, ale je to možné - viz fórum. Upravenou verzi skriptu najdete i tady.

Osobně by mi nejvíc vyhovoval nějaký hybridní systém, při kterém by bylo možné použít všechny (nebo většinu) možností virtuálních alb a zároveň mít souborovou strukturu založenou na jménech alb. Ale z uvedených možností mi více vyhovují virtuální alba, tudíž jsem vše zmigroval a zakázal synchronizaci.

Moje oblíbené moduly

  • Admin tools
  • Automatic Size
  • Batch Downloader
  • Exif View
  • Extended Descriptions
  • Fotorama
  • gdThumb
  • LocalFiles Editor
  • Media Icon
  • Reset Manual Order
  • Rotate Image
  • VideoJS

Jak na migraci z Gallery2

  1. zjistit oprávnění alb v G2 - modul pro migraci nepřevádí uživatele, skupiny ani oprávnění!
  2. základní konfigurace Piwigo
  3. zapnout synchronizaci v configu
  4. pokud se objeví PHP chyby s exifem, dočasně vypnout Exif View
  5. zapnout Menalto2Piwigo, Extended Descriptions a Virtualize moduly
  6. zkopírovat obsah G2 albums do /galleries/ (může být i část - vybrané adresáře)
  7. pokud jsou některé fotky špatně otočené, teď je nejlepší čas na opravu (viz níže)
  8. nastavit práva: cd galleries; find . -type d -exec chmod 777 {} \;; find . -type f -exec chmod 666 {} \;
  9. pokud je třeba, vyřešit import řazení alb - viz níže
  10. piwigo admin - quick sync (projdou se adresáře a soubory v galleries a naplní se databáze)
  11. piwigo admin - plugins - Menalto2Piwigo - import dat z G2 databáze
  12. piwigo admin - albums - manage - permissions
  13. piwigo admin - plugins - Virtualize a zkontrolovat, že v galleries nezůstal žádný soubor
  14. vypnout plugin Menalto2Piwigo a Virtualize
  15. případně vypnout synchronizaci v configu
  16. nastavit oprávnění pro jednotlivá alba

Jak na špatně otočené fotky

V rámci migrace jsem objevil větší množství fotografíí, které byly sice otočené (lossless), ale bez úpravy Orientation EXIF tagu. Většina softwaru fotky automaticky otáčí právě podle tohoto tagu, takže dojde k dalšímu otočení a fotografie jsou na bok. V rámci opravy fotek jsem si vyrobil dva skripty.

První skript (foto-copy-rotated.sh) projde adresář zadaný ve skriptu a všechny fotky, které nemají orientaci top-left (byly vyfoceny "jinak") zkopíruje do jiného adresáře (všechny do jednoho) a odstraní z nich Orientation tag. Fotografie v cílovém adresáři, které se zobrazují i s automatickým otočením správně, je potřeba editovat (což dělá druhý skript).

Druhý skript (foto-unrotate.sh) vezme soubor, který je mu zadán pomocí parametru, a změní v něm Orientation tag na top-left. Mění přímo zdrojové soubory, ale nešahá na ty, které mají standardní orientaci nebo které tag neobsahují. Pracuje vždy pouze s jediným souborem.

Nejjednodušší postup je pomocí prvního skriptu zjistit, ve kterých adresářích se nachází špatně otočené fotky, a na soubory v těchto adresářích poslat pomocí findu druhý skript:

find ADRESAR -type f -iname "*.jpg" -exec foto-unrotate.sh {} \;

případně hromadně pro více adresářů:

for I in ADRESAR1 ADRESAR2; do find $I -type f -iname "*.jpg" -exec foto-unrotate.sh {} \;; done

Řazení alb po migraci z G2

Plugin pro migraci do Piwiga přepisuje většinu informací. Týká se to i sloupce g2_ItemAttributesMap.g_orderWeight, který v G2 slouží k ručnímu řazení. Bohužel už se neimportují informace o automatickém řazení podalb, zčásti proto, že to Piwigo neumí (automaticky řadit lze pouze soubory v albech). Výsledkem je to, že podalba jsou po migraci do Piwigo řazena podle hodnot, které se v G2 nepoužívaly.

Jak jsem si s tím poradil:

1. Napsal jsem tento PHP skript, který projde adresářovou strukturu původně z G2 a změní mtime/ctime u jejích adresářů/alb na základě data z G2 databáze (= času nastaveného u alb).

2. Přepsal jsem Piwigo get_fs_directories funkci v admin/include/functions.php, která vytváří strukturu v databázi na základě adresářové struktury a která po opatchování respektuje mtime. Po importu s tímto patchem jsou tedy alba řazená podle mtime původních adresářů.

3. Zakomentoval jsem všechny čtyři řádky obsahující "rank" v piwigo/plugins/menalto2piwigo/admin.php, díky čemuž nedojde k importu (nepoužívaného ručního) řazení z G2. Naimportují se pouze ostatní metadata.

Cross-reference: Piwigo Forum - Migrating from gallery 2 to piwigo

Apache konfigurace a bezpečnost

Piwigo pro některá data (především originály) používá přístup přes vlastní "PHP proxy". Soubory v tomto případě načítá PHP a pak je zobrazuje uživateli - nemusí být přímo přístupné pomocí Apache. V tomto PHP kódu je pak možné zároveň ošetřit autentizaci. Naopak deriváty (náhledy) tímto způsobem chránit neumí, stejně jako třeba videa, která pro online překrávání také musí být přímo přístupné. V tomto případě pouze stačí znát URL adresu a uživatel si může tato data stáhnout i bez autentizace. Rozdíly v URL viz následující příklady:

  • přímo přístupný náhled fotografie: http://jackc.teptin.net/galerie/_data/i/upload/2006/05/14/200605141234567-2ac57341-me.jpg
  • originál fotografie servírovaný přes PHP kód s autentizací: http://jackc.teptin.net/galerie/action.php?id=12345678&part=e

Pomoci tomu můžeme následující Apache konfigurací:

        <DirectoryMatch "/dir/to/piwigo/upload/.*/pwg_representative/.*">
                Order deny,allow
                Allow from all
        </DirectoryMatch>

        <Directory "/dir/to/piwigo/upload">
                Order Allow,Deny
                Deny from all
                SetEnvIfNoCase Request_URI \.(og[gv]|mp4|m4v|webm|avi)$ no-gzip dont-vary
                AddType video/ogg .ogv
                AddType video/mp4 .mp4
                AddType video/webm .webm
                AddType video/x-msvideo .avi
                <FilesMatch "\.(?:mp4|m4v|avi|mov)$">
                        Order deny,allow
                        Allow from all
                </FilesMatch>
        </Directory>

Náhledy alb

Pokud se z nějakého důvodu stane, že mají alba špatné (např. stejné) náhledy, lze je vyresetovat následujícím postupem:

  • (případně) nastavit v cfg: $conf['allow_random_representative'] = true;
  • SQL příkaz: UPDATE piwigo_categories SET representative_picture_id=NULL
  • Admin - Tools - Maintenance: Update album information

Ostatní

Moje konfigurace

Konfiguraci je možné měnit pomocí Piwigo admin - plugins - LocalFiles Editor.

<?php

// clean URL
$conf['question_mark_in_urls'] = false;
$conf['php_extension_in_urls'] = false;
$conf['category_url_style'] = 'id-name';
$conf['picture_url_style'] = 'id-file';

// other
$conf['show_php_errors'] = '';
$conf['guest_access'] = false;
$conf['original_url_protection'] = 'images';
$conf['sync_chars_regex'] = '/^[a-zA-Z0-9-_.&, !]+$/';
$conf['calendar_show_any'] = false;
$conf['calendar_show_empty'] = false;
$conf['newcat_default_commentable'] = false;
$conf['newcat_default_status'] = 'private';
//$conf['allow_web_services'] = false; - po vypnuti nejde editovat uzivatele
$conf['enable_synchronization'] = false;
$conf['inheritance_by_default'] = true;
$conf['upload_form_all_types'] = true;
$conf['allow_random_representative'] = true;
//$conf['display_fromto'] = true;

$conf['picture_ext'] = array('jpg','JPG','jpeg','JPEG','png','PNG','gif','GIF');
$conf['file_ext'] = array_merge($conf['picture_ext'],
  array('tiff','TIFF','tif','TIF','mp3','MP3','mp4','MP4','zip','ZIP','pdf','PDF','doc','DOC','xls','XLS','odt','ODT'));

$conf['my_url'] = 'http://www.myweb.net/foto';
$conf['links'] = array(
  $conf['my_url'].'/index/favorites' => array ('label' => 'Oblíbené', 'new_window' => false),
  $conf['my_url'].'/index/recent_cats' => array ('label' => 'Poslední alba', 'new_window' => false),
  $conf['my_url'].'/search.php' => array ('label' => 'Vyhledat', 'new_window' => false),
);

$conf['show_exif_fields'] = array(
  'Make',
  'Model',
  'ExifVersion',
  'Software',
  'DateTimeOriginal',
  'FNumber',
  'ExposureBiasValue',
  'FILE;FileSize',
  'ExposureTime',
  'Flash',
  'ISOSpeedRatings',
  'FocalLength',
  'FocalLengthIn35mmFilm',
  'WhiteBalance',
  'ExposureMode',
  'MeteringMode',
  'ExposureProgram',
  'LightSource',
  'Contrast',
  'Saturation',
  'Sharpness',
  'channel',
  'date_creation',
  'display_aspect_ratio',
  'duration',
  'filesize',
  'format',
  'frame_rate',
  'latitude',
  'longitude',
  'make',
  'model',
  'playtime_seconds',
  'sampling_rate',
  'type',
  'resolution',
  );

?>