4月 22

またもやmixi stationのマネッコなのですが。(^^;
iTunesで現在聴いている曲の情報を取得してみました。
blogやSNSへ投稿する部分は真面目に頑張ればできると思いますが(今回はメンドウないのでやりません)、興味の先は一体『外部プログラムで iTunes にどうやってアクセスするのだろうか?』の部分です、調べてみたところ Windowsの場合iTunesAPI はCOMコンポーネントになっているので、VBやC#、Javascript、等からとても手軽に扱えるということがわかりました。
色々調べながらここまで作るのに約2~3時間くらいかな(VS2003/C#)。。。
iTunes API
単純に現在再生中の曲名を取得するだけなら30分もかからないでしょう、ブログに書くにあたって体裁を整えたり、余計な(プログレスバーとか。w)付けたりの方が時間かかりました。笑

iTunesLibを登録

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using iTunesLib;

iTunesAppClass のインスタンスをクラスメンバitunesとします

namespace iTunesTest
{
	/// <summary>
	/// Form1 の概要の説明です。
	/// </summary>
	public class Form1 : System.Windows.Forms.Form
	{
		private System.Windows.Forms.ListView listView1;
		private System.ComponentModel.IContainer components;
		private System.Windows.Forms.ProgressBar progressBar1;
		private System.Windows.Forms.Timer timer1;

		private iTunesApp itunes;

メインフォーム

		public Form1()
		{
			//
			// Windows フォーム デザイナ サポートに必要です。
			//
			InitializeComponent();

			//
			// TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
			//

			// リストビューの準備
			listView1.FullRowSelect = true;
			listView1.GridLines = true;
			listView1.View  = View.Details;
			listView1.HeaderStyle = ColumnHeaderStyle.Nonclickable;
			listView1.Columns.Add("項目", 140, HorizontalAlignment.Left);
			listView1.Columns.Add("値",   250, HorizontalAlignment.Left);

			// iTunesAppClassインスタンス生成
			itunes = new iTunesAppClass();

			// カレントトラック情報
			IITTrack track = itunes.CurrentTrack;
			if (track!=null)
			{
				ViewInfo(track);	//トラックが選択されているので情報表示
			}

			// イベントハンドラ登録
			itunes.OnPlayerPlayEvent +=
new _IiTunesEvents_OnPlayerPlayEventEventHandler(OnPlayerPlay_Event);
			itunes.OnPlayerStopEvent +=
new _IiTunesEvents_OnPlayerStopEventEventHandler(OnPlayerStop_Event);
			itunes.OnAboutToPromptUserToQuitEvent +=
new _IiTunesEvents_OnAboutToPromptUserToQuitEventEventHandler(OnAboutToPromptUserToQuitEvent);

			// プログレスバー設定
			progressBar1.Maximum = 100;
			progressBar1.Value = 0;
			timer1.Interval = 1000 * 1;	// 監視間隔設定(ミリ秒)
			timer1.Start();	// 監視タイマー開始
		}

イベントハンドラー:再生が停止した

		void OnPlayerStop_Event(object iTrack)
		{
		}

イベントハンドラー:再生が開始された

		void OnPlayerPlay_Event(object iTrack)
		{
			// 情報更新
			ViewInfo((IITTrack)iTrack);
		}

イベントハンドラー:iTunesが終了

		// iTunesが終了してしまった場合(自分も終了しないとエラーになる)
		void OnAboutToPromptUserToQuitEvent()
		{
			this.Close();
		}

イベントハンドラー:タイマーイベント

		private void timer1_Tick(object sender, System.EventArgs e)
		{
			// カレントトラック情報
			IITTrack track = itunes.CurrentTrack;

			// プログレスを百分率で計算-
			int nowPos = (int)((double)itunes.PlayerPosition / (double)track.Duration*100.0);
			progressBar1.Value = nowPos;
			// ウインドウタイトルに再生中の曲名にする
			string strTime = itunes.PlayerPosition/60 + ":"+ itunes.PlayerPosition%60;
			this.Text = track.Name + " " + strTime;
		}

トラック情報を表示するファンクション

		void ViewInfo( IITTrack iTrack )
		{
			// ウインドウタイトルに再生中の曲名にする
			this.Text = iTrack.Name;

			// リストビューへ表示
			listView1.Items.Clear();	// 初期化
			listView1.Items.Add(new ListViewItem(new string[]{"Track.Name",            iTrack.Name}) );
			listView1.Items.Add(new ListViewItem(new string[]{"Track.Time",            iTrack.Time}) );
			listView1.Items.Add(new ListViewItem(new string[]{"Track.Duration(sec)",   iTrack.Duration.ToString()}) );
			listView1.Items.Add(new ListViewItem(new string[]{"Track.Album",           iTrack.Album}) );
			listView1.Items.Add(new ListViewItem(new string[]{"Track.Artist",          iTrack.Artist}) );
			listView1.Items.Add(new ListViewItem(new string[]{"Track.Genre",           iTrack.Genre}) );
			listView1.Items.Add(new ListViewItem(new string[]{"Track.SampleRate(Hz)",  iTrack.SampleRate.ToString()}) );
			listView1.Items.Add(new ListViewItem(new string[]{"Track.BitRate(bit)",    iTrack.BitRate.ToString()}) );
			listView1.Items.Add(new ListViewItem(new string[]{"Track.Kind",            iTrack.KindAsString}) );
			listView1.Items.Add(new ListViewItem(new string[]{"iTunesApp.SoundVolume", itunes.SoundVolume.ToString()}) );
			listView1.Items.Add(new ListViewItem(new string[]{"iTunesApp.Version",     itunes.Version}) );
		}

説明するまでもなく上のソースを見て頂ければ理解できると思いますが、

iTunesApp tunes = new iTunesAppClass();
IITTrack track = itunes.CurrentTrack;
if (track!=null)
{
	// トラックが選択されている時の処理を書く
}

これで、再生中のトラックオブジェクトが取得できますので後は煮るなり焼くなりして下さい。

注意

HRESULT _IiTunesEvents::OnPlayerPlayingTrackChangedEvent ( [in] VARIANT iTrack )
このイベントが紛らわしいです。再生中トラックが変わった(次の曲へ移動した)時に発生するのかと思いましたが全く違います、再生中の曲の情報(曲名など)が編集された時に発生します。
(This event is fired when the user changes information about the currently playing track (e.g. the name of the track).)
では再生トラックが変わった時をどうやって知るのかといいますと、STOP,PLAYイベントが連続して発生するだけです(それだけで十分ですね)。

Leave a Reply

preload preload preload