0

Alfredと組み合わせて使用​​する Applescriptがあります。これは、開いているものに応じて、iTunes またはRdioで現在のトラックを再生または一時停止します。私のスクリプトでは、Rdio が優先されます。これは、私は常に iTunes を開いており、特定の目的で必要な場合にのみ Rdio を開くためです。

多くの場合、トラックが iTunes で再生されているときにグローバル ショートカットを押してこのスクリプトを実行すると、トラックを停止するのに最大 15 秒かかります。ここでスクリプトを共有し、明らかな問題があるかどうか、またはそれを処理するためのより簡単で効率的な方法があるかどうかを確認したいと思いました.

私が得ることができるどんな助けにも感謝します!

tell application "System Events"
    if (name of processes) contains "iTunes" then
        set iTunesRunning to true
    else
        set iTunesRunning to false
    end if
    if (name of processes) contains "Rdio" then
        set RdioRunning to true
    else
        set RdioRunning to false
    end if
end tell

if RdioRunning then
    tell application "Rdio"
        if player state is paused or player state is stopped then
            play
        else if player state is playing then
            pause
        end if
    end tell
else if iTunesRunning then
    tell application "iTunes"
        if player state is paused or player state is stopped then
            play
        else if player state is playing then
            pause
        end if
    end tell
end if
4

1 に答える 1

1

このような問題を追跡することは困難です。一般に、スクリプトは問題ないように見えます。ただし、問題の解決に役立つ可能性のあるアイデアがいくつかあります。

一般に、applescripts は実行時に解釈されます。つまり、スクリプトを実行するたびに、別のプログラム (applescript runner) によってバイトコードを機械語コードに変更する必要があります...これは通常問題ではありませんが、あなたの場合多分それはいくつかの速度低下を引き起こしています。したがって、スクリプトを作成して、それが発生する必要がないようにする必要があります。アプリケーションは機械語形式で保存され、コードを実行するために別のプログラムを必要としないため、スクリプトを AppleScript アプリケーションとして保存することでこれを行うことができます。さらに、両方のアプリケーションのコマンドが同一であることを利用できるため、「using terms from」ブロックを使用できます。あなたのコードでは、「プロセス名」のシステム イベントを 2 回クエリしているため、最後の最適化は、それを 1 回だけ実行することです。

これを試して、それが役立つかどうかを確認してください。確実ではありませんが、試してみる価値はあります。アプリケーションとして保存することを忘れないでください。

    tell application "System Events" to set pNames to name of application processes

    if "Rdio" is in pNames then
        set appName to "Rdio"
    else if "iTunes" is in pNames then
        set appName to "iTunes"
    else
        return
    end if

    using terms from application "iTunes"
        tell application appName
            if player state is paused or player state is stopped then
                play
            else if player state is playing then
                pause
            end if
        end tell
    end using terms from

編集:上記のコードが機能しない場合は、これを試してください。前述のように、アプリケーションとして試してみて、役立つかどうかを確認してください。同じ原則が適用されます... システム イベントのクエリが 1 つ減り、コードを解釈する必要がないようにアプリケーションとして保存されます。

tell application "System Events" to set pNames to name of application processes

if "Rdio" is in pNames then
    tell application "Rdio"
        if player state is paused or player state is stopped then
            play
        else if player state is playing then
            pause
        end if
    end tell
else if "iTunes" is in pNames then
    tell application "iTunes"
        if player state is paused or player state is stopped then
            play
        else if player state is playing then
            pause
        end if
    end tell
end if
于 2011-09-10T06:11:41.217 に答える