winamp/Src/resources/skins/Winamp Modern/scripts/songinfo.m
2024-09-24 14:54:57 +02:00

165 lines
3.8 KiB
Objective-C

#include <lib/std.mi>
Function string tokenizeSongInfo(String tkn, String sinfo);
Function getSonginfo(String SongInfoString);
Function loadPlaylistArtWork();
Global Group frameGroup;
Global Layer channelDisplay;
Global Text bitrateText, FrequencyText;
Global Timer songInfoTimer;
Global String SongInfoString;
Global AlbumArtLayer waaa;
Global Int waaaRetries = 0;
System.onScriptLoaded(){
frameGroup = getScriptGroup();
bitrateText = frameGroup.findObject("Bitrate");
frequencyText = frameGroup.findObject("Frequency");
channelDisplay = frameGroup.findObject("channels");
songInfoTimer = new Timer;
songInfoTimer.setDelay(1000);
if (getStatus() == STATUS_PLAYING) {
String sit = getSongInfoText();
waaaRetries = 0;
if (sit != "") getSonginfo(sit);
else songInfoTimer.setDelay(50); // goes to 1000 once info is available
songInfoTimer.start();
} else if (getStatus() == STATUS_PAUSED) {
getSonginfo(getSongInfoText());
}
}
loadPlaylistArtWork()
{
Container albumart = System.getContainer("winamp.albumart");
if(albumart)
{
Layout aalayout = albumart.getLayout("normal");
if(aalayout)
{
waaa = aalayout.findObject("waaa");
}
}
}
System.onScriptUnloading(){
delete songInfoTimer;
}
System.onPlay(){
String sit = getSongInfoText();
waaaRetries = 0;
if (sit != "") getSonginfo(sit);
else songInfoTimer.setDelay(50); // goes to 1000 once info is available
songInfoTimer.start();
}
System.onStop(){
waaaRetries = 0;
songInfoTimer.stop();
frequencyText.setText("(__)");
bitrateText.setText("(___)");
channelDisplay.setXmlParam("image", "player.songinfo.none");
}
System.onResume(){
String sit = getSongInfoText();
if (sit != "") getSonginfo(sit);
else songInfoTimer.setDelay(50); // goes to 1000 once info is available
songInfoTimer.start();
}
System.onPause(){
songInfoTimer.stop();
}
songInfoTimer.onTimer(){
String sit = getSongInfoText();
if (sit == "") return;
songInfoTimer.setDelay(1000);
getSonginfo(sit);
if(!waaa) loadPlaylistArtWork();
if(waaa)
{
if(waaa.isInvalid() && waaaRetries < 5)
{
waaaRetries += 1;
waaa.refresh();
waaa.show();
}
else if(!waaa.isInvalid())
{
waaaRetries = 0;
}
}
}
String tokenizeSongInfo(String tkn, String sinfo){
int searchResult;
String rtn;
if (tkn=="Bitrate"){
for (int i = 0; i < 5; i++) {
rtn = getToken(sinfo, " ", i);
searchResult = strsearch(rtn, "kbps");
if (searchResult>0) return StrMid(rtn, 0, searchResult);
}
return "";
}
if (tkn=="Channels"){
for (int i = 0; i < 5; i++) {
rtn = getToken(sinfo, " ", i);
searchResult = strsearch(rtn, "tereo");
if (searchResult>0) return "stereo";
searchResult = strsearch(rtn, "ono");
if (searchResult>0) return "mono";
// Martin: surround > 3, stereo = 2,3
searchResult = strsearch(rtn, "annels");
if (searchResult>0)
{
int pos = strsearch(getSongInfoText(), "annels");
pos = stringToInteger(strmid(getSongInfoText(), pos - 4, 1));
if (pos > 3) return "surround";
if (pos > 1 && pos < 4) return "stereo";
else return "mono";
}
}
return "none";
}
if (tkn=="Frequency"){
for (int i = 0; i < 5; i++) {
rtn = getToken(sinfo, " ", i);
searchResult = strsearch(strlower(rtn), "khz");
if (searchResult>0) {
String r = StrMid(rtn, 0, searchResult);
int dot = StrSearch(r, ".");
if (dot == -1) dot = StrSearch(r, ",");
if (dot != -1) return StrMid(r, 0, dot);
return r;
}
}
return "";
}
else return "";
}
getSonginfo(String SongInfoString) {
String tkn;
tkn = tokenizeSongInfo("Bitrate", SongInfoString);
if(tkn != "") {bitrateText.setText("["+tkn+"]");}
tkn = tokenizeSongInfo("Channels", SongInfoString);
channelDisplay.setXmlParam("image", "player.songinfo." + tkn);
tkn = tokenizeSongInfo("Frequency", SongInfoString);
if(tkn != "") {frequencyText.setText("["+tkn+"]");}
}