1

I am trying to pass a file path into n Applescript from Python, not sure how to achieve it. The code below shows the working Applescript code which prompts to open a file, or files, then re-assigns the audio channels, saves and closes. Instead of prompting for a file or files, I want to pass the file path into the osascript Applescript, I have already set the args, but not sure how to get it to work.

from subprocess import Popen, PIPE

scpt = '''
    on run
        open (choose file with prompt ("Choose movie file(s)") ¬
        with multiple selections allowed)
    end run

    on open aa
        set channel_layouts_map1 to {¬
            {"Sound Track 1", "Sound Track 1", {"Left"}}, ¬
            {"Sound Track 2", "Sound Track 2", {"Right"}}, ¬
            {"Sound Track 3", "Sound Track 3", {"Center"}}, ¬
            {"Sound Track 4", "Sound Track 4", {"LFE Screen"}}, ¬
            {"Sound Track 5", "Sound Track 5", {"Left Surround"}}, ¬
            {"Sound Track 6", "Sound Track 6", {"Right Surround"}}, ¬
            {"Sound Track 7", "Sound Track 7", {"Left Total"}}, ¬
            {"Sound Track 8", "Sound Track 8", {"Right Total"}} ¬
                }
        set channel_layouts_map2 to {¬
            {"Sound Track 1", "Sound Track 1", {"Left"}}, ¬
            {"Sound Track 2", "Sound Track 2", {"Right"}}, ¬
            {"Sound Track 3", "Sound Track 3", {"Center"}}, ¬
            {"Sound Track 4", "Sound Track 4", {"LFE Screen"}}, ¬
            {"Sound Track 5", "Sound Track 5", {"Left Surround"}}, ¬
            {"Sound Track 6", "Sound Track 6", {"Right Surround"}}, ¬
            {"Sound Track 7", "Sound Track 7", {"Left Total", "Right Total"}} ¬
                }
        set channel_layouts_map3 to {¬
            {"Sound Track", "Sound Track", {"Left", "Right"}} ¬
                }
        set channel_layouts_map4 to {¬
            {"Sound Track 1", "Sound Track 1", {"Left"}}, ¬
            {"Sound Track 2", "Sound Track 2", {"Right"}} ¬
                }

        repeat with a in aa
            set f to a's POSIX path
            set k to count_sound_tracks(f, {_close:false})
            if k = 8 then
                remap_audio_channels(f, channel_layouts_map1)
            else if k = 7 then
                remap_audio_channels(f, channel_layouts_map2)
            else if k = 1 then
                remap_audio_channels(f, channel_layouts_map3)
            else if k = 2 then
                remap_audio_channels(f, channel_layouts_map4)
            else
                -- ignore it (just close it)
                close_document(f, {_save:false})
            end if
        end repeat
    end open

    on count_sound_tracks(f, {_close:_close})
        tell application id "com.apple.quicktimeplayer" -- QuickTime Player 7 Pro
            open (f as POSIX file)
            tell (document 1 whose path = f)
                repeat until exists
                    delay 0.2
                end repeat
                set k to count (tracks whose audio channel count > 0)
                if _close then close
            end tell
        end tell
        return k
    end count_sound_tracks

    on close_document(f, {_save:_save})
        tell application id "com.apple.quicktimeplayer" -- QuickTime Player 7 Pro
            tell (document 1 whose path = f)
                if exists then
                    if _save and modified then save
                    close
                end if
            end tell
        end tell
    end close_document

    on remap_audio_channels(f, channel_layouts_map)
        script o
            property map : channel_layouts_map
            property pp : {}
            property qq : {}

            -- get name and id of sound tracks
            tell application id "com.apple.quicktimeplayer" -- QuickTime Player 7 Pro
                activate
                open (f as POSIX file)
                tell (document 1 whose path = f)
                    repeat until exists
                        delay 0.2
                    end repeat
                    tell (tracks whose audio channel count > 0)
                        set {pp, qq} to {name, id} -- name and id of sound tracks
                    end tell
                end tell
            end tell

            -- remap audio channel layouts as specified
            tell application "System Events"
                tell (process 1 whose bundle identifier = "com.apple.quicktimeplayer")
                    -- open movie properties window
                    keystroke "j" using {command down}

                    tell (window 1 whose subrole = "AXDialog") -- properties for movie
                        repeat until exists
                            delay 0.2
                        end repeat
                        repeat with m in my map
                            set {trk, undef, layouts} to m
                            -- [TRK:
                            repeat 1 times
                                if trk's class = integer then
                                    if trk < 1 or trk > (count my pp) then exit repeat -- TRK:
                                    set trk to my pp's item trk
                                end if
                                tell scroll area 1
                                    tell table 1
                                        tell (row 1 whose text field 1's value = trk) -- target sound track whose name = trk
                                            if not (exists) then exit repeat -- TRK:
                                            select
                                        end tell
                                    end tell
                                end tell
                                tell tab group 1
                                    click radio button 3 -- audio settings
                                    tell scroll area 1
                                        tell table 1 -- channel assignment table
                                            set ix to count layouts
                                            repeat with i from 1 to count rows
                                                if i > ix then exit repeat
                                                tell row i -- channel i
                                                    tell pop up button 1
                                                        click
                                                        tell menu 1 -- channel assignment menu
                                                            tell (menu item 1 whose title = layouts's item i)
                                                                if exists then click
                                                            end tell
                                                        end tell
                                                    end tell
                                                end tell
                                            end repeat
                                        end tell
                                    end tell
                                end tell
                            end repeat
                            -- /TRK:]
                        end repeat

                        -- close movie properties window
                        click (button 1 whose subrole = "AXCloseButton")
                    end tell
                end tell
            end tell

            -- rename sound tracks as specified
            tell application id "com.apple.quicktimeplayer"
                tell document 1
                    repeat with m in my map
                        -- [RENAME:
                        repeat 1 times
                            set {x, y} to m's items 1 thru 2 -- {old name or index, new name or index}
                            if x's class = integer then
                                if x < 1 or x > (count my pp) then exit repeat -- RENAME:
                            else
                                set x to my _index_of(pp, x)
                                if x = 0 then exit repeat -- RENAME:
                            end if
                            if y's class = integer then
                                if y < 1 or y > (count my pp) then exit repeat -- RENAME:
                                set y to my pp's item y
                            end if
                            set p to my pp's item x
                            set q to my qq's item x
                            if p ≠ y then set track id q's name to y
                        end repeat
                        -- /RENAME:]
                    end repeat
                    if modified then save
                    close
                end tell
            end tell

        end script
        tell o to run
    end remap_audio_channels

    on _index_of(xx, x) -- renamed _bsearch() v0.1
        script o
            property aa : xx
            local i, j, k
            if {x} is not in my aa then return 0
            set i to 1
            set j to count my aa
            repeat while j > i
                set k to (i + j) div 2
                if {x} is in my aa's items i thru k then
                    set j to k
                else
                    set i to k + 1
                end if
            end repeat
            return i
        end script
        tell o to run
    end _index_of'''

args = ["/Users/me/Desktop/DOWNLOAD/44.mov"]

p = Popen(['osascript', '-'] + args, stdin=PIPE, stdout=PIPE, stderr=PIPE)
stdout, stderr = p.communicate(scpt)
print (p.returncode, stdout, stderr)

2 Answers 2

1

Found the answer. Needed to change the on run section to this:

on run argv
    repeat with a in argv
        set a's contents to a as POSIX file as alias
    end repeat
    open argv
end run
Sign up to request clarification or add additional context in comments.

Comments

0

According to the man page for osascript, arguments get passed to the run handler.

So just like you have “on open aa”, you would have “on run filepath”, and then use that in the “choose file”.

on run filepath
    open (choose file with prompt ("Choose movie file(s)") ¬
    with multiple selections allowed default location filepath)
end run

Literally, that should be the only change you have to make.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.