Найден API-интерфейс iTunes Controller для Java, как воспроизвести определенную песню?

        //Using iTunes Controller
        iTunes itc = new iTunes();
        itc.playFile(filePath); // Takes type String

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

Я мог бы использовать подсказку, чтобы получить исполнителя и альбом, чтобы увидеть, к каким папкам переходить, поскольку именно так iTunes хранит свои файлы ... (например, C:\Users\username\Music\iTunes\iTunes Media\Artist\Album\song )

Кто-нибудь знает, как я могу просто перейти прямо к указанной песне? Я искал какое-то время.

Вот документы для API, который я использую, если это поможет http://www.dot-totally.co.uk/software/itunescon/javadoc-0.2/index.html

ОБНОВИТЬ----------------------------------

Так я встал....

//Using iTunes Controller -- Still doesn't work
iTunes itc = new iTunes();
ITSourceCollection sc = (ITSourceCollection) itc.getSources();
ITSource source = sc.getItemByName(song);
int trackID = source.getTrackID();
// Now what to do with the track id? Look for getTrack by ID, then track.play();
// Found that a TrackCollection can return a Track by ID.
// Need to find out how to get the TrackCollection of the library

Я застрял.... :(

РЕДАКТИРОВАТЬ:

Я подумал, что могу просто вручную создать трек на основе информации, которую я могу получить из исходной коллекции. Запутался в конструкторе...

ITTrack(com.jacob.com.Dispatch d)

???? Кто-нибудь может пояснить, каким будет правильный синтаксис для создания объекта ITTrack? вот javadoc для него, я его не понимаю.

http://www.dot-totally.co.uk/software/itunescon/javadoc-0.2/com/dt/iTunesController/ITTrack.html

ОБНОВИТЬ--------------------------------------

В порядке. Поэтому я использовал метод fetchDispatch() для создания класса ITTrack. http://www.dot-totally.co.uk/software/itunescon/javadoc-0.2/com/dt/iTunesController/ITObject.html#fetchDispatch()

//Using iTunes Controller -- work in progress
iTunes itc = new iTunes();
ITSourceCollection libsource = (ITSourceCollection) itc.getSources();
ITSource trackToPlay = libsource.getItemByName(song);
ITTrack track = new ITTrack(trackToPlay.fetchDispatch());
track.play();

Теперь я получаю исключение:

Exception in thread "main" java.lang.NoSuchMethodError: com.jacob.com.Dispatch.call(Lcom/jacob/com/Dispatch;Ljava/lang/String;Ljava/lang/Object;)Lcom/jacob/com/Variant;
at com.dt.iTunesController.ITSourceCollection.getItemByName(ITSourceCollection.java:49)
at Build.Clapper3.process(-----.java:117)
at Build.Clapper3.main(-----.java:232)

гах так близко! Итак, я делаю что-то не так с моим методом ввода «имени» элемента .... но что?

Я подумал, может быть, если я введу:

System.out.println(libsource.toString());

чтобы найти имена источников .... но я думаю, что у него нет метода toString ()? вывод был:

com.dt.iTunesController.ITSourceCollection@118278a

person Riptyde4    schedule 10.04.2013    source источник
comment
Я бы прочитал документы немного больше и попробовал несколько вещей. Начните с просмотра iTunes#getSelectedTracks. В конце концов, когда вы дойдете до ITrack, у него будет play метод   -  person MadProgrammer    schedule 10.04.2013
comment
getSelectedTracks просто возвращает дорожку, выбранную левым щелчком курсора. То, как я пытаюсь это настроить, заключается в том, что пользователь вводит название песни, оно сохраняется в строке. Затем строка используется, чтобы указать, какую песню воспроизвести, с помощью некоторого метода, который мне нужно выяснить.   -  person Riptyde4    schedule 10.04.2013
comment
Извините, я имел в виду getSources   -  person MadProgrammer    schedule 10.04.2013
comment
:) Проверяю, хорошая находка!   -  person Riptyde4    schedule 10.04.2013
comment
Я не знаю, может ли это помочь, но в документе Typically, an ITrack is accessed through an ITTrackCollection. You can retrieve all the tracks defined for a playlist using ITPlaylist.getTracks(); я вижу, что ITSource имеет getPlaylists(), так что, может быть, вы можете что-то с этим сделать? Но я не получил никаких знаний об этом API.   -  person Marc-Andre    schedule 10.04.2013
comment
Это сработает, но у меня нет определенных списков воспроизведения, и тогда я возвращаюсь к своей исходной проблеме (нет возможности получить TrackCollection): / Я ценю эту мысль, хотя   -  person Riptyde4    schedule 10.04.2013
comment
Если у кого-то есть опыт использования jacob, я уверен, что они могут сказать мне, как получить Dispatch d, чтобы удовлетворить конструктор... тогда я смогу взять его оттуда, поскольку я уже могу получить всю необходимую мне информацию для создания объекта ITTrack для вызова метода play().   -  person Riptyde4    schedule 10.04.2013
comment
снова обновился, использовал метод fetchDispatch(), но получил исключение   -  person Riptyde4    schedule 10.04.2013


Ответы (1)


В итоге я отказался от API контроллера iTunes и создал свой собственный с помощью JacobGen. Я понял, что индекс 1 — это источник библиотеки, а для IITPlaylistCollection индекс 1 — это список воспроизведения библиотеки (все песни), затем вызывается play() для объекта IITTrack. Работает прекрасно, даже открывает iTunes, если он еще не открыт!

ActiveXComponent iTunesCom = new ActiveXComponent("iTunes.Application");
Dispatch iTunesController = new Dispatch(iTunesCom.getObject());
IiTunes it = new IiTunes(iTunesController);
IITSourceCollection sourceList = it.getSources();
IITSource s = sourceList.getItem(1); // Index 1 is library source
IITPlaylistCollection pc = s.getPlaylists();
IITPlaylist p = pc.getItem(1); // Index 1 is library playlist
IITTrackCollection tracks = p.getTracks();
IITTrack track = tracks.getItemByName(songName);
track.play();

Аналогично работает с плейлистами:

ActiveXComponent iTunesCom = new ActiveXComponent("iTunes.Application");
Dispatch iTunesController = new Dispatch(iTunesCom.getObject());
IiTunes it = new IiTunes(iTunesController);
IITSourceCollection sourceList = it.getSources();
IITSource s = sourceList.getItem(1); // Index 1 is library source
IITPlaylistCollection pc = s.getPlaylists();
IITPlaylist playlist = pc.getItemByName(playlistName);
playlist.playFirstTrack();

Спасибо за все ваши указатели, надеюсь, это поможет любому с подобным вопросом. Мне потребовалась целая вечность, чтобы понять, как заставить JacobGen работать, поскольку в Интернете практически нет документации по нему. Если у кого-то есть вопросы, я буду рад сделать пост об этом.

person Riptyde4    schedule 12.04.2013