Ansel dziedziczy po Darktable jego bazodanowy kręgosłup: nieniszczące historie edycji zapisywane są dla każdego zdjęcia w bazie danych SQLite, wraz z metadanymi i innymi danymi zdefiniowanymi przez użytkownika. Uświadomienie bazie danych istnienia nowych zdjęć odbywa się poprzez „importowanie" zdjęć z dysku lub karty pamięci. I tu pojawia się narzędzie importu.
Niestety, importer Darktable to kolejna rzecz, którą sknocono około 2020 roku i zamieniono w coś głęboko niepokojącego, ponieważ jest to przeglądarka plików, która nie przypomina żadnej wcześniej znanej przeglądarki plików, a przy tym udaje jej się nie mieć podstawowych funkcji (jak Ctrl+F czy podgląd EXIF), będąc jednocześnie napchaną bezużytecznymi (patrz niżej). To tutaj tracimy niejednego przyszłego użytkownika, a jest to dopiero krok 0 procesu pracy. Cóż za wspaniała wizytówka tego, co potrafi „aplikacja do pracy z procesem" (workflow app)!
Przegląd projektu, czyli do czego prowadzi projektowanie komitetowe
A więc Darktable ma przyciski importu w widgecie na pasku bocznym. Jest ich 3, jeśli podłączyłeś aparat przez USB, w przeciwnym razie 2:

Wiele postów na forach poświęcono na wyjaśnianie w kółko, jaka jest różnica między add to library a import and copy (import w rzeczywistości oznacza add to library). Warto też wspomnieć, że przycisk mounting camera nie robi nic więcej niż to, co robi za Ciebie dowolny systemowy sterownik PTP lub MTP : montuje wewnętrzną kartę SD jako zewnętrzną pamięć masową USB, poprzez port USB aparatu. W systemie Windows wymaga to zainstalowania niestandardowego sterownika USB, który uniemożliwi Twojemu aparatowi współpracę z resztą systemu operacyjnego. W systemie Linux, w zależności od tego, czy Twój system operacyjny ma włączony „automatyczny montaż", może być konieczne najpierw odmontowanie aparatu z przeglądarki plików pulpitu, w przeciwnym razie zablokuje ona połączenie. We wszystkich systemach operacyjnych wymaga to ciągłego nasłuchiwania nowych urządzeń w tle, aby aplikacja mogła zareagować na podłączenie na gorąco, niezależnie od tego, czy zamierzasz z tej funkcji skorzystać, czy nie.
A do tego są jeszcze parametry. Od 2022 roku zespół Darktable zakochał się bez pamięci w tych zwijanych szufladkach, które ukrywają nadmiar pod jeszcze większym nadmiarem. A nadmiar, który można tam znaleźć, nie robi nic więcej niż wciśnięcie Ctrl+A (zaznacz wszystkie zdjęcia), a następnie 0 lub 1 (aby przypisać początkową ocenę 0 lub 1 gwiazdki) albo wypełnienie informacji metadanych (wsadowo) w module o tej samej nazwie, który znajduje się w interfejsie stołu podświetlanego, czy Ci się to podoba, czy nie, i obsługuje ustawienia predefiniowane na wypadek, gdybyś zawsze używał tych samych metadanych. Powód, dla którego dodanie tych parametrów w tym miejscu w ogóle było wymogiem, przerasta moje pojęcie. Ktoś, gdzieś, prawdopodobnie oszczędza 0,5 s na sesję importu, które reszta świata traci, przewijając większą wysokość.
A więc, zakładając, że zrozumiałeś różnice między wszystkimi tymi opcjami, teraz klikasz import and copy, co jest prawdopodobnie najczęściej używaną opcją, ponieważ każdy fotograf musi opróżnić karty SD do bardziej trwałego magazynu. A potem…

To jest zasadniczo przyznanie się, że projekt jest tak fatalny, że graniczy z nieużywalnością bez czytania dokumentacji. Ale chwila, co my znowu robimy? Kopiujemy zdjęcia. Kopiujemy zdjęcia? Więc czy zdałeś egzamin z kopiowania zdjęć i uzyskałeś dyplom z kopiowania zdjęć? Jeśli nie, powinieneś. Uważaj, w przyszłej wersji mogą zamienić to w quiz i wyłączyć funkcję, jeśli go nie zdasz.
A więc klikasz na ten złowieszczy przycisk mówiący, że bierzesz pełną odpowiedzialność za wszelkie szkody, jakie mogą wyniknąć z kopiowania zdjęć. Albo nie klikasz, biorąc pod uwagę, że wygląda dość przerażająco. Ale załóżmy, że klikasz…

Chwila, gdzie są zdjęcia? Czy to czytnik logów? Rzuć kością dwunastościenną, a jeśli wyrzucisz 8, zorientujesz się, że te ikonki oka reagują na kliknięcie i po kliknięciu wyświetlają miniaturę. Do diaska, jeśli klikniesz oko w nagłówku kolumny, pokaże wszystkie miniatury naraz. I zepsuje odstępy między wierszami, ale walczymy tu o czekoladowy medal, więc niech będzie:

Usiądź wygodnie na resztę, nie jesteś na to gotowy:
- To coś o nazwie folders w lewej kolumnie jest w rzeczywistości przyciskiem: kiedy go klikniesz, zmienia kolejność wyświetlania tych folderów.
- Ramka places próbuje naśladować ulubione lub zakładki z menedżera pulpitu Twojego systemu operacyjnego, ale ich nie importuje.
- Pole wyboru recursive directory nie jest opcją, jest akcją. Ale przy tym nie działa na tym, co zaznaczyłeś w prawej kolumnie, ponieważ tam są tylko zdjęcia. To, co robi, to bierze folder zaznaczony w lewej kolumnie i wypełnia listę zdjęć, rekurencyjnie przeszukując zaznaczony folder i jego podfoldery.
- select new pictures to, po raz kolejny, nie opcja, lecz akcja, czyli coś, co reszta świata umieszcza w przycisku.
- Pole override today’s date to obejście faktu, że data
EXIFzdjęcia nie może być używana we wzorcach folderów, więc domyślnie używamy dzisiejszej daty. Chyba że to pole jest wypełnione. Ale musi być wypełnione datą i godziną w formacie ISO 8601. Czego tutaj nie zrobiłem, a okno wcale nie protestuje, ponieważ walidacja danych wejściowych formularza jest mniej zabawna niż pozwolenie użytkownikom odkryć w następnym kroku, że muszą zacząć od zera z powodu błędnego formatu daty i godziny. Rany, ile to trzeba wiedzieć w tle, żeby wypełnić cholerną datę, mam wielkie szczęście, że nauczyłem się tego wszystkiego z czytania kodu źródłowego. - Opcja keep original filename jest całkowicie zbędna wobec użycia wzorca nazewnictwa
$(FILE_NAME).$FILE_EXTENSION), - Wzorce nazewnictwa używają masek zmiennych
$(), które są zastępowane w czasie działania faktycznymi właściwościami pliku, ale musisz je znać, aby móc ich użyć. Jak gdyby facet o nazwisku Houz nie napisał około 2011 roku biblioteki implementującej autouzupełnianie w polach tekstowych dla tych zmiennych, którą możesz po prostu wywołać w swoim kodzie, aby zadziałała w 2 liniach (jest używana w module eksportu). - Wzorce nazewnictwa, które się tam znajdują, są zduplikowane w oknie preferencji Darktable, ponieważ możesz potrzebować je zmienić, gdy niczego nie importujesz.
To jest zrobione z materii frustracji. Co jest naprawdę zdumiewające, to jak wiele osób pracowało nad tą funkcją przez lata, żeby dojść do tego punktu. Niektórzy nazwaliby to inteligencją zbiorową , ale w rzeczywistości nazywa się to projektowaniem komitetowym .
Nowe podejście, czyli wymazywanie niechlujstwa z kroku 0
Importowanie obrazów to naprawdę krok 0 pracy z jakąkolwiek aplikacją do edycji obrazów. Niedopuszczalne jest tracenie użytkowników tak wcześnie, zwłaszcza że tak wiele od nich oczekujemy później, gdy przychodzi do rozumienia światła i koloru. Będę jednak argumentował, że światło i kolor to chleb powszedni każdego artysty grafika, i wydaje się rozsądne oczekiwać od użytkowników edycji zdjęć opanowania podstaw swojego rzemiosła w pewnym momencie.1 Z drugiej strony wymaganie od użytkowników zdobycia dyplomu magistra z kopiowania plików jest niedopuszczalne.
Guillaume Stutin i ja przepisaliśmy zatem narzędzie importu w całości, najpierw front-end, a potem back-end. Oto rezultat.

Opcja bezpośredniego montowania karty pamięci aparatu z GPhoto2 została całkowicie usunięta, ponieważ system operacyjny może obsłużyć ten krok bezpośrednio, jeśli zajdzie taka potrzeba. Istnieje tylko jeden punkt wejścia do importu. Następnie pojawia się okno wyboru plików:

Przeglądarka plików to natywny widget wyboru plików Gtk, co oznacza, że zakładki systemu operacyjnego (a nawet, tak jak tutaj, foldery synchronizowane przez Nextcloud) są automatycznie importowane ze środowiska pulpitu. Podgląd zdjęcia został rozszerzony o metadane EXIF, aby lepiej identyfikować obrazy. Sprawdzenie w bazie danych biblioteki pokazuje, czy zdjęcie zostało już zaimportowane do Ansel lub Darktable i gdzie.2
Typy obrazów (raw, nie-raw lub wszystkie) są filtrowane za pomocą natywnych filtrów Gtk, a pełna lista plików do zaimportowania jest budowana bezpośrednio w interfejsie graficznym, bez domysłów po stronie back-endu. Gdy zaznaczone są foldery, ich zawartość jest automatycznie przeszukiwana rekurencyjnie, a pierwszy obraz kolekcji zostaje pokazany. Końcowa liczba wykrytych obrazów jest wyświetlana pod oknem wyboru plików:

Wiele opcji sortowania i wyświetlania jest natywnie obsługiwanych przez okno wyboru plików Gtk, w tym wyszukiwanie (za pomocą Ctrl+F), bez dodatkowej pracy:

Opcja obsługi plików umożliwia import z kopiowaniem lub bez, a etykieta wyjaśnia różnicę pełnymi słowami:

Data projektu jest automatycznie ustawiana na dzisiejszą, bez żadnego nadpisywania ani niczego, co sugerowałoby, że domyślnie dzieje się coś nieujawnionego. Do ustawienia daty dostępny jest widget kalendarza, który automatycznie formatuje datę w prawidłowym formacie ISO. Jeśli data jest wpisywana bezpośrednio w pole tekstowe, wykonywana jest walidacja formatu i wyświetlana jest informacja zwrotna o błędzie:


Zauważ, że widget kalendarza obsługuje tylko datę (rok, miesiąc, dzień). Ustawienie czasu (godzina, minuta, sekunda) musi zostać wykonane ręcznie w polu tekstowym. Ankiety pokazują, że jest to rzadko potrzebne.
Wzorce nazewnictwa folderów i plików automatycznie obsługują autouzupełnianie zmiennych, gdy wpisze się $(. Nowy back-end importu obsługuje używanie pól EXIF obrazów do definiowania nazw folderów, na przykład wzorzec folderu taki jak $(JOBCODE)-$(EXIF.ISO) podzieliłby zdjęcia na kilka folderów nazwanych według ich metadanych ISO. Gdy tak się dzieje, stół podświetlany otwiera ostatnio utworzony folder, gdy okno importu się zamyka:

Na koniec, ale nie mniej ważne, funkcja zgłoszona przez użytkowników: możliwość podglądu rezultatu wzorców zdefiniowanych na aktualnie zaznaczonym zdjęciu:

Rezultat wzorca podąża za zaznaczonymi plikami i folderami, a także za każdą zmianą w folderze głównym i wzorcach. Zauważ, że katalog bazowy (dla wszystkich projektów) nie akceptuje już wzorców, ponieważ nie ma powodu, aby umieszczać wzorce wszędzie, co pozwala na użycie bezpiecznego i prostego widgetu listy folderów Gtk. W ten sposób przynajmniej nadrzędny folder Ansel jest ustawiony w solidny i przyjazny dla użytkownika sposób, a jeśli ze wzorców nazewnictwa wyniknie jakaś szkoda, będzie ona zamknięta w czymś przewidywalnym.
Podsumowanie
Należy zauważyć, że ten prostszy projekt graficzny wiąże się także ze znacznie prostszą strukturą kodu, mniejszą liczbą linii i bardziej liniową logiką. Front-end potrzebuje 1200 linii, a back-end około 400 linii (wliczając komentarze, nowy back-end ma docstringi Doxygen niemal wszędzie). Duża część objętości kodu front-endu pochodzi z rekurencyjnego przeszukiwacza folderów, który działa w osobnym wątku, aby nie blokować wątku interfejsu graficznego, ale mimo to okresowo aktualizuje liczbę plików w celu przekazania informacji zwrotnej. Zostało to przetestowane z folderami zawierającymi ponad 60 000 obrazów.
Darktable ma ponad 2700 linii front-endu i ponad 800 linii back-endu (bez docstringów). Ponadto architektura Darktable zakłada jeden folder docelowy na sesję importu, co zabrania używania EXIF poszczególnych zdjęć we wzorcach nazewnictwa folderów, i ma zupełnie odrębne ścieżki kodu do obsługi rozbieżności między importem z kopiowaniem a bez kopiowania. To utrudnia utrzymanie obu ścieżek w synchronizacji, ponieważ wciąż współdzielą pewne fragmenty (dodawanie do bazy danych i inicjalizacja metadanych). W Ansel scaliliśmy obie ścieżki z jedynie opcjonalnym początkowym I/O do skopiowania plików, jeśli jest to potrzebne.
Front-end i back-end importu w Ansel komunikują się poprzez banalnie prostą listę ścieżek plików, co oznacza, że back-end nie snuje domysłów na temat tego, jaką decyzję podjął użytkownik w interfejsie graficznym. Ponadto cały kod interfejsu graficznego został usunięty z back-endu. Jest to ogólny i solidny projekt, który pozwoli na alternatywne sposoby wytwarzania listy plików do zaimportowania, na przykład bez interfejsu (ze skryptu). Wcześniej rzeczy takie jak filtrowanie JPG czy zmiana kolejności plików odbywały się w back-endzie.3
Główną zaletą oczyszczonego projektu jest to, że wszystkie informacje potrzebne do zrozumienia, co jest czym, są dostępne bezpośrednio w oknie, bez konieczności otwierania dokumentacji. W przypadku konfliktów nazw plików docelowych podczas importu z kopiowaniem użytkownicy są ostrzegani wyskakującym oknem, a istniejące pliki nigdy nie są nadpisywane. Nie wspominając już o tym, że całość przypomina typową przeglądarkę plików.
Niektórzy użytkownicy wyrazili także chęć korzystania z funkcji edycji oprogramowania bez zawracania sobie głowy osobliwością wewnętrznego zarządzania zasobami cyfrowymi (głównie stołu podświetlanego). Ten nowy importer pozwala im otwierać pojedyncze obrazy bezpośrednio w ciemni poprzez dwukrotne kliknięcie pliku lub kliknięcie pliku + kliknięcie przycisku import, skutecznie pomijając stół podświetlany w całości.
Wzorce nazewnictwa zostały, rzecz jasna, usunięte z okna preferencji (które, nawiasem mówiąc, można znaleźć w menu globalnym, poprzez Edit → Preferences, jak w każdym rozsądnym oprogramowaniu).
Wielkie podziękowania dla Guillaume’a Stutina za jego mozolną pracę nad tym zagadnieniem.
Note
Nowy importer jest dostępny w wersjach kompilacji Ansel > 0.0.0+780.Translated from English by : Claude. In case of conflict, inconsistency or error, the English version shall prevail.
Yes, I know it’s already too much to ask in most cases. ↩︎
This reuses the Darktable code but with a clearer display. ↩︎
The whole notion of back-end vs. front-end is new to the Darktable ecosystem, as you will find GUI (Gtk) functions pretty much everywhere, protected by a recurring
if(darktable.gui)to prevent segmentation faults when the software runs from CLI. ↩︎