| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615 | #include <lib/std.mi>#include "attribs.m"Function reset();Function createNotifier(boolean cancel);Function showNotifier(Int w);Function onNext();function cancelAnimation();Function Int fillNextTrackInfo(String corneroverride);Function Int fillCustomInfo(String customstring);Function prepareAlbumArtNotifier();Function checkPref(int bypassfs);Function String getArtist();Function onAlbumArt(Boolean success);Global Container notifier_container;Global Layout notifier_layout;Global Timer notifier_timer;Global String last_autotitle, cur_status;Global AlbumArtLayer cover; Global boolean handleAACalback = false;Global Boolean triggerBug; //BUGFIX remove thisGlobal Timer fallbackTempFix; //BUGFIX remove thisGlobal Boolean b_tohide = 0;Global int width = 0;Global int left = 0;#define WEBCOVER_SHOUTCAST "winamp.cover.shoutcast"#define FORCE_BUG_MODE // ------------------------------------------------------------------------------// init// ------------------------------------------------------------------------------System.onScriptLoaded() {	initAttribs();	notifier_timer = new Timer;	fallbackTempFix = new Timer; //BUGFIX remove this	fallbackTempFix.setDelay(3000); //BUGFIX remove this / Time that onAlbumArtLoaded have to execute before bug mode is ON }// ------------------------------------------------------------------------------// shutdown// ------------------------------------------------------------------------------System.onScriptUnloading() {	delete notifier_timer;	delete fallbackTempFix; //BUGFIX remove this}// ------------------------------------------------------------------------------// called by the system when the global hotkey for notification is pressed// ------------------------------------------------------------------------------System.onShowNotification() {	//if (checkPref(1)) return; --mp: if we push the hotkey, we want to show the notifier, no matter what the pref settings are.	createNotifier(false);	if (getStatus() == STATUS_PLAYING) cur_status = "Playing";	if (getStatus() == STATUS_PAUSED) cur_status = "Playback Paused";	if (getStatus() == STATUS_STOPPED) cur_status = "Playback Stopped";	prepareAlbumArtNotifier();	complete; // prevents other scripts from getting the message	return 1; // tells anybody else that might watch the returned value that, yes, we implemented that}// ------------------------------------------------------------------------------// called by the system when the title for the playing item changes, this could be the result of the player// going to the next track, or of an update in the track title// ------------------------------------------------------------------------------System.onTitleChange(String newtitle) {	if (last_autotitle == newtitle) return;	if (StrLeft(newtitle, 1) == "[") {	if (StrLeft(newtitle, 7) == "[Buffer" ||		StrLeft(newtitle, 4) == "[ICY") return;	}	last_autotitle = newtitle;	onNext();	fallbackTempFix.stop(); //BUGFIX remove later	fallbackTempFix.start(); //BUGFIX remove later}// ------------------------------------------------------------------------------// called by the system when the user clicks the next button// ------------------------------------------------------------------------------onNext() {	if (checkPref(0)) return;	createNotifier(false);	cur_status = "";	prepareAlbumArtNotifier();}// ------------------------------------------------------------------------------// called by the system when the user clicks the play button// ------------------------------------------------------------------------------System.onPlay() {	if (checkPref(0)) return;	createNotifier(false);	cur_status = "Playing";	prepareAlbumArtNotifier();}// ------------------------------------------------------------------------------// called by the system when the user clicks the pause button// ------------------------------------------------------------------------------System.onPause() {	if (checkPref(0)) return;	DebugString("onPause",9);	createNotifier(true);	showNotifier(fillCustomInfo("Playback Paused"));}// ------------------------------------------------------------------------------// called by the system when the user clicks the pause button again// ------------------------------------------------------------------------------System.onResume() {	if (checkPref(0)) return;	DebugString("onResume",9);	createNotifier(false);	cur_status = "Resuming Playback";	prepareAlbumArtNotifier();}// ------------------------------------------------------------------------------// called by the system when the user clicks the play button// ------------------------------------------------------------------------------System.onStop() {	if (checkPref(0)) return;	createNotifier(true);	showNotifier(fillCustomInfo("End of Playback"));}// ------------------------------------------------------------------------------// checks if we should display anything// ------------------------------------------------------------------------------Int checkPref(int bypassfs) {	if (!bypassfs && notifier_disablefullscreen_attrib.getData() == "1" && isVideoFullscreen()) return 1;	if (notifier_never_attrib.getData() == "1") return 1;	if (notifier_minimized_attrib.getData() == "1" && !isMinimized()) return 1;	if (notifier_windowshade_attrib.getData() == "1") {		if (isMinimized()) return 0;		Container c = getContainer("main");		if (!c) return 1;		Layout l = c.getCurLayout();		if (!l) return 1;		if (l.getId() != "shade") return 1;	}	return 0;}// ------------------------------------------------------------------------------// fade in/out completed// ------------------------------------------------------------------------------notifier_layout.onTargetReached() {	int a = notifier_layout.getAlpha();	if (a == 255) {		notifier_timer.setDelay(StringToInteger(notifier_holdtime_attrib.getData()));		notifier_timer.start();	}	else if (a == 0) {		reset();	}}// ------------------------------------------------------------------------------// hold time elapsed// ------------------------------------------------------------------------------notifier_timer.onTimer() {	stop();	if (notifier_layout.isTransparencySafe()) {		notifier_layout.setTargetA(0);		notifier_layout.setTargetSpeed(StringToInteger(notifier_fadeouttime_attrib.getData()) / 1000);		notifier_layout.gotoTarget();	} else {		reset();	}}// ------------------------------------------------------------------------------// when notifier is clicked, bring back the app from minimized state if its minimized and focus it// ------------------------------------------------------------------------------notifier_layout.onLeftButtonDown(int x, int y) {	cancelAnimation();	restoreApplication();	activateApplication();	/*if (notifier_opennowplaying_attrib.getData() == "1")	{		String artist = getArtist();		if (artist == "") return;		System.navigateUrlBrowser("http://client.winamp.com/nowplaying/artist/?icid=notifiermodern&artistName=" + artist);		}*/	reset();}notifier_layout.onRightButtonUp(int x, int y) {	cancelAnimation();	reset();	complete;	return;}//TODO merge w/ code belowString getArtist (){	String artist = getPlayItemMetaDataString("artist");	if (artist == "") artist = getPlayItemMetaDataString("uvox/artist");	if (artist == "") artist = getPlayItemMetaDataString("cbs/artist");	if (artist == "") artist = getPlayItemMetaDataString("streamtitle");	if (artist == "") artist = getPlayItemDisplayTitle();	return artist;}// ------------------------------------------------------------------------------// close the notifier window, destroys the container automatically because it's dynamic// ------------------------------------------------------------------------------reset() {	notifier_container.close();	notifier_container = NULL;	notifier_layout = NULL;	handleAACalback = FALSE;}// ------------------------------------------------------------------------------createNotifier(boolean cancel) {	if (notifier_container == NULL) {		notifier_container = newDynamicContainer("notifier");		if (!notifier_container) return; // reinstall duh!		if (isDesktopAlphaAvailable())			notifier_layout = notifier_container.getLayout("desktopalpha");		else			notifier_layout = notifier_container.getLayout("normal");		if (!notifier_layout) return; // reinstall twice, man	} else if (cancel) {		cancelAnimation();	}}cancelAnimation(){	notifier_layout.cancelTarget();	notifier_timer.stop();}// ------------------------------------------------------------------------------showNotifier(int w) {	w = w + 32;	Layout m = getContainer("main").getCurLayout();	int x = left = getViewportWidthFromGuiObject(m) + getViewportLeftFromGuiObject(m) - w - 2;	int y = getViewportHeightFromGuiObject(m) + getViewportTopFromGuiObject(m) - 80 - 2;	// show if not there or if already shown then lets resize on the fly (bento style)	if (!notifier_layout.isVisible()) {		notifier_layout.resize(x, y, w, 80);	}	else {		notifier_layout.resize(notifier_layout.getguiX(), y, notifier_layout.getGuiW(), 80);	}	if (notifier_layout.isTransparencySafe()) {		notifier_layout.show();		notifier_layout.setTargetA(255);		notifier_layout.setTargetX(x);		notifier_layout.setTargetY(y);		notifier_layout.setTargetW(w);		notifier_layout.setTargetH(80);		notifier_layout.setTargetSpeed(StringToInteger(notifier_fadeintime_attrib.getData()) / 1000);		notifier_layout.gotoTarget();	} else {		notifier_layout.setAlpha(255);		notifier_layout.show();		notifier_timer.setDelay(StringToInteger(notifier_holdtime_attrib.getData()));		notifier_timer.start();	}}// ------------------------------------------------------------------------------prepareAlbumArtNotifier(){	if (!notifier_layout) return;	Group g_albumart = notifier_layout.findObject("notifier.albumart");	DebugString("prepareAlbumArtNotifier: handleAACalback="+integerToString(handleAACalback), 9);	if (g_albumart)	{		cover = g_albumart.findObject("notifier.cover");		DebugString("prepareAlbumArtNotifier: cover.isLoading="+integerToString(cover.isLoading()), 9);		DebugString("prepareAlbumArtNotifier: cover.isInvalid="+integerToString(cover.isInvalid()), 9);		handleAACalback = true;		cover.refresh();	}}cover.onAlbumArtLoaded(boolean success){	/*	Created a seperate function for the code that was here because for some reason I couldn't force this	event (from the fallbackTempFix.onTimer) with cover.onAlbumArtLoaded(success) after the Winamp bug appears.	Weird, yes.	*/	FORCE_BUG_MODE onAlbumArt(success); }// ------------------------------------------------------------------------------Int fillNextTrackInfo(String corneroverride) {	Int maxv = 0;	Int stream = 0;	if (!notifier_layout) return 0;	Group g_text = notifier_layout.findObject("notifier.text");	Group g_albumart = notifier_layout.findObject("notifier.albumart");	Text plentry = g_text.findObject("plentry");	Text nexttrack = g_text.findObject("nexttrack");	Text _title = g_text.findObject("title");	Text album = g_text.findObject("album");	Text artist = g_text.findObject("artist");	Text endofplayback = notifier_layout.findObject("endofplayback");	DebugString("got callback for " + getPlayItemString(), 0);	// Get Stream Name - if no stream returns ""	string s = getPlayItemMetaDataString("streamname");	string stype = getPlayItemMetaDataString("streamtype"); //"streamtype" will return "2" for SHOUTcast and "5" for SHOUTcast 2	if (stype == "2" || stype == "5") stream = 1;	if (endofplayback) endofplayback.hide();	if (plentry)	{		plentry.setText(integerToString(getPlaylistIndex()+1)+translate(" of ")+integerToString(getPlaylistLength()));		plentry.show();	}	if (nexttrack) {		if (corneroverride == "") {			if (!stream) {				if (!isVideo())				{					nexttrack.setText("New track");				}				else				{					nexttrack.setText("New video");				}			}			else			{				nexttrack.setText("On air");			}		}		else		{			nexttrack.setText(corneroverride);		}		nexttrack.show();	}	string set_artist = "";	string set = "";	if (_title) {		String str;		if (!stream)		{			_title.setXmlParam("ticker", "0");			_title.setXmlParam("display", "");			str = getPlayitemMetaDataString("title"); 			if (str == "") str = getPlayitemDisplayTitle();			String l = getPlayItemMetaDataString("length");			if (l != "") {				str += " (" + integerToTime(stringtointeger(l)) + ")";			}			_title.setText(str);		}		else		{			if (str = getPlayItemMetaDataString("streamtitle") != "")			{				int v = strsearch(str, " - "); // We divide the string by a " - " sublimiter - no luck for old / wrong tagged stations				if (v > 0) {					set_artist = strleft (str, v); // Store artist					string str = strright (str, strlen(str) - 3 - v);					_title.setText(str);				}				else				{					_title.setXmlParam("ticker", "1"); // These titles can be _very_ long					_title.setText(str);				}			} else			{				_title.setXmlParam("ticker", "1");				_title.setXmlParam("display", "songtitle");				_title.setText("");			}		}		_title.show();	}	if (artist) {		if (!stream) {			if (isVideo())			{				artist.setText("");			}			else			{				artist.setText(getPlayitemMetaDataString("artist"));			}		}		else		{			// Perhaps we've stored the artist before?			if (set_artist != "")			{				artist.setText(set_artist);			}			// Then display the station name			else if (s != "")			{				artist.setText(s);			}			// So, we've had no luck - just display a static text :(			else			{				if (isVideo())				{					artist.setText("Internet TV"); 				}				else				{					artist.setText("Internet Radio");				}			}		}		artist.show();	}	if (album) { 		String str;		if (!stream && !isVideo()) {			album.setXmlParam("display", "");			str = getPlayitemMetaDataString("album");			String l = getPlayitemMetaDataString("track");			if (l != "" && l != "-1") str += " (" + translate("Track ") + l + ")";			album.setText(str);		}		else		{			album.setXmlParam("display", "");			// we have divided the songname - let's display the station name			if (set_artist != "" && s != "")			{				album.setText(s);			}			// no luck either...			else			{				album.setText("");				album.setXmlParam("display", "songinfo_localise");			}		}		album.show();	}	// Album Art Stuff	Layer webcover;	if (g_albumart)	{		cover = g_albumart.findObject("notifier.cover");		webcover = g_albumart.findObject("notifier.webcover");	}	Boolean showAlbumArt = FALSE;	if (cover != NULL && webcover != NULL && notifier_artworkinnotification_attrib.getData() == "1")	{		if (stream)		{			if(stype == "2" || stype == "5" && cover.isInvalid())			{				webcover.setXMLParam("image", WEBCOVER_SHOUTCAST);				cover.hide();				webcover.show();				showAlbumArt = TRUE;			}			else if(stype == "5" && !cover.isInvalid())			{				webcover.hide();				cover.show();				showAlbumArt = TRUE;			}		}		else		{			if (cover.isInvalid()) // Check if the album art obj shows a pic			{				showAlbumArt = FALSE;			}			else			{				webcover.hide();				cover.show();				showAlbumArt = TRUE;			}		}	}	if (showAlbumArt)	{		if (g_albumart) g_albumart.show();		if (g_text) g_text.setXmlParam("x", "75");		if (g_text) g_text.setXmlParam("w", "-95");	}	else	{		if (g_albumart) g_albumart.hide();		if (g_text) g_text.setXmlParam("x", "15");		if (g_text) g_text.setXmlParam("w", "-35");	}	if (g_text) g_text.show();	maxv = artist.getAutoWidth();	if (maxv < album.getAutoWidth()) maxv = album.getAutoWidth();	if (maxv < _title.getAutoWidth()) maxv = _title.getAutoWidth();	if (maxv < (nexttrack.getAutoWidth() + plentry.getAutoWidth() - 5) ) maxv = nexttrack.getAutoWidth() + plentry.getAutoWidth() - 5;	if (maxv < 128) maxv = 128;	Layout m = getContainer("main").getCurLayout();	if (maxv > getViewportWidthFromGuiObject(m)/4) maxv = getViewportWidthFromGuiObject(m)/4;	width = maxv;	return maxv + ( showAlbumArt * 91 );}// ------------------------------------------------------------------------------Int fillCustomInfo(String customtext){	Group p = notifier_layout;	Group g_text = p.findObject("notifier.text");	Group g_albumart = p.findObject("notifier.albumart");	Text plentry = p.findObject("plentry");	Text nexttrack = p.findObject("nexttrack");	Text _title = p.findObject("title");	Text album = p.findObject("album");	Text artist = p.findObject("artist");	Text endofplayback = p.findObject("endofplayback");	if (g_text) { g_text.hide(); }	if (g_albumart) g_albumart.hide();	if (plentry) { plentry.hide(); }	if (nexttrack) nexttrack.hide();	if (_title) { _title.hide(); }	if (artist) { artist.hide(); }	if (album) { album.hide(); }	if (endofplayback != NULL /*&& s_endofplayback  != NULL*/) {		endofplayback.setText(translate(customtext)+" ");		//s_endofplayback.setText(translate(customtext)+" ");		int aw = endofplayback.getAutoWidth();		endofplayback.show();		//s_endofplayback.show();		if (aw > 128)			return aw;	}	return 128;}//BUGFIX remove this timer laterfallbackTempFix.onTimer() //As soon as this timer runs, bug mode is ON ;){	if (checkPref(0)) return;	if (!notifier_layout) onNext();	if(!triggerBug)	{		triggerBug = true;		onAlbumArt(cover.isInvalid()); //First time we see the bug		fallbackTempFix.setDelay(30);				DebugString("Hello Bug", 9);	}	else if(triggerBug && !cover.isLoading()) onAlbumArt(cover.isInvalid());}onAlbumArt(Boolean success){	fallbackTempFix.stop(); //BUGFIX remove later	DebugString("onAlbumArtLoaded: success="+integerToString(success), 9);	DebugString("onAlbumArtLoaded: handleAACalback="+integerToString(handleAACalback), 9);	DebugString("onAlbumArtLoaded: cover.isLoading="+integerToString(cover.isLoading()), 9);	DebugString("onAlbumArtLoaded: cover.isInvalid="+integerToString(cover.isInvalid()), 9);	if (!handleAACalback || !notifier_layout /*|| isLoading()*/)	{		return;	}	handleAACalback = cover.isLoading();	cancelAnimation();	showNotifier(fillNextTrackInfo(cur_status));}
 |