// -------------------------------------------------------------------------------------- // WSHtpc01 // Description: a fullscreen now-playing script for foo_uie_wsh_panel // Author: ojdo // Version: 0.1 // --------------------------------------------------------------------------------------- // HELPER FUNCTIONS function StringFormat() { var h_align = 0, v_align = 0, trimming = 0, flags = 0; switch (arguments.length) { // fall-through case 4: flags = arguments[3]; case 3: trimming = arguments[2]; case 2: v_align = arguments[1]; case 1: h_align = arguments[0]; break; default: return 0; } return ((h_align << 28) | (v_align << 24) | (trimming << 20) | flags); } 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)); } // INITIALIZATION var g_albumart = null, g_albumart_rot = null; var g_font_title = gdi.Font("Calibri", 36, 0); var g_font_album = gdi.Font("Calibri", 28, 0); var g_font_artist = gdi.Font("Calibri", 22, 0); var g_font_small = gdi.Font("Calibri", 14, 0); var g_font_misc = gdi.Font("Calibri", 16, 0); var g_color_title = RGB(255,255,255); var g_color_misc = RGB(77,77,77); var g_stringformat = StringFormat(0, 0,4); var title, artist, album, rating, mood, tracknumber, discnumber, totaltracks, totaldiscs, infoline; var ww = 0, wh = 0; // Window width, height var g_handle = null; // metadb handle variable for watching the currently played track AlbumArtId = { front: 0, back: 1, disc: 2, icon: 3, artist: 4 }; // evoke callback function to initially paint the window on_playback_new_track(fb.GetNowPlaying()); // ----------------------------------------------------------------------- // DRAW CANVAS CONTENT function on_paint(gr) { gr.SetTextRenderingHint(5); // enable cleartype font rendering // Background gr.FillSolidRect(0, 0, ww, wh, RGB(0,0,0)); gr.FillGradRect(0, 0.7*wh, ww, Math.min(100,0.2*wh), 90,RGB(26,26,26), RGBA(77,77,77,0)); // Albumart: Calculations and reflection if(g_albumart) { var scale_w = 0.45*ww / g_albumart.Width; var scale_h = 0.9*(0.75*wh) / g_albumart.Height; var scale = Math.min(scale_w, scale_h); var img_w = g_albumart.Width * scale; var img_h = g_albumart.Height * scale; var pos_x = 0.45*ww-img_w; var pos_y = 0.75*wh-img_h; gr.DrawImage(g_albumart_rot, pos_x, pos_y+img_h, img_w, img_h, 0, 0, g_albumart.Width, g_albumart.Height); gr.FillGradRect(pos_x,pos_y+img_h,img_w,wh/6, 90, RGBA(0,0,0,128), RGB(0,0,0,255)); gr.FillSolidRect(pos_x,pos_y+img_h+wh/6,img_w,5*wh/6, RGBA(0,0,0,255)); } // Rating and Mood rating && gr.FillGradRect(0.49*ww, 0.7*wh-14, rating/5*ww/2.2, 1, 0, RGBA(128,64,0,64), RGBA(255,128,0,96)); mood && gr.FillGradRect(0.49*ww, 0.7*wh-7, mood/3*ww/2.2, 1, 0, RGBA(0,128,0,64), RGBA(0,255,0,96)); // Artist & Title title && gr.DrawString(title, g_font_title, g_color_title, 0.49*ww, 0.7*wh-125, 0.5*ww, 50, g_stringformat); album && gr.DrawString(album, g_font_album, g_color_title, 0.49*ww, 0.7*wh-125+43, 0.5*ww, 35, g_stringformat); artist && gr.DrawString(artist, g_font_artist, g_color_title, 0.49*ww, 0.7*wh-125+80, 0.5*ww, 30, g_stringformat); // Infoline infoline && gr.DrawString(infoline, g_font_misc, g_color_misc, 0.49*ww, 0.7*wh+5, ww/2.2, 70, g_stringformat); // Progress bar if (fb.PlaybackLength>0) { gr.FillGradRect(0,0.7*wh, fb.PlaybackTime/fb.PlaybackLength*ww, 1, 0, RGBA(255,255,255,64),RGBA(0,128,255,96)); } // Albumart if (g_albumart) { gr.DrawImage(g_albumart, pos_x, pos_y, img_w, img_h, 0, 0, g_albumart.Width, g_albumart.Height); } } // ----------------------------------------------------------------------- // CALLBACKS // ----------------------------------------------------------------------- // window size changed function on_size() { ww = window.Width; wh = window.Height; } // new track function on_playback_new_track(metadb) { if (metadb) { utils.GetAlbumArtAsync(window.ID, metadb, 0); } g_albumart = null; g_albumart_rot = null; if (g_handle) {window.UnwatchMetadb();} g_handle = fb.GetNowPlaying(); if (g_handle) { on_metadb_changed(); // calls on_metadb_changed() window.WatchMetadb(g_handle); } window.Repaint(); } // tag content changed function on_metadb_changed() { rating = fb.TitleFormat("%rating%").Eval(); if(rating == "?") rating=-1; mood = fb.TitleFormat("%mood%").Eval(); if(mood == "?") mood=-1; var old_infoline=infoline; title = fb.TitleFormat("%title%").Eval(); artist = fb.TitleFormat("%artist%").Eval(); album = fb.TitleFormat("$if2(%album%,)").Eval(); date = fb.TitleFormat("$if2(%date%,n/a)").Eval(); tracknumber = fb.TitleFormat("$if(%tracknumber%,$num(%tracknumber%,1))").Eval(); totaltracks = fb.TitleFormat("$if(%totaltracks%,$num(%totaltracks%,1))").Eval(); discnumber = fb.TitleFormat("[%discnumber%]").Eval(); totaldiscs = fb.TitleFormat("[%totaldiscs%]").Eval(); infoline = fb.TitleFormat( "[%genre%]"+ "[' '%style%]"+ "[' '%publisher%]"+ "$if(%tracknumber%,' '? $num(%tracknumber%,1)$if(%totaltracks%,/$replace($num(%totaltracks%,1),0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9)))"+ "$ifgreater(%totaldiscs%,1,' '? %discnumber%/$replace($num(%totaldiscs%,1),0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9),)"+ "$if(%date%,' 'Y$replace(%date%,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9))"+ "$if(%play_count%,' 'PC$replace(%play_count%,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9))"+ "$if(%first_played%,' : 'FP$replace($date(%first_played%),0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,-,.))"+ "$if(%last_played%,' ? 'LP$replace($date(%last_played%),0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,-,.))"+ "$if(%length%,' 'LEN$replace(%length%,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,:,.))" ).Eval(); window.RepaintRect(0.49*ww,0.7*wh-13,ww/2,10); // calls on_paint() if(old_infoline != infoline) { window.RepaintRect(0.49*ww, 0.7*wh+5, ww/2.2, 70); } } // time (each second) and on seeking function on_playback_time(time) { window.RepaintRect(0,0.7*wh,ww,2); } function on_playback_seek(time) { on_playback_time(time); } // playback order changed function on_playback_order_changed(new_order_index) { window.RepaintRect(0,wh-25, ww, 20); } // album art retrieved function on_get_album_art_done(metadb, art_id, image) { if(image) { g_albumart = image; g_albumart_rot = g_albumart.Clone(0, 0, g_albumart.Width, g_albumart.Height); g_albumart_rot.RotateFlip(6); window.Repaint(); // calls on_paint() } } // EOF