Владелец большой фонотеки, управляемой iTunes, рано или поздно задаётся вопросом как автоматизировать рутинные процессы её обслуживания. Как и в других случаях, на помощь здесь приходят скрипты. Если владелец фонотеки работает в операционной системе Windows и уже знаком с написанием скриптов PowerShell, то эти знания пригодятся и для управления iTunes.
Для начала немного сведений о технологиях Microsoft и почему для управления музыкальным плеером выбран PowerShell.
В операционной системе Windows доступна технология Active Scripting, основанная на Microsoft OLE Automation, позволяющей обращаться к COM-объектам из интерпретаторов скриптовых языков, например, предустановленных VBScript и JScript. При желании в сети можно найти примеры скриптов, работающих с iTunes, написанных на этих языках.
Однако с появлением PowerShell и .NET популярность Active Scripting стала снижаться. Пользователю операционной системы Windows, занимающемуся автоматизацией для личных целей, нет практического смысла в изучении и применении сразу всех доступных технологий и скриптовых языков. Поэтому предлагаю рассмотреть работу с iTunes именно в PowerShell, так как полученные знания найдут применение и в других задачах, где PowerShell будет подходящим инструментом.
Работа с iTunes в PowerShell начинается с создания экземпляра COM-объекта iTunes.Application при помощи командлета New-Object
.
$itunes = New-Object -ComObject iTunes.Application
Если iTunes не был запущен во время выполнения этой команды, то он запустится автоматически. Переменная $itunes
содержит экземпляр COM-объекта и теперь можно просмотреть его структуру, узнать какие свойства и методы доступны для работы с ними. Для этого используется командлет Get-Member
.
$itunes | Get-Member
После выполнения команды будет выведен список элементов объекта:
TypeName: System.__ComObject#{9dd6680b-3edc-40db-a771-e6fe4832e34a}
Name MemberType Definition
---- ---------- ----------
Authorize Method void Authorize (int, Variant, string)
BackTrack Method void BackTrack ()
CheckVersion Method bool CheckVersion (int, int)
ConvertFile Method IITOperationStatus ConvertFile (string)
ConvertFile2 Method IITConvertOperationStatus ConvertFile2 (string)
ConvertFiles Method IITOperationStatus ConvertFiles (Variant)
ConvertFiles2 Method IITConvertOperationStatus ConvertFiles2 (Variant)
ConvertTrack Method IITOperationStatus ConvertTrack (Variant)
ConvertTrack2 Method IITConvertOperationStatus ConvertTrack2 (Variant)
ConvertTracks Method IITOperationStatus ConvertTracks (Variant)
ConvertTracks2 Method IITConvertOperationStatus ConvertTracks2 (Variant)
CreateEQPreset Method IITEQPreset CreateEQPreset (string)
CreateFolder Method IITPlaylist CreateFolder (string)
CreateFolderInSource Method IITPlaylist CreateFolderInSource (string, Variant)
CreatePlaylist Method IITPlaylist CreatePlaylist (string)
CreatePlaylistInSource Method IITPlaylist CreatePlaylistInSource (string, Variant)
FastForward Method void FastForward ()
GetITObjectByID Method IITObject GetITObjectByID (int, int, int, int)
GetITObjectPersistentIDs Method void GetITObjectPersistentIDs (Variant, int, int)
GetPlayerButtonsState Method void GetPlayerButtonsState (bool, ITPlayButtonState, bool)
GotoMusicStoreHomePage Method void GotoMusicStoreHomePage ()
NextTrack Method void NextTrack ()
OpenURL Method void OpenURL (string)
Pause Method void Pause ()
Play Method void Play ()
PlayerButtonClicked Method void PlayerButtonClicked (ITPlayerButton, int)
PlayFile Method void PlayFile (string)
PlayPause Method void PlayPause ()
PreviousTrack Method void PreviousTrack ()
Quit Method void Quit ()
Resume Method void Resume ()
Rewind Method void Rewind ()
SetOptions Method void SetOptions (int)
Stop Method void Stop ()
SubscribeToPodcast Method void SubscribeToPodcast (string)
UpdateIPod Method void UpdateIPod ()
UpdatePodcastFeeds Method void UpdatePodcastFeeds ()
CanSetShuffle ParameterizedProperty bool CanSetShuffle (Variant) {get}
CanSetSongRepeat ParameterizedProperty bool CanSetSongRepeat (Variant) {get}
ITObjectPersistentIDHigh ParameterizedProperty int ITObjectPersistentIDHigh (Variant) {get}
ITObjectPersistentIDLow ParameterizedProperty int ITObjectPersistentIDLow (Variant) {get}
AppCommandMessageProcessingEnabled Property bool AppCommandMessageProcessingEnabled () {get} {set}
BrowserWindow Property IITBrowserWindow BrowserWindow () {get}
ConvertOperationStatus Property IITConvertOperationStatus ConvertOperationStatus () {get}
CurrentEncoder Property IITEncoder CurrentEncoder () {get} {set}
CurrentEQPreset Property IITEQPreset CurrentEQPreset () {get} {set}
CurrentPlaylist Property IITPlaylist CurrentPlaylist () {get}
CurrentStreamTitle Property string CurrentStreamTitle () {get}
CurrentStreamURL Property string CurrentStreamURL () {get}
CurrentTrack Property IITTrack CurrentTrack () {get}
CurrentVisual Property IITVisual CurrentVisual () {get} {set}
Encoders Property IITEncoderCollection Encoders () {get}
EQEnabled Property bool EQEnabled () {get} {set}
EQPresets Property IITEQPresetCollection EQPresets () {get}
EQWindow Property IITWindow EQWindow () {get}
ForceToForegroundOnDialog Property bool ForceToForegroundOnDialog () {get} {set}
FullScreenVisuals Property bool FullScreenVisuals () {get} {set}
LibraryPlaylist Property IITLibraryPlaylist LibraryPlaylist () {get}
LibrarySource Property IITSource LibrarySource () {get}
LibraryXMLPath Property string LibraryXMLPath () {get}
Mute Property bool Mute () {get} {set}
PlayerPosition Property int PlayerPosition () {get} {set}
PlayerPositionMS Property int PlayerPositionMS () {get} {set}
PlayerState Property ITPlayerState PlayerState () {get}
SelectedTracks Property IITTrackCollection SelectedTracks () {get}
SoundVolume Property int SoundVolume () {get} {set}
SoundVolumeControlEnabled Property bool SoundVolumeControlEnabled () {get}
Sources Property IITSourceCollection Sources () {get}
Version Property string Version () {get}
Visuals Property IITVisualCollection Visuals () {get}
VisualsEnabled Property bool VisualsEnabled () {get} {set}
VisualSize Property ITVisualSize VisualSize () {get} {set}
Windows Property IITWindowCollection Windows () {get}
Свойство MemberType определяет тип элемента объекта:
- Method - метод;
- ParameterizedProperty и Property - свойства.
О назначении перечисленных методов и свойств можно догадаться исходя из их имён (Name), о работе с ними говорят их определения (Definition). Например, свойства, в описании которых указано только {get}
, доступны исключительно для чтения.
Примеры вызова методов COM-объекта iTunes:
#Перейти на главную страницу музыкального магазина iTunes
$itunes.GotoMusicStoreHomePage()
#Обновить ленты подкастов
$itunes.UpdatePodcastFeeds()
Примеры работы со свойствами COM-объекта iTunes:
#Получить версию iTunes
$itunes.Version
#Получить текущий уровень громкости
$itunes.SoundVolume
#Установить уровень громкости 50 (значение от 0 до 100)
$itunes.SoundVolume = 50
#Выключить звук
$itunes.Mute = $true
#Включить звук
$itunes.Mute = $false
Если логика работы скрипта требует завершения работы iTunes после завершения его выполнения, то для этого используется метод Quit()
. После его вызова iTunes будет закрыт.
Однако можно пойти дальше. Так как работа велась с COM-объектом, не лишним будет обратить внимание на освобождение памяти. Делается это так.
#Завершение работы iTunes
itunes.Quit()
#Очистка памяти
#Обнуление счётчика ссылок на COM-объект
$null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$itunes)
#Принудительная сборка мусора
[gc]::Collect()
#Удаление переменной
Remove-Variable itunes
На этом первое знакомство с принципом и возможностями управления iTunes из PowerShell завершено. После изучения доступных методов и свойств можно приступить к рассмотрению конкретных задач по управлению воспроизведением и работой с библиотекой iTunes.