f8g

iTunesで聴いてる曲のビデオをSkypeに表示

前の→ http://d.hatena.ne.jp/arikui/20061208/1165532299
Skypeのムードメッセージに動画を設定できるということを最近知ったので、iTunesで聴いてる曲をDailymotionから検索して表示するスクリプト。検索に引っかかった1番目を表示させてるので、確実に聴いてる曲の動画だとはいえませんが。
使い方は前のとほとんど同じ。1行目のuser_nameはSkypeのやつです。ウィンドウが気にならなければwscriptじゃなくてcscriptで実行してもいいんじゃなかろうか。
残念ながら、動画のサムネイルは変化しません。変更させ方が分かりません。見た目あんまり格好よくない。

data:text/plain;base64,dmFyIHVzZXJfbmFtZSAgID0gInVzZXJuYW1lIjsNCnZhciBzYXZlRGlyICAgICA9ICJjOlxcaXR1bmVzIjsNCnZhciBkZWZhdWx0RmlsZSA9ICJDOlxcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xcTkFNRVxcTXkgRG9jdW1lbnRzXFxNeSBTa3lwZSBQaWN0dXJlc1xcU2t5cGUucG5nIjsNCg0KdmFyIHZpZGVvX2RhdGEgPSB7DQoJdHlwZSAgIDogInZpZGVvIiwNCglwYXJ0bmVyOiAiZGFpbHltb3Rpb24iLA0KCXRodW1iICA6ICJwcm9maWxlOi8vIiArIHVzZXJfbmFtZSArICIvbW9vZG1lZGlhL3RodW1iIiwNCglhbHQgICAgOiAiIiwNCgl0aXRsZSAgOiAiIg0KfTsNCg0KdmFyIHNreXBlID0gV1NILkNyZWF0ZU9iamVjdCgiU2t5cGU0Q29tLlNreXBlIik7DQp2YXIgaXQgICAgPSBXU0guQ3JlYXRlT2JqZWN0KCJpVHVuZXMuQXBwbGljYXRpb24iLCAiSVRFdmVudF8iKTsNCg0Kd2hpbGUodHJ1ZSl7DQoJV1NjcmlwdC5TbGVlcCgxMDAwKTsNCn0NCg0KLyoqKioqIEV2ZW50ICoqKioqLw0KZnVuY3Rpb24gSVRFdmVudF9PblBsYXllclBsYXlFdmVudCh0cmFjayl7DQoJdmFyIHRyYWNrX2luZm8gPSBbdHJhY2suTmFtZSwgdHJhY2suQXJ0aXN0XTsNCgl2YXIgcHJvZmlsZSAgICA9IHNreXBlLkN1cnJlbnRVc2VyUHJvZmlsZTsNCgl2YXIgdXJsICAgICAgICA9ICJodHRwOi8vd3d3LmRhaWx5bW90aW9uLmNvbS9yc3MvcmVsZXZhbmNlL3NlYXJjaC8iICsgZW5jb2RlVVJJQ29tcG9uZW50KHRyYWNrX2luZm8uam9pbigiICIpKSArICIvMSI7Ow0KCXZhciBpdGVtICAgICAgID0gZ2V0SXRlbSggZ2V0RmVlZCh1cmwpICk7DQoNCgljaGFuZ2VBdmF0YXIodHJhY2ssIHNhdmVEaXIpOw0KDQoJaWYoIWl0ZW0pew0KCQlwcm9maWxlLk1vb2RUZXh0ID0gdHJhY2tfaW5mby5qb2luKCIgLyAiKTsNCgl9DQoJZWxzZXsNCgkJZXh0ZW5kKHZpZGVvX2RhdGEsIGl0ZW0pOw0KCQlwcm9maWxlLlJpY2hNb29kVGV4dCA9IEVsZW1lbnQoIm1lZGlhIiwgdmlkZW9fZGF0YSkgKyB2aWRlb19kYXRhLnRpdGxlOw0KCX0NCg0KCVdTSC5FY2hvKCB0cmFja19pbmZvLmpvaW4oIiAvICIpICk7DQp9DQoNCmZ1bmN0aW9uIElURXZlbnRfT25BYm91dFRvUHJvbXB0VXNlclRvUXVpdEV2ZW50KCl7DQoJV1NILkVjaG8oIkFib3V0VG9Qcm9tcHRVc2VyVG9RdWl0RXZlbnQiKTsNCglXU2NyaXB0LlF1aXQoKTsNCglpdC5RdWl0KCk7DQp9DQoNCmZ1bmN0aW9uIElURXZlbnRfT25RdWl0dGluZ0V2ZW50KCl7DQoJcHJpbnQoIlF1aXR0aW5nRXZlbnQiKTsNCglXU2NyaXB0LlF1aXQoKTsNCglpdC5RdWl0KCk7DQp9DQoNCi8qKioqKioqKioqLw0KZnVuY3Rpb24gZXh0ZW5kKG8sIG0pew0KCWZvcih2YXIgeCBpbiBtKXsNCgkJb1t4XSA9IG1beF07DQoJfQ0KfQ0KDQpmdW5jdGlvbiBFbGVtZW50KHRhZywgYXR0cmlidXRlcywgY2hpbGRyZW4pew0KCWNoaWxkcmVuID0gY2hpbGRyZW4gfHwgW107DQoJdmFyIGRhdGEgPSBbXTsNCglmb3IodmFyIHggaW4gYXR0cmlidXRlcyl7DQoJCWRhdGEucHVzaCh4ICsgIj1cIiIgKyBhdHRyaWJ1dGVzW3hdICsgIlwiIik7DQoJfQ0KCXJldHVybiAiPCIgKyB0YWcgKyAiICIgKyBkYXRhLmpvaW4oIiAiKSArICI+IiArIGNoaWxkcmVuLmpvaW4oIiIpICsgIjwvIiArIHRhZyArICI+IjsNCn0NCg0KZnVuY3Rpb24gZ2V0RmVlZCh1cmwpew0KCXZhciB4bWxodHRwID0gV1NILkNyZWF0ZU9iamVjdCgiTVNYTUwyLlhNTEhUVFAiKTsNCgl4bWxodHRwLm9wZW4oIkdFVCIsIHVybCwgZmFsc2UpOw0KCXhtbGh0dHAuc2VuZCgpOw0KCXJldHVybiB4bWxodHRwLnJlc3BvbnNlVGV4dDsNCn0NCg0KZnVuY3Rpb24gZ2V0SXRlbShYTUxTdHJpbmcpew0KCXZhciBkb2N1bWVudCA9IFdTSC5DcmVhdGVPYmplY3QoIk1TWE1MMi5ET01Eb2N1bWVudCIpOw0KDQoJZG9jdW1lbnQubG9hZFhNTChYTUxTdHJpbmcpOw0KCWRvY3VtZW50LnNldFByb3BlcnR5KCJTZWxlY3Rpb25MYW5ndWFnZSIsICJYUGF0aCIpOw0KDQoJaWYoIWRvY3VtZW50LnNlbGVjdE5vZGVzKCIvL2l0ZW0iKS5sZW5ndGgpew0KLy8JCVdTSC5FY2hvKCJub3QgZm91bmQiKTsNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCXZhciBpdGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIml0ZW0iKVswXTsNCg0KCXJldHVybiB7DQoJCXRpdGxlICAgIDogaXRlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGl0bGUiKVswXS50ZXh0LA0KCQl1cmkgICAgICA6IGl0ZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1lZGlhOmNvbnRlbnQiKVswXS5nZXRBdHRyaWJ1dGUoInVybCIpLA0KCQltb3JlX2luZm86IGl0ZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImd1aWQiKVswXS50ZXh0DQoJfTsNCn0NCg0KZnVuY3Rpb24gY2hhbmdlQXZhdGFyKHRyYWNrLCBwYXRoKXsNCglpZih0cmFjay5BcnR3b3JrLkNvdW50IDw9IDApew0KCQlza3lwZS5TZXR0aW5ncy5BdmF0YXIgPSBkZWZhdWx0RmlsZTsNCgkJcmV0dXJuOw0KCX0NCg0KCXZhciBmb3JtYXQgPSBpbWdGb3JtYXQodHJhY2suQXJ0d29yay5JdGVtKDEpLkZvcm1hdCk7DQoNCglpZighZm9ybWF0KXsNCgkJc2t5cGUuU2V0dGluZ3MuQXZhdGFyID0gZGVmYXVsdEZpbGU7DQoJCXJldHVybjsNCgl9DQoNCgl2YXIgZmlsZSA9IHBhdGggKyAiXFxhcnR3b3JrLiIgKyBmb3JtYXQ7DQoJdHJhY2suQXJ0d29yay5JdGVtKDEpLlNhdmVBcnR3b3JrVG9GaWxlKGZpbGUpOw0KCXNreXBlLlNldHRpbmdzLkF2YXRhciA9IGZpbGU7DQp9DQoNCmZ1bmN0aW9uIGltZ0Zvcm1hdChuKXsNCglzd2l0Y2gobil7DQoJCWNhc2UgMTogIHJldHVybiAianBnIjsNCgkJY2FzZSAyOiAgcmV0dXJuICJwbmciOw0KCQljYXNlIDM6ICByZXR1cm4gImJtcCI7DQoJCWRlZmF1bHQ6IHJldHVybiBmYWxzZTsNCgl9DQp9DQo=
var user_name   = "username";
var saveDir     = "c:\\itunes";
var defaultFile = "C:\\Documents and Settings\\NAME\\My Documents\\My Skype Pictures\\Skype.png";

var video_data = {
	type   : "video",
	partner: "dailymotion",
	thumb  : "profile://" + user_name + "/moodmedia/thumb",
	alt    : "",
	title  : ""
};

var skype = WSH.CreateObject("Skype4Com.Skype");
var it    = WSH.CreateObject("iTunes.Application", "ITEvent_");

while(true){
	WScript.Sleep(1000);
}

/***** Event *****/
function ITEvent_OnPlayerPlayEvent(track){
	var track_info = [track.Name, track.Artist];
	var profile    = skype.CurrentUserProfile;
	var url        = "http://www.dailymotion.com/rss/relevance/search/" + encodeURIComponent(track_info.join(" ")) + "/1";;
	var item       = getItem( getFeed(url) );

	changeAvatar(track, saveDir);

	if(!item){
		profile.MoodText = track_info.join(" / ");
	}
	else{
		extend(video_data, item);
		profile.RichMoodText = Element("media", video_data) + video_data.title;
	}

	WSH.Echo( track_info.join(" / ") );
}

function ITEvent_OnAboutToPromptUserToQuitEvent(){
	WSH.Echo("AboutToPromptUserToQuitEvent");
	WScript.Quit();
	it.Quit();
}

function ITEvent_OnQuittingEvent(){
	print("QuittingEvent");
	WScript.Quit();
	it.Quit();
}

/**********/
function extend(o, m){
	for(var x in m){
		o[x] = m[x];
	}
}

function Element(tag, attributes, children){
	children = children || [];
	var data = [];
	for(var x in attributes){
		data.push(x + "=\"" + attributes[x] + "\"");
	}
	return "<" + tag + " " + data.join(" ") + ">" + children.join("") + "</" + tag + ">";
}

function getFeed(url){
	var xmlhttp = WSH.CreateObject("MSXML2.XMLHTTP");
	xmlhttp.open("GET", url, false);
	xmlhttp.send();
	return xmlhttp.responseText;
}

function getItem(XMLString){
	var document = WSH.CreateObject("MSXML2.DOMDocument");

	document.loadXML(XMLString);
	document.setProperty("SelectionLanguage", "XPath");

	if(!document.selectNodes("//item").length){
//		WSH.Echo("not found");
		return false;
	}

	var item = document.getElementsByTagName("item")[0];

	return {
		title    : item.getElementsByTagName("title")[0].text,
		uri      : item.getElementsByTagName("media:content")[0].getAttribute("url"),
		more_info: item.getElementsByTagName("guid")[0].text
	};
}

function changeAvatar(track, path){
	if(track.Artwork.Count <= 0){
		skype.Settings.Avatar = defaultFile;
		return;
	}

	var format = imgFormat(track.Artwork.Item(1).Format);

	if(!format){
		skype.Settings.Avatar = defaultFile;
		return;
	}

	var file = path + "\\artwork." + format;
	track.Artwork.Item(1).SaveArtworkToFile(file);
	skype.Settings.Avatar = file;
}

function imgFormat(n){
	switch(n){
		case 1:  return "jpg";
		case 2:  return "png";
		case 3:  return "bmp";
		default: return false;
	}
}

なんか、responseTextをDOMDocumentにロードさせてるあたり回りくどかったり、中途半端にXPath使ったりしてる。
以前との違いは、Profile.MoodTextがProfile.RichMoodTextになってること。RichMoodTextでは、i,u,b,fontなどのHTML要素が使えるしリンクもできる。動画を貼り付けるのはmediaって要素らしい。リファレンスがどこにあるのか分からん。