diff options
Diffstat (limited to 'Src/resources/skins/Winamp Modern/scripts/notifier.m')
-rw-r--r-- | Src/resources/skins/Winamp Modern/scripts/notifier.m | 615 |
1 files changed, 615 insertions, 0 deletions
diff --git a/Src/resources/skins/Winamp Modern/scripts/notifier.m b/Src/resources/skins/Winamp Modern/scripts/notifier.m new file mode 100644 index 00000000..4144add7 --- /dev/null +++ b/Src/resources/skins/Winamp Modern/scripts/notifier.m @@ -0,0 +1,615 @@ +#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 this +Global Timer fallbackTempFix; //BUGFIX remove this + +Global 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 below +String 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 later +fallbackTempFix.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)); +} |