AppleScript és környéke

Ja és persze az első automator ask for finder items helyett lehetne csinálni egy service-t, ami figyeli, hogy movie fájlok vannak-e kiválasztva és ha igen, akkor a Service menübe (vagy a jobb gombos menübe) be lehet építeni, hogy lefusson ugyanígy. És akkor nem kell alkalmazást készíteni és elindítani előtte.

1 kedvelés

Holnap kipróbálom és már kezdem érteni, mit hagytam ki belőle. Köszönöm szépen!

Amúgy fontos, hogy a Terminál sor után legyen az activate , mert amikor később volt, akkor nekem autómatorban hozott létre új ablakot :)

Nagyon jó kiindulási alap lett a scripted, köszönöm! Már betölti az inputot, végrehajtaná a parancsot, de az applescript egyelőre megtréfálja. Az útvonalat kell másképp megadnom.

Ha minden igaz, ez adja meg az inputot:

repeat with i in input
      set theFile to (i as text)

Ezt a terminal/ffmpeg nem tudja értelmezni, mert ezt kapja a scripttől: user$ ffmpeg -i 'Macintosh HD:Users:user:Desktop:temp0:input.video' -vcodec copy -acodec copy 'Macintosh HD:Users:user:Desktop:temp0:output.video'.mov

Viszont, erre az eredményre lenne szükség a terminalban: user$ ffmpeg -i 'Macintosh HD/Users/user/Desktop/temp0/input.video' -vcodec copy -acodec copy 'Macintosh HD/Users/userDesktop/temp0/output.video'.mov

Azt már látom, ha jól látom, hogy POSIX a kulcsszó.

Ezt a részét én már bashben (terminálban) csinálnám. Mámint egyszerűen:

do script "ITEM=" & theFile
do script "ITEM=${ITEM/:/\/}"
set myTab to do script "echo ${ITEM}" ...

nagyjából persze.
Ami fontos, hogy itt a második sorban és a harmadik sorban lehet gond a szóközzel a fájl névben. Még a másodikban nem biztos, hogy baj lesz vele, de a harmadikat lehet így kell valahogy:

set myTab to do script "echo \"${ITEM}\"" ...

Egyik sort sem teszteltem. Az első sor beteszi az ITEM változóba a theFile elérést.
Második sor az átalakítás, ezt sem teszteltem. kb ez az átalakítás forma: ${miben/miről/mire} cseréljen karaktereket. Itt ugye lehet \ jellel escapelni kell bizonyos karaktereket a per jelet tuti, ezért van előtte vissza per jel.
Szóval ezt nem teszteltem, csak az eddigiek alapján írtam be ezt.

1 kedvelés

Haladunk. :)
Így elindul a dolog, viszont jelentkezett egy olyan probléma, hogy ha több fájlt jelölök ki, nem fut le mindegyiken. A fájlok jók, ha a szokásos módszerrel csinálom, működik, tehát a scriptben van még valami vagy hiányzik belőle valami.

on run {input, parameters}
	tell application "Terminal"
		activate
		set the bounds of the first window to {0, 0, 800, 600}
		(* tell application "System Events" to keystroke "n" using command down *)
		repeat with eachFile in input
			set sourceFile to POSIX path of eachFile
			set myTab to do script " ffmpeg -i " & quoted form of sourceFile & " -c:v -c:a " & quoted form of sourceFile & ".mp4" in window 1
			repeat until myTab is not busy
			end repeat
		end repeat
	end tell
end run

jó ez a POSIX path… :)
Szóval a gond az, hogy a sourceFile változót mindenképpen idézőjelbe kell tenni. Mármint a tartalmát a scriptnek, mert a szóközök miatt nem lesz jó az útvonal, valamint én belefutottam olyanba is, hogy a fájlnév tartalmazott pontosvesszőt és az utána lévő karaktereket új parancsnak vette.
A quoted form of… alkalmazása elvileg jónak kellene lennie, de én biztosabbnak tartom azt, ha rendes idézőjeleket használsz és nem aposztrófot, amit előállít a quoted form. A sourceFile-t meg szerintem érdemes lehet text-re átalakítani:

set sourceFile to ((POSIX path of eachFile) as text)

Következő sort meg így csinálnám:

set myTab to do script " ffmpeg -i \"" & sourceFile & "\" -c:v -c:a \"" & sourceFile & ".mp4\"" in window 1

Szóval az összes sourceFile-t mindig idézőjelek közé téve annyi különbséggel, hogy a másodiknál a .mp4 után kell az idézőjel.

Hány fájllal próbálod meg csinálni? Mert nekem a következő sor gond nélkül lefut 9 fájllal:

set myTab to do script "echo \"" & sourceFile & "\";sleep 3;" in window 1

Bár a qouted formmal is szépen megy nekem:

set myTab to do script "echo " & quoted form of sourceFile & ";sleep 3;" in window 1

Ja és igen, a sleep miatt az ablak busy lesz, szóval elvileg működik az utána lévő repeat block.

1 kedvelés

Na, már nagyon közel járunk, nagyon köszönöm a sok tanácsot. Beraktam egy delay 3-at és most minden oké, csináltam egy 122 fájlos próbát és az alábbi, hiba nélkül lefutott. Most kipróbálom valami komolyabb konvertálással is, de már jó lesz. :)

on run {input, parameters}
	tell application "Terminal"
		activate
		set the bounds of the first window to {0, 0, 800, 600}
		(*tell application "System Events" to keystroke "n" using command down *)
		repeat with eachFile in input
			set sourceFile to ((POSIX path of eachFile) as text)
			set myTab to do script " ffmpeg -i \"" & sourceFile & "\" -vcodec copy -acodec copy -f mp4 \"" & sourceFile & ".mp4\"" in window 1
			delay 3
			repeat until myTab is not busy
			end repeat
		end repeat
	end tell
end run

Még két dolog hiányzik, hogyan lehetne megadni az outputot, ha azt szeretném, hogy az másik path legyen és ne az input mappába tegye?
Illetve hogyan lehet elkerülni, hogy az eredeti extension ne kerüljön be a fájlnév végére?
Most, ha van pl. egy sample.mpg fájlom, akkor sample.mpg.mp4 lesz az eredmény.

Az output könyvtárat te adod meg a sourceFile & ".mp4" résznél. Ezt kellene módosítani. Ehhez persze kellene a fájlneve.
Most találtam hirtelen ezt a trükköt, bár ekkor még nincs meg a fájl neve. Szóval így lehet eltávolítani az extension-t (ideiglenesen).

set extension hidden of thisFile to true
set thisName to displayed name of thisFile
-- display dialog "hey"
set extension hidden of thisFile to false

Szóval biztos meg lehet csinálni az egészet apple scriptben, de én inkább már írnék egy sh fájlt, aminek csak átadod a fájl útvonalat és minden mást megcsinál. Egyszerűbb egy fájl nevet megkapni bashben.

1 kedvelés

Igazad lehet, mindenképpen kipróbálom, mindenesetre nagyon jó amit eddig összehoztunk, sokat segít a folyamatok követésében. Köszönöm szépen!

1 kedvelés
script myScriptObject
    tell parent
		set var to (path to resource "Z.file") as alias
	end tell
endscript

Ha az ember egy application bundle formában mentett appleten dolgozik egy script objektumon belül (script myScriptObject), akkor valamilyen módon a “legkülső” scriptre kell hivatkoznia, hogy elérje a fájlokat a Resources mappában. pl. a tell parent segítségével. (egy script objektum parent property-je, mindig egy referencia a “legkülső” scriptre.)