iTunesスクリプト 曲をライブラリから削除する

曲をライブラリから削除する

人の手でiTunesライブラリから曲を削除するのは簡単だ。しかしiTunes COM for Windowsスクリプトで、曲をライブラリから削除する操作はやっかいである。この操作にはIITTrackクラスのDelete()メソッドを利用するのだが、公式のドキュメントには以下のような記述がある。

Note that if a track is deleted from a source's primary playlist, it will be deleted from all playlist's in that source.

https://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/301/wo/

source's primary playlistというのは、ライブラリ全体のことである。つまりライブラリ全体(source's primary playlist)から曲をDelete()メソッドで削除した場合、普通のプレイリストからもこの曲が削除される。逆をいいかえせば、普通プレイリストからDelete()メソッドで曲を削除した場合は、ライブラリからは曲は削除されないのだ。

きちんとライブラリ全体から曲を削除する

今回この操作を楽にするために、指定した曲をライブラリから削除するための関数を作った。removeFromLibrary()というメソッドに引数としてIITTrackを渡せば、ライブラリから削除してくれる。もう少し具体的に説明すると、指定した曲名をヒントに、ライブラリ全体から検索をかける。同じ曲名はいくつかヒットするはずなので、その中からさらにファイルパスが同じ曲を検索する。そしてファイルパスが同じ曲が見つかったら削除するという手順である。ちなみにこのスクリプトはライブラリ上から曲を削除してくれるものであって、実在する音楽ファイルを削除してくれるものではない。

/*
 * あるプレイリストに含まれる曲をライブラリ上から削除する
 */

var iTunesApp = new ActiveXObject("iTunes.Application");
var playlist = iTunesApp.LibrarySource.Playlists.ItemByName("削除するファイル");//対象となるプレイリストの名前

if (playlist) {
	var numTracks = playlist.Tracks.Count;//プレイリスト中の曲数
	var track;
	var count = 0;	
	while( playlist.Tracks.Count > 0){ //一曲でも残ってたらループ
		track = playlist.Tracks(1);
		
		removeFromLibrary(track); //ライブラリから削除		
		count++;
	}
	WScript.Echo(count + "件削除しました。");
}

/*
 * 指定した曲をライブラリから削除 
 */
function removeFromLibrary(target){
	//指定した曲をライブラリから探す必要がある
	//まずはライブラリからtargetの曲と同じ曲名を検索
	if(target && target.Name != ""){
		var	trackCollection = iTunesApp.LibraryPlaylist.Search(target.Name,0); //return IITTrackCollection
	
		var	count = trackCollection.Count;
		while (count != 0){
			var track = trackCollection.Item(count);
			//ファイルパスが同じなら、指定した曲と同じ曲
			if(target.Location == track.Location){
				track.Delete(); //削除
				return;
			}		
			count--;
		}
		return 0;
	}
}

関連

WHS入門を参考にさせていただきました。