Danke für die Tipps.
Das mit dem roten Rahmen habe ich geändert, Framegadget habe ich vor 15 Jahren schon mal verwendet, aber vergessen.
Das blaue Rändchen an den Buttons gefällt mir gut, aus optischen Gründen habe ich den Parameter #PB_Text_Center in 1 geändert.
Mit dem Pfad hatte ich schon ausprobiert, lasse das aber trotzdem so stehen, wenn das Datumsprogi auf einer SD-Karte oder einem Stick mit den Videos zusammen mit dem Exiftool läuft, dann hinterlässt es keine Spuren auf dem PC. Ich brauche das ja nicht oft, nur um die Videos zeitmäßig zu sortieren, wenn Kameras unterschiedliche oder falsche Zeiteinstellungen haben, UTC oder MEZ.
Viele Grüße
Dieter
28.11.2022 Der Vollständigkeit halber hier die Version bei der die Einstellungen ins Home-Verzeichnis geschrieben werden.
ich selber werde weiterhin die Prefs-Datei ins aktuelle Verzeichnis schreiben.
Nochnmals danke und eine besinnliche Adventszeit.
Viele Grüße Dieter
Code: Alles auswählen
;---Prolog---
;MEXDatum: Modifiziere EXif-Datum von Video-Dateien mit EXiftool für Windows.
;Gelungen unter Mithilfe und Codeschnipseln von Axolotl und mk-soft,
;außerdem habe ich mich bei "ReadProgramString" von Jürgen Kulow bedient.
;Pb 6.0 28. Nov. 2022
;Exiftool Download auf https://exiftool.org/ getestet mit Version 12.45
;Parameter Exiftoool:
;exiftool.exe "-filemodifydate<createdate" "-filecreatedate<createdate" *.MP4 =>> Zeiten kopieren
;exiftool.exe "-filemodifydate<createdate" "-filecreatedate<createdate" G*.MP4
; -------------------------------------------------------------------------------------------------------
;----Top---
EnableExplicit
;-Konstanten
Enumeration Gadgets
#Mainwindow
#Button_Pfad_Wahl ; Pfadwahl
#Button_Start_Datumsaenderung ; Start Zeit ändern
#Button_Ende_Prgr ; Programmende
#Button_Exif_Start ; Start ExifTool
#Button_Exif_Verzeichnis_suchen ; Verzeichnis mit dem ExifTool
#combogadg_DaT_Art ; Erstell- / Änderungddatum
#combogadg_DaT_Std ; Anzahl Stundenverschiebung
#Combogadget_Datei_Wildcards ; Dateiart Wildcards einstellen G*.MP4 / *.MP4 / *.*
#EDGadget_Text_Ausgabe ; Anzeige Exifverzeichnis
#Rahmen1
#Rahmen2
#TxtGadg_Std_Korr ; Anzeige der Stundenkorrektur
#Textgadget_Arbeistsverzeichnis ; Zeigt den Pfad an
#TxtGadget_Zeit ; Zeigt die aktuelle Dateizeit
#TextGadget_Exif_Pfad ; Anzeige ExifPfad
#ProzessbarGadget
#CheckboxSticky
#Verzeichnis
EndEnumeration
;-Texte
#TxtRunProgLaufzeit = "Laufzeit "
#TxtZeiteinheit$ = " ms"
#TxtRunPrgOK$ = "OK"
#TxtRunPrgError$ = "Fehler Nr.: "
#TxtRunPrgFATAL$ = "Fataler Fehler "
#TxtProg_nicht_gefunden$ = "Programm nicht gefunden: "
#NewLine=#CRLF$ ;Windows neue Zeile
#HomeVerzeichnis = "Meine_Programme"
#ApplicationName = "MEXDatum"
;-Structur
Structure Pfade
Exif_Pfad$ ; Pfad zum ExifTool einschließlich #EXIF_Executable$
EXIF_Executable$ ; "ExifTool.exe"
Exif_Kommando$ ; Exiftool Parameter
Arbeitsverzeichnis$ ; Arbeitsverzeichnnis mit den Dateien
Datei_Parameter$ ; Wildcards G*.MP4, *.MP4, *.MOV
Thread.i
EndStructure
;-Globale Variablen
Global Parameter.Pfade
; Global Path$
Global datum$ = FormatDate("%dd.%mm.%yyyy.%hh:%mm:%ss",Date())
Global datums_flag = #PB_Date_Created
Global shift_hour_flag = 0 ; Stundendifferenz (-2)-(-1)- 0 - (+1) -(+2)
Global Ausgabe_Txt$ ; "Datenausgabe"
Global Top = 5
Global Hoehe = 30
Global Event, fertig.i , ready.i
Global Ende.i, i.i
Declare ExifRun(*Parameter)
Declare AendereDatum()
;----Proceduren---
Procedure InitWildcards()
Protected State.i
With Parameter
State = GetGadgetState(#Combogadget_Datei_Wildcards)
If State = 0 : \Datei_Parameter$ = "G*.MP4" : EndIf
If State = 1 : \Datei_Parameter$ = "*.MP4" : EndIf
If State = 2 : \Datei_Parameter$ = "*.MOV" : EndIf
EndWith
EndProcedure
Procedure InitThread()
Protected Pfad$, ArbVerz$
Pfad$ = GetGadgetText(#TextGadget_Exif_Pfad)
ArbVerz$ = GetGadgetText(#Textgadget_Arbeistsverzeichnis)
With Parameter
\Exif_Pfad$ = Pfad$
\EXIF_Executable$ = "ExifTool.exe"
\Exif_Kommando$ = " -filemodifydate<createdate" + " -filecreatedate<createdate "
\Arbeitsverzeichnis$ = ArbVerz$
\Thread = CreateThread(@ExifRun(),@Parameter)
EndWith
EndProcedure
Procedure ExifRun(*Parameter)
Protected Exitcode, NoErrText
Protected NewErrorText$, AllErrorText$ =""
Protected start = ElapsedMilliseconds()
Protected Program.i
Protected path$, Cmd$, WorkDir$, WildCard$, Ausgabe$
Protected Flags =#PB_Program_Open | #PB_Program_Read | #PB_Program_Error | #PB_Program_Hide ;| #PB_Program_Wait
With Parameter
path$ = \Exif_Pfad$ + \EXIF_Executable$
Cmd$ = \Exif_Kommando$
WorkDir$ = \Arbeitsverzeichnis$
WildCard$ = \Datei_Parameter$
EndWith
cmd$ = Cmd$ + WorkDir$ + WildCard$
ClearGadgetItems(#EDGadget_Text_Ausgabe)
Ausgabe_Txt$ = ""
Program = RunProgram(path$, Cmd$, WorkDir$, Flags)
If Program
DisableWindow(#Mainwindow,#True) ; Keine Eingaben möglich, während das Exiftool läuft
While ProgramRunning(Program)
If AvailableProgramOutput(Program)
Ausgabe$ = " ExifTool: " + ReadProgramString(Program) + #NewLine
EndIf
NewErrorText$=ReadProgramError(Program)
While NewErrorText$<>""
NoErrText+1
AllErrorText$ + Str(NoErrText)+":"+NewErrorText$+#NewLine
NewErrorText$=ReadProgramError(Program)
Wend
i = i+2 : SetGadgetState (#ProzessbarGadget, i) : Delay(50)
If i => 100 : i= 0 : EndIf
Wend
Ausgabe$+" "+#TxtRunProgLaufzeit+": "+Str(ElapsedMilliseconds()-start)+#TxtZeiteinheit$+#NewLine
If ElapsedMilliseconds()-start
Exitcode=ProgramExitCode(Program)
If Exitcode<>0
If 0=Exitcode
Ausgabe$ = Ausgabe$+#TxtRunPrgOK$
Else
Ausgabe$ = "Fehler "+Ausgabe$ + #TxtRunPrgError$ + Str(Exitcode) + " keine Datei gefunden " + #NewLine ;
Ausgabe$ = Ausgabe$ + " " + AllErrorText$
EndIf
EndIf
Else
If 0<>IsProgram(Program)
KillProgram(Program)
CloseProgram(Program)
Ausgabe$ +" " + #NewLine +AllErrorText$
EndIf
EndIf
i = 0
Ausgabe_Txt$ = Ausgabe$
SetGadgetState (#ProzessbarGadget, i)
CloseProgram(Program)
AddGadgetItem(#EDGadget_Text_Ausgabe,-1,Ausgabe_Txt$+#NewLine)
Else
MessageRequester(#TxtRunPrgFATAL$,#TxtProg_nicht_gefunden$+" "+ path$)
EndIf
DisableWindow(#Mainwindow,#False)
SetGadgetState(#combogadg_DaT_Art,2) ;TODO diese 2 Zeilen entfallen, wenn die Zeit
shift_hour_flag = 0 ;anschließen nach dem ExiTool korrigiert werden soll
AendereDatum()
ProcedureReturn
EndProcedure
Procedure AendereDatum()
Protected Zeit$, Pfad$
Protected ArbVerz$, Para$
Protected DatumsWert.i, DW_neu.i, gefunden.i, IstDatei.i
With Parameter
ArbVerz$ = \Arbeitsverzeichnis$
Para$ = \Datei_Parameter$
EndWith
IstDatei = 0
gefunden = ExamineDirectory(#PB_Any,ArbVerz$,Para$)
If gefunden
While NextDirectoryEntry(gefunden)
If DirectoryEntryType(gefunden) = #PB_DirectoryEntry_File
Para$ = DirectoryEntryName(gefunden)
If FileSize(Pfad$) = FileSize(Para$)
Para$ = ArbVerz$ + Para$
DatumsWert = GetFileDate(Para$,datums_flag)
Zeit$ = FormatDate("%dd.%mm.%yyyy:%hh.%ii",Datumswert)
DW_neu = AddDate(DatumsWert,#PB_Date_Hour,shift_hour_flag)
Zeit$ = FormatDate("%dd.%mm.%yyyy:%hh.%ii",DW_neu)
DW_neu = DatumsWert + (3600 * shift_hour_flag)
Zeit$ = FormatDate("%dd.%mm.%yyyy:%hh.%ii",DW_neu)
SetFileDate(Para$,datums_flag,ParseDate("%dd.%mm.%yyyy:%hh.%ii",zeit$))
SetGadgetText(#TxtGadget_Zeit, Zeit$)
Ausgabe_Txt$ = Para$ + " " + Zeit$
AddGadgetItem(#EDGadget_Text_Ausgabe, -1, Ausgabe_Txt$ ) ;+#NewLine
EndIf
IstDatei = 1
Else
Ausgabe_Txt$ = Para$+ " Datei nicht gefunden," + #NewLine + "Arbeitsverzeichnis korrekt gesetzt?"
AddGadgetItem(#EDGadget_Text_Ausgabe, -1, Ausgabe_Txt$ + #NewLine)
EndIf
Wend
If Not NextDirectoryEntry(gefunden) And IstDatei = 0
Ausgabe_Txt$ = Para$+ " Datei nicht gefunden" + #NewLine + "Arbeitsverzeichnis korrekt gesetzt?"
AddGadgetItem(#EDGadget_Text_Ausgabe, -1, Ausgabe_Txt$ + #NewLine)
SetGadgetText(#TxtGadget_Zeit, "Heute " + FormatDate("%dd.%mm.%yyyy %hh:%ii", Date()) )
EndIf
EndIf
FinishDirectory(gefunden)
EndProcedure
Procedure Tooltipp()
If shift_hour_flag = 0
GadgetToolTip(#combogadg_DaT_Art, "das Datum wird nicht verändert")
ElseIf shift_hour_flag = -1
GadgetToolTip(#combogadg_DaT_Art, "")
EndIf
EndProcedure
Procedure.s GetProgramDataPath()
Protected basePath.s, subPath.s, dataPath.s
basePath = GetUserDirectory(#PB_Directory_ProgramData)
subPath = basePath + #HomeVerzeichnis + #PS$
dataPath = subPath + #ApplicationName + #PS$
If FileSize(dataPath) <> -2
If FileSize(subPath) <> -2
CreateDirectory(subPath)
EndIf
If FileSize(dataPath) <> -2
CreateDirectory(dataPath)
EndIf
EndIf
ProcedureReturn dataPath
EndProcedure
Procedure InitHilfeTxT()
Ausgabe_Txt$ = " Das ExifTool von von Phil Harvey muss auf dem Rechner installiert sein " + #NewLine +
" ------------------------------------------" + #NewLine +
" 1. Pfade setzen " + #NewLine +
" 2. Dateiart wählen " + #NewLine +
" 3. ExifTool starten " + #NewLine +
" 4. Zeitänderung wählen " + #NewLine +
" 5. Zeit starten " + #NewLine +
" 6. Freuen " + #NewLine +
"------------------------------------------" + #NewLine +
" Das Programm speichert die aktuellen Einstellungen in einer MEXDatum.pref " + #NewLine +
" Die Funktionen Start und ExifTool können mehrfach aufgerufen werden " + #NewLine +
" Der Button ExifTool setzt die Änderungen Im FileDate wieder zurück auf das Erstelldatum der Kamera."
SetGadgetText(#EDGadget_Text_Ausgabe,Ausgabe_Txt$)
EndProcedure
Procedure Lese_Pref()
Protected Pfad$
Pfad$=GetProgramDataPath()
If Pfad$
If OpenPreferences(Pfad$ + "MEXDatum.pref") ; liest oder erstellt eine Preference-Datei namens MEXDatum.pref
PreferenceGroup("Global")
With Parameter ; initialisiere
\Exif_Pfad$ = ReadPreferenceString("Exif_Pfad$","")
\EXIF_Executable$ = ReadPreferenceString("Exif_Executable$","")
\Exif_Kommando$ = ReadPreferenceString("Exif_Kommando$","")
\Arbeitsverzeichnis$ = ReadPreferenceString("Arbeitsverzeichnis$","")
EndWith
ClosePreferences()
Else
CreatePreferences("MEXDatum.pref")
ClosePreferences()
EndIf
EndIf
EndProcedure
; ----------------------------------
Procedure Schreibe_Pref() ; Preferenzdatei schreiben
Protected Pfad$
Pfad$ = GetProgramDataPath()
If Pfad$
OpenPreferences(Pfad$ + "MEXDatum.pref")
PreferenceGroup("Global")
With Parameter
WritePreferenceString("Exif_Pfad$", \Exif_Pfad$)
WritePreferenceString("Exif_Executable$", \EXIF_Executable$)
WritePreferenceString("Exif_Kommando$", \Exif_Kommando$)
WritePreferenceString("Arbeitsverzeichnis$",\Arbeitsverzeichnis$)
EndWith
ClosePreferences()
EndIf
EndProcedure
;-MainWindow
OpenWindow(#Mainwindow, 0,0,500,420,"MEXDatum = Modifiziere EXif-Datum mit dem Exiftool von Phil Harvey",
#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
Lese_Pref()
StickyWindow(#Mainwindow,#True)
TextGadget(#TxtGadg_Std_Korr, 10,Top+10,180,20,"Datum lesen, Zeit ändern",#PB_Text_Center) : Top =Top + 30
ComboBoxGadget(#combogadg_DaT_Art,10,Top,180,30) : Top = Top + 40
AddGadgetItem(#combogadg_DaT_Art,0,"Zeit -2 Std")
AddGadgetItem(#combogadg_DaT_Art,1,"Zeit -1 Std")
AddGadgetItem(#combogadg_DaT_Art,2,"Datum +/-0 Std")
AddGadgetItem(#combogadg_DaT_Art,3,"Zeit +1 Std")
AddGadgetItem(#combogadg_DaT_Art,4,"Zeit +2 Std")
SetGadgetState(#combogadg_DaT_Art,2)
If GetGadgetState(#combogadg_DaT_Art) = 2
GadgetToolTip(#combogadg_DaT_Art, "das Datum wird nicht verändert")
EndIf
; keine Korrektur, nicht verändert, es wird nur die Zeit ausgelesen
ComboBoxGadget(#combogadg_DaT_Std,10,Top,180,30) : Top = Top + 40
AddGadgetItem(#combogadg_DaT_Std,0,"Setzen: Datum erstellt")
AddGadgetItem(#combogadg_DaT_Std,1,"Setzen: Datum geändert")
SetGadgetState(#combogadg_DaT_Std,0)
GadgetToolTip(#combogadg_DaT_Std,"Wählt welches Datum korrigiert werden soll")
TextGadget(#TxtGadget_Zeit, 10,Top,180,30,datum$,#PB_Text_Border|#PB_Text_Center) : Top = Top + 40
SetGadgetText(#TxtGadget_Zeit, "Heute " + FormatDate("%dd.%mm.%yyyy %hh:%ii", Date()))
ButtonGadget(#Button_Pfad_Wahl, 10,Top,180,30,"Setzen: Arbeitsverzeichnis",1) : Top = Top + 40 ; ButtonGadget mit blauem Rand :-)
TextGadget (#Textgadget_Arbeistsverzeichnis, 10,Top,180,35,"",#PB_Text_Border|#PB_Text_Center) : Top = Top + 45 ; zeigt den Pfad
SetGadgetText(#Textgadget_Arbeistsverzeichnis,Parameter\Arbeitsverzeichnis$)
GadgetToolTip(#Button_Pfad_Wahl,"Wählt dasArbeitsverzeichnis mit den Dateien")
ComboBoxGadget(#Combogadget_Datei_Wildcards,10, Top, 180, Hoehe) : Top = Top+40
AddGadgetItem(#Combogadget_Datei_Wildcards,0,"Gopro: G* . MP4")
AddGadgetItem(#Combogadget_Datei_Wildcards,1,"Video: * . MP4")
AddGadgetItem(#Combogadget_Datei_Wildcards,2,"Video: * . MOV")
SetGadgetState(#Combogadget_Datei_Wildcards,0)
If GetGadgetState(#Combogadget_Datei_Wildcards) = 0 : Parameter\Datei_Parameter$ = "G*.MP4": EndIf
ButtonGadget(#Button_Exif_Verzeichnis_suchen, 10,Top,180,30,"Setzen: Exifverzeichnis",1) : Top = Top + 40
GadgetToolTip(#Button_Exif_Verzeichnis_suchen, "Stellt das Verzeichnis mit dem ExifTool ein")
TextGadget(#TextGadget_Exif_Pfad, 10,Top,180,30,"",#PB_Text_Border|#PB_Text_Center) : Top = Top + 65 ; zeigt den Pfad
SetGadgetText(#TextGadget_Exif_Pfad,Parameter\Exif_Pfad$)
ButtonGadget(#Button_Start_Datumsaenderung, 10, Top, 120, 30,"Start: Zeit",1)
GadgetToolTip(#Button_Start_Datumsaenderung, "startet einen Durchlauf, kann auch mehrfach betätigt werden")
ButtonGadget(#Button_Exif_Start, 270,Top,120,30,"Exiftool",1)
GadgetToolTip(#Button_Exif_Start, "startet das ExifTool")
ButtonGadget(#Button_Ende_Prgr, 140,Top,120,30,"Ende",1); ,#PB_Text_Center
SetGadgetColor(#Button_Ende_Prgr, #PB_Gadget_BackColor, $000FF)
GadgetToolTip(#Button_Ende_Prgr, "beendet das Programm")
ProgressBarGadget(#ProzessbarGadget, 10, Top -15, 480, 8, 0, 100)
CheckBoxGadget(#CheckboxSticky, 400, Top , 100, 20, "Fenster oben")
SetGadgetState(#CheckboxSticky,1)
If #CheckboxSticky = 1 : StickyWindow(#Mainwindow,#True) : EndIf
EditorGadget(#EDGadget_Text_Ausgabe, 205,8,285, 355,#PB_Editor_ReadOnly|#PB_Editor_WordWrap)
FrameGadget(#Rahmen1, 5, 5, 190, 360,"",#PB_Frame_Double)
FrameGadget(#Rahmen2,202, 5, 290, 360,"",#PB_Frame_Double)
InitHilfeTxT()
Lese_Pref()
;----RepeatSchleife ---
Repeat
Event = WaitWindowEvent()
Select Event ;auf Ereignis im Window warten
Case #PB_Event_CloseWindow ;Fenster schließen
Ende=1
Case #PB_Event_Gadget ; Ende-Taste drücken
Select EventGadget()
Case #Button_Ende_Prgr
Ende=1
;- wähle Arbeitsordner
Case #Button_Pfad_Wahl
With Parameter
\Arbeitsverzeichnis$=PathRequester("Arbeitsordner wählen",\Arbeitsverzeichnis$)
SetGadgetText(#Textgadget_Arbeistsverzeichnis,\Arbeitsverzeichnis$)
InitWildcards()
EndWith
;- wähle Exif-Pfad
Case #Button_Exif_Verzeichnis_suchen
With Parameter
\Exif_Pfad$= PathRequester("ExifTool Pfad wählen", \Exif_Pfad$)
SetGadgetText(#TextGadget_Exif_Pfad,\Exif_Pfad$)
InitWildcards()
EndWith
;- FileDate wählen
Case #combogadg_DaT_Std
Select GetGadgetState(#combogadg_DaT_Std)
Case 0 : datums_flag = #PB_Date_Created: ; gibt das Erstellungsdatum der Datei zurück
Case 1 : datums_flag = #PB_Date_Modified: ; gibt das Änderungsdatum der Datei zurück
EndSelect
;- wähle Stunden+/-
Case #combogadg_DaT_Art
Select GetGadgetState(#combogadg_DaT_Art) ; das Datum korrigiert werden soll
Case 0 : shift_hour_flag = -2 : Tooltipp()
Case 1 : shift_hour_flag = -1 : Tooltipp()
Case 2 : shift_hour_flag = 0 : Tooltipp()
Case 3 : shift_hour_flag = 1 : Tooltipp()
Case 4 : shift_hour_flag = 2 : Tooltipp()
EndSelect
;-wähle Parameter
Case #Combogadget_Datei_Wildcards ; Auswählen welche Dateien korrigiert werden sollen
With Parameter
Select GetGadgetState(#Combogadget_Datei_Wildcards)
Case 0 : \Datei_Parameter$ = "G*.MP4"
Case 1 : \Datei_Parameter$ = "*.MP4"
Case 2 : \Datei_Parameter$ = "*.MOV"
EndSelect
InitWildcards()
EndWith
;- Start Datumsänderung
Case #Button_Start_Datumsaenderung
ClearGadgetItems(#EDGadget_Text_Ausgabe)
AendereDatum()
;- ExifTool Start
Case #Button_Exif_Start ; Exif Datum nach Filedatum verschieben
If Not IsThread(Parameter\Thread)
InitWildcards()
InitThread()
Else
MessageRequester("Info", "Thread läuft noch!")
EndIf
Case #CheckboxSticky
StickyWindow(#Mainwindow, GetGadgetState(#CheckboxSticky) )
Case #PB_Event_CloseWindow : End
EndSelect
EndSelect
Until Ende
Schreibe_Pref()
End
;----Bottom---