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 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));
- }
|