niedziela, 28 listopada 2010

Synchronizacja Bridge⇔Lightroom



Kolega namówił mnie na zakup Lightrooma, twierdząc że jest to świetne narzędzie do katalogowania i przeglądania zdjęć. Zaufałem i kupiłem. Jestem w trakcie oswajania się z interfejsem.

Pierwszy problem, który napotkałem ma związek ze współdzieleniem metadanych z ocenami między Bridgem (BR) i Lightroomem (LR). Gwiazdki przenoszą się bez problemu. Kolory też, po wybraniu w menu LR MetadataColor Label SetBridge Default. Jeśli zmieniliśmy jakieś matadane w Bridge po zaimportowaniu obrazków do LR, wystarczy zaznaczyć wszystkie obrazki i wybrać Metadata▸Read Metadata from File. AFAIK nie ma możliwości automatycznego (= bez klikania czegokolwiek) uaktualnienia danych w LR, jeśli zmienił się plik XMP. Po wykonaniu powyższych kroków, synchronizację Bridge▸Lightroom mamy prawie zrobioną.

Aby ustawianie przenosiły się z Lightroom do Bridge, wystarczy w dialogu EditCatalog Settings... [Ctrl]+[Alt]+[,], w zakładce Metadata zaznaczyć opcję Automatically write changes into XMP. Od tej chwili, każda zmiana metadanych zostanie od razu zapisana w pliku XMP. Tę zmianę Bridge wychwytuje natychmiast bez problemu (trzeba przełączyć się na okno Bridga; czasami konieczne jest też odświeżenie [F5]).

Pozostał tylko jeden problem -- synchronizacja zdjęć oznaczonych jako 'Rejected'. Bridge przypisuje do takich zdjęć ocenę -1 (xap:rating) w pliku XMP. Lightroom wcale nie umieszcza informacji o fladze "rejected" w tym pliku. Flagi trzymane są jedynie w bazie danych LR.

Najprostszym rozwiązaniem jest rezygnacja ze stosowania oceny (w Bridge) lub flagi (w lightroom) "Rejected" na rzecz oznaczeń kolorami. Można też każdorazowo przeprowadzać ręczną synchronizację opisaną poniżej. (BR→LR) Zdjęcia które zostały już oznaczone jako odrzucone, można jednym kliknięciem odfiltrować, zaznaczyć wszystkie i zmienić kolor (np. na fioletowy; Label>To Do). Teraz zostaje tylko odświeżenia metadanych w LR (Metadata▸Read Metadata from File). Dodatkowo można teraz oflagować zdjęcia jako Rejected i usunąć kolor (UWAGA - patrz niżej). Synchronizację LR→BR przeprowadzamy analogicznie. W przypadku braku wolnego koloru, można posłużyć się słowem kluczowym, np. 'rejected'.

Zważywszy na fakt, iż synchronizacja musi być wykonywana ręcznie, dość łatwo doprowadzić do niespójności w oznaczeniach plików odrzuconych w LR i BR. Trzeba też uważać na sytuację, gdy wcześniej odrzucony plik "przywracamy do życia", tj. zmieniamy jego stan z "rejected" na inny. W LR ocena zdjęcia jest niezależna od flag, można zatem odrzucony plik ocenić np. na 3 gwiazdki (zakładamy, że wcześniej nie był wcale oceniany). Spowoduje to w BR ustawienie oceny na 3, a co za tym idzie usunięcie oznaczenia "rejected". Jeśli w BR zmienimy ocenę 'rejected' na 0..5 gwiazdek, analogiczna zmiana w ocenie nastąpi w LR. Jednak flaga odrzucenia pozostanie ustawiona. Ten przypadek łatwo wykryć, jeśli przyjmiemy zasadę, iż wszystkie odrzucone w LR pliki powinny posiadać ocenę 0 gwiazdek.

Biorąc pod uwagę powyższe spostrzeżenia, najbezpieczniej jest zrezygnować ze stanu 'rejected' na rzecz koloru, mając nadzieję, że przy następnym uaktualnieniu Adobe wymyśli sposób na rozwiązanie problemu synchronizacji odrzuconych zdjęć.

Jest jeszcze drugie potencjalne rozwiązanie. Baza danych LR zapisywana jest w formacie SQL Light 3 (rozszerzenie lrcat), można zatem, bazując na ocenie zapisanej w pliku XMP, zmodyfikować flagi odrzucenia bezpośrednio w bazie i vice versa. Problem w tym, że LR (dokładniej: SQL Lite) nie zmienia pliku bazy danych zaraz po zmianie oceny (ani w bliskiej przyszłości). Nie udało mi się zmusić LR do zapisania pliku z bazą danych "na żądanie". Zmiany można zatem wprowadzać/odczytywać, tylko wtedy, gdy LR nie jest uruchomiony.

Można napisać narzędzie, które przeskanuje bazę danych LR i odpowiednie pliki XMP (informacje o ich lokalizacji są w bazie). Na podstawie zebranych danych zsynchronizuje obie lokacje. Decyzję w którą stronę synchronizować można podjąć bazując np. na czasie ostatniej modyfikacji.

Jeszcze lepiej by było, gdyby dało się odczytywać i zapisywać dane z bazy podczas działania LR. Mam klika pomysłów na osiągnięcie tego :) Bazę eksplorowałem za pomocą programu SQLiteSpy, który może mieć ograniczone możliwości w kwestii blokad i współdzielenia bazy. Możliwe, że da się osiągnąć to, o czym pisałem wyżej za pomocą API albo wstrzyknąć wątek do procesu LR i użyć SQLite Shared-Cache Mode. Możliwe, że trzeba będzie trochę pogrzebać w części kodu odpowiedzialnej za łączenie się z bazą.

Życie było by o wiele piękniejsze, gdyby wszystkie programy były Open Source (przynajmniej w części UI i logiki). Z drugiej strony -- nie było by wtedy zabawy przy Reverse Engineeringu ;)

Na koniec zapytanie SQL pokazujące jak można wyciągnąć z bazy LR flagę (0 - brak flagi, 1 - oflagowane (flagged), -1 - odrzucone (rejected)) dla pliku o danej nazwie:
SELECT ai.pick 
FROM
   Adobe_images ai
   JOIN AgLibraryFile alfi ON (ai.rootfile=alfi.id_local)
WHERE
   alfi.baseName = 'NazwaPlikuBezRozszerzenia'
   AND alfi.folder=(
                SELECT alfo.id_local
                FROM
                    AgLibraryFolder alfo
                    JOIN AgLibraryRootFolder alrf ON (alfo.rootFolder=alrf.id_local)
                WHERE absolutePath='C:/ścieżka/do/pliku/'
                );

Brak komentarzy:

Prześlij komentarz