Выбор всех треков в iTunes с помощью AppleScript

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

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? Спасибо за любую помощь.


person squircle    schedule 06.01.2011    source источник


Ответы (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

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

person Antal Spector-Zabusky    schedule 07.01.2011
comment
Спасибо за лаконичный ответ и объяснение. Очень признателен! - person squircle; 07.01.2011

Вы были дезинформированы: 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.

person Ned Deily    schedule 07.01.2011
comment
Спасибо за объяснение различных результатов, возвращаемых сценарием. Я принял другой ответ только потому, что он был самым кратким и быстрым в моих тестах. Ваше здоровье! - person squircle; 07.01.2011
comment
Я обнаружил, что AppleScript часто воспринимается как язык только для чтения - все, что в итоге работает, обычно читается, но без опыта добраться до него может быть непросто. - person Antal Spector-Zabusky; 07.01.2011
comment
Я вижу две основные проблемы: 1. непоследовательное и непредсказуемое поведение различных приложений Apple Events и интерфейса объектной модели; и 2. особенности самого языка AppleScript. Пользователь мало что может сделать с первым (хотя встроенные возможности создания сценариев, которые предоставляет Cocoa, в некоторой степени помогли обеспечить более единообразное взаимодействие между приложениями). Мое предпочтительное решение последнего - избегать написания программ на AppleScript, а вместо этого использовать py-appscript, который дает преимущество более богатого языка и библиотеки, python (есть также rb-appscript для Ruby). - person Ned Deily; 07.01.2011