window.DefineScript('Get Covers (Artwork) radio logos', {author:'kgena_ua', version: '10052021'}); function RGBA(r, g, b, a){ return ((a << 24) | (r << 16) | (g << 8) | (b)); } function RGB(r, g, b){ return (0xff000000 | (r << 16) | (g << 8) | (b)); } function getRed(color){ return ((color >> 16) & 0xff); } function getGreen(color){ return ((color >> 8) & 0xff); } function getBlue(color){ return (color & 0xff); } String.prototype.repeat = function(n) { return new Array(n + 1).join(this); } window.SetProperty("- user " + "-".repeat(80), ""); if (window.GetProperty("- user " + "-".repeat(80)) != "" ) window.SetProperty("- user " + "-".repeat(80), ""); window.SetProperty("_ system " + "_".repeat(50), ""); if (window.GetProperty("_ system " + "_".repeat(50)) != "" ) window.SetProperty("_ system " + "_".repeat(50), ""); var font_name_1 = window.GetProperty(":font name: text 1", "Arial"); var font_size_1 = window.GetProperty(":font size: text 1", 11); var font_style_1 = window.GetProperty(":font style: text 1", 1); var font_name_2 = window.GetProperty(":font name: text 2", "Arial"); var font_size_2 = window.GetProperty(":font size: text 2", 11); var font_style_2 = window.GetProperty(":font style: text 2", 0); var font_name_3 = window.GetProperty(":font name: text 3", "Arial"); var font_size_3 = window.GetProperty(":font size: text 3", 11); var font_style_3 = window.GetProperty(":font style: text 3", 0); var font_1 = gdi.Font(font_name_1, font_size_1, font_style_1); var font_2 = gdi.Font(font_name_2, font_size_2, font_style_2); var font_3 = gdi.Font(font_name_3, font_size_3, font_style_3); var ww = 600, wh = 600; DT_LEFT = 0x00000000; DT_RIGHT = 0x00000002; DT_CENTER = 0x00000001; DT_VCENTER = 0x00000004; DT_SINGLELINE = 0x00000020; DT_WORD_ELLIPSIS = 0x00040000; DT_NOPREFIX = 0x00000800; MF_ENABLED = 0x00000000; MF_GRAYED = 0x00000001; MF_SEPARATOR = 0x00000800; IDC_HAND = 32649; IDC_ARROW = 32512; IDC_SIZEWE = 32644; IDC_SIZENS = 32645; VK_SHIFT = 0x10; VK_UP = 0x26; VK_DOWN = 0x28; VK_DELETE = 0x2E; ColorTypeCUI = { text: 0, selection_text: 1, inactive_selection_text: 2, background: 3, selection_background: 4, inactive_selection_background: 5, active_item_frame: 6 } ColorTypeDUI = { text: 0, background: 1, highlight: 2, selection: 3 } function get_color(){ if (window.InstanceType == 0){ bgcolor = window.GetColourCUI(ColorTypeCUI.background); a_color = window.GetColourCUI(ColorTypeCUI.text); b_color = window.GetColourCUI(ColorTypeCUI.inactive_selection_text); brcolor = window.GetColourCUI(ColorTypeCUI.inactive_selection_text); } else if (window.InstanceType == 1) { bgcolor = window.GetColourDUI(ColorTypeDUI.background); a_color = window.GetColourDUI(ColorTypeDUI.text); b_color = window.GetColourDUI(ColorTypeDUI.highlight); brcolor = window.GetColourDUI(ColorTypeDUI.highlight); } window.Repaint(); } var custom_colors = window.GetProperty(":colors: custom", false); var c_bgcolor = customColor(window.GetProperty(":color: background", "0-0-0")); var c_b_color = customColor(window.GetProperty(":color: text 1", "255-255-255")); var c_a_color = customColor(window.GetProperty(":color: text 2", "180-180-180")); var c_brcolor = customColor(window.GetProperty(":color: border", "150-150-150")); get_color(); ini_color(); function on_colors_changed(){ get_color(); ini_color(); } function ini_color(){ bgcolor = custom_colors ? c_bgcolor : bgcolor; a_color = custom_colors ? c_a_color : a_color; b_color = custom_colors ? c_b_color : b_color; brcolor = custom_colors ? c_brcolor : brcolor; } function customColor(colour){ tempc = colour.split("-"); return (0xff000000 | (tempc[0]<<16) | (tempc[1]<<8) | (tempc[2])); } var text_bg_transparence = window.GetProperty(":text: bg transparence (0-255)", 150); var txt_shadow = window.GetProperty(":text: shadow", false); try { var fso = new ActiveXObject("Scripting.FileSystemObject"); var WshShell = new ActiveXObject("WScript.Shell"); var htmlfile = new ActiveXObject('htmlfile'); var doc = new ActiveXObject("htmlfile"); } catch(e) { fb.ShowPopupMessage(" Failed to load required system components.\n\n Please check \"Safe mode\" has been turned off.\n File>Preferences>Tools>WSH Panel Mod"); } var clipboardData = ""; var root_folders = ["cover", "scan", "art", "img", "images", "pic"]; var path, album, artist, title, artist_stream, title_stream, genre_stream; var old_path, old_album, old_title;; var t_type, old_t_type; var g_img = null var img_size; var img_size_recount = true; var default_img_path = window.GetProperty(":default img path",".\\maybe\\textures\\nocover\\no_cover_loaded.png"); var default_img = window.GetProperty(":default img", false); try { var def_img = resize_image(gdi.Image(default_img_path)); } catch(e) {}; var img_border = window.GetProperty("img border", true); var img_border_width = window.GetProperty(":img border width", 4); if (!/\S/.test(img_border_width) || img_border_width <= 0) {img_border_width = 1; window.SetProperty(":img border width", img_border_width);} var external = []; var embedded = []; var covers = []; var covernumber = 0; var new_img_name = ""; var attached_p_name = ["front cover", "back cover", "disc", "icon", "artist"]; var embedded_p_name = []; var set_external = window.GetProperty("external", true); var set_embedded = window.GetProperty("embedded", true); var set_priority = window.GetProperty("set_priority", 0); var selection_mode = window.GetProperty("selection_mode", 0); var cycle = window.GetProperty("auto cycle (sec)", 0); if (cycle > 0) set_cycle_timer(); var info = window.GetProperty("info", false); var fader = 255; var fade_effect = window.GetProperty("fade effect", false); var img_alignment = ["adjust", "adjust top", "centre", "centre - top", "stretch"]; var img_alignment_idx = window.GetProperty("img alignment idx", 0); var img_margin = window.GetProperty(":img margin", 0); var show_text_1 = window.GetProperty("show info text 1", true); var show_text_2 = window.GetProperty("show info text 2", true); var show_text_3 = window.GetProperty("show info text 3", true); var complete_path = window.GetProperty("complete_path", false); var no_img_msg = ""; var t1_y = 0; var file_operation = false; var ftimer; var delay = false; var set_cycle = false; var cycle_timer, step = 0; var search_album_art = window.GetProperty(":search album art", true); var album_art_folder = window.GetProperty(":search album art : download folder", "no folder"); album_art_folder = clean(album_art_folder); window.SetProperty(":search album art : download folder", album_art_folder); if (!/\S/.test(album_art_folder)) {album_art_folder = "no folder"; window.SetProperty(":search album art : download folder", album_art_folder)}; var quality_idx = window.GetProperty("download quality", 1); var quality = [ [ "Low", "avatar170s"], [ "Medium", "500x500"], [ "High", "770x0"] ]; var old_logo_file_path; var logo_files = []; var logo_dir_name = window.GetProperty(":radio logo dir name", "radio Logos"); logo_dir_name = clean(logo_dir_name); window.SetProperty(":radio logo dir name", logo_dir_name); if (!/\S/.test(logo_dir_name)) {logo_dir_name = "radio Logos"; window.SetProperty(":radio logo dir name", logo_dir_name)}; var logo_dir_name_create = window.GetProperty(":radio logo dir name : auto create", false); if (logo_dir_name_create) { //var logo_path = fb.FoobarPath + clean(logo_dir_name) + "\\"; var logo_path = fb.ProfilePath + clean(logo_dir_name) + "\\"; check_folder(logo_path); } //logo_dir_name = "\\" + logo_dir_name + "\\"; get_logo_files_from_dir(); var move_img; var lb_downn = false; var dx = 0, dy = 0; var delta_x = 0, delta_y = 0; var mi_refresh = window.GetProperty(":menu item: Refresh", false); var panel_on = true; var metadb; on_item_focus_change(); function on_paint(gr) { !window.IsTransparent && gr.FillSolidRect(0, 0, ww, wh, bgcolor); draw_image(gr); switch (t_type) { case "file": draw_set_cycle(gr); draw_info(gr); break; case "stream": draw_info_stream(gr); break; } } function on_playlist_switch() { on_item_focus_change(); } function on_playback_new_track(metadb) { on_item_focus_change(); } function on_playback_dynamic_info_track() { on_item_focus_change(); } function on_playback_stop() { on_item_focus_change(); } function on_selection_changed() { on_item_focus_change(); } function on_item_focus_change() { switch (selection_mode) { case 0: metadb = fb.IsPlaying ? fb.GetNowPlaying() : fb.GetFocusItem(); break; case 1: metadb = fb.GetFocusItem(); break; } if (metadb) on_metadb_changed(); } function Eval1(field) { if (!metadb) return ""; var tfo = fb.TitleFormat("[" + field + "]"); return tfo.EvalWithMetadb(metadb); } function Eval2(field) { if (!metadb) return ""; var tfo = fb.TitleFormat("[" + field + "]"); return tfo.Eval(); } function on_metadb_changed() { if (!panel_on) return; if (metadb){ path = Eval1("$directory_path(%path%)"); album = Eval1("%album%"); artist = Eval1("%artist%"); title = Eval1("%title%"); title_stream = Eval2("%title%"); artist_stream = Eval2("%artist%"); genre_stream = Eval1("%genre%"); t_type = track_type(metadb.RawPath); if (old_t_type != t_type){ g_img = null; window.Repaint(); old_t_type = t_type; } switch (t_type) { case "file": if (title != old_title) { embedded_covers(); } if (path != old_path || album != old_album){ external_covers(); } if (path != old_path || album != old_album || title != old_title){ covernumber = 0; get_covers(); old_title = title; old_path = path; old_album = album; } old_logo_file_path = ""; break; case "stream": covernumber = 0; get_logo_image(); old_path = ""; old_album = ""; old_title = ""; break; } } } function external_covers() { get_external_covers(path); } function embedded_covers() { get_embedded_covers(); } function get_covers() { external = set_external ? external : []; embedded = set_embedded ? embedded : []; covers = []; if (set_priority == 0) { covers = covers.concat(external, embedded); } if (set_priority == 1) { covers = covers.concat(embedded, external); } dx = 0, dy = 0; if (new_img_name){ for (var i = 0; i < covers.length; i++) { if (typeof covers[i] != 'object'){ if (get_fnext(covers[i]) == new_img_name) { covernumber = i; new_img_name = ""; break; } } } } next_image(); } function get_embedded_covers() { embedded = []; embedded_p_name = []; //0 - front cover; 1 - back cover; 2 - disc; 3 - icon; 4 - artist; if ( metadb ) { for (var i = 0; i < 5; i++) { var temp = utils.GetAlbumArtEmbedded(metadb.RawPath, i); if (temp) embedded.push(temp); if (temp) embedded_p_name.push(attached_p_name[i]); } } } function get_external_covers(path) { var covers_dir = []; var covers_root = []; var covers_dir_subs = []; var covers_root_subs = []; var covers_external = []; external = []; try { dir = fso.GetFolder(path); get_covers_from_dir(covers_dir, dir); root = dir.ParentFolder; get_covers_from_dir(covers_root, root); var e = new Enumerator( dir.SubFolders ); for(; !e.atEnd(); e.moveNext() ) { get_covers_from_dir(covers_dir_subs, e.item() ); } var e = new Enumerator( root.SubFolders ); for(; !e.atEnd(); e.moveNext() ) { var name = e.item().Path; var sub_root_name = name.substr(name.lastIndexOf("\\") + 1, name.length); for (i in root_folders) { if (sub_root_name.toLowerCase().indexOf(root_folders[i].toLowerCase()) == 0) { get_covers_from_dir(covers_root_subs, e.item() ); } } } } catch(e) {}; covers_external = covers_external.concat(covers_dir, covers_dir_subs, covers_root, covers_root_subs); if (covers_external.length > 0) { for (i in covers_external) { var name = covers_external[i]; if ( name && get_fn(name).toLowerCase() == album.toLowerCase() ) { external.push(name); covers_external[i] = null; } } for (i in covers_external) { var name = covers_external[i]; if ( name && get_fn(name).toLowerCase() == artist.toLowerCase() ) { external.push(name); covers_external[i] = null; } } for (i in covers_external) { var name = covers_external[i]; try { if ( name && (get_fn(name).toLowerCase().match(artist.toLowerCase()) && get_fn(name).toLowerCase().match(album.toLowerCase())) ) { external.push(name); covers_external[i] = null; } } catch(e) {}; } for (i in covers_external) { var name = covers_external[i]; if ( name && get_fnext(name).match(/.*(cover|front|folder|album).*/i) ) { external.push(name); covers_external[i] = null; } } for (i in covers_external) { var name = covers_external[i]; if ( name && get_fnext(name).match(/.*back.*/i) ) { external.push(name); covers_external[i] = null; } } for (i in covers_external) { var name = covers_external[i]; if ( name && get_fnext(name).match(/.*cd.*/i) ) { external.push(name); covers_external[i] = null; } } for (i in covers_external) { if (typeof(covers_external[i]) == 'string' ) external.push(covers_external[i]); } } } function get_covers_from_dir(array, dir) { var e = new Enumerator( dir.Files ); while (!e.atEnd()) { var name = e.item().Name; if (name.match(/\.(jpg|jpeg|png|gif|bmp|tiff)$/i)) { array.push( e.item().Path ); } e.moveNext(); } } function next_image(){ var color_scheme_0 = []; if (g_img){ color_scheme_0 = JSON.parse(g_img.GetColourSchemeJSON(100)); } if (typeof covers[covernumber] == 'object') { g_img = resize_image(covers[covernumber]); } else { g_img = resize_image(gdi.Image(covers[covernumber])); } if (!g_img && default_img){ try { g_img = def_img; } catch(e) {}; } img_size_recount = false; var color_scheme_1 = []; var compare = true; if (g_img){ color_scheme_1 = JSON.parse(g_img.GetColourSchemeJSON(100)); for( var i = 0; i < Math.min(color_scheme_0.length, color_scheme_1.length); i++ ){ if (color_scheme_0[i].col != color_scheme_1[i].col){ compare = false; break; } } } if (!compare || color_scheme_1.length == 0){ fader = fade_effect ? 0 : 255; } else { fader = 255; } if (g_img && fade_effect) { fader_timer(); } window.Repaint(); } function resize_image(img){ if (!img || !ww || !wh) return; var scale_w = ww / img.Width; var scale_h = wh / img.Height; if (img_alignment_idx == 0 || img_alignment_idx == 1){ var scale = Math.min(scale_w, scale_h); } else { var scale = Math.max(scale_w, scale_h); } var iw = Math.round(img.Width * scale); var ih = Math.round(img.Height * scale) return img.Resize(iw, ih, 1); img && img.Dispose(); img = null; } function draw_image(gr){ if (g_img){ if (!img_size_recount){ img_size = calc_img_size(g_img); img_size_recount = true; } gr.DrawImage(g_img, img_size.x, img_size.y, img_size.w, img_size.h, img_size.cx, img_size.cy, img_size.cwidth, img_size.cheight, 0, fader); if (img_size.w || img_size.h){ img_border && gr.DrawRect( img_size.x - img_border_width /2, img_size.y - img_border_width /2, img_size.w + img_border_width, img_size.h + img_border_width, img_border_width, RGBA(getRed(brcolor), getGreen(brcolor), getBlue(brcolor), fader)); lw = 1; img_border && gr.DrawRect(img_size.x + lw / 2, img_size.y + lw / 2, img_size.w - lw, img_size.h - lw, lw, RGBA(getRed(bgcolor), getGreen(bgcolor), getBlue(bgcolor), fader - 200 <= 0 ? 0 : fader - 120)); } } if (!g_img){ if (t_type == "file"){ if (set_external && !set_embedded && external.length == 0) no_img_msg = "No external covers"; if (set_embedded && !set_external && embedded.length == 0) no_img_msg = "No embedded covers"; if (set_external && set_embedded && covers.length == 0) no_img_msg = "No covers"; } else { var logo_name = title.replace(/[^a-zA-Z0-9а-яА-Я\s-]/g, '').replace(/\s+/g, ' ').replace(/^\s+|\s+$/g, ''); no_img_msg = 'No logo image\n\nput into the "' + logo_dir_name + '" folder a image file with the name "' + logo_name + '.*"'; } var t_x = img_margin + 10; var t_w = Math.max(ww - t_x * 2, 0); var t = no_img_msg ? gr.EstimateLineWrap( no_img_msg, font_2, t_w).filter((e, i) => !(i % 2)).map(item => trim(item)) : []; var t_h = no_img_msg ? gr.CalcTextHeight("Abc", font_2) : 0; var t_y = wh / 2 - t.length * t_h / 2; for (var i = 0; i < t.length; i++) { t[i] && gr.GdiDrawText( t[i], font_2, a_color, t_x, t_y + t_h * i, t_w, wh, DT_CENTER | DT_NOPREFIX ); } } } function draw_set_cycle(gr){ if (set_cycle){ gr.FillSolidRect(0, 0, ww, wh, RGBA(getRed(bgcolor), getGreen(bgcolor), getBlue(bgcolor), text_bg_transparence)); var txt_cycle = cycle == 0 ? "off" : cycle + " sec"; gr.GdiDrawText("auto cycle: " + txt_cycle, font_2, b_color, 0, 20, ww, wh, DT_CENTER | DT_WORD_ELLIPSIS ); } } function draw_info(gr){ if (info && g_img){ if (covers[covernumber]) { if (typeof covers[covernumber] != 'object'){ if(fso.FileExists(covers[covernumber])){ if (!complete_path){ var cover_name = get_fnext(covers[covernumber]); } else { var cover_name = covers[covernumber].replace(/\\/g, "\\ "); } var cover_width = gdi.Image(covers[covernumber]).Width; var cover_height = gdi.Image(covers[covernumber]).Height; var cover_size = formatFileSize(fso.GetFile(covers[covernumber]).Size); var cover_dim = cover_width + " x " + cover_height + " " + cover_size; } } if (typeof covers[covernumber] == 'object'){ var cover_name = get_embedded_img_name(covernumber); var cover_width = covers[covernumber].Width; var cover_height = covers[covernumber].Height; var cover_dim = "embedded " + cover_width + " x " + cover_height; } var covers_number_1 = covers.length > 1 ? covernumber + 1 + " " : ""; var covers_number_2 = external.length > 0 && embedded.length > 0 ? "(" + covers.length + ") " : ""; var covers_number_3 = external.length > 0 ? "" + (embedded.length == 0 && external.length > 1 ? "(" + external.length + ")" : external.length) + " external " : ""; var covers_number_4 = embedded.length > 0 ? "" + (external.length == 0 && embedded.length > 1 ? "(" + embedded.length + ")" : embedded.length) + " embedded " : ""; var covers_number = covers_number_1 + covers_number_2 + (set_priority == 0 ? covers_number_3 + covers_number_4 : covers_number_4 + covers_number_3); draw_text(gr, cover_name, cover_dim, covers_number); } } } function draw_info_stream(gr){ if (info){ var text; if (selection_mode == 0){ text = (title_stream ? title_stream : "") + (artist_stream ? "\n" + artist_stream : ""); } draw_text(gr, text, title, genre_stream) } } function draw_text(gr, t1, t2, t3){ var t_x = img_margin + 10; var t_w = Math.max(ww - t_x * 2, 0); var t1_arr = t1 ? gr.EstimateLineWrap( t1, font_1, t_w).filter((e, i) => !(i % 2)).map(item => trim(item)) : []; var t2_arr = t2 ? gr.EstimateLineWrap( t2, font_2, t_w).filter((e, i) => !(i % 2)).map(item => trim(item)) : []; var t3_arr = t3 ? gr.EstimateLineWrap( t3, font_3, t_w).filter((e, i) => !(i % 2)).map(item => trim(item)) : []; var t_h_1 = show_text_1 ? gr.CalcTextHeight("Abc", font_1) : 0; var t_h_2 = show_text_2 ? gr.CalcTextHeight("Abc", font_2) : 0; var t_h_3 = show_text_3 ? gr.CalcTextHeight("Abc", font_3) : 0; var t3_y = wh - t_h_3 * t3_arr.length - 5 - img_margin; var t2_y = t3_y - t_h_2 * t2_arr.length; t1_y = t2_y - (t1 ? t_h_1 * t1_arr.length : 0); !set_cycle && gr.FillSolidRect( img_margin, t1_y - 5, ww - img_margin * 2, wh - t1_y + 5 - img_margin, RGBA(getRed(bgcolor), getGreen(bgcolor), getBlue(bgcolor), text_bg_transparence)); for (var i = 0; i < t1_arr.length; i++) { t1_arr[i] && show_text_1 && txt_shadow && gr.GdiDrawText( t1_arr[i], font_1, bgcolor, t_x + 1, t1_y + t_h_1 * i + 1, t_w, wh, DT_CENTER | DT_NOPREFIX ); t1_arr[i] && show_text_1 && gr.GdiDrawText( t1_arr[i], font_1, b_color, t_x, t1_y + t_h_1 * i, t_w, wh, DT_CENTER | DT_NOPREFIX ); } for (var i = 0; i < t2_arr.length; i++) { t2_arr[i] && show_text_2 && txt_shadow && gr.GdiDrawText( t2_arr[i], font_2, bgcolor, t_x + 1, t2_y + t_h_2 * i + 1, t_w, wh, DT_CENTER | DT_NOPREFIX ); t2_arr[i] && show_text_2 && gr.GdiDrawText( t2_arr[i], font_2, a_color, t_x, t2_y + t_h_2 * i, t_w, wh, DT_CENTER | DT_NOPREFIX ); } for (var i = 0; i < t3_arr.length; i++) { t3_arr[i] && show_text_3 && txt_shadow && gr.GdiDrawText( t3_arr[i], font_3, bgcolor, t_x + 1, t3_y + t_h_3 * i + 1 , t_w, wh, DT_CENTER | DT_NOPREFIX ); t3_arr[i] && show_text_3 && gr.GdiDrawText(t3_arr[i], font_3, a_color, t_x, t3_y + t_h_3 * i, t_w, wh, DT_CENTER | DT_NOPREFIX ); } } function get_embedded_img_name(n){ if (set_priority == 0) { idx = n - external.length; } if (set_priority == 1) { idx = n ; } return embedded_p_name[idx]; } function on_mouse_lbtn_down(x,y){ lb_downn = true; delta_x = x - dx; delta_y = y - dy; if (img_alignment_idx == 2) { window.SetCursor(IDC_HAND); } window.Repaint(); } function on_mouse_move(x, y) { if (lb_downn && img_alignment_idx == 2){ dx = x - delta_x; dy = y - delta_y; img_size_recount = false; window.Repaint(); } if (img_alignment_idx == 2) { if (lb_downn){ window.SetCursor(IDC_HAND); } else { if (move_img == "h"){ window.SetCursor(IDC_SIZEWE); } else { window.SetCursor(IDC_SIZENS); } } } else { window.SetCursor(IDC_HAND); } } function on_mouse_lbtn_up(x,y){ lb_downn = false; } function on_mouse_lbtn_dblclk (x,y){ if (typeof covers[covernumber] != 'object' ) { if (!fso.FileExists(covers[covernumber])) return; if (covers[covernumber]) WshShell.Run( '"' + covers[covernumber] + '"' ); } } function on_mouse_wheel(delta) { ShiftDown = utils.IsKeyPressed(0x10) ? true : false; if (!delay && !set_cycle && covers.length > 1 && t_type == "file"){ delay = true; fdelay(); dx = 0, dy = 0; if (delta < 0) {covernumber = covernumber <= 0 ? covers.length - 1 : covernumber = covernumber - 1}; if (delta > 0) {covernumber = covernumber >= covers.length - 1 ? 0 : covernumber = covernumber + 1}; next_image(); } if (set_cycle && ShiftDown) { if (delta < 0) {cycle = cycle <= 0 ? 0 : cycle - 5;}; if (delta > 0) {cycle = cycle >= 60 ? 60 : cycle + 5;}; window.SetProperty("auto cycle (sec)", cycle); } window.Repaint(); } function on_mouse_leave() { window.SetCursor(IDC_ARROW); } function fdelay(){ var delay_timer = window.SetTimeout(function() { delay = false; window.ClearTimeout(delay_timer); }, 200); } function on_key_down(vkey) { switch(vkey){ case VK_SHIFT: if (t_type == "file"){ set_cycle = true; window.Repaint(); } break; case VK_UP: if (!set_cycle) on_mouse_wheel(1); break; case VK_DOWN: if (!set_cycle) on_mouse_wheel(-1); break; case VK_DELETE: if (covers[covernumber] && typeof covers[covernumber] != 'object' && !set_cycle){ file_operation = true; delete_file(); } break; } } function on_key_up(vkey) { switch(vkey){ case VK_SHIFT: set_cycle = false; if (cycle > 0) set_cycle_timer(); if (cycle == 0) window.ClearInterval(cycle_timer); window.Repaint(); break; } } function set_cycle_timer(){     cycle_timer && window.ClearInterval(cycle_timer);     cycle_timer = window.SetInterval(function() { step = set_cycle || file_operation ? 0 : step + 1; if (cycle > 0 && step >= cycle && t_type == "file"){ if (covers.length > 1) { covernumber = covernumber >= covers.length - 1 ? 0 : covernumber = covernumber + 1; next_image(); } window.Repaint(); step = 0; } window.Repaint();     }, 1000 ); } function fader_timer(){     ftimer && window.ClearInterval(ftimer);     ftimer = window.SetInterval(function() { fader = fader * 2; window.Repaint(); fader = fader == 0 ? 1 : fader; if (fader >= 255) { fader = 255; window.ClearInterval(ftimer); }     }, 50 ); } function change_filename(){ if (!fso.FileExists(covers[covernumber])) return; var c_file_name = get_fn(covers[covernumber]); try { var prompt = "\nEnter new file name"; n_file_name = utils.InputBox(window.ID, prompt, "Foobar 2000", c_file_name, true); if (!/\S/.test(n_file_name)) change_filename(); if (n_file_name) { var path = get_dp(covers[covernumber]); var ext = get_fext(covers[covernumber]); try { fso.MoveFile( covers[covernumber], path + "\\" + clean(n_file_name) + "." + ext ); new_img_name = n_file_name + "." + ext; external_covers(); get_covers(); } catch(e) {} } } catch(e) {}; file_operation = false; } function delete_file(){ if(!fso.FileExists(covers[covernumber]))return; var source = covers[covernumber]; var button_type = is_read_write(source) ? 0x3 : 0x5; var icon_type = is_read_write(source) ? 0x20 : 0x10; var second_button_is_default = 0x100; var text = is_read_write(source) ? "Delete file:" : "File is read - only"; var btn = WshShell.Popup(text + "\n\n" + source, 0, "Foobar 2000", button_type + icon_type + second_button_is_default); switch (btn) { case 6: try{ fso.DeleteFile(source); covernumber = covernumber == covers.length - 1 ? 0 : covernumber; external_covers(); get_covers(); } catch(e) {} break; case 2: case 7: break; case 4: delete_file(); break; } file_operation = false; } function change_file_attributes(){ if(!fso.FileExists(covers[covernumber]))return; var source = covers[covernumber]; var txt = is_read_write(source) ? "file is \nREAD-WRITE" : "file is \nREAD-ONLY"; var button_type = 0x3; var icon_type = 0x40; var btn = WshShell.Popup(source + "\n\n" + txt + "\nchange file attributes ?", 0, "Foobar 2000", button_type + icon_type); switch (btn) { case 6: try{ var file = fso.GetFile(source); file.Attributes = is_read_write(source) ? 33 : 32; } catch(e) {} break; case 2: case 7: break; } file_operation = false; } function is_read_write(f){ if(fso.FileExists(f)) { var file = fso.GetFile(f); return file.Attributes == 32 ? true : false; } } function on_size(){ dx = 0, dy = 0; delta_x = 0, delta_y = 0; ww = window.Width; wh = window.Height; img_size_recount = false; } function calc_img_size(img){ if(!img) return; ww = window.Width; wh = window.Height; var size = {x:0, y:0, w:0, h:0, cx:0, cy:0, cwidth:0, cheight:0}; var margin = img_margin ? img_margin : 0; var border = img_border && img_border_width > 0 ? img_border_width : 0; var new_width = ww - border * 2 - margin * 2; var new_height = wh - border * 2 - margin * 2; switch(img_alignment_idx) { case 0: // adjust var sw = new_width / img.Width; var sh = new_height / img.Height; var s = Math.min(sw, sh); var x = border + margin; var y = border + margin; if (sw > sh) x = x + (new_width - img.Width * s) / 2; else if (sw < sh) y = y + (new_height - img.Height * s) / 2; var w = img.Width * s; var h = img.Height * s; var cx = 0; var cy = 0; var cwidth = img.Width; var cheight = img.Height; break; case 1: // adjust top - center var sw = new_width / img.Width; var sh = new_height / img.Height; var s = Math.min(sw, sh); var x = border + margin; if (sw > sh) x = x + (new_width - img.Width * s) / 2; var y = border + margin; var w = img.Width * s; var h = img.Height * s; var cx = 0; var cy = 0; var cwidth = img.Width; var cheight = img.Height; break; case 2: // centre (movable image) var sr = img.Width / img.Height; var dr = new_width / new_height; if (sr < dr) { var r = img.Width / new_width; var cheight = new_height * r; var cy = Math.round((img.Height - cheight) / 2); var wwh = Math.round(new_height + cy * 2); move_img = "v"; cy = cy - dy; cy = cy <= 0 ? 0 : cy; cy = (cy + new_height) >= wwh ? wwh - new_height : cy; var cwidth = img.Width; var cx = 0; } else { var r = img.Height / new_height; var cwidth = new_width * r; var cx = Math.round((img.Width - cwidth) / 2); var www = Math.round(new_width + cx * 2); move_img = "h"; cx = cx - dx; cx = cx <= 0 ? 0 : cx; cx = (cx + new_width) >= www ? www - new_width : cx; var cheight = img.Height; var cy = 0; } var x = border + margin; var y = border + margin; var w = new_width; var h = new_height; break; case 3: // centre - top var sr = img.Width / img.Height; var dr = new_width / new_height; if (sr < dr) { var r = img.Width / (new_width); var cheight = new_height * r; var cy = 0; var cwidth = img.Width; var cx = 0; } else { var r = img.Height / new_height; var cwidth = new_width * r; var cx = Math.round((img.Width - cwidth) / 2); var cheight = img.Height; var cy = 0; } var x = border + margin; var y = border + margin; var w = new_width; var h = new_height; break; case 4: // stretch var x = border + margin; var y = border + margin; var w = new_width; var h = new_height; var cx = 0; var cy = 0; var cwidth = img.Width; var cheight = img.Height; break; } size.x = Math.round(x); size.y = Math.round(y); size.w = Math.round(w <= 0 ? 0 : w); size.h = Math.round(h <= 0 ? 0 : h); size.cx = Math.round(cx); size.cy = Math.round(cy); size.cwidth = Math.round(cwidth); size.cheight = Math.round(cheight); return size; } function on_mouse_rbtn_up(x, y){ function EMI(n1, v1, n2, v2){ return n1 == v1 && n2 == v2 ? MF_GRAYED : MF_ENABLED; }     var _menu = window.CreatePopupMenu(); var _group_image = window.CreatePopupMenu(); var _group_image_align = window.CreatePopupMenu(); var _group_file_operations = window.CreatePopupMenu(); var _group_search = window.CreatePopupMenu(); var _group_search_quality = window.CreatePopupMenu(); if (t1_y == 0) t1_y = window.Height; if ((info && y < t1_y) || !info){ if (t_type == "file"){ MF_STRING = t_type == "file" ? MF_ENABLED : MF_GRAYED;     _menu.AppendMenuItem( MF_STRING, 10, "External covers"); _menu.CheckMenuItem( 10, set_external);     _menu.AppendMenuItem( MF_STRING, 11, "Embedded covers"); _menu.CheckMenuItem( 11, set_embedded); _menu.AppendMenuItem( MF_SEPARATOR, 0, 0);     _menu.AppendMenuItem( EMI(set_priority, 0), 20, "Priority external");     _menu.AppendMenuItem( EMI(set_priority, 1), 21, "Priority embedded"); _menu.CheckMenuRadioItem( 20, 21 , set_priority + 20); _menu.AppendMenuItem( MF_SEPARATOR, 0, 0); } _menu.AppendMenuItem( EMI(selection_mode, 0), 30, "Prefer now playing"); _menu.AppendMenuItem( EMI(selection_mode, 1), 31, "Follow selected track"); _menu.CheckMenuRadioItem( 30, 31 , selection_mode + 30); _menu.AppendMenuItem( MF_SEPARATOR, 0, 0); _group_image.AppendTo(_menu, MF_ENABLED, "Image"); _group_image.AppendMenuItem( MF_ENABLED, 40, "Info"); _group_image.CheckMenuItem( 40, info); _group_image.AppendMenuItem( MF_ENABLED, 50, "Fade effect"); _group_image.CheckMenuItem( 50, fade_effect); _group_image.AppendMenuItem( MF_ENABLED, 60, "Border"); _group_image.CheckMenuItem( 60, img_border); _group_image_align.AppendTo(_group_image, MF_ENABLED, "Align : " + img_alignment[img_alignment_idx]); _group_image_align.AppendMenuItem( EMI(img_alignment_idx, 0), 70, img_alignment[0]); _group_image_align.AppendMenuItem( EMI(img_alignment_idx, 1), 71, img_alignment[1]); _group_image_align.AppendMenuItem( EMI(img_alignment_idx, 2), 72, img_alignment[2] + " (movable image)"); _group_image_align.AppendMenuItem( EMI(img_alignment_idx, 3), 73, img_alignment[3]); _group_image_align.AppendMenuItem( EMI(img_alignment_idx, 4), 74, img_alignment[4]); _group_image_align.CheckMenuRadioItem( 70, 74, img_alignment_idx + 70); _menu.AppendMenuItem( MF_SEPARATOR, 0, 0); MF_STRING = covers[covernumber] && typeof covers[covernumber] != 'object' ? MF_ENABLED : MF_GRAYED; _menu.AppendMenuItem( MF_STRING, 80, "Open folder"); if (t_type == "file"){ _menu.AppendMenuItem( MF_SEPARATOR, 0, 0); MF_STRING = covers[covernumber] && typeof covers[covernumber] != 'object' && t_type == "file" ? MF_ENABLED : MF_GRAYED; _group_file_operations.AppendTo(_menu, MF_STRING, "File operations"); _group_file_operations.AppendMenuItem( MF_STRING, 90, "Rename file"); _group_file_operations.AppendMenuItem( MF_STRING, 100, "Delete file"); _group_file_operations.AppendMenuItem( MF_STRING, 110, "Change file attributes"); } /* if (t_type == "file" && search_album_art){ _menu.AppendMenuItem( MF_SEPARATOR, 0, 0); _group_search.AppendTo(_menu,MF_ENABLED, "Search album art"); _group_search.AppendMenuItem(MF_ENABLED, 120, "Search album art (LastFM)"); _group_search_quality.AppendTo(_group_search, MF_ENABLED, "Download quality : " + quality[quality_idx][0]); _group_search_quality.AppendMenuItem( EMI(quality_idx, 0), 130, quality[0][0]); _group_search_quality.AppendMenuItem( EMI(quality_idx, 1), 131, quality[1][0]); _group_search_quality.AppendMenuItem( EMI(quality_idx, 2), 132, quality[2][0]); _group_search_quality.CheckMenuRadioItem( 130, 132, quality_idx + 130); } */ if (t_type == "stream"){ _menu.AppendMenuItem( MF_SEPARATOR, 0, 0); _menu.AppendMenuItem( MF_ENABLED, 140, "Copy logo filename"); // to clipboard } if (mi_refresh){ _menu.AppendMenuItem( MF_SEPARATOR, 0, 0); _menu.AppendMenuItem( MF_ENABLED, 150, "Refresh"); } _menu.AppendMenuItem( MF_SEPARATOR, 0, 0); _menu.AppendMenuItem( MF_ENABLED, 210, "Properties"); _menu.AppendMenuItem( MF_ENABLED, 220, "Show Configure"); _menu.AppendMenuItem( MF_ENABLED, 230, "Edit Script"); } if (info && y >= t1_y){     _menu.AppendMenuItem( MF_ENABLED, 310, t_type == "file" ? "Сover name" : "Title / Artist"); _menu.CheckMenuItem( 310, show_text_1); if (t_type == "file") {     _menu.AppendMenuItem( MF_ENABLED, 320, "Complete path to file"); _menu.CheckMenuItem( 320, complete_path); }     _menu.AppendMenuItem( MF_ENABLED, 330, t_type == "file" ? "Сover dimmension" : "Radio"); _menu.CheckMenuItem( 330, show_text_2);     _menu.AppendMenuItem( MF_ENABLED, 340, t_type == "file" ? "Number of covers" : "Genre"); _menu.CheckMenuItem( 340, show_text_3); } if ((info && y < t1_y) || !info){ ret = _menu.TrackPopupMenu(x + 20, y - 50); } if (info && y >= t1_y){ ret = _menu.TrackPopupMenu(x + 20, y - 50); }     switch (ret) {     case 10: set_external = set_external == false ? true : set_embedded == false ? true : false; window.SetProperty("external", set_external); covernumber = 0; external_covers(); get_covers();         break;     case 11: set_embedded = set_embedded == false ? true : set_external == false ? true : false; window.SetProperty("embedded", set_embedded); covernumber = 0; embedded_covers(); get_covers();         break;     case 20:     case 21: set_priority = ret - 20; window.SetProperty("set_priority", set_priority); covernumber = 0; get_covers();         break; case 30: case 31: selection_mode = ret - 30; window.SetProperty("selection_mode", selection_mode); on_item_focus_change(); break; case 40: window.SetProperty("info", !info); info = window.GetProperty("info"); window.Repaint(); break; case 50: window.SetProperty("fade effect", !fade_effect); fade_effect = window.GetProperty("fade effect"); break; case 60: img_border = !img_border; window.SetProperty("img border", img_border); img_size_recount = false; def_img_size_recount = false; window.Repaint(); break; case 70: case 71: case 72: case 73: case 74: img_alignment_idx = ret - 70; window.SetProperty("img alignment idx", img_alignment_idx); dx = 0, dy = 0; next_image(); window.Repaint(); break; case 80: if (fso.FolderExists(get_dp(covers[covernumber]))) WshShell.Run( '"' + get_dp(covers[covernumber]) + '"' ); break; case 90: file_operation = true; change_filename(); break; case 100: file_operation = true; delete_file(); break; case 110: file_operation = true; change_file_attributes(); break;     case 120: get_lastFM_album_img(path, artist, album);         break;  case 130: case 131: case 132: quality_idx = ret - 130; window.SetProperty("download quality", quality_idx); refresh_data = true; on_metadb_changed(); break; case 140: htmlfile.parentWindow.clipboardData.setData("text", title.replace(/[^a-zA-Z0-9а-яА-Я\s-]/g, '').replace(/\s+/g, ' ').replace(/^\s+|\s+$/g, '')); break;     case 150: old_path = ""; old_album = ""; old_title = ""; old_logo_file_path = ""; old_t_type = ""; on_metadb_changed();         break;     case 210:         window.ShowProperties();         break;    case 220: window.ShowConfigureV2(); break; case 230: window.EditScript(); break;     case 310: show_text_1 = !show_text_1; show_text_1 = !show_text_1 && !show_text_2 && !show_text_3 ? true : show_text_1; window.SetProperty("show info text 1", show_text_1); window.Repaint();         break;     case 320: complete_path = !complete_path; window.SetProperty("complete_path", complete_path); window.Repaint(); break;     case 330: show_text_2 = !show_text_2; show_text_2 = !show_text_1 && !show_text_2 && !show_text_3 ? true : show_text_2; window.SetProperty("show info text 2", show_text_2); window.Repaint(); break;     case 340: show_text_3 = !show_text_3; show_text_3 = !show_text_1 && !show_text_2 && !show_text_3 ? true : show_text_3; window.SetProperty("show info text 3", show_text_3); window.Repaint();         break; }     return true;    }  function get_fnext(p) { if (!p) return; return p.replace(/.*\\/g, ''); } function get_fn(p) { if (!p) return; return p.replace(/.*\\|\.[^.]+$/g, '') } function get_fext(p) { if (!p) return; return p.replace(/.*\./g, ''); } function get_dp(p) { if (!p) return; return p.replace(/(.*)\\.*/g, '$1'); } function clear_n(p) { if (!p) return; return p.replace(/[^a-zA-Z0-9а-яА-Я]/g, ''); } function formatFileSize(b){ if (b > 1024 * 1024){ b = Math.round(b / 1024 / 1024 * 100) / 100 + " MB" } else if (b > 1024){ b = Math.round(b / 1024 * 100) / 100 + " KB" } else { b = b + " Bytes"; } return b; } function trim(n){ if (!n) return; return n.replace(/^\s+|\s+$/g, "") } function clean(n) { var tmp = n.replace(/\./g, "").replace(/\//g, "-").replace(/\:/g, "-").replace(/\*/g, "x").replace(/\?/g, "").replace(/\"/g, "''").replace(/\/g, "_").replace(/\|/g, "").replace(/\\/g, ""); return tmp.replace(/^\s+|\s+$/g, "").substr(0, 150); } function check_folder(n) { if (!n) return; try { if(!fso.FolderExists(n)) {fso.CreateFolder(n)}; } catch(e) {} } function get_logo_image() { if (!logo_files) return; logo_file_path = ""; for (var i = 0; i < logo_files.length; i++){ var file = get_fn(logo_files[i]).replace(/[^a-zA-Z0-9а-яА-Я]/g, ''); var tfname = title.replace(/[^a-zA-Z0-9а-яА-Я]/g,''); if (tfname.toLowerCase() == file.toLowerCase()) logo_file_path = logo_files[i]; } dx = 0, dy = 0; window.Repaint(); if (logo_file_path != old_logo_file_path){ covers = []; covers.push(logo_file_path); covernumber = 0; next_image(); old_logo_file_path = logo_file_path; } } function get_logo_files_from_dir() { if(!fso.FolderExists(logo_dir_name)) return; logo_files = []; var logo_files_dir = []; var logo_files_sub_dir = []; dir = fso.GetFolder(logo_dir_name); get_covers_from_dir(logo_files_dir, dir); var e = new Enumerator( dir.SubFolders ); for(; !e.atEnd(); e.moveNext() ) { get_covers_from_dir(logo_files_sub_dir, e.item() ); } logo_files = logo_files.concat(logo_files_dir, logo_files_sub_dir); } function track_type(p) { var type; if (p.indexOf("file") >= 0){ type = "file"; } else if (p.indexOf("cdda") >= 0){ type = "cdda"; } else if (p.indexOf('://') >= 0 || p.indexOf('www') >= 0 || p.indexOf("youtube") >= 0 || p.indexOf("video") >= 0 || p.indexOf("vimeo") >= 0){ type = "stream"; } else { type = ""; } return type; } function on_notify_data(name, info) { if (name == "panel") { if (info == "art"){ panel_on = true; old_album = ""; old_title = ""; on_metadb_changed(); } else { panel_on = false; } } }