Applescript для управления iTunes и Rdio - PullRequest
0 голосов
/ 09 сентября 2011

У меня есть 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

1 Ответ

1 голос
/ 10 сентября 2011

Трудно отследить такие проблемы. В целом ваш сценарий выглядит нормально. Вот некоторые идеи, которые могут помочь с вашей проблемой.

Как правило, текстовые сценарии apple интерпретируются во время выполнения, что означает, что каждый раз, когда вы запускаете свой сценарий, байт-код должен быть изменен на код машинного языка другой программой (бегунок яблочного скрипта) ... обычно это не проблема, но в твоем случае, может быть, это вызывает некоторую медлительность. Так что идея состоит в том, чтобы написать свой сценарий, чтобы этого не происходило. Мы можем сделать это, сохранив сценарий как приложение appleScript, поскольку приложения сохраняются в форме машинного языка и, следовательно, не требуют другой программы для выполнения кода. Кроме того, мы можем воспользоваться тем, что команды для обоих приложений идентичны, поэтому мы можем использовать блок «использование терминов». В своем коде вы дважды запрашиваете системные события для «имени процессов», поэтому последняя оптимизация, которую мы можем выполнить, - это сделать это только один раз.

Так что попробуйте и посмотрите, поможет ли это. Я не уверен, что это будет, но это стоит попробовать. Не забудьте сохранить его как приложение.

    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

РЕДАКТИРОВАТЬ: Если приведенный выше код не работает, попробуйте это. Как уже упоминалось, попробуйте в качестве приложения и посмотрите, поможет ли это. Применяются те же принципы ... на один запрос меньше системных событий и сохранение в виде приложения, чтобы избежать необходимости интерпретировать код.

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
...