WSH Panel mod - Scriptbeispiele (Seekbar, Rating, Album-Rating, Coverart & mehr)

Begonnen von TomPro, 16. Juni 2009, 19:24:54

Vorheriges Thema - Nächstes Thema

tedgo

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

Spirit_of_the_ocean

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.

tedgo

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

Spirit_of_the_ocean

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.

Andre69

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


Andre69

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 ?

grimes

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



Bubi

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?

grimes

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)


tedgo

@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.

qwert73

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


TomPro

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

TomPro

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.