• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Der Frühling ist auch in den eingesandten Fotos deutlich zu erkennen. Zeigt uns, wer Euer Favorit ist! hier geht es lang für Euer Voting --> Klick

Drag&Drop Script soll Dateien nacheinander abarbeiten

jb_alvarado

Granny Smith
Registriert
12.06.12
Beiträge
15
Hallo Leute,
ich habe mir ein AppleScript erstellt welches Videofiles umwandeln soll. Funktioniert soweit auch sehr gut. Wenn ich jedoch mehrere Dateien gleichzeitig drauf ziehe, wird für jede Datei ein Terminal geöffnet. Das würde ich gerne unterbinden, also es sollte jede Datei nacheinander im Terminal bearbeitet werden, nicht gleichzeitig. Habt ihr eine Idee wie ich das machen kann?

Hier mein Script:

Code:
on open filelist
    repeat with i in filelist    
        set filename to do shell script ¬
            "perl -e \"print quotemeta ('" & POSIX path of i & "');\""
        tell application "Terminal"
            activate
            do script "/Applications/ffmpeg -i " & filename & " -filter:v yadif=0:0:0 -vcodec libx264 -crf 22 -preset medium -s 1024x576 -sws_flags lanczos -acodec aac -strict experimental -ab 128k -threads 0 -y " & filename & ".mp4; exit"
        end tell
    end repeat
end open

Danke schon mal für die Hilfe!

Grüße
jb_
 

Pill

Adams Parmäne
Registriert
07.07.12
Beiträge
1.310
Du könntest versuchen zu prüfen, ob ffmpeg noch läuft, z.B. so:

Code:
[B]tell[/B] [COLOR=#0433FF][I]application[/I][/COLOR] "System Events"
    [B]repeat[/B] [B]until[/B] [B]not[/B] ([COLOR=#0433ff][B]exists[/B][/COLOR] [COLOR=#0433ff][I]process[/I][/COLOR] "ffmpeg")
[COLOR=#012FBE][B]             delay[/B][COLOR=#000000] 1[/COLOR][/COLOR]
    [B]end[/B] [B]repeat[/B]
[B]end[/B] [B]tell[/B]
 

jb_alvarado

Granny Smith
Registriert
12.06.12
Beiträge
15
Hi Phill,
danke für die Antwort! Klingt gut der Ansatz, nur bekomme ich das damit leider nicht hin.
 

Pill

Adams Parmäne
Registriert
07.07.12
Beiträge
1.310
Wie sieht denn dein Skript jetzt aus und was genau klappt nicht?
 

jb_alvarado

Granny Smith
Registriert
12.06.12
Beiträge
15
Das Script schaut gerade so aus:

Code:
on open filelist
    repeat with i in filelist
        set filename to do shell script ¬
            "perl -e \"print quotemeta ('" & POSIX path of i & "');\""
        
        tell application "System Events"
            repeat until not (exists process "ffmpeg")
                delay 1
                tell application "Terminal"
                    activate
                    do script "/Applications/ffmpeg -version"
                end tell
            end repeat
        end tell
    end repeat
    
end open

Wenn ich es ausführe, hat man zuerst den Eindruck, dass was gemacht wird, aber der Prozess wird sofort wieder gestoppt, es kommt auch kein Terminal Fenster.
Ich denke auch, dass wahrscheinlich Schleife in Schleife nicht so toll ist.

So ganz habe ich das Prinzip auch noch nicht verstanden von diesen AppleScript Loops. In Windows Batch würde die Schleife den Prozess von vorne herein nacheinander starten.
 

Pill

Adams Parmäne
Registriert
07.07.12
Beiträge
1.310
Das kann so nicht funktionieren, ich versuche mal zu erklären, warum:

Die Abbruchbedingung für die innere Schleife ist not (exists process "ffmpeg"). Da ffmpeg aber erst in der inneren Schleife gestartet werden soll, ist die Abbruchbedingung schon beim ersten Durchlauf der Schleife true, die Schleife wird also sofort abgebrochen.

So in etwa könnte es funktionieren (ungetestet):

Code:
[SIZE=2][B]on[/B] [COLOR=#0000FF][B]open[/B][/COLOR] [COLOR=#3F7F00]filelist[/COLOR]
    [B]repeat[/B] [B]with[/B] [COLOR=#3F7F00]i[/COLOR] [B]in[/B] [COLOR=#3F7F00]filelist[/COLOR]
        [B]set[/B] [COLOR=#3F7F00]filename[/COLOR] [B]to[/B] [COLOR=#6C04D4]POSIX path[/COLOR] [B]of[/B] [COLOR=#3F7F00]i[/COLOR]
        [COLOR=#4C4D4D]--Shellscript ausführen:[/COLOR]
        [COLOR=#0016B0][B]do shell script[/B][/COLOR] "/Applications/ffmpeg -i '" & [COLOR=#3F7F00]filename[/COLOR] & "' -filter:v yadif=0:0:0 -vcodec libx264 -crf 22 -preset medium -s 1024x576 -sws_flags lanczos -acodec aac -strict experimental -ab 128k -threads 0 -y '" & [COLOR=#3F7F00]filename[/COLOR] & ".mp4'; exit"
        [COLOR=#4C4D4D]--Warten, bis ffmpeg fertig ist:[/COLOR]
        [B]tell[/B] [COLOR=#0000FF][I]application[/I][/COLOR] "System Events"
            [B]repeat[/B] [B]until[/B] [B]not[/B] ([COLOR=#0000FF][B]exists[/B][/COLOR] [COLOR=#0000FF][I]process[/I][/COLOR] "ffmpeg")
                [COLOR=#0016B0][B]delay[/B][/COLOR] 1
            [B]end[/B] [B]repeat[/B]
        [B]end[/B] [B]tell[/B]
        
    [B]end[/B] [B]repeat[/B]
[B]end[/B] [COLOR=#0000FF][B]open[/B][/COLOR][/SIZE]

Noch ein paar Anmerkungen:

Dass die Schleife in AppleScript nicht wartet, bis das ShellScript fertig ist hängt damit zusammen, dass AppleScript keine Möglichkeit hat zu erfahren, was andere Scripte gerade machen. Dadurch werden nur AppleScript-Befehle nacheinander abgearbeitet, Befehle in anderen Scripten werden nicht berücksichtigt.

do shell script "perl -e \"print quotemeta ('" & POSIX path of i & "');\"" habe ich weggelassen/ersetzt, da es mMn. unnötig ist. Es reicht den Pfad mit einfachen Anführungszeichen zu maskieren.
 

jb_alvarado

Granny Smith
Registriert
12.06.12
Beiträge
15
Danke für die Hilfe und die ausführliche Erklärung! Warum das AppleScript etwas anders handelt verstehe ich jetzt besser. Dein Script müsste so funktionieren. Jedoch sollte das Script schon in einem Terminal Window laufen. Zu Not könnte ich dein Beispiel hernehmen und statt

(exists process "ffmpeg") - (exists process "Terminal") nehmen und in den Settings des Terminal einstellen, dass er beim exit Befehl das Fenster schließen soll. Finde ich noch nicht ganz so schön.

Was theoretisch auch gehen würde, wäre folgender Code, den ich gefunden habe:

Code:
[/SIZE]
on open filelist
    
    
    repeat with i in filelist
        set filename to POSIX path of i
        tell application "Terminal"
            activate
            my execCmd("/Applications/ffmpeg -i '" & filename & "' -filter:v yadif=0:0:0 -vcodec libx264 -crf 22 -preset medium -s 1024x576 -sws_flags lanczos -acodec aac -strict experimental -ab 128k -threads 0 -y '" & filename & ".mp4'", 1)
        end tell
    end repeat
end open
on execCmd(cmd, wait)
    tell application "System Events"
        tell application process "Terminal"
            set frontmost to true
            keystroke cmd
            keystroke return
        end tell
    end tell
    delay wait
end execCmd


Was hier aber der Nachteil ist, das Script wir nur korrekt verarbeitet, wenn ein Terminalfenster bereits offen ist. Wenn ich per Code versuche ein Fenster zu öffnen, funktioniert es nicht mehr richtig.
 

jb_alvarado

Granny Smith
Registriert
12.06.12
Beiträge
15
Jetzt dachte ich ja ich hätte eine sehr gute Lösung... und Zwar könnte ich ja einfach vorher den Array bilden lassen und diesen erst im Terminal mit "for" auflösen. Würde auch klappen, nur leider funktioniert es nicht mehr wenn Leerzeichen drin sind. Habt Ihr eine Idee?

Code:
on open filelist
    set the_array to {}
    repeat with i in filelist
        set filename to do shell script ¬
            "perl -e \"print quotemeta ('" & POSIX path of i & "');\""
        set end of the_array to filename & " "
    end repeat
    tell application "Terminal"
        activate
        do script "for i in " & the_array & "; do /Applications/ffmpeg -i  $i -filter:v yadif=0:0:0 -pix_fmt yuv420p -vcodec libx264 -crf 22 -preset medium -s 1024x576 -sws_flags lanczos -acodec aac -strict experimental -ab 128k -threads 0 -y $i.mp4; done"
    end tell
end open

Edit: ok habe es jetzt hin bekommen:

Code:
on open filelist
    set the_array to {}
    repeat with i in filelist
        set filename to do shell script ¬
            "perl -e \"print quotemeta ('" & POSIX path of i & "');\""
        set end of the_array to filename & " "
    end repeat
    tell application "Terminal"
        activate
        do script "for j in " & the_array & "; do /Applications/ffmpeg -i \"$j\" -filter:v yadif=0:0:0 -pix_fmt yuv420p -vcodec libx264 -crf 22 -preset medium -s 1024x576 -sws_flags lanczos -acodec aac -strict experimental -ab 128k -threads 0 -y \"${j%.*}\".mp4; done"
    end tell
end open

Also einfach mit \"$j\" den Pfad angeben, mit \"${j%.*}\".mp4 bekommt man die alte Extension weg.

Habe das ganze Script auch noch mal auf meinen Blog gesetzt, falls es mal wer gebrauchen kann. Ein zweites Script kann auch eine angegebene Zeitspanne aus einem Video extrahieren.
http://blog.pixelcrusher.de/
 
Zuletzt bearbeitet: