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

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

Vorheriges Thema - Nächstes Thema

Andre69

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



Andre69

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 ?

tedgo

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

grimes

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!


tedgo

Da fehlt on_mouse_lbtn_up(), um g_drag wieder auf "false" zu setzen ;)

Spirit_of_the_ocean

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.


Spirit_of_the_ocean

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.

grimes

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

tedgo

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

grimes

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!!!

grimes

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

Andre69

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

grimes

Schön! Hat allerdings den Nachteil, dass man am Skript rumfummeln muss, wenn ein neues Codec-Bild dazukommt.

tedgo

@grimes
Siehe mein Post oben...

Außerdem evaluierst du überflüssigerweise die Variable codec beim Start.

grimes

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