mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-12-04 19:37:53 +01:00
616 lines
18 KiB
Objective-C
616 lines
18 KiB
Objective-C
#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));
|
|
}
|