Adobe Lightroom and non-catalogued photos

From time to time, when I intend to remove an image from Lightroom and delete it from disk, I hit a wrong button and end up to just remove it from Lightroom. The unwanted image file itself stays on my hard drive and reserves precious disk space.

It is very labourous to manually find and delete those orphaned files. I’m not aware of any Lightroom function or utility which would do it on my behalf. So I wrote this small and simple PHP-script to help the job.

  1. <?php
  2. /**
  3.  * This PHP5 CLI script iterates recursively through a directory tree and looks
  4.  * for image files, which it then tries to find in an Adobe Lightroom 2 catalog.
  5.  * If image is not found in Lightroom, its path and filename are printed out.
  6.  *
  7.  * Note that I have a dualbooting computer. I use Lightroom on Windows but I run
  8.  * this script on Linux.
  9.  * My Linux mount points '/media/win' and '/media/fat' equal to Windows drive
  10.  * letters 'C:' and 'E:'.
  11.  *
  12.  * @author  Teemu Mäntynen
  13.  * @link    http://www.mantynen.com/teemu/
  14.  * @license BSD http://www.opensource.org/licenses/bsd-license.php
  15.  *
  16.  * This software is provided "AS IS". NO WARRANTY. USE AT YOUR OWN RISK.
  17.  */
  18.  
  19. //Path to root of photo directories
  20. $path = realpath('/media/fat/kuvat/foto/raw');
  21.  
  22. //Adobe Lightroom SQLite3 catalog file
  23. $db = new PDO('sqlite:/media/win/Documents and Settings/teemu/My Documents/My Pictures/Lightroom/Lightroom 2 Catalog.lrcat');
  24.  
  25. //Image file filename extensions
  26. $imgFileExtensions = array(
  27. 'jpg', 'jpeg', 'tif', 'tiff',  'psd', 'bmp', '3fr', 'raf', 'crw', 'cr2', 'k25',
  28. 'kdc', 'dcs', 'dcr', 'drf', 'mrw', 'nef', 'nrw', 'orf', 'dng', 'ptx', 'pef',
  29. 'arw', 'srf', 'sr2', 'x3f', 'erf', 'mef', 'mos', 'raw', 'rw2', 'cap', 'iiq',
  30. 'r3d', 'fff', 'pxn', 'bay', 'rwz');
  31.  
  32. $ngImages  = 0; $okImages  = 0; $nonImages = 0;
  33.  
  34. $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
  35.  
  36. foreach ($files as $name => $file) {
  37.     if (in_array(getExtension($file), $imgFileExtensions)) {
  38.         //Modify Linux path to Windows path ('/media/fat' is 'E:' and '/' is '\')
  39.         $pathname = str_replace('/', '\\', str_replace('/media/fat', 'E:', $name));
  40.         //'W' in the beginning of value of robustRepresentation stands for 'Windows'?
  41.         $sql = "SELECT COUNT(*) FROM AgLibraryFile WHERE robustRepresentation='W$pathname'";
  42.         if ($db->query($sql)->fetchColumn() == 0) {
  43.             //Image not found in Lightroom. Echo path and filename.
  44.             echo $file->getPathname()."\n";
  45.             //Be careful – unlink deletes the file! unlink($file->getPathname());
  46.             $ngImages++;
  47.         } else { $okImages++; }
  48.     } else {
  49.         //echo 'Not an image: '.$file->getPathname()."\n";
  50.         $nonImages++;
  51.     }
  52. }
  53.  
  54. //echo 'Finished. OK: '.$okImages.' NG: '.$ngImages.' Non image: '.$nonImages."\n";
  55. exit(0);
  56.  
  57. function getExtension(SplFileInfo $fileInfo)
  58. {
  59.     $name = $fileInfo->GetFilename();
  60.     $extension = strrpos($name, ".", 1) + 1;
  61.     if ($extension != false) {
  62.         return strtolower(substr($name, $extension, strlen($name)$extension));
  63.     } else { return ''; }
  64. }
  65. ?>

FOSDEM ’09 on takana

FOSDEM ’09 eli Free and Open Source Developers’ European Meeting 2009, jota mainostin aiemmassa merkinnässä jo ennakkoon, on nyt nähty.

Kävijöitä oli niin hillitön määrä, että Brysselin vapaan yliopiston käytävät olivat ratkeamispisteessä. Luentoja järjestettiin samanaikaisesti useassa rakennuksessa ja vielä useammassa salissa, joten toisinaan olisi pitänyt olla kahdessa paikassa samaan aikaan.

Itse pidin erityisesti näistä luennoista:

  • David Ascher: Thunderbird 3
    Olen käyttänyt Thunderbird-sähköpostiohjelmaa jostain viime vuosituhannen puolelta lähtien (silloin kun se oli vielä Mozilla Mail & News). Oli mukavaa nähdä ja kuulla, kuinka Thunderbirdin kehitys on saanut uutta potkua ja tulevaisuus näyttää valoiselta ja mielenkiintoiselta.
  • Theodore Ts’o: Ext4
    Theodore on sekä guru että hyvä esiintyjä. Guruja on aina mielenkiintoista kuunnella, vaikka asia kaikesta pinnistelystä huolimatta menisikin yli hilseen.
  • Wookey: tee-se-itse aurinkopaneelijärjestelmä
    Ympäristöystävällinen juotinta ja pitkäpinnaista vaimoa vaativa rakenteluprojekti brittiaksentilla ja -huumorilla höystettynä.

Ohessa muutama kuva lauantailta ja sunnuntailta.

Flickr:

FOSDEM ’09

Brysselin vapaan yliopiston kampuksella 7.2.-8.2.2009 yhdeksännen kerran järjestettävä FOSDEM (Free and open source software developers’ european meeting) on yksi Euroopan suurimpia vapaan ja avoimen lähdekoodin käyttäjä- ja kehittäjäyhteisön kokoontumisia. Ilmainen sisäänpääsy.

Syy blogin hiljaiseloon – oman yrityksen perustaminen pitää kiireisenä

Hidas salamablogi on viettänyt viime aikoina hiljaiseloa. Edellisestä blogimerkinnästä on kohta puoli vuotta aikaa. Nimi tosiaan on enne – tämä salamablogi on nyt hidas.

Syynä hiljaiseloon on oman yrityksen perustamiseen ja pyörittämiseen liittyvät kiireet, joilta ei ole juuri liiennyt aikaa harrastuksille. Esim. valokuvaus on rajoittunut lähinnä satunnaiseen kameran kanniskeluun viikonloppumatkoilla ja myrskybongausreissulle en ole tänä vuonna kerinnyt kertaakaan. En silti valita, sillä valinta oli sekä oma että tietoinen ja yrittäjäksi ryhtyminen on ollut hyvin mielenkiintoista ja antoisaa.

Aivomatic Oy:n logo

Aivomatic Oy

Yritykseni Aivomatic Oy on avoimen lähdekoodin verkkokauppa- ja verkkomaksuohjelmistojen spesialisti. Aivomaticin tuotteiden ja palvelujen avulla voi tarjota verkkokaupan asiakkaille kattavan valikoiman verkkopankki-, luottokortti-, PayPal-, tilisiirto- ja muita maksutapoja helposti ja turvallisesti.

Vaikka Aivomatic on yrityksenä nuori, niin itse asiassa sen tuotteiden perusta  juontaa jo useamman vuoden päähän projektiin, jossa olin mukana perustamassa verkkokauppaa. Perusteellisen valintaprosessin pohjalta verkkokaupan perustaksi valittuun verkkokauppaohjelmistoon tarvittiin lisäosat, joilla verkkokauppaan voitiin ottaa käyttöön suomalaiset verkkopankkimaksut. Koska sellaisia ei ollut olemassa, ne piti kehittää itse. Oli myös luontevaa lisensoida ne vapaan ja avoimen lähdekoodin lisenssillä ja antaa muidenkin käyttöön. Niinpä vaikka Aivomatic onkin vasta muutaman kuukauden ikäinen, sen tuotteet ovat olleet laajassa tuotantokäytössä jo useamman vuoden ajan.

Tuotteet

FIPN

FIPN - Finnish Instant Payment Notification

FIPN (Finnish Instant Payment Notification)

Fipn on Aivomaticin kruunun jalokivet, eli verkkokauppaohjelmistosta riippumaton ohjelmistokehys, jonka avulla verkkomaksuohjelmistoja voidaan toteuttaa mahdollisimman helposti ja tyylikkäästi kaikkiin avoimen lähdekoodin verkkokauppoihin.

Merkittävä osa Aivomaticin alkuaikojen tuotekehityksestä on kohdistunut Fipn-ohjelmistokehyksen jatkokehitykseen. Alla lyhyesti esiteltävät SVMMG ja SVMVM ovat uudistetun ohjelmistokehyksen ensimmäisiä hedelmiä, joita perusteellisen esityön ansiosta voidaan jatkossa luoda lisää.

SVMMG

SVMMG - Suomen Verkkomaksut Magento-verkkokauppaan

Suomen Verkkomaksut Magento-verkkokauppaan

Suomen Verkkomaksut Oy:n palvelulla verkkokauppaan voidaan ottaa käyttöön kaikki suomalaiset verkkopankkimaksut, luottokorttimaksut sekä PayPal-maksut. Aivomaticin SVMMG-ohjelmalla Suomen Verkkomaksut Oy:n palvelu voidaan liittää Magento-verkkokauppaan.

SVMVM

SVMVM - Suomen Verkkomaksut VirtueMart-verkkokauppaan

Suomen Verkkomaksut VirtueMart-verkkokauppaan

SVMVM-ohjelmalla Suomen Verkkomaksut Oy:n palvelu (kts. yllä) voidaan liittää VirtueMart-verkkokauppaan.

Suomen läänit, maakunnat, seutukunnat ja kunnat

Tässä päivänä eräänä minulle syntyi tarve käyttää tietoa, joka kuvaisi Suomen kuntia sekä niiden suhdetta läänien, maakuntien ja seutukuntien hierarkiseen rakenteeseen. Palaan tuohon tarpeeseen lähiaikoina uudelleen erillisen blogimerkinnän muodossa. Lyhyesti kuitenkin todettakoon, että tarve liittyi valokuvien avainsanojen määrittelyyn. Ja vielä lisävinkkinä mainittakoon, että jos mieleesi juolahtaa, että tämä olisi kiva saada Lightroomin avainsanalistan osaksi, niin kannattaa poiketa myöhemmin uudestaan.

Yritin löytää valmista tiedostoa tai muuta vastaavaa, jossa olisi ollut tarvittavat tiedot ja sovellettavissa oleva esitysmuoto, mutta mitään sopivaa ei tietenkään tullut vastaan. Piti sitten tehdä itse. Lähteenä käytin mm. Wikipediaa, jossa on dokumentoitu kaikki läänit, maakunnat, seutukunnat ja kunnat ja niiden hierarkinen rakenne. Lisäksi käytin joukkoa muita satunnaisia sivuja ruotsin- ja englanninkielisten nimien etsimiseen ja tarkistamiseen. Eli tietoa kyllä oli, mutta se oli puutteellista ja hajallaan ja sitä piti järjestellä sopivampaan muotoon.

Lopputuloksena syntyi taulukko, jonka voi ladata täältä. Taulukko on Open Document -formaatissa (.ods). Sitä voi käsitellä esim. OpenOfficen Calc-sovelluksella. Ne poloiset, jotka sinnittelevät omisteisia ja suljettuja tiedostomuotoja käyttävien taulukkolaskentaohjelmien kanssa, voivat ladata taulukon CSV-muodossa (UTF-8).

Taulukon on tarkoitus palvella ensisijaisesti omia tarpeitani. Taulukolla ei ole minkään valtakunnan virallista asemaa. Oikeellisuudesta tai täydellisyydestä ei anneta mitään takuita. Jos taulukko ei sovi jonkun toisen tarpeisiin, sitä voi muuttaa tai jättää käyttämättä. Palautetta ja parannusehdotuksia otetaan silti toki suurella kiitollisuudella vastaan.

On taulukosta sitten hyötyä muille tai ei, niin minusta sen hautominen vain omassa pöytälaatikossa olisi tyhmää. Taulukon antaminen muiden käyttöön ei ole minulta pois. Ihan mihin tahansa paikkojen nimiä sisältävään listaan ei voi saada tekijänoikeussuojaa. Mutta koska tietokanta voi tekijänoikeuslain mukaisesti kuitenkin saada suojan, jos tietokannan sisällön kerääminen, varmistaminen tai esittäminen on edellyttänyt huomattavaa panostusta, niin otetaan se nyt sitten esille tässä ihan virallisesti, niin kenenkään ei tarvitse arvuutella asiaa. Eli – tätä taulukkoa saa kopioida, muokata ja jaella eteenpäin GNU Free Documentation Licensen ehdoilla. Eli hyvin tehokkaasti tiivistettynä: voit tehdä taulukolla mitä tykkäät, kunhan eteenpäin sitä jaellessasi annat vastaanottajille samat oikeudet. Wikipedia käyttää samaa lisenssiä.

Taulukon sarakkeet

  • Sarake A – id

    Kullakin listan rivillä on yksilöllinen tunnus eli ns. id-numero. id on sikäli täysin keksitty ja keinotekoinen, että sillä ei ole mitään yhteyttä mihinkään viralliseen numerointi- tai luokitusjärjestelmään.

  • Sarake B – level

    Level eli taso kertoo, monennellako tasolla kohde on hierarkisessa rakenteessa. Tämä on tarkoitettu lähinnä helpottamaan taulukon manuaalista käyttöä taulukkolaskentaohjelmassa. Sama tieto on helppoa laskea ohjelmallisestikin, eli minkään taulukon jatkokäsittelyyn tarkoitetun ohjelmiston ei ole pakko (tai järkevää) luottaa tähän taulukon sarakkeeseen. Eli halutessaan sarakkeen solut voi jättää tyhjäksikin.

  • Sarake C – parent_id

    parent_id kertoo, minkä hierarkiassa yhtä tasoa ylempänä olevan kohteen alaisuuteen kyseinen kohde kuuluu. Eli esim. kunta-riviltä viitataan seutukunnan id-numeroon. Seutukunta-riviltä viitataan maakunnan id-numeroon jne. Niin sanotusta juurielementistä, eli tässä tapauksessa Suomi, ei viitata mihinkään. Niinpä sen arvona tässä sarakkeessa on nolla.

  • Sarakkeet D-F – nimien lyhyt muoto

    Sarakkeissa D-F on kohteiden nimien mahdollisimman lyhyt mutta kuitenkin yksilöivä esitysmuoto niin kuin se omasta mielestäni parhaiten sattui toimimaan. Kyse on siis kaikin tavoin epävirallisesta muodosta.

    • Sarake D – keyword

      keyword-sarakkeessa on kohteen nimen lyhyt suomenkielinen nimi. Joka rivillä on tässä sarakkeessa arvo, eli tätä voinee nimittää jonkinlaiseksi pääsarakkeeksi.

    • Sarake E – synonym1

      synonym1-sarakkeessa on kohteen nimen lyhyt ruotsinkielinen nimi. Jos kunnalla ei ole ruotsinkielistä nimeä, suomenkielistä nimeä ei ole toistettu tässä sarakkeessa.

    • Sarake F – synonym2

      synonym2-sarakkeessa on kohteen nimen lyhyt englanninkielinen nimi. Kuntien suomen- tai ruotsinkielistä nimeä ei ole toistettu. Tyypillisestihän englanniksi puhuttaessa käytetään suomenkielistä kunnan nimeä.

  • Sarakkeet G-I – nimien virallisempi muoto

    Sarakkeissa G-I on kohteiden nimien pidempi ja parhaan mukaan virallisempi esitysmuoto.

    • Sarake G – synonym3

      synonym3-sarakkeessa on kohteen nimen pitkä suomenkielinen nimi. Kuntien nimiä ei ole toistettu.

    • Sarake H – synonym4

      synonym4-sarakkeessa on kohteen nimen pitkä ruotsinkielinen nimi. Kuntien nimiä ei ole toistettu.

    • Sarake I – synonym5

      synonym5-sarakkeessa on kohteen nimen pitkä englanninkielinen nimi. Kuntien nimiä ei ole toistettu.

  • Loput sarakkeet

    Tässä taulukossa muita sarakkeita ei ole hyödynnetty. Kunkin omasta käytöstä riippuen lopuissa sarakkeissa voinee esittää lisää muita synonyymeja. Se tietysti riippuu siitä, millä tavalla taulukkoa jatkokäsitellään.

Taulukon rivit

  • Rivi 1 – otsikot

    Ensimmäisellä rivillä on kunkin sarakkeen nimi tai otsikko. Jatkokäsittelyyn käytettävästä menetelmästä riippuu, voiko otsikkoa muuttaa. Kunkin omassa käytössä tällä tuskin on suurta merkitystä.

  • Loput rivit – kohteet

    Lopuilla riveillä on yksi kohde, eli maa, lääni, maakunta, seutukunta tai kunta per rivi.

    Tässä taulukossa rivit on järjestetty hierarkisen rakenteen mukaan niin, että ylimpänä on maa, sitten kaikki läänit, kaikki maakunnat, kaikki seutukunnat ja lopuksi kaikki kunnat. Läänit, maakunnat ja seutukunnat ovat siinä järjestyksessä, jossa satuin ne Wikipediasta löytämään. Kunnat on järjestetty suomenkielisen nimen mukaan laskevaan aakkosjärjestykseen.