foobar2000 auf Deutsch

foobar2000 => Customize => Thema gestartet von: TomPro in 16. Juni 2009, 19:24:54

Titel: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: TomPro in 16. Juni 2009, 19:24:54
[CUI]

So, meine ersten Gehversuche mit der, für mich, neuen Version von f2k, sind nun schon ein wenig vorangeschritten. Ich konnte viel Anregungen und Codeschnipsel hier aus dem Forum gewinnen und möchte nun deswegen auch den ersten Tribut zollen.

Die grobe Anordnung der einzelnen Module ist nun nach langem hin und her wohl das was am Ende auch Final erhalten bleibt. Einige Funktionsweisen und Ideen dahinter sind aber noch nicht verwirklicht.

Hier ein Screnshot der Oberfläche:
-

Oben links arbeitet ein "Channel Spectrum Panel" und daneben vier "WSH Panel Mod's", alle 5 Module in einem "Panel Stack Splitter". Das erste "WSH Panel Mod" visualisiert den Rating Tag mittels $meta(rating) (fertig), wohingegen das dritte ein Rating anhand der Spielhäufigkeit anzeigen soll (noch nicht fertig). Ob die Ovale bleiben oder noch den üblichen Sternen weichen müssen weiß ich jetzt noch nicht, auch bin ich mit mir noch nicht im Konsens ob die linke Rating-Anzeige sensitiv (Button's zum TAG-schreiben) sein soll.

Ganz rechts außen ist dann noch eine Volume-Seek-Bar mit logarithmischer Kennlinie.


//----------------------------------------------------------------------------
//--- 1stStrike Volumebar (by TomPro)
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
//------ Global
//--------- Window
var ww = window.Width;
var wh = window.Height;
var ImgBg = fb.FoobarPath + "1stStrike\\Back\\Volume.png" // Path and Name of Background Image
//--------- Set Color
function RGB(r,g,b){ return (0xff000000|(r<<16)|(g<<8)|(b)); }
function RGBA(r,g,b,a){ return ((a<<24)|(r<<16)|(g<<8)|(b)); }
//----------------------------------------------------------------------------
//------ Text Options
//--------- Font
// format : x = gdi.Font("FontName", ptSize, F_Style);
var F_Style = 0;
var F_Bold = 1;
var F_Italic = 2;
var F_Underline = 4;
var F_Strikeout = 8;
//--------- Format
//------------ Align
var align_top = 0; var align_middle = 1; var align_bottom = 2;
var align_left = 0; var align_center = 1; var align_right = 2;
//------------ Trim
var trim_no = 0; var trim_chara = 1; var trim_word =2;
var trim_elips_path = 5; var trim_elips_chara = 3; var trim_elips_word =4;
//------------ Flag
var flag_rtl =0x0001;
var flag_vert =0x0002;
var flag_nofit =0x0004;
var flag_dispctrl =0x0020;
var flag_nofallback =0x0400;
var flag_trailspace =0x0800;
var flag_nowrap =0x1000;
var flag_linelimit =0x2000;
var flag_noclip =0x4000;
//------------ Set String Format
function StrFmt(alignH,alignV,trim,flag){
return ((alignH<<28)|(alignV<<24)|(trim<<20)|flag);
}
//----------------------------------------------------------------------------
//------ Volumebar
//--------- Background Image
var BgImg = gdi.Image(ImgBg);
//--------- String Format
var StrFmt_Vol = StrFmt(align_center, align_bottom, trim_no, flag_nowrap | flag_noclip);
//--------- String Color
var StrCo_Vol = RGB(255,255,096);
var StrCo_dB = RGB(160,160,000);
//--------- String Font
var StrFo_Vol = gdi.Font("Arial", 8, F_Style + F_Bold);
var StrFo_dB = gdi.Font("Arial", 9, F_Style + F_Bold);
//--------- Text
var txt_Vol = (Math.ceil(volume));
var txt_dB = ("dB");
//--------- Variable
var volume = fb.Volume;
var pos = wh * (1 - vol2pos(volume));
//--------- Transform lin to log Curve
function pos2vol(p) {
// Input 0 <= pos <= 1
// return a value value: -100 <= vol <= 0
p = (p<=0) ? 0.01 : (p<1) ? p : 1;
return (Math.log(p) * 50 / Math.LN10);
};
//--------- Transform log to lin Curve
function vol2pos(v){
// Input -100 <= vol <= 0
// return a value value: 0 <= pos <= 1
v = (v<=-100) ? -100 : (v<0) ? v : 0;
return (Math.pow(Math.E,(v * Math.LN10 / 50)))
}
//--------- Paint Volumebar
function on_paint(gr){
gr.SetTextRenderingHint(5);
ww = window.Width;
wh = window.Height;
volume = fb.Volume;
pos = wh * (1 - vol2pos(volume));
txt_Vol = (Math.ceil(volume));
gr.DrawImage( BgImg, 0, 0, ww, wh, 0, 0, BgImg.Width, BgImg.Height);
gr.FillSolidRect( 0,        0, ww, pos, RGBA(016,016,024,160));
gr.FillSolidRect( 0, pos-1, ww,     3, RGBA(255,000,255,192));
gr.DrawString( txt_Vol, StrFo_Vol, StrCo_Vol, 0, 0, ww, wh-12, StrFmt_Vol);
gr.DrawString(  txt_dB,  StrFo_dB, StrCo_dB, 0, 0, ww, wh-02, StrFmt_Vol);
}
//----------------------------------------------------------------------------
//------ Mouse
var g_drag = 0;
function on_mouse_lbtn_down(x,y){
g_drag = 1;
}
function on_mouse_lbtn_up(x,y){
on_mouse_move(x,y);
g_drag = 0;
}
function on_mouse_move(x,y){
if(g_drag){
var v = 1 - (y / wh);
v = (v<0) ? 0 : (v<1) ? v : 1;
v = pos2vol(v)
if(fb.Volume != v)
fb.Volume = v;
}
}
function on_mouse_wheel(delta){
if(delta>0)
fb.VolumeUp();
else
fb.VolumeDown();
}
//----------------------------------------------------------------------------
//------ Volume
function on_volume_change(val){
window.Repaint();
}
//EOF


In der Mitte, und mit abstand den meisten Platz einnehmend, ist nun die "Info & Seek Bar" die eine Menge Zusatzfunktionen bereithält und um die es mir hier in diesem "Faden" geht.


Als erstes muss ich voranschicken, das ich einige selbstdefinierte TAGS in meiner Sammlung nutze die sich in den letzten Jahren als NÖTIG oder ANGENEM erwiesen haben. Der älteste dieser TAG's  ist %INTRO%. Da ich über das Nutzen von Karaoke-Files zu f2k gekommen bin suchte ich nach einem Weg bei einigen Playbacks mit schwierigem Anfang einen Optischen Cue zu generieren wo der Gesang anfängt. Auch sind hier bei uns im Funkhaus alle Musikdateien mit einer Intro-Information versehen um dem Moderator den sogenannten Ramptalk zu erleichtern.

Auf diesem Weg würde ich nun auch gleich für die aufnahmen des %INTRO% TAGs als Standard-TAG plädieren.

Die weiteren TAGs die hier noch zum Einsatz kommen sind:

%PRETITLE%, %PRENUMBER%, %SUBTITLES% und %SUBTIMES%

Und die Standard-TAGs

%ARTIST%, %PERFORMER%, %ALBUM ARTIST% und %FEATURING%

Sowie

%TITLE% und %TITLEVERSION%.

Die beiden TAGs %PRETITLE% und %PRENUMBER% nutze ich wenn ein Musikalisches Werk über mehrere Tracknummern verteilt ist, Beispiel:

"The Fall Of The House Of Usher" von "The Alan Parsons Project" auf der CD "Tales Of Mystery And Imagination Edgar Allan Poe" Track 6 bis 10

%PRETITLE% bei den 5 Tracks = The Fall Of The House Of Usher
%TRACKNUMBER% = 6 / %PRENUMBER% = 1 / %TITLE% = Prelude
%TRACKNUMBER% = 7 / %PRENUMBER% = 2 / %TITLE% = Arrival
%TRACKNUMBER% = 8 / %PRENUMBER% = 3 / %TITLE% = Intermezzo
%TRACKNUMBER% = 9 / %PRENUMBER% = 4 / %TITLE% = Pavane
%TRACKNUMBER% = 10 / %PRENUMBER% = 5 / %TITLE% = Fall

Wohingegen die TAGs %SUBTITLES% und %SUBTIMES% dort Verwendung finden, wo z.B. in einem einzigen Audiofile mehrere Tracks vorhanden sind (Imagefils oder auch bei Medleys) oder ein größeres Musikalische Werk zwar Unterwerke aufweist, diese aber nicht einzelnen Tracks zugeordnet sind. Beispiel:

"Beatles Medley" von "Stars On 45"

%SUBTITLES% = Stars On 45; Venus; Sugar Sugar; No Reply; I'll Be Back; Drive My Car; A Hard Days Night; Do You Want To Know A Secret; We Can Work It Out; I Should Have Known Better; Nowhere Man; You're Going To Lose That Girl

%SUBTIMES% = 43; 51; 91; 107; 133; 164; 192; 208; 227; 235; 250

Da der erste Titel ja bei 0:00 Anfängt gibt es natürlich eine Subtime weniger wie es Subtitles gibt, und, das hätte ich beinahe noch vergessen, sowohl %INTRO% als auch %SUBTIMES% werden in Sekunden angegeben (macht das Rechnen und Formatieren einfacher).

Auf dem Screnshot oben sieht man nun, neben Artist- und Titel-Informationen, einen dunkelgrünen, hellgrünen und gelben Fortschrittsbalken. Der dunkelgrüne Balken steht für die Visualisierung des Intros und der hellgrüne für die Tracklänge. Der kleine gelbe Balken symbolisiert die Länge des entsprechenden Subtitles. Sowohl der gelbe als auch der hellgrüne Balken können durch "anfassen" mit der Maus bewegt werden und die Musik spielt dort weiter wo die Maus "losgelassen" wird.

-

Hier zeigt der von links wieder kleiner werdende Balken die Outro Zeit an. Diese ist willkürlich von mir auf 15 Sec bei Titeln länger 15 Sec gesetzt worden. Bei Titeln kürzer 15 beträgt die Outro Zeit die Hälfte des Titels.

-

Hier sehen wir das beim Titel "A Change Of Seasons" ein weitere Subtitle abgespielt wird. Die Zeitanzeige am unteren Rand bezieht sich immer auf den Subtitle. Sollten zwar Subtitles jedoch keine Subtimes "getagt" sein, so giebt es natürlich keinen gelben Balken und keine Zeitanzeige, woher auch. Des weiteren werden dann auch nicht die Namen der Subtitles  angezeigt, sondern nur die Anzahl der Takes.

-

Ein weiterer Subtitel aber die beiden roten Balken Signalisieren, das der Player auf PAUSE ist.

-

Hier sieht man nun, das der komplette Track bald zu Ende ist, auch auf Trackebene ist die gleiche Outrozeitberechnung wie bei den Subtitles integriert.

-

Hier jetzt ein Normaler Titel ohne Subtitles.

-

Und zum Schluss noch die Anzeige von %PRETITLE% und %PRENUMBER%.

Auf dem ersten Bild oben sieht man rechts unten neben den Laufwerksfunktionen noch die Bedieneinheit SUBTRACKS. Wenn keine Subtracks vorhanden sind ist nur der mittlere Button zu sehen mit dem Hinweistext "No Subtracks". Beim Vorhandensein von Tubtimes-Informationen kommen hier je nach Möglichkeit ein Play Next bzw, Play Previous Button zum Vorschein und der mittlere Butten zeigt an der wievielte Track von wie vielen gerade gespielt wird. Auch kann man hier eine Liste aufrufen mit den Titeln und Zeiten der einzelnen Tracks um dann einen direkt anzuspringen zu können.

Vielleicht kann ja der ein oder andere damit was anfangen, oder aber entdeckt noch einen Fehler, denn dies waren meine ersten Gehversuche in JScript, der Code ist im nächsten Beitrag, da dieser sonst zu lang ist.

Viel spass wünscht TomPro

Fehlerhafte Links entfernt - tedgo
Titel: Re: Die etwas andere Seek Bar (WSH Panel Mod)
Beitrag von: TomPro in 16. Juni 2009, 19:25:16
[CUI]

Hier nun der Code:


//----------------------------------------------------------------------------
//--- 1stStrike Info & Seek Bar (by TomPro)
//----------------------------------------------------------------------------

//----------------------------------------------------------------------------
//------ Global
//--------- Window
var ww = window.Width;
var wh = window.Height;

//--------- Set Color
function RGB(r,g,b){ return (0xff000000|(r<<16)|(g<<8)|(b)); }
function RGBA(r,g,b,a){ return ((a<<24)|(r<<16)|(g<<8)|(b)); }

//--------- Format Time String
function TimeFmt(t){
var zpad = function(n){
var str = n.toString();
return (str.length<2) ? "0"+str : str;
}
var h = Math.floor(t/3600); t-=h*3600;
var m = Math.floor(t/60); t-=m*60;
var s = Math.floor(t);
if(h>0) return h.toString()+":"+zpad(m)+":"+zpad(s);
return m.toString()+":"+zpad(s);
}

//----------------------------------------------------------------------------
//------ Text Options

//--------- Font
// format : x = gdi.Font("FontName", ptSize, FStyle.Style);
var FStyle = { Normal: 0, Bold: 1, Italic: 2, Underline: 4, Strikeout: 8 }

//--------- String Format
//------------ Align
var HAlign = { Left: 0, Center: 1, Right: 2 }
var VAlign = { Top: 0, Middle: 1, Bottom: 2 }

//------------ Trim
var Trim = { No: 0, Chara: 1, Word: 2, ElipsChara: 3, ElipsWord: 4, ElipsPath: 5 }

//------------ Flag
var Flag = {
Rtl: 0x0001,
Vert: 0x0002,
Nofit : 0x0004,
Dispctrl: 0x0020,
Nofallback: 0x0400,
Trailspace: 0x0800,
Nowrap: 0x1000,
Linelimit: 0x2000,
Noclip: 0x4000
}

//------------ Set String Format
function StrFmt(alignH,alignV,trim,flag){ return ((alignH<<28)|(alignV<<24)|(trim<<20)|flag); }

//----------------------------------------------------------------------------
//------ Seekbar
//--------- Strings
//------------ Font
var g_font_Artist = gdi.Font("Zurich Ex BT", 12, FStyle.Bold);
var g_font_Title = gdi.Font("Arial", 24, FStyle.Bold);
var g_font_Time = gdi.Font("Arial", 10, FStyle.Bold);

//------------ Colors
var c_Artist = RGB(255,255,255);
var c_Title = RGB(255,128,128);
var c_Time = RGB(255,255,096);

//------------ Formats
var StrFmt_Artist = StrFmt(HAlign.Center, VAlign.Top, Trim.No, Flag.Nowrap);
var StrFmt_Title = StrFmt(HAlign.Center, VAlign.Middle, Trim.No, Flag.Nowrap);
var StrFmt_Time = StrFmt(HAlign.Center, VAlign.Bottom, Trim.No, Flag.Nowrap);

//------------ Get Strings
var txt_Artist = fb.TitleFormat("$if3($meta_sep(artist,', ',' & '),$meta_sep(performer,', ',' & '),$meta_sep(album artist,', ',' & '),'No ARTIST')$if(%featuring%,' feat. '%featuring%,)");
var txt_Title;
var txt_TitleA = fb.TitleFormat("$if(%pretitle%,%pretitle%': '$char(10),)");
var txt_TitleB = fb.TitleFormat("$if(%prenumber%,%prenumber%' - ',)$if2(%title%,'File : '%filename%)$if(%titleversion%,' ('%titleversion%') ',)");
var txt_TitleC;

//--------- Times
//var g_pb_length = fb.TitleFormat("%length%");
//var g_pb_length_sec = fb.TitleFormat("%length_seconds%");
var g_pb_length_intro = fb.TitleFormat("$ifgreater(%intro%,0,%intro%,0)");
var g_pb_length_outro = fb.TitleFormat("$ifgreater(%length_seconds%,15,15,$div(%length_seconds%,2))");

//var g_pb_time = fb.TitleFormat("%playback_time%");
//var g_pb_time_sec = fb.TitleFormat("%playback_time_seconds%");
//var g_pb_time_rem = fb.TitleFormat("%playback_time_remaining%");
//var g_pb_time_rem_sec = fb.TitleFormat("%playback_time_remaining_seconds%");
var g_pb_time_intro = fb.TitleFormat("$ifgreater($sub($ifgreater(%intro%,0,%intro%,0),%playback_time_seconds%),0,$sub($ifgreater(%intro%,0,%intro%,0),%playback_time_seconds%),0)");
var g_pb_time_outro = fb.TitleFormat("$ifgreater($sub(%playback_time_remaining_seconds%,$ifgreater(%length_seconds%,15,15,$div(%length_seconds%,2))),0,$ifgreater(%length_seconds%,15,15,$div(%length_seconds%,2)),%playback_time_remaining_seconds%)");

//------------ Get Times
var pos, intro, outro, length, now;
var txt_Time,txt_TimeI,txt_TimeO;

var g_drag = 0;
var g_drag_seek = 0;

function GetTimes(){
ww = window.Width;
wh = window.Height;
length = fb.PlaybackLength;
now = fb.PlaybackTime;

pos = 0; intro = 0; outro = 0;
txt_Time = ""; txt_TimeI = ""; txt_TimeO = "";

if(length > 0) {
if(g_drag) {
if(g_drag == 1) {
pos = ww * g_drag_seek;
txt_Time = "<   <<   <<<        " + TimeFmt(g_drag_seek * length);
txt_Time += "  |  " + TimeFmt(length) + "  |  ";
txt_Time += TimeFmt(length - (g_drag_seek * length)) + "        >>>   >>   >";
} else {
SubPos = ww * g_drag_seek;
}

} else {
pos = ww * (now / length);
outro = ww * ( 1 - (g_pb_time_outro.eval() / g_pb_length_outro.eval()));
if(g_pb_length_intro.eval()==0) {
intro = ww * 1;
} else {
intro = ww * ( 1 - (g_pb_time_intro.eval() / g_pb_length_intro.eval()));
}
}
}
}

//--------- Colors
//------------ Stop
var c_stop_BA = RGBA(016,016,024,255); var c_stop_BB = RGBA(016,016,024,255);
var c_stop_TA = RGBA(016,016,024,100); var c_stop_TB = RGBA(016,016,024,000);

//------------ Sub
var c_Sub_BA = RGBA(255,255,000,255); var c_Sub_BB = RGBA(016,016,000,128);
var c_Sub_TA = RGBA(016,016,000,192); var c_Sub_TB = RGBA(096,096,000,032);

//------------ Play
var c_play_BA = RGBA(000,255,000,255); var c_play_BB = RGBA(000,032,000,255);
var c_play_TA = RGBA(000,032,000,192); var c_play_TB = RGBA(000,255,000,000);
var c_iplay_BA = RGBA(000,160,000,255); var c_iplay_BB = RGBA(000,032,000,255);
var c_iplay_TA = RGBA(000,032,000,192); var c_iplay_TB = RGBA(000,255,000,000);

//------------ Pause
var c_pause_BA = RGBA(255,000,000,255); var c_pause_BB =RGBA(032,000,000,255);
var c_pause_TA = RGBA(016,000,000,192); var c_pause_TB = RGBA(255,000,000,000);
var c_ipause_BA = RGBA(160,000,000,255); var c_ipause_BB = RGBA(032,000,000,255);
var c_ipause_TA = RGBA(032,000,000,192); var c_ipause_TB = RGBA(255,000,000,000);

//------------ Get Colors
var c_isplay_BA, c_isplay_BB, c_isplay_TA, c_isplay_TB;
var c_iisplay_BA, c_iisplay_BB, c_iisplay_TA, c_iisplay_TB;

function GetColors(){
if(fb.IsPaused){
c_isplay_BA = c_pause_BA; c_isplay_BB = c_pause_BB;
c_isplay_TA = c_pause_TA; c_isplay_TB = c_pause_TB;
c_iisplay_BA = c_ipause_BA; c_iisplay_BB = c_ipause_BB;
c_iisplay_TA = c_ipause_TA; c_iisplay_TB = c_ipause_TB;
}else{
c_isplay_BA = c_play_BA; c_isplay_BB = c_play_BB;
c_isplay_TA = c_play_TA; c_isplay_TB = c_play_TB;
c_iisplay_BA = c_iplay_BA; c_iisplay_BB = c_iplay_BB;
c_iisplay_TA = c_iplay_TA; c_iisplay_TB = c_iplay_TB;
}
}

//----------------------------------------------------------------------------
//------ Sub Titles & Seekbar
var SubTakes = fb.TitleFormat("$meta_num(subtitles)");
var SubTitlesArray = new Array (SubTakes.eval());
var SubTimesNum = fb.TitleFormat("$meta_num(subtimes)");
var SubTimesArray = new Array (SubTimesNum.eval() + 1);

var SubTitle = "";
var SubTake = 0;
var SubStart = 0;
var SubEnd = 0;
var SubLength = 0;
var SubTime = "";
var SubPlayed = 0;
var SubRemain = 0;
var SubNow = 0;
var SubPos = 0;
var SubOutro = 0;
var SubPosOutro = 0;

function GetSubTitles() {
var SubTitles = ";###; " + fb.TitleFormat("$meta_sep(subtitles,';###; ')").eval();
SubTitlesArray = SubTitles.split(";###; ");
if(SubTimesNum.eval() > 0) {
GetSubTimes() ;
} else {
txt_TitleC = "\n[ " + SubTakes.eval() + " Takes ]";
}
}

function GetSubTimes() {
var SubTimes = ";###; 0;###; " + fb.TitleFormat("$meta_sep(subtimes,';###; ')").eval() + ";###; " + length;
SubTimesArray = SubTimes.split(";###; ");
for (var i = 1; i <= SubTakes.eval(); i++) {
if(Number(now) >= Number(SubTimesArray[i])) {
SubTake = i;
}
}
SubTitle = SubTitlesArray[SubTake];
SubStart = Number(SubTimesArray[SubTake]);
SubEnd = Number(SubTimesArray[SubTake + 1]);
SubLength = SubEnd - SubStart;
SubTime = TimeFmt(SubLength);
SubOutro = (SubLength > 15) ? 15 : SubLength / 2;
SubRemain = TimeFmt(Number(SubEnd) - Math.floor(now));
SubPosOutro = ((Number(SubEnd) - Math.floor(now)) > SubOutro) ? 0 : ww * (1 - ((Number(SubEnd) - Math.floor(now)) / (SubOutro)));
SubNow = Math.floor(now) - SubStart;
SubPlayed = TimeFmt(SubNow);
if (!g_drag) {
SubPos = (ww * ((SubNow) / SubLength)) - SubPosOutro;
txt_Time = SubPlayed + "  |  " + SubTime + "  |  " + SubRemain;
} else {
SubPosOutro = 0;
txt_Time = "<   <<   <<<        " + TimeFmt(g_drag_seek * SubLength);
txt_Time += "  |  " + SubTime + "  |  ";
txt_Time += TimeFmt(SubLength - (g_drag_seek * SubLength)) + "        >>>   >>   >";
}
txt_TitleC = "\n[ " + SubTitle + " ]";
}

//----------------------------------------------------------------------------
//------ Painting
function on_paint(gr){
GetTimes();
GetColors();

gr.FillGradRect( 0, 0,    ww,    wh, 90,   c_stop_BA,   c_stop_BB); // Bottom - Stop - Right Side
gr.FillGradRect( 0, 0,    ww, wh/2, 90,   c_stop_TA,   c_stop_TB); // Top - Stop - Right Side Top
gr.FillGradRect( 0, 0,  intro,    wh, 90, c_iisplay_BA, c_iisplay_BB); // Bottom - Intro - Right Side Bottom
gr.FillGradRect( 0, 0,  intro, wh/2, 90, c_iisplay_TA, c_iisplay_TB); // Top - Intro - Right Side Top
gr.FillGradRect( 0, 0,    pos,    wh, 90,  c_isplay_BA,  c_isplay_BB); // Bottom - Timebar
gr.FillGradRect( 0, 0,    pos, wh/2, 90,  c_isplay_TA,  c_isplay_TB); // Top - Timebar

if(SubTakes.eval() > 0) {
GetSubTitles();
if(SubTimesNum.eval() > 0) {
gr.FillGradRect( SubPosOutro, wh-18,  SubPos, 20, 90,  c_Sub_BA,  c_Sub_BB); // Bottom - Sub Timebar
gr.FillGradRect( SubPosOutro, wh-19,  SubPos, 13, 90,  c_Sub_TA,  c_Sub_TB); // Top - Sub Timebar
}
} else {
txt_TitleC = "";
}

gr.FillGradRect( 0, 0, outro,    wh, 90,    c_stop_BA,    c_stop_BB); // Bottom - Outro - Left Side Bottom
gr.FillGradRect( 0, 0, outro, wh/2, 90,    c_stop_TA,    c_stop_TB); // Top - Outro - Left Side

txt_Title = txt_TitleA.eval() + txt_TitleB.eval() + txt_TitleC;

gr.DrawString( txt_Artist.eval(), g_font_Artist, c_Artist, 0, 0, ww, wh, StrFmt_Artist);
gr.DrawString(             txt_Title,  g_font_Title,   c_Title, 0, 0, ww, wh, StrFmt_Title);
gr.DrawString(            txt_Time,  g_font_Time,  c_Time, 0, 0, ww, wh, StrFmt_Time);

}
//----------------------------------------------------------------------------
//------ Window
function on_size(){
window.Repaint();
}

//----------------------------------------------------------------------------
//------ Mouse
function on_mouse_lbtn_down(x,y) {
g_drag = ((y >= (wh - 20)) && (SubTakes.eval() > 0)) ? 2 : 1;
}
function on_mouse_lbtn_up(x,y) {
if(g_drag) {
g_drag_seek = x / ww;
g_drag_seek = (g_drag_seek<0) ? 0 : (g_drag_seek<1) ? g_drag_seek : 1;
if(g_drag == 1) {
fb.PlaybackTime = fb.PlaybackLength * g_drag_seek;
} else {
fb.PlaybackTime = SubStart + (SubLength * g_drag_seek);
}
g_drag = 0;
}
}
function on_mouse_move(x,y){
if(g_drag) {
g_drag_seek = x / ww;
g_drag_seek = (g_drag_seek<0) ? 0 : (g_drag_seek<1) ? g_drag_seek : 1;
window.Repaint();
}
}
function on_mouse_wheel(delta){
if(fb.IsPlaying){
if(fb.IsPaused){
if(delta>0)
fb.PlaybackTime += 0.1;
else
fb.PlaybackTime -= 0.1;
}else{
if(delta>0)
fb.PlaybackTime += 1;
else
fb.PlaybackTime -= 1;
}
}
}

//----------------------------------------------------------------------------
//------ Playback
function on_playback_new_track(metadb) {
window.Repaint();
}
function on_playback_stop(reason) {
window.Repaint();
}
function on_playback_edited() {
window.Repaint();
}
function on_playback_starting(cmd, paused){
window.Repaint();
}
function on_playback_new_track(info){
window.Repaint();
}
function on_playback_stop(){
window.Repaint();
}
function on_playback_seek(time){
window.Repaint();
}
function on_playback_pause(state){
window.Repaint();
}
function on_playback_edited(){
window.Repaint();
}
function on_playback_time(time){
window.Repaint();
}

//  EOF


Titel: Re: Die etwas andere Seek Bar (WSH Panel Mod)
Beitrag von: TomPro in 19. Juni 2009, 22:39:24
[CUI]

So, nachdem ich nun auch noch eine Idee für die zweite (rechte) Ratinganzeige hatte kommen hier die beiden Codes. Zunächst die linke Anzeige für den normalen Ratig-TAG:

//----------------------------------------------------------------------------
//--- 1stStrike Rating (by TomPro) v1.0
//----------------------------------------------------------------------------

//----------------------------------------------------------------------------
//------ Global
//--------- Window
var ww = window.Width;
var wh = window.Height;

//--------- Set Color
function RGB(r,g,b){ return (0xff000000|(r<<16)|(g<<8)|(b)); }
function RGBA(r,g,b,a){ return ((a<<24)|(r<<16)|(g<<8)|(b)); }

//--------- Get Positions
var rh, rw, rr, wwA, wwB;
var RaH = new Array(6);

function get_positions(){
wh = window.Height; // Height of the Window
ww = window.Width; // Width of the Window

rh = Math.round(wh / 12); // Height of each Rating Sign
rw = Math.round(ww / 2) + 1; // Width of each Rating Sign
rr = Math.round(rh / 2) - 1; // Rectangle Round of each Rating Sign
rr = (rr < (rw / 2)) ? rr : Math.round(rw / 2) - 1; // Check that rr don't become too great

wwA = Math.round(ww / 2) - Math.round(rw / 3); // Left Position (x) of each Rating Sign

RaH[3] = Math.round(wh / 2) - Math.round(rh / 2); // Top Position (y) of the 3rd Rating Sign
RaH[1] = RaH[3] + Math.round(3.50 * rh); // Top Position (y) of the 1st Rating Sign
RaH[2] = RaH[3] + Math.round(1.75 * rh); // Top Position (y) of the 2nd Rating Sign
RaH[4] = RaH[3] -  Math.round(1.75 * rh); // Top Position (y) of the 4th Rating Sign
RaH[5] = RaH[3] -  Math.round(3.50 * rh); // Top Position (y) of the 5th Rating Sign
}

//----------------------------------------------------------------------------
//------ Rating
var Rating = fb.TitleFormat("$meta(rating)"); // Get Rating from Rating-Tag (Manuel)

//--------- Rating Color
var RaCoA = RGB(128,128,192); // Color of Normal Border of each Rating Sign
var RaCoB = RGB(192,255,192); // Color of Hover-EFX by mouse Border of one Rating Sign (for later use to edit the Tag-Field)

var RaCo = new Array(6); // Colors of each Rating Sign (from dark (1) to light (5))
for (var i = 1; i < RaCo.length; i++) { RaCo[i]=RGB(160,i * 16 + 48,160) };

//----------------------------------------------------------------------------
//------ Painting
function on_paint(gr){
get_positions()

r = Rating.eval()
r = (r<0) ? 0 : (r<6) ? r : 0;
r = Math.round(r) + 1;

var hr = (wh<70) ? wh / 2 - 1 : 35;

// Backround
gr.FillSolidRect(    0, 0, ww, wh,            RGB(016,016,024));
gr.FillRoundRect( 0, 0, ww, wh, 15, hr, RGB(000,000,096));
gr.FillSolidRect(  17, 0, ww, wh,            RGB(000,000,096));
gr.FillGradRect(    0, 0, ww, wh, 0,        RGBA(016,016,024,096), RGBA(128,128,160,096));

// Rating
for (var i = 1; i < RaCo.length; i++) {
if (r>i) {
gr.FillRoundRect(wwA, RaH[i], rw, rh, rr, rr,     RaCo[i]);
}
gr.DrawRoundRect(wwA, RaH[i], rw, rh, rr, rr, 1, RaCoA);
}
}

//----------------------------------------------------------------------------
//------ Window
function on_size() {
get_positions();
window.Repaint();
}

//----------------------------------------------------------------------------
//------ Playback
function on_playback_new_track(metadb) {
window.Repaint();
}
function on_playback_stop(reason) {
window.Repaint();
}
function on_playback_edited() {
window.Repaint();
}

//EOF


Und dann die rechte Anzeige:

//----------------------------------------------------------------------------
//--- 1stStrike Rating (Playcount / Raiting) (by TomPro) v1.0
//----------------------------------------------------------------------------

//----------------------------------------------------------------------------
//------ Global
//--------- Variable
var INI_File = fb.FoobarPath + "1stStrike\\1stStrike.ini" // Path and Name of the INI Inifile

//--------- Window
var ww = window.Width; // Height of the Window
var wh = window.Height; // Width of the Window

//--------- Set Color
function RGB(r,g,b){ return (0xff000000|(r<<16)|(g<<8)|(b)); }
function RGBA(r,g,b,a){ return ((a<<24)|(r<<16)|(g<<8)|(b)); }

//--------- Get Positions
var rh, rw, rr, wwA;
var RaH = new Array(6);

function get_positions(){
wh = window.Height;
ww = window.Width;

rh = Math.round(wh / 12); // Height of each Rating Sign
rw = Math.round(ww / 2) + 1; // Width of each Rating Sign
rr = Math.round(rh / 2) - 1; // Rectangle Round of each Rating Sign
rr = (rr < (rw / 2)) ? rr : Math.round(rw / 2) - 1; // Check that rr don't become too great

wwA = Math.round(ww / 2) - 2 *Math.round(rw / 3); // Left Position (x) of each Rating Sign

RaH[3] = Math.round(wh / 2) - Math.round(rh / 2); // Top Position (y) of the 3rd Rating Sign
RaH[1] = RaH[3] + Math.round(3.50 * rh); // Top Position (y) of the 1st Rating Sign
RaH[2] = RaH[3] + Math.round(1.75 * rh); // Top Position (y) of the 2nd Rating Sign
RaH[4] = RaH[3] -  Math.round(1.75 * rh); // Top Position (y) of the 4th Rating Sign
RaH[5] = RaH[3] -  Math.round(3.50 * rh); // Top Position (y) of the 5th Rating Sign
}

//----------------------------------------------------------------------------
//------ Rating
var StressR = Number(utils.ReadINI(INI_File, "Statistic", "StressR",1));
var StressC = Number(utils.ReadINI(INI_File, "Statistic", "StressC",1));
var RatingStress;
var Rating = fb.TitleFormat("$meta(rating)"); // Get Rating from Rating-Tag (Manuel)
var PlayCount = fb.TitleFormat("%play_count%"); // Get Rating from Play Count-Tag
var CountMax = Number(utils.ReadINI(INI_File, "Statistic", "Playcount"));
var CountRatio = 250 / CountMax;

//--------- Rating Color
var RaCoA = RGB(128,128,192); // Color of Normal Border of each Rating Sign
var RaCoB = RGB(192,255,192); // Color of Hover-EFX by mouse Border of one Rating Sign (for later use to edit the Tag-Field)

var RaCo = new Array(6); // Colors of each Rating Sign (from dark (1) to light (5))
for (var i = 1; i < RaCo.length; i++) { RaCo[i]=RGB(160,i * 16 + 48,160) };

function get_rating(){
var RatingHalf = ((Rating.eval()<0) ? 0 : (Rating.eval()<6) ? Rating.eval() : 0)  * 50 * StressR;
if (PlayCount.eval() <= CountMax) {
var CountingHalf = PlayCount.eval() * CountRatio * StressC;
} else {
CountMax = PlayCount.eval();
CountRatio = 250 / CountMax
var CountingHalf = 250 * StressC;
utils.WriteINI(INI_File, "Statistic", "Playcount", CountMax);
utils.WriteINI(INI_File, "Statistic", "Title", fb.TitleFormat("$meta(Title)").eval());
utils.WriteINI(INI_File, "Statistic", "Artist", fb.TitleFormat("$meta(Artist)").eval());
utils.WriteINI(INI_File, "Statistic", "Album", fb.TitleFormat("$meta(Album)").eval());
utils.WriteINI(INI_File, "Statistic", "Rating", fb.TitleFormat("$meta(Rating)").eval());
}
RatingStress = (RatingHalf + CountingHalf) / ((StressR + StressC) * 50);
}

//----------------------------------------------------------------------------
//------ Setup Menu
var MFlag = {
Enabled: 0x00000000,
String: 0x00000000,
Unchecked: 0x00000000,
Grayed: 0x00000001,
Disabled: 0x00000002,
Bitmap: 0x00000004,
Checked: 0x00000008,
Popup: 0x00000010,
MenuBarBreak: 0x00000020,
MenuBreak: 0x00000040,
OwnerDraw: 0x00000100,
Separator: 0x00000800,
RightJustify: 0x00004000
};

function ShowSetup(x,y) {
get_rating()
var _Menu = window.CreatePopupMenu();
var ret;

_Menu.AppendMenuItem(MFlag.Disabled, 0, "Stress Playcount  ( " + PlayCount.eval() + " )");
for(var i=1; i<=10; i++) {
_Menu.AppendMenuItem(MFlag.String, i, i);
}
_Menu.AppendMenuSeparator();
_Menu.AppendMenuItem(MFlag.Disabled, 19, "Stress Rating  ( " + Rating.eval() + " )");
for(var i=0; i<=10; i++) {
_Menu.AppendMenuItem(MFlag.String, 20 + i, i);
}
_Menu.AppendMenuSeparator();
_Menu.AppendMenuItem(MFlag.Disabled, 40, "Highest Playcount  ( " + utils.ReadINI(INI_File, "Statistic", "Playcount") + " )");
_Menu.AppendMenuItem(MFlag.Grayed, 42, "Title = " + utils.ReadINI(INI_File, "Statistic", "Title"));
_Menu.AppendMenuItem(MFlag.Grayed, 43, "Artist = " + utils.ReadINI(INI_File, "Statistic", "Artist"));
_Menu.AppendMenuItem(MFlag.Grayed, 44, "Album = " + utils.ReadINI(INI_File, "Statistic", "Album"));
_Menu.AppendMenuItem(MFlag.Grayed, 45, "Rating = " + utils.ReadINI(INI_File, "Statistic", "Rating"));

_Menu.CheckMenuRadioItem(01, 10, StressC);
_Menu.CheckMenuRadioItem(20, 30, StressR + 20);

ret = _Menu.TrackPopupMenu(x,y);
if (ret == 0) return;
if (ret >= 01 && ret <= 10) {
StressC = ret;
utils.WriteINI(INI_File, "Statistic", "StressC", StressC);
}
if (ret >= 20 && ret <= 30) {
StressR = ret - 20;
utils.WriteINI(INI_File, "Statistic", "StressR", StressR);
}
}

//----------------------------------------------------------------------------
//------ Painting
function on_paint(gr){
get_rating()
get_positions()

r = RatingStress;
r = (r<0) ? 0 : (r<6) ? r : 0;
r = Math.round(r) + 1;

var hr = (wh<70) ? wh / 2 - 1 : 35;

// Backround
gr.FillSolidRect(    0, 0, ww, wh,            RGB(016,016,024));
gr.FillRoundRect( 0, 0, ww, wh, 15, hr, RGB(000,000,096));
gr.FillSolidRect(    0, 0,  17, wh,            RGB(000,000,096));
gr.FillGradRect(    0, 0, ww, wh, 180,    RGBA(016,016,024,096), RGBA(128,128,160,096));

// Rating
for (var i = 1; i < RaCo.length; i++) {
if (r>i) {
gr.FillRoundRect(wwA, RaH[i], rw, rh, rr, rr,     RaCo[i]);
}
gr.DrawRoundRect(wwA, RaH[i], rw, rh, rr, rr, 1, RaCoA);
}
}

//----------------------------------------------------------------------------
//------ Window
function on_size() {
get_positions()
window.Repaint();
}

//----------------------------------------------------------------------------
//------ Playback
function on_playback_new_track(metadb) {
window.Repaint();
}
function on_playback_stop(reason) {
window.Repaint();
}
function on_playback_edited() {
window.Repaint();
}

//--------- Mouse
// mask: see Flags.txt for more details
function on_mouse_lbtn_down(x,y,mask) {
ShowSetup(x,y);
window.Repaint();
}

//EOF


Bei der rechten Rating Anzeige handelt es sich um eine Kombination aus Rating und Playcount. Beim abspielen der Tracks wird dabei der aktuelle Playcount Wert des laufenen Tracks ermittelt und mit dem bis daher höchsten Playcount Wert verglichen. Sollte der aktuelle Playcout Wert höher sein, so wird dieser automatisch der nächste Masstab an dem sich die folgenden zu richten haben. Der höchste ermittelte Wert wird in eine INI-Datei geschrieben, damit der Wert natürlich nicht verloren geht. Das Playcount-Rating setzt den höchsten Wert auf 5 Punkte und im Verhältniss die anderen Werte entsprechend.

Zusätzlich daduzu kann mit der linken Maustaste ein Menue aufgerufen werden, wo das Verhältnis von Playcout-Rating (1 - 10) zu Normalen Rating (0 - 10) gesetzt werden kann.

Gruß TomPro

PS: Die Idee mit der INI-Datei hat mich dazu wiederum angeregt ein Album-Rating mit hilfe einer eigenen Datenbank auf diese Art zu entwickeln, so jagt eine Idee die nächste, mal sehen ob ich das hinbekomme.
Titel: Re: Die etwas andere Seek Bar (WSH Panel Mod)
Beitrag von: tedgo in 20. Juni 2009, 09:39:43
Ist ja ganz nett, aber irgendwie verstehe ich den Sinn des "rechten" Scripts noch nicht...
Muss es mir mal genau durchlesen, was es denn nun tut :)

Aber mal eine Frage:
Sollte nicht eine INI-Datei geschrieben werden, wenn ich mit Klick "Stress Playcount" oder "Stress Rating" ändere?
Wo wird die hingeschrieben?
Oder muss ich die selbst anlegen?
Wie gesagt, hab mir das Script noch nicht durchgelesen, nur einfach mal schnell in eine Testconfig kopiert :)
Titel: Re: Die etwas andere Seek Bar (WSH Panel Mod)
Beitrag von: TomPro in 20. Juni 2009, 23:50:00
[CUI]

Zitat von: tedgo in 20. Juni 2009, 09:39:43...
Aber mal eine Frage:
Sollte nicht eine INI-Datei geschrieben werden, wenn ich mit Klick "Stress Playcount" oder "Stress Rating" ändere?
Wo wird die hingeschrieben?...

Stand in Zeile 8 ganz als erste Anweisung ::)

var INI_File = fb.FoobarPath + "1stStrike\\1stStrike.ini" // Path and Name of the INI Inifile

und müsste sich eigentlich selber erzeugen.

Das Script generiert ein Rating in Abhängigkeit von Playcount (alleine wenn Rating Stress auf 0) und Rating, und die Art der Gewichtung z.B. 1 zu 1 oder 3 zu 2 kann ich selber bestimmen. Das ich die Gewichtung über die Stress Parameter einstellbar gemacht habe ist dem Umstand geschuldet, das ich diese f2k-Version und die entsprechenden Plug-Ins erst seit ein paar Wochen (4 - 5) nutze und ich deswegen noch keine hohen und umfassende Statistikwerte habe, und deshalb noch nicht übersehen kann ob ein alleiniges Playcount Rating interessant für mich sein könnte. Für die Karaoke-Shows, welche ich ab und an betreue, kann sich dadurch zumindest eine Art Hitparade der beliebtesten Karaokenummern ergeben. Ansonsten war es für mich eine Denksportaufgabe was so möglich sein könnte. Mein Augenmerk liegt ja mehr auf der Funktionsergänzung als auf der Optik, für die ich Dir übrigen bei deinem DarkOne ein Lob aussprechen möchte (hat mich ein wenig angespornt mich in das Intensive f2k programmieren zu stürzen).

Gruß TomPro


Titel: Re: Die etwas andere Seek Bar (WSH Panel Mod)
Beitrag von: tedgo in 21. Juni 2009, 00:00:05
Also die INI-Datei wird bei mir nicht erzeugt...
Muss ich doch mal ins Script schauen (sobald ich genug Zeit dazu habe, denn dein Script-Stil ist ein bisschen anders als meiner. Da muss ich mich erst reindenken :)).

Die Funktion des Scripts habe ich jetzt umrissen. War nur etwas von den beiden "Stress"-Werten und deren gegenseitiger Wirkungsweise irritiert.
Eine gar nicht so unelegante Art, ein "Auto-Rating" zu fabrizieren. Ich gehe ja auch da einen anderen (simpleren) Weg.
Titel: Re: Die etwas andere Seek Bar (WSH Panel Mod)
Beitrag von: TomPro in 21. Juni 2009, 00:03:57
Zitat von: TomPro in 19. Juni 2009, 22:39:24...
PS: Die Idee mit der INI-Datei hat mich dazu wiederum angeregt ein Album-Rating mit hilfe einer eigenen Datenbank auf diese Art zu entwickeln, so jagt eine Idee die nächste, mal sehen ob ich das hinbekomme.

Für die die es interessiert, die Mathematik für das Albumrating steht schon mal und die ersten versuche mit einer eigenen Datenbank mithilfe der INI-Funktion des WSH Panel Mod sind vielversprechend. Die Art wie ich das Albumrating ermittle ist Folgende:

Tracklänge mal TrackRating geteilt durch Spielzeit des Albums.

Gruß TomPro
Titel: Re: Die etwas andere Seek Bar (WSH Panel Mod)
Beitrag von: tedgo in 21. Juni 2009, 00:07:49
An einem Album-Rating-Script wäre ich auch interessiert (falls ich es denn hinbekomme, dass die INI-Datei erzeugt wird...).
Allerdings passt das jetzt nicht mehr so ganz zum Topic-Titel...
Vielleicht solltest du ihn umbenennen, z. B. "WSH Panel mod - Scriptbeispiele" oder so ähnlich. Denn eigentlich passt ja auch das Rating-Script schon nicht mehr zum Titel ;)
Titel: Re: Die etwas andere Seek Bar (WSH Panel Mod)
Beitrag von: TomPro in 21. Juni 2009, 00:14:17
Ob sich die INI selbst erstellt hat kann ich schon nicht mehr sagen, da ich auch andere Parameter dort Ausgelagert hatte, Quasi als Globel Variable Derivat auf die mehrere Insanzen des WSH Panel Mods drauf zugreifen können.

Und --- Du hast recht alles weitere in einem anderen (passenden) Thread.

Gruß TomPro
Titel: Re: Die etwas andere Seek Bar (WSH Panel Mod)
Beitrag von: TomPro in 21. Juni 2009, 02:10:28
Zitat von: tedgo in 21. Juni 2009, 00:07:49
An einem Album-Rating-Script wäre ich auch interessiert (falls ich es denn hinbekomme, dass die INI-Datei erzeugt wird...)....

Also, gerade nochmal probiert, eine Datei, ob INI, DAT, TXT oder sonst was, wird automatisch erzeugt, jedoch nicht ein Ordner der Angegeben ist wenn dieser noch nicht Vorhanden ist. Hier lag wohl die Schwierigkeit mit meinem Script, da du bestimmt keinen Unterordner im foobar-Verzeichnis mit dem namen 1stStrike hattest. Lege also den Ordner 1stStike an und es wird funktionieren, genauso, wie wenn du den Pfad im Script auf --- sagen wir mal --- DarkOne änderst.

Viel Spaß bei den neu erworbenen Erkenntnissen

Gruß TomPro
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar und Rating)
Beitrag von: TomPro in 21. Juni 2009, 07:25:41
[CUI]

So, nach 2 durchgemachten Nächten hier der erste Versuch eines AlbumRatings, kombiniert mit einigen Albuminformationen und einer Covereinbindung:

Fehlerhafter Link entfernt - tedgo

und der Code dazu:

//----------------------------------------------------------------------------
//--- 1stStrike Album Art & Info (by TomPro) v 0.8
//----------------------------------------------------------------------------

//----------------------------------------------------------------------------
//------ Global
//--------- Variable
var INI_File = fb.FoobarPath + "1stStrike\\1stStrike.ini" // Path and Name of the INI Inifile
var DAT_File = fb.FoobarPath + "1stStrike\\albuminfo.dat" // Path and Name of the INI Inifile
var NC_Cover = fb.FoobarPath + "1stStrike\\IMG\\NoCover.png" // Path and Name of a No Cover Image
var File_Path = fb.TitleFormat("$directory_path(%path%)") // Path  of a played File
var get_ini_data, g_img;

var AI = { NoCover: 0, Front: 1, Back: 2, Disc : 3, Icon: 4, Artist: 5, Embedded: 6 }
get_ini_data = utils.ReadINI(INI_File, "Album Art", "StandardArtId", AI.Embedded);
var ArtIdS = Number(get_ini_data); //  Kind of Cover Standard
var ArtId = ArtIdS; //  Kind of Cover
var ArtCheck = new Array(6); // Check IDs of existing Cover

var TMI = { NowPlaying: 1, FollowCurser: 2 };
var TrackMode = TMI.FollowCurser;
var TMT = new Array( "Now Playing", "Follow Curser" );
var TM_Item = new Array(2);

//--------- Window
var ww = window.Width; // Height of the Window
var wh = window.Height; // Width of the Window

//--------- Set Color
function RGB(r,g,b){ return (0xff000000|(r<<16)|(g<<8)|(b)); }
function RGBA(r,g,b,a){ return ((a<<24)|(r<<16)|(g<<8)|(b)); }

//--------- Format Time String
function TimeFmt(t){
var zpad = function(n){
var str = n.toString();
return (str.length<2) ? "0"+str : str;
}
var h = Math.floor(t/3600); t-=h*3600;
var m = Math.floor(t/60); t-=m*60;
var s = Math.floor(t);
if(h>0) return h.toString()+":"+zpad(m)+":"+zpad(s);
return m.toString()+":"+zpad(s);
}

//----------------------------------------------------------------------------
//------ Text Options
//--------- Font
// format : x = gdi.Font("FontName", ptSize, FStyle.Style);
var FStyle = { Normal: 0, Bold: 1, Italic: 2, Underline: 4, Strikeout: 8 }

//--------- String Format
//------------ Align
var HAlign = { Left: 0, Center: 1, Right: 2 }
var VAlign = { Top: 0, Middle: 1, Bottom: 2 }

//------------ Trim
var Trim = { No: 0, Chara: 1, Word: 2, ElipsChara: 3, ElipsWord: 4, ElipsPath: 5 }

//------------ Flag
var Flag = {
Rtl: 0x0001,
Vert: 0x0002,
Nofit : 0x0004,
Dispctrl: 0x0020,
Nofallback: 0x0400,
Trailspace: 0x0800,
Nowrap: 0x1000,
Linelimit: 0x2000,
Noclip: 0x4000
}

//------------ Set String Format
function StrFmt(alignH,alignV,trim,flag){ return ((alignH<<28)|(alignV<<24)|(trim<<20)|flag); }

//----------------------------------------------------------------------------
//------ Album Art and Info
//--------- Strings
//------------ Font
var font_Artist = gdi.Font("Zurich Ex BT", 13, FStyle.Normal);
var font_Album = gdi.Font("Tahoma", 13, FStyle.Bold);
var font_Date = gdi.Font("Tahoma", 9, FStyle.Normal);
var font_Rating = gdi.Font("Arial",10, FStyle.Bold);
var font_Number = gdi.Font("Arial", 9, FStyle.Bold);
var font_Title = gdi.Font("Zurich Ex BT", 10, FStyle.Normal);
var font_Time = gdi.Font("Arial", 10, FStyle.Bold);

//------------ Colors
var c_Artist = RGB(128,128,000);
var c_Album = RGB(255,255,000);
var c_Date = RGB(192,192,000);
var c_Rating = RGB(255,192,192);
var c_Number = RGB(128,192,128);
var c_NumberPlay = RGB(255,128,128);
var c_Title = RGB(128,255,128);
var c_Time = RGB(255,255,096);

//------------ Formats
var StrFmt_Artist = StrFmt(HAlign.Center, VAlign.Top, Trim.ElipsChara, Flag.Nowrap);
var StrFmt_Album = StrFmt(HAlign.Center, VAlign.Top, Trim.ElipsChara, Flag.Nowrap);
var StrFmt_Date = StrFmt(HAlign.Center, VAlign.Top, Trim.ElipsChara, Flag.Nowrap);
var StrFmt_Rating = StrFmt(HAlign.Center, VAlign.Top, Trim.ElipsChara, Flag.Nowrap);
var StrFmt_Number = StrFmt(HAlign.Left, VAlign.Middle, Trim.ElipsChara, Flag.Nowrap);
var StrFmt_Title = StrFmt(HAlign.Left, VAlign.Middle, Trim.ElipsChara, Flag.Nowrap);
var StrFmt_Time = StrFmt(HAlign.Right, VAlign.Middle, Trim.No, Flag.Nowrap);

//--------- Album Art Ratio
var wr, iw, ih, iws, ihs, irs;

function GetRatio(image) {
ww = window.Width;
wh = window.Height;
wr = ww/(wh); // Ratio of the Windows minus 15 px Head
iws = image.Width; // Source-Width of the Selected Cover
ihs = image.Height; // Source-Height of the Selected Cover
irs = iws/ihs; // Ratio of the Selected Cover

if (wr > irs) {
iw = Math.round(wh * irs); // Width of the Selected Cover
ih = wh; // Height of the Selected Cover
} else {
iw = ww; // Width of the Selected Cover
ih = Math.round(ww / irs); // Height of the Selected Cover
}
}

//--------- Album Art
ActualItem()

function ActualItem() {
TM_Item[TMI.NowPlaying] = fb.GetNowPlaying();
TM_Item[TMI.FollowCurser] = fb.GetFocusItem();
}

function CheckImage(Item) {
var c_img = null;
ActualItem();
if (! TM_Item[Item] ){
for (var i = 6; i >= 0; i--) { ArtCheck[i]  =  0; }
} else {
ArtCheck[0] = 0;
for (var i = 5; i >= 1; i--) {
c_img = utils.GetAlbumArt(TM_Item[Item].RawPath, i-1);
ArtCheck[i] = (c_img) ? 1 : 0;
ArtCheck[0] = (c_img) ? i : ArtCheck[0];
}
c_img = utils.GetAlbumArtEmbedded(TM_Item[Item].RawPath, 0);
ArtCheck[6] = (c_img) ? 1 : 0;
ArtCheck[0] = (c_img) ? 6 : ArtCheck[0];
}
}

function SelectImage() {
TrackMode = (fb.isplaying) ? TMI.NowPlaying: TMI.FollowCurser;
CheckImage(TrackMode);
var SelectId = (ArtCheck[ArtId] == 1) ? ArtId : ArtCheck[0];
switch(SelectId) {
case AI.NoCover:
g_img = gdi.Image(NC_Cover);
break;
case AI.Front:
g_img = utils.GetAlbumArt(TM_Item[TrackMode].RawPath, 0);
break;
case AI.Back:
g_img = utils.GetAlbumArt(TM_Item[TrackMode].RawPath, 1);
break;
case AI.Disc:
g_img = utils.GetAlbumArt(TM_Item[TrackMode].RawPath, 2);
break;
case AI.Icon:
g_img = utils.GetAlbumArt(TM_Item[TrackMode].RawPath, 3);
break;
case AI.Artist:
g_img = utils.GetAlbumArt(TM_Item[TrackMode].RawPath, 4);
break;
case AI.Embedded:
g_img = utils.GetAlbumArtEmbedded(TM_Item[TrackMode].RawPath, 0);
break;
default:
g_img = gdi.Image(NC_Cover);
break;
}
GetRatio(g_img);
}

//--------- Album Info
GetInfoTitle = new Array(99);
GetInfoTime = new Array(99);
GetInfoRating = new Array(99);
var DATMax = 0;
var AlbumRating = 0;

function AlbumInfo() {
var DATAlbum = fb.TitleFormat("$replace(%album artist% - [%album%][' {CD: '%discnumber%'/'%totaldiscs%'}'] - %date%,'[','<',']','>')");
var DATTitle = fb.TitleFormat("%tracknumber% - Title");
var VALTitle = fb.TitleFormat("%title%[ - %titleversion%]");
var DATTime = fb.TitleFormat("%tracknumber% - Time");
var VALTime = fb.TitleFormat("%length_seconds%");
var DATFile = fb.TitleFormat("%tracknumber% - $replace(%_path%,%filename_ext%,)");
var VALFile = fb.TitleFormat("$meta(rating)");
// Max Track Info
DATMax = Number(utils.ReadINI(DAT_File, DATAlbum.eval(), "DATMax",0));
if (DATMax < Number(fb.TitleFormat("%tracknumber%").eval())) {
DATMax = Number(fb.TitleFormat("%tracknumber%").eval());
utils.WriteINI(DAT_File, DATAlbum.eval(), "DATMax", DATMax);
}
// Save Track Info
utils.WriteINI(DAT_File, DATAlbum.eval(), DATTitle.eval(), VALTitle.eval());
utils.WriteINI(DAT_File, DATAlbum.eval(), DATTime.eval(), VALTime.eval());
utils.WriteINI(DAT_File, DATAlbum.eval(), DATFile.eval(), VALFile.eval());
// Get Album Info
var AlbumTime = 0;
var AlbumTimeRating = 0;
var G_Title = "";
var G_Time = "";
var G_File = "";
var j = "";
for (var i = 1; i <= DATMax; i++) {
j = (i <= 9) ? "0" + i : i;
G_Title = j + " - Title";
G_Time = j + " - Time";
G_File = j + " - " + fb.TitleFormat("$replace(%_path%,%filename_ext%,)").eval();
GetInfoTitle[i] = utils.ReadINI(DAT_File, DATAlbum.eval(), G_Title,"No Title");
GetInfoTime[i] = Number(utils.ReadINI(DAT_File, DATAlbum.eval(), G_Time,0));
GetInfoRating[i] = Number(utils.ReadINI(DAT_File, DATAlbum.eval(), G_File,0));
GetInfoRating[i] = (GetInfoRating[i]<0) ? 1 : (GetInfoRating[i]<=5) ? GetInfoRating[i] :  1;
AlbumTime += GetInfoTime[i];
AlbumTimeRating += GetInfoTime[i] * GetInfoRating[i];
}
AlbumRating = Math.round(100 * AlbumTimeRating / AlbumTime) / 100;
AlbumRating = (AlbumRating<0) ? "" : (AlbumRating<=5) ? AlbumRating :  ""
}



//----------------------------------------------------------------------------
//------ Setup Menu
var MFlag = {
Enabled: 0x00000000,
String: 0x00000000,
Unchecked: 0x00000000,
Grayed: 0x00000001,
Disabled: 0x00000002,
Bitmap: 0x00000004,
Checked: 0x00000008,
Popup: 0x00000010,
MenuBarBreak: 0x00000020,
MenuBreak: 0x00000040,
OwnerDraw: 0x00000100,
Separator: 0x00000800,
RightJustify: 0x00004000
};

function ShowSetup(x,y) {
var SelectId = (ArtCheck[ArtId] == 1) ? ArtId : ArtCheck[0];
var _Menu = window.CreatePopupMenu();
var ret;

_Menu.AppendMenuItem(MFlag.String, 01, "Front");
_Menu.AppendMenuItem(MFlag.String, 02, "Back");
_Menu.AppendMenuItem(MFlag.String, 03, "Disc");
_Menu.AppendMenuItem(MFlag.String, 04, "Icon");
_Menu.AppendMenuItem(MFlag.String, 05, "Artist");
_Menu.AppendMenuItem(MFlag.String, 06, "Embedded");
_Menu.AppendMenuSeparator();
_Menu.AppendMenuItem(MFlag.Disabled, 10, "Save default");
_Menu.AppendMenuItem(MFlag.String, 11, "Front");
_Menu.AppendMenuItem(MFlag.String, 12, "Back");
_Menu.AppendMenuItem(MFlag.String, 13, "Disc");
_Menu.AppendMenuItem(MFlag.String, 14, "Icon");
_Menu.AppendMenuItem(MFlag.String, 15, "Artist");
_Menu.AppendMenuItem(MFlag.String, 16, "Embedded");

_Menu.CheckMenuRadioItem(01, 06, SelectId);
_Menu.CheckMenuRadioItem(11, 16, ArtIdS + 10);

CheckImage(TrackMode);
for (var i = 1; i <= 6; i++) {
if (ArtCheck[i] == 0) _Menu.EnableMenuItem(i, MFlag.Grayed);
}

ret = _Menu.TrackPopupMenu(x,y);
if (ret == 0) return;
if (ret >= 01 && ret <= 06) ArtId = ret;
if (ret >= 11 && ret <= 16) {
ArtIdS = ret - 10;
utils.WriteINI(INI_File, "Album Art", "StandardArtId", ArtIdS);
}
}

//----------------------------------------------------------------------------
//------ Callback functions
//--------- Paint
// Called when window is ready to draw
// gr - Refer to IGdiGraphics
function on_paint(gr) {
SelectImage();

// Draw Background
gr.FillSolidRect( 0, 0, ww, wh, RGB(016,016,024));

// Draw Cover
GetRatio(g_img);
gr.DrawImage( g_img, (ww / 2) - (iw / 2), wh-ih, iw, ih, 0, 0, iws, ihs);

AlbumInfo();
gr.FillSolidRect( 0, 0, ww, 70 + DATMax * 12, RGBA(016,016,024,128));
gr.DrawString(fb.TitleFormat("%album artist%").eval(),  font_Artist,  c_Artist, 0, 2, ww, 16, StrFmt_Artist);
gr.DrawString(fb.TitleFormat("[%album%][' {CD: '%discnumber%'/'%totaldiscs%'}']").eval(),  font_Album,  c_Album, 0, 16, ww, 16, StrFmt_Album);
gr.DrawString(fb.TitleFormat("'('[%original_date%'  ~  ']%date%')   '").eval(),  font_Date,  c_Date, 0, 33, ww, 10, StrFmt_Date);
gr.DrawString(AlbumRating,  font_Rating,  c_Rating, 0, 42, ww, 16, StrFmt_Rating);
for (var i = 1; i <= DATMax; i++) {
if (Math.floor(i / 2) == i / 2) {
gr.FillSolidRect( 0, 55 + i *14, ww, 14, RGBA(096,096,096,128));
} else {
gr.FillSolidRect( 0, 55 + i *14, ww, 14, RGBA(016,016,024,128));
}
j = (i <= 9) ? "0" + i : i;
if (fb.TitleFormat("%tracknumber%").eval() == j) {
gr.DrawString(j + ". >",  font_Number,  c_NumberPlay, 2, 55 + i *14, 30, 14, StrFmt_Number);
} else {
gr.DrawString(j + ".",  font_Number,  c_Number, 2, 55 + i *14, 24, 14, StrFmt_Number);
}
gr.DrawString(GetInfoTitle[i],  font_Title,  c_Title, 26, 55 + i *14, ww-76, 14, StrFmt_Title);
gr.DrawString(TimeFmt(GetInfoTime[i]),  font_Time,  c_Time, ww-45, 55 + i *14, 40, 14, StrFmt_Time);
}
}

//--------- Window
function on_size(){
window.Repaint();
}

//--------- Playback
// cmd: (integer, begin with 0): default, play, next, prev, settrack, rand, resume
//function on_playback_starting(cmd, is_paused) {
// if (PFCState == PFCI.OffDuringPlaying) fb.PlaybackFollowCursor = false;
// window.Repaint();
//}

// reason: (integer, begin with 0): user, eof, starting_another, shutting_down
function on_playback_stop(reason) {
if (reason != 2) {
fb.PlaybackFollowCursor = true;
TrackMode =  TMI.FollowCurser;
}
window.Repaint();
}

// metadb - Refer to IFbMetadbHandle
function on_playback_new_track(metadb) {
window.Repaint();
}

//--------- Focus
// Called when playlist focus has been changed
// For those who what to implement "follow cursor"
function on_item_focus_change() {
window.Repaint();
}

//--------- Mouse
// mask: see Flags.txt for more details
function on_mouse_lbtn_down(x,y){
ShowSetup(x,y);
window.Repaint();
}

//--------- metadb
// [1.1.3] New: Called when metadb contents change. (Or, one of display hook component requests display update).
// Cooperated with window.WatchMetadb() and window.UnWatchMetadb()
// metadb: The same metadb as in window.WatchMetadb(metadb)
// fromhook: boolean, set to true when actual file contents haven't changed but one of metadb_display_field_provider
//   implementations requested an update so output of metadb_handle::format_title() etc has changed.
function on_metadb_changed(metadb, fromhook) {
window.Repaint();

}

//EOF


Sobald ein Track angespielt wird werden Titel Spielzeit und Rating in eine DAT-Datei geschrieben (ACHTUNG DER UNTERORDNER s.o.) zur Identifizierung wird auch noch zwingend die Tracknummer benötigt (vielleicht bekomme ich oder jemand anderes das auch noch eleganter und Idiotensicherer hin). Dann wird wie oben schon angedeutet das Trackrating mit der Tracklänge multipliziert und anschliesend nach Aufsummierung aller Trackzeitratings das ganze durch die Albumspielzeit dividiert. Auf Sterne habe ich zugunsten der numerischen Anzeige verzichtet um so auch 2 Nachkommastellen berücksichtigen zu können, dies dürfte aber auch leicht abwandelbar sein.

Um die Datenbank zu füllen muss jeder Titel einmal angespielt werden (habe ich mit dem Preview-Pluckin > je 2 sec pro Titel innerhalb von 8 Stunden für knapp 9000 Dateien erledigt gehabt). Sollte Ein Rating Tag nicht gesetzt sein wird dieser mit 1 angenommen, akzeptiert werden Ratings von 0 bis 5. Gespeichert werden die Informationen in der DAT-Datei wie folgt:

Zitat
[Genesis - Selling England By The Pound - 1985]
DATMax=8
01 - Title=Dancing With The Moonlit Knight
01 - Time=485
01 - E:\Archiv\Audio\G  H  I\Genesis\(1973 ~ 1985) Selling England By The Pound\=5
02 - Title=I Know What I Like (In Your Wardrobe)
02 - Time=248
02 - E:\Archiv\Audio\G  H  I\Genesis\(1973 ~ 1985) Selling England By The Pound\=4
03 - Title=Firth Of Fifth
03 - Time=578
03 - E:\Archiv\Audio\G  H  I\Genesis\(1973 ~ 1985) Selling England By The Pound\=5
04 - Title=More Fool Me
04 - Time=193
04 - E:\Archiv\Audio\G  H  I\Genesis\(1973 ~ 1985) Selling England By The Pound\=3
05 - Title=The Battle Of Epping Forest
05 - Time=709
05 - E:\Archiv\Audio\G  H  I\Genesis\(1973 ~ 1985) Selling England By The Pound\=4
06 - Title=After The Ordeal
06 - Time=257
06 - E:\Archiv\Audio\G  H  I\Genesis\(1973 ~ 1985) Selling England By The Pound\=3
07 - Title=The Cinema Show
07 - Time=664
07 - E:\Archiv\Audio\G  H  I\Genesis\(1973 ~ 1985) Selling England By The Pound\=4
08 - Title=Aisle Of Plenty
08 - Time=96
08 - E:\Archiv\Audio\G  H  I\Genesis\(1973 ~ 1985) Selling England By The Pound\=4

Den Dateipfad als Bezeichner für das Rating habe ich gewählt damit zwar jedes Album (bei einheitlichem Tagin der Sammlung) nur einmal in der Datenbank auftaucht, aber eventuelle Sicherheitskopien mit einem anderen Pfad ebenfalls mit aufgenommen werden können. Und so könnte man dann auch sehen ob man nachträglich das eine oder andere Lied doch anders bewertet hatte oder, wenn man ein autotagin über den playcount z.B. realisiert hatte, ob sich das Rating Tag über die Zeit verändert hatte.

Auch kann das Cover gewählt werden welches Angezeigt werden soll (Front, Back, Artist u.s.w.), natürlich per INI-Datei präferierbar, und das ganze mit eine ausweich Variation falls das Defauld Cover nicht verfügbar ist.

Sicherlich mag der Code noch etwas ROH sein da ich wie ich wohl schon mal erwähnte eigentlich mit dem Programmieren nichts zu tuen habe  und ich mir die einzelnen Fragmente zusammenpurzle.

Viel Spaß damit Gruß

TomPro
Titel: Re: Die etwas andere Seek Bar (WSH Panel Mod)
Beitrag von: tedgo in 21. Juni 2009, 10:41:22
Zitat von: TomPro in 21. Juni 2009, 02:10:28
... Lege also den Ordner 1stStike an und es wird funktionieren, genauso, wie wenn du den Pfad im Script auf --- sagen wir mal --- DarkOne änderst.
Hab ich inzwischen rausgekriegt
Jetzt beginnt sich mir auch der Sinn zu erschließen :)
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 21. Juni 2009, 10:49:11
Kompliment für Deine Programmierarbeit.

Anmerkung zum Albumrating:
ZitatDann wird wie oben schon angedeutet das Trackrating mit der Tracklänge multipliziert und anschliesend nach Aufsummierung aller Trackzeitratings das ganze durch die Albumspielzeit dividiert.
Damit wichtest Du längere Stücke natürlich höher als kürzere. Das kann man machen. In der Praxis finde ich aber, dass auch ein sehr kurzer grottenschlechter Track zu einer deutlichen Abwertung des gesamten Albums führen müsste. Als Alternative könntest Du jeden Track gleich wichten: Summe(Trackrating)/Zahl der Tracks. Vielleicht kann man sich ja beides anzeigen lassen.

Fragen: Gibt es irgendwelche Performance-Einbußen durch Lese- oder Schreib-Prozesse in die Datenbank? Warum verwendest Du keine "professionelle" Datenbank wie MySQL? Geht das nicht?
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: TomPro in 21. Juni 2009, 23:28:38
Zitat von: grimes in 21. Juni 2009, 10:49:11...Als Alternative könntest Du jeden Track gleich wichten: Summe(Trackrating)/Zahl der Tracks. Vielleicht kann man sich ja beides anzeigen lassen...

Das müsse ich hinkriegen, mach mich gleich drann.

Zitat von: grimes in 21. Juni 2009, 10:49:11...Fragen: Gibt es irgendwelche Performance-Einbußen durch Lese- oder Schreib-Prozesse in die Datenbank? Warum verwendest Du keine "professionelle" Datenbank wie MySQL? Geht das nicht?

Weil ich wie schon erwähnt nicht wirklich programmieren kann. Ich habe Ideen suche in Bedienungsanleitung wie Selfhtml von Stefan Münz für JScript oder den beigelegten Hilfstexten oder anderen geposteten Arbeiten nach Lösungen und versuche die sinnvoll zu verknüpfen.

Hatte gerade beim Schreiben ein Dejavue. Jeff Goldblum wurde in die Fliege in etwa gefragt wie er so multidisziplinär sein könne um einen Teletransporter im Alleingang entwickeln zu können, und er sagte sinngemäß das er dies nicht sei, er beauftrage Firmen die im dies oder jenes konstruieren könne und baue dies lediglich zusammen. lol  ;)

Ich habe absolut keine Ahnung von Datenbanken

Gruß TomPro (bis gleich mus mein Script anpassen für das Trackzahlrating)
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: TomPro in 22. Juni 2009, 00:32:00
[CUI]

I'll be back

Hier der Code für die Anzeige von, natürlich Wahlweise, AlbumRating gewichtet nach Tracklänge, Trackanzahl oder beidem:

//----------------------------------------------------------------------------
//--- 1stStrike Album Art & Info (by TomPro) v 0.8.1
//----------------------------------------------------------------------------

//----------------------------------------------------------------------------
//------ Global
//--------- Variable
var INI_File = fb.FoobarPath + "1stStrike\\1stStrike.ini" // Path and Name of the INI Inifile
var DAT_File = fb.FoobarPath + "1stStrike\\albuminfo.dat" // Path and Name of the INI Inifile
var NC_Cover = fb.FoobarPath + "1stStrike\\IMG\\NoCover.png" // Path and Name of a No Cover Image
var File_Path = fb.TitleFormat("$directory_path(%path%)") // Path  of a played File
var get_ini_data, g_img;

var AI = { NoCover: 0, Front: 1, Back: 2, Disc: 3, Icon: 4, Artist: 5, Embedded: 6 }
get_ini_data = utils.ReadINI(INI_File, "Album Art", "StandardArtId", AI.Embedded);
var ArtIdS = Number(get_ini_data); //  Kind of Cover Standard
var ArtId = ArtIdS; //  Kind of Cover
var RV = { Length: 1, Number: 2, Either: 3 }
get_ini_data = utils.ReadINI(INI_File, "Album Art", "RatingState", RV.Either);
var RatingState = Number(get_ini_data); //  Kind of Ratingview
var ArtCheck = new Array(6); // Check IDs of existing Cover

var TMI = { NowPlaying: 1, FollowCurser: 2 };
var TrackMode = TMI.FollowCurser;
var TMT = new Array( "Now Playing", "Follow Curser" );
var TM_Item = new Array(2);

//--------- Window
var ww = window.Width; // Height of the Window
var wh = window.Height; // Width of the Window

//--------- Set Color
function RGB(r,g,b){ return (0xff000000|(r<<16)|(g<<8)|(b)); }
function RGBA(r,g,b,a){ return ((a<<24)|(r<<16)|(g<<8)|(b)); }

//--------- Format Time String
function TimeFmt(t){
var zpad = function(n){
var str = n.toString();
return (str.length<2) ? "0"+str : str;
}
var h = Math.floor(t/3600); t-=h*3600;
var m = Math.floor(t/60); t-=m*60;
var s = Math.floor(t);
if(h>0) return h.toString()+":"+zpad(m)+":"+zpad(s);
return m.toString()+":"+zpad(s);
}

//----------------------------------------------------------------------------
//------ Text Options
//--------- Font
// format : x = gdi.Font("FontName", ptSize, FStyle.Style);
var FStyle = { Normal: 0, Bold: 1, Italic: 2, Underline: 4, Strikeout: 8 }

//--------- String Format
//------------ Align
var HAlign = { Left: 0, Center: 1, Right: 2 }
var VAlign = { Top: 0, Middle: 1, Bottom: 2 }

//------------ Trim
var Trim = { No: 0, Chara: 1, Word: 2, ElipsChara: 3, ElipsWord: 4, ElipsPath: 5 }

//------------ Flag
var Flag = {
Rtl: 0x0001,
Vert: 0x0002,
Nofit : 0x0004,
Dispctrl: 0x0020,
Nofallback: 0x0400,
Trailspace: 0x0800,
Nowrap: 0x1000,
Linelimit: 0x2000,
Noclip: 0x4000
}

//------------ Set String Format
function StrFmt(alignH,alignV,trim,flag){ return ((alignH<<28)|(alignV<<24)|(trim<<20)|flag); }

//----------------------------------------------------------------------------
//------ Album Art and Info
//--------- Strings
//------------ Font
var font_Artist = gdi.Font("Zurich Ex BT", 13, FStyle.Normal);
var font_Album = gdi.Font("Tahoma", 13, FStyle.Bold);
var font_Date = gdi.Font("Tahoma", 9, FStyle.Normal);
var font_Rating = gdi.Font("Arial",10, FStyle.Bold);
var font_Number = gdi.Font("Arial", 9, FStyle.Bold);
var font_Title = gdi.Font("Zurich Ex BT", 10, FStyle.Normal);
var font_Time = gdi.Font("Arial", 10, FStyle.Bold);

//------------ Colors
var c_Artist = RGB(128,128,000);
var c_Album = RGB(255,255,000);
var c_Date = RGB(192,192,000);
var c_Rating = RGB(255,192,192);
var c_Number = RGB(128,192,128);
var c_NumberPlay = RGB(255,128,128);
var c_Title = RGB(128,255,128);
var c_Time = RGB(255,255,096);

//------------ Formats
var StrFmt_Artist = StrFmt(HAlign.Center, VAlign.Top, Trim.ElipsChara, Flag.Nowrap);
var StrFmt_Album = StrFmt(HAlign.Center, VAlign.Top, Trim.ElipsChara, Flag.Nowrap);
var StrFmt_Date = StrFmt(HAlign.Center, VAlign.Top, Trim.ElipsChara, Flag.Nowrap);
var StrFmt_Rating = StrFmt(HAlign.Center, VAlign.Top, Trim.ElipsChara, Flag.Nowrap);
var StrFmt_Number = StrFmt(HAlign.Left, VAlign.Middle, Trim.ElipsChara, Flag.Nowrap);
var StrFmt_Title = StrFmt(HAlign.Left, VAlign.Middle, Trim.ElipsChara, Flag.Nowrap);
var StrFmt_Time = StrFmt(HAlign.Right, VAlign.Middle, Trim.No, Flag.Nowrap);

//--------- Album Art Ratio
var wr, iw, ih, iws, ihs, irs;

function GetRatio(image) {
ww = window.Width;
wh = window.Height;
wr = ww/(wh); // Ratio of the Windows minus 15 px Head
iws = image.Width; // Source-Width of the Selected Cover
ihs = image.Height; // Source-Height of the Selected Cover
irs = iws/ihs; // Ratio of the Selected Cover

if (wr > irs) {
iw = Math.round(wh * irs); // Width of the Selected Cover
ih = wh; // Height of the Selected Cover
} else {
iw = ww; // Width of the Selected Cover
ih = Math.round(ww / irs); // Height of the Selected Cover
}
}

//--------- Album Art
ActualItem()

function ActualItem() {
TM_Item[TMI.NowPlaying] = fb.GetNowPlaying();
TM_Item[TMI.FollowCurser] = fb.GetFocusItem();
}

function CheckImage(Item) {
var c_img = null;
ActualItem();
if (! TM_Item[Item] ){
for (var i = 6; i >= 0; i--) { ArtCheck[i]  =  0; }
} else {
ArtCheck[0] = 0;
for (var i = 5; i >= 1; i--) {
c_img = utils.GetAlbumArt(TM_Item[Item].RawPath, i-1);
ArtCheck[i] = (c_img) ? 1 : 0;
ArtCheck[0] = (c_img) ? i : ArtCheck[0];
}
c_img = utils.GetAlbumArtEmbedded(TM_Item[Item].RawPath, 0);
ArtCheck[6] = (c_img) ? 1 : 0;
ArtCheck[0] = (c_img) ? 6 : ArtCheck[0];
}
}

function SelectImage() {
TrackMode = (fb.isplaying) ? TMI.NowPlaying: TMI.FollowCurser;
CheckImage(TrackMode);
var SelectId = (ArtCheck[ArtId] == 1) ? ArtId : ArtCheck[0];
switch(SelectId) {
case AI.NoCover:
g_img = gdi.Image(NC_Cover);
break;
case AI.Front:
g_img = utils.GetAlbumArt(TM_Item[TrackMode].RawPath, 0);
break;
case AI.Back:
g_img = utils.GetAlbumArt(TM_Item[TrackMode].RawPath, 1);
break;
case AI.Disc:
g_img = utils.GetAlbumArt(TM_Item[TrackMode].RawPath, 2);
break;
case AI.Icon:
g_img = utils.GetAlbumArt(TM_Item[TrackMode].RawPath, 3);
break;
case AI.Artist:
g_img = utils.GetAlbumArt(TM_Item[TrackMode].RawPath, 4);
break;
case AI.Embedded:
g_img = utils.GetAlbumArtEmbedded(TM_Item[TrackMode].RawPath, 0);
break;
default:
g_img = gdi.Image(NC_Cover);
break;
}
GetRatio(g_img);
}

//--------- Album Info
GetInfoTitle = new Array(99);
GetInfoTime = new Array(99);
GetInfoRating = new Array(99);
var DATMax = 0;
var AlbumRatingLength = 0;
var AlbumRatingNumber = 0;

function AlbumInfo() {
var DATAlbum = fb.TitleFormat("$replace(%album artist% - [%album%][' {CD: '%discnumber%'/'%totaldiscs%'}'] - %date%,'[','<',']','>')");
var DATTitle = fb.TitleFormat("%tracknumber% - Title");
var VALTitle = fb.TitleFormat("%title%[ - %titleversion%]");
var DATTime = fb.TitleFormat("%tracknumber% - Time");
var VALTime = fb.TitleFormat("%length_seconds%");
var DATFile = fb.TitleFormat("%tracknumber% - $replace(%_path%,%filename_ext%,)");
var VALFile = fb.TitleFormat("$meta(rating)");
// Max Track Info
DATMax = Number(utils.ReadINI(DAT_File, DATAlbum.eval(), "DATMax",0));
if (DATMax < Number(fb.TitleFormat("%tracknumber%").eval())) {
DATMax = Number(fb.TitleFormat("%tracknumber%").eval());
utils.WriteINI(DAT_File, DATAlbum.eval(), "DATMax", DATMax);
}
// Save Track Info
utils.WriteINI(DAT_File, DATAlbum.eval(), DATTitle.eval(), VALTitle.eval());
utils.WriteINI(DAT_File, DATAlbum.eval(), DATTime.eval(), VALTime.eval());
utils.WriteINI(DAT_File, DATAlbum.eval(), DATFile.eval(), VALFile.eval());
// Get Album Info
var AlbumTime = 0;
var AlbumTimeRating = 0;
var AlbumNumberRating = 0;
var G_Title = "";
var G_Time = "";
var G_File = "";
var j = "";
for (var i = 1; i <= DATMax; i++) {
j = (i <= 9) ? "0" + i : i;
G_Title = j + " - Title";
G_Time = j + " - Time";
G_File = j + " - " + fb.TitleFormat("$replace(%_path%,%filename_ext%,)").eval();
GetInfoTitle[i] = utils.ReadINI(DAT_File, DATAlbum.eval(), G_Title,"No Title");
GetInfoTime[i] = Number(utils.ReadINI(DAT_File, DATAlbum.eval(), G_Time,0));
GetInfoRating[i] = Number(utils.ReadINI(DAT_File, DATAlbum.eval(), G_File,0));
GetInfoRating[i] = (GetInfoRating[i]<0) ? 1 : (GetInfoRating[i]<=5) ? GetInfoRating[i] :  1;
AlbumTime += GetInfoTime[i];
AlbumTimeRating += GetInfoTime[i] * GetInfoRating[i];
AlbumNumberRating += GetInfoRating[i];
}
AlbumRatingLength = Math.round(100 * AlbumTimeRating / AlbumTime) / 100;
AlbumRatingLength = (AlbumRatingLength<0) ? "" : (AlbumRatingLength<=5) ? AlbumRatingLength :  ""
AlbumRatingNumber = Math.round(100 * AlbumNumberRating / DATMax) / 100;
AlbumRatingNumber = (AlbumRatingNumber<0) ? "" : (AlbumRatingNumber<=5) ? AlbumRatingNumber :  ""
}



//----------------------------------------------------------------------------
//------ Setup Menu
var MFlag = {
Enabled: 0x00000000,
String: 0x00000000,
Unchecked: 0x00000000,
Grayed: 0x00000001,
Disabled: 0x00000002,
Bitmap: 0x00000004,
Checked: 0x00000008,
Popup: 0x00000010,
MenuBarBreak: 0x00000020,
MenuBreak: 0x00000040,
OwnerDraw: 0x00000100,
Separator: 0x00000800,
RightJustify: 0x00004000
};

function ShowSetup(x,y) {
var SelectId = (ArtCheck[ArtId] == 1) ? ArtId : ArtCheck[0];
var _Menu = window.CreatePopupMenu();
var ret;

_Menu.AppendMenuItem(MFlag.String, 01, "Front");
_Menu.AppendMenuItem(MFlag.String, 02, "Back");
_Menu.AppendMenuItem(MFlag.String, 03, "Disc");
_Menu.AppendMenuItem(MFlag.String, 04, "Icon");
_Menu.AppendMenuItem(MFlag.String, 05, "Artist");
_Menu.AppendMenuItem(MFlag.String, 06, "Embedded");
_Menu.AppendMenuSeparator();
_Menu.AppendMenuItem(MFlag.Disabled, 10, "Save default");
_Menu.AppendMenuItem(MFlag.String, 11, "Front");
_Menu.AppendMenuItem(MFlag.String, 12, "Back");
_Menu.AppendMenuItem(MFlag.String, 13, "Disc");
_Menu.AppendMenuItem(MFlag.String, 14, "Icon");
_Menu.AppendMenuItem(MFlag.String, 15, "Artist");
_Menu.AppendMenuItem(MFlag.String, 16, "Embedded");
_Menu.AppendMenuSeparator();
_Menu.AppendMenuItem(MFlag.Disabled, 20, "Ratingview");
_Menu.AppendMenuItem(MFlag.String, 21, "Weight by length of track");
_Menu.AppendMenuItem(MFlag.String, 22, "Weight by number of track");
_Menu.AppendMenuItem(MFlag.String, 23, "Either (length / number)");

_Menu.CheckMenuRadioItem(01, 06, SelectId);
_Menu.CheckMenuRadioItem(11, 16, ArtIdS + 10);
_Menu.CheckMenuRadioItem(21, 23, RatingState + 20);

CheckImage(TrackMode);
for (var i = 1; i <= 6; i++) {
if (ArtCheck[i] == 0) _Menu.EnableMenuItem(i, MFlag.Grayed);
}

ret = _Menu.TrackPopupMenu(x,y);
if (ret == 0) return;
if (ret >= 01 && ret <= 06) ArtId = ret;
if (ret >= 11 && ret <= 16) {
ArtIdS = ret - 10;
utils.WriteINI(INI_File, "Album Art", "StandardArtId", ArtIdS);
}
if (ret >= 21 && ret <= 23) {
RatingState = ret - 20;
utils.WriteINI(INI_File, "Album Art", "RatingState", RatingState);
}
}

//----------------------------------------------------------------------------
//------ Callback functions
//--------- Paint
// Called when window is ready to draw
// gr - Refer to IGdiGraphics
function on_paint(gr) {
SelectImage();

// Draw Background
gr.FillSolidRect( 0, 0, ww, wh, RGB(016,016,024));

// Draw Cover
GetRatio(g_img);
gr.DrawImage( g_img, (ww / 2) - (iw / 2), wh-ih, iw, ih, 0, 0, iws, ihs);

AlbumInfo();
gr.FillSolidRect( 0, 0, ww, 70 + DATMax * 12, RGBA(016,016,024,128));
gr.DrawString(fb.TitleFormat("%album artist%").eval(),  font_Artist,  c_Artist, 0, 2, ww, 16, StrFmt_Artist);
gr.DrawString(fb.TitleFormat("[%album%][' {CD: '%discnumber%'/'%totaldiscs%'}']").eval(),  font_Album,  c_Album, 0, 16, ww, 16, StrFmt_Album);
gr.DrawString(fb.TitleFormat("'('[%original_date%'  ~  ']%date%')   '").eval(),  font_Date,  c_Date, 0, 33, ww, 10, StrFmt_Date);
switch(RatingState) {
case RV.Length:
gr.DrawString(AlbumRatingLength,  font_Rating,  c_Rating, 0, 42, ww, 16, StrFmt_Rating);
break;
case RV.Number:
gr.DrawString(AlbumRatingNumber,  font_Rating,  c_Rating, 0, 42, ww, 16, StrFmt_Rating);
break;
case RV.Either:
gr.DrawString(AlbumRatingLength + " / " + AlbumRatingNumber,  font_Rating,  c_Rating, 0, 42, ww, 16, StrFmt_Rating);
break;
default:
gr.DrawString(AlbumRatingLength + " / " + AlbumRatingNumber,  font_Rating,  c_Rating, 0, 42, ww, 16, StrFmt_Rating);
break;
}
for (var i = 1; i <= DATMax; i++) {
if (Math.floor(i / 2) == i / 2) {
gr.FillSolidRect( 0, 55 + i *14, ww, 14, RGBA(096,096,096,128));
} else {
gr.FillSolidRect( 0, 55 + i *14, ww, 14, RGBA(016,016,024,128));
}
j = (i <= 9) ? "0" + i : i;
if (fb.TitleFormat("%tracknumber%").eval() == j) {
gr.DrawString(j + ". >",  font_Number,  c_NumberPlay, 2, 55 + i *14, 30, 14, StrFmt_Number);
} else {
gr.DrawString(j + ".",  font_Number,  c_Number, 2, 55 + i *14, 24, 14, StrFmt_Number);
}
gr.DrawString(GetInfoTitle[i],  font_Title,  c_Title, 26, 55 + i *14, ww-76, 14, StrFmt_Title);
gr.DrawString(TimeFmt(GetInfoTime[i]),  font_Time,  c_Time, ww-45, 55 + i *14, 40, 14, StrFmt_Time);
}
}

//--------- Window
function on_size(){
window.Repaint();
}

//--------- Playback
// cmd: (integer, begin with 0): default, play, next, prev, settrack, rand, resume
//function on_playback_starting(cmd, is_paused) {
// if (PFCState == PFCI.OffDuringPlaying) fb.PlaybackFollowCursor = false;
// window.Repaint();
//}

// reason: (integer, begin with 0): user, eof, starting_another, shutting_down
function on_playback_stop(reason) {
if (reason != 2) {
fb.PlaybackFollowCursor = true;
TrackMode =  TMI.FollowCurser;
}
window.Repaint();
}

// metadb - Refer to IFbMetadbHandle
function on_playback_new_track(metadb) {
window.Repaint();
}

//--------- Focus
// Called when playlist focus has been changed
// For those who what to implement "follow cursor"
function on_item_focus_change() {
window.Repaint();
}

//--------- Mouse
// mask: see Flags.txt for more details
function on_mouse_lbtn_down(x,y){
ShowSetup(x,y);
window.Repaint();
}

//--------- metadb
// [1.1.3] New: Called when metadb contents change. (Or, one of display hook component requests display update).
// Cooperated with window.WatchMetadb() and window.UnWatchMetadb()
// metadb: The same metadb as in window.WatchMetadb(metadb)
// fromhook: boolean, set to true when actual file contents haven't changed but one of metadb_display_field_provider
//   implementations requested an update so output of metadb_handle::format_title() etc has changed.
function on_metadb_changed(metadb, fromhook) {
window.Repaint();

}

//EOF


@ tedgo
Wenn Du willst kann ich Dir auch den Programtrick zukommen lassen, mit welchem Du auch Unterordner per Script erstellen kannst, hatte den nur vor der Veröffentlichung dieses Scriptes raus genommen; siehe Diskussionsaufruf (http://foobar-users.de/index.php?topic=2001.msg12064#msg12064) an anderer Stelle hier im Board.

Viel Spass und ich nehme auch gerne Verbesserungen an, ob ich mich allerdings noch in echte Datenbanken einfuchse weis ich noch nicht

TomPro
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 22. Juni 2009, 08:55:18
Zitat von: TomPro in 22. Juni 2009, 00:32:00
@ tedgo
Wenn Du willst kann ich Dir auch den Programtrick zukommen lassen, mit welchem Du auch Unterordner per Script erstellen kannst, hatte den nur vor der Veröffentlichung dieses Scriptes raus genommen; siehe Diskussionsaufruf (http://foobar-users.de/index.php?topic=2001.msg12064#msg12064) an anderer Stelle hier im Board.
Wenn du mit diesem "Trick" FSO meinst, das kenne ich schon, nutze es aber nicht, weil ich es für unsicher halte :)
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: fbuser in 23. Juni 2009, 09:51:05
Ob man jetzt das FileSystemObject verwendet oder mit einem externen Programmaufruf über foo_run sein System schrottet, ist letztendlich egal. Es ist sicherlich nicht notwendig, entsprechenden Code "geheim" zu halten. Wer wirklich böse Absichten hat, wird ohnehin wissen, was er machen muss.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 23. Juni 2009, 11:22:31
Das stimmt, aber als unversierter User kann man u. U. mit FSO unabsichtlich auch selbst Schaden am eigenen System anrichten ;)
Den Code nicht weiterzugeben ist allerdings nicht unbedingt notwendig. Ein Hinweis, dass man ihn besser nicht ändert und damit herumspielt, wenn man sich nicht auskennt, sollte reichen.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: TomPro in 25. Juni 2009, 06:16:44
Ja FSO meinte ich, da war ich wohl ein wenig zu paranoid, habs trotzdem wieder bei mir rausgeschmissen "...Und führe uns nicht in Versuchung..."

Gruß TomPro
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 18. November 2009, 15:31:45
Hier kommen neue Skripte für WSH Panel mod.

Es handelt sich zum einen um ein Metronom:


//metronome by grimes
//fb2k 1.0+, WSH Panel Mod 1.3.0+ required
//DUI/CUI ready


function RGB(r, g, b) {
    return (0xff000000 | (r << 16) | (g << 8) | (b));
}

var dui = window.InstanceType;

var bpm2 = window.GetProperty("Beats per minute (bpm):", 120);
var mbpm = window.GetProperty("Fine Tuning in mbpm (-999 to +999):", 0);
var bpm = bpm2 + mbpm / 1000;
var bar = window.GetProperty("Beats per measure:", 4);
var sr = window.GetProperty("Sample rate [Hz]:", 44100);
var console = window.GetProperty("Open console on timer start?", false);
var rate = 60000 / bpm;
rate = (Math.round(rate * 100)) / 100;
var tempo = "";
var dance = "";
var ml = rate * bar;
ml = (Math.round(ml * 100)) / 100;
var mm = bpm / bar;
mm = (Math.round(mm * 100)) / 100;
var f = 1000 / rate;
f = (Math.round(f * 100)) / 100;
var sb = rate / 1000 * sr;
sb = (Math.round(sb * 100)) / 100;
var sa = sb * bar;
sa = (Math.round(sa * 100)) / 100;
b2 = fb.TitleFormat("%bpm%");
b2 = b2.Eval();
var proz = "";
proz = -((bpm - b2) * 100 / bpm);
proz = (Math.round(proz * 100)) / 100;
var countinmeasure = 1;
var rate2 = 0;

var g_timer_started = false;
var g_count = 0;
var g_count2 = 0;
var seconds = 0;
var g_timer1, g_timer2;
var mod;
var mod2;

var sr2 = fb.TitleFormat("%samplerate%");
var sr3 = sr2.Eval();
var pl = fb.PlaybackLength;
var pl2 = (Math.round(pl * 100)) / 100;
var bt = pl * 1000 / rate;
bt = (Math.round(bt * 100)) / 100;
var mt = (pl * 1000 / rate) / bar;
mt = (Math.round(mt * 100)) / 100;
var st = sr3 * pl;
st = (Math.round(st * 100)) / 100;
var samp = (Math.round(sb * (g_count - 1) * 100)) / 100;

//var note = window.GetProperty("Note (1=A0, 49=A4, 88=C8)", 49);
//var magic = Math.pow(2, 1 / 12);
//var piano = (27.5 * Math.pow(magic, note - 1));
//piano = (Math.round(piano * 100)) / 100;
var half = 120000 / bpm;
half = (Math.round(half * 100)) / 100;
var quarter = 60000 / bpm;
quarter = (Math.round(quarter * 100)) / 100;
var eighth = 30000 / bpm;
eighth = (Math.round(eighth * 100)) / 100;
var sixteenth = 15000 / bpm;
sixteenth = (Math.round(sixteenth * 100)) / 100;
var dottedquarter = 90000 / bpm;
dottedquarter = (Math.round(dottedquarter * 100)) / 100;
var dottedeighth = 45000 / bpm;
dottedeighth = (Math.round(dottedeighth * 100)) / 100;
var dottedsixteenth = 22500 / bpm;
dottedsixteenth = (Math.round(dottedsixteenth * 100)) / 100;
var tripletquarter = 40000 / bpm;
tripletquarter = (Math.round(tripletquarter * 100)) / 100;
var tripleteighth = 20000 / bpm;
tripleteighth = (Math.round(tripleteighth * 100)) / 100;
var tripletsixteenth = 10000 / bpm;
tripletsixteenth = (Math.round(tripletsixteenth * 100)) / 100;

var half2 = bpm / 120;
half2 = (Math.round(half2 * 1000)) / 1000;
var quarter2 = bpm / 60;
quarter2 = (Math.round(quarter2 * 1000)) / 1000;
var eighth2 = bpm / 30;
eighth2 = (Math.round(eighth2 * 1000)) / 1000;
var sixteenth2 = bpm / 15;
sixteenth2 = (Math.round(sixteenth2 * 1000)) / 1000;
var dottedquarter2 = bpm / 90;
dottedquarter2 = (Math.round(dottedquarter2 * 1000)) / 1000;
var dottedeighth2 = bpm / 45;
dottedeighth2 = (Math.round(dottedeighth2 * 1000)) / 1000;
var dottedsixteenth2 = bpm / 22.5;
dottedsixteenth2 = (Math.round(dottedsixteenth2 * 1000)) / 1000;
var tripletquarter2 = bpm / 40;
tripletquarter2 = (Math.round(tripletquarter2 * 1000)) / 1000;
var tripleteighth2 = bpm / 20;
tripleteighth2 = (Math.round(tripleteighth2 * 1000)) / 1000;
var tripletsixteenth2 = bpm / 10;
tripletsixteenth2 = (Math.round(tripletsixteenth2 * 1000)) / 1000;

//global Variables for text field
var DT_TOP = 0x00000000;
var DT_LEFT = 0x00000000;
var DT_CENTER = 0x00000001;
var DT_RIGHT = 0x00000002;
var DT_VCENTER = 0x00000004;
var DT_BOTTOM = 0x00000008;
var DT_WORDBREAK = 0x00000010;
var DT_SINGLELINE = 0x00000020;
var DT_EXPANDTABS = 0x00000040;
var DT_TABSTOP = 0x00000080;
var DT_NOCLIP = 0x00000100;
var DT_EXTERNALLEADING = 0x00000200;
var DT_CALCRECT = 0x00000400;
var DT_NOPREFIX = 0x00000800;
var DT_INTERNAL = 0x00001000;
var DT_EDITCONTROL = 0x00002000;
var DT_PATH_ELLIPSIS = 0x00004000;
var DT_END_ELLIPSIS = 0x00008000;
var DT_MODIFYSTRING = 0x00010000;
var DT_RTLREADING = 0x00020000;
var DT_WORD_ELLIPSIS = 0x00040000;
var DT_NOFULLWIDTHCHARBREAK = 0x00080000;
var DT_HIDEPREFIX = 0x00100000;
var DT_PREFIXONLY = 0x00200000;
var g_font = dui == 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
//var color = RGB(200,0,0);
var color = dui == 1 ? window.GetColorDUI(2) : RGB(200,0,0);
//var color2 = RGB(0,0,0);
var color2 = dui == 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);

function on_paint(gr) {
    gr.FillSolidRect(0, 0, window.Width, window.Height, dui == 1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
    gr.GdiDrawText("Click here to start (and stop) timers", g_font, color2, 5, 30, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    gr.GdiDrawText("To change parameter: right click + Properties", g_font, color, 5, 45, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    gr.GdiDrawText("Beats per minute b = " + bpm + " bpm " + "f = " + f + " Hz " + tempo, g_font, color2, 5, 60, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    gr.GdiDrawText("Delay time t = " + rate + " ms", g_font, color2, 5, 75, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    gr.GdiDrawText("Beats per measure bm = " + bar, g_font, color2, 5, 90, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    gr.GdiDrawText("Sample rate sr = " + sr + " Hz", g_font, color2, 5, 105, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    gr.GdiDrawText("Measures per minute mm = " + mm + " mpm " + dance, g_font, color2, 5, 120, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    gr.GdiDrawText("Measure length ml = " + ml + " ms", g_font, color2, 5, 135, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    gr.GdiDrawText("Samples per measure sa = " + sa, g_font, color2, 5, 150, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    gr.GdiDrawText("Samples per beat sb = " + sb, g_font, color2, 5, 165, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    gr.GdiDrawText("Note duration [ms]: 1/2=" + half + ", 1/4=" + quarter + ", 1/8=" + eighth + ", 1/16=" + sixteenth, g_font, color2, 5, 180, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    gr.GdiDrawText("dot1/4=" + dottedquarter + ", dot1/8=" + dottedeighth + ", dot1/16=" + dottedsixteenth, g_font, color2, 5, 195, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    gr.GdiDrawText("triplet1/4=" + tripletquarter + ", triplet1/8=" + tripleteighth + ", triplet1/16=" + tripletsixteenth, g_font, color2, 5, 210, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    gr.GdiDrawText("Hertz [Hz]: 1/2=" + half2 + ", 1/4=" + quarter2 + ", 1/8=" + eighth2 + ", 1/16=" + sixteenth2, g_font, color2, 5, 225, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    gr.GdiDrawText("dot1/4=" + dottedquarter2 + ", dot1/8=" + dottedeighth2 + ", dot1/16=" + dottedsixteenth2, g_font, color2, 5, 240, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    gr.GdiDrawText("triplet1/4=" + tripletquarter2 + ", triplet1/8=" + tripleteighth2 + ", triplet1/16=" + tripletsixteenth2, g_font, color2, 5, 255, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    gr.GdiDrawText("playing track", g_font, color2, 5, 285, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    gr.GdiDrawText("Playback length pl = " + pl2 + " s", g_font, color2, 5, 300, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    gr.GdiDrawText("Measures per track mt = " + mt, g_font, color2, 5, 315, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    gr.GdiDrawText("Beats per track bt = " + bt, g_font, color2, 5, 330, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    gr.GdiDrawText("Samples per track (sr = " + sr3 + " Hz) st = " + st, g_font, color2, 5, 345, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    gr.GdiDrawText("(%bpm% = " + b2 + " bpm " + proz + " %)", g_font, color2, 5, 360, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    //gr.GdiDrawText("Calculate piano frequency, note: " + note + " = " + piano + " Hz", g_font, color2, 5, 390, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    if (g_timer_started) {
        gr.GdiDrawText("Running", g_font, color, 250, 30, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
        if (mod === 0 || g_count === 0) {
            gr.GdiDrawText("1", g_font, color, 350, 60, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
        } else {
            gr.GdiDrawText("0", g_font, color, 350, 60, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
        }
        gr.GdiDrawText(g_count, g_font, color, 370, 60, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
        if (mod2 !== 0 && g_count !== 0) {
            gr.GdiDrawText("0", g_font, color, 350, 120, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
        } else {
            gr.GdiDrawText("1", g_font, color, 350, 120, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
        }
        gr.GdiDrawText(Math.floor((g_count) / bar), g_font, color, 370, 120, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
        gr.GdiDrawText(countinmeasure, g_font, color, 350, 90, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
        gr.GdiDrawText(seconds + "s", g_font, color, 350, 30, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    }
}

function CurrentTempo() {
    if (bpm < 40) {
        tempo = "Larghissimo";
    } else if (bpm >= 40 && bpm < 60) {
        tempo = "Largo";
    } else if (bpm >= 60 && bpm < 66) {
        tempo = "Larghetto";
    } else if (bpm >= 66 && bpm < 76) {
        tempo = "Adagio";
    } else if (bpm >= 76 && bpm < 108) {
        tempo = "Andante";
    } else if (bpm >= 108 && bpm < 120) {
        tempo = "Moderato";
    } else if (bpm >= 120 && bpm < 168) {
        tempo = "Allegro";
    } else if (bpm >= 168 && bpm < 208) {
        tempo = "Presto";
    } else if (bpm >= 208) {
        tempo = "Prestissimo";
    }
}



function CurrentDance() {
    if (bar === 4) {
        if (mm >= 27 && mm < 28) {
            dance = "Rumba(4/4)";
        } else if (mm >= 28 && mm <= 29) {
            dance = "Rumba(4/4), Foxtrot(4/4)";
        } else if (mm > 29 && mm <= 30) {
            dance = "Foxtrot(4/4)";
        } else if (mm >= 32 && mm <= 34) {
            dance = "Tango(4/4), Cha Cha(4/4)";
        } else if (mm >= 44 && mm < 50) {
            dance = "Jive(4/4)";
        } else if (mm >= 50 && mm <= 52) {
            dance = "Quickstep(4/4), Jive(4/4)";
        }
    }

    else if (bar === 2) {
        if (mm >= 48 && mm <= 50) {
            dance = "Samba(2/4)";
        } else if (mm >= 60 && mm <= 62) {
            dance = "Paso Doble(2/4)";
        }
    }

    else if (bar === 3) {
        if (mm >= 28 && mm <= 31) {
            dance = "Waltz(3/4)";
        } else if (mm >= 56 && mm <= 60) {
            dance = "Viennese Waltz(3/4)";
        }
    }
}

var ct = new CurrentTempo();
var cd = new CurrentDance();



function print_to_console(msg) {
    fb.trace("bpm:", bpm, msg);
}



function on_mouse_lbtn_down() {
    if (!g_timer_started) {
        // Timer are created here
        g_timer1 = window.CreateTimerInterval(1000);
        g_timer2 = window.CreateTimerInterval(rate);
        print_to_console("Timers started.");
        // Print and show console
        if (console) {
            fb.ShowConsole();
            print_to_console("Show console now.");
        }
        g_timer_started = true;
       
    } else if (g_timer_started) {
        // Kill all timers
        window.KillTimer(g_timer1);
        window.KillTimer(g_timer2);
        g_timer_started = false;
        g_count = 0;
        seconds = 0;
        rate2 = 0;
        print_to_console("Timers killed.");
    }
    window.Repaint();
}



function on_timer(id) {
    if (g_timer1 && id === g_timer1.ID) {
        seconds++;
    } else if (g_timer2 && id === g_timer2.ID) {
        g_count2 = g_count / bar;
        g_count2 = (Math.round(g_count2 * 100)) / 100;
        rate2 = rate * (g_count) / 1000;
        rate2 = (Math.round(rate2 * 100)) / 100;
        g_count++;
        if (console) {
            print_to_console(" " + g_count + " beat(s) measure: " + Math.floor(g_count2) + " " + g_count2 + " time: " + rate2 + " s samples: " + (Math.round(sb * (g_count - 1) * 100)) / 100);
        }
        mod = g_count % 2;
        mod2 = g_count % bar;
        if (g_count % bar === 0 || g_count === 0) {
            countinmeasure = 0;
        }
        countinmeasure++;

    }
    window.Repaint();
}



function on_playback_new_track(metadb) {
    b2 = fb.TitleFormat("%bpm%");
    b2 = b2.Eval();
    sr2 = fb.TitleFormat("%samplerate%");
    sr3 = sr2.Eval();
    pl = fb.PlaybackLength;
    pl2 = (Math.round(pl * 100)) / 100;
    bt = pl * 1000 / rate;
    bt = (Math.round(bt * 100)) / 100;
    mt = (pl * 1000 / rate) / bar;
    mt = (Math.round(mt * 100)) / 100;
    st = sr3 * pl;
    st = (Math.round(st * 100)) / 100;
    proz = -((bpm - b2) * 100 / bpm);
    proz = (Math.round(proz * 100)) / 100;
    window.Repaint();
}



function on_playback_stop(reason) {
    pl = pl2 = bt = mt = st = 0;
    sr3 = "";
    b2 = "";
    proz = "-100";
    window.Repaint();
}


function on_playback_seek(time) {
    seconds = 0;
    g_count = 0;
}


function on_playback_pause(state) {
    countinmeasure = 1;
}

function on_colors_changed() {
    color = dui ==1 ? window.GetColorDUI(2) : RGB(200,0,0);
    color2 = dui ==1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
    window.Repaint();
}

function on_font_changed() {
    g_font = dui == 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
    window.Repaint();
}


EDIT:
ADD: %bpm% einlesen und anzeigen
ADD: Fine Tuning bpm
ADD: Notendauer in s und Hz
ADD: Playback Pause bei Timer-Stop
ADD: Track abspielen bei Timer-Start
ADD: Berechnung Tonhöhe in Hz
ADD: Sekunden-Timer
ADD: Anzeige der Timer im Panel (Console optional)
FIX: Bugs



Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 21. November 2009, 21:22:33
zum anderen um den BPM Tapper (Beats per minute) - ein manueller BPM-Counter:


//BPM Tapper by grimes
//fb2k 1.0+, WSH Panel Mod 1.3.0+ required
//DUI/CUI ready


secs2 = 0;
count = 0;
allBpm = 0;
avgBpm = 0;
bpm = 0;
oldBpm=0;

var dui = window.InstanceType;

function RGBA(r, g, b, a) {
r &= 0xff;
    g &= 0xff;
    b &= 0xff;
    a &= 0xff;
    return ((a << 24) | (r << 16) | (g << 8) | (b));
}



function RGB(r, g, b) {
    return RGBA(r, g, b, 0xff);
}

function bpmTapper(){
timeSeconds = new Date;
    secs = timeSeconds.getTime();
    if (count == 0) {
        AVG = "Hit any key!";
        NOW = "Click Here to Reset!";
        HIT = "";
        ACG = "";
        NCG = "";
        secs2 = secs;
        count++;
    } else {
oldBpm = bpm;
        bpm = (1 / ((secs - secs2) / 1000)) * 60;
if (bpm > 600) {bpm = oldBpm;}
        bpmChg = (Math.round((bpm - oldBpm) * 10)) / 10;
        count++;
        allBpm = allBpm + bpm;
        oldAvg = avgBpm;
        avgBpm = allBpm / (count - 1);
        avgChg = (Math.round((avgBpm - oldAvg) * 10)) / 10;
        secs2 = secs;
        if (bpmChg >= 0) {
            PbpmChg = "+" + bpmChg
        } else {
            PbpmChg = bpmChg
        }
        if (avgChg >= 0) {
            PavgChg = "+" + avgChg
        } else {
            PavgChg = avgChg
        }
        AVG = (Math.round(avgBpm * 100)) / 100;
        ACG = PavgChg;
        NOW = (Math.round(bpm * 100)) / 100;
        NCG = PbpmChg;
        HIT = count;
    }
}
new bpmTapper();

var g_font = gdi.Font("Segoe UI", 20, 0);
//var color = RGB(200,0,0);
var color = dui == 1 ? window.GetColorDUI(2) : RGB(200,0,0);
//var color2 = RGB(0,0,0);
var color2 = dui == 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
    var DT_TOP = 0,
        DT_LEFT = 0,
        DT_CENTER = 1,
        DT_RIGHT = 2,
        DT_VCENTER = 4,
        DT_BOTTOM = 8,
        DT_WORDBREAK = 16,
        DT_SINGLELINE = 32,
        DT_EXPANDTABS = 64,
        DT_TABSTOP = 128,
        DT_NOCLIP = 256,
        DT_EXTERNALLEADING = 512,
        DT_CALCRECT = 1024,
        DT_NOPREFIX = 2048,
        DT_INTERNAL = 4096,
        DT_EDITCONTROL = 8192,
        DT_PATH_ELLIPSIS = 16384,
        DT_END_ELLIPSIS = 32768,
        DT_MODIFYSTRING = 65536,
        DT_RTLREADING = 131072,
        DT_WORD_ELLIPSIS = 262144,
        DT_NOFULLWIDTHCHARBREAK = 524288,
        DT_HIDEPREFIX = 1048576,
        DT_PREFIXONLY = 2097152

function on_paint(gr) {
    gr.FillSolidRect(0, 0, window.Width, window.Height, dui ==1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
    gr.GdiDrawText("Hits: " + HIT, g_font, color2, 5, 10, window.Width, window.Height, DT_LEFT | DT_TOP | DT_SINGLELINE);
    gr.GdiDrawText("Average bpm: " + AVG, g_font, color, 5, 50, window.Width, window.Height, DT_LEFT | DT_TOP | DT_SINGLELINE);
    gr.GdiDrawText("Average Change: " + ACG, g_font, color2, 5, 90, window.Width, window.Height, DT_LEFT | DT_TOP | DT_SINGLELINE);
    gr.GdiDrawText("Current bpm: " + NOW, g_font, color, 5, 130, window.Width, window.Height, DT_LEFT | DT_TOP | DT_SINGLELINE);
    gr.GdiDrawText("Current Change: " + NCG, g_font, color2, 5, 170, window.Width, window.Height, DT_LEFT | DT_TOP | DT_SINGLELINE);
}


function on_key_down(key) {
new bpmTapper();
window.Repaint();
}



function on_mouse_lbtn_down(x, y) {
    count = 0;
    allBpm = 0;
    avgBpm = 0;
    bpm = 0;
    secs2 = secs;
new bpmTapper();
    window.Repaint();
}

function on_colors_changed() {
    color = dui ==1 ? window.GetColorDUI(2) : RGB(200,0,0);
    color2 = dui ==1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
    window.Repaint();
}

function on_font_changed() {
    window.Repaint();
}


EDIT:
FIX: bug

(Ich wünsche euch fröhliches "Hämmern")

Viel Spaß beim Ausprobieren!



Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 22. November 2009, 09:11:24
Statistics
Sammelt statistische Daten, wie Anzahl der Trackstarts/Stops/Pausen/Sekunden etc. seit foobar2000-Start (bzw. WSH Panel-Start)


//Statistics by grimes
//fb2k 1.0+, WSH Panel Mod 1.3.0+ required
//DUI/CUI ready


function RGB(r, g, b) {
    return (0xff000000 | (r << 16) | (g << 8) | (b));
}

var g_timer1 = 0;
var count2 = 0;
var console = window.GetProperty("Print to console?", true);
var enabletimer = window.GetProperty("Enable timer?", true);

var on_item_played2 = 0;
var on_volume_change2 = 0;
var on_get_album_art_done2 = 0;
var on_metadb_changed2 = 0;
var on_item_focus_change2 = 0;
var on_playback_order_changed2 = 0;
var on_playback_time2 = 0;
var on_playback_dynamic_info_track2 = 0;
var on_playback_dynamic_info2 = 0;
var on_playback_edited2 = 0;
var on_playback_pause2 = 0;
var on_playback_seek2 = 0;
var on_playback_stop2 = 0;
var on_playback_new_track2 = 0;
var on_playback_starting2 = 0;
var on_playlist_switch2 = 0;
var on_selection_changed2 = 0;
var seconds = 0;
var minutes = 0;
var hours = 0;
var days = 0;
var seconds2 = 0;
var minutes2 = 0;
var hours2 = 0;
var days2 = 0;
var seconds3 = 0;
var minutes3 = 0;
var hours3 = 0;
var days3 = 0;

var dt = Date();
if (enabletimer) {
g_timer1 = window.CreateTimerInterval(1000);
}
var dt2 = "Never";
var dt3 = "Never";
var dt4 = "Never";
var dt5 = "Never";
var dt6 = "Never";
var dt7 = "Never";
var dt8 = "Never";
var dt9 = "Never";
var dt10 = "Never";
var dt11 = "Never";
var dt12 = "Never";
var dt13 = "Never";
var dt14 = "Never";
var dt15 = "Never";
var dt16 = "Never";
var dt17 = "Never";
var dt18 = "Never";

var idle = 0;
var proc = 0;
var proc2 = 0;
var sum = 0;

var dui = window.InstanceType;

var g_font = dui == 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
//var color = RGB(200,0,0);
var color = dui == 1 ? window.GetColorDUI(2) : RGB(200,0,0);
//var color2 = RGB(0,0,0);
var color2 = dui == 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);

//global Variables for text field
var DT_TOP = 0x00000000;
var DT_LEFT = 0x00000000;
var DT_CENTER = 0x00000001;
var DT_RIGHT = 0x00000002;
var DT_VCENTER = 0x00000004;
var DT_BOTTOM = 0x00000008;
var DT_WORDBREAK = 0x00000010;
var DT_SINGLELINE = 0x00000020;
var DT_EXPANDTABS = 0x00000040;
var DT_TABSTOP = 0x00000080;
var DT_NOCLIP = 0x00000100;
var DT_EXTERNALLEADING = 0x00000200;
var DT_CALCRECT = 0x00000400;
var DT_NOPREFIX = 0x00000800;
var DT_INTERNAL = 0x00001000;
var DT_EDITCONTROL = 0x00002000;
var DT_PATH_ELLIPSIS = 0x00004000;
var DT_END_ELLIPSIS = 0x00008000;
var DT_MODIFYSTRING = 0x00010000;
var DT_RTLREADING = 0x00020000;
var DT_WORD_ELLIPSIS = 0x00040000;
var DT_NOFULLWIDTHCHARBREAK = 0x00080000;
var DT_HIDEPREFIX = 0x00100000;
var DT_PREFIXONLY = 0x00200000;

function on_paint(gr) {
    gr.FillSolidRect(0, 0, window.Width, window.Height, dui ==1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
    if (enabletimer) {
gr.GdiDrawText("startup = " + count2 + "s (" + days2 + "d" + hours2 + "h" + minutes2 + "m" + seconds2 + "s) (" + dt + ")", g_font, color, 5, 5, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
gr.GdiDrawText("time idle = " + idle + "s (" + days3 + "d" + hours3 + "h" + minutes3 + "m" + seconds3 + "s) " + proc2 + "%", g_font, color, 5, 25, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
}
gr.GdiDrawText("on_playback_time = " + on_playback_time2 + "s (" + days + "d" + hours + "h" + minutes + "m" + seconds + "s) " + proc + "%", g_font, color, 5, 45, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("on_playback_starting = " + on_playback_starting2 + " (" + dt2 + ")", g_font, color2, 5, 65, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("on_playback_new_track = " + on_playback_new_track2 + " (" + dt4 + ")", g_font, color2, 5, 85, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("on_playback_stop = " + on_playback_stop2 + " (" + dt5 + ")", g_font, color2, 5, 105, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("on_playback_seek = " + on_playback_seek2 + " (" + dt6 + ")", g_font, color2, 5, 125, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("on_playback_pause = " + on_playback_pause2 + " (" + dt7 + ")", g_font, color2, 5, 145, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("on_playback_edited = " + on_playback_edited2 + " (" + dt8 + ")", g_font, color2, 5, 165, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("on_playback_dynamic_info = " + on_playback_dynamic_info2 + " (" + dt9 + ")", g_font, color2, 5, 185, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("on_playback_dynamic_info_track = " + on_playback_dynamic_info_track2 + " (" + dt10 + ")", g_font, color2, 5, 205, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("on_item_played = " + on_item_played2 + " (" + dt3 + ")", g_font, color, 5, 225, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("on_playback_order_changed = " + on_playback_order_changed2 + " (" + dt11 + ")", g_font, color2, 5, 245, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("on_item_focus_change = " + on_item_focus_change2 + " (" + dt12 + ")", g_font, color2, 5, 265, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("on_metadb_changed = " + on_metadb_changed2 + " (" + dt13 + ")", g_font, color2, 5, 285, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("on_get_album_art_done = " + on_get_album_art_done2 + " (" + dt14 + ")", g_font, color2, 5, 305, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    sum = on_playback_starting2 + on_playback_new_track2 + on_playback_stop2 + on_playback_seek2 + on_playback_pause2 + on_playback_edited2 + on_playback_dynamic_info2 + on_playback_dynamic_info_track2 + on_item_played2 + on_playback_order_changed2 + on_item_focus_change2 + on_metadb_changed2 + on_get_album_art_done2 + on_volume_change2 + on_playlist_switch2 + on_selection_changed2;
    gr.GdiDrawText("on_volume_change = " + on_volume_change2 + " (" + dt15 + ")", g_font, color2, 5, 325, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("on_playlist_switch = " + on_playlist_switch2 + " (" + dt16 + ")", g_font, color2, 5, 345, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("on_selection_changed = " + on_selection_changed2 + " (" + dt17 + ") [sum: " + sum + "]", g_font, color2, 5, 365, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
}



function on_playback_starting(cmd, is_paused) {
    on_playback_starting2++;
    dt2 = Date();
if (console) {
print_to_console("on_playback_starting = " + on_playback_starting2 + " (" + dt2 + ")");
    }
window.Repaint();
}



function on_item_played(metadb) {
    on_item_played2++;
    dt3 = Date();
if (console) {
print_to_console("on_item_played = " + on_item_played2 + " (" + dt3 + ")");
}
    window.Repaint();
}



function on_playback_new_track(metadb) {
    window.WatchMetadb(metadb)
    on_playback_new_track2++;
    dt4 = Date();
if (console) {
print_to_console("on_playback_new_track = " + on_playback_new_track2 + " (" + dt4 + ")");
}
    window.Repaint();
}



function on_playback_stop(reason) {
    on_playback_stop2++;
    dt5 = Date();
if (console) {
print_to_console("on_playback_stop = " + on_playback_stop2 + " (" + dt5 + ")");
}
    window.Repaint();
}



function on_playback_seek(time) {
    on_playback_seek2++;
    dt6 = Date();
if (console) {
print_to_console("on_playback_seek = " + on_playback_seek2 + " (" + dt6 + ")");
}
    window.Repaint();
}



function on_playback_pause(state) {
    on_playback_pause2++;
    dt7 = Date();
if (console) {
print_to_console("on_playback_pause = " + on_playback_pause2 + " (" + dt7 + ")");
}
    window.Repaint();
}



function on_playback_edited() {
    on_playback_edited2++;
    dt8 = Date();
if (console) {
print_to_console("on_playback_edited = " + on_playback_edited2 + " (" + dt8 + ")");
}
    window.Repaint();
}



function on_playback_dynamic_info() {
    on_playback_dynamic_info2++;
    dt9 = Date();
//if (console) {
// print_to_console("on_playback_dynamic_info = " + on_playback_dynamic_info2 + " (" + dt9 + ")");
//}
    window.Repaint();
}



function on_playback_dynamic_info_track() {
    on_playback_dynamic_info_track2++;
    dt10 = Date();
if (console) {
print_to_console("on_playback_dynamic_info_track = " + on_playback_dynamic_info_track2 + " (" + dt10 + ")");
}
    window.Repaint();
}



function on_playback_time(time) {
    on_playback_time2++;
    var dt = new Date(on_playback_time2 * 1000);
    seconds = dt.getUTCSeconds();
    minutes = dt.getUTCMinutes();
    hours = dt.getUTCHours();
    days = Math.floor(on_playback_time2 / 86400);
    //if (console) {
// print_to_console("on_playback_time = " + on_playback_time2 + "s (" + days + "d" + hours + "h" + minutes + "m" + seconds + "s) " + proc + "%");
//}
window.Repaint();
}



function on_playback_order_changed(new_order_index) {
    on_playback_order_changed2++;
    dt11 = Date();
if (console) {
print_to_console("on_playback_order_changed = " + on_playback_order_changed2 + " (" + dt11 + ")");
}
    window.Repaint();
}



function on_item_focus_change() {
    on_item_focus_change2++;
    dt12 = Date();
if (console) {
print_to_console("on_item_focus_change = " + on_item_focus_change2 + " (" + dt12 + ")");
}
    window.Repaint();
}



function on_metadb_changed(metadb, fromhook) {
    on_metadb_changed2++;
    dt13 = Date();
if (console) {
print_to_console("on_metadb_changed = " + on_metadb_changed2 + " (" + dt13 + ")");
}
    window.Repaint();
}



function on_get_album_art_done(metadb, art_id, image) {
    on_get_album_art_done2++;
    dt14 = Date();
if (console) {
print_to_console("on_get_album_art_done = " + on_get_album_art_done2 + " (" + dt14 + ")");
}
    window.Repaint();
}



function on_volume_change(val) {
    on_volume_change2++;
    dt15 = Date();
if (console) {
print_to_console("on_volume_change = " + on_volume_change2 + " (" + dt15 + ")");
}
    window.Repaint();
}



function on_playlist_switch() {
    on_playlist_switch2++;
    dt16 = Date();
if (console) {
print_to_console("on_playlist_switch = " + on_playlist_switch2 + " (" + dt16 + ")");
}
    window.Repaint();
}

function on_selection_changed() {
    on_selection_changed2++;
    dt17 = Date();
if (console) {
print_to_console("on_selection_changed = " + on_selection_changed2 + " (" + dt17 + ")");
}
    window.Repaint();
}

function on_timer(id) {
    if (g_timer1 && id == g_timer1.ID) {
        count2++;
        idle = count2 - on_playback_time2;
        var dt1000 = new Date(idle * 1000);
        seconds3 = dt1000.getUTCSeconds();
        minutes3 = dt1000.getUTCMinutes();
        hours3 = dt1000.getUTCHours();
        days3 = Math.floor(count2 / 86400);
        var dt100 = new Date(count2 * 1000);
        seconds2 = dt100.getUTCSeconds();
        minutes2 = dt100.getUTCMinutes();
        hours2 = dt100.getUTCHours();
        days2 = Math.floor(count2 / 86400);
        proc = on_playback_time2 / count2 * 100;
        proc = Math.round(proc);
        proc2 = 100 - (on_playback_time2 / count2 * 100);
        proc2 = Math.round(proc2);
        window.Repaint();
    }
}

function print_to_console(msg) {
fb.trace("statistics:", msg);
}

function on_colors_changed() {
    color = dui ==1 ? window.GetColorDUI(2) : RGB(200,0,0);
    color2 = dui ==1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
    window.Repaint();
}

function on_font_changed() {
    g_font = dui == 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
    window.Repaint();
}


EDIT:
ADD: Zeitformat h:m:s
ADD: Timestamps, startup time, time idle etc.
ADD: print to console
ADD: console output optional
ADD: enable/disable startup timer
REMOVE: average tracktime

Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 23. November 2009, 14:20:29
Die Skripte werden immer kürzer...


Alarm
Starte playback nach einer bestimmten Zeit


//alarm by grimes
//fb2k 1.0+, WSH Panel Mod 1.3.0+ required
//DUI/CUI ready


function RGB(r,g,b){ return (0xff000000|(r<<16)|(g<<8)|(b)); }

var g_timer1;
var alarm = window.GetProperty("Set timer:", 10);
var alarmmode = window.GetProperty("Alarmmode:", false);
var running = false;
var dui = window.InstanceType;

var g_font2 = gdi.Font("Segoe UI", 20, 0);
var g_font = gdi.Font("Segoe UI", 16, 0);
var g_font3 = gdi.Font("Segoe UI", 12, 0);
//var color = RGB(200,0,0);
var color = dui == 1 ? window.GetColorDUI(2) : RGB(200,0,0);
//var color2 = RGB(0,0,0);
var color2 = dui == 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);

function on_paint(gr){
gr.FillSolidRect(0, 0, window.Width, window.Height, dui ==1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
   gr.DrawString("Alarm (" + alarmmode + ")", g_font2, color, 0, -80, window.Width, window.Height, 0x11005000);
gr.DrawString( "Timer = " + alarm + " s", g_font2, color2, 0, -40, window.Width, window.Height, 0x11005000);
if (running) {gr.DrawString("Running", g_font, color2, 0, 0, window.Width, window.Height, 0x11005000);}
gr.DrawString("enable/disable alarm = lbtn, set timer = wheel", g_font3, color2, 0, 40, window.Width, window.Height, 0x11005000);
}

function on_mouse_lbtn_down(x,y){
   if (!alarmmode){
       alarmmode = true;  
       window.NotifyOthers("alarm", "true"); //true
   }
   else {
       alarmmode = false;
       window.NotifyOthers("alarm", ""); // false
   }
window.Repaint();
}

function on_playback_starting(){
   if (alarmmode) {
       fb.Pause();
       running = true;
       g_timer1 = window.CreateTimerTimeout(alarm*1000);
   }
   window.Repaint();
}

function on_mouse_wheel(delta){
for (i = 0; i<delta; i++) {alarm++;}
for (i = 0; i<-delta; i++) {alarm--;}
if(alarm <= 1) { alarm = 1}
window.Repaint();
}

function on_playback_stop(reason) {
if(running){
       running = false;
       window.KillTimer(g_timer1);
   }
   window.Repaint();
}

function on_timer(id) {
if (g_timer1 && id == g_timer1.ID) {
fb.Play();
running = false;
window.Repaint();
}
}

function on_colors_changed() {
   color = dui ==1 ? window.GetColorDUI(2) : RGB(200,0,0);
   color2 = dui ==1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
   window.Repaint();
}

function on_font_changed() {
   window.Repaint();
}



Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 25. November 2009, 07:12:09
... und weiter gehts.


Gap
Einfügen einer variablen Zeitlücke zwischen den Tracks.


//gap by grimes
//gap between tracks
//fb2k 1.0+, WSH Panel Mod 1.3.0+ required
//DUI/CUI ready


function RGB(r,g,b){ return (0xff000000|(r<<16)|(g<<8)|(b)); }

var g_timer1;
var alarm = window.GetProperty("Set timer:", 10);
var running = false;
var start = false;
var gap = window.GetProperty("Gap? ", false);
var dui = window.InstanceType;

var g_font2 = gdi.Font("Segoe UI", 20, 0);
var g_font = gdi.Font("Segoe UI", 16, 0);
var g_font3 = gdi.Font("Segoe UI", 12, 0);
//var color = RGB(200,0,0);
var color = dui == 1 ? window.GetColorDUI(2) : RGB(200,0,0);
//var color2 = RGB(0,0,0);
var color2 = dui == 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);

function on_paint(gr){
gr.FillSolidRect(0, 0, window.Width, window.Height, dui ==1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
   if(gap){gr.DrawString("Gap (true)", g_font2, color, 0, -80, window.Width, window.Height, 0x11005000);}
else {gr.DrawString("Gap (false) / Gapless", g_font2, color, 0, -80, window.Width, window.Height, 0x11005000);}
gr.DrawString("Timer = " + alarm + " s", g_font2, color2, 0, -40, window.Width, window.Height, 0x11005000);
if (running) {gr.DrawString("Timer running", g_font, color2, 0, 0, window.Width, window.Height, 0x11005000);}
if(start) {gr.DrawString("Track started", g_font, color2, 0, 0, window.Width, window.Height, 0x11005000);}
gr.DrawString("gap/gapless = lbtn, set timer = wheel", g_font3, color2, 0, 40, window.Width, window.Height, 0x11005000);
}
function on_mouse_lbtn_down(x,y){
if (!gap) {
       gap = true;
       window.NotifyOthers("gap", "true"); //true
       fb.StopAfterCurrent=true;
   }
else {
       gap = false;
       window.NotifyOthers("gap", ""); // false
       fb.StopAfterCurrent=false;
   }
window.Repaint();
}
function on_mouse_lbtn_up(x,y){

}
function on_mouse_move(x,y){

}
function on_mouse_wheel(delta){
for (i = 0; i<delta; i++) {alarm++;}
for (i = 0; i<-delta; i++) {alarm--;}
if(alarm <= 0) { alarm = 0}
window.Repaint();
}

function on_playback_stop(reason) {
   start = false;
   if (gap && reason != 0 && reason != 2) {
       running = true;
       g_timer1 = window.CreateTimerTimeout(alarm*1000);
   }
   window.Repaint();
}

function on_playback_new_track() {
   start = true;
   running = false;
   window.Repaint();
}

function on_timer(id) {
if (g_timer1 && id == g_timer1.ID) {
fb.Play();
running = false;
start = true;
window.Repaint();
}
}

function on_colors_changed() {
   color = dui ==1 ? window.GetColorDUI(2) : RGB(200,0,0);
   color2 = dui ==1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
   window.Repaint();
}

function on_font_changed() {
   window.Repaint();
}


FIX: Bug



Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 29. November 2009, 13:33:29
Timebomb
Stop/Pause/Exit nach Timerende


//timebomb by grimes
//fb2k 1.0+, WSH Panel Mod 1.3.0+ required
//DUI/CUI ready


function RGB(r,g,b){ return (0xff000000|(r<<16)|(g<<8)|(b)); }

var g_timer1;
var alarm = window.GetProperty("Set timer [s]:", 10);
var running = false;
var timebombmode = window.GetProperty("Timebombmode:", false);
//var start = false;
var tbpause = window.GetProperty("Pause playback?", false);
var tbexit = window.GetProperty("Exit foobar2000?", false);
var dui = window.InstanceType;

var g_font2 = gdi.Font("Segoe UI", 20, 0);
var g_font = gdi.Font("Segoe UI", 16, 0);
var g_font3 = gdi.Font("Segoe UI", 12, 0);
//var color = RGB(200,0,0);
var color = dui == 1 ? window.GetColorDUI(2) : RGB(200,0,0);
//var color2 = RGB(0,0,0);
var color2 = dui == 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);

function on_paint(gr){
gr.FillSolidRect(0, 0, window.Width, window.Height, dui ==1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
   gr.DrawString("Timebomb (" + timebombmode + ")", g_font2, color, 0, -80, window.Width, window.Height, 0x11005000);
gr.DrawString( "Timer = " + alarm + " s", g_font2, color2, 0, -40, window.Width, window.Height, 0x11005000);
if(running) {gr.DrawString("Running", g_font, color2, 0, 00, window.Width, window.Height, 0x11005000);}
if(!tbexit){
if(tbpause) {gr.DrawString("Pause mode (mbtn)", g_font, color2, 0, 40, window.Width, window.Height, 0x11005000);}
else {gr.DrawString("Stop mode (mbtn)", g_font, color2, 0, 40, window.Width, window.Height, 0x11005000);}
}
else { gr.DrawString("Exit mode", g_font, color, 0, 40, window.Width, window.Height, 0x11005000);}
gr.DrawString("enable/disable timebomb = lbtn, set timer = wheel", g_font3, color2, 0, 80, window.Width, window.Height, 0x11005000);
}
function on_mouse_lbtn_down(x,y){
   if (!timebombmode){
       timebombmode = true;
       window.NotifyOthers("timebomb", "true"); //true        
   }
   else {
       timebombmode = false;
       window.NotifyOthers("timebomb", ""); // false
   }
window.Repaint();
}

function on_playback_starting(){
   if (timebombmode) {
       running = true;
       g_timer1 = window.CreateTimerTimeout(alarm*1000);
   }
   window.Repaint();
}

function on_mouse_wheel(delta){
for (i = 0; i<delta; i++) {alarm++;}
for (i = 0; i<-delta; i++) {alarm--;}
if(alarm <= 1) { alarm = 1}
window.Repaint();
}

function on_playback_stop(reason) {
running = false;
window.Repaint();
}

function on_mouse_mbtn_down(x, y) {
if(!tbpause) {tbpause = true;}
else {tbpause = false;}
window.Repaint();
}


function on_timer(id) {
if (g_timer1 && id == g_timer1.ID) {
if(tbpause) {fb.Pause();}
else {
fb.Stop();
if(tbexit) {fb.Exit();}
}
running = false;
window.Repaint();
}
}

function on_colors_changed() {
   color = dui ==1 ? window.GetColorDUI(2) : RGB(200,0,0);
   color2 = dui ==1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
   window.Repaint();
}

function on_font_changed() {
   window.Repaint();
}



Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 12. Dezember 2009, 13:18:03
Statistics 2

(http://www.abload.de/img/statistics2_1z1n1.jpg) (http://www.abload.de/image.php?img=statistics2_1z1n1.jpg)


statistische Funktionen:

sum = Summe
max = Maximaler Wert
min = Minimaler Wert
ran = Spannweite (range)
avg = Durchschnitt (average)
dev = Standardabweichung http://de.wikipedia.org/wiki/Standardabweichung


//statistics2 by grimes
//4 digits %date% format required
//fb2k 1.0+, WSH Panel Mod 1.3.0+ required
//DUI/CUI ready


function RGB(r, g, b) {
    return (0xff000000 | (r << 16) | (g << 8) | (b));
}

var avgrating = 0;
var avgplaycount = 0;
var on_playback_time2 = 0;
var on_playback_new_track2 = 0;
var avgtracktime = 0;

var rating = "NaN";
var rating2 = 0;
var rating3 = 0;
var avgrating = 0;
var minrating = 0;
var maxrating = 0;
var ranrating = 0;
var devrating = 0;

var playcount = "NaN";
var playcount2 = 0;
var playcount3 = 0;
var playcount4 = 0;
var avgplaycount = 0;
var minplaycount = 0;
var maxplaycount = 0;
var ranplaycount = 0;
var devplaycount = 0;

var year = 0;
var date = 0;
var difyear = 0;
var date2 = 0;
var avgdate = 0;
var difdate = 0;

var today = 0;
var ar_days = 0;
var ar_years = 0;
var ar_days2 = 0;
var ar_years2 = 0;
var ar_days3 = 0;
var ar_years3 = 0;
var ar_days4 = 0;
var ar_years4 = 0;

var losslesscount = 0;
var lossycount = 0;
var losslessproc = 50;
var lossyproc = 50;

var bitrate = 0;
var bitrate2 = 0;
var bitrate3 = 0;
var avgbitrate = 0;
var minbitrate = 0;
var maxbitrate = 0;
var ranbitrate = 0;
var devbitrate = 0;

var filesize = 0;
var filesize2 = 0;
var avgfilesize = 0;
var bfilesize = 0;
var bfilesize2 = 0;
var bavgfilesize = 0;

var length = 0;
var length_seconds = 0;
var length_seconds2 = 0;
var avglength_seconds = 0;

var days = 0;
var hours = 0;
var minutes = 0;
var seconds = 0;

var playbacktimeperc = 0;
var compressionperc = 0;
var compressionperc2 = 0;
var avgcompressionperc = 0;
var mincompressionperc = 0;
var maxcompressionperc = 0;
var rancompressionperc = 0;

var totaltracks = 0;
var totaltracks2 = 0;
var avgtotaltracks = 0;
var mintotaltracks = 0;
var maxtotaltracks = 0;
var rantotaltracks = 0;

var tracknumber = 0;
var tracknumber2 = 0;
var avgtracknumber = 0;
var mintracknumber = 0;
var maxtracknumber = 0;
var rantracknumber = 0;

function readablizeBytes(bytes) {
    var s = ['bytes', 'kb', 'MB', 'GB', 'TB', 'PB'];
    var e = Math.floor(Math.log(bytes) / Math.log(1024));
    return (bytes / Math.pow(1024, Math.floor(e))).toFixed(2) + " " + s[e];
}

var dui = window.InstanceType;

var g_font = dui == 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
//var color = RGB(200,0,0);
var color = dui == 1 ? window.GetColorDUI(2) : RGB(200,0,0);
//var color2 = RGB(0,0,0);
var color2 = dui == 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);

//global Variables for text field
var DT_TOP = 0x00000000;
var DT_LEFT = 0x00000000;
var DT_CENTER = 0x00000001;
var DT_RIGHT = 0x00000002;
var DT_VCENTER = 0x00000004;
var DT_BOTTOM = 0x00000008;
var DT_WORDBREAK = 0x00000010;
var DT_SINGLELINE = 0x00000020;
var DT_EXPANDTABS = 0x00000040;
var DT_TABSTOP = 0x00000080;
var DT_NOCLIP = 0x00000100;
var DT_EXTERNALLEADING = 0x00000200;
var DT_CALCRECT = 0x00000400;
var DT_NOPREFIX = 0x00000800;
var DT_INTERNAL = 0x00001000;
var DT_EDITCONTROL = 0x00002000;
var DT_PATH_ELLIPSIS = 0x00004000;
var DT_END_ELLIPSIS = 0x00008000;
var DT_MODIFYSTRING = 0x00010000;
var DT_RTLREADING = 0x00020000;
var DT_WORD_ELLIPSIS = 0x00040000;
var DT_NOFULLWIDTHCHARBREAK = 0x00080000;
var DT_HIDEPREFIX = 0x00100000;
var DT_PREFIXONLY = 0x00200000;

function on_paint(gr) {
    gr.FillSolidRect(0, 0, window.Width, window.Height, dui ==1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
    gr.GdiDrawText("on_playback_new_track = " + on_playback_new_track2, g_font, color, 5, 5, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
if (playbacktimeperc === 20 || playbacktimeperc === 40 || playbacktimeperc === 60 || playbacktimeperc === 80 || playbacktimeperc >=90) {
gr.GdiDrawText("playbacktime = " + playbacktimeperc + "%", g_font, color, 5, 25, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
}
else {gr.GdiDrawText("playbacktime = " + playbacktimeperc + "%", g_font, color2, 5, 25, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);}
gr.GdiDrawText("rating = " + rating + ", avg = " + avgrating + ", max = " + maxrating + ", min = " + minrating + ", ran = " + ranrating + ", dev = " + devrating, g_font, color2, 5, 65, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("playcount = " + playcount + ", sum = " + playcount4 + ", avg = " + avgplaycount + ", max = " + maxplaycount + ", min = " + minplaycount + ", ran = " + ranplaycount + ", dev = " + devplaycount, g_font, color2, 5, 85, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("on_playback_time = " + on_playback_time2 + "s ("+ days + "d" + hours + "h" + minutes + "m" + seconds + "s), avg = " + avgtracktime + "s", g_font, color2, 5, 45, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("bitrate = " + bitrate + "kbps, avg = " + avgbitrate + ", max = " + maxbitrate + ", min = " + minbitrate + ", ran = " + ranbitrate + ", dev = " + devbitrate, g_font, color2, 5, 105, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("filesize = " + filesize + ", sum = " + filesize2 + ", avg = " + avgfilesize, g_font, color2, 5, -65, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("tracklength = " + length + " (" + length_seconds + "s), sum = " + length_seconds2 + "s, avg = " + avglength_seconds + "s", g_font, color2, 5, 125, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
gr.GdiDrawText("track number = " + tracknumber + ", sum = " + tracknumber2 + ", avg = " + avgtracknumber + ", max = " + maxtracknumber + ", min = " + mintracknumber + ", ran = " + rantracknumber, g_font, color2, 5, 145, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
gr.GdiDrawText("total tracks = " + totaltracks + ", sum = " + totaltracks2 + ", avg = " + avgtotaltracks + ", max = " + maxtotaltracks + ", min = " + mintotaltracks + ", ran = " + rantotaltracks, g_font, color2, 5, 165, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
//gr.GdiDrawText("current date (year) = " + year, g_font, RGB(80, 80, 80), 0, 20, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("recording year = " + date + " (" + difyear + " years ago)" + ", avg = " + avgdate + " (" + difdate + " years ago)", g_font, color2, 5,185, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);   
    gr.GdiDrawText("added to media library " + ar_days + " days ago (" + Math.floor(ar_years) + " years)", g_font, color2, 5, 205, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("first played " + ar_days2 + " days ago (" + Math.floor(ar_years2) + " years) ", g_font, color2, 5, 225, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("last played " + ar_days3 + " days ago (" + Math.floor(ar_years3) + " years)", g_font, color2, 5, 245, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    if (playcount === 0) {
        gr.GdiDrawText("Never", g_font, color, 240, 225, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
        gr.GdiDrawText("Never", g_font, color, 240, 245, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    }
    gr.GdiDrawText("last modified " + ar_days4 + " days ago (" + Math.floor(ar_years4) + " years)", g_font, color2, 5, 265, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("lossless = " + losslesscount + " (" + losslessproc + "%), lossy = " + lossycount + " (" + lossyproc + "%)", g_font, color2, 5, 285, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
gr.GdiDrawText("lossless compression = " + compressionperc + "%, avg = " + avgcompressionperc + "%, max = " + maxcompressionperc + "%, min = " + mincompressionperc + "%, ran = " + rancompressionperc + "%", g_font, color2, 5, 305, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("active playlist = " + fb.GetPlaylistName(fb.ActivePlaylist) + " (" + fb.ActivePlaylist + "/" + fb.PlaylistCount + ")", g_font, color2, 5, 325, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("playing playlist = " + fb.GetPlaylistName(fb.PlayingPlaylist) + " (" + fb.PlayingPlaylist + "/" + fb.PlaylistCount + ")", g_font, color2, 5, 345, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
}



function on_playback_time(time) {
    on_playback_time2++;
var dt = new Date(on_playback_time2 * 1000);
    seconds = dt.getUTCSeconds();
    minutes = dt.getUTCMinutes();
    hours = dt.getUTCHours();
    days = Math.floor(on_playback_time2 / 86400);
    if (on_playback_new_track2 >= 1) {
        avgtracktime = Math.round(on_playback_time2 / on_playback_new_track2);
    }
playbacktimeperc = fb.PlaybackTime*100/fb.PlaybackLength;
playbacktimeperc = Math.round(playbacktimeperc);
   
window.Repaint();
}



function on_playback_new_track() {
    on_playback_new_track2++;

    rating = fb.TitleFormat("%rating%");
    rating = rating.Eval();
    rating = parseInt(rating);
    rating2 += rating;
rating3 += (rating * rating);
if (on_playback_new_track2 === 1) {
minrating = rating;
maxrating = rating;
}
avgrating = rating2 / on_playback_new_track2;
avgrating = Math.round(avgrating * 100) / 100;
minrating = Math.min(minrating,rating);
maxrating = Math.max(maxrating,rating);
ranrating = maxrating - minrating;
devrating = Math.sqrt((on_playback_new_track2 * rating3) - (rating2 * rating2)) / on_playback_new_track2;
    devrating = Math.round(devrating * 100) / 100;

    playcount = fb.TitleFormat("%play_count%");
    playcount = playcount.Eval();
    playcount = parseInt(playcount);
    playcount2 += playcount;
playcount4 += playcount;
    playcount3 += (playcount * playcount);
if (on_playback_new_track2 === 1) {
minplaycount = playcount;
maxplaycount = playcount;
}
avgplaycount = playcount4 / on_playback_new_track2;
avgplaycount = Math.round(avgplaycount * 100) / 100;
minplaycount = Math.min(minplaycount,playcount);
maxplaycount = Math.max(maxplaycount,playcount);
ranplaycount = maxplaycount - minplaycount;
devplaycount = Math.sqrt((on_playback_new_track2 * playcount3) - (playcount2 * playcount2)) / on_playback_new_track2;
    devplaycount = Math.round(devplaycount * 100) / 100;

    date = fb.TitleFormat("%date%");
    date = date.Eval();
    date = parseInt(date);
    dt = new Date();
    year = dt.getFullYear();
    difyear = year - date;
    date2 = date2 + date;
    if (on_playback_new_track2 >= 2) {
        avgdate = date2 / on_playback_new_track2;
        avgdate = Math.round(avgdate);
        difdate = year - avgdate;
    }

    today = new Date();
    var fpy = fb.TitleFormat("$year(%added%)").Eval();
    var fpm = fb.TitleFormat("$sub($month(%added%),1)").Eval();
    var fpd = fb.TitleFormat("$day_of_month(%added%)").Eval();
    var fday = new Date(fpy, fpm, fpd);
    var one_day = 1000 * 60 * 60 * 24;
    if (fday > 0) {
        ar_days = Math.floor((today.getTime() - fday.getTime()) / one_day);
        ar_years = ar_days / 365;
    }
    fpy = fb.TitleFormat("$year(%first_played%)").Eval();
    fpm = fb.TitleFormat("$sub($month(%first_played%),1)").Eval();
    fpd = fb.TitleFormat("$day_of_month(%first_played%)").Eval();
    fday = new Date(fpy, fpm, fpd);
    one_day = 1000 * 60 * 60 * 24;
    if (fday > 0) {
        ar_days2 = Math.floor((today.getTime() - fday.getTime()) / one_day);
        ar_years2 = ar_days2 / 365;
    } else {
        ar_days2 = 0;
    }

    fpy = fb.TitleFormat("$year(%last_played%)").Eval();
    fpm = fb.TitleFormat("$sub($month(%last_played%),1)").Eval();
    fpd = fb.TitleFormat("$day_of_month(%last_played%)").Eval();
    fday = new Date(fpy, fpm, fpd);
    one_day = 1000 * 60 * 60 * 24;
    if (fday > 0) {
        ar_days3 = Math.floor((today.getTime() - fday.getTime()) / one_day);
        ar_years3 = ar_days3 / 365;
    } else {
        ar_days3 = 0;
    }

    fpy = fb.TitleFormat("$year(%last_modified%)").Eval();
    fpm = fb.TitleFormat("$sub($month(%last_modified%),1)").Eval();
    fpd = fb.TitleFormat("$day_of_month(%last_modified%)").Eval();
    fday = new Date(fpy, fpm, fpd);
    one_day = 1000 * 60 * 60 * 24;
    if (fday > 0) {
        ar_days4 = Math.floor((today.getTime() - fday.getTime()) / one_day);
        ar_years4 = ar_days4 / 365;
    } else {
        ar_days4 = 0;
    }

    var lossless = fb.Titleformat("$info(encoding)").Eval();
    if (lossless === "lossless") {
        losslesscount++;
    } else {
        lossycount++;
    }

    losslessproc = Math.round(losslesscount * 1000 / (lossycount + losslesscount)) / 10;
    lossyproc = Math.round(lossycount * 1000 / (lossycount + losslesscount)) / 10;

var bitratex = fb.TitleFormat("%bitrate%").Eval();
bitratex = parseInt(bitratex);
var samplerate = fb.TitleFormat("%samplerate%").Eval();
samplerate = parseInt(samplerate);
var bitspersample = fb.TitleFormat("$info(bitspersample)").Eval();
bitspersample = parseInt(bitspersample);
var channels = fb.TitleFormat("$info(channels)").Eval();
channels = parseInt(channels);
compressionperc = (bitratex*100000)/(samplerate*bitspersample*channels);
compressionperc = Math.round(compressionperc);
compressionperc2 = compressionperc2 + compressionperc;
    avgcompressionperc = compressionperc2 / on_playback_new_track2;
    avgcompressionperc = Math.round(avgcompressionperc * 100) / 100;
if (on_playback_new_track2 === 1) {
mincompressionperc = compressionperc;
maxcompressionperc = compressionperc;
}
mincompressionperc = Math.min(mincompressionperc,compressionperc);
maxcompressionperc = Math.max(maxcompressionperc,compressionperc);
rancompressionperc = maxcompressionperc - mincompressionperc;

    bitrate = fb.Titleformat("%bitrate%").Eval();
    bitrate = parseInt(bitrate);
    bitrate2 += bitrate;
    avgbitrate = bitrate2 / on_playback_new_track2;
    avgbitrate = Math.round(avgbitrate * 100) / 100;
if (on_playback_new_track2 === 1) {
minbitrate = bitrate;
maxbitrate = bitrate;
}
bitrate3 += (bitrate * bitrate);
minbitrate = Math.min(minbitrate,bitrate);
maxbitrate = Math.max(maxbitrate,bitrate);
ranbitrate = maxbitrate - minbitrate;
devbitrate = Math.sqrt((on_playback_new_track2 * bitrate3) - (bitrate2 * bitrate2)) / on_playback_new_track2;
    devbitrate = Math.round(devbitrate * 100) / 100;


    bfilesize = fb.Titleformat("%filesize%").Eval();
    bfilesize = parseInt(bfilesize);
    filesize = readablizeBytes(bfilesize);
    bfilesize2 += bfilesize;
    filesize2 = readablizeBytes(bfilesize2);
    bavgfilesize = bfilesize2 / on_playback_new_track2;
    bavgfilesize = Math.round(bavgfilesize * 100) / 100;
    avgfilesize = readablizeBytes(bavgfilesize);

length = fb.Titleformat("%length%").Eval();
    length_seconds = fb.Titleformat("%length_seconds%").Eval();
    length_seconds = parseInt(length_seconds);
    length_seconds2 = length_seconds2 + length_seconds;
    avglength_seconds = length_seconds2 / on_playback_new_track2;
    avglength_seconds = Math.round(avglength_seconds * 100) / 100;
    avgfilesize = readablizeBytes(bavgfilesize);

totaltracks = fb.Titleformat("%totaltracks%").Eval();
totaltracks = parseInt(totaltracks,10);
totaltracks2 += totaltracks;
avgtotaltracks = totaltracks2 / on_playback_new_track2;
avgtotaltracks = Math.round(avgtotaltracks * 100) / 100;
if (on_playback_new_track2 === 1) {
mintotaltracks = totaltracks;
maxtotaltracks = totaltracks;
}
mintotaltracks = Math.min(mintotaltracks,totaltracks);
maxtotaltracks = Math.max(maxtotaltracks,totaltracks);
rantotaltracks = maxtotaltracks - mintotaltracks;

tracknumber = fb.Titleformat("%tracknumber%").Eval();
tracknumber = parseInt(tracknumber,10);
tracknumber2 += tracknumber;
avgtracknumber = tracknumber2 / on_playback_new_track2;
avgtracknumber = Math.round(avgtracknumber * 100) / 100;
if (on_playback_new_track2 === 1) {
mintracknumber = tracknumber;
maxtracknumber = tracknumber;
}
mintracknumber = Math.min(mintracknumber,tracknumber);
maxtracknumber = Math.max(maxtracknumber,tracknumber);
rantracknumber = maxtracknumber - mintracknumber;

    window.Repaint();
}


function on_playback_stop() {
    ar_days = 0;
    ar_days2 = 0;
    ar_days3 = 0;
    ar_days4 = 0;
    ar_years = 0;
    ar_years2 = 0;
    ar_years3 = 0;
    ar_years4 = 0;
    date = 0;
    difyear = 0;
    playcount = "NaN";
    rating = "NaN";
bitrate = 0;
filesize = 0;
length = 0;
length_seconds = 0;
playbacktimeperc = 0;
compressionperc = 0;
tracknumber = 0;
totaltracks = 0;
    window.Repaint();
}



function on_item_played() {
    playcount++;
    playcount4++;

if (on_playback_new_track2 === 1) {
minplaycount = playcount;
maxplaycount = playcount;
}
avgplaycount = playcount4 / on_playback_new_track2;
avgplaycount = Math.round(avgplaycount * 100) / 100;
minplaycount = Math.min(minplaycount,playcount);
maxplaycount = Math.max(maxplaycount,playcount);
ranplaycount = maxplaycount - minplaycount;

ar_years3 = 0;
ar_days3 = 0;
    window.Repaint();
}

function on_playlist_switch() {
    window.Repaint();   
}

function on_colors_changed() {
    color = dui ==1 ? window.GetColorDUI(2) : RGB(200,0,0);
    color2 = dui ==1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
    window.Repaint();
}

function on_font_changed() {
    g_font = dui == 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
    window.Repaint();
}


ADD: lossless compression in %
ADD: track number, total tracks
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Bubi in 12. Dezember 2009, 17:59:42
Was isn dein Average Rating im Screenshot von #25, grimes?
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 12. Dezember 2009, 18:13:09
Das ist einfach:
Hat der erste gespielte song 5 sterne und der zweite nur 3 sterne, so ist der Durchschnitt (average) 4 Sterne.
Im Beispiel von #24 beträgt die durchschnittliche Anzahl der Sterne 4,6 (gemittelt über 15 songs)
Ich interpretiere: ich habe saugeile Musik gehört :D
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Bubi in 12. Dezember 2009, 19:04:29
Das ist der Durchschnitt der gespielten Songs?

Schade :(
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 12. Dezember 2009, 20:16:38
Seit WSH Panel Mod 1.2.1 werden global callbacks asynchron angerufen.

ZitatCHG: Global callbacks are invoked asynchronously now.

Dies ermöglicht es folgende Skripte zu vereinfachen:

Seek


//Seek by grimes
//fb2k 1.0+, WSH Panel Mod 1.3.0+ required
//DUI/CUI ready


function RGB(r,g,b){ return (0xff000000|(r<<16)|(g<<8)|(b)); }

var seek = 10;
var delta = 0;
var dui = window.InstanceType;

var g_font = gdi.Font("Segoe UI", 16, 0);
var g_font2 = gdi.Font("Segoe UI", 20, 0);
var g_font3 = gdi.Font("Segoe UI", 12, 0);
//var color = RGB(200,0,0);
var color = dui == 1 ? window.GetColorDUI(3) : RGB(200,0,0);
//var color2 = RGB(0,0,0);
var color2 = dui == 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);

function on_paint(gr){
gr.FillSolidRect(0, 0, window.Width, window.Height, dui ==1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
    gr.DrawString("Seek", g_font2, color, 0, -80, window.Width, window.Height, 0x11005000);
gr.DrawString("Ahead by " + seek + " second(s).", g_font, color2, 0, -40, window.Width, window.Height, 0x11005000);
gr.DrawString("run = lbtn, set seektime = wheel", g_font3, color2, 0, 0, window.Width, window.Height, 0x11005000);
}
function on_mouse_lbtn_down(x,y){
if (!fb.IsPlaying){
fb.Play();
}
for (i = 0; i<seek; i++) { fb.RunMainMenuCommand("Ahead by 1 second"); }
for (i = 0; i<-seek; i++) { fb.RunMainMenuCommand("Back by 1 second"); }
}

function on_mouse_move(x,y){

}

function on_mouse_wheel(delta){
for (i = 0; i<delta; i++) { seek++;}
for (i = 0; i<-delta; i++) {
seek--;
}
window.Repaint();
}

function on_playback_stop(reason) {
//seek = 10;
window.Repaint();
}

function on_colors_changed() {
    color = dui ==1 ? window.GetColorDUI(2) : RGB(200,0,0);
    color2 = dui ==1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
    window.Repaint();
}

function on_font_changed() {
    window.Repaint();
}




Loop


//Loop by grimes
//fb2k 1.0+, WSH Panel Mod 1.3.0+ required
//DUI/CUI ready


function RGB(r, g, b) {
    return (0xff000000 | (r << 16) | (g << 8) | (b));
}

var delta = 0;
var time = 0;
var test = false;
var start = window.GetProperty("Start [s]: ", 0);
var end = window.GetProperty("End [s]: ", 10);
var preview = window.GetProperty("Preview mode? ", false);
var loop = end - start;
var loopmode = window.GetProperty("Loop/Preview enabled?", false);
var loopcount = 0;
var dui = window.InstanceType;

var g_font = gdi.Font("Segoe UI", 16, 0);
var g_font2 = gdi.Font("Segoe UI", 20, 0);
var g_font3 = gdi.Font("Segoe UI", 12, 0);
//var color = RGB(200,0,0);
var color = dui == 1 ? window.GetColorDUI(2) : RGB(200,0,0);
//var color2 = RGB(0,0,0);
var color2 = dui == 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);

function on_paint(gr) {
    gr.FillSolidRect(0, 0, window.Width, window.Height, dui ==1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
    if (loopmode) {
        gr.DrawString("Loop (true) " + loopcount + " x", g_font2, color, 0, -80, window.Width, window.Height, 0x11005000);
    }
    else {
        gr.DrawString("Loop (false) ", g_font2, color, 0, -80, window.Width, window.Height, 0x11005000);
    }
    gr.DrawString("Double click here to enable/disable loop", g_font3, color, 0, -40, window.Width, window.Height, 0x11005000);
    gr.DrawString("Start: " + start + " s  Loop: " + loop + " s  End: " + end + " s", g_font, color2, 0, 0, window.Width, window.Height, 0x11005000);
    if (preview){gr.DrawString("Preview mode (mbtn)", g_font, color2, 0, +40, window.Width, window.Height, 0x11005000);}
else {gr.DrawString("Loop mode (mbtn)", g_font, color2, 0, +40, window.Width, window.Height, 0x11005000);}
gr.DrawString("start++ = key, end++/end - - = wheel", g_font3, color2, 0, +80, window.Width, window.Height, 0x11005000);
}

function on_mouse_lbtn_dblclk(x, y) {
if (!loopmode) {
loopmode = true;
            window.NotifyOthers("loop", "true"); //true
}
else {
loopmode = false;
            window.NotifyOthers("loop", ""); // false
}
window.Repaint();
}

function on_mouse_mbtn_down(x, y) {
if(!preview) {preview = true;}
else {preview = false;}
window.Repaint();
}

function on_playback_new_track(metadb) {
if (loopmode) {
for (var i = 0; i < start; i++) {
fb.RunMainMenuCommand("Ahead by 1 second");
}
}
window.Repaint();
}


function on_key_down(vkey) {
    start++;
    if (start >= end) {
        end = start + 1;
    }
loop = end - start;
    window.Repaint();
}


function on_mouse_wheel(delta) {
    for (i = 0; i < delta; i++) {
end++;
loop = end - start;
    }
    for (i = 0; i < -delta; i++) {
        end--;
loop = end - start;
if (end <= start) {
start = end - 1;
loop = 1;

if (end <= 1 && start <= 0) {
start = 0;
end = 1;
loop = 1;
}
}
    }
    window.Repaint();
}



function on_playback_stop(reason) {
    test = false;
loopcount = 0;
    window.Repaint();
}



function on_playback_time(time) {
    time = Math.round(fb.PlaybackTime);
    if ((time > end || time < end - loop) &&  loopmode) {
        fb.play();
    }
    if (time >= end) {
        test = true;
    } else {
        test = false;
    }
if (test && loopmode) {
loopcount++;
window.Repaint();
for (i = 0; i < loop; i++) {
fb.RunMainMenuCommand("Back by 1 second");
}
if (preview) {
fb.Next();
loopmode = true;
for (var i = 0; i < start; i++) {
                fb.RunMainMenuCommand("Ahead by 1 second");
            }
}
}
window.Repaint();
}

function on_colors_changed() {
    color = dui ==1 ? window.GetColorDUI(2) : RGB(200,0,0);
    color2 = dui ==1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
    window.Repaint();
}

function on_font_changed() {
    window.Repaint();
}




Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: TomPro in 12. Dezember 2009, 20:22:18
[CUI]

So, habe wieder ein paar kleine Helferlein, welche man in sein Script einbauen kann.

1. Zero Pading zum auffüllen mit führenden Nullen:

//----------------------------------------------------------------------------
//------   Zero Padding
function ZPad() {
var V, Z, i;
var VStr, ZStr, PStr;

Z = 2;
switch (arguments.length) {
// fall-thru
case 2:; Z = Math.abs(parseInt(arguments[1]));
case 1:; V = parseFloat(arguments[0]); break;
default:; return "00";
}
ZStr = "";
for (i = 1; i <= Z; i++) ZStr += "0";
VStr = V.toString();
PStr = (VStr.length < Z) ? ZStr.substr(0,Z - VStr.length): "";
VStr = PStr + VStr;
return VStr;
}



Kurzbeschreibung:

Wird KEIN Parameter übergeben erhällt man als Antwort "00"
Wird nur EIN Parameter übergeben wird auf eine Zweistellige Zahl aufgefüllt also aus "1" mach "01". Größere Zahlen werden nicht angetastet also "1258" bleibt "1258"
Werden ZWEI Parameter übergeben so ist der erste Parameter die Zahl, und der zweite Parameter (durch ein Komma getrennt) auf wieviel Stellen aufgefüllt werden soll. Also aus " 1246,8" wird "00001246".



2. Cut Floating Point Number um die Kommazahlen zu begrenzen

//----------------------------------------------------------------------------
//------   Cut Floating Point Number
function CutPointNumber() {
var V, Z;

Z = 2;
switch (arguments.length) {
// fall-thru
case 2:; Z = Math.abs(parseInt(arguments[1]));
case 1:; V = parseFloat(arguments[0]); break;
default:; V = 0;
}
return (Math.round(Math.pow(10,Z) * V)) / Math.pow(10,Z);
}



Kurzbeschreibung:

Wird KEIN Parameter übergeben erhällt man als Antwort "0"
Wird nur EIN Parameter übergeben wird auf eine Zahl zweistellig hinter dem Komma gerundet also aus "125.4872358" mach "125.49", aber "125.4" bleibt "125.4".
Werden ZWEI Parameter übergeben so ist der erste Parameter die Zahl, und der zweite Parameter (durch ein Komma getrennt) auf wieviel Stellen hinterm Komma gerundet werden soll. Also aus "124.356782496,6" wird "124.356782".




3. Fix Floating Point Number zum Auffüllen oder Begrenzen der Nachkommazahlen

//----------------------------------------------------------------------------
//------   Fix Floating Point Number
function FixPointNumber() {
var V, Z, i;
var VStr, ZStr, PStr;

Z = 2;
switch (arguments.length) {
// fall-thru
case 2:; Z = Math.abs(parseInt(arguments[1]));
case 1:; V = parseFloat(arguments[0]); break;
default:;  return "0.00";
}
if (Z == 0) return Math.round(V).toString();
ZStr = "";
for (i = 1; i <= Z; i++) ZStr += "0";
V = CutPointNumber(V,Z)
VStr = V.toString();
if (VStr.lastIndexOf(".") == -1) {
VStr += "." + ZStr;
} else {
PStr = ZStr.substr(0,Z - (VStr.length - VStr.lastIndexOf(".") - 1));
VStr += PStr;
}
return VStr;
}




Kurzbeschreibung:

Wird KEIN Parameter übergeben erhällt man als Antwort "0.00"
Wird nur EIN Parameter übergeben wird auf eine Zahl zweistellig hinter dem Komma gerundet oder mit Nullen aufgefüllt also aus "125.4872358" mach "125.49", und aus "125.4" mach "125.40".
Werden ZWEI Parameter übergeben so ist der erste Parameter die Zahl, und der zweite Parameter (durch ein Komma getrennt) auf wieviel Stellen hinterm Komma gerundet oder aufgefüllt werden soll. Also aus "124.356782496,6" wird "124.356782" oder aus "176.235,6" wird "176.235000".

Viel Spass beim Einbauen.

TomPro
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: TomPro in 12. Dezember 2009, 20:35:54
[CUI]

Und noch einer zum Ersetzen verbotener Zeichen im Folder bzw. Filename

//----------------------------------------------------------------------------
//------   Repacing forbidden Charakter in Filestrings
//---------   Repacing for Filname
function ReplaceForFilename(RawName){
ReplaceForFolder(RawName)
RawName = RawName.replace(/\\/g,"_");
return RawName;
}

//---------   Repacing for Foldername
function ReplaceForFolder(RawName){
RawName = RawName.replace(/</g,"_");
RawName = RawName.replace(/>/g,"_");
RawName = RawName.replace(/:/g,"_");
RawName = RawName.replace(/\|/g,"_");
RawName = RawName.replace(/\?/g,"_");
RawName = RawName.replace(/\*/g,"_");
RawName = RawName.replace(/\"/g,"_");
RawName = RawName.replace(/\//g,"_");
return RawName;
}


Gruß TomPro
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 12. Dezember 2009, 23:52:14
@TomPro
Zum Thema "Floating Point":
Probier doch einfach mal den Zusatz toFixed(n) also z. B. fb.Volume.toFixed(2) ;)
Aber schön, deine Mühen zu verfolgen :)
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: TomPro in 13. Dezember 2009, 14:53:09
Das hat man dann davon, wenn mann eine Sprache nicht lernt sondern sich nur seine  Bedürfnisse zusammen klebt und sich der Rest auf Versuch und Irtum stützt.

Danke tedgo

Gruß TomPro
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: aeitscher in 16. Dezember 2009, 15:06:53
@ tompro

eine supergeschichte, dein 1st strike. allerdings hakt es manchmal aus. wovon ist es abhängig, dass das script greift und woran könnte es liegen, dass es bei manchen alben zu script error führt?
ich würde es gern für alle alben verwenden und fehler abstellen, hab nur keine idee, wonach ich suchen kann...
dank dir!

Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: TomPro in 17. Dezember 2009, 00:50:02
Da mein kompletter 1st Srike ja noch gar nicht fertig ist, hatte ich hier nur einige Scriptbeispiele daraus eingestellt. Du müstest jetzt etwas genauer werden welche Du genutzt hast und wie sich der Fehler Zeigt (Auszug aus der Konsole).

@ tedgo

Eventuell sollten Frage und mögliche Antwort in einen gesonderten Thread verschoben werden, damit hier weiter Scriptbeispiele gepostet werden können.

Gruß TomPro
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: aeitscher in 17. Dezember 2009, 02:43:06
um den hier gehts: http://foobar-users.de/index.php?topic=2000.msg12132#msg12132

ich hab da hin und wieder ein weißes panel... mit dem script error - schriftzug. console-auszug hab ich dahingehend noch nicht eingeholt. dass die ganze geschichte noch nicht fertig ist, fällt im übrigen gar nicht auf. möglicherweise "erregt" mich einfach die oberfäche und die idee, dass mein statistikwahn "befriedigt" werden könnte.  :D

will mal beobachten, was sich die nächsten tage zeigt und dann ggf. einen console-auszug posten.
besten dank zunächst!!

Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: TomPro in 17. Dezember 2009, 06:02:11
Ich schau mir mein altes Script noch mal an (hab gerade meine Nachtschicht für Heute zu Ende) aber ich bin gerade bei einer sehr viel eleganteren Lösung für das gleiche Problem. Tippe mal nach Weihnachten ist die neue Lösung Spruchreif.

Gruß TomPro
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: aeitscher in 17. Dezember 2009, 22:47:31
Error: WSH Panel Mod (GUID: 7D50E649-B495-4AA5-BF78-599CC3C11D3F): Laufzeitfehler in Microsoft JScript:
Objekt erforderlich
Ln: 117, Col: 2
<no source text available>
Opening track for playback: "X:\...\...\Panzerballett - 2005 - Panzerballett\06. Panzerballett - Abkrassen.mp3"

dieses steht inner console.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: TomPro in 18. Dezember 2009, 05:41:31
[CUI]

Dort liegt die Routine für die Anpassung von Cover-Ratio (Länge mal Breite) an das Fenster-Ratio.

Ich gehe mal davon aus, das du dort im Ordner kein Cover abgelegt hast, und das Du am Anfang des Scrits bei:


//----------------------------------------------------------------------------
//------ Global
//--------- Variable
var INI_File = fb.FoobarPath + "1stStrike\\1stStrike.ini" // Path and Name of the INI Inifile
var NC_Cover = fb.FoobarPath + "1stStrike\\IMG\\NoCover.png" // Path and Name of a No Cover Image
var File_Path = fb.TitleFormat("$directory_path(%path%)") // Path  of a played File


den Pfad für ein NO-COVER Cover nicht angepasst hast, bzw. du kein NO-COVER Cover hast.

Gruß TomPro
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: aeitscher in 18. Dezember 2009, 13:17:33
grundsätzlich befinden sich bei mir alle cover als album_art im jeweiligen ordner. habe nun auch (hatte in der tat kein nocover.png) im 1ststrike-ordner einen unterordner img angelegt und ein nocover.png eingefügt.
dennoch:


WSH Panel Mod (GUID: 7D50E649-B495-4AA5-BF78-599CC3C11D3F): initliased in 0.0000026 s
Error: WSH Panel Mod (GUID: 7D50E649-B495-4AA5-BF78-599CC3C11D3F): Laufzeitfehler in Microsoft JScript:
Objekt erforderlich
Ln: 117, Col: 2
<no source text available>


auch nach neustart von foobar hat sichs so nicht erledigt.

Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: aeitscher in 18. Dezember 2009, 17:47:18
sachema, könnte es unter umständen daran liegen, dass das cover im tag eingebettet sein muss?
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: TomPro in 19. Dezember 2009, 00:42:16
[CUI]

Zum Verständniss des Scripts:

Wenn Du bei laufendem Script, also kein Error, mit der linken Maustaste auf das WSH Panel klikst, erhällst Du ein Menue. Im oberen Drittel kannst Du zwischen den vorhandenen Bilder (nicht ausgegraut) wählen welches Du Aktuell sehen möchtest. Im mittleren Drittel kannst Du bestimmen auf welches Bild sich foobar wieder bei einem Neustart einstellen soll. Das untere Drittel ist für die Einstellungen dea Albumratings.

Die Tatsache, das nicht darstellbare Bilder im Menue ausgegraut werden zeigt, das die üblichen verdächtigen vor dem Anzeigen auf vorhanden sein gecheckt werden, auch das embedded Image. Danach erfollgt eigentlich eine Sicherheitsroutine die dafür sorgt, das wenn ein gewünschtes Bild nicht vorhanden ist automatisch auf ein vorhandenes, bis eben hin zum No-Cover-Image, gewechselt wird. Dafür verantwortlich ist der Funktionsaufruf CheckImage(Item) (die Funtion ab Zeile 138). Hier wird in dem Array ArtCheck[x] (x steht für Front: 1, Back: 2, Disc: 3, Icon: 4, Artist: 5, Embedded: 6) eine 1 für vorhanden und eine 0 für nicht vorhanden hinterlegt und in ArtCheck[0] die Nummer des leztmöglichen Bildes in der Rheienfolge 5-4-3-2-1-6 (also embedded zum Schluß) und wenn kein Bild vorhanden ist, DANN die 0 für das No-Cover-Cover.

In der Funktion SelectImage() (ab Zeile 156) wird dann der Variablen g_img nun das Bild zugewiesen welches zur Anzeige gelangen soll und aus dieser Funktion wird dann die Routine ab Zeile 113 zur Ermittlung des Ratios angestoßen. Der Funktionsaufruf GetRatio(image) weist der Variablen image das Cover zu dessen Breite in Zeile 117 mittels image.Width; ermittelt wird. Und hier stolpert ja das Script bei Dir.

Du könntest jetzt mittels dem Befehl fb.trace(x) an den entsprechenden Stellen für x die Variable eintragen und dann in der Konsole Dir anzeigen lassen um so rückwerts den Punkt zu finden wo das Script bei Dir hakt, oder warte noch ein weilchen, das neue Script steht (hoffentlich) kurz vor der Vollendung, auch wenn dadurch der 1st Srike leider immer noch nicht fertig ist, aber ein Bausteinchen weiter, welches ich dann hier schon wieder Posten werde.

Gruß TomPro

Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: aeitscher in 19. Dezember 2009, 01:22:06
uiuiui tompro, danke für die sehr ausfühlriche erläuterung des ganzen, wenngleich diese für mich (ehrlich gesagt) böhmische dörfer bedeuten.

und: natürlich hatte ich trottel alles auf embedded cover gesetzt --> also kein wunder.

und: ich warte gern!

vielen dank und gute nacht denn mal.



Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: TomPro in 25. Dezember 2009, 14:08:32
[CUI]

Mein Hirn springt gerade etwas hin und her, aufgrund meiner Versuche mehrer Audiostreams in foobar gleichzeitig zu erzeugen (NOCH NICHT FÜR DJ-FUNKTIONEN, sondern) um als Weckerfunktionen kleine Klingelgeräusche einzubinden (erste Tests wahren SEHR erfolgreich) habe ich schon mal eine Funktion Fertig, die den Eigentlichen Audiostream (Playlist) auf einen bestimmten Wert Faden kann und dabei den Wert vor dem Faden als Argument zurückgiebt, um diese Lautstärke später wieder Zurückzustellen.

Hier das Script

//----------------------------------------------------------------------------
//---   Script for WSH Panel for foobar2000
//---
//---   Windows Scripting Host Panel
//---   Modded by T.P. Wang
//---
//---   To use since Vers. 1.0.0
//----------------------------------------------------------------------------
//---   1stStrike (by TomPro) v 0.1.0
//----------------------------------------------------------------------------

//----------------------------------------------------------------------------
//------   FadeTo
function FadeTo () {
var VolMem, VolSet, Speed, Speed1, Speed2, Speed3, Step;

// Set Standard-Value
VolMem = fb.Volume;
VolSet = 100;
Speed = 15;

// Get Value
switch (arguments.length) {
// fall-thru
default:;
case 2:; Speed = (!isNaN(arguments[1])) ? Math.abs(arguments[1]) : 15;
case 1:; VolSet = (!isNaN(arguments[0])) ? Math.abs(arguments[0]) : 100; break;
case 0:; break;
}

// Check Value Range
VolSet = (VolSet <= 0) ? 0 : (VolSet >= 100) ? -100 : VolSet * -1;
Speed = (Speed <= 1) ? 0.01 : (Speed >= 100) ? 1 : Speed / 100;
Speed1 = Speed / 600;
Speed2 = Speed / 200;
Speed3 = Speed;
Speed = (VolMem < -40) ? Speed3 : (VolMem < -10) ? Speed2 : Speed1

// Check Direction and Fade
if (VolMem > VolSet) {
for (Step = VolMem; Step > VolSet; Step = Step - Speed) {
if (Step > 0 || Step < -100) break;
Speed = (Step < -40) ? Speed3 : (Step < -10) ? Speed2 : Speed1
fb.Volume = Step;
}
} else {
for (Step = VolMem; Step < VolSet; Step = Step + Speed) {
if (Step > 0 || Step < -100) break;
Speed = (Step < -40) ? Speed3 : (Step < -10) ? Speed2 : Speed1
fb.Volume = Step;
}
}

return VolMem;
}


ich kann bis zu 2 Parameter übergeben.
Der erste ist der Wert auf den gefadet werden soll (wenn kein Parameter angegeben wird wird auf -100dB gefadet).
Der zweite Wert ist die Geschwindigkeit, wird diese weggelassen so wird hier der Wert auf 15 gesetzt. Sinnvolle Einstellungen sind, je nach Anwendung ca. zwischen 2 und 30 wohingegen mögliche Einstellungen zwischen 1 und 100 liegen. kleine Zahl = Langsam.

Viel Spass beim Experimentieren.

Gruß TomPro

Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: TomPro in 27. Dezember 2009, 19:45:38
[CUI]

So, jetzt spricht foobar auch zu uns.

zunächst de Code:

//----------------------------------------------------------------------------
//---   Script for WSH Panel for foobar2000
//---
//---   Windows Scripting Host Panel
//---   Modded by T.P. Wang
//---
//---   To use since Vers. 1.0
//----------------------------------------------------------------------------
//---   1stStrike - Speech API (by TomPro)
//----------------------------------------------------------------------------

//----------------------------------------------------------------------------
//------   Speech API
var SPF = {
Default : 0,
Async : 1,
PurgeBeforeSpeak : 2,
IsFilename : 4,
IsXML : 8,
IsNotXML : 16,
PersistXML : 32,
NlpMask : 64,
NlpSpeakPunc : 64,
VoiceMask : 127,
UnusedFlags : -128
}

function SapiPlayWav() {
var SoundFile, Flag;

// Set Standard-Value
SoundFile = fb.FoobarPath + "1stStrike\\snd\\ding.wav";
Flag = SPF.Default;

// Get Value
switch (arguments.length) {
// fall-thru
case 2:; Flag = parseInt(arguments[1]);
case 1:; SoundFile = String(arguments[0]); break;
default:;
}

// Check Value
if (isNaN(Flag)) Flag = SPF.Default;
if (!FSO.FileExists(SoundFile)) {
if (fb.IsPlaying && !fb.IsPaused) {
fb.Pause();
SapiFnF(SoundFile);
fb.Play();
} else {
SapiFnF(SoundFile);
}
return;
}

// operate
var SapiVoiceObj = new ActiveXObject("SAPI.SpVoice");
var SapiFileObj = new ActiveXObject("SAPI.SpFileStream.1");
SapiFileObj.Open(SoundFile);
SapiVoiceObj.Speakstream(SapiFileObj, Flag);
delete SapiFileObj;
delete SapiVoiceObj;
}

function SapiSpeakTextFile() {
var TextFile, Flag;

// Set Standard-Value
TextFile = fb.FoobarPath + "1stStrike\\TestFiles\\__SAPI Test.txt";

// Get Value
switch (arguments.length) {
// fall-thru
case 2:; Flag = parseInt(arguments[1]);
case 1:; TextFile = String(arguments[0]); break;
default:;
}

// Check Value
if (isNaN(Flag)) Flag = SPF.Default;
if (!FSO.FileExists(TextFile)) {
if (fb.IsPlaying && !fb.IsPaused) {
fb.Pause();
SapiFnF(TextFile);
fb.Play();
} else {
SapiFnF(TextFile);
}
return;
}

// operate
var SapiVoiceObj = new ActiveXObject("SAPI.SpVoice");
SapiVoiceObj.Speak(TextFile, Flag | SPF.IsFilename);
delete SapiVoiceObj;
}

function SapiSpeakText() {
var Text, Flag;

// Set Standard-Value
Text = "No Text to Speak";
Flag = SPF.Default;

// Get Value
switch (arguments.length) {
// fall-thru
case 2:; Flag = parseInt(arguments[1]);
case 1:; Text = String(arguments[0]); break;
default:;
}

// Check Value
if (isNaN(Flag)) Flag = SPF.Default;

// operate
var SapiVoiceObj = new ActiveXObject("SAPI.SpVoice");
SapiVoiceObj.Speak(Text, SPF.Default);
delete SapiVoiceObj;
}

function SapiFnF(FileName) {
SapiSpeakText("File ");
SapiSpeakText(FileName.substring(FileName.lastIndexOf("\\") + 1));
SapiSpeakText(" not found!");
}

function SapiTest(Type) {
SapiPlayWav();
switch (Type) {
default:;
SapiSpeakText("Welcome to TomPro's 1st Strike!");
break;
case 1:;
SapiSpeakText("This is a Speechtest,, Dies ist ein Sprechtest.");
break;
case 2:;
SapiSpeakTextFile();
break;
case 3:;
SapiSpeakText("This is a Speechtest,, Dies ist ein Sprechtest.");
SapiPlayWav();
SapiSpeakTextFile(fb.FoobarPath + "1stStrike\\TestFiles\\__SAPI Test.txt");
break;
}
SapiPlayWav();
}


Wichtig, bei längeren Texten kann es zu Timeoutproblemen kommen, deswegen gegebenenfalls in den Preferences die Zeit auf 0 oder eine entsprechend hohe Zahl stellen.

Zusammen mit dem FadeTo() von oben kann man nun als GAG einen automatisierten Ramp Talk generieren.

Kurz ein paar Anmerkungen:

Die Funktionen, die von einem Script aus angesprochen werden könnten sind:
- SapiPlayWav()
- SapiSpeakTextFile()
- SapiSpeakText()

Zur internen Fehlerausgabe für ein nicht gefundenes File gibt es noch die Funktion:
- SapiFnF(FileName)

Und zum Testen des ganzen gibt es:
- SapiTest(Type)

Jede der drei oberen Hauptfunktionen kan mit bis zu 2 Parametern angesprochen werden. Der jeweils erste Parameter ergiebt sich aus der Funktion (Pfad eines wav-Fils, Pfad eines txt-Files, String zum Vorlesen) und der zweite Parameter ist ein Flag welches übergeben werden kann. Die Funktionen der Einzelnen Flags habe ich noch nicht exact ergründet, da, wie ich schon häufiger schrieb, ich erstens nicht wirklich programieren gelernt habe und zweitens alle relevanten verfügbaren Informationen die ich über den Sprachsythesyser im Netz gefunden habe auf englisch sind; eine Sprache mit der ich weitestens auf Kriegsfuß stehe.

Ich denke mir das mit der Speach API von MS noch mehr zu realisieren ist, da diese ja wav-Dateien abspielen kann.

Ein gedankliches Beispiel, für die, die wirklich programieren könne quasi zum Anreiz:

Man Focusiert eine Datei in der Playlist, und anschließen drückt man einen Knopf, jetzt wird die Datei im Hintergrund zu "Vorhöhren.wav" in ein Standad-Verzeichnis gewandelt und anschließend über einen weitern Audioausgang, der ja in der Systemsteuerung für die SAPI eingestellt werde kann, ausgegeben. Schon hätte Foobar einen zweiten Audiostream, der weniger fürs direkte DJ-ing aber eben für eine Vorhöhrfunktion genutzt werden kann.

Dies währe nur eine Möglichkeit. Mit etwas Javascript Know How und Fantasie giebt es bestimmt bald witere Interessante Möglichkeiten. Derweil bastele ich noch an meine Weckerfunktion.

MFG TomPro

Erste Änderung:
Ach - eines hätte ich beinahe noch vergessen. es werden für dei Standard-Values zwei Dateien (einmal wav und einmal txt) inklusive Pfadangabe benötigt. Bitte entsprechend anpassen, da, wenn die 3 Hauptfunktionen ohne Parameter aufgerufen werden, diese Standards ausgegeben werden.

Zweite Änderung:
Und noch eins. Zur Abfrage ob ein für die Ausgabe benötigtes File existiert wird noch ein File System Objekt benötigt, welche hier im Script nicht auftauch, da ich solche Blöcke wie oben als Includs bei mir einbinde.

Also im vorliegenden Fall:
// @import "%fb2k_path%1stStrike\js\SAPI.js"

Der Befehl für das File System Objekt lautet:
var FSO = new ActiveXObject("Scripting.FileSystemObject");
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: TomPro in 01. Januar 2010, 12:25:51
[CUI]

Hier ein weiterer kleiner Helfer für die Scriptsammlung:


//------   Format Multi
function FormatMulti(Field) {
var Helper1, Helper2, Helper3, SP, i;

// Generate arrays for multivalue fields
Helper1 = Field.split("; ");
Helper2 = new Array;

// Change direction if ", " detectet
for (i = 0; i < Helper1.length; i++) {
SP = Helper1[i].lastIndexOf(", ");
if (SP == -1) {
Helper2[i] = Helper1[i];
} else {
Helper2[i] = Helper1[i].substr(SP + 2) + " " + Helper1[i].substr(0, SP);
}
}

// Generate one string by inserting ", " and/or " & " between the multivalues if needed
switch (Helper2.length) {
default:;
case 3:; Helper3 = Helper2.pop();
Field = Helper2.join(", ") + " & " + Helper3; break;
  case 2:; Field = Helper2.join(" & "); break;
  case 1:; Field = Helper2[0]; break;
}
return Field;
}


Beim kompletten auslesen eines Multivalue Fields (Artist, Album Artist, Featuring, Performer, Genre) werden die einzelnen Daten ja üblicherweise durch "; " getrennt. Dies wird benutzt um daraus ein Array mit den jeweiligen Daten zu befüllen, um diese separat noch bearbeiten zu können.

Für alle jene, welche wie ich in den Tags zuerst den Nachnamen, und dann den Vornamen, getrennt durch ein Komma, bzw. "Beatles, The" schreiben, um diese hallt alphanumerisch richtig sortieren zu lassen, wird im nächsten Schritt dieses tuen wieder umgekehrt. Also aus den oben genannten "Beatles, The" wird für die Ausgabe wieder "The Beatles".

Am Schluß wird das Ganze wieder einem normalen String übergeben, dabei wird in Abhängigkeit der Anzahl der Dateien ein " & " oder ", " und vor dem letzten ein " & " geschrieben.

Also :
aus Genesis wird Genesis
aus Queen; Rodgers, Paul wird Queen & Paul Rodgers
aus Morse, Neal; Portnoy, Mike; George, Randy wird Neal Morse , Mike Portnoy & Randy George

Viel Spass.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 16. Januar 2010, 16:21:24
Status

liefert den Status verschiedener Funktionen auf einen Blick.

optional: Loop, Gap, Alarm, Timebomb-Skripte (in diesem thread erhältlich)

Screenshot:
(http://www.abload.de/img/statusc5mq.jpg) (http://www.abload.de/image.php?img=statusc5mq.jpg)


//status by grimes
//fb2k 1.0+, WSH Panel Mod 1.3.0+ required
//DUI/CUI ready

function RGB(r, g, b) {
    return (0xff000000 | (r << 16) | (g << 8) | (b));
}

var alarm;
var gap;
var loop;
var timebomb;
var skip;
var playbackorder2 = fb.PlaybackOrder;
var playbackorder;
var cmd2 = "no track started";
var reason2 = "no track stopped";
var paused = fb.IsPaused;
var playing = fb.IsPlaying;
var stopped = !(fb.IsPlaying || fb.IsPaused);
var volume = fb.Volume;
var seektime = 0;

switch (playbackorder2) {
case 0:
    playbackorder = "Default";
    break;

case 1:
    playbackorder = "Repeat (Playlist)";
    break;

case 2:
    playbackorder = "Repeat (Track)";
    break;

case 3:
    playbackorder = "Random";
    break;

case 4:
    playbackorder = "Shuffle (tracks)";
    break;

case 5:
    playbackorder = "Shuffle (albums)";
    break;

case 6:
    playbackorder = "Shuffle (folders)";
    break;

default:
    playbackorder = "undetermined";
}

var dui = window.InstanceType;

//var g_font = gdi.Font("Segoi UI", 12, 0);
var g_font = dui == 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
//var color = RGB(200,0,0);
var color = dui == 1 ? window.GetColorDUI(2) : RGB(200,0,0);
//var color2 = RGB(0,0,0);
var color2 = dui == 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);

function on_paint(gr) {
    gr.FillSolidRect(0, 0, window.Width, window.Height, dui == 1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
    if (fb.CursorFollowPlayback) {
        gr.DrawString("CursorFollowPlayback (" + fb.CursorFollowPlayback + ")", g_font, color, 0, -180, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("CursorFollowPlayback (" + fb.CursorFollowPlayback + ")", g_font, color2, 0, -180, window.Width, window.Height, 0x11005000);
    }
    if (fb.PlaybackFollowCursor) {
        gr.DrawString("PlaybackFollowCursor (" + fb.PlaybackFollowCursor + ")", g_font, color, 0, -160, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("PlaybackFollowCursor (" + fb.PlaybackFollowCursor + ")", g_font, color2, 0, -160, window.Width, window.Height, 0x11005000);
    }
     if (fb.StopAfterCurrent) {
        gr.DrawString("StopAfterCurrent (" + fb.StopAfterCurrent + ")", g_font, color, 0, -140, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("StopAfterCurrent (" + fb.StopAfterCurrent + ")", g_font, color2, 0, -140, window.Width, window.Height, 0x11005000);
    }
    gr.DrawString("Playback Order: " + playbackorder, g_font, color2, 0, -120, window.Width, window.Height, 0x11005000);
    if (playing) {
        gr.DrawString("Playing (" + playing + ")", g_font, color, 0, -80, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("Playing (" + playing + ")", g_font, color2, 0, -80, window.Width, window.Height, 0x11005000);
    }
    gr.DrawString("Last playback starting command: " + cmd2, g_font, color2, 0, -60, window.Width, window.Height, 0x11005000);
    if (stopped) {
        gr.DrawString("Stopped (" + stopped + ")", g_font, color, 0, -40, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("Stopped (" + stopped + ")", g_font, color2, 0, -40, window.Width, window.Height, 0x11005000);
    }
    gr.DrawString("Last reason for playback stop: " + reason2, g_font, color2, 0, -20, window.Width, window.Height, 0x11005000);
    if (paused) {
        gr.DrawString("Paused (" + paused + ")", g_font, color, 0, 0, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("Paused (" + paused + ")", g_font, color2, 0, 0, window.Width, window.Height, 0x11005000);
    }
    gr.DrawString("Volume: " + volume + "dB", g_font, color2, 0, 40, window.Width, window.Height, 0x11005000);
    gr.DrawString("Seektime: " + seektime + "s", g_font, color2, 0, 60, window.Width, window.Height, 0x11005000);
    if (loop) {
        gr.DrawString("Loop (" + loop + ")", g_font, color, 0, 100, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("Loop (" + loop + ")", g_font, color2, 0, 100, window.Width, window.Height, 0x11005000);
    }
    if (gap) {
        gr.DrawString("Gap (" + gap + ")", g_font, color, 0, 120, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("Gap (" + gap + ")", g_font, color2, 0, 120, window.Width, window.Height, 0x11005000);
    }
    if (alarm) {
        gr.DrawString("Alarm (" + alarm + ")", g_font, color, 0, 140, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("Alarm (" + alarm + ")", g_font, color2, 0, 140, window.Width, window.Height, 0x11005000);
    }
    if (timebomb) {
        gr.DrawString("Timebomb (" + timebomb + ")", g_font, color, 0, 160, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("Timebomb (" + timebomb + ")", g_font, color2, 0, 160, window.Width, window.Height, 0x11005000);
    }
    if (skip) {
        gr.DrawString("Skip (" + skip + ")", g_font, color, 0, 180, window.Width, window.Height, 0x11005000);
    } else {
        gr.DrawString("Skip (" + skip + ")", g_font, color2, 0, 180, window.Width, window.Height, 0x11005000);
    }
}

function on_mouse_lbtn(x, y) {
    window.Repaint();
}

function on_cursor_follow_playback_changed(state) {
    window.Repaint();
}

function on_playback_follow_cursor_changed(state) {
    window.Repaint();
}

function on_playlist_stop_after_current_changed(state) {
    window.Repaint();
}

function on_playback_order_changed(new_order_index) {
    switch (new_order_index) {
    case 0:
        playbackorder = "Default";
        break;

    case 1:
        playbackorder = "Repeat (Playlist)";
        break;

    case 2:
        playbackorder = "Repeat (Track)";
        break;

    case 3:
        playbackorder = "Random";
        break;

    case 4:
        playbackorder = "Shuffle (tracks)";
        break;

    case 5:
        playbackorder = "Shuffle (albums)";
        break;

    case 6:
        playbackorder = "Shuffle (folders)";
        break;

    default:
        playbackorder = "undetermined";
    }
    window.Repaint();
}

function on_playback_starting(cmd, is_paused) {
    switch (cmd) {
    case 0:
        cmd2 = "default";
        break;

    case 1:
        cmd2 = "play";
        break;

    case 2:
        cmd2 = "next";
        break;

    case 3:
        cmd2 = "prev";
        break;

    case 4:
        cmd2 = "settrack";
        break;

    case 5:
        cmd2 = "rand";
        break;

    case 6:
        cmd2 = "resume";
        break;

    default:
        cmd2 = "undetermined";
    }
    playing = !is_paused;
    stopped = false;
    paused = is_paused;
    window.Repaint();
}

function on_playback_stop(reason) {
    switch (reason) {
    case 0:
        reason2 = "user";
        break;

    case 1:
        reason2 = "eof";
        break;

    case 2:
        reason2 = "starting another";
        break;

    case 3:
        reason2 = "shutting down";
        break;

    default:
        reason2 = "undetermined";
    }
    stopped = true;
    paused = false;
    playing = false;
    seektime = 0;
    window.Repaint();
}

function on_playback_pause(state) {
    paused = state;
    playing = !state;
    stopped = false;
    window.Repaint();
}

function on_volume_change(val) {
    volume = val;
    window.Repaint();
}

function on_playback_seek(time) {
    seektime = time;
    seektime = (Math.round(seektime * 100)) / 100;
    window.Repaint();
}

function on_notify_data(name, info) {
    if (name === "alarm") {
        alarm = new Boolean(info);
        if (info === "") {
            alarm = false;
        }
        window.Repaint();
    }
    if (name === "gap") {
        gap = new Boolean(info);
        if (info === "") {
            gap = false;
        }
    }
    if (name === "loop") {
        loop = new Boolean(info);
        if (info === "") {
            loop = false;
        }
    }
    if (name === "timebomb") {
        timebomb = new Boolean(info);
        if (info === "") {
            timebomb = false;
        }
    }
    if (name === "skip") {
        skip = new Boolean(info);
        if (info === "") {
            skip = false;
        }
    }
    window.Repaint();
}

function on_colors_changed() {
    color = dui ==1 ? window.GetColorDUI(2) : RGB(200,0,0);
    color2 = dui ==1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
    window.Repaint();
}

function on_font_changed() {
    g_font = dui == 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
    window.Repaint();
}


ADD: Skip (true/false)
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 18. Januar 2010, 22:56:51
Wieder was zum Ausprobieren...

Skip

Überspringe Tracks mit Ratings kleiner 1,2,3,4,5


//skip by grimes
//fb2k 1.0+, WSH Panel Mod 1.3.0+ required
//DUI/CUI ready


function RGB(r,g,b){ return (0xff000000|(r<<16)|(g<<8)|(b)); }

var g_font = gdi.Font("Segoe UI", 16, 0);
var g_font2 = gdi.Font("Segoe UI", 20, 0);
var g_font3 = gdi.Font("Segoe UI", 12, 0);
var dui = window.InstanceType;
var rating;
var rat = window.GetProperty("Set Rating:", 3);
var skip = false;
var skipping = false;
var count = 0;
//var color = RGB(200,0,0);
var color = dui == 1 ? window.GetColorDUI(2) : RGB(200,0,0);
//var color2 = RGB(0,0,0);
var color2 = dui == 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);


function on_paint(gr){
gr.FillSolidRect(0, 0, window.Width, window.Height, dui == 1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
    if (skip) {
        gr.DrawString("Skip (true) " + count + " x", g_font2, color, 0, -80, window.Width, window.Height, 0x11005000);
    }
    else {
        gr.DrawString("Skip (false)", g_font2, color, 0, -80, window.Width, window.Height, 0x11005000);
    }
    gr.DrawString("Skip track with rating less " + rat, g_font, color2, 0, -40, window.Width, window.Height, 0x11005000);
    if (skipping) {
        gr.DrawString("Skipping", g_font, color2, 0, 0, window.Width, window.Height, 0x11005000);
    }
    gr.DrawString("enable/disable skip = lbtn, set rating = wheel", g_font3, color2, 0, 40, window.Width, window.Height, 0x11005000);
}

function on_mouse_mbtn_down(x,y){
    if (!next){
        next = true; 
    }
    else {
        next = false;
    }
window.Repaint();
}

function on_mouse_lbtn_down(x,y){
    if (!skip){
        skip = true; 
        window.NotifyOthers("skip", "true"); //true
    }
    else {
        skip = false;
        window.NotifyOthers("skip", ""); // false
    }
window.Repaint();
}

function on_playback_new_track(){
    rating = fb.TitleFormat("%rating%");
    rating = rating.Eval();
    rating = parseInt(rating);
    if (rating < rat && skip) {
        skipping = true;
        fb.Next();
        count++;
    }
    else {
        skipping = false;
    }
    window.Repaint();
}

function on_mouse_wheel(delta){
for (i = 0; i<delta; i++) {rat++;}
for (i = 0; i<-delta; i++) {rat--;}
if(rat <= 1) { rat = 1}
    if(rat >= 5) { rat = 5}
window.Repaint();
}

function on_playback_stop(reason) {
    if (reason === 0) {
        count = 0;
        skipping = false;
    }
    window.Repaint();
}

function on_colors_changed() {
    color = dui ==1 ? window.GetColorDUI(2) : RGB(200,0,0);
    color2 = dui ==1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
    window.Repaint();
}

function on_font_changed() {
    window.Repaint();
}



Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 21. Januar 2010, 11:43:16
Hallo.

Ich finde die Idee eines Albumratings von TomPro gut.
Ich finde auch die Idee von grimes das ganze mit einer Datenbank zu verknüpfen gut. :D
Daran arbeite ich gerade und habe noch Fragen.

Ich habe die Standard Farbe Olive genommen.
Im Playlist View macht er der Lesbarkeit halber die Zeilen in zwei Farben.
Die eine Farbe kann ich mit window.GetColorDUI(1) ermitteln und die andere ?
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 22. Januar 2010, 23:55:40
Hier nun das Ranking mit MySQL

Seite 1
(http://i47.tinypic.com/kcezyr.png)

Seite2
(http://i46.tinypic.com/2v84wh4.png)

Code
http://pastebin.com/f122399e3

Der Code ist aus allen Himmelsrichtungen des Internets zusammengeschraubt.
Die Anzeige ist armselig zusammengeschustert und passt nur in das kleine Fenster.

In MySQL muss nur noch eine Tabelle erstellt werden.

CREATE TABLE IF NOT EXISTS `ranking` (
  `track` text NOT NULL,
  `title` text NOT NULL,
  `artist` text NOT NULL,
  `album` text NOT NULL,
  `year` year(4) NOT NULL,
  `played` smallint(6) NOT NULL,
  `tstamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


Villeicht kann das ja jemand brauchen.  8)
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 23. Januar 2010, 09:31:22
Interessante Sache, dieses Ranking.
Vielleicht übernehme ich die Idee.

Dein Code ließe sich aber um einiges "erleichtern".
Speziell in on_paint stellst du ja eine Menge an.

Übrigens:
Für die ColorType*** und FontType*** braucht man nicht zwingend die Variablen einbauen.
Es reicht, wenn du die Variablen oben weglässt und dafür z. B. anstatt window.GetColorCUI(ColorTypeCUI.text) nur die zugeordnete Zahl, also window.GetColorCUI(0) aufrufst.
Ist zwar für den "Leser" des Codes weniger übersichtlich (wenn er die zugeordneten Zahlen nicht kennt), aber je weniger im Code steht, um so schneller lädt er.
Macht immerhin einen minimalen Performance-Gewinn. Natürlich nur spürbar, wenn du deinen ganzen Code etwas entrümpelst. Z. B. auch statt DrawString GdiDrawText verwendest.

PS: Oh, ein seltener Anne Clark Hörer. Mir wird ganz warm ums Herz  :)
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 23. Januar 2010, 10:54:16
Super, es funzt!!  Super Arbeit. :crazy:

Habe jetzt eigentlich nichts zum Kritisieren...
Vielleicht die Grafik zum "Umblättern" (siehe Screenshot: roter Kreis). Woher bekomme ich die? Und passt das dann zu meinem Hintergrund?

Screenshot des Panels:
(http://www.abload.de/img/ranking2hmpe.jpg) (http://www.abload.de/image.php?img=ranking2hmpe.jpg)

Dann mal ne Frage, werden auf Seite 1 immer nur die ersten 10 Einträge der Datenbank gezeigt? Besser wären die letzten 10, aber es gibt ja schon "show recently played"...
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 23. Januar 2010, 13:45:05
Danke.

Ja, Codeoptimierung ist noch ein Thema -- später. ;)

Auf Seite 1 werden die Top 10 der am meisten gehörten Lieder angezeigt.

Wer schon foo_playcount benutzt kann das nutzen um die Datenbank mit den Infos zu füllen.

Man braucht dazu foo_texttools. In dessen config erstellt man den Pattern: "%track%##%title%##%artist%##%album%##%date%##%play_count%##%first_played%" mit dem Namen ranking
Unter Library - Search gibt man ein "%play_count% GREATER 0" und erstellt eine neue Playlist. Alle Titel markieren - rechte Maustaste und "Utilities - Text Tools - copy:ranking"
Das ganze dann in Notepad++ einfügen. Mit ersetzen die Anführungsstriche Escapen also " mit \" ersetzen dann ^(.*) mit "\1 dann ## mit ";" ersetzen und (.*)$ mit \1" ersetzen (Nicht vergessen "reguläre Ausdrücke" anzuschalten). Das ganze als liste.csv abspeichern und mit phpMyAdmin in die Datenbank Importieren.

Du kannst das Bild im Anhang benutzen oder den anderen Code benutzen :D

Geänderte Version ( die Seiten werden mit Mausrad gewechselt [macht den Code schonmal schlanker])
http://pastebin.com/f67eff569
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 23. Januar 2010, 14:04:30
ZitatAuf Seite 1 werden die Top 10 der am meisten gehörten Lieder angezeigt.

Ach, ich hatte die alle bisher nur einmal gespielt und deswegen die Funktion nicht erkannt.
Ich habe mir allerdings schon eine playlist "playcount sorted" gemacht, das diese Funktion übernimmt. Habe deswegen die Top 10 aus dem Skript genommen. Dann aus den Top 5 (Album, Artist) ne Top 10 Liste gemacht.

Zur Datenbank: Kann man nicht auch noch den "Rating"-Tag in die Datenbank einlesen lassen. Wenn die Datenbank einigermaßen gefüllt ist, kann man dann z.B. "Album-Ratings" oder "Artist-Ratings" erstellen.
ZitatDu kannst das Bild im Anhang benutzen oder den anderen Code benutzen Lachend
Anhang??? Ahh. Gefunden!!

EDIT: Typo
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 23. Januar 2010, 15:49:01
ZitatMan braucht dazu foo_texttools. In dessen config erstellt man den Pattern: "%track%##%title%##%artist%##%album%##%date%##%play_count%##%first_played%" mit dem Namen ranking
Unter Library - Search gibt man ein "%play_count% GREATER 0" und erstellt eine neue Playlist. Alle Titel markieren - rechte Maustaste und "Utilities - Text Tools - copy:ranking"
Das ganze dann in Notepad++ einfügen. Mit ersetzen die Anführungsstriche Escapen also " mit \" ersetzen dann ^(.*) mit "\1 dann ## mit ";" ersetzen und (.*)$ mit \1" ersetzen (Nicht vergessen "reguläre Ausdrücke" anzuschalten). Das ganze als liste.csv abspeichern und mit phpMyAdmin in die Datenbank Importieren.

Bekomme Fehlermeldung:
ZitatFatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 33759742 bytes) in C:\xampp\phpMyAdmin\libraries\sqlparser.lib.php  on line 222


EDIT: So sieht die Syntax von liste.cvs aus:

"01;Intro Tape and Audience;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;8;2008-08-20 17:21:30"
"02;Time and a Word;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;4;2008-07-15 04:48:27"
"03;Owner of a Lonely Heart;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;3;2008-08-02 23:59:38"
"04;Teakbois;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;2;2008-08-23 23:47:50"
"05;Clap;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;3;2008-07-15 04:51:08"
"06;Mood for a Day;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;4;2008-07-30 00:17:17"
"07;Keyboard Solo;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;1;2008-07-11 23:55:38"
"08;Long Distance Runaround;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;1;2008-12-04 13:42:01"


EDIT2: Ich Hirni, die Datei muss ja liste.csv statt liste.cvs heissen :-[

Jetzt: Ungültige Anzahl an Feldern in Zeile 1.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 23. Januar 2010, 17:48:53
Zitat"01;Intro Tape and Audience;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;8;2008-08-20 17:21:30"
"02;Time and a Word;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;4;2008-07-15 04:48:27"
"03;Owner of a Lonely Heart;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;3;2008-08-02 23:59:38"
"04;Teakbois;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;2;2008-08-23 23:47:50"
"05;Clap;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;3;2008-07-15 04:51:08"
"06;Mood for a Day;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;4;2008-07-30 00:17:17"
"07;Keyboard Solo;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;1;2008-07-11 23:55:38"
"08;Long Distance Runaround;Yes;Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1);1989;1;2008-12-04 13:42:01"


EDIT2: Ich Hirni, die Datei muss ja liste.csv statt liste.cvs heissen :-[

Jetzt: Ungültige Anzahl an Feldern in Zeile 1.
Ja, weil jedes feld mit " abgeschlossen werden muss. Du musst wie oben in der Anleitung steht aus ## ";" machen. Also aus doppelkreutzdoppelkreutz anführungsstrichesemikolonanführungsstriche.
Sollte dann so aussehen:

"02";"Time and a Word";"Yes";"Edinburgh, UK, Playhouse Theatre, 21 October 1989 (disc 1)";"1989";"4";"2008-07-15 04:48:27"


ZitatZur Datenbank: Kann man nicht auch noch den "Rating"-Tag in die Datenbank einlesen lassen. Wenn die Datenbank einigermaßen gefüllt ist, kann man dann z.B. "Album-Ratings" oder "Artist-Ratings" erstellen.
Gute Idee. Werde das mal hinzufügen.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 23. Januar 2010, 18:35:36
http://pastebin.com/f24265311

Zitat von: tedgo in 23. Januar 2010, 09:31:22
PS: Oh, ein seltener Anne Clark Hörer. Mir wird ganz warm ums Herz  :)
Naja, höre ich nicht mehr so oft. Die gepostete Liste war nur aus Testzwecken.  ::)

PS: Diese Thread könnte eigendlich ins Customize root verschoben werden. WSH Panel ist ja DUI/CUI.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 23. Januar 2010, 19:45:01
Der Code gefällt mir immer besser. :top:

Zu den Ratings: Du hast bisher die Summe aller Ratings pro album oder artist (SELECT SUM(rating)). Besser wäre Summe der Ratings / Anzahl tracks eines Albums oder Artists (Durchschnittlicher Wert). Sonst landen Alben mit 100 tracks immer ganz oben auf der Liste.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 23. Januar 2010, 21:20:44
@Andre69
Zitat von: Andre69 in 23. Januar 2010, 18:35:36
PS: Diese Thread könnte eigendlich ins Customize root verschoben werden. WSH Panel ist ja DUI/CUI.
Darüber haben grimes und ich schon diskutiert.

Bevor wir aber irgendwas irgendwo hinschieben, möchte ich alle Script-Schreiber bitten, ihre geposteten Scripts auf Kompatibilität zu DUI zu überprüfen und gegebenenfalls - falls eine Kompatibilität nicht gegeben ist - Scriptteile dahingehend zu ergänzen.
Falls nicht gewünscht ist, ein Script kompatibel zu machen, dann bitte ich darum, dass die entsprechenden Scripts mit einem vorangestelltem [CUI] kenntlich gemacht werden.

Das gilt auch für künftig gepostete Scripts.
Falls also ein Script nur für CUI oder DUI ist, dieses bitte entsprechend mit [CUI] bzw. [DUI] kenntlich machen.
Dann können wir den Thread verschieben.
Danke.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 23. Januar 2010, 21:25:00
Zitat von: tedgo in 23. Januar 2010, 21:20:44
@Andre69
Zitat von: Andre69 in 23. Januar 2010, 18:35:36
PS: Diese Thread könnte eigendlich ins Customize root verschoben werden. WSH Panel ist ja DUI/CUI.
Darüber haben grimes und ich schon diskutiert.

Bevor wir aber irgendwas irgendwo hinschieben, möchte ich alle Script-Schreiber bitten, ihre geposteten Scripts auf Kompatibilität zu DUI zu überprüfen und gegebenenfalls - falls eine Kompatibilität nicht gegeben ist - Scriptteile dahingehend zu ergänzen.
Falls nicht gewünscht ist, ein Script kompatibel zu machen, dann bitte ich darum, dass die entsprechenden Scripts mit einem vorangestelltem [CUI] kenntlich gemacht werden.

Das gilt auch für künftig gepostete Scripts.
Falls also ein Script nur für CUI oder DUI ist, dieses bitte entsprechend mit [CUI] bzw. [DUI] kenntlich machen.
Dann können wir den Thread verschieben.
Danke.
Dann ist es wohl besser einfach einen "neuen" Thread aufzumachen.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 23. Januar 2010, 21:31:31
Zitat von: grimes in 23. Januar 2010, 19:45:01
Der Code gefällt mir immer besser. :top:

Zu den Ratings: Du hast bisher die Summe aller Ratings pro album oder artist (SELECT SUM(rating)). Besser wäre Summe der Ratings / Anzahl tracks eines Albums oder Artists (Durchschnittlicher Wert). Sonst landen Alben mit 100 tracks immer ganz oben auf der Liste.
Dann schreibe im query für Album: "SELECT sum(rating)/count(title) as rate,album FROM `ranking` GROUP BY album ORDER BY rate DESC LIMIT 10"
Für Artist ändere alle "album" in "artist".

Achtung wenn du eine Compilation hast wo ein Artist ist den du nur einmal in der Datenbank hast und er ein 5 Sterne Rating hat ist er der Spitzenreiter.
Oder du hast eine Single mit nur einem Track welcher 5 Sterne hat ist er auch der Spitzenreiter.
Außerdem musst du deine ganze fb Datenbank in MySQL abspeichern. Was aber wohl kein Problem darstellt.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Bubi in 23. Januar 2010, 21:40:19
Zitat von: Andre69 in 22. Januar 2010, 23:55:40
Hier nun das Ranking mit MySQL
Tschuldigung, mal ne blöde Frage. Was heisst mit MySQL, also, was müsste ich da machen?
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 24. Januar 2010, 10:49:32
Zitat von: Bubi in 23. Januar 2010, 21:40:19
Zitat von: Andre69 in 22. Januar 2010, 23:55:40
Hier nun das Ranking mit MySQL
Tschuldigung, mal ne blöde Frage. Was heisst mit MySQL, also, was müsste ich da machen?
MySQL ist eine Open-Source Datenbank: (http://www.mysql.de/about/) & (http://de.wikipedia.org/wiki/MySQL)
Sie kommt dort zum Einsatz wo es "lange" Listen zu verarbeiten gibt.

Du müstest MySQL installieren und als dienst starten. Den ODBC Treiber installieren. Das ganze dann Administrieren.

Es stellt sich aber die Frage ob das Sinn macht. Ob dieser "Aufwand" gerechtfertigt ist.
Ich habe hier einen Server stehen auf dem alle Daten gespeichert sind und die Familie kann von überall darauf zugreifen.

MySQL ist aber nicht zwingend erforderlich es geht z.B. auch mit Access. Ich habe aber leider keine Ahnung und "wundere & freue" mich immer wenn was funktioniert was ich als code eingebe. ;)
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 24. Januar 2010, 11:07:51
ZitatDann schreibe im query für Album: "SELECT sum(rating)/count(title) as rate,album FROM `ranking` GROUP BY album ORDER BY rate DESC LIMIT 10"
Für Artist ändere alle "album" in "artist".

Funktioniert (mit der Modifikation sr statt rate)

Wie kann ich mir den rate bzw. sr Wert (durchschnittliches Artist-Rating, erste Spalte) anzeigen lassen:

Zitat
rate/sr       artist
4.8788     Carl Nielsen
4.7532    The Alan Parsons Project
4.7315    Modest Mussorgsky
4.6957    Jean Sibelius
4.6667    Kraftwerk
4.6412    Dmitri Shostakovich
4.5532    Claude Debussy
4.5148    Gustav Mahler


Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 24. Januar 2010, 11:31:49
Zitat von: grimes in 24. Januar 2010, 11:07:51
ZitatDann schreibe im query für Album: "SELECT sum(rating)/count(title) as rate,album FROM `ranking` GROUP BY album ORDER BY rate DESC LIMIT 10"
Für Artist ändere alle "album" in "artist".

Funktioniert (mit der Modifikation sr statt rate)

Wie kann ich mir den rate bzw. sr Wert (durchschnittliches Artist-Rating, erste Spalte) anzeigen lassen:

Zitat
rate/sr       artist
4.8788     Carl Nielsen
4.7532    The Alan Parsons Project
4.7315    Modest Mussorgsky
4.6957    Jean Sibelius
4.6667    Kraftwerk
4.6412    Dmitri Shostakovich
4.5532    Claude Debussy
4.5148    Gustav Mahler



Dafür sind die items da. items = new Array("rate","album"); bzw. sr als rate. Das muss genauso heissen wie das Feld in MySQL oder wie du es mit "AS" im query bestimmst.
Wenn du das noch auf 2 stellen gerunded haben willst: SELECT round( (sum( rating ) / count( title ) ) , 2) AS rate, album FROM `ranking`GROUP BY album ORDER BY rate DESC LIMIT 0 , 30
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Bubi in 24. Januar 2010, 14:40:33
Danke Andre69. :)

Das Album- und Artist-Rating macht mich schon ganz wuschig - aber das ganze MySQL-Brimborium klingt leider nicht grade verlockend. :(

Muß mal nen Freund fragen.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 24. Januar 2010, 16:12:33
@Bubi:
Ich habe bei mir XAMPP installiert. Da ist MySQL enthalten (und z.B. der Webserver Apache und PHP).
XAMPP wird nach der Installation in einfachen Schritten konfiguriert.
Dann ruft Du Deinen Browser auf und gibt
Zitatht tp://127.0.0.1/
ein, der localhost.
Dann kommt eine Begrüßungsseite, die Dich über alles weitere informiert.
Unter Tools|phpMyAdmin lässt sich die Datenbank MySQL bedienen.

Übrigens: Auch unsere Forensoftware benutzt zum Abspeichern von z.B. posts und Mitgliedern MySQL.

@Andre69:
Nochmals vielen Dank für Dein wundervolles Skript.
Vorschlag:
Man könnte noch die Defaultschriftart für DUI und CUI anzeigen lassen:
Zitatvar g_fontliste = g_instancetype == 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);

function on_font_changed() {
   g_fontliste = g_instancetype == 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
   window.Repaint();
}

Problem:
unter "Top Artisten der letzten 10 Jahre" steht bei mir:

Zitat
01. 2010 Arnold Bax
02. 2009 Dmitri Shostakovich
03. 2008 Jimi Hendrix
04. 0      Pink Floyd

Der letzte Datensatz (04.) ist natürlich Müll. Liegt an tstamp = 0000-00-00 00:00:00 bei ungespielten Tracks.
Kann man diesen letzten Datensatz ausblenden?
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 24. Januar 2010, 17:45:33
Zitat von: grimes in 24. Januar 2010, 16:12:33
@Andre69:
Nochmals vielen Dank für Dein wundervolles Skript.
Vorschlag:
Man könnte noch die Defaultschriftart für DUI und CUI anzeigen lassen:
var g_fontliste = g_instancetype == 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);

function on_font_changed() {
g_fontliste = g_instancetype == 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
   window.Repaint();
}

Problem:
unter "Top Artisten der letzten 10 Jahre" steht bei mir:


01. 2010 Arnold Bax
02. 2009 Dmitri Shostakovich
03. 2008 Jimi Hendrix
04. 0      Pink Floyd


Der letzte Datensatz (04.) ist natürlich Müll. Liegt an tstamp = 0000-00-00 00:00:00 bei ungespielten Tracks.
Kann man diesen letzten Datensatz ausblenden?

SELECT ttest.* FROM (SELECT COUNT(artist) AS ca,artist,year(tstamp) AS tsy FROM `ranking` WHERE YEAR(tstamp) > 1900 GROUP BY artist ORDER BY ca DESC) AS ttest GROUP BY tsy ORDER BY tsy DESC LIMIT 10 ist dein Freund.
Es werden die Artisten die du von 1900 gehört hast aber nicht berücksichtigt  :rofl:
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 24. Januar 2010, 17:52:39
Ich heiße ja nicht Johannes Heesters.

Kann man die Top Artisten des letzten Jahres noch nach Monaten aufschlüsseln?
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: TomPro in 25. Januar 2010, 05:15:47
Zitat von: tedgo in 23. Januar 2010, 21:20:44
@Andre69
Zitat von: Andre69 in 23. Januar 2010, 18:35:36
PS: Diese Thread könnte eigendlich ins Customize root verschoben werden. WSH Panel ist ja DUI/CUI.
Darüber haben grimes und ich schon diskutiert.

Bevor wir aber irgendwas irgendwo hinschieben, möchte ich alle Script-Schreiber bitten, ihre geposteten Scripts auf Kompatibilität zu DUI zu überprüfen und gegebenenfalls - falls eine Kompatibilität nicht gegeben ist - Scriptteile dahingehend zu ergänzen.
Falls nicht gewünscht ist, ein Script kompatibel zu machen, dann bitte ich darum, dass die entsprechenden Scripts mit einem vorangestelltem [CUI] kenntlich gemacht werden.

Das gilt auch für künftig gepostete Scripts.
Falls also ein Script nur für CUI oder DUI ist, dieses bitte entsprechend mit [CUI] bzw. [DUI] kenntlich machen.
Dann können wir den Thread verschieben.
Danke.

Da ich nicht zu denen gehöhre die Foobar "austesten", sondern ich für mich eigentlich nur Die Ansichten die ich benötige oder mir Wünsche mit Hilfe des WSH-Panels selber Zusammenstricke werde ich jetzt meine Scripsts nicht auf DUI testen, da ich es nicht benutze, genausowenig wie die foobar version 1, da ich gerade erst am beginn meines Programierens auf 0.9.6 umgestigen bin. (Never touch a running system).

Die Schnipsel, welche ich hier gepostet habe, und posten werde sind halt die Teilergebnisse meines ULTRA MEGA LANGWIERIGEN Versuchs einen Audioplayer und eine Poker-Tornament-Software in einem Guss zu bringen, da ich bei meinen Pokertunieren immer Musik laufen lasse und sowohl einen Blick auf die Pokeruhr als auch auf die Musik von meinem Pokertisch aus haben möchte, Daher auch die Speach Einbindung für die Ansagen der Blindlevel und ähnliches.

Und da ich in diesem Forum viel gelernt habe, und dies auch weiterhin tue, möchte ich zumindestens funktionierende Ergebnisse wieder zurückgeben, aber eben nur für die 0.9.6 CUI Version. Wenn die gröbsten Klötze mal abgearbeitet sind kann ich vielleicht, wenn mir bis dahin nicht mein Projekt über den Kopf gewachsen ist, an eine Portierung denken, aber im Moment bin ich mehr damit beschäftigt, das Programieren zu lernen, etwas was ich seit meiner C64 Basic Zeit nicht mehr gemacht habe.

Gruß TomPro
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 25. Januar 2010, 17:28:11
Veränderungsvorschlag

line 119:
gr.DrawString(this.data,  g_fontliste,  g_textcolor, 26+(ww/items.length)*x, 0 + i *zh, ww/items.length, zh, StrFmt_Text);
zu
gr.DrawString(this.data,  g_fontliste,  g_textcolor, 26+((ww-26)/items.length)*x, 0 + i *zh, (ww-26)/items.length, zh, StrFmt_Text);

EDIT: Meine SQL-Kenntnisse sind lausig  :'(
Ich hätte gern die Anzahl der Alben pro artist angezeigt.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 25. Januar 2010, 22:17:17
So, nach langer Scripting-Abstinenz jetzt mal das vorläufige Ergebnis meines Lyrics-Panels (welches ich als Ersatz für das doch sehr crashlastige foo_uie_lyrics in meine Config verbauen werde).

Es läuft sowohl in der DUI als auch in der CUI.
Über Kontextmenü lässt sich das Panel zur Not "refreshen" (was aber nicht nötig sein dürfte) und der Text, falls er denn länger ist als das Panel, auf Autoscrollen umschalten. Zeitmarken (Timestamps) werden jedoch nicht unterstützt! Sie werden aber für die Anzeige (denke ich doch) sauber ausgeblendet.

Ebenfalls über Rechtsklick kommt man auch in die Properties, um hier die Pfade zu externen Textdateien (mit Titleformatting) ändern zu können.

Bitte beachten: Ich habe das Script zwar getestet und es funktioniert (soweit ich das feststellen konnte), aber es kann sein, dass ich noch die eine oder andere Änderung vornehmen werde.
Ich wüsste z. B. gern, ob es möglich ist, im WSH Panel mod entweder direkt in den Lyrics-Tag in die File Properties zu gelangen, um das Textfile zu editieren oder ohne FSO den Editor mit dem Text zu starten...
Hat aber für mich keine Dringlichkeit.

DL-Link siehe hier (http://foobar-users.de/index.php?topic=2000.msg15240#msg15240).

PS: Wer den Lyricsgrabber in seinem components-Verzeichnis hat, kann im Panel auch auf Klick einen evtl. fehlenden Text herunterladen (da braucht man den Befehl nicht unter "Legacy Commands" suchen...). Klappt aber natürlich nur für das gerade spielende Lied.
Das Panel ist auf den Abruf von "Lyrics Plugin" eingestellt, man kann die Auswahl aber auch ändern (für diejenigen die das Python-Zeugs benutzen...).
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 25. Januar 2010, 22:49:52
Danke, tedgo, für dieses wichtige Skript!!
Das Skript funktioniert sehr gut. Die Zusammenarbeit mit dem Lyrics Grabber klappt. Einfacher cleaner Code, wie ich das liebe...
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Cabalist in 25. Januar 2010, 23:06:23
Danke auch tedgo, auf dein Script gewechselt und dafür foo_textdisplay entsorgt ... WSH Panel Mod hab ich ja eh schon, eine Componente gespart ;-)

Kleines Featurerequest, habs mir zwar von Hand reineditiert nun, aber bei zukünftigen Updates wärs einfacher per Config Dialog: Settings für Padding, ich mag zb den Text nich so an den Rand geklatscht oben.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 25. Januar 2010, 23:09:19
Zitat von: Cabalist in 25. Januar 2010, 23:06:23
Kleines Featurerequest, habs mir zwar von Hand reineditiert nun, aber bei zukünftigen Updates wärs einfach per Config: Settings für Padding, ich mag zb den Text nich so an den Rand geklatscht oben.
Oh, an Padding habe ich nicht gedacht, weil ich in meiner Config randlose Panel (im PSS) habe. Da merkt man das nicht.
Macht ja nix, kann man ja nachtragen :)

EDIT:
Da hab ich ja noch was zu arbeiten: Padding-Werte über Kontextmenü setzen :)
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 27. Januar 2010, 20:16:57
Release Candidate 2 des Lyrics Panels
Als Alternative zum Lyrics Show Panel für DUI und CUI
(unterstützt aber keine Timestamps und nur eingeschränkte Downloadmöglichkeiten...)
2010-01-28

Also, habs nochmal überarbeitet.
Sollte jetzt soweit fertig sein.

http://pastebin.de/3559

Hinzugefügt:
RC 2
- Autoscroll nun unabhängig von der Textgröße
- einige Fehler behoben

RC 1
- Wenn Autoscroll aktiviert ist, kann man ein Fading-Effekt zuschalten. Der ist aber sinnvoller Weise nur dann aktiv, wenn der Text größer ist als das Panel, da sonst ein Teil des Textes u. U. schwer zu lesen wäre...
- manuelles Scrolling auch während Autoscroll möglich
- Padding (horiz./vert.) über Rechtsklick --> Properties.
- Unterstützung für foo_lyricsdb, wenn das jemand statt des Lyricsgrabbers benutzt (liegen beide DLL's im components-Ordner, wird aber der Lyricsgrabber bevorzugt. Kann über "Properties" umgestellt werden, wenn man den Eintrag bei "Lyrics Search Command" auf "get from db" ändert).
- Downloadmöglichkeit bei Radio, Audio CD und Last.fm abgeschaltet (nicht dass versucht wird, da in die Tags zu schreiben...)
- Bisschen Code bereinigt

Für die Songtext-Downloadmöglichkeit benötigt man entweder den Lyricsgrabber 0.3.0.7a (https://code.google.com/p/lyricsgrabber/downloads/list) oder LyricsDB 0.0.8beta0 defekter link entfernt - grimes.
Zumindest letzteres gilt aber als Crashware!
(Deshalb die Bevorzugung des Lyricsgrabbers)

Bitte sagt Bescheid, wenn irgendwas nicht so funktioniert, wie man es erwartet.
Danke.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Cabalist in 31. Januar 2010, 11:57:36
Schon sehr schön dein Lyrics Panel tedgo. Hätte da allerdings noch einen Vorschlag/Wunsch. Bei Lyricsanzeige per foo_textdisplay ist es möglich, nicht die Lyrics des aktuell laufenden Songs zu zeigen sondern auch des in der Playlist ausgewählten. Fand ich ganz schön, wenn man mal in 'nem Text rumstöbern will ohne den Song zu wechseln (evtl auch wenn gar kein Song läuft).

cu
cabalist
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 31. Januar 2010, 14:30:46
Hm, das wollte ich so nicht einbauen, da ich das Panel ja in meine Config einbauen wollte und da alles auf Now Playing ausgerichtet ist.
Du könntest es saber selbst einbauen.

Vielleicht schau ich es mir diese Woche noch einmal an und baue ein Rechtsklick-Option wie im Item Details Panel ein, mit dem man von Now Playing auf Focus Item umstellen kann.
(Wollte das Panel aber eigentlich bewusst schlicht halten...).
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Cabalist in 31. Januar 2010, 15:33:39
Wenn ich wüsste wie, würd ichs selbst einbauen  :crazy2:

Wenn du das so nicht nutzen magst und du das Teil schlicht halten willst musst du das aber nicht wegen mir extra einbauen. Könnte ja genauso gut das foo_textdisplay wieder benutzen (nutz zb das autoscroll von dir eh nicht). Wollt mir nur eine Component ersparen (WSH Panel Mod nutz ich halt sowieso) ;-)

Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 31. Januar 2010, 18:10:42
Ich werds mir diese Woche noch mal ansehen. Muss sowieso noch etwas dran basteln, weil das Fading (oder besser FillGradRect, mit dem ich das Fading realisiert habe) eine Macke hat, die ich zu umgehen versuche...
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: qwert73 in 31. Januar 2010, 19:27:09
Zitat von: tedgo in 31. Januar 2010, 18:10:42
Ich werds mir diese Woche noch mal ansehen.

Als DUI-User fände ich es toll, wenn das Anzeigeverhalten der global gesetzten Option entsprechen würde.  ::)
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 31. Januar 2010, 19:29:29
Da muss ich mir erst mal die DUI genauer ansehen ;)
Ich kenne das Verhalten da zu wenig, weil ich ausschließlich die CUI nutze.
Aber ich werde sehen, was ich machen kann.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: qwert73 in 31. Januar 2010, 19:35:42
Es gibt halt nur zwei Optionen in der DUI: "Prefer Selection" und "Prefer playing track", die in den Einstellungen unter Display auswählbar sind.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 31. Januar 2010, 19:42:33
Hm, da muss ich mal sehen, ob ich diese Einstellung im WSH Panel mod abgreifen kann...
Wüsste jetzt aber nicht, dass das geht. Aber das muss ich mir noch mal genauer ansehen. Falls es geht, muss ich meine gesamte Scriptsammlung mal anpassen, dass sie globaler funktioniert (falls jemand die Scripts aus meiner Config auch in der DUI benutzen möchte).
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 31. Januar 2010, 20:18:01
Zitat von: qwert73 in 31. Januar 2010, 19:35:42
Es gibt halt nur zwei Optionen in der DUI: "Prefer Selection" und "Prefer playing track", die in den Einstellungen unter Display auswählbar sind.

Da die Einstellung unter Display zu finden ist, müsste sie global gelten, nicht nur für DUI, sondern auch für CUI. Mir ist allerdings kein CUI-Element bekannt, dass mit dieser Einstellung beeinflussbar ist.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: qwert73 in 31. Januar 2010, 20:36:38
Zitat von: grimes in 31. Januar 2010, 20:18:01
Da die Einstellung unter Display zu finden ist, müsste sie global gelten, nicht nur für DUI ...
Die Einstellung ist dafür gedacht, um das Anzeigeverhalten von Ui Elementen des Typs "Selection Information" zu bestimmen. Schön ist es aber sicherlich nicht, dass CUI-User über Optionen stolpern, mit denen sie nichts anfangen können.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Spirit_of_the_ocean in 01. Februar 2010, 19:48:00
Ich bin etwas planlos. Ich würde gerne ein Tack info mod panel ersetzen. Darin hab ich Buttons für Rating außerdem Informationen wie z.B. wie oft der Titel gespielt worden ist Künstlername  Album etc.

Wie kann ich diese Metadaten ins WSH mod panel bekommen?
Wie kann ich ein Bild für den Codec anzeigen lassen, der sich mit neuem Titel ändert (wenn anderer Codec)?
Wie bekomme ich bekomme ich Ratingbuttons hin?

Ich habe schon nach Beispielen geschaut wie man an die Metadaten rankommt, aber ich hab nichts passendes gefunden.  :(
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 01. Februar 2010, 21:32:45
Beispiel (nur ein schnell runtergetippter Code-Schnipsel):
Du willst die Metadaten ARTIST, ALBUM, TITLE haben.


var metadb, fileinfo;

function get_metadb () {
metadb = fb.GetNowPlaying();
var a, b, c;

if (metadb) {
fileinfo = metadb.GetFileInfo();
a = fileinfo.MetaValue(fileinfo.MetaFind("artist"), 0);
b = fileinfo.MetaValue(fileinfo.MetaFind("album"), 0);
c = fileinfo.MetaValue(fileinfo.MetaFind("title"), 0);
artist = a ? a : "";
album = b ? b : "";
title = c ? c : "";
} else {
artist = "";
album = "";
title = "";
}
}

get_metadb();

function on_paint()gr) {
gr.GdiDrawText(artist, ...
gr.GdiDrawText(album, ...
gr.GdiDrawText(title, ...
und was halt sonst noch alles gezeichnet werden soll
}

function on_playback_new_track() {
get_metadb();
window.Repaint();
}

function on_playback_stop() {
fileinfo && fileinfo.Dispose(); // Damit die Fileinfo wieder aus dem Speicher gelöscht wird
window.Repaint();
}


Du könntest das ganze auch mit Titleformatting abfragen, das wäre wesentlich einfacher:
z. B.:

var artist = fb.TitleFormat("[%artist%]");
var album = fb.TitleFormat("[%album%]");
var title = fb.TitleFormat("%title%");

function on_paint(gr) {
gr.GdiDrawText(artist.Eval(), ...
gr.GdiDrawText(album.Eval(), ...
gr.GdiDrawText(title.Eval(), ...
usw.
}

function on_playback_new_track() {
window.Repaint();
}

function on_playback_stop() {
window.Repaint();
}


Ich rate aber eher dazu, für die reine Anzeige der Trackinfos auf das Item Details Panel umzusteigen bzw. für die DUI das Text Display, wenn du keine außergewöhnlichen Hintergründe oder sonstiges zeichnen möchtest.

Für den Codec könntest du ähnlich vorgehen:
entweder:
codec = fileinfo.InfoValue(fileinfo.InfoFind("codec"));
oder:
codec = fb.TitleFormat("%codec%").Eval();

und dann:
var img = gdi.Image(Pfad + codec + ".png");
gr.DrawImage(img, ...

Fürs Rating gibt es ja schon eine Menge Beispielscripts im WSH Thread auf hydrogenaudio.
Man muss halt den Buttonklick auf das gewünschte Areal begrenzen, wenn man die Rating-Funktion gemeinsam mit anderen Infos in einem Panel haben will.
Dafür habe ich jetzt aber leider auch kein passendes Beispiel, da mein eigenes Rating-Script sich gewaltig von denen auf hydrogenaudio unterscheidet und ich es in einem separaten Panel habe...
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Spirit_of_the_ocean in 02. Februar 2010, 18:35:07
HI!
Zu deinem ersten Code: Der funktioniert nicht.
Was muss denn hinter:
gr.GdiDrawText(artist, statt der "..."
Was muss da eingesetzt werden? Ich hab keine Ahnung von Jscript.

Ich bekomme nur immer:
'gr' ist undefiniert
Ln: 25, Col: 2
<no source text available>


Item Display hat den Nachteil, dass ich eben kein Bild anzeigen lassen kann und keine Buttons benutzen kann.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 02. Februar 2010, 18:51:08
Huch, ist ja auch ein Tippfehler drin  ::)

Also mal die on_paint Funktion als Beispielcodeschnipsel:

DT_TOP = 0x00000000;
DT_LEFT = 0x00000000;
DT_CENTER = 0x00000001;
DT_RIGHT = 0x00000002;
DT_VCENTER = 0x00000004;
DT_BOTTOM = 0x00000008;
DT_WORDBREAK = 0x00000010;
DT_SINGLELINE = 0x00000020;
DT_EXPANDTABS = 0x00000040;
DT_TABSTOP = 0x00000080;
DT_NOCLIP = 0x00000100;
DT_EXTERNALLEADING = 0x00000200;
DT_CALCRECT = 0x00000400;  // [1.2.1] Handles well
DT_NOPREFIX = 0x00000800;  // NOTE: Please use this flag, or a '&' character will become a underline '_'
DT_INTERNAL = 0x00001000;
DT_EDITCONTROL = 0x00002000;
DT_PATH_ELLIPSIS = 0x00004000;
DT_END_ELLIPSIS = 0x00008000;
DT_MODIFYSTRING = 0x00010000;  // do not use
DT_RTLREADING = 0x00020000;
DT_WORD_ELLIPSIS = 0x00040000;
DT_NOFULLWIDTHCHARBREAK = 0x00080000;
DT_HIDEPREFIX = 0x00100000;
DT_PREFIXONLY = 0x00200000;

var g_font = window.InstanceType == 0 ? window.GetFontCUI(0) : window.GetFontDUI(0);
var g_col = window.InstanceType == 0 ? window.GetColorCUI(0) : window.GetColorDUI(0);

function on_paint(gr) {
gr.GdiDrawText(artist, g_font, g_col, x-Wert, y-Wert, Breite, Höhe, String-Optionen (z. B. DT_CENTER | DT_VCENTER | DT_NOPREFIX (mehrere Optionen jeweils durch ein "|" getrennt)))
}


Hier mal ein Code, mit dem du siehst, welche Metadaten in einem File sind (beim Songwechsel geht ein Popup auf):

function on_item_focus_change() {
   var metadb = fb.GetFocusItem();
   var fInfo = metadb.GetFileInfo();
   var message;

   for( i=0; i< fInfo.MetaCount; i++ ) {
       message += "\n" + fInfo.MetaName(i);
   }
   fb.ShowPopupMessage(message);
}

Mit dem Beispielcode aus meinem obigen Post kannst du die dann entsprechend abrufen
(z. B. fileinfo.MetaValue(fileinfo.MetaFind("artist"), 0);

Das Ganze geht natürlich nicht nur für Metadaten, sondern auch für Fileinfos:

function on_item_focus_change() {
   var metadb = fb.GetFocusItem();
   var fInfo = metadb.GetFileInfo();
   var message;

   for( i=0; i< fInfo.MetaCount; i++ ) {
       message += "\n" + fInfo.InfoName(i);
   }
   fb.ShowPopupMessage(message);
}

Mit dem Beispielcode aus meinem obigen Post dann z. B. abzurufen als:
fileinfo.InfoValue(fileinfo.InfoFind("md5"));
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Spirit_of_the_ocean in 02. Februar 2010, 19:41:13
Sorry aber ich bekomme nur Errors :(

Ich brauche mal einen komplett funktionierenden Code.  :-[ Sonst kann ich nicht verstehen wie es geht, wenn ich andauernd einen error bekomme.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 02. Februar 2010, 19:55:05
Dein Wunsch ist mir Befehl :)


DT_CENTER = 0x00000001;
DT_VCENTER = 0x00000004;
DT_WORDBREAK = 0x00000010;
DT_CALCRECT = 0x00000400;
DT_NOPREFIX = 0x00000800;

var ui_backcol, ui_textcol, ui_font;
var ui_type = window.InstanceType;
var ww = 0; wh = 0;

function get_colors() {
ui_backcol = ui_type == 0 ? window.GetColorCUI(3) : window.GetColorDUI(1);
ui_textcol = ui_type == 0 ? window.GetColorCUI(0) : window.GetColorDUI(0);
}

get_colors();

function on_colors_changed() {
get_colors();
window.Repaint();
}

function get_font() {
ui_font = ui_type == 0 ? window.GetFontCUI(0) : window.GetFontDUI(0);
}

get_font();

function on_font_changed(){
get_font();
window.Repaint();
}

function get_metadb() {
metadb = fb.GetNowPlaying();

if (metadb) {
fileinfo = metadb.GetFileInfo();
var a = fileinfo.MetaValue(fileinfo.MetaFind("artist"), 0);
var b = fileinfo.MetaValue(fileinfo.MetaFind("album"), 0);
var c = fileinfo.MetaValue(fileinfo.MetaFind("title"), 0);
var d = fileinfo.InfoValue(fileinfo.InfoFind("codec"));
artist = a ? a.toUpperCase() + "\n" : "";
album = b ? b.toUpperCase() + "\n" : "";
title = c ? "\"" + c + "\"" + "\n\n" : "";
codec = d;
} else artist = album = title = codec = "";
}

get_metadb();

function on_paint(gr) {
gr.FillSolidRect(0, 0, ww, wh, ui_backcol);
gr.GdiDrawText(artist + album + title + codec, ui_font, ui_textcol, 0, 0, ww, wh, DT_CENTER | DT_VCENTER | DT_NOPREFIX | DT_WORDBREAK | DT_CALCRECT);
}

function on_size() {
ww = window.Width;
wh = window.Height;
}

function on_playback_new_track() {
get_metadb();
window.Repaint();
}

function on_playback_stop() {
fileinfo && fileinfo.Dispose();
get_metadb();
window.Repaint();
}


Ist jetzt mal ein rudimentärer, schnell getippter Code, der dir nur Infos anzeigt, wenn ein Lied spielt.
Nur damit du siehst, wie es funktioniert.

EDIT: Ach ja, du brauchst natürlich für den Code die neueste WSH Panel mod Version 1.3.1.
EDIT2: Kleinen Fehler korrigiert  ::)

EDIT3:
Wie ich schon schrieb, geht das Ganze natürlich auch mit Titleformatting (das wäre vielleicht etwas einfacher)

DT_CENTER = 0x00000001;
DT_VCENTER = 0x00000004;
DT_WORDBREAK = 0x00000010;
DT_CALCRECT = 0x00000400;
DT_NOPREFIX = 0x00000800;

var ui_backcol, ui_textcol, ui_font;
var ui_type = window.InstanceType;
var ww = 0; wh = 0;

function get_colors() {
ui_backcol = ui_type == 0 ? window.GetColorCUI(3) : window.GetColorDUI(1);
ui_textcol = ui_type == 0 ? window.GetColorCUI(0) : window.GetColorDUI(0);
}

get_colors();

function on_colors_changed() {
get_colors();
window.Repaint();
}

function get_font() {
ui_font = ui_type == 0 ? window.GetFontCUI(0) : window.GetFontDUI(0);
}

get_font();

function on_font_changed(){
get_font();
window.Repaint();
}

function on_paint(gr) {
var g_text = fb.TitleFormat("[$upper(%artist%)$crlf()][$upper(%album%)$crlf()]\"%title%\"$crlf()$crlf()%codec%");
gr.FillSolidRect(0, 0, ww, wh, ui_backcol);
gr.GdiDrawText(g_text.Eval(), ui_font, ui_textcol, 0, 0, ww, wh, DT_CENTER | DT_VCENTER | DT_NOPREFIX | DT_WORDBREAK | DT_CALCRECT);
}

function on_size() {
ww = window.Width;
wh = window.Height;
}

function on_playback_new_track() {
window.Repaint();
}

function on_playback_stop() {
window.Repaint();
}
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Spirit_of_the_ocean in 02. Februar 2010, 21:19:06
Danke schön. Das hilft mir erst einmal weiter. Ich werde bestimmt noch ein bisschen brauchen bis ich mir das ganze in Ruhe angeschaut habe.


Ich wünschte nur jemand würde irgendwas programmieren, damit automatisch titleformatting in den richtigen code "übersetzt" würde mir noch zusätzlichen Sachen wie Bilder und Buttons getreu dem Motto:

Was sollen sie einfügen:
-Text
-Bilder
-Buttons
und wenn man dann eines anklickt bekommt man ein Auswahlmenü.

Das ist leider der Nachteil an diesem Plugin: Man muss Leute haben, die sich damit auskennen bzw. sich selber damit auskennen.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 05. Februar 2010, 14:04:08
Ich finde das "Biography" scrollen nicht sehr Komfortabel. Das ist manchmal ziemlich lang und das lesen strengt an.
Ich lasse daher in meinem Panel nur die <summary> von der LastFM API anzeigen. Wenn man aber mit der Maus auf dem Text click öffnet sich der IE mit dem gesammten <content>.

Dies ist nur ein Codeschnipsel.
CODE:

var oie = new ActiveXObject("InternetExplorer.Application");
while(oie.busy) {
// warten
}
oie.left = 100;
oie.top = 100;
oie.height = 500;
oie.width = 1000;
oie.menubar = false;
oie.toolbar = false;
oie.statusbar = false;
oie.AddressBar = false
oie.theatermode = false;
oie.visible = true;
oie.navigate("About:Blank");
oie.document.open;
oie.document.writeln("<html><body><center><h1>Hello World.</h1></center></body></html>");
oie.document.close;


Im IE sind dann ja Styletechnisch "fast" keine Grenzen gesetzt.

Leider öffnet sich der IE bei mir nur im Hintergrund. Villeicht finde ich das ja noch herraus.

Quelle: http://msdn.microsoft.com/en-us/library/aa752084(VS.85).aspx
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: qwert73 in 05. Februar 2010, 19:55:16
Eine wahrlich schöne Idee:

http://www.hydrogenaudio.org/forums/index.php?showtopic=77883&view=findpost&p=685794

Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 08. Februar 2010, 10:20:20
Zitat von: qwert73 in 05. Februar 2010, 19:55:16
Eine wahrlich schöne Idee:

http://www.hydrogenaudio.org/forums/index.php?showtopic=77883&view=findpost&p=685794


Hab sowas auch schon öfter gesehen. Z.B.: bei Napster.
Wofür ist sowas gut ?
Wie wendet man das an ? Also wann mach ich was ? Kreutz ich glücklich an wenn ich es bin oder wenn mich das Lied glücklich macht ?
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 08. Februar 2010, 15:14:41
Ich höre meine Musik bevorzugt albumweise. Da stört es, wenn nach Albumende der nächste Track reinblöckt.
Deshalb:

Stop after current album


//Stop after current album by grimes
//fb2k 1.0+, WSH Panel Mod 1.3.0+ required
//DUI/CUI ready


function RGB(r,g,b){ return (0xff000000|(r<<16)|(g<<8)|(b)); }

var g_font = gdi.Font("Segoe UI", 20, 0);
var g_font2 = gdi.Font("Segoe UI", 12, 0);
var g_font3 = gdi.Font("Segoe UI", 16, 0);
var dui = window.InstanceType;
//var color = RGB(200,0,0);
var color = dui == 1 ? window.GetColorDUI(2) : RGB(200,0,0);
//var color2 = RGB(0,0,0);
var color2 = dui == 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
var album = "";
var album_old = "";
if (fb.IsPlaying || fb.IsPaused) {
    album = fb.TitleFormat("%album%");
    album = album.Eval();
}
var stop = window.GetProperty("Stop after current album:", false);
if (stop) {window.NotifyOthers("stop", "true");}
else {window.NotifyOthers("stop", "");}
var stopped = false;

function on_paint(gr){
gr.FillSolidRect(0, 0, window.Width, window.Height, dui ==1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
    gr.DrawString("Stop after current album (" + stop + ")", g_font, color, 0, -80, window.Width, window.Height, 0x11005000);
    if (stopped) {
        gr.DrawString("Stopped", g_font3, color2, 0, -40, window.Width, window.Height, 0x11005000);
    }   
    gr.DrawString("enable/disable = lbtn", g_font2, color2, 0, 0, window.Width, window.Height, 0x11005000);
}
function on_mouse_lbtn_down(x,y){
    if (!stop) {
        stop = true;
        window.NotifyOthers("stop", "true"); //true
    }
    else {
        stop = false;
        window.NotifyOthers("stop", ""); // false
    }
    window.Repaint();
}

function on_playback_new_track(metadb){
    stopped = false;
    album_old = album;
    album = fb.TitleFormat("%album%");
    album = album.Eval();
    if (!(album_old === album) && album_old !== "" && stop) {
        fb.Stop();
        stopped = true;
    }
    window.Repaint();
}

function on_playback_stop(reason) {
    album = "";
    album_old = "";
    window.Repaint();   
}

function on_colors_changed() {
    window.Repaint();
}

function on_font_changed() {
    window.Repaint();
}


Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Bubi in 08. Februar 2010, 16:37:50
Mal ne blöde Frage.

Konntet ihr Das J-Script-Zeugs schon vorher, oder habt ihr euch das mit der Doku zum WSH Panel und sonstigen Quellen beigebracht?
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 08. Februar 2010, 18:07:18
Artist Viewer

Meine Künstler-Bilder liegen alle im gleichen Verzeichnis. Pro Künstler habe ich mehrere Bilder, z.B. Pink Floyd2.jpg, Pink Floyd3.jpg.
Mit dem folgenden Skript kann man mit Mausklick durch die verschiedenen Bilder des gerade gespielten Künstlers blättern.
(Bitte Pfad und Tag in den Zeilen 23/24 anpassen)


//Artist viewer by grimes
//fb2k 1.0+, WSH Panel Mod 1.3.0+ required
//DUI/CUI ready

function RGB(r, g, b) {
    return (0xff000000 | (r << 16) | (g << 8) | (b));
}

var explorer;
var performer;
var artistpath = "N:\\mp3\\artists\\";
var path;
var arr = "";
var i = 0;
var g_img = null;
var ww = 0,
    wh = 0;
var show = true;
if (fb.IsPlaying || fb.IsPaused) {
    get_image();
}
var dui = window.InstanceType;

function get_image() {
    performer = fb.TitleFormat("%performer%").Eval();
    path = artistpath + performer + "*.*";
    arr = utils.Glob(path).toArray();
    g_img = gdi.Image(arr[i]);
}

function on_size() {
    ww = window.Width;
    wh = window.Height;
}

function on_paint(gr) {
    gr.FillSolidRect(0, 0, ww, wh, dui == 1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
    if (g_img) {
        var scale = 0;
        var x = 0,
            y = 0;
        var scale_w = ww / g_img.Width;
        var scale_h = wh / g_img.Height;

        if (scale_w <= scale_h) {
            scale = scale_w;
            y = (wh - g_img.Height * scale) / 2;
        } else {
            scale = scale_h;
            x = (ww - g_img.Width * scale) / 2;
        }
        if (show) {
            gr.DrawImage(g_img, x, y, g_img.Width * scale, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height);
        }
    }
}

function on_mouse_mbtn_down(x, y) {

}

function on_mouse_rbtn_up(x, y) {
    var MF_SEPARATOR = 0x00000800;
    var MF_STRING = 0x00000000;
    var _menu = window.CreatePopupMenu();
    var idx;
    _menu.AppendMenuItem(MF_STRING, 1, "Open Artist Folder");
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_STRING, 2, "Properties");
    _menu.AppendMenuItem(MF_STRING, 3, "Configure...");
    idx = _menu.TrackPopupMenu(x, y);
    switch (idx) {
    case 1:
        if (!explorer) explorer = new ActiveXObject("Shell.Application");
        explorer.ShellExecute("explorer", "" + artistpath + '"', "", "open", 1);
        break;
    case 2:
        window.ShowProperties();
        break;
    case 3:
        window.ShowConfigure();
        break;
    }
    _menu.Dispose();
    return true;
}

function on_mouse_lbtn_down(x, y) {
    if (fb.IsPlaying || fb.IsPaused) {
        if (i < arr.length - 1) {
            i++;
        } else {
            i = 0;
        }
        g_img = gdi.Image(arr[i]);
        show = true;
    } else {
        show = false;
    }
    window.Repaint();
}

function on_mouse_wheel(delta) {

}

function on_playback_new_track() {
    get_image();
    show = true;
    window.Repaint();
}

function on_playback_stop() {
    show = false;
    window.Repaint();
}

function on_colors_changed() {
    window.Repaint();
}

function on_font_changed() {
    window.Repaint();
}


ADD: Open Artist Folder


@Bubi: Ein bisschen programmieren konnte ich schon vorher, JavaScript habe ich erst durch WSH Panel mod kennengelernt (wie man an den bisher primitiven Skripten sieht)

Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 13. Februar 2010, 19:38:04
@qwert73 und Cabalist
Wegen dem Lyrics Script:
Würde es ausreichen, eine Rechtsklick-Option mit folgenden Einträgen einzubauen:
- Follow Cursor
- Now Playing
- Automatic (wenn foobar2000 spielt "Now Playing", sonst "Follow Cursor")

Eine Automatik, die die Einstellung unter "Preferences --> Display" abgreift, konnte ich nicht finden...

Falls mein obiger Vorschlag ausreicht, würde ich im Laufe der nächsten Woche (vielleicht auch erst die Woche darauf, bin zur Zeit anderweitig eingespannt...) das Script überarbeiten. Dann gäbe es halt zwei Versionen: die hier gepostete und meine reine "Now Playing" Version für meine Config.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: qwert73 in 13. Februar 2010, 20:24:50
Zitat von: tedgo in 13. Februar 2010, 19:38:04
Würde es ausreichen, eine Rechtsklick-Option mit folgenden Einträgen einzubauen:
- Follow Cursor
- Now Playing
- Automatic (wenn foobar2000 spielt "Now Playing", sonst "Follow Cursor")

Genauso würde das prima in die CUI passen. Musicmusic hat für seine Viewer ja auch einen ähnlichen Aufbau an Optionen. Tip: Du kannst dich ja bei der Namensgebung an seinem Sprachgebrauch orientieren.
Einem DUI User müsste das auch reichen, obwohl natürlich die globale Option schon ... weißt schon! :D ;)
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Cabalist in 13. Februar 2010, 22:44:14
Jo, wäre perfekt so tedgo.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: TomPro in 20. Februar 2010, 14:57:01
Zitat von: Bubi in 08. Februar 2010, 16:37:50
Mal ne blöde Frage.

Konntet ihr Das J-Script-Zeugs schon vorher, oder habt ihr euch das mit der Doku zum WSH Panel und sonstigen Quellen beigebracht?

Erst durch foobar reingearbeitet
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: TomPro in 21. Februar 2010, 11:10:46
So im Zusammenhang "selber beigebracht" habe ich jetzt aber doch ne Frage an die Experten, da ich nach etlichen rumprobieren etweder nicht auf die Lösung komme oder es gar keine gibt.

Mit dem Befehl "var MyImage = gdi.Image(C:\...Speicherort)" lade ich ja eine Grafik in die Variable MyImage die dann mit dem Befehl "gr.DrawImage(MyImage, X, Y, W, H, ab pos X im Bild, ab pos Y im Bild, W des Bildausschnits, H des Bildausschnits, Drehung des Bildes, Durchsichtigkeit des Bildes)" ausgegeben wird.

Nun habe ich bei tedgos Lyric-Schnipsel folgenden Codeteil entdeckt

var temp_bmp = gdi.CreateImage(1, 1);
var temp_gr = temp_bmp.GetGraphics();
arr = temp_gr.GdiDrawText(g_text, ui_font, ui_textcol, hPad, vPad, pW, pH, 3093).toArray();


Dies bedeutet doch wenn ich das richtig sehe, das ich eine Grafik erst einmal in eine Variable zeichnen kann (im Beispiel oben mit Text, aber vielleicht ja auch mit Grafikelementen wie z.B Statistikbalken). Wenn ich also richtig liege, und das hoffe ich inständig, müsste ich diese Grafik (Variable) doch auch wieder mit einem der Ausgabebefehle wie eben dem "gr.DrawImage()" nach fertiger Erstellung ganz oder aber ja auch nur Ausschnittsweise darstellen können und so durch die Bildausschnittsparameter quasi auch ein pixelweises scrollen (mit Text und Grafikelementen) Emulieren können.

A) hoffe ich das jemand eine Lösung mit entsprechendem Code parat hat (eine kurze Erklärung zum Code währe auch nicht schlecht)

B) wenn dieses machbar währe, währe das ja auch was für Tedgos Lyricsanzeige (weicheres scrollen)

C) wie währes im allgemeinen mit einem (eventuell auch nur kurzem) Tutorial für die WSH spezifischen Befehle (JScript findet man ja mehr oder weniger gute DEUTSCHSPRACHIGE im Netz), denn ich verzweifle oft daran wenn ich die Datei "Interfaces.txt" durchlese kommt jetzt vor dem Befehl ein gdi. oder utils. oder sonstwas, und der ein oder andere Parameter erklärt sich mir erst nach etlichen Versuchen.

Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 21. Februar 2010, 16:51:05
Ja, Deutsche Anleitung währe was gutes. Da ist aber ein WIKI besser geeignet.
Zum Thema CreateImage eine kleine Spielerei:

// ==PREPROCESSOR==
// @import "%fb2k_path%scripts\Flags.txt"
// ==/PREPROCESSOR==

function RGB(r, g, b) {
    return (0xff000000 | (r << 16) | (g << 8) | (b));
}
font = gdi.Font("Consolas", 107);
bmp = gdi.CreateImage(800,100);
tgr = bmp.GetGraphics();
tgr.GdiDrawText("Andre",font,RGB(55,55,255),0,0,bmp.width,bmp.height, DT_LEFT);
bmp2 = bmp.Clone(0, 0, bmp.Width, bmp.Height);
bmp2.RotateFlip(6);
maske = gdi.Image(fb.FoobarPath + "images\\maske.png");
mask = maske.Resize(bmp2.Width, bmp2.Height);
bmp2.ApplyMask(mask);

function on_paint(gr) {
gr.DrawImage(bmp,10,10,bmp.width,bmp.height,0,0,bmp.width,bmp.height,0,255);
gr.DrawImage(bmp2,10,10+bmp.height,bmp2.width,bmp2.height,0,0,bmp2.width,bmp2.height,0,255);
}


Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 23. Februar 2010, 08:59:20
ZitatWSH Panel 1.3.2 Beta 3 Uploaded:
Changelog delta:
Zitat
- ADD: on_playlists_changed() callback.
- ADD: Properties fb.PlaylistCount, fb.ActivePlaylist and fb.PlayingPlaylist.
- ADD: Methods fb.GetPlaylistName(), fb.CreatePlaylist(), fb.RemovePlaylist(), fb.MovePlaylist() and fb.RenamePlaylist().
- ADD: Sample Themed Progress Bar.txt.
- FIX: Preserve current selection when panel get focus.

Schön, es geht in kleinen Schritten Richtung Datenbankmanipulation.
Leider fehlt noch "fb.SwitchPlaylist(<INT>)", oder hab ich was übersehen ?
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 24. Februar 2010, 09:21:26
An diejenigen, die auf mein Lyrics Script warten:
Wird leider noch dauern. Ich habe jetzt mehrmals angefangen, musste aber immer wieder umschreiben (weil neue Funktionen im WSH Panel mod dazu kamen).
Jetzt müsste ich es - da es ursprünglich ja nur auf Now Playing festgelegt war -praktisch komplett neu schreiben.
Dazu fehlt mir jetzt aber die Zeit, da ich erst mal meine Config fertig bekommen muss und auch noch einiges andere zu erledigen habe.
Ich werde deshalb erst nach Ostern wieder Zeit haben, das Lyrics Panel zu überarbeiten.
Dann kann ich auf Basis meiner DarkOne Scripts Standalone-Panel basteln.
Vielleicht hat das WSH Panel mod bis dahin auch eine benötigte Funktion, die die Identifizierung des gerade spielenden Titels vereinfacht ;).
Oder Michael87 bringt bis dahin ein vernünftiges Lyrics Display heraus. Dann spare ich mir die Arbeit ganz :D
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 25. Februar 2010, 08:07:01
Title Format

Eine Alternative zu CUI's "Item Properties" und DUI's "Infospect"


//title format by grimes
//fb2k 1.0+, WSH Panel Mod 1.3.2+ required
//DUI/CUI ready


function RGB(r, g, b) {
    return (0xff000000 | (r << 16) | (g << 8) | (b));
}

var dui = window.InstanceType;
var g_font = dui === 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
var color2 = dui === 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
var tfarray;
var alpha = window.GetProperty("Sort alphabetical?", false);

tfarray = new Array("%album artist%", "%album%", "%artist%", "%discnumber%", "%track artist%", "%title%", "%tracknumber%", "$fix_eol(%comment%)", "%rating%", "%play_count%", "%bitrate%", "%channels%", "%filesize%", "%filesize_natural%", "%samplerate%", "%codec%", "%playback_time%", "%playback_time_seconds%", "%playback_time_remaining%", "%playback_time_remaining_seconds%", "%length%", "%length_ex%", "%length_seconds%", "%length_seconds_fp%", "%length_samples%", "%isplaying%", "%ispaused%", "%list_index%", "%list_total%", "%queue_index%", "%queue_indexes%", "%queue_total%", "%filename%", "%filename_ext%", "%directoryname%", "%last_modified%", "%first_played%", "%first_played_timestamp%", "%last_played%", "%last_played_timestamp%", "%added%", "%path%", "%_path_raw%", "%subsong%", "%_foobar2000_version%", "$info(codec)", "$info(codec_profile)", "$info(samplerate)", "$info(bitrate)", "$info(tool)", "$info(encoding)", "$info(channels)", "$info(bitspersample)", "$info(tagtype)", "$info(cue_embedded)", "$info(md5)", "$info(ENC_DELAY)", "$info(ENC_PADDING)", "$info(MP3_ACCURATE_LENGTH)", "$info(MP3_STEREO_MODE)", "$info(VERSION)", "$info(FLAGS)", "$channels()", "%replaygain_album_gain%", "%replaygain_album_peak%", "%replaygain_track_gain%", "%replaygain_track_peak%");
if (alpha) {
    tfarray.sort();
}

var resarray;
var g_text;
create_string();
var ww = 0,
    wh = 0;
var g_need_calc = true;
var g_textheight = 0;
var g_offset = 0;
var g_drag = false;
var g_drag_y = 0;

//global Variables for text field
var DT_TOP = 0x00000000;
var DT_LEFT = 0x00000000;
var DT_CENTER = 0x00000001;
var DT_RIGHT = 0x00000002;
var DT_VCENTER = 0x00000004;
var DT_BOTTOM = 0x00000008;
var DT_WORDBREAK = 0x00000010;
var DT_SINGLELINE = 0x00000020;
var DT_EXPANDTABS = 0x00000040;
var DT_TABSTOP = 0x00000080;
var DT_NOCLIP = 0x00000100;
var DT_EXTERNALLEADING = 0x00000200;
var DT_CALCRECT = 0x00000400;
var DT_NOPREFIX = 0x00000800;
var DT_INTERNAL = 0x00001000;
var DT_EDITCONTROL = 0x00002000;
var DT_PATH_ELLIPSIS = 0x00004000;
var DT_END_ELLIPSIS = 0x00008000;
var DT_MODIFYSTRING = 0x00010000;
var DT_RTLREADING = 0x00020000;
var DT_WORD_ELLIPSIS = 0x00040000;
var DT_NOFULLWIDTHCHARBREAK = 0x00080000;
var DT_HIDEPREFIX = 0x00100000;
var DT_PREFIXONLY = 0x00200000;

function on_paint(gr) {
    gr.FillSolidRect(0, 0, ww, wh, dui == 1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
    if (g_need_calc) {
        calc();
    } else {
        gr.GdiDrawText(g_text, g_font, color2, 5, g_offset, ww-10, wh - g_offset, DT_LEFT | DT_WORDBREAK | DT_NOPREFIX);
    }
}

function on_size() {
    ww = window.Width;
    wh = window.Height;
    reset();
}

function create_string() {
    resarray = new Array();
    for (i = 0; i < tfarray.length; i++) {
        resarray.push(tfarray[i] + " = " + fb.TitleFormat(tfarray[i]).Eval());
    }
    g_text = resarray.join("\n");
}

function calc() {
    // Using a temp IGdiGraphics interface
    var temp_bmp = gdi.CreateImage(1, 1);
    // Don't forget to call temp_bmp.ReleaseGraphics(temp_gr)!
    var temp_gr = temp_bmp.GetGraphics();

    // Calculate
    arr = temp_gr.GdiDrawText(g_text, g_font, color2, 5, 0, ww, wh, DT_VCENTER | DT_CENTER | DT_WORDBREAK | DT_CALCRECT | DT_NOPREFIX).toArray();

    g_textheight = arr[3] - arr[1];
    g_offset = wh / 2;
    g_need_calc = false;

    // Free the resources
    temp_bmp.ReleaseGraphics(temp_gr);
    temp_bmp.Dispose();
    temp_gr = null;
    temp_bmp = null;
    window.Repaint();
}

function on_playback_new_track() {
    create_string();
    window.Repaint();
}

function on_playback_pause() {
    create_string();
    window.Repaint();
}

function on_playback_stop() {
    create_string();
    window.Repaint();
}

function on_mouse_lbtn_down(x, y) {
    fb.trace(g_text)
    g_drag = true;
    g_drag_y = y;
}

function on_mouse_lbtn_up(x, y) {
    g_drag = false;
}

function on_mouse_move(x, y) {
    if (g_drag) {
        applyDelta(y - g_drag_y);
        g_drag_y = y;
    }
}

function on_mouse_wheel(step) {
    applyDelta(step * 20);
}

function applyDelta(delta) {
    var temp = g_offset + delta;
    if ((temp <= wh /2) && (temp >= wh/2 - g_textheight)) {
        g_offset = temp;
        window.Repaint();
    }
}

function reset() {
    g_need_calc = true;
    g_offset = 0;
}

function on_colors_changed() {
    color2 = dui === 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
    window.Repaint();
}

function on_font_changed() {
    g_font = dui === 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
    window.Repaint();
}


EDIT: Danke tedgo, korrigiert!

Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 25. Februar 2010, 09:30:36
Da fehlt on_mouse_lbtn_up(), um g_drag wieder auf "false" zu setzen ;)
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Spirit_of_the_ocean in 26. Februar 2010, 21:59:10
Ich bin derzeit dabei mir etwas zusammen zu basteln:
Es ist eine Anzeige mit Cover, Liedinformationen, Ratinganzeige.

So sieht es derzeit aus:
Fehlerhafter Link entfernt - tedgo

Ich habe mich leider noch nicht ganz bezüglich der Textpositionierung entscheiden können :D

Ich möchte auf der einen Seite den aktuell abgespielten Titel anzeigen lassen und auf der anderen Seite statistische Informationen anzeigen lassen.

Wenn ich fertig bin, kann ich den Code hochladen.

EDIT:
Frage: Wie bekomme ich den Text größer? Ich möchte gerne den aktuell abgespielten Titel in größerer Schrift anzeigen lassen.

Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Spirit_of_the_ocean in 26. Februar 2010, 23:36:32
Sorry, dass ich nochmal poste. Ich habe nun folgendes Problem. Ich habe folgenden Code
DT_CENTER = 0x00000001;
DT_VCENTER = 0x00000004;
DT_WORDBREAK = 0x00000010;
DT_CALCRECT = 0x00000400;
DT_NOPREFIX = 0x00000800;
DT_LEFT = 0x00000000;
DT_RIGHT = 0x00000002;

AlbumArtId = {
front: 0,
back: 1,
disc: 2,
icon: 3
};


function RGB(r,g,b){ return (0xff000000|(r<<16)|(g<<8)|(b)); }

var ui_backcol, ui_textcol, ui_font;
var ui_type = window.InstanceType;
var ww = 0; wh = 0;
var g_drag = 0;
var bool;
var g_metadb;
var imgname;
var rating;
var nrating;
var lrating;
var img;
var hofset=120;
var imgw=20;
var g_tfo = fb.TitleFormat("%rating%");
var g_img2 = null;

on_item_focus_change();

function get_colors() {
ui_backcol = ui_type == 0 ? window.GetColorCUI(3) : window.GetColorDUI(1);
ui_textcol = ui_type == 0 ? window.GetColorCUI(0) : window.GetColorDUI(0);
}

get_colors();

function on_colors_changed() {
get_colors();
window.Repaint();
}

function get_font() {
ui_font = ui_type == 0 ? window.GetFontCUI(0) : window.GetFontDUI(0);
}

get_font();

function on_font_changed(){
get_font();
window.Repaint();
}

function on_paint(gr) {
    var tfo = fb.Titleformat("%codec%").Eval();
    var g_img = gdi.Image(fb.FoobarPath + "icons\\" + tfo + "256.png");
    var pos_mitte = ((ww / 2)-128) / 2, pos_y = 0;
    var pos_x = (ww / 2)-75, pos_y = 0;

  gr.DrawImage(g_img, 100,10, 128, 128, 0, 0, g_img.Width, g_img.Height); 
// var info = g_metadb.GetFileInfo();


// Draw front cover
if (g_img2) {
// Keep aspect ratio
var scale_w = ww / g_img2.Width / 2;
var scale_h = wh / g_img2.Height / 2;
var scale = Math.min(scale_w, scale_h);
var pos_x = (ww / 2)-75, pos_y = 0;

//if (scale_w < scale_h)
// pos_y = (wh - g_img.height * scale) / 2;
//else if (scale_w > scale_h)
    //pos_x = (ww - g_img.Width * scale) / 2;

//gr.DrawImage(g_img2, pos_x,10, 150, 150, 0, 0, g_img2.Width, g_img2.Height);
}
}

function on_size() {
ww = window.Width;
wh = window.Height;
}

function on_playback_new_track() {
window.Repaint();
}

function on_playback_stop() {
window.Repaint();
}

function on_mouse_wheel(delta){}


function on_mouse_lbtn_up(x,y){
// fb.trace("button up");
if (lrating !=rating) {if (g_metadb) {
bool = fb.RunContextCommandWithMetadb("Rating/"+((lrating==0) ? "<not set>" : lrating),g_metadb);
}}
}

function on_mouse_move(x, y) {
if (g_metadb) {
g_drag = 1;
nrating = Math.ceil((x-hofset)/imgw);
if (nrating > 5) nrating = 5;
if (nrating != lrating) {
lrating = nrating;
window.Repaint();
}
}
}
function on_mouse_leave() {
on_metadb_changed()
}

function on_item_focus_change() {
// fb.trace("itm focus changed");
if (g_metadb) {window.UnwatchMetadb();}
g_metadb = fb.GetFocusItem();
if (g_metadb) {
on_metadb_changed();
window.WatchMetadb(g_metadb);
}

}
function on_metadb_changed() {
g_drag = 0;
// fb.trace("changed");
rating = g_tfo.EvalWithMetadb(g_metadb);
if (rating == "?") {rating = 0;}
lrating = rating;
window.Repaint();
}

function on_playback_new_track(metadb) {on_item_focus_change();}

function on_playback_new_track(metadb) {
if (metadb)
utils.GetAlbumArtAsync(window.ID, metadb, AlbumArtId.front);
g_img = null;
}
function on_playback_new_track(metadb) {
if (metadb)
utils.GetAlbumArtAsync(window.ID, metadb, AlbumArtId.front);
g_img2 = null;
}

function on_get_album_art_done(metadb, art_id, image, image_path) {
fb.trace("Path:", image_path);
g_img2 = image;
window.Repaint();
}

on_playback_new_track(fb.GetNowPlaying());

//EOF



Ich bekomme immer die Meldung:
Error: WSH Panel Mod (GUID: FE4D9D68-0357-43F8-870E-252F74F514BE): Laufzeitfehler in Microsoft JScript:
Objekt erforderlich
Ln: 66, Col: 3
<no source text available>


Ich habe allerdings Albumart mit einem ähnlichen Code laufen ohne Probleme.

Der Fehler muss in der Zeile:
Zitatgr.DrawImage(g_img, 100,10, 128, 128, 0, 0, g_img.Width, g_img.Height); 
sein.

Dennoch kann ich den Fehler nicht finden. Anscheinend hat er ein Problem mit g_img? Oder sehe ich das falsch?

Wo liegt der Fehler?

Komisch ist auch, dass bei apply das Bild angezeigt wird und auch wenn der Player weiterläuft. Nur wenn man manuell weiterschaltet oder anhält wird gemeckert.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 27. Februar 2010, 00:24:50
Das Problem liegt in Zeile 62:

var g_img = gdi.Image(fb.FoobarPath + "icons\\" + tfo + "256.png");

Der Pfad (path) ist falsch oder das Bild nicht vorhanden.
Dies liegt wahrscheinlich an tfo. Läuft kein track ist tfo null oder "" und der Dateiname stimmt nicht.

Lösung ungefähr:

if (tfo !== "") {var g_img = gdi.Image(fb.FoobarPath + "icons\\" + tfo + "256.png");}
else {var g_img = gdi.Image("c:\\kein Bild vorhanden.jpg");}
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 27. Februar 2010, 08:59:09
Einfache Lösung z. B.:
g_img && gr.DrawImage(g_img, 100,10, 128, 128, 0, 0, g_img.Width, g_img.Height);
Dann wird das Bild nur dann gezeichnet, wenn g_img vorhanden ist.

Um das "Flackern" beim Track-Wechsel zu vermeiden, ändere on_playback_stop:

function on_playback_stop(reason) {
reason != 2 && window.Repaint();
}


Du hast in deinem Code aber eine Menge stehen, u. a. vier mal on_playback_new_track().
Da musst du noch gehörig aufräumen ;)
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 27. Februar 2010, 11:30:22
Danke für die Idee, Spirit,

ich habe die Codec-Bilder jetzt in mein Statistics2-Skript eingebaut.

Die Codec-Bilder müssen als png im icons-Ordner der foobar2000-Installation vorliegen.
Ich habe 48x48pixel aus den ico-files extrahiert.

Leider gibt es noch einen Skript-Error, wenn man versucht einen Codec abzuspielen, dessen Bild nicht vorhanden ist.
Vielleicht habt ihr ja ne Idee?

Code kommt im nächsten post, da 20000Zeichen Limit pro post!!!
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 27. Februar 2010, 12:19:58
Statistics2


//statistics2 by grimes
//4 digits %date% format required
//fb2k 1.0+, WSH Panel Mod 1.3.0+ required
//DUI/CUI ready


function RGB(r, g, b) {
    return (0xff000000 | (r << 16) | (g << 8) | (b));
}

var g_img;
var codec;
if(fb.IsPlaying || fb.IsPaused) {
   codec = fb.TitleFormat("%codec%").Eval();
   g_img = gdi.Image(fb.FoobarPath + "icons\\" + codec + ".png");     
}
else {
    g_img = gdi.Image(fb.FoobarPath + "icons\\generic.png");
}
var avgrating = 0;
var avgplaycount = 0;
var on_playback_time2 = 0;
var on_playback_new_track2 = 0;
var on_playback_new_track3 = 0;
var avgtracktime = 0;

var rating = "NaN";
var rating2 = 0;
var rating3 = 0;
var avgrating = 0;
var minrating = 0;
var maxrating = 0;
var ranrating = 0;
var devrating = 0;

var playcount = "NaN";
var playcount2 = 0;
var playcount3 = 0;
var playcount4 = 0;
var avgplaycount = 0;
var minplaycount = 0;
var maxplaycount = 0;
var ranplaycount = 0;
var devplaycount = 0;

var year = 0;
var date = 0;
var difyear = 0;
var date2 = 0;
var avgdate = 0;
var difdate = 0;

var today = 0;
var ar_days = 0;
var ar_years = 0;
var ar_days2 = 0;
var ar_years2 = 0;
var ar_days3 = 0;
var ar_years3 = 0;
var ar_days4 = 0;
var ar_years4 = 0;

var losslesscount = 0;
var lossycount = 0;
var losslessproc = 50;
var lossyproc = 50;

var bitrate = 0;
var bitrate2 = 0;
var bitrate3 = 0;
var avgbitrate = 0;
var minbitrate = 0;
var maxbitrate = 0;
var ranbitrate = 0;
var devbitrate = 0;

var filesize = 0;
var filesize2 = 0;
var avgfilesize = 0;
var bfilesize = 0;
var bfilesize2 = 0;
var bavgfilesize = 0;

var length = 0;
var length_seconds = 0;
var length_seconds2 = 0;
var avglength_seconds = 0;

var days = 0;
var hours = 0;
var minutes = 0;
var seconds = 0;

var playbacktimeperc = 0;
var compressionperc = 0;
var compressionperc2 = 0;
var avgcompressionperc = 0;
var mincompressionperc = 0;
var maxcompressionperc = 0;
var rancompressionperc = 0;

var totaltracks = 0;
var totaltracks2 = 0;
var avgtotaltracks = 0;
var mintotaltracks = 0;
var maxtotaltracks = 0;
var rantotaltracks = 0;

var tracknumber = 0;
var tracknumber2 = 0;
var avgtracknumber = 0;
var mintracknumber = 0;
var maxtracknumber = 0;
var rantracknumber = 0;

function readablizeBytes(bytes) {
    var s = ['bytes', 'kb', 'MB', 'GB', 'TB', 'PB'];
    var e = Math.floor(Math.log(bytes) / Math.log(1024));
    return (bytes / Math.pow(1024, Math.floor(e))).toFixed(2) + " " + s[e];
}

var dui = window.InstanceType;

var g_font = dui == 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
//var color = RGB(200,0,0);
var color = dui == 1 ? window.GetColorDUI(2) : RGB(200,0,0);
//var color2 = RGB(0,0,0);
var color2 = dui == 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);

//global Variables for text field
var DT_TOP = 0x00000000;
var DT_LEFT = 0x00000000;
var DT_CENTER = 0x00000001;
var DT_RIGHT = 0x00000002;
var DT_VCENTER = 0x00000004;
var DT_BOTTOM = 0x00000008;
var DT_WORDBREAK = 0x00000010;
var DT_SINGLELINE = 0x00000020;
var DT_EXPANDTABS = 0x00000040;
var DT_TABSTOP = 0x00000080;
var DT_NOCLIP = 0x00000100;
var DT_EXTERNALLEADING = 0x00000200;
var DT_CALCRECT = 0x00000400;
var DT_NOPREFIX = 0x00000800;
var DT_INTERNAL = 0x00001000;
var DT_EDITCONTROL = 0x00002000;
var DT_PATH_ELLIPSIS = 0x00004000;
var DT_END_ELLIPSIS = 0x00008000;
var DT_MODIFYSTRING = 0x00010000;
var DT_RTLREADING = 0x00020000;
var DT_WORD_ELLIPSIS = 0x00040000;
var DT_NOFULLWIDTHCHARBREAK = 0x00080000;
var DT_HIDEPREFIX = 0x00100000;
var DT_PREFIXONLY = 0x00200000;

function on_paint(gr) {
    gr.FillSolidRect(0, 0, window.Width, window.Height, dui === 1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
    gr.GdiDrawText("on_playback_new_track = " + on_playback_new_track2, g_font, color, 5, 5, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
if (playbacktimeperc === 20 || playbacktimeperc === 40 || playbacktimeperc === 60 || playbacktimeperc === 80 || playbacktimeperc >=90) {
gr.GdiDrawText("playbacktime = " + playbacktimeperc + "%", g_font, color, 5, 25, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
}
else {gr.GdiDrawText("playbacktime = " + playbacktimeperc + "%", g_font, color2, 5, 25, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);}
gr.GdiDrawText("rating = " + rating + ", avg = " + avgrating + ", max = " + maxrating + ", min = " + minrating + ", ran = " + ranrating + ", dev = " + devrating, g_font, color2, 5, 65, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("playcount = " + playcount + ", sum = " + playcount4 + ", avg = " + avgplaycount + ", max = " + maxplaycount + ", min = " + minplaycount + ", ran = " + ranplaycount + ", dev = " + devplaycount, g_font, color2, 5, 85, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("on_playback_time = " + on_playback_time2 + "s ("+ days + "d" + hours + "h" + minutes + "m" + seconds + "s), avg = " + avgtracktime + "s", g_font, color2, 5, 45, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("bitrate = " + bitrate + "kbps, avg = " + avgbitrate + ", max = " + maxbitrate + ", min = " + minbitrate + ", ran = " + ranbitrate + ", dev = " + devbitrate, g_font, color2, 5, 105, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("filesize = " + filesize + ", sum = " + filesize2 + ", avg = " + avgfilesize, g_font, color2, 5, -65, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("tracklength = " + length + " (" + length_seconds + "s), sum = " + length_seconds2 + "s, avg = " + avglength_seconds + "s", g_font, color2, 5, 125, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
gr.GdiDrawText("track number = " + tracknumber + ", sum = " + tracknumber2 + ", avg = " + avgtracknumber + ", max = " + maxtracknumber + ", min = " + mintracknumber + ", ran = " + rantracknumber, g_font, color2, 5, 145, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
gr.GdiDrawText("total tracks = " + totaltracks + ", sum = " + totaltracks2 + ", avg = " + avgtotaltracks + ", max = " + maxtotaltracks + ", min = " + mintotaltracks + ", ran = " + rantotaltracks, g_font, color2, 5, 165, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
//gr.GdiDrawText("current date (year) = " + year, g_font, RGB(80, 80, 80), 0, 20, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("recording year = " + date + " (" + difyear + " years ago)" + ", avg = " + avgdate + " (" + difdate + " years ago)", g_font, color2, 5,185, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);   
    gr.GdiDrawText("added to media library " + ar_days + " days ago (" + Math.floor(ar_years) + " years)", g_font, color2, 5, 205, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("first played " + ar_days2 + " days ago (" + Math.floor(ar_years2) + " years) ", g_font, color2, 5, 225, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("last played " + ar_days3 + " days ago (" + Math.floor(ar_years3) + " years)", g_font, color2, 5, 245, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    if (playcount === 0) {
        gr.GdiDrawText("Never", g_font, color, 240, 225, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
        gr.GdiDrawText("Never", g_font, color, 240, 245, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    }
    gr.GdiDrawText("last modified " + ar_days4 + " days ago (" + Math.floor(ar_years4) + " years)", g_font, color2, 5, 265, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("lossless = " + losslesscount + " (" + losslessproc + "%), lossy = " + lossycount + " (" + lossyproc + "%)", g_font, color2, 5, 285, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
gr.GdiDrawText("lossless compression = " + compressionperc + "%, avg = " + avgcompressionperc + "%, max = " + maxcompressionperc + "%, min = " + mincompressionperc + "%, ran = " + rancompressionperc + "%", g_font, color2, 5, 305, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("active playlist = " + fb.GetPlaylistName(fb.ActivePlaylist) + " (" + fb.ActivePlaylist + "/" + fb.PlaylistCount + ")", g_font, color2, 5, 325, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("playing playlist = " + fb.GetPlaylistName(fb.PlayingPlaylist) + " (" + fb.PlayingPlaylist + "/" + fb.PlaylistCount + ")", g_font, color2, 5, 345, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    g_img && gr.DrawImage(g_img, 300,230, 128, 128, 0, 0, g_img.Width*2, g_img.Height*2); 
}



function on_playback_time(time) {
    on_playback_time2++;
var dt = new Date(on_playback_time2 * 1000);
    seconds = dt.getUTCSeconds();
    minutes = dt.getUTCMinutes();
    hours = dt.getUTCHours();
    days = Math.floor(on_playback_time2 / 86400);
    if (on_playback_new_track2 >= 1) {
        avgtracktime = Math.round(on_playback_time2 / on_playback_new_track2);
    }
playbacktimeperc = fb.PlaybackTime*100/fb.PlaybackLength;
playbacktimeperc = Math.round(playbacktimeperc);
   
window.Repaint();
}



function on_playback_new_track() {
    on_playback_new_track2++;
    codec = fb.TitleFormat("%codec%").Eval();
    g_img = gdi.Image(fb.FoobarPath + "icons\\" + codec + ".png");
    rating = fb.TitleFormat("%rating%");
    rating = rating.Eval();
    rating = parseInt(rating);
    rating2 += rating;
rating3 += (rating * rating);
if (on_playback_new_track2 === 1) {
minrating = rating;
maxrating = rating;
}
avgrating = rating2 / on_playback_new_track2;
avgrating = Math.round(avgrating * 100) / 100;
minrating = Math.min(minrating,rating);
maxrating = Math.max(maxrating,rating);
ranrating = maxrating - minrating;
devrating = Math.sqrt((on_playback_new_track2 * rating3) - (rating2 * rating2)) / on_playback_new_track2;
    devrating = Math.round(devrating * 100) / 100;

    playcount = fb.TitleFormat("%play_count%");
    playcount = playcount.Eval();
    playcount = parseInt(playcount);
    playcount2 += playcount;
playcount4 += playcount;
    playcount3 += (playcount * playcount);
if (on_playback_new_track2 === 1) {
minplaycount = playcount;
maxplaycount = playcount;
}
avgplaycount = playcount4 / on_playback_new_track2;
avgplaycount = Math.round(avgplaycount * 100) / 100;
minplaycount = Math.min(minplaycount,playcount);
maxplaycount = Math.max(maxplaycount,playcount);
ranplaycount = maxplaycount - minplaycount;
devplaycount = Math.sqrt((on_playback_new_track2 * playcount3) - (playcount2 * playcount2)) / on_playback_new_track2;
    devplaycount = Math.round(devplaycount * 100) / 100;

    date = fb.TitleFormat("%date%");
    date = date.Eval();
    date = parseInt(date);
    dt = new Date();
    year = dt.getFullYear();
    difyear = year - date;
    date2 = date2 + date;
    if (on_playback_new_track2 >= 2) {
        avgdate = date2 / on_playback_new_track2;
        avgdate = Math.round(avgdate);
        difdate = year - avgdate;
    }

    today = new Date();
    var fpy = fb.TitleFormat("$year(%added%)").Eval();
    var fpm = fb.TitleFormat("$sub($month(%added%),1)").Eval();
    var fpd = fb.TitleFormat("$day_of_month(%added%)").Eval();
    var fday = new Date(fpy, fpm, fpd);
    var one_day = 1000 * 60 * 60 * 24;
    if (fday > 0) {
        ar_days = Math.floor((today.getTime() - fday.getTime()) / one_day);
        ar_years = ar_days / 365;
    }
    fpy = fb.TitleFormat("$year(%first_played%)").Eval();
    fpm = fb.TitleFormat("$sub($month(%first_played%),1)").Eval();
    fpd = fb.TitleFormat("$day_of_month(%first_played%)").Eval();
    fday = new Date(fpy, fpm, fpd);
    one_day = 1000 * 60 * 60 * 24;
    if (fday > 0) {
        ar_days2 = Math.floor((today.getTime() - fday.getTime()) / one_day);
        ar_years2 = ar_days2 / 365;
    } else {
        ar_days2 = 0;
    }

    fpy = fb.TitleFormat("$year(%last_played%)").Eval();
    fpm = fb.TitleFormat("$sub($month(%last_played%),1)").Eval();
    fpd = fb.TitleFormat("$day_of_month(%last_played%)").Eval();
    fday = new Date(fpy, fpm, fpd);
    one_day = 1000 * 60 * 60 * 24;
    if (fday > 0) {
        ar_days3 = Math.floor((today.getTime() - fday.getTime()) / one_day);
        ar_years3 = ar_days3 / 365;
    } else {
        ar_days3 = 0;
    }

    fpy = fb.TitleFormat("$year(%last_modified%)").Eval();
    fpm = fb.TitleFormat("$sub($month(%last_modified%),1)").Eval();
    fpd = fb.TitleFormat("$day_of_month(%last_modified%)").Eval();
    fday = new Date(fpy, fpm, fpd);
    one_day = 1000 * 60 * 60 * 24;
    if (fday > 0) {
        ar_days4 = Math.floor((today.getTime() - fday.getTime()) / one_day);
        ar_years4 = ar_days4 / 365;
    } else {
        ar_days4 = 0;
    }

    var lossless = fb.Titleformat("$info(encoding)").Eval();
    if (lossless === "lossless") {
        losslesscount++;
    } else {
        lossycount++;
    }

    losslessproc = Math.round(losslesscount * 1000 / (lossycount + losslesscount)) / 10;
    lossyproc = Math.round(lossycount * 1000 / (lossycount + losslesscount)) / 10;

    if (lossless === "lossless") {
        on_playback_new_track3++;
        var bitratex = fb.TitleFormat("%bitrate%").Eval();
    bitratex = parseInt(bitratex);
    var samplerate = fb.TitleFormat("%samplerate%").Eval();
    samplerate = parseInt(samplerate);
    var bitspersample = fb.TitleFormat("$info(bitspersample)").Eval();
    bitspersample = parseInt(bitspersample);
    var channels = fb.TitleFormat("$info(channels)").Eval();
    channels = parseInt(channels);
        compressionperc = (bitratex*100000)/(samplerate*bitspersample*channels);
    compressionperc = Math.round(compressionperc);
    compressionperc2 = compressionperc2 + compressionperc;
        avgcompressionperc = compressionperc2 / on_playback_new_track3;
        avgcompressionperc = Math.round(avgcompressionperc * 100) / 100;
    if (on_playback_new_track2 === 1) {
    mincompressionperc = compressionperc;
    maxcompressionperc = compressionperc;
    }
    mincompressionperc = Math.min(mincompressionperc,compressionperc);
    maxcompressionperc = Math.max(maxcompressionperc,compressionperc);
    rancompressionperc = maxcompressionperc - mincompressionperc;
    }
   
    bitrate = fb.Titleformat("%bitrate%").Eval();
    bitrate = parseInt(bitrate);
    bitrate2 += bitrate;
    avgbitrate = bitrate2 / on_playback_new_track2;
    avgbitrate = Math.round(avgbitrate * 100) / 100;
if (on_playback_new_track2 === 1) {
minbitrate = bitrate;
maxbitrate = bitrate;
}
bitrate3 += (bitrate * bitrate);
minbitrate = Math.min(minbitrate,bitrate);
maxbitrate = Math.max(maxbitrate,bitrate);
ranbitrate = maxbitrate - minbitrate;
devbitrate = Math.sqrt((on_playback_new_track2 * bitrate3) - (bitrate2 * bitrate2)) / on_playback_new_track2;
    devbitrate = Math.round(devbitrate * 100) / 100;


    bfilesize = fb.Titleformat("%filesize%").Eval();
    bfilesize = parseInt(bfilesize);
    filesize = readablizeBytes(bfilesize);
    bfilesize2 += bfilesize;
    filesize2 = readablizeBytes(bfilesize2);
    bavgfilesize = bfilesize2 / on_playback_new_track2;
    bavgfilesize = Math.round(bavgfilesize * 100) / 100;
    avgfilesize = readablizeBytes(bavgfilesize);

length = fb.Titleformat("%length%").Eval();
    length_seconds = fb.Titleformat("%length_seconds%").Eval();
    length_seconds = parseInt(length_seconds);
    length_seconds2 = length_seconds2 + length_seconds;
    avglength_seconds = length_seconds2 / on_playback_new_track2;
    avglength_seconds = Math.round(avglength_seconds * 100) / 100;
    avgfilesize = readablizeBytes(bavgfilesize);

totaltracks = fb.Titleformat("%totaltracks%").Eval();
totaltracks = parseInt(totaltracks,10);
totaltracks2 += totaltracks;
avgtotaltracks = totaltracks2 / on_playback_new_track2;
avgtotaltracks = Math.round(avgtotaltracks * 100) / 100;
if (on_playback_new_track2 === 1) {
mintotaltracks = totaltracks;
maxtotaltracks = totaltracks;
}
mintotaltracks = Math.min(mintotaltracks,totaltracks);
maxtotaltracks = Math.max(maxtotaltracks,totaltracks);
rantotaltracks = maxtotaltracks - mintotaltracks;

tracknumber = fb.Titleformat("%tracknumber%").Eval();
tracknumber = parseInt(tracknumber,10);
tracknumber2 += tracknumber;
avgtracknumber = tracknumber2 / on_playback_new_track2;
avgtracknumber = Math.round(avgtracknumber * 100) / 100;
if (on_playback_new_track2 === 1) {
mintracknumber = tracknumber;
maxtracknumber = tracknumber;
}
mintracknumber = Math.min(mintracknumber,tracknumber);
maxtracknumber = Math.max(maxtracknumber,tracknumber);
rantracknumber = maxtracknumber - mintracknumber;

    window.Repaint();
}


function on_playback_stop(reason) {
    ar_days = 0;
    ar_days2 = 0;
    ar_days3 = 0;
    ar_days4 = 0;
    ar_years = 0;
    ar_years2 = 0;
    ar_years3 = 0;
    ar_years4 = 0;
    date = 0;
    difyear = 0;
    playcount = "NaN";
    rating = "NaN";
bitrate = 0;
filesize = 0;
length = 0;
length_seconds = 0;
playbacktimeperc = 0;
compressionperc = 0;
tracknumber = 0;
totaltracks = 0;
    g_img = gdi.Image(fb.FoobarPath + "icons\\generic.png");
    reason != 2 && window.Repaint();
}



function on_item_played() {
    playcount++;
    playcount4++;

if (on_playback_new_track2 === 1) {
minplaycount = playcount;
maxplaycount = playcount;
}
avgplaycount = playcount4 / on_playback_new_track2;
avgplaycount = Math.round(avgplaycount * 100) / 100;
minplaycount = Math.min(minplaycount,playcount);
maxplaycount = Math.max(maxplaycount,playcount);
ranplaycount = maxplaycount - minplaycount;

ar_years3 = 0;
ar_days3 = 0;
    window.Repaint();
}

function on_playlist_switch() {
    window.Repaint();   
}

function on_colors_changed() {
    color = dui === 1 ? window.GetColorDUI(2) : RGB(200,0,0);
    color2 = dui === 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
    window.Repaint();
}

function on_font_changed() {
    g_font = dui ===1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
    window.Repaint();
}
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 27. Februar 2010, 12:20:43
Zitat von: grimes in 27. Februar 2010, 11:30:22
Leider gibt es noch einen Skript-Error, wenn man versucht einen Codec abzuspielen, dessen Bild nicht vorhanden ist.
Vielleicht habt ihr ja ne Idee?
Ich habe nur bestimmte codecbilder die ich dann in ein Array eingetragen habe:

var codec;
var cimages = { mp3: "images\\mp3.png",
flac: "images\\flac.png",
wma: "images\\wma.png" };

on_paint() {
if(codec != null) {
cimg = gdi.Image(fb.FoobarPath + "images\\nocodec.png");
if(cimages[codec.toLowerCase()]) {
cimg = gdi.Image(fb.FoobarPath + cimages[codec.toLowerCase()]);
}
gr.DrawImage(cimg, 2, wh - 25, 24, 24, 0, 0, 24, 24, 0, 255);
}
}
function on_playback_new_track(metadb) {
        codec = null;
if(fb.IsMetadbInMediaLibrary(metadb)) {
codec = fb.TitleFormat("%codec%").EvalWithMetadb(metadb);
window.repaint();
}
}
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 27. Februar 2010, 12:43:05
Schön! Hat allerdings den Nachteil, dass man am Skript rumfummeln muss, wenn ein neues Codec-Bild dazukommt.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 27. Februar 2010, 13:03:43
@grimes
Siehe mein Post oben...

Außerdem evaluierst du überflüssigerweise die Variable codec beim Start.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 27. Februar 2010, 13:07:57
@tedgo:
Hab ich ja versucht, klappt bloß nicht, weil ich wenn der track nicht spielt das foobar2000-Standardbild generic.png einblende.
g_img ist also immer definiert, sodass g_img && gr.DrawImage(g_img, 100,10, 128, 128, 0, 0, g_img.Width, g_img.Height); nichts bringt.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 27. Februar 2010, 13:21:55
Na, dann evaluiere den Codec in on_paint:

var codec = fb.TitleFormat("%codec%");
var g_img;

function on_paint(gr) {
    if (fb.IsPlaying || fb.IsPaused) g_img = gdi.Image(fb.FoobarPath + "icons\\" + codec.Eval() + ".png");
    else g_img = gdi.Image(fb.FoobarPath + "icons\\generic.png");
    g_img && gr.DrawImage(g_img, 100,10, 128, 128, 0, 0, g_img.Width, g_img.Height);
}
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 27. Februar 2010, 13:42:38
Super! Folgender code in on_paint reicht doch:


g_img && gr.DrawImage(g_img, 100,10, 128, 128, 0, 0, g_img.Width, g_img.Height);


codec-Variablen Definition kann bleiben, wo sie ist.
Ist übrigens nach meiner Meinung "dirty code" in on_paint Variablen zu evaluieren. Dort sollten nur die Zeichnungselemente stehen (wie der Name schon sagt).

Jetzt wird bei unbekannten (kein Bild vorhanden) Codec nichts angezeigt und der Script-error passiert nicht mehr.

tedgo for president. :crazy:
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 27. Februar 2010, 14:14:18
Zitat von: grimes in 27. Februar 2010, 13:42:38
Ist übrigens nach meiner Meinung "dirty code" in on_paint Variablen zu evaluieren. Dort sollten nur die Zeichnungselemente stehen (wie der Name schon sagt).
Außerhalb einer Funktion ist es hingegen sinnlos, da es dann nur bei der Initiierung des Panels evaluiert wird ;).
Deshalb entweder in on_paint() oder meinetwegen auch - wie du es ja zusätzlich hast - in on_playback_new_track()
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 27. Februar 2010, 14:28:26
Meiner Meinung nach sollte die Variablenevaluation immer in der Aktion (Callback) stehen, niemals in on_paint, weil on_paint ja bei allen möglichen Aktionen aufgerufen wird und bei den meisten Aktionen ist es unnötig eine spezielle Variable zu evaluieren.
Zusätzlich sollte man auch zur Initiierung des Panels die Variable evaluieren. Die Initiierung ist ja streng genommen auch eine Aktion, die eine Variablenevaluation nötig macht.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 27. Februar 2010, 18:50:39
Ich habe die History-Skripte überarbeitet und, da sie alle sehr ähnlich sind, in eine Version zusammengepackt.

History

Skript besteht aus folgenden Varianten:


Die Variante kann durch rechtsklick in WSH-Panel | Properties gewählt werden.


//history by grimes
//fb2k 1.0+, WSH Panel Mod 1.3.2+ required
//DUI/CUI ready

function RGB(r, g, b) {
    return (0xff000000 | (r << 16) | (g << 8) | (b));
}

var dui = window.InstanceType;
var g_font = dui === 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
//var color = RGB(200,0,0);
var color = dui === 1 ? window.GetColorDUI(2) : RGB(200, 0, 0);
//var color2 = RGB(0,0,0);
var color2 = dui === 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);

var tagcount = 0;
var tagname;
var sum = 0;

var proc = 100;

var writtentoconsole = false;

var itemplayed = window.GetProperty("show only items played >1min", false);
var historysize = window.GetProperty("history size", 22);
var displayeditems = window.GetProperty("displayed items", 22);

var tagchoice1 = window.GetProperty("playlist history", true);
if (tagchoice1) {
    var tag = fb.GetPlaylistName(fb.ActivePlaylist);
    tagname = "Playlist";
}
var tagchoice2 = window.GetProperty("album history", false);
if (tagchoice2) {
    var tag = "%album%";
    tagname = "Album";
}
var tagchoice3 = window.GetProperty("artist history", false);
if (tagchoice3) {
    var tag = "%artist%";
    tagname = "Artist";
}
var tagchoice4 = window.GetProperty("genre history", false);
if (tagchoice4) {
    var tag = "%genre%";
    tagname = "Genre";
}
var tagchoice5 = window.GetProperty("performer history", false);
if (tagchoice5) {
    var tag = "%performer%";
    tagname = "Performer";
}
var tagchoice6 = window.GetProperty("track title history", false);
if (tagchoice6) {
    var tag = "%track% %title%";
    tagname = "Track Title";
}
var tagchoice7 = window.GetProperty("composer history", false);
if (tagchoice7) {
    var tag = "%composer%";
    tagname = "Composer";
}

if (tagchoice1) {
    var activetag = new Array(tag);
    tagcount = 1;
    sum = 1;
} else {
    var activetag = new Array();
}
activetag.reverse();

if ((fb.IsPlaying || fb.IsPaused) && (!tagchoice1) && (!itemplayed)) {
    activetag.unshift(fb.TitleFormat(tag).Eval());
    tagcount = 1;
    sum = 1;
}
var datestamp = new Array(Date());
datestamp.reverse();

var equaltag = 1;
var equaltagarray = new Array();
equaltagarray.reverse();

var totalstring = new Array();

//global Variables for text field
var DT_TOP = 0x00000000;
var DT_LEFT = 0x00000000;
var DT_CENTER = 0x00000001;
var DT_RIGHT = 0x00000002;
var DT_VCENTER = 0x00000004;
var DT_BOTTOM = 0x00000008;
var DT_WORDBREAK = 0x00000010;
var DT_SINGLELINE = 0x00000020;
var DT_EXPANDTABS = 0x00000040;
var DT_TABSTOP = 0x00000080;
var DT_NOCLIP = 0x00000100;
var DT_EXTERNALLEADING = 0x00000200;
var DT_CALCRECT = 0x00000400;
var DT_NOPREFIX = 0x00000800;
var DT_INTERNAL = 0x00001000;
var DT_EDITCONTROL = 0x00002000;
var DT_PATH_ELLIPSIS = 0x00004000;
var DT_END_ELLIPSIS = 0x00008000;
var DT_MODIFYSTRING = 0x00010000;
var DT_RTLREADING = 0x00020000;
var DT_WORD_ELLIPSIS = 0x00040000;
var DT_NOFULLWIDTHCHARBREAK = 0x00080000;
var DT_HIDEPREFIX = 0x00100000;
var DT_PREFIXONLY = 0x00200000;

function on_paint(gr) {
    gr.FillSolidRect(0, 0, window.Width, window.Height, dui == 1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
    if (itemplayed && (!tagchoice1)) {
        gr.GdiDrawText(tagname + " History (items: " + tagcount + "/" + sum + " [" + proc + "%]) items played", g_font, color2, 5, 5, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    }
    else {
        gr.GdiDrawText(tagname + " History (items: " + tagcount + "/" + sum + " [" + proc + "%])", g_font, color2, 5, 5, window.Width, window.Height, DT_TOP | DT_LEFT | DT_SINGLELINE);
    }
    if (writtentoconsole) {
        gr.GdiDrawText("written to console", g_font, color2, 300, 5, window.Width, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    }
    for (i = 0; i < activetag.length; i++) {
        if (i === 0) {
            gr.GdiDrawText(i + ". " + activetag[i] + " (" + equaltag + ") [" + datestamp[i] + "]", g_font, color, 5, i * 16 + 25, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
        } else if (i < displayeditems) {
            gr.GdiDrawText(i + ". " + activetag[i] + " (" + equaltagarray[i - 1] + ") [" + datestamp[i] + "]", g_font, color2, 5, i * 16 + 25, window.Width - 10, window.Height, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
        }
    }
}

function content() {
    tagcount++;
    sum++;
    procent();
    unshift();
    equaltag = 1;
    pop();
}

function unshift() {
    if (tagchoice1) {
        activetag.unshift(fb.GetPlaylistName(fb.ActivePlaylist));
    } else {
        activetag.unshift(fb.TitleFormat(tag).Eval());
    }
    datestamp.unshift(Date());
    equaltagarray.unshift(equaltag);
}

function pop() {
    if (tagcount >= historysize + 1) {
        activetag.pop();
        datestamp.pop();
        equaltagarray.pop();
    }
}

function procent() {
    proc = (tagcount / sum * 100);
    proc = Math.round(proc * 100) / 100;
}

function on_playback_new_track() {
    if (fb.TitleFormat(tag).Eval() !== activetag[0] && fb.TitleFormat(tag).Eval() !== "" && (!tagchoice1) && (!itemplayed)) {
        content();
    } else if (fb.TitleFormat(tag).Eval() === activetag[0] && fb.TitleFormat(tag).Eval() !== "" && (!tagchoice1) && (!itemplayed)) {
        equaltag++;
        sum++;
        procent();
    }
    writtentoconsole = false;
    window.Repaint();
}

function on_playlist_switch() {
    if (tagchoice1) {
        tagcount++;
        sum++;
        procent();
        unshift();
        equaltag = 1;
        pop();
        writtentoconsole = false;
        window.Repaint();
    }
}

function on_item_played() {
    if (fb.TitleFormat(tag).Eval() !== activetag[0] && fb.TitleFormat(tag).Eval() !== "" && (!tagchoice1) && (itemplayed)) {
        content();
    } else if (fb.TitleFormat(tag).Eval() === activetag[0] && fb.TitleFormat(tag).Eval() !== "" && (!tagchoice1) && (itemplayed)) {
        equaltag++;
        sum++;
        proc();
    }
    writtentoconsole = false;
    window.Repaint();
}

function on_playback_stop() {
    writtentoconsole = false;
    window.Repaint();
}

function on_mouse_lbtn_down() {
    totalstring.splice(0,totalstring.length);
    for (i = 0; i < activetag.length; i++) {
        if (i === 0) {
            totalstring.unshift(i + ". " + activetag[i] + " (" + equaltag + ") [" + datestamp[i] + "]");
        } else if (i < displayeditems) {
            totalstring .unshift(i + ". " + activetag[i] + " (" + equaltagarray[i - 1] + ") [" + datestamp[i] + "]");
        }
    }
    totalstring.reverse();
    fb.trace(totalstring.join("\n"));
    writtentoconsole = true;
    window.Repaint();
}

function on_colors_changed() {
    color2 = dui === 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
    window.Repaint();
}

function on_font_changed() {
    g_font = dui === 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
    window.Repaint();
}


Diese Version ersetzt natürlich alle vorher geposteten Versionen.

Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Spirit_of_the_ocean in 27. Februar 2010, 21:36:20
Ich muss mich bedanken  :top: Der Tipp hat geholfen. Ich hatte aus verschiedenen Sachen den Code zusammengebastelt. Ich habs ungefähr verstanden wie es in etwa funktioniert. Allerdings wollte ich den Code noch einmal neu sortieren (beser gesagt ausmisten) und mit Kommentaren versehen.

Hier könnt ihr den Zwischenstand sehen:

Fehlerhafter Link entfernt - tedgo
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Spirit_of_the_ocean in 01. März 2010, 20:06:38
Nochmal eine Frage:

Wie bekomme ich es hin, in Jscript zu prüfen, ob eine Zahl in einem bestimmten Zahlenbereich liegt? Hintergrund ist, dass ich ein Bildanzeigen lassen will in Abhängigkeit vom Playcountbereich.
Nur was gibt es dafür für einen Befehl:
Wie drücke ich aus, wenn der Playcount zwischen zwanzig und 49 liegt....
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 01. März 2010, 20:12:25
Vielleicht gibts ja 'ne elegantere Lösung aber ich habe das so (ähnlich) in meinem Script gelöst:
var playcount = fb.TitleFormat("%play_count%").Eval();
if (playcount >= 20 && playcount < 50) {Code was dann ausgeführt werden soll}
else if (playcount >= 50 && playcount < 80) {Code was dann ausgeführt werden soll}
usw.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 02. März 2010, 08:33:56
Zitat von: Spirit_of_the_ocean in 01. März 2010, 20:06:38
Nochmal eine Frage:

Wie bekomme ich es hin, in Jscript zu prüfen, ob eine Zahl in einem bestimmten Zahlenbereich liegt? Hintergrund ist, dass ich ein Bildanzeigen lassen will in Abhängigkeit vom Playcountbereich.
Nur was gibt es dafür für einen Befehl:
Wie drücke ich aus, wenn der Playcount zwischen zwanzig und 49 liegt....
Du kannst auch ABSTEIGEND prüfen und dann immer wieder eine Variable überschreiben.
z.b.:
function on_playback_new_track(metadb) {
var playcount = fb.TitleFormat("$if2(%play_count%,0)").Eval();
        var text = "über 50";
if(playcount < 50) text = "unter 50";
if(playcount < 40) text = "unter 40";
if(playcount < 30) text = "unter 30";
if(playcount < 20) text = "unter 20";
if(playcount < 10) text = "unter 10";
fb.trace(text);
}
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: TomPro in 02. März 2010, 22:23:55
Zitat von: Andre69 in 21. Februar 2010, 16:51:05
Ja, Deutsche Anleitung währe was gutes. Da ist aber ein WIKI besser geeignet.
Zum Thema CreateImage eine kleine Spielerei:

// ==PREPROCESSOR==
// @import "%fb2k_path%scripts\Flags.txt"
// ==/PREPROCESSOR==

function RGB(r, g, b) {
    return (0xff000000 | (r << 16) | (g << 8) | (b));
}
font = gdi.Font("Consolas", 107);
bmp = gdi.CreateImage(800,100);
tgr = bmp.GetGraphics();
tgr.GdiDrawText("Andre",font,RGB(55,55,255),0,0,bmp.width,bmp.height, DT_LEFT);
bmp2 = bmp.Clone(0, 0, bmp.Width, bmp.Height);
bmp2.RotateFlip(6);
maske = gdi.Image(fb.FoobarPath + "images\\maske.png");
mask = maske.Resize(bmp2.Width, bmp2.Height);
bmp2.ApplyMask(mask);

function on_paint(gr) {
gr.DrawImage(bmp,10,10,bmp.width,bmp.height,0,0,bmp.width,bmp.height,0,255);
gr.DrawImage(bmp2,10,10+bmp.height,bmp2.width,bmp2.height,0,0,bmp2.width,bmp2.height,0,255);
}





Danke das hat geholfen jetzt kann mein Infofenster weitergehen, geht übrigens in die Richtung was Spirit_of_the_ocean plant.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 03. März 2010, 08:40:35
Ich habe wieder alle Farbenskripte zu einem Skript zusammengefasst. Alle bisherigen Versionen werden gelöscht.

Color

bestehend aus den Varianten:


(http://www.abload.de/img/colorrdku.jpg) (http://www.abload.de/image.php?img=colorrdku.jpg)


Farbverlauf:
rot selten, schlecht, alt, kurz
gelb
grün
cyan
blau
violett oft, gut, neu, lang

http://www.color-security.de/html/spektral_rgb.html



//color by grimes
//fb2k 1.0+, WSH Panel Mod 1.3.2+ required
//DUI/CUI ready

function RGB(r, g, b) {
    return (0xff000000 | (r << 16) | (g << 8) | (b));
}

var g_font = gdi.Font("Segoe UI", 12, 0);
var dui = window.InstanceType;

var x = 255;
var y = 255;
var z = 255;
var tag = "";
var tag2 = "";
var playcount = window.GetProperty("playcount", true);
var rating = window.GetProperty("rating", false);
var year = window.GetProperty("year", false);
var length = window.GetProperty("length [s]", false);


if (fb.IsPlaying || fb.IsPaused) {
    get_tag_value();
    calculate_color();
}

function on_paint(gr) {
    gr.FillSolidRect(0, 0, window.Width, window.Height, RGB(x, y, z));
    if (playcount) {
        gr.DrawString("playcount " + tag2, g_font, RGB(0, 0, 0), 0, 0, window.Width, window.Height, 0x11005000);
    } else if (rating) {
        gr.DrawString("rating " + tag, g_font, RGB(0, 0, 0), 0, 0, window.Width, window.Height, 0x11005000);
    } else if (year) {
        gr.DrawString("year " + tag2, g_font, RGB(0, 0, 0), 0, 0, window.Width, window.Height, 0x11005000);
    } else if (length) {
        gr.DrawString("length " + fb.TitleFormat("%length%").Eval(), g_font, RGB(0, 0, 0), 0, 0, window.Width, window.Height, 0x11005000);
    }
}

function playcount_ratio() {
    //tag = tag2; //experienced user
    //tag = tag2 * 5; //intermediate user
    tag = tag2 * 10; //novice user
}

function get_tag_value() {
    if (playcount) {
        tag2 = fb.TitleFormat("%play_count%").Eval();
        playcount_ratio();
    } else if (rating) {
        tag = fb.TitleFormat("%rating%").Eval();
        tag = parseInt(tag);
    } else if (year) {
        tag2 = fb.TitleFormat("%date%").Eval();
        tag = (tag2 - 1950) * 2;
    } else if (length) {
        tag2 = fb.TitleFormat("%length_seconds%").Eval();
        tag = tag2 / 10
    }
}

function calculate_color() {
    if (rating) {
        x = tag < 2 || tag > 4 ? 255 : 0;
        y = tag > 0 && tag < 4 ? 255 : 0;
        z = tag > 2 ? 255 : 0;
    } else {
        if (tag <= 25) {
            x = 255;
            y = tag * 10;
            z = 0;
        } else if (tag > 25 && tag <= 50) {
            x = 255 - (tag - 25) * 10;
            y = 255;
            z = 0;
        } else if (tag > 50 && tag <= 75) {
            x = 0;
            y = 255;
            z = (tag - 50) * 10;
        } else if (tag > 75 && tag <= 100) {
            x = 0;
            y = 255 - (tag - 75) * 10;
            z = 255;
        } else if (tag > 100 && tag <= 125) {
            x = (tag - 100) * 10;
            y = 0;
            z = 255;
        } else if (tag > 125) {
            x = 255;
            y = 0;
            z = 255;
        } else {
            x = 255;
            y = 0;
            z = 0;
        }
    }
}

function on_playback_new_track() {
    get_tag_value();
    calculate_color();
    window.Repaint();
}

function on_playback_stop() {
    x = 255;
    y = 255;
    z = 255;
    tag = "";
    tag2 = "";
    window.Repaint();
}

function on_item_played() {
    if (playcount) {
        tag2++
        playcount_ratio();
        calculate_color();
        window.Repaint();
    }
}

function on_colors_changed() {
    window.Repaint();
}

function on_font_changed() {
    window.Repaint();
}



Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 03. März 2010, 11:16:22
Statistik (Grundsystem).

Als erstes möchte ich die NACHTEILE aufzählen:

Am besten Editiert man die Tags so wie man sie haben will vor dem hinzufügen.

Ich habe versucht eine Datenbank mit Windowsmitteln - also Jetdatenbank zu erstellen. Das hat nicht geklappt. Aber zum glück gibt es noch das Schlanke SQlite. SQlite hat auch eine ähnliche SQL Syntax, so brauchte ich nur Kleinigkeiten ändern. SQlite ist auch schnell und einfach und unkompliziert installierbar. Am schnellsten Funktioniert aber MySQL. Es ist ja auch ein Server der als Dienst gestartet wird. Braucht daher aber auch eine umfangreiche Installation. Am besten noch mit Apache und PHPMyADMIN. Ich habe hier gleich ein ganzes XAMP System Installiert.

Was bekommt ihr hier ?

Eine Datenbank die eine Spielstatistik speichert. Man kann Statistiken nach Artist, Alben oder Tracks erstellen. Es ist da noch lange nicht alles ausgereizt.
Ich werde hier ERSTMAL nur das GRUNDSYSTEM zum Download bieten. Das Grundsystem zeigt den Rang des Tracks, Album und Artisten an. Platz 1 ist der an meisten gespielte Track.
Es wird Angezeigt wann der Track das letzte mal gespielt wurde. Welches der momentane Lieblingstracks ist. Dieser wird dadurch ermittelt das es am meisten in der vergangenen Woche gespielt wurde.
Dann folgt eine Gesammtstatistik der gespielten Tracks.
Installationsanweisung für SQlite und MySQL ist im Paket (Anhang).

Viel Spass beim Datensammeln.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 03. März 2010, 14:10:41
Meine Variante von Andre69's (ersten) Statistic-Skript.

(http://www.abload.de/img/andre69f5ti.jpg) (http://www.abload.de/image.php?img=andre69f5ti.jpg)

Zur Anwendung: Das Skript ist alltagstauglich. Je nach Komplexität kann die SQL-Query bis zu 2sec dauern, ist aber in der Praxis nicht störend. Die Datenbankabfrage geschieht nur, wenn das Panel geöffnet ist. Bei Trackstart und nach 1min (Datenbankzugriff) habe ich keine nachteiligen Effekte bemerkt. Die Möglichkeiten der statistischen Auswertung sind längst nicht ausgeschöpft und werden lediglich durch mangelnde SQL-Kenntnisse beschränkt.

Fazit: Sehr empfehlenswert. Ich möchte Andre69's Skript nicht mehr missen.

Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 17. März 2010, 08:36:45
Ein Script welches anzeigt was die Freunde in Last.fm hören/gehört haben.
Es muss geändert werde:
user = Last.fm Username
key = api key (kann man von last.fm bekommen, oder man sucht einwenig... )
friends = die Namen der Freunde die man "beobachten" will. Müssen als Array eingegeben werden z.B.: var friends = new Array("Peter","Petra","paul","dAc00lMan");
friendstimer = das ist das Interval der Abfrage, steht momentan auf 5Minuten (300000)
---

var user = "";
var key = "";
var friendstimer = window.CreateTimerInterval(300000);
var friends = new Array("");
var fartists = new Array();
var ftitles = new Array();
var font = gdi.Font("consolas", 13);
var DT_LEFT = 0x00000000;
var DT_WORD_ELLIPSIS = 0x00040000;
var DT_NOPREFIX = 0x00000800;
var ww = wh = 0;

if (window.InstanceType == 0) {
textcolor = window.GetColorCUI(0);
textcolor_hl = window.GetColorCUI(1);
backcolor = window.GetColorCUI(3);
} else if (window.InstanceType == 1) {
textcolor = window.GetColorDUI(0);
textcolor_hl = window.GetColorDUI(2);
backcolor = window.GetColorDUI(1);
selcolor = window.GetColorDUI(3);
}

function xpathconn(url) {
xml = new ActiveXObject("Msxml2.DOMDocument.6.0");
xml.async = false;
xml.validateOnParse = false;
xml.load(url);
xml.setProperty("SelectionLanguage", "XPath");
return xml;
}

function getFriends() {
var url = "http://ws.audioscrobbler.com/2.0/?method=user.getfriends&user=" + user + "&api_key=" + key + "&recenttracks=true";
xmldoc = xpathconn(url);
try {
for(i = 0; i < friends.length; i++) {
fartists[friends[i]] = xmldoc.selectSingleNode("//lfm/friends/user[name='"+friends[i]+"']/recenttrack/artist/name").text;
ftitles[friends[i]] = xmldoc.selectSingleNode("//lfm/friends/user[name='"+friends[i]+"']/recenttrack/name").text;
}
}
catch(e) {
fb.trace("error: ",e);
}
}

function on_paint(gr) {
gr.FillSolidRect(0,0,ww,wh,backcolor);
var text = "";
for(i = 0; i < friends.length; i++) {
text += friends[i] + "\n";
text += fartists[friends[i]] + " - " + ftitles[friends[i]] + "\n"
}
gr.GdiDrawText(text, font, textcolor, 3, 3, ww - 6, wh - 6, DT_LEFT | DT_WORD_ELLIPSIS | DT_NOPREFIX);
}

function on_size() {
ww = window.width;
wh = window.height;
}

function on_timer(id) {
if (friendstimer && id == friendstimer.ID) {
getFriends();
}
}

getFriends();
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 17. März 2010, 08:58:16
Wieso nutzt du nicht einfach die Panel Properties für die Eingabe der Optionen? Dann müsste man nicht immer im Script danach suchen und darin rumpfuschen. :)

Beispiel:
var user = window.GetProperty("Username", "");
var key = window.GetProperty("Key", "");

var friends_temp = window.GetProperty("Friends", "");
var friends = friends_temp.split(",");

var g_interval = window.GetProperty("Friendstimer", 300000);
var friendstimer = window.CreateTimerInterval(g_interval);
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 17. März 2010, 09:13:40
Zitat von: tedgo in 17. März 2010, 08:58:16
Wieso nutzt du nicht einfach die Panel Properties für die Eingabe der Optionen? Dann müsste man nicht immer im Script danach suchen und darin rumpfuschen. :)
Weil ich dieses Feature noch nie genutzt habe. Ok, dann ab jetzt :)

Eine kleine Abwandlung und man kann beliebige Personen "Beobachten":

In Properties eingeben:
key = api Key (Wie gehabt)
Usertimer = steht wieder auf 5Minuten
User = Usernamen mit Komma getrennt z.B.: Oceansway,GenBully,Deathkeeper
Je mehr User man eingibt umso langsamer wird es weil für jeden User eine Eigene abfrage an Last.fm geschickt wird.

var key = window.GetProperty("Key", "");
var user_temp = window.GetProperty("User", "");
var user = user_temp.split(",");
var g_interval = window.GetProperty("Usertimer", 300000);
var usertimer = window.CreateTimerInterval(g_interval);
var uartists = new Array();
var utitles = new Array();
var udate = new Array();
var font = gdi.Font("consolas", 13);
var DT_LEFT = 0x00000000;
var DT_WORD_ELLIPSIS = 0x00040000;
var DT_NOPREFIX = 0x00000800;
var ww = wh = 0;

if (window.InstanceType == 0) {
textcolor = window.GetColorCUI(0);
textcolor_hl = window.GetColorCUI(1);
backcolor = window.GetColorCUI(3);
} else if (window.InstanceType == 1) {
textcolor = window.GetColorDUI(0);
textcolor_hl = window.GetColorDUI(2);
backcolor = window.GetColorDUI(1);
selcolor = window.GetColorDUI(3);
}

function xpathconn(url) {
xml = new ActiveXObject("Msxml2.DOMDocument.6.0");
xml.async = false;
xml.validateOnParse = false;
xml.load(url);
xml.setProperty("SelectionLanguage", "XPath");
return xml;
}

function getuser() {
try {
for(i = 0; i < user.length; i++) {
var url = "http://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=" + user[i] + "&api_key=" + key + "&limit=1";
xmldoc = xpathconn(url);
uartists[user[i]] = xmldoc.selectSingleNode("/lfm/recenttracks/track/artist").text;
utitles[user[i]] = xmldoc.selectSingleNode("/lfm/recenttracks/track/name").text;
udate[user[i]] = xmldoc.selectSingleNode("/lfm/recenttracks/track/date").text;
}
}
catch(e) {
fb.trace("error: ",e);
}
}

function on_paint(gr) {
gr.FillSolidRect(0,0,ww,wh,backcolor);
var text = "";
for(i = 0; i < user.length; i++) {
text += user[i] + " (" + udate[user[i]] + ")\n";
text += uartists[user[i]] + " - " + utitles[user[i]] + "\n"
}
gr.GdiDrawText(text, font, textcolor, 3, 3, ww - 6, wh - 6, DT_LEFT | DT_WORD_ELLIPSIS | DT_NOPREFIX);
}

function on_size() {
ww = window.width;
wh = window.height;
}

function on_timer(id) {
if (usertimer && id == usertimer.ID) {
getuser();
}
}

getuser();

Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 24. März 2010, 09:27:48
Ich habe im script SimpleThemedButton aus dem wsh samples folgendes geändert:
$buttons = null;
for(n = 0; n < 6; n++) {
$buttons += {
n: new SimpleButton(0, 20*n, 80, 20, "Testbutton " + n, function () {
// Funktion
})
}
}

Es wird nichts angezeigt.
Wie kann ich "dynamische" Buttons erstellen ?
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 24. März 2010, 22:14:38
Antwort:
$buttons = new Array();
for(n = 0; n < 6; n++) {
$buttons[n] = new SimpleButton(0, 20*n, 80, 20, "Testbutton " + n, function () {});
}

:top:
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 04. April 2010, 17:56:18
PDF

Öffnet, falls im Musikordner vorhanden, eine pdf-Datei im pdf-Reader.

(http://www.abload.de/thumb/pdf807g.jpg) (http://www.abload.de/image.php?img=pdf807g.jpg)


//pdf by grimes
//fb2k 1.0+, WSH Panel Mod 1.3.2+ required
//DUI/CUI ready


function RGB(r,g,b){ return (0xff000000|(r<<16)|(g<<8)|(b)); }

//var g_font = gdi.Font("Segoe UI", 12, 0);
var g_font = dui == 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
//var color = RGB(200,0,0);
var color = dui == 1 ? window.GetColorDUI(2) : RGB(200,0,0);
//var color2 = RGB(0,0,0);
var color2 = dui == 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
var dui = window.InstanceType;

var program;
var path;
var arr = new Array();
var split = new Array();
var filename = new Array();
var pdf = false;
var pdfno = 1;

var pdfreader = window.GetProperty("pdfreader", "acrord32");

function on_paint(gr){
gr.FillSolidRect(0, 0, window.Width, window.Height, dui ==1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
    if (pdf) {
    gr.DrawString("pdf file: " + pdfno + "/" + arr.length + " (mouse wheel, click to start pdf reader)", g_font, color2, 5, 10, window.Width, window.Height, 0x00080000);
    for (i = 0; i < filename.length; i++) {
            gr.DrawString(i+1 + ". " + filename[i], g_font, color2, 5, i*40 + 40, window.Width, window.Height, 0x00080000);
        }
    }
    else {
        gr.DrawString("no pdf", g_font, color2, 5, 10, window.Width, window.Height, 0x11005000);
    }
}

function on_mouse_lbtn_down(x, y){
    if (pdf) {
        program = new ActiveXObject("Shell.Application");
        program.ShellExecute(pdfreader,  '"' + arr[pdfno-1] + "", "", "open", 1);
    }
}

function on_playback_new_track() {
    path = fb.TitleFormat("$directory_path(%path%)").Eval();
    arr = utils.Glob(path + "\\*.pdf").toArray();
    if (arr.length === 0) {
        pdf = false;   
    }
    else {pdf = true;}
    filename.splice(0, filename.length);
    for (i = 0; i < arr.length; i++) {
        split = arr[i].split("\\");
        filename.push(split[split.length-1]);
    }
    window.Repaint();
}

function on_mouse_wheel(delta){
for (i = 0; i<delta; i++) {pdfno++;}
for (i = 0; i<-delta; i++) {pdfno--;}
if(pdfno < 1) pdfno = 1;
    if(pdfno > arr.length) pdfno = arr.length;
window.Repaint();
}

function on_colors_changed() {
    color = dui ==1 ? window.GetColorDUI(2) : RGB(200,0,0);
    color2 = dui ==1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
    window.Repaint();
}

function on_font_changed() {
    g_font = dui == 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
    window.Repaint();
}



Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 05. April 2010, 19:01:42
Cover History


//cover history by grimes
//fb2k 1.0+, WSH Panel Mod 1.3.2+ required
//DUI/CUI ready


function RGB(r,g,b){ return (0xff000000|(r<<16)|(g<<8)|(b)); }

var dui = window.InstanceType;
//var g_font = gdi.Font("Segoe UI", 12, 0);
var g_font = dui == 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
//var color = RGB(200,0,0);
var color = dui == 1 ? window.GetColorDUI(2) : RGB(200,0,0);
//var color2 = RGB(0,0,0);
var color2 = dui == 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);

var id = 0;
var zz = 0;
var ww = 0, wh = 0;
var historyarray = new Array();
historyarray.reverse();
var g_img = null;
var path, dirpath;
var dirpatharray = new Array();

function on_paint(gr) {
    gr.FillSolidRect(0, 0, window.Width, window.Height, dui ==1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
    if (g_img) {
        var scale = 0;
        var x = 0,
            y = 0;
        var scale_w = ww / g_img.Width;
        var scale_h = wh / g_img.Height;

        if (scale_w <= scale_h) {
            scale = scale_w;
            y = (wh - g_img.Height * scale) / 2;
        } else {
            scale = scale_h;
            x = (ww - g_img.Width * scale) / 2;
        }
    gr.DrawImage(g_img, x, y, g_img.Width * scale, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height);
    gr.GdiDrawText(zz, g_font, color, 10, 5, window.Width - 10, window.Height, 0x00000000);
    }
    else {gr.DrawString("no history", g_font, color2, 0, 0, window.Width, window.Height, 0x11005000);}
}

function on_size() {
    ww = window.Width;
    wh = window.Height;
}

function on_playback_new_track(metadb) {
    if (g_img) g_img.Dispose();
    path = fb.TitleFormat("%path%").Eval();
    dirpath = fb.Titleformat("$directory_path(%path%)").Eval();
    dirpatharray.unshift(dirpath);
    dirpatharray.splice(2,1);
    if (dirpatharray[0] !== dirpatharray[1]) historyarray.unshift(path);
    g_img = utils.GetAlbumArt(historyarray[zz], id);
    window.Repaint();
}

function on_playback_stop(reason) {
    window.Repaint();
}

function on_mouse_lbtn_down(){
    if (zz < historyarray.length-1) {
        zz++;
    }
    else {zz = 0;}
    if (g_img) g_img = utils.GetAlbumArt(historyarray[zz], id);
    window.Repaint();
}

function on_mouse_move() {
if (g_img) window.SetCursor(32649);
}

function on_mouse_rbtn_up(x, y) {
    var MF_SEPARATOR = 0x00000800;
    var MF_STRING = 0x00000000;
    var _menu = window.CreatePopupMenu();
    var idx;
    _menu.AppendMenuItem(MF_STRING, 1, "cover");
    _menu.AppendMenuItem(MF_STRING, 2, "back");
    _menu.AppendMenuItem(MF_STRING, 3, "disc");
    _menu.AppendMenuItem(MF_STRING, 4, "icon");
    _menu.AppendMenuItem(MF_STRING, 5, "artist");
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    //_menu.AppendMenuItem(MF_STRING, 5, "Properties");
    _menu.AppendMenuItem(MF_STRING, 6, "Configure...");
    _menu.CheckMenuRadioItem(1, 5, id + 1);
    idx = _menu.TrackPopupMenu(x, y);
    switch (idx) {
    case 1:
        id = 0;
        break;
    case 2:
        id = 1;
        break;
    case 3:
        id = 2;
        break;
    case 4:
        id = 3;
        break;
    case 5:
        id = 4;
        break;
    case 5:
        window.ShowProperties();
        break;
    case 6:
        window.ShowConfigure();
    }
   
    _menu.Dispose();
    if (g_img) {
        g_img.Dispose();
        g_img = utils.GetAlbumArt(historyarray[zz], id);
    }
    window.Repaint();
    return true;
}

function on_colors_changed() {
    color = dui ==1 ? window.GetColorDUI(2) : RGB(200,0,0);
    color2 = dui ==1 ? window.GetColorDUI(0) : window.GetColorCUI(0);
    window.Repaint();
}

function on_font_changed() {
    g_font = dui == 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
    window.Repaint();
}
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 09. April 2010, 13:12:53
Cover Browser

Features:



Vorteil: flüssiges Navigieren durch die Cover durch Arrays
Nachteil: Arrayupdate nötig falls weitere Alben zur Media Library hinzugefügt werden

(http://www.abload.de/img/coverbrowser10t68f.jpg) (http://www.abload.de/image.php?img=coverbrowser10t68f.jpg)

Arrays füllen bzw. Arrayupdate:




(http://www.abload.de/img/coverbrowser11a6bd.jpg) (http://www.abload.de/image.php?img=coverbrowser11a6bd.jpg)

Code unter:
http://pastebin.de/5489

10-4-2010: neue Version
11-4-2010: Release Candidate
12-4-2010: Release Candidate 2
13-4-2010: Release Candidate 3
14-4-2010: Release Candidate 4
16-4-2010: Release Candidate 5
ADD: show playing albums missing in array
CHG: show playing album tag compare: %album% -> $directory_path(%path%)
17-4-2010: Release Candidate 6

19-4-2010: Release




Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: phunkydizco in 14. April 2010, 09:41:05
Suche ein Skript mit dem man das Album Cover mit ein paar Effekten wie z.B. Spiegelung oder Schatten anzeigen kann. Hat jemand sowas?
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 14. April 2010, 10:39:21
@phunkydizco:

Zum Testen: eben aus dem Cover Browser extrahiert.


//cover by grimes
//fb2k 1.0+, WSH Panel Mod 1.3.0+ required
//DUI/CUI ready

function RGB(r, g, b) {
   return (0xff000000 | (r << 16) | (g << 8) | (b));
}

var z = 0;
var g_img = null;
var ww = 0, wh = 0;
var show = true;
var dui = window.InstanceType;
var coverpath = "";
var shadowright = 3;
var gray = 140;
var color5 = RGB(gray, gray, gray);
var scale = 0;
var size = 1.2;

function on_paint(gr) {
   gr.FillSolidRect(0, 0, window.Width, window.Height, dui === 1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
   var g_img = get_album_art(fb.GetNowPlaying());
   var g_img_rot;
   if (g_img) {
       var scale = 0;
       var y = 0;
       var yflip = 0;
       var scale_w = ww / g_img.Width;
       var scale_h = wh / g_img.Height;
       if (scale_w <= scale_h) {
           scale = scale_w;
           y = (wh - g_img.Height * scale) / 2 - 40;
           yflip = (wh + g_img.Height * scale) / 2 - 40;
       } else {
           scale = scale_h;
           y = 0;
       }
       if (show){
           gr.FillSolidRect(ww * size / 2 - (g_img.Width * scale / 2) + shadowright, y + 4, g_img.Width * scale, g_img.Height * scale, color5);
           gr.DrawImage(g_img, ww * size / 2 - g_img.Width * scale / 2, y, g_img.Width * scale, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height);
           if (g_img_rot) {g_img_rot.Dispose();}
           if (wh > g_img.Height * scale) {
               g_img_rot = g_img.Clone(0, 0, g_img.Width, g_img.Height);
               g_img_rot.RotateFlip(6);
               gr.DrawImage(g_img_rot, ww * size / 2 - g_img.Width * scale / 2, yflip, g_img.Width * scale, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height * 5, 0, 80);
           }              
       }
   }
}

function on_size() {
   ww = window.Width / size;
   wh = window.Height;
}

function get_album_art(metadb) {
   if (metadb)
   return utils.GetAlbumArtV2(metadb, z);
}

function on_playback_new_track(metadb) {
   if (g_img) g_img.Dispose();
   g_img = get_album_art(metadb);
   show = true;
   window.Repaint();
}

function on_playback_stop(reason) {
   show = false;
   window.Repaint();
}

function on_mouse_lbtn_down(){
   if (z < 2) {
       z++;
   }
   else {z = 0;}
   window.Repaint();
}

function on_mouse_move() {
fb.IsPlaying && window.SetCursor(32649);
}

function on_colors_changed() {
   window.Repaint();
}

function on_font_changed() {
   window.Repaint();
}



und so siehts aus:

(http://www.abload.de/thumb/reflectiongeit.jpg) (http://www.abload.de/image.php?img=reflectiongeit.jpg)


Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: phunkydizco in 14. April 2010, 13:17:57
Vielen Dank. Sei mir nicht böse, aber das gefällt mir gar nicht. Die Spiegelung ist ja gar keine richtige Spiegelung sondern nur ein umgedrehten gequetschtes Bild.

Hat vielleicht jemand etwas schickeres so im Stil von iTunes, mit einem weichen Schatten und abgerundeten Ecken?
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 14. April 2010, 16:44:34
So, so, der hohe Herr ist mit meiner Reflektion nicht zufrieden. :motzen:

Na ja, habe jetzt das gemacht:

(http://www.abload.de/img/reflection2fbwk.jpg) (http://www.abload.de/image.php?img=reflection2fbwk.jpg)


//cover by grimes (modified)
//fb2k 1.0+, WSH Panel Mod 1.3.0+ required
//DUI/CUI ready

function RGB(r, g, b) {
   return (0xff000000 | (r << 16) | (g << 8) | (b));
}
function RGBA(r, g, b, a) {
   return ((a << 24) | (r << 16) | (g << 8) | (b));
}

var z = 0;
var g_img = null;
var ww = 0, wh = 0;
var show = true;
var dui = window.InstanceType;
var coverpath = "";
var shadowright = 3;
var gray = 120;
var color5 = RGB(gray, gray, gray);
var scale = 0;
var size = 1.3;

function on_paint(gr) {
   gr.FillSolidRect(0, 0, window.Width, window.Height, dui === 1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
   var g_img = get_album_art(fb.GetNowPlaying());
   var g_img_rot;
   if (g_img) {
       var scale = 0;
       var y = 0;
       var yflip = 0;
       var scale_w = ww / g_img.Width;
       var scale_h = wh / g_img.Height;
       if (scale_w <= scale_h) {
           scale = scale_w;
           y = (wh - g_img.Height * scale) / 2 - 40;
           yflip = (wh + g_img.Height * scale) / 2 - 40;
       } else {
           scale = scale_h;
           y = 0;
       }
       if (show){
           gr.FillSolidRect(ww * size / 2 - (g_img.Width * scale / 2) + shadowright, y + 4, g_img.Width * scale, g_img.Height * scale - 4, color5);
           gr.FillGradRect(ww * size / 2 - (g_img.Width * scale / 2) + shadowright, yflip, g_img.Width * scale, g_img.Height * scale / 5, 90, RGBA(gray + 20, gray + 20, gray + 20, 120), dui === 1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
           gr.DrawImage(g_img, ww * size / 2 - g_img.Width * scale / 2, y, g_img.Width * scale, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height);
           if (g_img_rot) {g_img_rot.Dispose();}
           if (wh > g_img.Height * scale) {
               g_img_rot = g_img.Clone(0, 0, g_img.Width, g_img.Height);
               g_img_rot.RotateFlip(6);
               gr.DrawImage(g_img_rot, ww * size / 2 - g_img.Width * scale / 2, yflip, g_img.Width * scale, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height, 0, 255);
               gr.FillGradRect(ww * size / 2 - (g_img.Width * scale / 2), yflip, g_img.Width * scale, g_img.Height * scale / 5, 90, RGBA(255, 255, 255, 120), dui === 1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
               gr.FillSolidRect(ww * size / 2 - (g_img.Width * scale / 2), yflip + g_img.Height * scale / 5, g_img.Width * scale, g_img.Height * scale, dui === 1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
           }              
       }
   }
}

function on_size() {
   ww = window.Width / size;
   wh = window.Height;
}

function get_album_art(metadb) {
   if (metadb)
   return utils.GetAlbumArtV2(metadb, z);
}

function on_playback_new_track(metadb) {
   if (g_img) g_img.Dispose();
   g_img = get_album_art(metadb);
   show = true;
   window.Repaint();
}

function on_playback_stop(reason) {
   show = false;
   window.Repaint();
}

function on_mouse_lbtn_down(){
   if (z < 2) {
       z++;
   }
   else {z = 0;}
   window.Repaint();
}

function on_mouse_move() {
fb.IsPlaying && window.SetCursor(32649);
}

function on_colors_changed() {
   window.Repaint();
}

function on_font_changed() {
   window.Repaint();
}


Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: phunkydizco in 15. April 2010, 08:10:10
Jetzt bin ich zufrieden. Danke.  :cool:
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 20. April 2010, 18:50:04
Coveranimation

Cover mit Mausklick durchs Fenster (Panel) laufen lassen (front -> back -> disc -> front)


//coveranimation1 by grimes
//fb2k 1.0+, WSH Panel Mod 1.3.0+ required
//DUI/CUI ready


var z = 0;
var g_img = get_album_art(fb.GetNowPlaying());
var ww = 0, wh = 0;
var show = true;
var dui = window.InstanceType;
var bool = false;
var g_timer1;
var move = 0;
var right = window.GetProperty("Right", false);
var down = window.GetProperty("Down", false);
var left = window.GetProperty("Left", false);
var up = window.GetProperty("Up", false);
var diagrd = window.GetProperty("Diagonale Right Down", false);
var diagld = window.GetProperty("Diagonale Left Down", false);
var diagru = window.GetProperty("Diagonale Right Up", false);
var diaglu = window.GetProperty("Diagonale Left Up", false);
var effect1 = window.GetProperty("Effect1", false);
var effect2 = window.GetProperty("Effect2", false);
var effect3 = window.GetProperty("Effect3", false);
var effect4 = window.GetProperty("Effect4", false);
var effect5 = window.GetProperty("Effect5", false);
var effect6 = window.GetProperty("Effect6", true);
var effect7 = window.GetProperty("Effect7", false);
var noeffect = window.GetProperty("No Effect", false);
var effectstartstop = window.GetProperty("Effekt on Play/Stop", true);
var start = false;
var stop = false;

function on_paint(gr) {
    gr.FillSolidRect(0, 0, ww, wh, dui === 1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
    if (g_img) {
        var scale = 0;
        var x = 0,
            y = 0;
        var scale_w = ww / g_img.Width;
        var scale_h = wh / g_img.Height;

        if (scale_w <= scale_h) {
            scale = scale_w;
            y = (wh - g_img.Height * scale) / 2;
        } else {
            scale = scale_h;
            x = (ww - g_img.Width * scale) / 2;
        }
        if (show){
            if (right) {
                gr.DrawImage(g_img, x + move, y, g_img.Width * scale, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height);
            }
            if (down) {
                gr.DrawImage(g_img, x, y + move, g_img.Width * scale, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height);
            }
            if (left) {
                gr.DrawImage(g_img, x - move, y, g_img.Width * scale, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height);
            }
            if (up) {
                gr.DrawImage(g_img, x, y - move, g_img.Width * scale, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height);
            }
            if (diagrd) {
                gr.DrawImage(g_img, x + move, y + move, g_img.Width * scale, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height);
            }
            if (diaglu) {
                gr.DrawImage(g_img, x - move, y - move, g_img.Width * scale, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height);
            }
            if (diagru) {
                gr.DrawImage(g_img, x + move, y - move, g_img.Width * scale, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height);
            }
            if (diagld) {
                gr.DrawImage(g_img, x - move, y + move, g_img.Width * scale, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height);
            }
            if (effect1) {
                gr.DrawImage(g_img, x + move, y, g_img.Width * scale, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height, move / 4);
            }
            if (effect2) {
                gr.DrawImage(g_img, x + move, y, g_img.Width * scale - Math.abs(move), g_img.Height * scale - Math.abs(move), 0, 0, g_img.Width, g_img.Height);
            }
            if (effect3) {
                gr.DrawImage(g_img, x, y - move, g_img.Width * scale + move, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height);
            }
            if (effect4) {
                gr.DrawImage(g_img, x, y, g_img.Width * scale, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height, 0, 255 - Math.abs(move * 255 / ww));
            }
            if (effect5) {
                gr.DrawImage(g_img, x + move, y + move, g_img.Width * scale - move, g_img.Height * scale - move, 0, 0, g_img.Width, g_img.Height, move / 4);
            }
            if (effect6) {
                gr.DrawImage(g_img, ww / 2 - (g_img.Width * scale  - Math.abs(move)) / 2, wh / 2 - (g_img.Height * scale  - Math.abs(move)) / 2, ((g_img.Width * scale) - Math.abs(move)), ((g_img.Height * scale) - Math.abs(move)), 0, 0, g_img.Width, g_img.Height);
            }
            if (effect7) {
                gr.DrawImage(g_img, ww / 2 - (g_img.Width * scale  - Math.abs(move)) / 2, wh / 2 - (g_img.Height * scale  - Math.abs(move)) / 2, ((g_img.Width * scale) - Math.abs(move)), ((g_img.Height * scale) - Math.abs(move)), 0, 0, g_img.Width, g_img.Height, move / 3);
            }
            if (noeffect) {
                gr.DrawImage(g_img, x, y, g_img.Width * scale, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height);           
            }
        }
    }
}

function on_size() {
    ww = window.Width;
    wh = window.Height;
}

function get_album_art(metadb) {
    if (metadb)
    return utils.GetAlbumArtV2(metadb, z);
}

function on_playback_new_track(metadb) {
    if (g_img) g_img.Dispose();
    g_img = get_album_art(metadb);
    show = true;
    if (effectstartstop) {
        move = -ww;
        start = true;
        stop = false;
        g_timer1 = window.CreateTimerInterval(40);
    }
    window.Repaint();
}

function on_playback_stop(reason) {
    stop = true;
    start = false;
    if (reason !== 2 && effectstartstop) {
        move = 0;
        g_timer1 = window.CreateTimerInterval(40);
    }
    if (!effectstartstop) {
        show = false;
    }
    window.Repaint();
}

function on_mouse_lbtn_down(){
    show = true;
    execute = false;
    start = false;
    stop = false;
    if (noeffect) {
        if (z < 2) {
            z++;
        }
        else {
            z = 0;
        }
        g_img = get_album_art(fb.GetNowPlaying());
        window.Repaint();
    }
    else {
        bool = false;
        g_timer1 = window.CreateTimerInterval(40);
    }
}

function on_timer(id) {
    if (g_timer1 && id === g_timer1.ID) {
        move += 40;
        if (start) {
            if (move >= 0) {
                move = 0;
                window.KillTimer(g_timer1);
                g_timer1.Dispose();
            }
        }
        if (stop) {
            if (move >= ww) {
                move = ww;
                show = false;
                window.KillTimer(g_timer1);
                g_timer1.Dispose();
            }
        }
        else {
            if (move >= ww) {
                if (z < 2) {
                    z++;
                }
                else {
                    z = 0;
                }
                bool = true;
                move = -ww;
                g_img = get_album_art(fb.GetNowPlaying());
            }
            if (move >= 0 && bool) {
                window.KillTimer(g_timer1);
                g_timer1.Dispose();
                move = 0;
            }
        }
        window.Repaint();
    }
}

function on_mouse_rbtn_up(x, y) {
    var MF_SEPARATOR = 0x00000800;
    var MF_STRING = 0x00000000;
    var _menu = window.CreatePopupMenu();
    var idx;
    _menu.AppendMenuItem(MF_STRING, 1, "Right");
    _menu.AppendMenuItem(MF_STRING, 2, "Left");
    _menu.AppendMenuItem(MF_STRING, 3, "Down");
    _menu.AppendMenuItem(MF_STRING, 4, "Up");
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_STRING, 5, "Diagonale Right Down");
    _menu.AppendMenuItem(MF_STRING, 6, "Diagonale Right Up");
    _menu.AppendMenuItem(MF_STRING, 7, "Diagonale Left Down");
    _menu.AppendMenuItem(MF_STRING, 8, "Diagonale Left Up");
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_STRING, 9, "Effect1");
    _menu.AppendMenuItem(MF_STRING, 10, "Effect2");
    _menu.AppendMenuItem(MF_STRING, 11, "Effect3");
    _menu.AppendMenuItem(MF_STRING, 12, "Effect4");
    _menu.AppendMenuItem(MF_STRING, 13, "Effect5");
    _menu.AppendMenuItem(MF_STRING, 14, "Effect6");
    _menu.AppendMenuItem(MF_STRING, 15, "Effect7");
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_STRING, 16, "No Effect");
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_STRING, 17, "Effect on Play/Stop");
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_STRING, 20, "Properties");
    _menu.AppendMenuItem(MF_STRING, 21, "Configure...");
    if (right) {
        _menu.CheckMenuRadioItem(1, 16, 1);
    }
    else if (left) {
        _menu.CheckMenuRadioItem(1, 16, 2);
    }
    else if (down) {
        _menu.CheckMenuRadioItem(1, 16, 3);
    }
    else if (up) {
        _menu.CheckMenuRadioItem(1, 16, 4);
    }
    else if (diagrd) {
        _menu.CheckMenuRadioItem(1, 16, 5);
    }
    else if (diagru) {
        _menu.CheckMenuRadioItem(1, 16, 6);
    }
    else if (diagld) {
        _menu.CheckMenuRadioItem(1, 16, 7);
    }
    else if (diaglu) {
        _menu.CheckMenuRadioItem(1, 16, 8);
    }
    else if (effect1) {
        _menu.CheckMenuRadioItem(1, 16, 9);
    }
    else if (effect2) {
        _menu.CheckMenuRadioItem(1, 16, 10);
    }
    else if (effect3) {
        _menu.CheckMenuRadioItem(1, 16, 11);
    }
    else if (effect4) {
        _menu.CheckMenuRadioItem(1, 16, 12);
    }
    else if (effect5) {
        _menu.CheckMenuRadioItem(1, 16, 13);
    }
    else if (effect6) {
        _menu.CheckMenuRadioItem(1, 16, 14);
    }
    else if (effect7) {
        _menu.CheckMenuRadioItem(1, 16, 15);
    }
    else if (noeffect) {
        _menu.CheckMenuRadioItem(1, 16, 16);
    }
    if (effectstartstop) {
        _menu.CheckMenuItem(17, true);
    }
    else {
            _menu.CheckMenuItem(17, false);
    }
   
    idx = _menu.TrackPopupMenu(x, y);
    switch (idx) {
    case 1:
        if (!right) {
            right = true;
            left = false;
            down = false;
            up = false;
            diagrd = false;
            diagru = false;
            diagld = false;
            diaglu = false;
            effect1 = false;
            effect2 = false;
            effect3 = false;
            effect4 = false;
            effect5 = false;
            effect6 = false;
            effect7 = false;
            noeffect = false;
        }
        break;
    case 2:
        if (!left) {
            right = false;
            left = true;
            down = false
            up = false;
            diagrd = false;
            diagru = false;
            diagld = false;
            diaglu = false;
            effect1 = false;
            effect2 = false;
            effect3 = false;
            effect4 = false;
            effect5 = false;
            effect6 = false;
            effect7 = false;
            noeffect = false;
        }
        break;
    case 3:
        if (!down) {
            right = false;
            left = false;
            down = true;
            up = false;
            diagrd = false;
            diagru = false;
            diagld = false;
            diaglu = false;
            effect1 = false;
            effect2 = false;
            effect3 = false;
            effect4 = false;
            effect5 = false;
            effect6 = false;
            effect7 = false;
            noeffect = false;
        }
        break;
    case 4:
        if (!up) {
            right = false;
            left = false;
            down = false;
            up = true;
            diagrd = false;
            diagru = false;
            diagld = false;
            diaglu = false;
            effect1 = false;
            effect2 = false;
            effect3 = false;
            effect4 = false;
            effect5 = false;
            effect6 = false;
            effect7 = false;
            noeffect = false;
        }
        break;
    case 5:
        if (!diagrd) {
            right = false;
            left = false;
            down = false;
            up = false;
            diagrd = true;
            diagru = false;
            diagld = false;
            diaglu = false;
            effect1 = false;
            effect2 = false;
            effect3 = false;
            effect4 = false;
            effect5 = false;
            effect6 = false;
            effect7 = false;
            noeffect = false;
        }
        break;
    case 6:
        if (!diagru) {
            right = false;
            left = false;
            down = false;
            up = false;
            diagrd = false;
            diagru = true;
            diagld = false;
            diaglu = false;
            effect1 = false;
            effect2 = false;
            effect3 = false;
            effect4 = false;
            effect5 = false;
            effect6 = false;
            effect7 = false;
            noeffect = false;
        }
        break;
    case 7:
        if (!diagld) {
            right = false;
            left = false;
            down = false;
            up = false;
            diagrd = false;
            diagru = false;
            diagld = true;
            diaglu = false;
            effect1 = false;
            effect2 = false;
            effect3 = false;
            effect4 = false;
            effect5 = false;
            effect6 = false;
            effect7 = false;
            noeffect = false;
        }
        break;
    case 8:
        if (!diaglu) {
            right = false;
            left = false;
            down = false;
            up = false;
            diagrd = false;
            diagru = false;
            diagld = false;
            diaglu = true;
            effect1 = false;
            effect2 = false;
            effect3 = false;
            effect4 = false;
            effect5 = false;
            effect6 = false;
            effect7 = false;
            noeffect = false;
        }
        break;
    case 9:
        if (!effect1) {
            right = false;
            left = false;
            down = false;
            up = false;
            diagrd = false;
            diagru = false;
            diagld = false;
            diaglu = false;
            effect1 = true;
            effect2 = false;
            effect3 = false;
            effect4 = false;
            effect5 = false;
            effect6 = false;
            effect7 = false;
            noeffect = false;
        }
        break;
    case 10:
        if (!effect2) {
            right = false;
            left = false;
            down = false;
            up = false;
            diagrd = false;
            diagru = false;
            diagld = false;
            diaglu = false;
            effect1 = false;
            effect2 = true;
            effect3 = false;
            effect4 = false;
            effect5 = false;
            effect6 = false;
            effect7 = false;
            noeffect = false;
        }
        break;
    case 11:
        if (!effect3) {
            right = false;
            left = false;
            down = false;
            up = false;
            diagrd = false;
            diagru = false;
            diagld = false;
            diaglu = false;
            effect1 = false;
            effect2 = false;
            effect3 = true;
            effect4 = false;
            effect5 = false;
            effect6 = false;
            effect7 = false;
            noeffect = false;
        }
        break;
    case 12:
        if (!effect4) {
            right = false;
            left = false;
            down = false;
            up = false;
            diagrd = false;
            diagru = false;
            diagld = false;
            diaglu = false;
            effect1 = false;
            effect2 = false;
            effect3 = false;
            effect4 = true;
            effect5 = false;
            effect6 = false;
            effect7 = false;
            noeffect = false;
        }
        break;
    case 13:
        if (!effect5) {
            right = false;
            left = false;
            down = false;
            up = false;
            diagrd = false;
            diagru = false;
            diagld = false;
            diaglu = false;
            effect1 = false;
            effect2 = false;
            effect3 = false;
            effect4 = false;
            effect5 = true;
            effect6 = false;
            effect7 = false;
            noeffect = false;
        }
        break;
    case 14:
        if (!effect6) {
            right = false;
            left = false;
            down = false;
            up = false;
            diagrd = false;
            diagru = false;
            diagld = false;
            diaglu = false;
            effect1 = false;
            effect2 = false;
            effect3 = false;
            effect4 = false;
            effect5 = false;
            effect6 = true;
            effect7 = false;
            noeffect = false;
        }
        break;
    case 15:
        if (!effect7) {
            right = false;
            left = false;
            down = false;
            up = false;
            diagrd = false;
            diagru = false;
            diagld = false;
            diaglu = false;
            effect1 = false;
            effect2 = false;
            effect3 = false;
            effect4 = false;
            effect5 = false;
            effect6 = false;
            effect7 = true;
            noeffect = false;
        }
        break;
    case 16:
        if (!noeffect) {
            right = false;
            left = false;
            down = false;
            up = false;
            diagrd = false;
            diagru = false;
            diagld = false;
            diaglu = false;
            effect1 = false;
            effect2 = false;
            effect3 = false;
            effect4 = false;
            effect5 = false;
            effect6 = false;
            effect7 = false;
            noeffect = true;
        }
        break;
    case 17:
        if (!effectstartstop) {
            effectstartstop = true;
        }
        else {
            effectstartstop = false;
        }
        window.Repaint();
        break;
    case 20:
        window.ShowProperties();
        break;
    case 21:
        window.ShowConfigure();
    }
    _menu.Dispose();
    window.Repaint();
    return true;
}

function on_mouse_move() {
fb.IsPlaying && window.SetCursor(32649);
}

function on_colors_changed() {
    window.Repaint();
}

function on_font_changed() {
    window.Repaint();
}


21-4-2010 mehrere Effekte
22-4-2010 Effect on Play/Stop Track

Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Foo Foo in 10. Mai 2010, 22:16:18
Habe mal die config Monolite Plus getested http://junior-spirit.deviantart.com/art/MonoLite-Plus-0-4-3-151086022 (http://junior-spirit.deviantart.com/art/MonoLite-Plus-0-4-3-151086022)
Dort ist ein Skript eigebaut mit dem man die Toolbar als Pop Up Menue benutzen kann.
Hier ist der JSkript code..

// ==PREPROCESSOR==
// @import "%fb2k_path%skin\mono_lite_2\scripts\common.js"
// @import "%fb2k_path%skin\mono_lite_2\scripts\tooltip_buttons.js"
// ==/PREPROCESSOR==

window.GetProperty("mode",1);
window.GetProperty("quality",5);
window.GetProperty("genre",1);
window.GetProperty("mood",0);

//Refresh on track change
on_item_focus_change();

function on_paint(gr){
var FP = fb.ComponentPath.replace("components","skin");
var icon = gdi.Image(FP+ "mono_lite_2/menu.png");
gr.FillSolidRect(0,0,ww,wh,RGB(220,220,220));
gr.DrawImage(icon,0,0,20,18,0,0,20,18);
}

//Preferences
function on_mouse_rbtn_down(x, y) {
var basemenu = window.CreatePopupMenu();
    var child1 = window.CreatePopupMenu();
    var ret;

    basemenu.AppendMenuItem(MF_STRING, 6, "Show toolbars");
    basemenu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    basemenu.AppendMenuItem(MF_STRING, 2, "Compact menu");
    basemenu.AppendMenuItem(MF_STRING, 1, "Full menu");
    basemenu.CheckMenuRadioItem(1, 2, window.GetProperty("mode"));
    basemenu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    basemenu.AppendMenuItem(MF_STRING | MF_POPUP, child1.ID, "Shoutcast");
   
    child1.AppendMenuItem(MF_STRING, 3, "Search by Genre");
    child1.AppendMenuItem(MF_STRING, 4, "Search by Mood");
    child1.CheckMenuItem(3, window.GetProperty("genre"));
    child1.CheckMenuItem(4, window.GetProperty("mood"));
    child1.AppendMenuItem(MF_SEPARATOR, 0, 0);
    child1.AppendMenuItem(MF_STRING, 5, "Any quality");
    child1.AppendMenuItem(MF_STRING, 999, "Broadband");
    child1.AppendMenuItem(MF_STRING, 128, "128 kpbs");
    child1.AppendMenuItem(MF_STRING, 56, "56 kpbs");
    child1.AppendMenuItem(MF_STRING, 28, "28 kpbs");
    child1.CheckMenuRadioItem(5, 128, window.GetProperty("quality"));
   
    var ret = basemenu.TrackPopupMenu(x, y);
if (ret == 0) return;
switch (ret) {
case 1:
        window.SetProperty("mode",1);
break;
case 2:
window.SetProperty("mode",2);
break;
    case 3:
        window.GetProperty("genre") == 0 ? window.SetProperty("genre", 1) : window.SetProperty("genre", 0);
break;
    case 4:
        window.GetProperty("mood") == 0 ? window.SetProperty("mood", 1) : window.SetProperty("mood", 0);
break;
case 5:
window.SetProperty("quality",5);
break;
    case 6:
        fb.RunMainMenuCommand("View/Show toolbars");
        break;
    case 999:
window.SetProperty("quality",999);
break;
    case 128:
window.SetProperty("quality",128);
break;
    case 56:
window.SetProperty("quality",56);
break;
    case 28:
window.SetProperty("quality",28);
break;
    }       
}

function on_mouse_mbtn_down(x, y) {
    window.ShowConfigure();
}

//Fixed coords for menu
function on_mouse_lbtn_down(x, y) {
    draw_menu(0,19)
}

function draw_menu(x, y) {
    if(window.GetProperty("mode") == 1) {
        var basemenu = window.CreatePopupMenu();
       
        var child1 = window.CreatePopupMenu(); //File
        var child2 = window.CreatePopupMenu(); //Edit
        var child3 = window.CreatePopupMenu(); //View
        var child4 = window.CreatePopupMenu(); //Playback
        var child5 = window.CreatePopupMenu(); //Library
        var child6 = window.CreatePopupMenu(); //Help

        var menuman1 = fb.CreateMainMenuManager();
        var menuman2 = fb.CreateMainMenuManager();
        var menuman3 = fb.CreateMainMenuManager();
        var menuman4 = fb.CreateMainMenuManager();
        var menuman5 = fb.CreateMainMenuManager();
        var menuman6 = fb.CreateMainMenuManager();

        basemenu.AppendMenuItem(MF_STRING | MF_POPUP, child1.ID, "File");
        basemenu.AppendMenuItem(MF_STRING | MF_POPUP, child2.ID, "Edit");
        basemenu.AppendMenuItem(MF_STRING | MF_POPUP, child3.ID, "View");
        basemenu.AppendMenuItem(MF_STRING | MF_POPUP, child4.ID, "Playback");
        basemenu.AppendMenuItem(MF_STRING | MF_POPUP, child5.ID, "Library");
        basemenu.AppendMenuItem(MF_STRING | MF_POPUP, child6.ID, "Help");

        menuman1.Init("file");
        menuman2.Init("edit");
        menuman3.Init("View");
        menuman4.Init("playback");
        menuman5.Init("library");
        menuman6.Init("help");

        menuman1.BuildMenu(child1, 1, 1000);
        menuman2.BuildMenu(child2, 1001, 1000);
        menuman3.BuildMenu(child3, 2001, 1000);
        menuman4.BuildMenu(child4, 3001, 1000);
        menuman5.BuildMenu(child5, 4001, 1000);
        menuman6.BuildMenu(child6, 5001, 1000);

        ret = 0;
        ret = basemenu.TrackPopupMenu(x, y);

        //fb.trace(ret);
        switch (true){
            case (ret >= 1 && ret <= 1000):
                menuman1.ExecuteByID(ret - 1);
                break;
            case (ret >= 1001 && ret <= 2000):
                menuman2.ExecuteByID(ret - 1001);
                break;
            case (ret >= 2001 && ret <= 3000):
                menuman3.ExecuteByID(ret - 2001);
                break;
            case (ret >= 3001 && ret <= 4000):
                menuman4.ExecuteByID(ret - 3001);
                break;
            case (ret >= 4001 && ret <= 5000):
                menuman5.ExecuteByID(ret - 4001);
                break;
            case (ret >= 5001 && ret <= 6000):
                menuman6.ExecuteByID(ret - 5001);
                break;
        }
        basemenu.Dispose();
        menuman1.Dispose();
        menuman2.Dispose();
        menuman3.Dispose();
        menuman4.Dispose();
        menuman5.Dispose();
        menuman6.Dispose();
    }

    else{
        //Compact menu
        var basemenu = window.CreatePopupMenu();
        var child1 = window.CreatePopupMenu();
        var child2 = window.CreatePopupMenu();
        var child3 = window.CreatePopupMenu();
        var child4 = window.CreatePopupMenu();
        var child5 = window.CreatePopupMenu();
        var child6 = window.CreatePopupMenu();
        var ret;
        var mood_array;
        var genre_array;
       
        //Split multiline tags into an array
        function split_tag(t) {
            var splitstrings = [", ",",","; "," - ","/"," "];
            var tag=fb.TitleFormat("$caps(%"+t+"%)").EvalWithMetadb(g_metadb);
            var foo = -1;
            do {
                foo++;
                var splitcheck = tag.indexOf(splitstrings[foo]);
            } while (splitcheck == -1 && foo <tag.length)
            return tag.split(splitstrings[foo]);
        }
       
        //Shoutcast stations to display when metadata unavailable
        function default_items(g,m){
            if (g || m) return;
            else {
            child4.AppendMenuItem(MF_STRING, 52, "Search for Pop stations");
            child4.AppendMenuItem(MF_STRING, 53, "Search for Hip-Hop stations");
            child4.AppendMenuItem(MF_STRING, 54, "Search for Indie stations");
            child4.AppendMenuItem(MF_STRING, 55, "Search for Rock stations");
            child4.AppendMenuItem(MF_SEPARATOR, 0, 0);
            }
        }
       
        //Builds a shoutcast menu entry for each value in a tag
        function scast_menu(tag,menuid) {
            if (g_metadb) {
                if (fb.TitleFormat("$caps(%"+tag+"%)").EvalWithMetadb(g_metadb) != "?") {
                    var s_tag = split_tag(tag);
                    var foo = -1;
                    do {
                        foo++;
                        child4.AppendMenuItem(MF_STRING,menuid++,"Search for "+s_tag[foo]+" stations");
                    } while (foo < s_tag.length-1)
                    child4.AppendMenuItem(MF_SEPARATOR, 0, 0);
                    return s_tag
                }
            }
        }
       
        //this is messy, but it works
        function scast_menu_run(t_array,id) {
            if(ret >= id && ret <= id+999){
                var shout;
                var url = "http://www.shoutcast.com/";
                var bitrate = "&searchCrit=advanced&maxbitrate="+window.GetProperty("quality")+"&mode=bitrate";
                if (t_array == genre_array) {
                    if(window.GetProperty("quality") == 5) {
                        shout = url+"radio/"+encodeURIComponent(t_array[ret-id]);
                    }
                    else {
                        shout = url+"directory/search_results.jsp?s=&sgenre="+encodeURIComponent(t_array[ret-id])+bitrate;
                    }
                }
                else {
                    if(window.GetProperty("quality") == 5) {
                        shout = url+"Internet-Radio/"+encodeURIComponent(t_array[ret-id]);
                    }
                    else {
                        shout = url+"directory/search_results.jsp?s="+encodeURIComponent(t_array[ret-id])+bitrate;
                    }
                }
                WshShell.Run(shout);
        }
    }

        basemenu.AppendMenuItem(MF_STRING, 1, "Play File...");
        if (utils.CheckComponent("foo_cdda", true)) {
            basemenu.AppendMenuItem(MF_STRING, 2, "Play Audio CD...");}
        basemenu.AppendMenuItem(MF_SEPARATOR, 0, 0);
        basemenu.AppendMenuItem(MF_STRING | MF_POPUP, child1.ID, "Library");
        basemenu.AppendMenuItem(MF_STRING | MF_POPUP, child2.ID, "Playlists");
        basemenu.AppendMenuItem(MF_SEPARATOR, 0, 0);
        if (utils.CheckComponent("foo_lastfm_radio", true)) {
            basemenu.AppendMenuItem(MF_STRING | MF_POPUP, child3.ID, "Last.fm");}
        basemenu.AppendMenuItem(MF_STRING | MF_POPUP, child4.ID, "Shoutcast");
        if (utils.CheckComponent("foo_dop", true)){
            basemenu.AppendMenuItem(MF_SEPARATOR, 0, 0);
            basemenu.AppendMenuItem(MF_STRING | MF_POPUP, child5.ID, "iPod");}

        child1.AppendMenuItem(MF_STRING, 10, "Add files...");
        child1.AppendMenuItem(MF_STRING, 11, "Add folder...");
        child1.AppendMenuItem(MF_STRING, 12, "Add location...");
        child1.AppendMenuItem(MF_SEPARATOR, 0, 0);
        child1.AppendMenuItem(MF_STRING, 13, "Music folders...");
       
        child2.AppendMenuItem(MF_STRING, 25, "Undo");
        child2.AppendMenuItem(MF_STRING, 26, "Redo");
        child2.AppendMenuItem(MF_SEPARATOR, 0, 0);
        child2.AppendMenuItem(MF_STRING, 20, "New playlist");
        child2.AppendMenuItem(MF_STRING, 21, "Load playlist...");
        child2.AppendMenuItem(MF_STRING, 22, "Save playlist...");
        child2.AppendMenuItem(MF_SEPARATOR, 0, 0);
        child2.AppendMenuItem(MF_STRING, 23, "Load XSPF playlist...");
        child2.AppendMenuItem(MF_STRING, 24, "Save XSPF playlist...");

        child3.AppendMenuItem(MF_STRING, 30, "Open a custom station...");
        child3.AppendMenuItem(MF_SEPARATOR, 0, 0);
        child3.AppendMenuItem(MF_STRING, 31, "Personal Last.fm radio");
        child3.AppendMenuItem(MF_STRING, 32, "Recommended Last.fm radio");
        child3.AppendMenuItem(MF_STRING, 33, "Neighbours' Last.fm radio");
        child3.AppendMenuItem(MF_STRING, 34, "Playlist Last.fm radio");
        child3.AppendMenuItem(MF_SEPARATOR, 0, 0);
        child3.AppendMenuItem(MF_STRING, 35, "Friends of Foobar2000 group radio");

        child5.AppendMenuItem(MF_STRING, 47, "Load library");
        child5.AppendMenuItem(MF_SEPARATOR, 0, 0);
        child5.AppendMenuItem(MF_STRING, 40, "Synchronize...");
        child5.AppendMenuItem(MF_STRING, 41, "Send playlists...");
        child5.AppendMenuItem(MF_STRING, 42, "Manage contents...");
        child5.AppendMenuItem(MF_SEPARATOR, 0, 0);
        child5.AppendMenuItem(MF_STRING, 43, "Properties...");
        child5.AppendMenuItem(MF_SEPARATOR, 0, 0);
        child5.AppendMenuItem(MF_STRING, 44, "Eject");

        child4.AppendMenuItem(MF_STRING, 50, "Open a custom station...");
        child4.AppendMenuItem(MF_SEPARATOR, 0, 0);
         if(window.GetProperty("genre") == 1) {
            g_id = 1001;
            genre_array = scast_menu("genre",g_id);
        }
        if(window.GetProperty("mood") == 1) {
            m_id = 2001;
            mood_array = scast_menu("mood",m_id);
        }
        default_items(genre_array,mood_array);
        child4.AppendMenuItem(MF_STRING, 51, "Most popular stations");

        var ret = basemenu.TrackPopupMenu(x, y);
        if (ret == 0) return;
        switch (ret) {
        case 1:
            fb.RunMainMenuCommand("File/Open...");
            break;
        case 2:
            fb.RunMainMenuCommand("File/Open Audio CD...");
            break;
        case 3:
            fb.RunMainMenuCommand("Library/Album List");
            break;       
        case 10:
            fb.RunMainMenuCommand("File/Add Files...");
            break;
        case 11:
            fb.RunMainMenuCommand("File/Add Folder...");
            break;
        case 12:
            fb.RunMainMenuCommand("File/Add Location...");
            break;
        case 13:
            fb.RunMainMenuCommand("Library/Configure");
            break;       
        case 20:
            fb.RunMainMenuCommand("File/New Playlist");
            break;
        case 21:
            fb.RunMainMenuCommand("File/Load Playlist...");
            break;
        case 22:
            fb.RunMainMenuCommand("File/Save Playlist...");
            break;
        case 23:
            fb.RunMainMenuCommand("Library/Load XSPF Playlist...");
            break;
        case 24:
            fb.RunMainMenuCommand("Library/Save to XSPF Playlist...");
            break;   
        case 25:
            fb.RunMainMenuCommand("Edit/Undo");
            break;
        case 26:
            fb.RunMainMenuCommand("Edit/Redo");
            break;   
        case 30:
            fb.RunMainMenuCommand("File/Open Last.fm Radio Station/A custom Last.fm station.");
            break;         
        case 31:
            fb.RunMainMenuCommand("File/Open Last.fm Radio Station/Open Your personal Last.fm radio.");
            break; 
        case 32:
            fb.RunMainMenuCommand("File/Open Last.fm Radio Station/Open Your recommended Last.fm radio.");
            break; 
        case 33:
            fb.RunMainMenuCommand("File/Open Last.fm Radio Station/Open Your neighbours' Last.fm radio.");
            break; 
        case 34:
            fb.RunMainMenuCommand("File/Open Last.fm Radio Station/Open Your playlist Last.fm radio.");
            break; 
        case 35:
            fb.RunMainMenuCommand("File/Open Last.fm Radio Station/Open Friends of foobar2000 Last.fm group.");
            break; 
        case 40:
            fb.RunMainMenuCommand("File/iPod/Synchronise...");
            break;
        case 41:
            fb.RunMainMenuCommand("File/iPod/Send playlists...");
            break;
        case 42:
            fb.RunMainMenuCommand("File/iPod/Manage contents");
            break;
        case 43:
            fb.RunMainMenuCommand("File/iPod/Properties");
            break;
        case 44:
            fb.RunMainMenuCommand("File/iPod/Eject");
            break;
        case 47:
            fb.RunMainMenuCommand("File/iPod/Load library");
            break;
        case 50:
            text_input_box2("Shoutcast Radio","Search for a Shoutcast station...")
            break; 
        case 51:   
            var shout = "http://www.shoutcast.com/most-popular-radio-stations";
            WshShell.Run(shout);
            break;
        case 52:
            var shout = "http://www.shoutcast.com/radio/pop";
            WshShell.Run(shout);
            break;
        case 53:
            var shout = "http://www.shoutcast.com/radio/hip-hop";
            WshShell.Run(shout);
            break;
        case 54:
            var shout = "http://www.shoutcast.com/radio/indie";
            WshShell.Run(shout);
            break;
        case 55:
            var shout = "http://www.shoutcast.com/radio/rock";
            WshShell.Run(shout);
            break;
        default:
            if(window.GetProperty("genre") == 1) {scast_menu_run(genre_array,g_id);}
            if(window.GetProperty("mood") == 1) {scast_menu_run(mood_array,m_id);}
            break;
        }
        basemenu.Dispose();
        child1.Dispose();
        child2.Dispose();
        child3.Dispose();
        child4.Dispose();
        child5.Dispose();
        child6.Dispose();
    }
}

function on_size() {
    ww = window.Width;
    wh = window.Height;
}

function on_playback_new_track() {
on_item_focus_change();
}


Preferences WHS Pannel Mod (save mode disabeld)
Habe die Pfadangabe für mein Skin angepasst aber bekomme es nicht zum laufen...
( common.js / tooltip_buttons.js und menu.png )

Bin nicht so fit unterwegs mit Jskript kann mir jemand helfen?







Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 10. Mai 2010, 22:38:16
//Refresh on track change
on_item_focus_change();


on_item_focus_change ist ein callback

Zum Refresh:

function on_item_focus_change() {
   window.Repaint();
}


(function on_paint() wird bei fokus-Wechsel abgearbeitet)

Fehlerhaft auch:
function on_playback_new_track() {
on_item_focus_change();
}




Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Andre69 in 11. Mai 2010, 08:03:56
@grimes
Ja, das sind zwar sogenannte Callbacks aber auch einfache Funktionen und diese kann man Argumentationslos aufrufen.
Dieser Callback wurde in commons.js definiert.

@Foo Foo
Hast du die Pfade auch in der commons.js (#179-184) angepasst ?
Was steht denn in der Console als letztes ?

Es funktioniert bei mir einwandfrei.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Foo Foo in 12. Mai 2010, 08:30:45
Funktioniert bei mir jetzt auch!
Was hast Du oder was soll ich genau anpassen
''Hast du die Pfade auch in der commons.js (#179-184) angepasst ?''

Danke!
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 09. August 2010, 11:04:55
Mein neues Projekt:

Foolyrica


Foolyrica holt sich Lyrics von der Webseite http://www.chartlyrics.com/

Spielt man einen Track an, so werden maximal 25 Vorschläge geliefert, um welches Lied es sich handelt.
Die Internetverbindung wird im Kontextmenü des Panels mit "Search Song (Internet)" hergestellt.
Mit der linken Maustaste (lbtn) kann man die Vorschläge wechseln.
Hat man den richtigen Song gefunden, so kann mit "Get Lyrics (Internet)" der Songtext heruntergeladen werden.

(http://www.abload.de/img/foolyrica3sbrs.jpg) (http://www.abload.de/image.php?img=foolyrica3sbrs.jpg)


Download:

(9.8.2010) 0.1 alpha
(9.8.2010) 0.1 alpha FIX
(10.8.2010) 0.2 alpha: http://pastebin.de/8975
(11.8.2010) 0.3 beta: http://pastebin.de/8994
(14.8.2010) 0.4: http://pastebin.de/9051



Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 14. August 2010, 06:57:41
FooTour

Greift auf die API von http://www.bandsintown.com/home zurück.

Es werden die Tourdaten des gerade gehörten Künstlers angezeigt.

(http://www.abload.de/img/footour213v78.jpg) (http://www.abload.de/image.php?img=footour213v78.jpg)

(Bild: Event FooTour v1.0)



(http://www.abload.de/img/footour20q7yi.jpg) (http://www.abload.de/image.php?img=footour20q7yi.jpg)

(Bild: Weltkarte FooTour v1.0)


Installation
(Neu! v1.0) Download der Weltkarte (2048x1024, 233kB):http://eoimages.gsfc.nasa.gov/images/imagerecords/57000/57752/land_shallow_topo_2048.jpg
(Copyright: NASA, NASA Terms of Use: For all non-private uses, NASA's Terms Of Use are as follows:   1. The imagery is free of licensing fee   2. NASA requires that they be provided a credit as the owners of the imagery)
Umbenennen: land_shallow_topo_2048.jpg -> world-map.jpg

Falls euch die Karte nicht gefällt, es kann jede Weltkarte mit äquidistanter zylindrischer Projektion verwendet werden.
Beispiel: http://visibleearth.nasa.gov/view.php?id=73751

(seit v0.6) Download FooTour-Banner: http://www.abload.de/image.php?img=footouro74r.png
Umbenennen: footouro74r.png -> footour.png

Die Weltkarte und FooTour-Banner werden in den Ordner (Profile)\foobar2000\pictures\ kopiert.
(Falls nicht vorhanden, bitte den Ordner "pictures" im Foobar2000-Profilordner erstellen)

Download

(14.8.2010) v0.1
(16.8.2010) v0.2
(17.8.2010) v0.3
(18.8.2010) v0.4
(18.8.2010) v0.5

(31.8.2010) v0.6: http://pastebin.de/9563
Völlig neu überarbeitete Version (update empfohlen)
(1.9.2010) v0.7: http://pastebin.de/9607
(1.9.2010) v0.8: http://pastebin.de/9612
(3.9.2010) v0.9: http://pastebin.de/9640
FIX: minor bugs
ADD: Distance Home/Stage/Tour
ADD: Back to (last) playing artist
(3.9.2010) v1.0: http://pastebin.de/9654
CHG: New world map, old one was incomplete, please replace map
CHG: Code updated for new map




Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Foo Foo in 17. August 2010, 14:46:49
Ich möchte anstelle eines Bildchens einen textbutton haben.
Segoe UI,8,normal
Wie bekomme ich das hin?  ???


// ==PREPROCESSOR==
// @import "%fb2k_path%skin\mono_lite_2\scripts\common.js"
// @import "%fb2k_path%skin\mono_lite_2\scripts\tooltip_buttons.js"
// ==/PREPROCESSOR==

function on_paint(gr){
var FP = fb.ComponentPath.replace("components","skin");
var icon = gdi.Image(FP+ "mono_lite_2/menu.png");
gr.FillSolidRect(0,0,ww,wh,RGB(220,220,220));
gr.DrawImage(icon,0,0,20,18,0,0,20,18);
}

//Preferences
function on_mouse_lbtn_down(x, y) {
var basemenu = window.CreatePopupMenu();
    var ret;

    basemenu.AppendMenuItem(MF_STRING, 1, "Open a custom station...");
    basemenu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    basemenu.AppendMenuItem(MF_STRING, 2, "Personal Last.fm radio");
    basemenu.AppendMenuItem(MF_STRING, 3, "Recommended Last.fm radio");
    basemenu.AppendMenuItem(MF_STRING, 4, "Neighbours' Last.fm radio");
    basemenu.AppendMenuItem(MF_STRING, 5, "Playlist Last.fm radio");
    basemenu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    basemenu.AppendMenuItem(MF_STRING, 6, "Friends of foobar2000 group radio");
   
    var ret = basemenu.TrackPopupMenu(x, y);
switch (ret) {
case 1:
            fb.RunMainMenuCommand("File/Open Last.fm Radio Station/A custom Last.fm station.");
            break;         
case 2:
            fb.RunMainMenuCommand("File/Open Last.fm Radio Station/Open Your personal Last.fm radio.");
            break; 
    case 3:
            fb.RunMainMenuCommand("File/Open Last.fm Radio Station/Open Your recommended Last.fm radio.");
            break; 
    case 4:
            fb.RunMainMenuCommand("File/Open Last.fm Radio Station/Open Your neighbours' Last.fm radio.");
            break; 
case 5:
    fb.RunMainMenuCommand("File/Open Last.fm Radio Station/Open Your playlist Last.fm radio.");
            break; 
    case 6:
            fb.RunMainMenuCommand("File/Open Last.fm Radio Station/Open Friends of foobar2000 Last.fm group.");
            break; 
    }       
}

function on_mouse_mbtn_down(x, y) {
    window.ShowConfigure();
}

//Fixed coords for menu
function on_mouse_rbtn_down(x, y) {

}function on_mouse_rbtn_down(x, y, vkey){
rbtnDown = vkey==6 ? true : false;
}

function on_mouse_rbtn_up(x, y, vkey){
if (rbtnDown) {
rbtnDown=false;
return vkey==4 ? false : true;
} else
return true;
}

function on_size() {
    ww = window.Width;
    wh = window.Height;
}
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 21. August 2010, 14:37:10
FooTheEchoNest

Benutzt die APIs von The Echo Nest.
Zeigt Informationen über die Künstler und gespielten Lieder aus unterschiedlichsten Quellen an.



(http://www.abload.de/img/footheechonest53998.jpg) (http://www.abload.de/image.php?img=footheechonest53998.jpg)

(Bild: FooTheEchoNest v0.3)


Installation:

Download des "Powered By The Echo Nest" Banners:
http://the.echonest.com/media/images/logos/140x50_dk.gif

Das Banner wird in den Ordner (Profile)\foobar2000\pictures\ kopiert.
(Dies ist Bestandteil der Lizenzvereinbarung mit The Echo Nest)

Bitte missbraucht den API-Key nicht, sonst wird er gesperrt!!


Download:

(21.8.2010) v0.1 Testversion
ADD: biographies
(21.8.2010) v0.2.1 Testversion
(22.8.2010) v0.3 Testversion
ADD: familiarity, hotttnesss
ADD: reviews
(25.8.2010) v0.4
ADD: blogs
ADD: news
ADD: terms
(26.8.2010) v0.5
FIX: performance
ADD: song (key, tempo, etc.)
(27.8.2010) v0.6 (bugfix release)
FIX: performance / cpu verbrauch / optimisierung
(27.8.2010) v0.7
ADD: auto retrieve
ADD: similar artists
(28.8.2010) v0.8
maintenance/bugfix release
(29.8.2010) v0.9: http://pastebin.de/9473
ADD: remember artist/title + data
(30.8.2010) v1.0: http://pastebin.de/9531
(30.8.2010) v1.1: http://pastebin.de/9542
maintenance/bugfix release
(8.9.2010) v1.2: http://pastebin.de/9784
ADD: discover similar artists
ADD: history
ADD: back to (last) playing artist
ADD: audio samples urls (to hear: copy url, paste File | Add Location...)
(10.9.2010) v1.3: http://pastebin.de/9842
FIX: bugs, glitches
(11.9.2010) v1.3.1: http://pastebin.de/9867
FIX: bug preventing APIs access






Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 12. September 2010, 12:34:55
Stop after current album v2

Diese Umsetzungen gibt es bereits:



Die neue Version basiert auf einem etwas geänderten Konzept:


Download: http://pastebin.de/9897


Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: qwert73 in 25. Juni 2011, 21:43:12
Hallo grimes,

ich wollte mal das Script zu EchoNest ausprobieren und habe es soweit im WSH Panel laufen. Ich habe nun zwar ein Kontextmenü, aber leider eine leere Oberfläche. Das wird wohl daran liegen, dass nirgendwo der Api-Key eingetragen wurde. Wo mach ich das denn nun?
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 25. Juni 2011, 22:04:55
API key ist schon beim Skript dabei.
Ich habs so gemacht, dass man standardmäßig manuell mit dem Internet verbinden muss, d.h. "The Echo Nest Song (Internet)" betätigen muss.
(Geht auch automatisch mit auto)
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: qwert73 in 25. Juni 2011, 22:28:52
Ach so, Danke! :)

Nachtrag
Kannst Du mir sagen, wie ich das Tempo eines Songs interpretieren soll. Wenn es die BPM sein sollen, dann ist das bei vielen Tracks Blödsinn.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 25. Juni 2011, 22:45:56
Das sind die bpm.
Kann sein, dass die bpm z.B. von einer live-Version stammen und so unterschiedlich sind. Kannst zwischen allen Variationen eines Songs durch klick auf "roten" Bereich blättern.
Titel: Re:WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: Foo Foo in 06. September 2011, 10:36:14
Ich habe ein Whs Script erstellt mit dem man foo_run Funktionen ausführen kann...


//den foo_run Service im Properties Fenster änderbar (default ist Mp3 Tag)
var tf_string01 = window.GetProperty("foo_run Service 01","Mp3 Tag");

//der foo_run Service Menuepunkt im Pop Up Menue
Menu.AppendMenuItem(0, 10, tf_string01);

//und der eigentliche Befehl der die Aktion ausführt
case 10:
fb.RunContextCommand("Run service/"+tf_string01);
break;


foo_run.dll muss im components Ordner vorhanden sein und
folgendes muss eingetragen sein..

Preferences - Tools - Run services

Label: Mp3 Tag

Path: ".\applications\Mp3tag\Mp3tagPortable.exe" "%_path%"


habe den Pfad relativ angegeben es handelt sich um das
foobar Verzeichniss..

foobar2000\applications\Mp3tag\Mp3tagPortable.exe" "%_path%

Ich würde gerne mein script so umschreiben das ich die Aktionen auch ohne foo_run
ausführen kann nur mit WHS Pannel.

Kann mir jemand weiterhelfen?  :-\

Danke!








Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 24. Oktober 2016, 14:32:21
So, ich belebe den alten Thread nochmal :)

Habe einen Textbutton "kreiert", der umfangreich konfigurierbar ist.
Er sollte sowohl mit dem WSH Panel mod als auch mit dem neueren JScript Panel funktionieren.

Vielleicht will das ja mal jemand testen.
Einfach den Ordner in den Profilpfad der jeweiligen foobar2000-Installation entpacken, ein Panel (WSH Panel mod oder JScript Panel) zur Config hinzufügen und die Datei "buttontest.txt" importieren.
Im "Configure"-Fenster stehen dann einige Hinweise zum jeweiligen Button.

Einige mögliche Erscheinungsbilder habe ich mal schnell im Beispielscript (zum Herumspielen mit den insgesamt bis zu 26 Optionen) erstellt:
(https://abload.de/img/buttontest93jjn.png) (http://abload.de/image.php?img=buttontest93jjn.png)

Würde mich freuen, wenn ihr mir mitteilt, ob der Button sinnvoll ist, oder ob es noch Verbesserungsvorschläge gibt.
Und wer sich mit Javascript auskennt, der kann sich ja mal die Scripts anschauen. Vielleicht findet ja jemand einen Fehler darin oder hat Vorschläge zur Optimierung des Codes :)

Es gibt zahlreiche Optionen, die natürlich nicht alle gleichzeitig aktiviert werden müssen und auch nicht für jeden Button einzeln (man hat ja üblicherweise in einem Panel mehrere Buttons des gleichen Stils).

Besonderheit:
Für die Erstellung der Buttons müssen zwei Einträge ins Script:
Einmal die Erstellung des Objektes global und dann noch die Positionierung des Buttons.
Falls man nämlich - wie ich - häufig relative Größenangaben hat, ändert man die Positionierung besser in function on_size().
Da ich aber nicht jedesmal das ganze Objekt in on_size neu erstellen möchte, gehe ich diesen "merkwürdigen" Weg.
Obwohl es von der Performance eher egal wäre... ist mehr zur Beruhigung meines Gewissens :D

Viel Spaß beim Testen!
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 24. Oktober 2016, 15:20:32
Aw, crashed!  :(

ZitatJScript Panel (Buttontest v1.0 by tedGo, based on a sample created by T.P. Wang, using partial code by super-gau)
Laufzeitfehler in JavaScript:
Der Wert der Eigenschaft "RGBA" ist Null oder undefiniert, kein Function-Objekt
File: <main>
Line: 10, Col: 1
<source text only available at compile time>

EDIT:
Ok, hab es jetzt hinbekommen. (Appdata) foobar2000/buttontest
Ich werd es mal ausprobieren.

EDIT2: Funktioniert gut.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: huber71 in 24. Oktober 2016, 16:38:25
Aw, Crashed ...

Scripting Engine Initialization Failed (Buttontest v1.0 by tedGo, based on a sample created by T.P. Wang, using partial code by super-gau, CODE: 0x80020101)
Check the console for more information (Always caused by unexcepted script error).
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 24. Oktober 2016, 16:52:28
Ja, hab das wohl missverständlich ausgedrückt...

Also der ZIP-Ordner muss als "buttontest"-Ordner in den Profilpfad von foobar2000 (in einer Standardinstallation ist das %appdata%\foobar2000, in einer portablen Installation ist das der foobar2000-Programmordner) entpackt werden ;)

@huber59
Und was steht in der Console?
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 24. Oktober 2016, 17:04:18
Kann man nicht die Variablen, die das Aussehen der buttons ändern, nicht in die JScript-Properties auslagern? Ich finde das so übersichtlicher.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: huber71 in 24. Oktober 2016, 17:12:14
der buttontest-Ordner liegt im Foobar-Ordner (portable Version)

Wo genau muss das WSH Panel denn hin?  :-\
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 24. Oktober 2016, 17:18:38
@grimes
Das wollte ich zuerst.
Aber was, wenn man in einem Panel mehrere verschiedene Buttons einbauen will?
Ich hab das bei meinem DarkOne4Mod bemerkt. Hab da ja zwei verschiedene Buttons in einem Panel.
Und dann noch bis zu 10 zusätzliche optionale Buttons mit je vier Einträgen im Properties-Fenster... da ist dann im Fenster mehr Text als im Script... :D

@huber59
Wo du das Panel hinzufügst ist egal, ist ja nur zum Testen ;)
Funktioniert es denn jetzt?
Wenn nicht, was sagt die Console?
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 24. Oktober 2016, 17:28:19
Ich würde das trotzdem machen. Im Script rumpfuschen ist immer gefährlich. (Ich schweige lieber darüber, wie ich Deine Buttons verhunzt habe. :D)

So etwa:
JS-Properties
BUTTON1.style
BUTTON1.align
-----------------
BUTTON2.style
BUTTON2.align


(AFAIK Lässt sich bei vielen Einträgen auch scrollen)
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 24. Oktober 2016, 17:39:35
Gut, das wäre machbar.
Aber... ich habe in einem Panel 19 Buttons.
Wenn ich jetzt für jeden 26 Optionen übers Panel schalten lasse, sind das allein 494 Einträge...
Zusätzlich noch 40 Einträge der optionalen Buttons.

Okay... ist jetzt ein Extrembeispiel.
Normalerweise langen - da ja nur zwei unterschiedliche Ansichten im Panel sind - 52 Einträge für die Optionen (plus die 40 fürs freischalten der optionalen Buttons).

Es ist im Normalfall auch gar nicht so viel und unübersichtlich, wie das jetzt scheint!
Denn 1. benutzt man in der Regel nicht alle Optionen und 2. dann eben auch oft gemeinsame Optionen für ganze Buttongruppen.

Ich hänge mal die Beispielscripts aus DarkOne4Mod v1.1 an, an dem ich gerade arbeite (einige Detalverbesserungen und Vereinfachungen - gerade auch in Bezug auf die optionalen Buttons).

(Der im ZIP-Ordner enthaltene Ordner cui-configs gehört wieder unter %appdata%\foobar2000 bzw. bei einer portablen Installation in den foobar2000-Ordner. Die zu ladenden Scripts befinden sich unter cui-configs\darkone4mod\jscript\panels. Es sind die beiden Buttonpanel und auch das erneuerte Display - könnt ihr ja gleich mal mittesten ;))

So siehst du mal am praktischen Beispiel, dass es gar nicht so unübersichtlich ist ;)

EDIT: Habe den Upload noch mal hochgeladen... war noch unsinnigerweise die alte Manual4Mod.pdf mit drin...
EDIT2: Noch mal den Upload erneuert...
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 24. Oktober 2016, 17:44:25
Also jetzt nur mal eine Idee. Die properties lassen sich abspeichern (.wsp). Da könnte man doch Button presets kreieren.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 24. Oktober 2016, 17:51:41
Hm... das habe ich noch nie gemacht... klingt aber interessant...
Muss ich mir noch mal durch den Kopf gehen lassen.

Was sagst du zum Script?
Gar nicht so unübersichtlich wie du dachtest, oder?

Btw. die optionalen Buttons lassen sich wie folgt aktivieren:
Rechtsklick ins Panel --> Manage optional buttons --> ganz rechts neben dem jeweiligen Button doppelklicken und aus "false" "true" machen --> Apply.
Dann den Befehl bei "... command string" eingeben (fb.... Commands gehen nicht! Nur noch Befehle aus dem Main Menu, z. B. File/Preferences oder Equalizer oder dem Kontextmenü, z. B. Properties, Batch attach pictures usw. funktionieren hier!)
Handelt es sich um ein Befehl aus dem Kontextmenü, dann bei der Frage "context menu command?" auf "true" umstellen und gegebenenfalls noch den Buttonnamen ändern.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: huber71 in 24. Oktober 2016, 17:55:41
rudere zurück - es funktioniert jetzt  :)
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 24. Oktober 2016, 18:06:38
Freut mich :)
Hoffentlich macht es Spaß, mal mit den Optionen zu spielen.
Es sollten ja reichlich Anpassungsmöglichkeiten gegeben sein ;)
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 24. Oktober 2016, 18:08:19
Ich bekomme die fcl auf die Schnelle nicht zum Laufen. alle Scripts sind abgestürzt. Das stimmt was mit den Pfaden nicht.

Habe bisher auch nicht mit den Properties gearbeitet. Kann da wenig helfen.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: tedgo in 24. Oktober 2016, 18:11:47
Oh... hoppla...
Nicht die FCL laden!

Die ist obsolet... ich war nur zu faul, den Ordner (ist mein momentaner "Arbeitsordner) auseinander zu klamüsern... :D
Nur das benötigte Script aus dem Ordner cui-configs\darkone4mod\jscript\panels in ein WSH/Jscript Panel laden!

EDIT: Hab den Upload noch mal erneuert und diesmal (hoffentlich) nur das drin gelassen, was man für die Scripts braucht.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: TomPro in 27. April 2017, 13:28:02
Nach langer langer Zeit mal wieder was kleines. Ein Mitarbeiter ist nun auch auf foobar2000 gestossen und fand schon den Anfang sehr vielversprechend, lediglich eine Uhr, welche die Abgelaufene Playtime Anzeigt, und die man als Panel Integrieren kann fehle ihm. Hier also ein Simpler "Play Time Counter" mit einstelloptionen:


//----------------------------------------------------------------------------
//--- JScript
//----------------------------------------------------------------------------


//--- ---   Preprocessor
// ==PREPROCESSOR==
//
// #### Script Info
// ##
// @name "Play Time Counter"
// @version "2017.04.22"
// @author "TomPro"
//
// ==/PREPROCESSOR==


//--- ---   Properties
var CountDown  = window.GetProperty("*USER.Direction.Countdown", false);
var Direction  = window.GetProperty("*USER.Direction.Show", true);
var BackColor  = Number(window.GetProperty("*USER.Background.Color", "0x2F4F4F"));
var FontColor1 = Number(window.GetProperty("*USER.Font.Color", "0xFFFFFF"));
var FontName   = window.GetProperty("*USER.Font.Name", "Arial");

//--- ---   Check font
if (utils.CheckFont(FontName) == false) {
    FontName    = "Arial";
    window.SetProperty("*USER.Font.Name", FontName);
};

//--- ---   Check colors
var FontColor2, DirColorBack, DirColorFront;

function checkColors() {
    BackColor  = BackColor  | 0xFF000000;
    FontColor1 = FontColor1 | 0x000000;

    var r = 0xFF & (BackColor >> 16);
    var g = 0xFF & (BackColor >>  8);
    var b = 0xFF &  BackColor;

    if (((r << 16) | (g << 8) | (b)) < FontColor1) {
        r = ((r + 0x30) > 0xFF) ? 0xFF : r + 0x30;
        g = ((g + 0x30) > 0xFF) ? 0xFF : g + 0x30;
        b = ((b + 0x30) > 0xFF) ? 0xFF : b + 0x30;
    } else {
        r = ((r - 0x30) < 0x00) ? 0x00 : r - 0x30;
        g = ((g - 0x30) < 0x00) ? 0x00 : g - 0x30;
        b = ((b - 0x30) < 0x00) ? 0x00 : b - 0x30;
    };

    FontColor2    = (r << 16) | (g << 8) | (b);
    DirColorBack  = FontColor2 | 0xFF000000;
    DirColorFront = FontColor1 | 0xFF000000;
};

checkColors();

//--- ---   Size
var ww, wh, fh, f_min, f_sec;
var hMin, hSec, hDir;
var yMin, ySec, yDir;
var wSep, wStd, wMin, wSec, wDir;
var xStd, xSep1, xMin, xSep2, xSec, xDir;

function on_size() {
    ww   = window.Width;
    wh   = window.Height;
    xStd = 3;

    // Create temporary graphic interface
    temp_bmp = gdi.CreateImage(1, 1);
    temp_gr  = temp_bmp.GetGraphics();

    // Get font
    var tw, th;
    fh = 16;
    do {
        fh++;
        f_min = gdi.Font(FontName, fh, 0);
        f_sec = gdi.Font(FontName, Math.round(fh * 0.75), 0);
        tw    = temp_gr.CalcTextWidth( "0:00:", f_min) + temp_gr.CalcTextWidth("00", f_sec) + 2 * xStd;
        th    = temp_gr.CalcTextHeight("0:00:", f_min);
    };
    while (tw < ww && th < wh);
    fh--;
    f_min = gdi.Font(FontName, fh, 0);
    f_sec = gdi.Font(FontName, fh * 0.75, 0);
    tw    = temp_gr.CalcTextWidth( "0:00:", f_min) + temp_gr.CalcTextWidth("00", f_sec) + 2 * xStd;
    th    = temp_gr.CalcTextHeight("0:00:", f_min);

    // Get heights
    hMin  = Math.round(th);
    hSec  = Math.round(th * 0.75);
    hDir  = Math.round(th * 0.10);

    // Get y-positions
    yMin  = Math.floor((wh - hMin) / 2);
    ySec  = yMin + Math.round(th * 0.25);
    yDir  = yMin + hDir;

    // Get widths
    wSep  = temp_gr.CalcTextWidth( ":", f_min);
    wStd  = temp_gr.CalcTextWidth( "0", f_min);
    wMin  = temp_gr.CalcTextWidth("00", f_min);
    wSec  = temp_gr.CalcTextWidth("00", f_sec);
    wDir  = Math.round(wSec / 2);

    // Get x-positions
    xStd  = Math.round((ww - tw) / 2);
    xSep1 = xStd  + wStd;
    xMin  = xSep1 + wSep;
    xSep2 = xMin  + wMin;
    xSec  = xSep2 + wSep;
    xDir  = xSec  + wDir;

    // Dispose temporary graphic interface
    temp_bmp.ReleaseGraphics(temp_gr);
    delete temp_bmp;
    delete temp_gr;

    // Repaint
    window.Repaint();
};

//--- ---   Painting
function on_paint(gr){
    // Background
    gr.FillSolidRect( 0, 0, ww, wh, BackColor);

    // Count direction
    if (Direction == true) {
        gr.FillSolidRect(     xSec, yDir, wSec, hDir, DirColorBack);
        if (CountDown == true) {
            gr.FillSolidRect( xDir, yDir, wDir, hDir, DirColorFront);
        } else {
            gr.FillSolidRect( xSec, yDir, wDir, hDir, DirColorFront);
        };
    };

    // Play time
    if (tStd == 0) {
        gr.GdiDrawText( tStd, f_min, FontColor2, xStd , yMin, wStd, hMin, 2);
        gr.GdiDrawText(  ":", f_min, FontColor2, xSep1, yMin, wSep, hMin, 1);
        gr.GdiDrawText(tMin1, f_min, FontColor2, xMin , yMin, wMin, hMin, 0);
    } else {
        gr.GdiDrawText( tStd, f_min, FontColor1, xStd , yMin, wStd, hMin, 2);
        gr.GdiDrawText(  ":", f_min, FontColor1, xSep1, yMin, wSep, hMin, 1);
        gr.GdiDrawText(tMin1, f_min, FontColor1, xMin , yMin, wMin, hMin, 0);
    };
    gr.GdiDrawText(    tMin2, f_min, FontColor1, xMin , yMin, wMin, hMin, 2);
    gr.GdiDrawText(      ":", f_min, FontColor1, xSep2, yMin, wSep, hMin, 1);
    gr.GdiDrawText(     tSec, f_sec, FontColor1, xSec , ySec, wSec, hSec, 0);
};

//--- ---   Playback
var Time  = fb.PlaybackLength;
var tStd  = 0;
var tMin1 = 0;
var tMin2 = 0;
var tSec  = "00";

function on_playback_stop(reason) {
    Time  = 0;
    tStd  = 0;
    tMin1 = 0;
    tMin2 = 0;
    tSec  = "00";

    // Repaint
    window.Repaint();
};

function on_playback_new_track(metadb) {
    Time = fb.PlaybackLength;
    setTimes();
};

function on_playback_edited(metadb) {
    setTimes();
};

function on_playback_seek(time) {
    setTimes();
};

function on_playback_time(time) {
    setTimes();
};

function setTimes() {
    var tx = (CountDown == true) ? Math.abs(Math.round(Time - fb.PlaybackTime)) : Math.abs(Math.round(fb.PlaybackTime));

    tStd   = Math.floor(tx / (60 * 60));
    tx    -= tStd * 60 * 60;
    tMin2  = Math.floor(tx / 60);
    tMin1  = (tMin2 < 10) ? 0 : "";
    tSec   = tx % 60;
    if (tSec < 10) tSec = "0" + tSec;

    // Repaint
    window.Repaint();
};

setTimes();

//--- ---   Sub Menu
function on_mouse_lbtn_down(x, y, mask) {
    var _Menu = window.CreatePopupMenu();
    var _ColB = window.CreatePopupMenu();
    var _ColF = window.CreatePopupMenu();
    var _Font = window.CreatePopupMenu();

    // Direction
    _Menu.AppendMenuItem(0x00, 11, "Show Direction");
    _Menu.AppendMenuItem(0x00, 12, "Countdown");

    _Menu.CheckMenuItem(11, (Direction == true));
    _Menu.CheckMenuItem(12, (CountDown == true));

    _Menu.AppendMenuSeparator();

    // Colors
    var Split = Math.round(PreColorList.length / 6);
    var cBackNo = 101;
    var cFontNo = 301;

    _ColB.AppendTo(_Menu, 0x00, "Background Color");
    _ColF.AppendTo(_Menu, 0x00, "Font Color");

    var ii;
    for (var i in PreColorList) {
        ii = Number(i);
        // Fill popupmenu
        if ((ii != 0) && (ii % Split == 0)) {
            // New row
            _ColB.AppendMenuItem(0x20, cBackNo + ii, PreColorList[i]);
            _ColF.AppendMenuItem(0x20, cFontNo + ii, PreColorList[i]);
        } else {
            // Fill row
            _ColB.AppendMenuItem(0x00, cBackNo + ii, PreColorList[i]);
            _ColF.AppendMenuItem(0x00, cFontNo + ii, PreColorList[i]);
        };

        // Highlight used color
        _ColB.CheckMenuItem((cBackNo + ii), ((BackColor  & 0xFFFFFF) == (PreColor[PreColorList[i]] & 0xFFFFFF)));
        _ColF.CheckMenuItem((cFontNo + ii), ((FontColor1 & 0xFFFFFF) == (PreColor[PreColorList[i]] & 0xFFFFFF)));
    };

    // Fonts
    var Split = Math.round(FontList.length / 2);
    var FontNo = 501;

    _Font.AppendTo(_Menu, 0x00, "Fonts   (\"" + FontName + "\")");

    for (var i in FontList) {
        ii = Number(i);
        // Fill popupmenu
        if ((ii != 0) && (ii % Split == 0)) {
            // New row
            _Font.AppendMenuItem(0x20, FontNo + ii, FontList[i]);
         } else {
            // Fill row
            _Font.AppendMenuItem(0x00, FontNo + ii, FontList[i]);
        };

        // Highlight used color
        _Font.CheckMenuItem((FontNo + ii), (FontName == FontList[i]));
    };

    // Execute
    var ret = _Menu.TrackPopupMenu(x,y);
    switch (true) {
        // Show direction
        case (ret == 11):;
            // Toggle countdown flag
            Direction = (Direction == true) ? false : true;

            // Write hex string to properties
            window.SetProperty("*USER.Direction.Show", Direction);

            // Repaint
            window.Repaint();
            break;
        // Countdown
        case (ret == 12):;
            // Toggle countdown flag
            CountDown = (CountDown == true) ? false : true;

            // Write hex string to properties
            window.SetProperty("*USER.Direction.Countdown", CountDown);

            // Repaint
            window.Repaint();
            break;
        // Backgroundcolor
        case (cBackNo <= ret && ret <= cBackNo + PreColorList.length):;
            // Get color as hex string
            BackColor = ((PreColor[PreColorList[ret - cBackNo]]) & 0x00FFFFFF).toString(16);

            // Pad hex string up to 6 carachters plus leading "0x"
            BackColor = "0x000000".substr(0, 8 - BackColor.length) + BackColor;

            // Write hex string to properties
            window.SetProperty("*USER.Background.Color", BackColor);

            // Get color and repaint
            BackColor = Number(BackColor);
            checkColors();
            window.Repaint();
            break;
        // Fontcolor
        case (cFontNo <= ret && ret <= cFontNo + PreColorList.length):;
            // Get color as hex string
            FontColor1 = ((PreColor[PreColorList[ret - cFontNo]]) & 0x00FFFFFF).toString(16);

            // Pad hex string up to 6 carachters plus leading "0x"
            FontColor1 = "0x000000".substr(0, 8 - FontColor1.length) + FontColor1;

            // Write hex string to properties
            window.SetProperty("*USER.Font.Color", FontColor1);

            // Get color and repaint
            FontColor1 = Number(FontColor1);
            checkColors();
            window.Repaint();
            break;
        // Font
        case (FontNo  <= ret && ret <= FontNo  + FontList.length):;
            // Get fontname
            FontName = FontList[ret - FontNo];

            // Write fontname to properties
            window.SetProperty("*USER.Font.Name", FontName);

            // Resize window
            on_size();
            break;
        // Nothing
        default:;
            break;
    };

    _ColB.Dispose();
    _ColF.Dispose();
    _Font.Dispose();
    _Menu.Dispose();
};


//--- ---   pre-calculated colors
PreColor = {
AliceBlue : 0xFFF0F8FF,
AntiqueWhite : 0xFFFAEBD7,
Aqua : 0xFF00FFFF,
Aquamarine : 0xFF7FFFD4,
Azure : 0xFFF0FFFF,
Beige : 0xFFF5F5DC,
Bisque : 0xFFFFE4C4,
Black : 0xFF000000,
BlanchedAlmond : 0xFFFFEBCD,
Blue : 0xFF0000FF,
BlueViolet : 0xFF8A2BE2,
Brown : 0xFFA52A2A,
BurlyWood : 0xFFDEB887,
CadetBlue : 0xFF5F9EA0,
Chartreuse : 0xFF7FFF00,
Chocolate : 0xFFD2691E,
Coral : 0xFFFF7F50,
CornflowerBlue : 0xFF6495ED,
Cornsilk : 0xFFFFF8DC,
Crimson : 0xFFDC143C,
Cyan : 0xFF00FFFF,
DarkBlue : 0xFF00008B,
DarkCyan : 0xFF008B8B,
DarkGoldenrod : 0xFFB8860B,
DarkGray : 0xFFA9A9A9,
DarkGreen : 0xFF006400,
DarkKhaki : 0xFFBDB76B,
DarkMagenta : 0xFF8B008B,
DarkOliveGreen : 0xFF556B2F,
DarkOrange : 0xFFFF8C00,
DarkOrchid : 0xFF9932CC,
DarkRed : 0xFF8B0000,
DarkSalmon : 0xFFE9967A,
DarkSeaGreen : 0xFF8FBC8B,
DarkSlateBlue : 0xFF483D8B,
DarkSlateGray : 0xFF2F4F4F,
DarkTurquoise : 0xFF00CED1,
DarkViolet : 0xFF9400D3,
DarkYellow : 0xFFA0A000,
DeepPink : 0xFFFF1493,
DeepSkyBlue : 0xFF00BFFF,
DimGray : 0xFF696969,
DodgerBlue : 0xFF1E90FF,
Firebrick : 0xFFB22222,
FloralWhite : 0xFFFFFAF0,
ForestGreen : 0xFF228B22,
Fuchsia : 0xFFFF00FF,
Gainsboro : 0xFFDCDCDC,
GhostWhite : 0xFFF8F8FF,
Gold : 0xFFFFD700,
Goldenrod : 0xFFDAA520,
Gray : 0xFF808080,
Green : 0xFF008000,
GreenYellow : 0xFFADFF2F,
Honeydew : 0xFFF0FFF0,
HotPink : 0xFFFF69B4,
IndianRed : 0xFFCD5C5C,
Indigo : 0xFF4B0082,
Ivory : 0xFFFFFFF0,
Khaki : 0xFFF0E68C,
Lavender : 0xFFE6E6FA,
LavenderBlush : 0xFFFFF0F5,
LawnGreen : 0xFF7CFC00,
LemonChiffon : 0xFFFFFACD,
LightBlue : 0xFFADD8E6,
LightCoral : 0xFFF08080,
LightCyan : 0xFFE0FFFF,
LightGoldenrodYellow : 0xFFFAFAD2,
LightGray : 0xFFD3D3D3,
LightGreen : 0xFF90EE90,
LightPink : 0xFFFFB6C1,
LightSalmon : 0xFFFFA07A,
LightSeaGreen : 0xFF20B2AA,
LightSkyBlue : 0xFF87CEFA,
LightSlateGray : 0xFF778899,
LightSteelBlue : 0xFFB0C4DE,
LightYellow : 0xFFFFFFE0,
Lime : 0xFF00FF00,
LimeGreen : 0xFF32CD32,
Linen : 0xFFFAF0E6,
Magenta : 0xFFFF00FF,
Maroon : 0xFF800000,
MediumAquamarine : 0xFF66CDAA,
MediumBlue : 0xFF0000CD,
MediumOrchid : 0xFFBA55D3,
MediumPurple : 0xFF9370DB,
MediumSeaGreen : 0xFF3CB371,
MediumSlateBlue : 0xFF7B68EE,
MediumSpringGreen : 0xFF00FA9A,
MediumTurquoise : 0xFF48D1CC,
MediumVioletRed : 0xFFC71585,
MidnightBlue : 0xFF191970,
MintCream : 0xFFF5FFFA,
MistyRose : 0xFFFFE4E1,
Moccasin : 0xFFFFE4B5,
NavajoWhite : 0xFFFFDEAD,
Navy : 0xFF000080,
OldLace : 0xFFFDF5E6,
Olive : 0xFF808000,
OliveDrab : 0xFF6B8E23,
Orange : 0xFFFFA500,
OrangeRed : 0xFFFF4500,
Orchid : 0xFFDA70D6,
PaleGoldenrod : 0xFFEEE8AA,
PaleGreen : 0xFF98FB98,
PaleTurquoise : 0xFFAFEEEE,
PaleVioletRed : 0xFFDB7093,
PapayaWhip : 0xFFFFEFD5,
PeachPuff : 0xFFFFDAB9,
Peru : 0xFFCD853F,
Pink : 0xFFFFC0CB,
Plum : 0xFFDDA0DD,
PowderBlue : 0xFFB0E0E6,
Purple : 0xFF800080,
Red : 0xFFFF0000,
RosyBrown : 0xFFBC8F8F,
RoyalBlue : 0xFF4169E1,
SaddleBrown : 0xFF8B4513,
Salmon : 0xFFFA8072,
SandyBrown : 0xFFF4A460,
SeaGreen : 0xFF2E8B57,
SeaShell : 0xFFFFF5EE,
Sienna : 0xFFA0522D,
Silver : 0xFFC0C0C0,
SkyBlue : 0xFF87CEEB,
SlateBlue : 0xFF6A5ACD,
SlateGray : 0xFF708090,
Snow : 0xFFFFFAFA,
SpringGreen : 0xFF00FF7F,
SteelBlue : 0xFF4682B4,
Tan : 0xFFD2B48C,
Teal : 0xFF008080,
Thistle : 0xFFD8BFD8,
Tomato : 0xFFFF6347,
Turquoise : 0xFF40E0D0,
Violet : 0xFFEE82EE,
Wheat : 0xFFF5DEB3,
White : 0xFFFFFFFF,
WhiteSmoke : 0xFFF5F5F5,
Yellow : 0xFFFFFF00,
YellowGreen : 0xFF9ACD32
};

PreColorList = new Array();

for (var i in PreColor) {
    PreColorList.push(i);
};


//--- ---   pre-selected fonts
PreFontList = new Array(
    "Arial",
    "Calibri",
    "Cambria",
    "Cambria Math",
    "Candara",
    "Comic Sans MS",
    "Consolas",
    "Constantia",
    "Corbel",
    "Courier New",
    "Franklin Gothic Medium",
    "Gabriola",
    "Georgia",
    "Impact",
    "Lucida Console",
    "Lucida Sans Unicode",
    "Microsoft Sans Serif",
    "Palatino Linotype",
    "Script",
    "Segoe Print",
    "Segoe Script",
    "Segoe UI",
    "Segoe UI Symbol",
    "Symbol",
    "Tahoma",
    "Times New Roman",
    "Trebuchet MS",
    "Verdana",
    "Webdings",
    "Wingdings"
    );

FontList = new Array();

for (var i in PreFontList) {
    if (utils.CheckFont(PreFontList[i]) == true) FontList.push(PreFontList[i]);
};


//EOF


Veränderungen an der Darstellung kann man mit Hilfe eines "Left Mousebuton klick" bewerkstelligen. Und wem die Farb- oder Fontauswahl nicht reicht, kann mit der rechten Maustaste auch noch in den Properties entsprechendes Einstellen.
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: miras in 08. April 2018, 20:54:11
Hallo grimes, kannst du das "FooTour" -Skript teilen?
Titel: Re: WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)
Beitrag von: grimes in 08. April 2018, 21:13:53
FooTour Skript

//FooTour v1.0 by grimes
//uses BandsInTown API
//fb2k 1.0+, WSH Panel Mod 1.3.2+ required
//DUI/CUI ready

function RGB(r, g, b) {
    return (0xff000000 | (r << 16) | (g << 8) | (b));
}

var dui = window.InstanceType;
var g_font = dui === 1 ? window.GetFontDUI(0) : window.GetFontCUI(0);
//var color = RGB(200,0,0);
var color = dui === 1 ? window.GetColorDUI(2) : RGB(200, 0, 0);
//var color2 = RGB(0,0,0);
var color2 = dui === 1 ? window.GetColorDUI(0) : window.GetColorCUI(0);

var browser = window.GetProperty("Browser (firefox, iexplore) ", "firefox");
var auto = window.GetProperty("Auto Retrieve ", false);

//map
var worldmap = fb.ProfilePath + "\\pictures\\world-map.jpg";
var footourlogo = fb.ProfilePath + "\\pictures\\footour.png";
var map = window.GetProperty("Show Map ", true);
var homelocation = window.GetProperty("Home Location (City,Country) ", "Frankfurt,Germany");
var homelatitude = window.GetProperty("Home Latitude ", 50.1167);
var homelongitude = window.GetProperty("Home Longitude ", 8.6833);
var radius = window.GetProperty("Radius (miles) ", 100);
var g_img = null;
var ww = 0,
    wh = 0;
var xm;
var ym;
var xp;
var yp;
var scale;
var mlatitude = -91;
var mlongitude = -181;
var mx = 0;
var my = 0;
var line = false;
var square = true;
var longborder = 180;
var latborder = 90;
var d1 = 0;
var d2 = 0;
var d3 = 0;
var d4 = 0;

var xmlhttp = "";
var xmlhttp2 = "";
var xmlhttp3 = "";
var xmlhttp4 = "";
var xmlhttp5 = "";
var xmlhttp6 = "";
var xmltext = "";
var request1 = false;
var request2 = false;
var request3 = false;
var request4 = false;
var request5 = false;
var request6 = false;
var artistname = [];
var venuename = [];
var venuecity = [];
var venueregion = [];
var venuecountry = [];
var venuelatitude = [];
var venuelongitude = [];
var ticketstatus = [];
var datetime = [];
var onsaledatetime = [];
var artisturl = [];
var venueurl = [];
var venueid = [];
var venueidv = "";

var vert = 20;
var artist = "";
var artistold = "";
var artistplaying = "";
var set = 0;

function get_tags() {
    artist = fb.TitleFormat("$replace(%artist%,/,\/)").Eval();
    artistplaying = artist;
}

if (fb.IsPlaying || fb.IsPaused) {
    get_tags();
}

function get_image() {
    g_img = gdi.Image(worldmap);
    g_img2 = gdi.Image(footourlogo);
}

get_image();

function toRad(deg) {
    return deg * Math.PI / 180;
}

//haversine formula
function calc_distance(lat1, lon1, lat2, lon2) {
    var R = 6371; // km
    var dLat = toRad(lat2 - lat1);
    var dLon = toRad(lon2 - lon1);
    var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    var d = R * c;
    if (d < radius * 1.60934) {
        return Math.round(d * 10) / 10;
    }
    else {
        return Math.round(d);
    }
}

function get_distance() {
    d2 = calc_distance(venuelatitude[set], venuelongitude[set], homelatitude, homelongitude);
    d3 = calc_distance(venuelatitude[set], venuelongitude[set], venuelatitude[set + 1], venuelongitude[set + 1]);
}

function get_events() {
    xml = new ActiveXObject("microsoft.xmldom");
    xml.async = true;
    if (request1) {
        filled = xml.loadXML(xmlhttp.responseText);
    }
    else if (request2) {
        filled = xml.loadXML(xmlhttp2.responseText);
    }
    else if (request3) {
        filled = xml.loadXML(xmlhttp3.responseText);
    }
    else if (request4) {
        filled = xml.loadXML(xmlhttp4.responseText);
    }
    else if (request5) {
        filled = xml.loadXML(xmlhttp5.responseText);
    }
    else if (request6) {
        filled = xml.loadXML(xmlhttp6.responseText);
    }
    root = xml.documentElement;
    if (filled) {
        try {
            for (i = 0; i < root.getElementsByTagName("city").length; i++) {
                if (i >= 150) {
                    break;
                }
                if (root.getElementsByTagName("artists")[i].firstChild.firstChild && root.getElementsByTagName("artists")[i].firstChild.firstChild.firstChild) {
                    artistname.push(root.getElementsByTagName("artists")[i].firstChild.firstChild.childNodes[0].nodeValue);
                }
                else {
                    artistname.push("N/A");
                }
                if (root.getElementsByTagName("venue")[i] && root.getElementsByTagName("venue")[i].firstChild) {
                    venuename.push(root.getElementsByTagName("venue")[i].firstChild.nextSibling.nextSibling.childNodes[0].nodeValue);
                }
                else {
                    venuename.push("N/A");
                }
                if (root.getElementsByTagName("city")[i] && root.getElementsByTagName("city")[i].firstChild) {
                    venuecity.push(root.getElementsByTagName("city")[i].childNodes[0].nodeValue);
                }
                else {
                    venuecity.push("N/A");
                }
                if (root.getElementsByTagName("region")[i] && root.getElementsByTagName("region")[i].firstChild) {
                    venueregion.push(root.getElementsByTagName("region")[i].childNodes[0].nodeValue);
                }
                else {
                    venueregion.push("N/A");
                }
                if (root.getElementsByTagName("country")[i] && root.getElementsByTagName("country")[i].firstChild) {
                    venuecountry.push(root.getElementsByTagName("country")[i].childNodes[0].nodeValue);
                }
                else {
                    venuecountry.push("N/A");
                }
                if (root.getElementsByTagName("latitude")[i] && root.getElementsByTagName("latitude")[i].firstChild) {
                    venuelatitude.push(root.getElementsByTagName("latitude")[i].childNodes[0].nodeValue);
                }
                else {
                    venuelatitude.push("N/A");
                }
                if (root.getElementsByTagName("longitude")[i] && root.getElementsByTagName("longitude")[i].firstChild) {
                    venuelongitude.push(root.getElementsByTagName("longitude")[i].childNodes[0].nodeValue);
                }
                else {
                    venuelongitude.push("N/A");
                }
                if (root.getElementsByTagName("ticket_status")[i] && root.getElementsByTagName("ticket_status")[i].firstChild) {
                    ticketstatus.push(root.getElementsByTagName("ticket_status")[i].childNodes[0].nodeValue);
                }
                else {
                    ticketstatus.push("N/A");
                }
                if (root.getElementsByTagName("datetime")[i] && root.getElementsByTagName("datetime")[i].firstChild) {
                    datetime.push(root.getElementsByTagName("datetime")[i].childNodes[0].nodeValue);
                }
                else {
                    datetime.push("N/A");
                }
                if (root.getElementsByTagName("on_sale_datetime")[i] && root.getElementsByTagName("on_sale_datetime")[i].firstChild) {
                    onsaledatetime.push(root.getElementsByTagName("on_sale_datetime")[i].childNodes[0].nodeValue);
                }
                else {
                    onsaledatetime.push("N/A");
                }
                if (root.getElementsByTagName("artists")[i] && root.getElementsByTagName("artists")[i].firstChild) {
                    artisturl.push(root.getElementsByTagName("artists")[i].firstChild.firstChild.nextSibling.childNodes[0].nodeValue);
                }
                else {
                    artisturl = "N/A";
                }
                if (root.getElementsByTagName("venue")[i] && root.getElementsByTagName("venue")[i].firstChild) {
                    venueurl.push(root.getElementsByTagName("venue")[i].firstChild.nextSibling.childNodes[0].nodeValue);
                }
                else {
                    venueurl.push("N/A");
                }
                if (root.getElementsByTagName("venue")[i] && root.getElementsByTagName("venue")[i].firstChild) {
                    venueid.push(root.getElementsByTagName("venue")[i].firstChild.childNodes[0].nodeValue);
                }
                else {
                    venueid.push("N/A");
                }
            }
        }
        catch (err) {
            fb.trace("get_events: " + err);
        }
    }
    get_distance();
    d4 = 0;
    for (i = 0; i < venuelatitude.length - 1; i++) {
        d4 = Math.round(d4 + calc_distance(venuelatitude[i], venuelongitude[i], venuelatitude[i + 1], venuelongitude[i + 1]));
    }
    if (!request1 && artistname.length > 0) {
        artist = artistname[set];
    }
    window.Repaint();
}

//global Variables for text field
var DT_TOP = 0x00000000;
var DT_LEFT = 0x00000000;
var DT_CENTER = 0x00000001;
var DT_RIGHT = 0x00000002;
var DT_VCENTER = 0x00000004;
var DT_BOTTOM = 0x00000008;
var DT_WORDBREAK = 0x00000010;
var DT_SINGLELINE = 0x00000020;
var DT_EXPANDTABS = 0x00000040;
var DT_TABSTOP = 0x00000080;
var DT_NOCLIP = 0x00000100;
var DT_EXTERNALLEADING = 0x00000200;
var DT_CALCRECT = 0x00000400;
var DT_NOPREFIX = 0x00000800;
var DT_INTERNAL = 0x00001000;
var DT_EDITCONTROL = 0x00002000;
var DT_PATH_ELLIPSIS = 0x00004000;
var DT_END_ELLIPSIS = 0x00008000;
var DT_MODIFYSTRING = 0x00010000;
var DT_RTLREADING = 0x00020000;
var DT_WORD_ELLIPSIS = 0x00040000;
var DT_NOFULLWIDTHCHARBREAK = 0x00080000;
var DT_HIDEPREFIX = 0x00100000;
var DT_PREFIXONLY = 0x00200000;

function on_paint(gr) {
    gr.FillSolidRect(0, 0, ww, wh, dui === 1 ? window.GetColorDUI(1) : window.GetColorCUI(3));
    if (!map && artistname.length > 0) {
        gr.GdiDrawText("Venue Name: " + venuename[set], g_font, color2, 0, 2 * vert, ww, wh, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
        gr.GdiDrawText("Venue City: " + venuecity[set], g_font, color2, 0, 3 * vert, ww, wh, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
        gr.GdiDrawText("Venue Region: " + venueregion[set], g_font, color2, 0, 4 * vert, ww, wh, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
        gr.GdiDrawText("Venue Country: " + venuecountry[set], g_font, color2, 0, 5 * vert, ww, wh, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
        gr.GdiDrawText("Venue Latitude: " + venuelatitude[set], g_font, color2, 0, 6 * vert, ww, wh, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
        gr.GdiDrawText("Venue Longitude: " + venuelongitude[set], g_font, color2, 0, 7 * vert, ww, wh, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
        gr.GdiDrawText("Ticket Status: " + ticketstatus[set], g_font, color2, 0, 8 * vert, ww, wh, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
        gr.GdiDrawText("On Sale Date Time: " + onsaledatetime[set], g_font, color2, 0, 9 * vert, ww, wh, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
        gr.GdiDrawText("Artist URL: " + artisturl[set], g_font, color2, 0, 10 * vert, ww, wh, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
        gr.GdiDrawText("Venue URL: " + venueurl[set], g_font, color2, 0, 11 * vert, ww, wh, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
        gr.GdiDrawText("Event Date: " + datetime[set], g_font, color2, 0, 12 * vert, ww, wh, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
        if (venuelongitude.length > 0 && venuelatitude.length > 0) {
            gr.GdiDrawText("Distance Home (km): " + d2, g_font, color2, 0, 13 * vert, ww, wh, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
            gr.GdiDrawText("Distance Stage/Tour (km): " + d3 + "/" + d4, g_font, color2, 0, 14 * vert, ww, wh, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
        }
    }
    if (map) {
        if (g_img) {
            scale = 0;
            xp = 0;
            yp = 0;
            var scale_w = ww / g_img.Width;
            var scale_h = wh / g_img.Height;

            if (scale_w <= scale_h) {
                scale = scale_w;
                yp = (wh - g_img.Height * scale) / 2;
            } else {
                scale = scale_h;
                xp = (ww - g_img.Width * scale) / 2;
            }
            gr.DrawImage(g_img, xp, yp, g_img.Width * scale, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height);
            if (mlongitude > -longborder && mlongitude < longborder && mlatitude > -latborder && mlatitude < latborder) {
                gr.GdiDrawText("Latitude: " + mlatitude, g_font, color, 0, 0, ww, wh, DT_BOTTOM | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
                gr.GdiDrawText("Longitude: " + mlongitude, g_font, color, 0, -15, ww, wh, DT_BOTTOM | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
                gr.GdiDrawText("Distance (km): " + d1, g_font, color, 0, -30, ww, wh, DT_BOTTOM | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
            }
            if (artistname.length > 0) {
                gr.GdiDrawText(venuename[set], g_font, color, ww/2, -15, ww/2, wh, DT_BOTTOM | DT_RIGHT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
            }
            var homelongitude2 = xp + (g_img.Width * scale * (longborder + (homelongitude)) / (2 * longborder));
            var homelatitude2 = yp + (g_img.Height * scale * (latborder - (homelatitude)) / (2 * latborder));
            gr.FillSolidRect(homelongitude2 - 2, homelatitude2 - 2, 5, 5, color2);
            //gr.FillSolidRect(homelongitude2 - 1, homelatitude2 - 1, 3, 3, color);
            if (venuecity.length > 0) {
                gr.GdiDrawText(venuecity[set] + ", " + venueregion[set] + ", " + venuecountry[set], g_font, color, ww/2, 0, ww/2, wh, DT_BOTTOM | DT_RIGHT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
            }
            if (venuelongitude.length > 0 && venuelatitude.length > 0) {
                gr.GdiDrawText("H:"+ d2 + "/S:" + d3 + "/T:" + d4 + "km, " + datetime[set], g_font, color, 0, -30, ww, wh, DT_BOTTOM | DT_RIGHT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
            }
            if (venuelatitude.length > 0 && venuelongitude.length > 0 && line) {
                for (j = 0; j < root.getElementsByTagName("latitude").length - 1; j++) {
                    var xb = xp + (g_img.Width * scale * (longborder + (parseFloat(venuelongitude[j]))) / (2 * longborder));
                    var yb = yp + (g_img.Height * scale * (latborder - (parseFloat(venuelatitude[j]))) / (2 * latborder));
                    var xc = xp + (g_img.Width * scale * (longborder + (parseFloat(venuelongitude[j + 1]))) / (2 * longborder));
                    var yc = yp + (g_img.Height * scale * (latborder - (parseFloat(venuelatitude[j + 1]))) / (2 * latborder));
                    gr.DrawLine(xb, yb, xc, yc, 1, color);
                }
            }
            if (venuelatitude.length > 0 && venuelongitude.length > 0 && square) {
                for (j = 0; j < venuelatitude.length; j++) {
                    var xd = xp + (g_img.Width * scale * (longborder + (parseFloat(venuelongitude[j]))) / (2 * longborder));
                    var yd = yp + (g_img.Height * scale * (latborder - (parseFloat(venuelatitude[j]))) / (2 * latborder));
                    gr.FillSolidRect(xd - 1, yd - 1, 3, 3, color);
                }
            }
            if (venuelongitude[set] && venuelatitude[set] && !line) {
                var xa = xp + (g_img.Width * scale * (longborder + (parseFloat(venuelongitude[set]))) / (2 * longborder));
                var ya = yp + (g_img.Height * scale * (latborder - (parseFloat(venuelatitude[set]))) / (2 * latborder));
                gr.FillSolidRect(xa - 3, ya - 3, 7, 7, color);
                gr.FillSolidRect(xa - 1, ya - 1, 3, 3, color2);
            }
        }
    }
    gr.GdiDrawText("FooTour (BandsInTown)", g_font, color, 0, 0, ww, wh, DT_TOP | DT_RIGHT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    gr.GdiDrawText("Artist: " + artist, g_font, color, 0, 0, ww - g_img2.Width - 10, wh, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    if (venuecity.length > 0) {
        gr.GdiDrawText("Set: " + (set + 1) + "/" + venuecity.length + " (lbtn/wheel)", g_font, color, 0, vert, ww, wh, DT_TOP | DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS);
    }
    gr.DrawImage(g_img2, ww - g_img2.Width, 0, g_img2.Width, g_img2.Height, 0, 0, g_img2.Width, g_img2.Height);
}

function clear_arrays() {
    artistname.splice(0, artistname.length);
    venuecity.splice(0, venuecity.length);
    venueregion.splice(0, venueregion.length);
    venuecountry.splice(0, venuecountry.length);
    venuename.splice(0, venuename.length);
    venuelatitude.splice(0, venuelatitude.length);
    venuelongitude.splice(0, venuelongitude.length);
    ticketstatus.splice(0, ticketstatus.length);
    datetime.splice(0, datetime.length);
    onsaledatetime.splice(0, onsaledatetime.length);
    artisturl.splice(0, artisturl.length);
    venueurl.splice(0, venueurl.length);
    venueid.splice(0, venueid.length);
}

function get_request1() {
    if (artist.length > 1) {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        xmlhttp.open("GET", "http://api.bandsintown.com/artists/" + artist + "/events.xml?app_id=Foobar2000");
        xmlhttp.send();
        xmlhttp.onreadystatechange = function () {
            if (xmlhttp.readyState === 4) {
                get_events();
                set = 0;
                //fb.trace(xmlhttp.responsetext);
            }
        };
    }
    else {
        fb.trace("No Artist");
    }
}

function get_request2() {
    if (artist.length > 1) {
        xmlhttp2 = new ActiveXObject("Microsoft.XMLHTTP");
        xmlhttp2.open("GET", "http://api.bandsintown.com/events/recommended?artists[]=" + artist + "&location=" + homelocation + "&radius=" + radius + "&format=xml&app_id=Foobar2000");
        xmlhttp2.send();
        xmlhttp2.onreadystatechange = function () {
            if (xmlhttp2.readyState === 4) {
                get_events();
                set = 0;
                //fb.trace(xmlhttp2.responsetext);
            }
        };
    }
    else {
        fb.trace("No Artist");
    }
}

function get_request3() {
    xmlhttp3 = new ActiveXObject("Microsoft.XMLHTTP");
    xmlhttp3.open("GET", "http://api.bandsintown.com/events/search?location=" + homelocation + "&radius=" + radius + "&format=xml&app_id=Foobar2000");
    xmlhttp3.send();
    xmlhttp3.onreadystatechange = function () {
        if (xmlhttp3.readyState === 4) {
            get_events();
            set = 0;
            //fb.trace(xmlhttp3.responsetext);
        }
    };
}

function get_request4() {
    xmlhttp4 = new ActiveXObject("Microsoft.XMLHTTP");
    xmlhttp4.open("GET", "http://api.bandsintown.com/events/on_sale_soon.xml?location=" + homelocation + "&radius=" + radius + "&app_id=Foobar2000");
    xmlhttp4.send();
    xmlhttp4.onreadystatechange = function () {
        if (xmlhttp4.readyState === 4) {
            get_events();
            set = 0;
            //fb.trace(xmlhttp4.responsetext);
        }
    };
}

function get_request5() {
    if (artist.length > 1) {
        xmlhttp5 = new ActiveXObject("Microsoft.XMLHTTP");
        xmlhttp5.open("GET", "http://api.bandsintown.com/events/search?artists[]=" + artist + "&location=" + homelocation + "&radius=" + radius + "&format=xml&app_id=Foobar2000");
        xmlhttp5.send();
        xmlhttp5.onreadystatechange = function () {
            if (xmlhttp5.readyState === 4) {
                get_events();
                set = 0;
                //fb.trace(xmlhttp5.responsetext);
            }
        };
    }
}

function get_request6() {
    if (venueidv.length > 1) {
        xmlhttp6 = new ActiveXObject("Microsoft.XMLHTTP");
        xmlhttp6.open("GET", "http://api.bandsintown.com/venues/" + venueidv + "/events.xml?app_id=Foobar2000");
        xmlhttp6.send();
        xmlhttp6.onreadystatechange = function () {
            if (xmlhttp6.readyState === 4) {
                get_events();
                set = 0;
                //fb.trace(xmlhttp6.responsetext);
            }
        };
    }
}

function on_playback_new_track() {
    get_tags();
    if (artistold !== artist && auto) {
        artistold = artist;
        request1 = true;
        request2 = false;
        request3 = false;
        request4 = false;
        request5 = false;
        request6 = false;
        map = true;
        clear_arrays();
        set = 0;
        get_request1();       
    }
    window.Repaint();
}

function on_mouse_lbtn_down(x, y) {
    if (venuecity.length > 0) {
        set++;
        if (set >= venuecity.length) {
            set = 0;
        }
    }
    artist = artistname[set];
    get_distance();   
    window.Repaint();
}

function on_mouse_leave() {
    mlatitude = 91;
    mlongitude = 181;
    window.Repaint();
}

function on_mouse_wheel(delta) {
    for (j = 0; j < delta; j++) {
        if (venuecity.length > 0) {
            set++;
            if (set >= venuecity.length) {
                set = venuecity.length - 1;
            }
        }
        artist = artistname[set];
        get_distance();
        window.Repaint();
    }
    for (j = 0; j < -delta; j++) {
        if (venuecity.length > 1) {
            set--;
            if (set <= 0) {
                set = 0;
            }
        }
        artist = artistname[set];
        get_distance();
        window.Repaint();
    }
}

function on_mouse_move(x, y) {
    if (map) {
        mx = x - xp;
        my = y - yp;
        mlongitude = (mx / (g_img.Width * scale) * (2 * longborder)) - longborder;
        mlatitude = (latborder - (my / (g_img.Height * scale) * (2 * latborder)));
        d1 = calc_distance(mlatitude, mlongitude, homelatitude, homelongitude);
    }
    window.SetCursor(32649);
    window.Repaint();
}

function on_mouse_rbtn_up(x, y) {
    var MF_SEPARATOR = 0x00000800;
    var MF_STRING = 0x00000000;
    var _menu = window.CreatePopupMenu();
    var idx;
    _menu.AppendMenuItem(MF_STRING, 15, "Auto");
    if (!auto) {
        _menu.CheckMenuItem(15, false);
    } else {
        _menu.CheckMenuItem(15, true);
    }
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_STRING, 1, "Artist Global (Internet)");
    _menu.AppendMenuItem(MF_STRING, 16, "Back (Internet)");
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_STRING, 13, "Artist Local (Internet)");
    _menu.AppendMenuItem(MF_STRING, 14, "Venue (Internet)");
    _menu.AppendMenuItem(MF_STRING, 10, "Recommended Artists Local (Internet)");
    _menu.AppendMenuItem(MF_STRING, 11, "All Artists Local (Internet)");
    _menu.AppendMenuItem(MF_STRING, 12, "On Sale Soon Local (Internet)");
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_STRING, 2, "Artist On Tour (Browser/Internet)");
    _menu.AppendMenuItem(MF_STRING, 3, "Venue (Browser/Internet)");
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_STRING, 4, "Show Map");
    if (!map) {
        _menu.CheckMenuItem(4, false);
    } else {
        _menu.CheckMenuItem(4, true);
    }
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_STRING, 5, "Square (Event)");
    _menu.AppendMenuItem(MF_STRING, 6, "Square (Tour)");
    _menu.AppendMenuItem(MF_STRING, 7, "Line (Tour)");
    if (!square && !line && map) {
        _menu.CheckMenuRadioItem(5, 7, 5);
    }
    if (square && map) {
        _menu.CheckMenuRadioItem(5, 7, 6);
    } else if (line && map) {
        _menu.CheckMenuRadioItem(5, 7, 7);
    }
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_STRING, 8, "Properties");
    _menu.AppendMenuItem(MF_STRING, 9, "Configure...");

    idx = _menu.TrackPopupMenu(x, y);
    switch (idx) {
    case 1:
        if (artistold !== artist) {
            artistold = artist;
            request1 = true;
            request2 = false;
            request3 = false;
            request4 = false;
            request5 = false;
            request6 = false;
            map = true;
            clear_arrays();
            set = 0;
            get_request1();
        }
        break;
    case 2:
        if (venueurl.length > 1) {
            firefox = new ActiveXObject("Shell.Application");
            firefox.ShellExecute(browser, "" + artisturl[set] + "", "", "open", 1);
        }
        break;
    case 3:
        if (venueurl.length > 1) {
            firefox = new ActiveXObject("Shell.Application");
            firefox.ShellExecute(browser, "" + venueurl[set] + "", "", "open", 1);
        }
        break;
    case 4:
        if (!map) {
            map = true;
        } else {
            map = false;
        }
        break;
    case 5:
        square = false;
        line = false;
        break;
    case 6:
        square = true;
        line = false;
        break;
    case 7:
        line = true;
        square = false;
        break;
    case 8:
        window.ShowProperties();
        break;
    case 9:
        window.ShowConfigure();
        break;
    case 10:
        artistold = "";
        request1 = false;
        request2 = true;
        request3 = false;
        request4 = false;
        request5 = false;
        request6 = false;
        map = false;
        set = 0;
        clear_arrays();
        get_request2();
        break;
    case 11:
        artistold = "";
        request1 = false;
        request2 = false;
        request3 = true;
        request4 = false;
        request5 = false;
        request6 = false;
        map = false;
        set = 0;
        clear_arrays();
        get_request3();
        break;
    case 12:
        artistold = "";
        request1 = false;
        request2 = false;
        request3 = false;
        request4 = true;
        request5 = false;
        request6 = false;
        map = false;
        set = 0;
        clear_arrays();
        get_request4();
        break;
    case 13:
        artistold = "";
        request1 = false;
        request2 = false;
        request3 = false;
        request4 = false;
        request5 = true;
        request6 = false;
        map = false;
        set = 0;
        clear_arrays();
        get_request5();
        break;
    case 14:
        artistold = "";
        request1 = false;
        request2 = false;
        request3 = false;
        request4 = false;
        request5 = false;
        request6 = true;
        map = false;
        if (venueid.length > 0) {
            venueidv = venueid[set];
            set = 0;
            clear_arrays();
            get_request6();
        }
        break;
    case 15:
        if (!auto) {
            auto = true;
        }
        else {
            auto = false;
        }
        break;
    case 16:
        artist = artistplaying;
        if (artistold !== artist) {
            artistold = artist;
            request1 = true;
            request2 = false;
            request3 = false;
            request4 = false;
            request5 = false;
            request6 = false;
            map = true;
            clear_arrays();
            set = 0;
            get_request1();
        }
    }
    _menu.Dispose();
    window.Repaint();
    return true;
}

function on_size() {
    ww = window.Width;
    wh = window.Height;
}

function on_colors_changed() {
    window.Repaint();
}

function on_font_changed() {
    window.Repaint();
}