Table of Contents       9. AppleScript


9.7 Power Beispiele

Dieses Kapitel enthält einige außerordentlich leistungsfähige AppleScript-Beispiele, die für Sie sehr nützlich sein können.

Filmdateiname als EXIF-Erstellungsdatum verwenden
Nachdem wir eine Reihe von MiniDV-Videobändern unserer alten Canon MV30i-Filmkamera mit einem speziellen Mini-FireWire-auf-Thunderbolt-USB-C-Anschlusskabel und Apples iMovie-Software digitalisiert hatten, hatten wir am Ende viele Ordner voller separater MOV-Videodateien, eine für jeden aufgezeichneten Videoschnipsel eines MiniDV-Bandes.

Der Name dieser Videodateien besteht aus dem Datum und der Uhrzeit der Aufnahme, da die Canon, wie die meisten anderen digitalen MiniDV-Videokameras auch, über eine interne Uhr verfügt und die Aufnahmedaten in den Videodaten gespeichert hat.

Hier ist ein Beispiel dafür, wie das aussieht. Bitte beachten Sie, dass die aktuelle EXIF-Datenspalte die Daten und die Uhrzeit anzeigt, zu der iMovie die Datei vom miniDV-Originalband kopiert hat.

file name list


Das ist zwar schon nützlich, aber es wäre noch viel besser, wenn das tatsächliche Aufnahmedatum in das EXIF-Feld für das Aufnahmedatum eingefügt worden wäre, so dass es zum Sortieren und Finden verwendet werden könnte.

Mit der umfangreichen AppleScript-Unterstützung in NeoFinder ist das tatsächlich möglich!

Dieses Beispielskript schaut sich alle Objekte an, die gerade in NeoFinder ausgewählt sind.


tell application "NeoFinder"
set myList to selected items
repeat with theItem in myList
set myName to name of theItem
if (myName ends with ".mov") and (length of (myName) > 21) then -- only .mov video files for this example
set myDate to current date -- use that as a base date
set year of myDate to (text 1 thru 4 of myName) as number
set month of myDate to (text 6 thru 7 of myName) as number
set day of myDate to (text 9 thru 10 of myName) as number
set hours of myDate to (text 12 thru 13 of myName) as number
set minutes of myDate to (text 15 thru 16 of myName) as number
set seconds of myDate to (text 18 thru 19 of myName) as number
set exif Capture Date of theItem to myDate -- write back the newly created date into the EXIF section of the movie file
end if
end repeat
end tell


Kopieren Sie dieses Skript und fügen Sie es in Ihren Skript-Editor oder Skript-Debugger ein und probieren Sie es aus!

Das Skript arbeitet sich durch alle aktuell ausgewählten Objekte in NeoFinder und nimmt für alle Videodateien, die ".mov" als Namenssuffix und die ausreichende Länge des Dateinamens haben, diesen Namen und erstellt ein Datum aus den Segmenten.

Dann schreibt das Skript dieses Datum in das Feld EXIF-Aufnahmedatum der Videodatei. Das führt dazu, dass NeoFinder dieses Datum in den EXIF-Bereich Ihrer Videodatei schreibt.

Schauen wir uns an, wie das aussieht, nachdem eine Datei in NeoFinder verarbeitet wurde:

exif date changed


Ja, es hat perfekt funktioniert. Wenn Sie sich den Inspector ansehen, können Sie sehen, dass sogar die Sekunden richtig übertragen wurden. Toll!

WICHTIG
Dadurch wird der Inhalt der ausgewählten Videodateien verändert, also:
- Sie probieren dies natürlich zuerst mit einer einzelnen ausgewählten Videodatei aus, um zu sehen, wie es funktioniert!
- Sie haben eine vollständige Sicherung aller Videodateien, die Sie durch dieses Skript laufen lassen!




XMP-Stichworte filtern
Eine Kundin teilte uns kürzlich mit, dass sie von einem Auftragnehmer mehrere tausend Dateien erhalten hatte, die jeweils eine Vielzahl von XMP-Schlüsselwörtern enthielten. Das war in Ordnung, aber jemand hatte Hunderte dieser Schlüsselwörter in einer hierarchischen Gruppe mit dem Namen "More Keywords" abgelegt, so dass das Ergebnis verwirrend war und sich von den normalerweise verwendeten Schlüsselwörtern unterschied:

unwanted hGroup


Die Kundin fragte uns, ob es eine Möglichkeit gäbe, diese loszuwerden. Wir dachten zunächst, dass dies eine Menge Handarbeit bedeuten würde. Aber nein, das kann man mit AppleScript machen!

Wir haben dieses unglaublich leistungsfähige AppleScript geschrieben, das dieses Problem löst.


tell application "NeoFinder"
set myList to selected items -- get a list of all selected items
repeat with theItem in myList
set originalKeywordString to xmp Keywords of theItem -- one string separated by ", "

-- turn that string into a real list
set AppleScript's text item delimiters to {", "}
set originalKeywordList to (every text item in originalKeywordString) as list
set AppleScript's text item delimiters to ""

-- filter that list
set replacementKeywordList to my filterKeywordList(originalKeywordList, "More Keywords|")

-- turn it back into a string in the proper format
set AppleScript's text item delimiters to {", "}
set newKeywordString to replacementKeywordList as string
set AppleScript's text item delimiters to ""

-- and write it back to the file
set xmp Keywords of theItem to newKeywordString
end repeat
end tell

on filterKeywordList(originalKeywordList, textPrefix)
set replacementKeywordList to {} -- init the result list
set unwantedPrefixLength to (length of textPrefix)
-- go through each keyword in the list
repeat with oneOriginalKeyword in originalKeywordList
-- if the keyword begins with textPrefix, remove that part
if oneOriginalKeyword begins with textPrefix then
set newKeyword to characters (unwantedPrefixLength + 1) thru (length of oneOriginalKeyword) of oneOriginalKeyword as string
set replacementKeywordList to replacementKeywordList & newKeyword
else -- all other keywords are just added to the result list
set replacementKeywordList to replacementKeywordList & oneOriginalKeyword
end if
end repeat
return replacementKeywordList
end filterKeywordList


Das Skript fragt NeoFinder nach der Liste der ausgewählten Objekte und geht diese Liste wiederholt durch. Es holt die aktuellen XMP-Schlüsselwörter aus jeder Datei, filtert sie und schreibt sie zurück in die Datei. Das war's.

Wir haben hier in diesem Beispielskript den langen Weg genommen, um zu zeigen, wie solche Aufgaben erledigt werden können. Der eigentliche Filterprozess ist in eine Prozedur oder einen "Handler" aufgeteilt und kann mit dem unerwünschten Schlüsselwort-Präfix als Parameter versehen werden, so dass es für Sie einfacher ist, dies an Ihre eigenen Bedürfnisse anzupassen.

Da NeoFinder die XMP-Schlüsselwortliste als eine kombinierte Zeichenkette bereitstellt, ist es notwendig, die Textelementbegrenzer von AppleScript zu verwenden, um die Schlüsselwörter für die Verarbeitung zu trennen.


WICHTIG
Dadurch wird der Inhalt der ausgewählten Dateien verändert, also:
- Sie probieren dies natürlich zuerst mit einer einzelnen ausgewählten Datei aus, um zu sehen, wie es funktioniert!
- Sie haben eine vollständige Sicherung aller Dateien, die Sie durch dieses Skript laufen lassen!




Katalog-Report für Microsoft Excel
Wenn Sie eine Microsoft Excel Tabelle mit Details über alle Kataloge in Ihrer NeoFinder BIBLIOTHEK erstellen möchten, können Sie dieses umfangreiche AppleScript verwenden.

Es wird zuerst prüfen, wie viele Kataloge in Ihrer NeoFinder BIBLIOTHEK enthalten sind.

Dann erstellt es ein neues Dokument in Microsoft Excel, eine sogenannte Arbeitsmappe. Das Skript richtet die Spalten mit der richtigen Breite und Textformatierung ein, so dass die Werte korrekt angezeigt werden. Die Eigenschaft des Zahlenformats war recht knifflig zu finden, vielleicht können Sie sie auch für andere Projekte verwenden.

Danach geht das Skript durch jeden NeoFinder-Katalog und holt sich die interessanten Metadaten, wie den Katalognamen, die Datengröße, den Medientyp und natürlich die Anzahl der Dateien und Ordner.

Diese Daten werden dann der frisch erstellten Excel-Arbeitsmappe hinzugefügt.

Und hier ist das Script:


-- how many catalogs are contained in your NeoFinder LIBRARY?
tell application "NeoFinder"
set numCatalogs to count Catalogues
end tell

tell application "Microsoft Excel"
set myWorkbook to make new workbook
tell myWorkbook
tell sheet 1
set value of cell "A1" to "Name"
set column width of column 1 to 60
set number format of range ("A1:A" & (numCatalogs + 3) as string) to "@" -- plain text

set value of cell "B1" to "Media Type"
set column width of column 2 to 26
set number format of range ("B1:B" & (numCatalogs + 3) as string) to "@"

set value of cell "C1" to "Hardware Serial"
set column width of column 3 to 20
set number format of range ("C1:C" & (numCatalogs + 3) as string) to "@"

set value of cell "D1" to "Number of Files"
set column width of column 4 to 16
set number format of range ("D1:D" & (numCatalogs + 3) as string) to "# ?/?" -- "Fraction"

set value of cell "E1" to "Number of Folders"
set column width of column 5 to 16
set number format of range ("E1:E" & (numCatalogs + 3) as string) to "# ?/?" -- "Fraction"

set value of cell "F1" to "Cataloged Data Size"
set column width of column 6 to 20
set number format of range ("F1:F" & (numCatalogs + 3) as string) to "# ?/?" -- "Fraction"

set value of cell "G1" to "Volume Size"
set column width of column 7 to 20
set number format of range ("G1:G" & (numCatalogs + 3) as string) to "# ?/?" -- "Fraction"
end tell
end tell
end tell


repeat with i from 1 to numCatalogs
-- get the data from NeoFinder
tell application "NeoFinder"
tell Catalogue i
set catName to name
set catMediaType to media type
set catHWSerial to hardware serial
set catNumFiles to file number
set catNumFolders to folder number
set catDataSize to size
set catVolumeSize to volume size
end tell
end tell
-- and place it in the Excel worksheet
set currentRow to (2 + i) as string
tell application "Microsoft Excel"
tell myWorkbook
tell sheet 1
set value of cell ("A" & currentRow) to catName
set value of cell ("B" & currentRow) to catMediaType
set value of cell ("C" & currentRow) to catHWSerial
set value of cell ("D" & currentRow) to catNumFiles
set value of cell ("E" & currentRow) to catNumFolders
set value of cell ("F" & currentRow) to catDataSize
set value of cell ("G" & currentRow) to catVolumeSize
end tell
end tell
end tell
end repeat



Das Ergebnis der Ausführung dieses Skripts könnte wie folgt aussehen:

applescript_to_excel_sample small

Sie können diese Kalkulationstabelle dann wie jedes andere Excel-Dokument speichern.




Suchen und Ersetzen von Metadaten in Katalogdateien
Manchmal ist es notwendig, Text in Metadatenfeldern aller Dateien in einem Katalog zu suchen und zu ersetzen. Zum Beispiel, wenn Ihr CEO spontan beschließt, den Firmennamen von "Amazing Inc." in den langweiligen (sic!) aber neuen Namen "Xyz Inc." zu ändern, und Sie müssen den Copyright-Text in allen Fotos sofort ersetzen.

Das geht nicht einfach, indem Sie das Feld in allen Dateien mit dem XMP-Editor im Inspector von NeoFinder überschreiben, da die Copyright-Zeichenfolge für jede Datei sehr unterschiedlich sein kann, wie "Copyright by Amazing Inc. 2021" oder "© Amazing Inc. Alle Rechte vorbehalten" oder ähnliches.

Dieses AppleScript hier geht durch alle Dateien eines NeoFinder-Katalogs namens "TEST", indem es die Eigenschaft
Catalog Item verwendet. Diese Liste enthält nur Dateien, keine Ordner!

Das Script überprüft das XMP Copyright Feld
xmp Copyright jeder Datei, um zu sehen, ob es den alten Firmennamen enthält.

Wenn dies der Fall ist, wird nur der Namensteil der Copyright-Zeichenkette durch den neuen Firmennamen ersetzt und zurückgeschrieben.

Die Ersetzung erfolgt mit einer netten String-Ersetzungsfunktion findAndReplaceInText, die in den Apple-Archiven zu finden ist:
https://developer.apple.com/library/archive/documentation/LanguagesUtilities/Conceptual/MacAutomationScriptingGuide/ManipulateText.html

Um dieses Skript an Ihre Bedürfnisse anzupassen, ersetzen Sie die Eigenschaften originalText und replacementText des Skripts und den Namen des Katalogs, den Sie verwenden möchten.
Wenn Sie auch Text in anderen Metadatenfeldern ersetzen möchten, ersetzen Sie die beiden Stellen von
xmp Copyright durch den Namen des benötigten Metadatenfeldes.


property originalText : "Amazing Inc."
property replacementText : "Xyz Inc."

tell application "NeoFinder"
tell Catalogue "TEST"
set numFiles to (file number)
repeat with i from 1 to numFiles
tell Catalog Item i
set myCopyright to xmp Copyright
if myCopyright contains originalText then
set newCopyright to my findAndReplaceInText(myCopyright, originalText, replacementText)
set xmp Copyright to newCopyright
end if

end tell
end repeat
end tell
end tell

on findAndReplaceInText(theText, theSearchString, theReplacementString)
set AppleScript's text item delimiters to theSearchString
set theTextItems to every text item of theText
set AppleScript's text item delimiters to theReplacementString
set theText to theTextItems as string
set AppleScript's text item delimiters to ""
return theText
end findAndReplaceInText


WICHTIG
Dadurch wird der Inhalt der Dateien im Katalog verändert, also:
- Sie probieren dies natürlich zuerst mit einem kleinen Katalog aus, um zu sehen, wie es funktioniert!
- Sie haben ein vollständiges Backup aller Dateien und Kataloge, die Sie durch dieses Skript laufen lassen!




9.1 Das NeoFinder AppleScript-Verzeichnis
9.2 Das integrierte Scripts-Menü
9.3 Finden mit AppleScript
9.4 NeoFinder-Einstellungen ändern
9.5 Katalogisieren und Updaten mit AppleScript
9.6 Die ausgewählten Objekte benutzen
9.7 Power Beispiele