2011-01-06 3 views
2

у меня есть это очень простой AppleScript, который я пытаюсь работать на моем Mac, чтобы удалить рейтинги из всех моих песен в ITunes:Выбор всех треков в ITunes с AppleScript

tell application "iTunes" 
    set sel to every track in library playlist 
    repeat with i from 1 to the count of sel 
     set rating of track i in sel to 0 
    end repeat 
end tell 

Я никогда ничего не писал в AppleScript раньше, но подумал, что я дам ему шанс (так как он должен быть настолько интуитивным). К сожалению, я получаю эту ошибку при попытке запустить сценарий:

error "Can’t get every track of library playlist." number -1728 
from every «class cTrk» of «class cLiP» 

Что это за ошибка? Есть ли альтернативный способ выбора треков в iTunes? Спасибо за любую помощь.

ответ

2

Я не совсем понимаю, почему, но ответ заключается в том, что в плейлисте библиотеки фактически нет треков. Странно, я знаю, но поскольку вы просто хотите запустить это на каждом треке, есть еще более простое решение. Вместо every track of library просто используйте every track; это получит буквально каждый трек в приложении, и это то, что вы пытаетесь сделать. И с несколькими другими упрощений, это становится

tell application "iTunes" to set the rating of every track to 0 

Синтаксис tell application "iTunes" to ... просто как обычный tell блок, но это только один оператор долго и не принимает end tell. И вы можете автоматически запускать команду set над каждой записью в списке сразу, так что это все, что вам нужно. В общем, вам редко приходится перечислять по индексам; например, что-то ближе к вашему решению, есть эквивалент

tell application "iTunes" 
    repeat with t in every track 
    set the rating of t to 0 
    end repeat 
end tell 

Это позволяет избежать индексации, и также, вероятно, будет быстрее (хотя один лайнер, вероятно, будет самым быстрым, если есть разница).

+0

Спасибо за краткий ответ и объяснение. Очень признателен! – squircle

1

Вы были дезинформированы: AppleScript не очень интуитивно понятен, прежде всего потому, что так много его наблюдаемого поведения определяется реализацией каждой своей объектной модели каждым приложением. Хотя это может быть очень мощным, вам часто приходится экспериментировать, пока не найдете правильные заклинания, которые работают для конкретного приложения.

В этом случае вам необходимо выбрать первый элемент плейлистов. Обратите внимание на различие:

get library playlist 
    Result: 
     library playlist -- the class 
get library playlists 
    Result: 
     {library playlist id 51776 of source id 67 of application "iTunes"} -- a list 
get first library playlist 
    Result: 
     library playlist id 51776 of source id 67 of application "iTunes" -- first item 

Но то, что вы, вероятно, хотите сделать что-то больше, как это:

tell application "iTunes" 
    repeat with tr in every track in first Library playlist 
     set rating of tr to 60 -- values are 0 to 100 
    end repeat 
end tell 

Если у вас есть большая библиотека, вы можете захотеть первый эксперимент с меньшим воспроизведения, для экземпляр, выберите дорожку в тестовом плейлисте, а затем замените in current playlist в заявлении repeat.

+0

Спасибо за объяснение различных результатов, возвращаемых скриптом. Я принял другой ответ только потому, что это самый краткий и быстрый в моих тестах. Ура! – squircle

+0

Что я нашел, так это то, что AppleScript часто чувствует себя как «доступный только для чтения» язык - все, что в конечном итоге работает, обычно читаемо, но получение там может быть жестким без опыта. –

+0

Я вижу две основные проблемы: 1. непоследовательное и непредсказуемое поведение интерфейса приложений Apple и объектной модели различных приложений; и 2. причуды самого языка AppleScript. Существует не так много, что пользователь может сделать о первом (хотя встроенные возможности сценариев, которые предоставляет Cocoa, несколько помогли дать более последовательный опыт в приложениях).Мое предпочтительное решение для последнего заключается в том, чтобы избежать написания программ в AppleScript, но вместо этого использовать py-appscript, который дает преимущество более богатого языка и библиотеки, python (есть также rb-appscript для Ruby). –