Skip to content

Commit

Permalink
Add xmp:contributor to track passed stages.
Browse files Browse the repository at this point in the history
  • Loading branch information
Claudius Röhl committed Oct 8, 2024
1 parent dc6f642 commit 18bb59d
Show file tree
Hide file tree
Showing 7 changed files with 79 additions and 8 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,3 +126,4 @@ Die Reihenfolge müsste nicht fest sein, soll sie aber. Das Leitmotiv ist „Kon

Grundsätzlich kann in jedem Schritt eine Pause eingelegt werden, um die Arbeit an dem jeweiligen Ordner später wieder aufzunehmen. Um festzulegen, welche Datei der nach Aufnahmedatum sortierten Medien des aktuellen Ordners zuletzt bearbeitet wurde, wird vor die Dateierweiterung der betreffenden Datei das Kürzel \~LAST geschrieben, z.B. wird aus *P273744.jpg* die Datei *P273744\~LAST.jpg*. Bei Wiederaufnahme der Bearbeitung des Ordners wird das Suffix wieder entfernt. So erkennt man auf den ersten Blick, wo man steht und wieviel noch fehlt. Gibt es keine solche Endung muss davon ausgegangen werden, dass der anstehende Schritt noch nicht bearbeitet wurde.

In jedem Schritt soll außerdem **XMP:Contributor**, das eine Liste enthält, um einen Eintrag ergänzt werden, der den Namen des aktuell ausgeführten Schritts beinhaltet. Auf diese Weise ist sichergestellt, dass wir eine Bearbeitungshistorie in jedem Medium speichern, die leichter nachvollziehbar macht, welche Schritte bereits durchgeführt wurden.
8 changes: 6 additions & 2 deletions modules/general/mediaconverter.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,5 +86,9 @@ def convert(self):
# at the moment no else with append non-skip task needed as the converter handles everything. This should be refactored.

def getTasks(self) -> List[TransitionTask]:
self.convert()
return []
if self.converter == passthrough:
return [TransitionTask(index=index) for index, _ in enumerate(self.toTreat)]
else:
self.convert()
return [] #TODO something is strange here and should be adressed. If transitions Tasks are returned, unittests don't run.
return self.transitionTasks
2 changes: 1 addition & 1 deletion modules/general/mediafile.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class MediaFile:
def __init__(self, path, validExtensions):
self.nrFiles = 1
self.valid = True
self.extensions : list[str] = []
self.extensions: list[str] = []

splitted = os.path.splitext(path)
self.pathnoext = splitted[0]
Expand Down
27 changes: 25 additions & 2 deletions modules/general/mediatransitioner.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ def __init__(self, input: TransitionerInput):
super().__init__(input.verbose)
self.src = os.path.abspath(input.src)
self.dst = os.path.abspath(input.dst)
self.current_stage = os.path.basename(self.src)
self.input = input
self.move = input.move
self.recursive = input.recursive
Expand Down Expand Up @@ -239,13 +240,17 @@ def getSuccesfulChangedMetaTagTasksOf(self, tasks: List[TransitionTask]):
return tasks

self.printv("Set meta file tags..")

with ExifToolHelper() as et:
for task in tqdm(tasks):
if len(task.metaTags) == 0 or self.dry:
continue
try:
files = self.toTreat[task.index].getAllFileNames()

self.add_transition_to_files_stage_history(et, task, files)

if len(task.metaTags) == 0 or self.dry:
continue

et.set_tags(
files,
task.metaTags,
Expand All @@ -265,6 +270,24 @@ def getSuccesfulChangedMetaTagTasksOf(self, tasks: List[TransitionTask]):

return self.getNonSkippedOf(tasks)

def add_transition_to_files_stage_history(self, et, task, files):
curr_stage_history = et.get_tags(
files[0],
MowTags.stagehistory,
params=[
"-m",
"-L",
"-struct",
], # -struct is needed, otherwise lists are flattened by exiftool
)[0]

if MowTags.stagehistory in curr_stage_history:
curr_stage_history[MowTags.stagehistory].append(self.current_stage)
else:
curr_stage_history[MowTags.stagehistory] = [self.current_stage]

task.metaTags[MowTags.stagehistory] = curr_stage_history[MowTags.stagehistory]

def doRelocationOf(self, tasks: List[TransitionTask]):
failed = 0
for task in tasks:
Expand Down
2 changes: 2 additions & 0 deletions modules/mow/mowtags.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ class MowTags:
subject = "XMP:Subject"
hierarchicalsubject = "XMP:HierarchicalSubject"
label = "XMP:Label"
stagehistory = "XMP:Contributor"

gps_latitude = "Composite:GPSLatitude" # this avoids the need to use the GPSLatitudeRef tag when writing
gps_longitude = "Composite:GPSLongitude" # this avoids the need to use the GPSLongitudeRef tag when writing
Expand All @@ -23,6 +24,7 @@ class MowTags:
subject,
hierarchicalsubject,
label,
stagehistory,
*gps_all,
]

Expand Down
2 changes: 1 addition & 1 deletion tests/test_aggregator.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@

import logging


testsfolder = abspath("tests")

src = os.path.abspath(join(testsfolder, "filestotreat"))
Expand Down Expand Up @@ -413,6 +412,7 @@ def test_optionalXMPTagLabelIsCopiedFromJpg():
params=["-P", "-overwrite_original"],
files=str(ifile),
)


assert bothFilesAreInSRC(fullname)

Expand Down
45 changes: 43 additions & 2 deletions tests/test_mow.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
from datetime import datetime
from ..modules.general.medialocalizer import BaseLocalizerInput
from ..modules.mow.mowtags import MowTags
from ..modules.image.imagerenamer import *
from ..modules.mow.mow import Mow
import shutil
from os.path import *
import os
from exiftool import ExifToolHelper

testfolder = "tests"
workingdir = abspath(join(testfolder, "mow_test_workingdir"))
Expand Down Expand Up @@ -106,6 +108,43 @@ def test_filewasmoved():
assert exists(join(convertdir, "subfolder", "2022-07-27@215555_test3.JPG"))


def test_stage_history_was_added():
prepareImageConversionTest()
prepareRenameTest()

srcfile = join(workingdir, "2_rename", "subfolder", "test3.JPG")

assert exists(srcfile)

Mow(settingsfile=settingsfile, dry=False).rename()
assert not exists(srcfile)
target_file_renaming = join(convertdir, "subfolder", "2022-07-27@215555_test3.JPG")
assert exists(target_file_renaming)

with ExifToolHelper() as et:
tags = et.get_tags(
target_file_renaming, ["XMP:Contributor"], params=["-struct"]
)[0]
assert MowTags.stagehistory in tags
assert os.path.basename(renamedir) in tags[MowTags.stagehistory]

Mow(settingsfile=settingsfile, dry=False).convert()

assert not exists(target_file_renaming)
target_file_conversion = join(
workingdir, "4_group", "subfolder", "2022-07-27@215555_test3.JPG"
)
assert exists(target_file_conversion)

with ExifToolHelper() as et:
tags = et.get_tags(
target_file_conversion, ["XMP:Contributor"], params=["-struct"]
)[0]
print(tags)
assert MowTags.stagehistory in tags
assert os.path.basename(convertdir) in tags[MowTags.stagehistory]


def test_groupingMovesDirectoriesIntoRateFolder():
prepareGroupingTest()

Expand Down Expand Up @@ -185,7 +224,9 @@ def test_localizedImageIsTransitioned():

assert exists(srcfile)

Mow(settingsfile=settingsfile, dry=False).localize()
Mow(settingsfile=settingsfile, dry=False).localize(
localizerInput=BaseLocalizerInput()
)

assert not exists(srcfile)
assert exists(join(aggregatedir, "subfolder", "localized.jpg"))
Expand Down

0 comments on commit 18bb59d

Please sign in to comment.