Google Deskbar API の例にあった、"HDD から曲を検索して再生" ってのをやってみようと C# でちょろっとコードを書いてみる。
using System; using Google.Desktop; using iTunesLib; public class iTunesSearch : ICustomSearch { public string Title() { return "iTunes"; } public OutputType GetOutputType() { return OutputType.kDeskbar; } public string Run(string query, OutputType browser_type) { IiTunes iTunesApp = new iTunesAppClass(); IITLibraryPlaylist playlist = iTunesApp.LibraryPlaylist; IITTrackCollection tracks = playlist.Search(query, ITPlaylistSearchField.ITPlaylistSearchFieldAll); if (tracks.Count > 0) { // IITTrack track = tracks.Item(1); IITTrack track = tracks.get_ItemByPlayOrder(1); track.Play(); return track.Name; } else { return "No tunes found for " + query; } } }
なぜか IITTrackCollection.Item が未定義というエラーになるのはおいておいて、これ dll つくって Deskbar から呼び出すと、ただの "error" になってしまうんですなぁ。コマンドラインからだと動くんだけども。COM のセキュリティとかかなぁ。しかし SDK の samples にあった PassGen.c も同様に "error" になったのでほかの問題かも。デバッグ困難です。 → iTunesWrapper.dll を Plugins ディレクトリにおいたら動いたっぽい。
ちなみに iTunes COM を C# から使うには iTunes.exe の Typelib をインポートして reference に追加する必要あり(VisualStduio だとツールでできるらし)。フリーの Microsoft SDK でやるには、以下のように。
% tlbimp "c:\program files\iTunes\ITunes.exe" /out:iTunesWrapper.dll /namespace:iTunesLib % csc /target:libarary /out:iTunes.dll /r:deskbarex.dll /r:iTunesWrapper.dll iTunes.cs