Скрипты для foo_uie_wsh_panel_mod

Список разделов foobar2000 Секреты foobar2000

Описание: Кнопочки, конфиги, секреты, советы.

Сообщение #1801 MC Web » 22.04.2017, 14:39

seriousstas
Это все хорошо, только я этой панелью, JScript Panel, не пользуюсь, как и скриптами для неё. Меня вполне устраивают скрипты для WSH Panel.

И большое спасибо kgena_ua, что он свои скрипты для WSH Panel пишет.

Политика "писателей" панели JScript Panel, мне не понятна.
Взяли за основу WSH Panel, кастрировали ее и добавили новых функций.
А для совместимости со старыми скриптами, без кастрации нельзя было обойтись?

А по поводу установки двух компонентов, может будет и лучше. Если сборка состоит из большого количества панелей на скриптах, то распределение нагрузки на разные компоненты, думаю, не повредит (тормозов будет меньше).
Поэтому я давно отказался и не собираюсь возвращаться к панелям на скриптах, работающих с большими массивами данных (плейлисты, библиотеки).
Скрипты для WSH Panel использую для других случаев / панелей и меня все устраивает в плане производительности и стабильности работы сборки.
MC Web
Репутация: 248
С нами: 10 лет 7 месяцев

Сообщение #1802 seriousstas » 22.04.2017, 14:49

MC Web:seriousstas
Это все хорошо, только я этой панелью, JScript Panel, не пользуюсь, как и скриптами для неё. Меня вполне устраивают скрипты для WSH Panel.

И большое спасибо kgena_ua, что он свои скрипты для WSH Panel пишет.

Политика "писателей" панели JScript Panel, мне не понятна.
Взяли за основу WSH Panel, кастрировали ее и добавили новых функций.
А для совместимости со старыми скриптами, без кастрации нельзя было обойтись?

А по поводу установки двух компонентов, может будет и лучше. Если сборка состоит из большого количества панелей на скриптах, то распределение нагрузки на разные компоненты, думаю, не повредит (тормозов будет меньше).
Поэтому я давно отказался и не собираюсь возвращаться к панелям на скриптах, работающих с большими массивами данных (плейлисты, библиотеки).
Скрипты для WSH Panel использую для других случаев / панелей и меня все устраивает в плане производительности и стабильности работы сборки.
Политика оч. проста - уменьшить кол-во операций и расширить функционал (про библиотеки , как у Вильба или Вьетнамца - ранее можно было только мечтать) .
Никто ничего не обрезал - нужно "приложить ручки" и немного переделать WSH скрипты по этим примерам :
foobar2000\user-components\foo_jscript_panel\docs\Interfaces.txt
Пользуюсь не пользуюсь - дело каждого - парень который спрашивал - использует , другие, а я люблю универсальность , что-б с каждым новым тестом не
вспоминать, что нужно доставить ..
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 1 месяц

Сообщение #1803 MC Web » 22.04.2017, 14:58

seriousstas:Политика оч. проста - уменьшить кол-во операций и расширить функционал .
Никто ничего не обрезал - нужно "приложить ручки" и немного переделать WSH скрипты
Уменьшать количество операций и не надо было делать, в чем Марк сам сознался, когда начал модифицировать первые версии WSH Panel. В результате чего пропала совместимость со старыми версиями скриптов, а потом для снятия не нужных вопросов эту панель переименовали в JScript Panel.
В общем все было сделано через одно место, поэтому и результат такой.
MC Web
Репутация: 248
С нами: 10 лет 7 месяцев

Сообщение #1804 seriousstas » 22.04.2017, 15:01

Марк давно от теории и экспериментов перешел к практике - иначе никто бы сегодня и не пытался кодировать под новую панель ..
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 1 месяц

Сообщение #1805 MC Web » 22.04.2017, 15:06

Я не умоляю достоинств Марка, но если бы не "испоганили" старую панель, а добавили нового функционала, то "новую панель" и продвигать не было бы нужды.
MC Web
Репутация: 248
С нами: 10 лет 7 месяцев

Сообщение #1806 AHAPXICT » 22.04.2017, 16:40

Дебаты :smile: ? Всех приветствую :beer:
AHAPXICT M
Аватара
Откуда: Киев
Репутация: 252
С нами: 10 лет 4 месяца

Сообщение #1807 seriousstas » 22.04.2017, 17:07

MC Web
Изменений накопилось на новую - она и появилась - все логично..
AHAPXICT
Привет , я тут по радио для себя "америку открыл" ,
а ранее каждый раз искал станцию в списке :oops: после поворота ключа в авто.
Над чаще в доп.настройки залазить ..
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 1 месяц

Сообщение #1808 seriousstas » 26.04.2017, 13:12

kgena_ua :hi:
По-поводу :
Get Covers (Artwork) && radio logos
Можно-ли сделать возможным поиск логотипов и в подпапках ?
Удобне было-бы удалять и добавлять (что-б не сваливать логотипы в кучу) , особенно для таких вариантов :
Онлайн-плейлисты
Логотип видно , если переименовать его в название композиции , что не есть гуд..

В любом случае я-бы предложил вариант через Display (из настроек Фубара) .
Например :
$if(%length%,,B:\Radio Logos\%title%.*) - под радио
и
B:\Logos\%album artist%.* - под онлайн треки
отлично работают и универсальны .. Те добавляем столько папок , сколько нужно и каких нужно и безпрепятственно их удалять при желании ..
Последний раз редактировалось seriousstas 26.04.2017, 15:49, всего редактировалось 1 раз.
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 1 месяц

Сообщение #1809 kgena_ua » 26.04.2017, 15:09

Get Covers (Artwork) && radio logos
version "25042017"


seriousstas:поиск логотипов и в подпапках
- добавлено;
- добавлены пункты меню: Manage attached pictures и Get album art (LastFM);
- добавлен перенос для длинных имен файлов (info).

Код: Выделить всё
// ==PREPROCESSOR==      
// @name "Get Covers (Artwork) && radio logos"   
// @author "kgena_ua"   
// @version "25042017"   
// @feature "v1.4"      
// @feature "watch-metadb"      
// ==/PREPROCESSOR==     

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:", "");
if (window.GetProperty(" - user:") != "" ) window.SetProperty(" - user:", "");

window.SetProperty("-".repeat(50), "");
if (window.GetProperty("-".repeat(50)) != "" ) window.SetProperty("-".repeat(50), "");

var font_name = window.GetProperty(" font name", "Arial");
var font_size = window.GetProperty(" font size", 12);
var font_style = window.GetProperty(" font style", 0);

var font = gdi.Font(font_name, font_size, font_style);

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;

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.GetColorCUI(ColorTypeCUI.background);
        a_color = window.GetColorCUI(ColorTypeCUI.text);
        b_color = window.GetColorCUI(ColorTypeCUI.inactive_selection_text);
    } else if (window.InstanceType == 1) {
        bgcolor = window.GetColorDUI(ColorTypeDUI.background);
        a_color = window.GetColorDUI(ColorTypeDUI.text);
        b_color = window.GetColorDUI(ColorTypeDUI.highlight);
    }
    window.Repaint();
}

get_color();

function on_colors_changed(){
    get_color();
}

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-220")); 
var c_a_color = customColor(window.GetProperty(" color: text 2", "180-180-180"));

bgcolor = custom_colors ? c_bgcolor : bgcolor;
a_color = custom_colors ? c_a_color : a_color;
b_color = custom_colors ? c_b_color : b_color;

function customColor(colour){
   tempc = colour.split("-");
   return (0xff000000 | (tempc[0]<<16) | (tempc[1]<<8) | (tempc[2]));
}

var transparent = window.GetProperty(" bg transparent (0-255)", 200);

var fso = new ActiveXObject("Scripting.FileSystemObject");
var WshShell = new ActiveXObject("WScript.Shell");
htmlfile = new ActiveXObject('htmlfile');
var clipboardData = "";

var path, album, artist;
var old_path, old_album;

var logo_file_name, old_logo_file_path, logo_path = [];
var path, title, itle_stream, artist_stream, genre;
var t_type, old_t_type;

var g_img = null
var cover_name;
var cover_size;
var cover_width;
var cover_height;
var cover_dim;
var nocover_path = window.GetProperty(" nocover image path",".\\maybe\\textures\\nocover\\no_cover_loaded.png");
var nocover = window.GetProperty(" nocover image", false);
var nocover_transparent = window.GetProperty(" nocover image transparent (0-255)", 100);

var covers_external = [];
var covers_dir = [];
var covers_root = [];
var covers_root_subs = [];
var covers_dir_subs = [];
var external = [];
var embedded = [];
var covers = [];
var images = [];
var covernumber = 0;

var attached_p_name = ["front cover", "back cover", "disc", "icon", "artist"];
var embedded_p_name = [];

var root_folders = ["cover", "scan", "art", "img", "images", "pic"];

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 fade_step = window.GetProperty("fade step", 25);
var align_mode_a = ["adjust", "adjust top", "centre", "centre - top", "stretch"];
var align_mode = window.GetProperty("align mode", 0);
var margin = window.GetProperty(" margin", 0);

var file_operation = false;
var attached_pic_edit = false;

var delay = false;
var set_cycle = false;
var cycle_timer, step = 0;
var dis_timer, dis = 0;

var mode_1 = window.GetProperty("mode 1", true);
var mode_2 = window.GetProperty("mode 2", false);

var logo_dir_name = window.GetProperty(" radio logo dir name",".\\radio Logos\\");
get_logo_files_from_dir();

var lb_downn = false;
var dx = 0, dy = 0;
var delta_x = 0, delta_y = 0;

function on_paint(gr) {
    !window.IsTransparent && gr.FillSolidRect(0, 0, ww, wh, bgcolor);

    draw_image(gr);   
   
    switch (t_type) {
    case "file":
        draw_set(gr);
        draw_info(gr);
        break;
    case "stream":
        draw_info_stream(gr);
        break;
    }

    //gr.FillSolidRect(0, 0, ww, 120, RGBA(getRed(bgcolor),getGreen(bgcolor),getBlue(bgcolor),180));
    gr.GdiDrawText( "", gdi.Font("Arial",12, 0), b_color, 10, 10, ww, wh, DT_LEFT | DT_WORD_ELLIPSIS );
}

var metadb;
on_item_focus_change();

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 on_metadb_changed() {
    if (metadb){
        path = fb.Titleformat("$directory_path(%path%)").EvalWithMetadb(metadb);
        album = fb.Titleformat("%album%").EvalWithMetadb(metadb);
        artist = fb.Titleformat("%artist%").EvalWithMetadb(metadb);
       
        title = fb.Titleformat("[%title%]").EvalWithMetadb(metadb);
        title_stream = fb.Titleformat("[%title%]").Eval();
        artist_stream = fb.Titleformat("[%artist%]").Eval();
        genre = fb.Titleformat("[%genre%]").EvalWithMetadb(metadb);
       
        t_type = track_type(metadb.RawPath);
       
        if (old_t_type != t_type){
            g_img = null;
            old_t_type = t_type;
        }

        switch (t_type) {
        case "file":
            if (path != old_path || album != old_album || attached_pic_edit){
                covernumber = 0;
                get_covers();
                old_path = path;
                old_album = album;
                old_logo_file_path = "";
            }
            break;
        case "stream":
            covernumber = 0;
            get_logo_image();
            old_path = "";
            old_album  = "";
            break;
        }
    }
   
    attached_pic_edit = false;
    window.Repaint();
}

function get_covers() {
    get_external_covers(path);
    get_embedded_covers();

    external = set_external ? external : [];
    embedded = set_embedded ? embedded : [];
   
    covers = [];
    images = [];
   
    if (set_priority == 0) {
        covers = covers.concat(external, embedded);
    }
    if (set_priority == 1) {
        covers = covers.concat(embedded, external);
    }

    if (mode_2){
        for (var i = 0; i < covers.length; i++) {
            if (typeof covers[i] == 'object' ) {
                images.push(resize_image(covers[i]));
            } else {
                images.push(resize_image(gdi.Image(covers[i])));
            }
        }
    }
    dx = 0, dy = 0;
    window.Repaint();
    next_image(0);
}

function get_embedded_covers() {      //0 - front cover, 1 - back cover, 2 - disc, 3 - icon, 4 - artist   
    embedded = [];
    embedded_p_name = [];
    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) {
    covers_dir = [];
    covers_root = [];
    covers_dir_subs = [];
    covers_root_subs = [];
    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() == root_folders[i].toLowerCase()) {
                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) {
        if (external.length == 0){
            for (i in covers_external) {
                var name = covers_external[i];

                if ( get_fn(name).toLowerCase() == album.toLowerCase() )   {
                    external.push(name);
                    covers_external[i] = null;
                }
            }
        }
       
        if (external.length == 0){
            for (i in covers_external) {
                var name = covers_external[i];

                if ( get_fn(name).toLowerCase() == artist.toLowerCase() )   {
                    external.push(name);
                    covers_external[i] = null;
                }
            }
        }
       
        if (external.length == 0){
            for (i in covers_external) {
                var name = covers_external[i];
                if (artist && album){
                    if ( clear_n(get_fn(name)).toLowerCase() == clear_n(artist).toLowerCase() + clear_n(album).toLowerCase() ) {
                        external.push(name);
                        covers_external[i] = null;
                    }
                }
            }
        }
       
        if (external.length == 0){
            for (i in covers_external) {
                var name = covers_external[i];
           
                if (get_fnext(name).match(/.*(cover|front|folder|album).*\.(jpg|jpeg|gif|png)$/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(d){
    fader = fade_effect ? 0 : 255;
    if (d < 0) {covernumber = covernumber <= 0 ? covers.length - 1 : covernumber = covernumber - 1};
    if (d > 0) {covernumber = covernumber >= covers.length - 1 ? 0 : covernumber = covernumber + 1};

    if (mode_1){
        if (typeof covers[covernumber] == 'object' ) {
            g_img = resize_image(covers[covernumber]);
        } else {
            g_img = resize_image(gdi.Image(covers[covernumber]));
        }
    }
   
    if (mode_2){
        g_img = images[covernumber];
    }
   
    if (g_img && fade_effect) fader_timer();
}


function resize_image_(img){
    if (!img) return;
    if (!ww || !wh) {
        ww = window.Width;   
        wh = window.Height;
    }
   
    var scale_w = ww / img.Width;
    var scale_h = wh / img.Height;
    var scale = Math.max(scale_w, scale_h);

    var nww = img.Width * scale;
    var nwh = img.Height * scale

    var temp_bmp = gdi.CreateImage(nww, nwh);
    var temp_gr = temp_bmp.GetGraphics();
    temp_gr.SetSmoothingMode(2);
    temp_gr.SetInterpolationMode(7);
    temp_gr.DrawImage(img, 0, 0, nww, nwh, 0, 0, img.width, img.height);
    temp_bmp.ReleaseGraphics(temp_gr);
   
    return temp_bmp;
    CollectGarbage();
    temp_bmp.Dispose();
    temp_gr = null;
    temp_bmp = null;
}


function resize_image(img){
    if (!img) return;
    if (!ww || !wh) {
        ww = window.Width;   
        wh = window.Height;
    }

    var scale_w = ww / img.Width;
    var scale_h = wh / img.Height;
    var scale = Math.max(scale_w, scale_h);

    var nww = Math.round(img.Width * scale);
    var nwh = Math.round(img.Height * scale)

    return img.Resize(nww, nwh, 2);
    img && img.Dispose();
}

function draw_image(gr){
    if (g_img){
        var size = calc_img_size(g_img);
        gr.DrawImage(g_img, size.x, size.y, size.width, size.height, size.cx, size.cy, size.cwidth, size.cheight, 0, covers.length > 0 ? fader : nocover_transparent);
    }
   
    if (!g_img && nocover){
        try {
            nc_img = gdi.Image(nocover_path);
            var size = calc_img_size(nc_img);
            gr.DrawImage(nc_img, size.x, size.y, size.width, size.height, size.cx, size.cy, size.cwidth, size.cheight, 0, nocover_transparent);
        } catch(e) {};
    }
   
    if (!g_img && !nocover){
        gr.GdiDrawText("no image", font, a_color, 0, 0, ww, wh, DT_SINGLELINE | DT_CENTER | DT_VCENTER | DT_WORD_ELLIPSIS );
    }
}

function draw_set(gr){
    if (set_cycle){
        gr.FillSolidRect(0, 0, ww, wh, RGBA(getRed(bgcolor),getGreen(bgcolor),getBlue(bgcolor),transparent));

        var txt_cycle = cycle == 0 ? "off" : cycle + " sec";
        gr.GdiDrawText("auto cycle:   " + txt_cycle, font, 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])){
                    cover_name = get_fnext(covers[covernumber]);
                    cover_width = gdi.Image(covers[covernumber]).width;
                    cover_height = gdi.Image(covers[covernumber]).Height;
                    cover_size = formatFileSize(fso.GetFile(covers[covernumber]).size);
                    cover_dim = cover_width + " x " + cover_height + "   " + cover_size;
                }
            }
           
            if (typeof covers[covernumber] == 'object'){
                cover_name = get_embedded_img_name(covernumber);
                cover_width = covers[covernumber].width;
                cover_height = covers[covernumber].Height;
                cover_dim = "embedded  " + cover_width + " x " + cover_height;
            }

            info_text = covernumber + 1 + " (" + covers.length + ")   " + external.length + " external   " + embedded.length + " embedded";

            var text_1 = cover_name;
            var text_2 = cover_dim;
            var text_3 = info_text;
       
            draw_text(gr, text_1, text_2, text_3)
        }
    }
}

function draw_info_stream(gr){
    if (info){
        var text_1 = title_stream + "\n" + artist_stream;
        var text_2 = title;
        var text_3 = genre;
       
        draw_text(gr, text_1, text_2, text_3)
    }
}

function draw_text(gr, t1, t2, t3){
    var t_x = margin;
    var t_w = Math.max(ww - t_x - margin , 0);
   
    var t1 = gr.EstimateLineWrap( t1, font, t_w).toArray();
   
    var t_h = t1 ? gr.CalcTextHeight("Abc", font) : 0; 

    var t3_y = wh - t_h - t_h / 3 - margin;
    var t2_y = t3_y - t_h;
    var t1_y = t2_y - t_h * (t1.length / 2 );

    !set_cycle && gr.FillSolidRect( t_x, t1_y - t_h / 3, t_w, wh - t1_y + t_h / 3 - margin, RGBA(getRed(bgcolor),getGreen(bgcolor),getBlue(bgcolor),transparent));   

    for (var i = 0; i < t1.length * 2; i += 2) {
        gr.GdiDrawText( t1[i], font, b_color, t_x, t1_y + t_h * i / 2 , t_w, wh, DT_CENTER | DT_NOPREFIX );
    }
           
    gr.GdiDrawText( t2, font, a_color, t_x, t2_y, t_w, wh, DT_CENTER | DT_WORD_ELLIPSIS );
    gr.GdiDrawText( t3, font, a_color, t_x, t3_y, t_w, wh, DT_CENTER | DT_WORD_ELLIPSIS ); 
}

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

function on_mouse_move(x, y) {
    if (lb_downn){
        dx = x - delta_x;
        dy = y - delta_y;
       
        window.Repaint();
    }
    window.SetCursor(32649);
}

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

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

function fdelay(){
    var delay_timer = window.SetTimeout(function() {
        delay = false;
        window.ClearTimeout(delay_timer);
    }, 200);
}

function on_key_down(vkey) {
    switch(vkey){
    case 0x10:  // VK_SHIFT
        if (t_type == "file"){
            set_cycle = true;
            dis_set();
            window.Repaint();   
        }
        break;
    case 0x26: // VK_UP   
        break;
    case 0x28: // VK_DOWN   
        break;
    case 0x2E: // VK_DELETE
        file_operation = true;   
        delete_file();   
        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) next_image(1);
            window.Repaint();
            step = 0;
        }
    window.Repaint();
    }, 1000 );
}

function dis_set(){
    dis = 0;
    dis_timer && window.ClearInterval(dis_timer);
    dis_timer = window.SetInterval(function() {
        if (set_cycle) {
            dis++;
            if(dis == 1) {
                set_cycle = false;
                if (cycle > 0) set_cycle_timer();
                if (cycle == 0) window.ClearInterval(cycle_timer);
                window.ClearInterval(dis_timer)
                window.Repaint();
            };
        }
    }, 1000 );
}

var ftimer;

function fader_timer(){
    ftimer && window.ClearInterval(ftimer);
    ftimer = window.SetInterval(function() {
        fader = fader == 0 ? 2 : fader;
        fader = fader * 2;
        //fader = fader + fade_step;
        if (fader >= 255) {
            fader= 255;
            window.ClearInterval(ftimer);
        }
        window.Repaint();
    }, 40 );
}

function change_filename(){
    if(!fso.FileExists(covers[covernumber]))return;
   
    var c_file_name = get_fn(covers[covernumber]);
   
    var nl = "\" + chr(10) + \"";
    var input_box_text = nl + "Enter new file name";
    var n_file_name = input_box(input_box_text, c_file_name, "Foobar 2000");
   
    if (n_file_name) {
        var dir = get_dp(covers[covernumber]);
        var ext = get_fext(covers[covernumber]);

        try {
            fso.MoveFile( covers[covernumber], dir + "\\" + n_file_name + "." + ext );
            get_covers();
           
            for (var i = 0; i < covers.length; i++) {
                if (get_fn(covers[i]) == n_file_name) {
                    covernumber = i;
                }
            }
        } 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 btn = WshShell.Popup("Delete file:\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;
            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 input_box(p_text, d_text, w_title){
    vbe = new ActiveXObject('ScriptControl');
    vbe.Language = 'VBScript';
    return vbe.eval( "InputBox(\"" + p_text + "\",\"" + w_title + "\",\"" + d_text + "\")");
}

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;
    if(g_img) next_image(covernumber);
}

function calc_img_size(img){
    var size = {x:0, y:0, width:0, height:0, cx:0, cy:0, cwidth:0, cheight:0};
   
    switch(align_mode) {   
   case 0: // adjust      
        var sw = ww / img.Width;
        var sh = wh / img.Height;
        var s = Math.min(sw, sh);
       
        var x = 0;
        var y = 0;
       
        if (sw > sh) x = (ww - img.Width * s) / 2;
        else if (sw < sh) y = (wh - img.height * s) / 2;

        var width = img.Width * s;
        var height = 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 = ww / img.Width;
        var sh = wh / img.Height;
        var s = Math.min(sw, sh);

        var x = 0;
        if (sw > sh) x = (ww - img.Width * s) / 2;
        var y = 0;
        var width = img.Width * s;
        var height = img.Height * s;
        var cx = 0;
        var cy = 0;
        var cwidth = img.Width;
        var cheight = img.Height;
      break;
       
   case 2: // centre   
      var sr = img.Width / img.Height;   
      var dr = ww / wh;   
      if (sr < dr) {   
         var r = img.Width / ww;
         var cheight = wh * r;
         var cy = Math.round((img.Height - cheight) / 2);
           
            if (mode_1){
                cy = cy - dy;
                cy = cy <= 0 ? 0 : cy;
                cy = cy + wh >= img.Width ? img.Width - wh : cy;
            }
           
         var cwidth = img.Width;
         var cx = 0;
      } else {   
         var r = img.Height / wh;
         var cwidth = ww * r;
         var cx = Math.round((img.Width - cwidth) / 2);
           
            if (mode_1){
                cx = cx - dx;
                cx = cx <= 0 ? 0 : cx;
                cx = cx + ww >= img.Width ? img.Width - ww : cx;
            }

         var cheight = img.Height;
         var cy = 0;
      }   
        var x = 0;         
        var y = 0;         
        var width = ww;         
        var height = wh;   
      break;   
       
   case 3: // centre - top      
      var sr = img.Width / img.Height;   
      var dr = ww / wh;   
      if (sr < dr) {   
         var r = img.Width / ww;
         var cheight = wh * r;
         var cy = 0;
         var cwidth = img.Width;
         var cx = 0;
      } else {   
         var r = img.Height / wh;
         var cwidth = ww * r;
         var cx = Math.round((img.Width - cwidth) / 2);
         var cheight = img.Height;
         var cy = 0;
      }
        var x = 0;
        var y = 0;
        var width = ww;
        var height = wh;
      break;   
       
   case 4: // stretch      
        var x = 0;
        var y = 0;
        var width = ww;
        var height = wh;
        var cx = 0;
        var cy = 0;
        var cwidth = img.Width;
        var cheight = img.Height;
      break;   
    }
   
    size.x = x + margin;
    size.y = y + margin;
    size.width = width - margin * 2;
    size.height = height - margin * 2;
    size.cx = cx;
    size.cy = cy;
    size.cwidth = cwidth;
    size.cheight = cheight;
   
    return size;
}

function on_mouse_rbtn_up (x, y){
    var _menu = window.CreatePopupMenu();

    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(MF_STRING, 20, "Priority external");   
    _menu.AppendMenuItem(MF_STRING, 21, "Priority embedded");   
    _menu.CheckMenuRadioItem(20, 21 , set_priority + 20);   
   _menu.EnableMenuItem(set_priority + 20, 1); 

    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);   
    _menu.AppendMenuItem(MF_ENABLED, 30, "Prefer now playing");   
    _menu.AppendMenuItem(MF_ENABLED, 31, "Follow selected track");   
    _menu.CheckMenuRadioItem(30, 31 , selection_mode + 30);   
   _menu.EnableMenuItem(selection_mode + 30, 1); 
       
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);   
    _menu.AppendMenuItem(MF_ENABLED, 40, "Info");   
    _menu.CheckMenuItem(40, info);   

    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);   
    _menu.AppendMenuItem(MF_ENABLED, 50, "Fade effect");
    _menu.CheckMenuItem(50, fade_effect);
   
    _firstgroup = window.CreatePopupMenu();
    _firstgroup.AppendTo(_menu, MF_ENABLED, "Align : " + align_mode_a[align_mode]);
   
    _firstgroup.AppendMenuItem(MF_ENABLED, 60, align_mode_a[0]);         
    _firstgroup.AppendMenuItem(MF_ENABLED, 61, align_mode_a[1]);
    _firstgroup.AppendMenuItem(MF_ENABLED, 62, align_mode_a[2]);
    _firstgroup.AppendMenuItem(MF_ENABLED, 63, align_mode_a[3]);
    _firstgroup.AppendMenuItem(MF_ENABLED, 64, align_mode_a[4]);
    _firstgroup.CheckMenuRadioItem(60, 64, align_mode + 60);
    _firstgroup.EnableMenuItem(align_mode + 60, 1);

    MF_STRING = covers[covernumber] && typeof covers[covernumber] != 'object' && t_type ==  "file" ? MF_ENABLED : MF_GRAYED;
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 70, "Open folder");
    _menu.AppendMenuItem(MF_STRING, 71, "Rename file");
    _menu.AppendMenuItem(MF_STRING, 72, "Delete file");
    _menu.AppendMenuItem(MF_STRING, 73, "Change file attributes");
   
    if (t_type == "file"){
        _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
        _menu.AppendMenuItem(MF_ENABLED, 80, "Manage attached pictures");   
        _menu.AppendMenuItem(MF_ENABLED, 81, "Get album art (LastFM)");
    }
   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    MF_STRING = mode_2 ? MF_ENABLED : MF_GRAYED;
    _menu.AppendMenuItem(MF_STRING, 90, "Mode 1");
    _menu.CheckMenuItem(90, mode_1);
    MF_STRING = mode_1 ? MF_ENABLED : MF_GRAYED;
    _menu.AppendMenuItem(MF_STRING, 91, "Mode 2");
    _menu.CheckMenuItem(91, mode_2);
   
    if (t_type == "stream"){
        _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);   
        _menu.AppendMenuItem(MF_ENABLED, 100, "Copy filename to clipboard");
    }

    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 200, "Reload");
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 210, "Properties");
    _menu.AppendMenuItem(MF_ENABLED, 220, "Configure ...");

    ret = _menu.TrackPopupMenu(x,y);

    switch (ret) {
    case 10:
        set_external = set_external == false ? true : set_embedded == false ? true : false;
        window.SetProperty("external", set_external);
        covernumber = 0;
        get_covers();
        break;
    case 11:
        set_embedded = set_embedded == false ? true : set_external == false ? true : false;
        window.SetProperty("embedded", set_embedded);
        covernumber = 0;
        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:
    case 61:
    case 62:
    case 63:
    case 64:
        align_mode = ret - 60;
        window.SetProperty("align mode", align_mode);
        dx = 0, dy = 0;
        window.Repaint();
        break;
    case 70:      
        switch (t_type) {
        case "file":
            if (covers[covernumber] && typeof covers[covernumber] != 'object') WshShell.run( '"' + covers[covernumber].substring(0, covers[covernumber].lastIndexOf("\\")) + '"' );
            break;
        case "stream":
            if(fso.FolderExists(logo_dir_name)) WshShell.run( '"' + logo_dir_name + '"' );
            break;
        }
        break;   
    case 71:   
        file_operation = true;   
        change_filename();   
        break;          
    case 72:   
        file_operation = true;   
        delete_file();   
        break;   
    case 73:   
        file_operation = true;   
        change_file_attributes();   
        break;   
    case 80:
        if (metadb){
            attached_pic_edit = true; window.Repaint();///////////////////////
            fb.RunContextCommandWithMetadb("Manage attached pictures", metadb);
        }
        break;   
    case 81:
        search_lastFM_album_img();
        break; 
    case 90:
    case 91:   
        window.SetProperty("Mode 1", !mode_1);
        mode_1 = window.GetProperty("Mode 1");
        window.SetProperty("Mode 2", !mode_1);   
        mode_2 = window.GetProperty("Mode 2");
        covernumber = 0;
        switch (t_type) {
        case "file":
            get_covers();
            break;
        case "stream":
            get_logo_image();
            break;
        }
        break;   
    case 100:   
        htmlfile.parentWindow.clipboardData.setData("text", title.replace(/[^a-zA-Z0-9а-яА-Я\s-]/g,'').replace(/\s+/g,' ').replace(/^\s+|\s+$/g,""));
        break;    
        break;
    case 200:   
        try {
            window.Reload();   
        } catch(e) {};
        break;   
    case 210:
        window.ShowProperties();
        break;   
    case 220:
        window.ShowConfigure();   
        break;   
   }
    _menu.Dispose();
    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,'');
    //.replace(/.*\.(\w+)$/,"$1")
}

function get_dp(p) {
    if (!p) return;
    return p.replace(/(.*)\\.*/g,'$1');
}

function clear_n(p) {
    if (!p) return;
    return p.replace(/[^a-zA-Zа-яА-ЯёЁ0-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 clean_path_name(n) {
    if (!n) return;
    return n.replace(/[\/\:\*\?\"\<\>\|]/g,'');
}

function clean_name(n) {
    if (!n) return;
    return n.replace(/[\.\/\:\*\?\"\<\>\|]/g,'').replace(/^\s+|\s+$/g,"").substr(0,200);
}

function get_logo_image() {
    get_logo_files_from_dir();
    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); 
       
        if (mode_2){
            images = []; // *************** v 2
            images.push(resize_image(gdi.Image(covers[0])));
        }
       
        next_image(0);
        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);
    print(logo_files);
}

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

var doc = new ActiveXObject("htmlfile");
var tmp_album;
var tmp_artist;
var tmp_path;
var download_quality = "770x0";
var album_art_dir = window.GetProperty(" album art download directory", "covers");

function search_lastFM_album_img(){
    if (!metadb || !album || !artist) return; 
    tmp_album = album; //sought-for
    tmp_artist = artist;
    tmp_path = path + "\\" + album_art_dir;

    if (tmp_album && tmp_artist){
        tmp_album = input_box("Search album image for", tmp_album, "Foobar 2000");
        if (tmp_album) get_lastFM_albums_pages();
    }
}

function get_lastFM_albums_pages(){
    var xmlhttp0 = new ActiveXObject("Msxml2.XMLHTTP");
    var url0 = ("https://www.last.fm/music/" + encodeURIComponent(tmp_artist) + "/" + "+albums");
    xmlhttp0.open("GET", url0, true ); 
    xmlhttp0.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
    xmlhttp0.send(null);     
    xmlhttp0.onreadystatechange = function () {
        if (xmlhttp0.readyState == 4) {
            if (xmlhttp0.status == 200) {
                doc.open();
                var div = doc.createElement("div");
                div.innerHTML = xmlhttp0.responsetext;
                var data = div.getElementsByTagName("li");
                var albums_pages = 0;   
                for (i = 0; i < data.length; i++) {
                    if (data[i].className == "pages"){
                        albums_pages = data[i].innerHTML.replace(/^\s+|\s+$/g,"").replace(/^(.*\s)/g,'');
                    }
                }
            }     
            doc.close();
            albums_pages = albums_pages == 0 ? 1 : albums_pages;
            for (i = 1; i <= albums_pages; i++) { 
                get_lastFM_album_imgs(i);
            }
        }
    }
}     

function get_lastFM_album_imgs(page){
    var xmlhttp1  = new ActiveXObject("Microsoft.XMLHTTP");   
    var url1 = ("https://www.last.fm/music/" + encodeURIComponent(tmp_artist) + "/" + "+albums" + "?page=" + page); 
    xmlhttp1.open("GET", url1, true );
    xmlhttp1.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
    xmlhttp1.send(null);     
    xmlhttp1.onreadystatechange = function () {
        if (xmlhttp1.readyState == 4) {
            if (xmlhttp1.status == 200) { 
                doc.open();     
                var div = doc.createElement("div");
                div.innerHTML = xmlhttp1.responsetext;
                var data = div.getElementsByTagName("img");
                //var an = div.getElementsByTagName("p");////
                var urls = [];
                var urls_img = [];
                var files = [];
                var item_main_text = [];
               
                //for (i = 0; i < an.length; i++) {   
                //    if (an[i].className == "album-grid-item-main-text" ){ 
                      //  item_main_text.push(an[i].innerHTML.replace(/(&amp;)/g,'&'));
                 //   }
                //} 
               
                for (i = 0; i < data.length; i++) { 
                    if (data[i].className == "album-grid-album-art"){ 
                        if ((data[i].src.indexOf("https://img2-ak.lst.fm/i/u/300") == 0 || data[i].src.indexOf("https://lastfm-img2.akamaized.net/i/u/300") == 0)) {   
                            urls.push(data[i].src);
                            item_main_text.push(data[i].alt);
                        }
                    }
                }
               
                for (i = 0; i < urls.length; i++) {
                    if (urls[i].indexOf("c6f59c1e5e7240a4c0d427abd71f3dbb") < 0) {
                        var album_n1 = item_main_text[i].replace(/\s/,'').toLowerCase();
                        var album_n2 = tmp_album.replace(/\s/,'').toLowerCase()

                        if (album_n1 == album_n2 && album_n1.length == album_n2.length){
                            urls_img.push(urls[i].replace("300x300", download_quality));
                            files.push(clean_name(tmp_artist) + "_" + clean_name(tmp_album) + "_" + i + "_LastFM.jpg");
                        }
                    }
                }
               
                doc.close();
                for (i = 0; i < urls_img.length; i++) { 
                    save_lastFM_album_imgs(urls_img[i], files[i]);
                }
            }
        }
    }     
}

function save_lastFM_album_imgs(url, file_name){
    var nl = "\" + chr(10) + \"";
    var input_box_text = "Save  " + nl + nl + file_name + nl + "file to";
    var string = input_box(input_box_text, tmp_path, "Foobar 2000");
   
    if (string){
        tmp_path = folder_exists(string);

        if(fso.FolderExists(string)) {
            file_path = tmp_path + file_name;
            download_lastFM_album_img(url, file_path);
        }
    }
}

function download_lastFM_album_img(url, file_path){ 
    var xmlhttp2  = new ActiveXObject("Microsoft.XMLHTTP");   
    xmlhttp2.open("GET", url, true); 
    xmlhttp2.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
    xmlhttp2.send();   
    xmlhttp2.onreadystatechange = function () {   
        if (xmlhttp2.readyState == 4) {   
            if (xmlhttp2.status == 200) {   
                var Stream = new ActiveXObject("ADODB.Stream");
                Stream.Open;
                Stream.Type = 1;
                Stream.Write(xmlhttp2.ResponseBody);
                Stream.Position = 0;
                try {   
                    Stream.SaveToFile(file_path);
 
                } catch(e) {}; 
                Stream.Close;
                get_covers(); 
            }   
        }   
    }


function folder_exists(n) {
    var driver = fso.GetDriveName(n);
    if (!fso.DriveExists(driver)) {
        return "";
    } else {
        var p = "";
        var split_string = [];
        split_string = n.replace(/\\$/g, "").split("\\");

        for (var i = 1; i < split_string.length; i += 1) {
            p = p + clean_path_name(split_string[i]) + "\\";
            try {
                if(!fso.FolderExists(driver + "\\" + p)) fso.CreateFolder(driver + "\\" + p);
            } catch(e) {};
        }
        return driver + "\\" + p;
    }
}

function print(msg) {
   fb.trace(msg);
}


kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 10 лет 11 месяцев

Сообщение #1810 seriousstas » 26.04.2017, 15:44

kgena_ua
Спасибо, но проблема ведь остается: радио берут (сопоставляют) название из
%title%
а онлайн треки /viewtopic.php?p=64709#p64709 из
%album artist%
тоесть логотипы от MC Web не читает.
Как их можно различать (проверяю , есть или нет url ) .. Сделал так (на примере плейлиста br3tt):

Код: Выделить всё
var artist_stream = fb.TitleFormat("%url%").EvalWithMetadb(this.rows[i].metadb);
if (artist_stream.indexOf("://") <= 0) {....}

Добавлено спустя 38 минут 14 секунд:
Вобщем - получилось так ,заменить стр 228:
Код: Выделить всё
title = fb.Titleformat("[%title%]").EvalWithMetadb(metadb);
на
Код: Выделить всё
var stream_var = fb.TitleFormat("%url%").EvalWithMetadb(metadb);
        if (stream_var.indexOf("://") <= 0)
        {title = fb.Titleformat("[%album artist%]").EvalWithMetadb(metadb);}
        else
      title = fb.Titleformat("[%title%]").EvalWithMetadb(metadb);
тогда все ОК )
Последний раз редактировалось seriousstas 26.04.2017, 17:02, всего редактировалось 1 раз.
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 1 месяц

Сообщение #1811 kgena_ua » 26.04.2017, 16:30

seriousstas, я просто с этими плейлистами не пробовал.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 10 лет 11 месяцев

Сообщение #1812 seriousstas » 26.04.2017, 16:32

kgena_ua
Понял - я сам только вчера ..руки дошли :)
Ну вот, вроде сейчас норм..
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 1 месяц

Сообщение #1813 MC Web » 26.04.2017, 16:34

kgena_ua, seriousstas привет.

Да, попробовал новый скрипт Get Covers (Artwork) && radio logos, правда долго не разбирался - не показывает.

У меня немного другое предложение, если будет база данных из фотографий исполнителей в папке Logos, тогда наверно ее можно задействовать не только при прослушивании Онлайн-плейлистов, но и при прослушивании радио, когда будут транслироваться исполнители, находящиеся в этой базе, если их нет, брать из папки tmp_Biography/%artist%, если и там нет - логотип радиостанции.
MC Web
Репутация: 248
С нами: 10 лет 7 месяцев

Сообщение #1814 seriousstas » 26.04.2017, 16:40

MC Web
Привет!!
не показывает
- не сложное решение - чуть выше ..
но и при прослушивании радио
Интересное предложение, те , если совпадение - то вместо лого станции показывать артиста -
впринципе логично, но шансов, думаю Ты понимаешь , таких совпадений будет не много(зависит от размера базы и стиля станции)..
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 1 месяц

Сообщение #1815 MC Web » 26.04.2017, 16:46

seriousstas:Интересное предложение, те , если совпатение - то вместо лого станции показывать артиста -
впринципе логично, но шансов, думаю Ты понимаешь , таких совпадений будет не много(зависит от размера базы)

Слушаем в принципе похожих исполнителей, у каждого свои предпочтения, так что со временем у каждого своя база сформируется. Можно было даже без неё, но ее указал, что там можно сохранять понравившиеся и качественные фото.
Да даже без неё, я же указал еще проверку папки tmp_Biography/%artist%, а там то точно будет...
Последний раз редактировалось MC Web 26.04.2017, 16:47, всего редактировалось 1 раз.
MC Web
Репутация: 248
С нами: 10 лет 7 месяцев

Сообщение #1816 kgena_ua » 26.04.2017, 16:47

seriousstas, по tooltip.
В jscript_panel убран on_tooltip_custom_paint(), а зря.
Тут есть версия Properties от 22032017, там tooltip думаю будет совместим с jscript_pane.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 10 лет 11 месяцев

Сообщение #1817 seriousstas » 26.04.2017, 16:51

kgena_ua:seriousstas, по tooltip.
В jscript_panel убран on_tooltip_custom_paint(), а зря.
Тут есть версия Properties от 22032017, там tooltip думаю будет совместим с jscript_pane.
Спросил .. :) :
https://hydrogenaud.io/index.php/topic,110499.new.html#new
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 1 месяц

Сообщение #1818 kgena_ua » 26.04.2017, 16:57

Вот и славно. Мне хотелось сделать неподвижный tooltip, а без on_tooltip_custom_paint() подсказка, если навести на нее мышкой, "некорректно себя ведет".
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 10 лет 11 месяцев

Сообщение #1819 MC Web » 28.04.2017, 13:39

Я так понял, marc2003 исправлять свои "косяки" не хочет, послал... использовать старую WSH panel mod.
MC Web
Репутация: 248
С нами: 10 лет 7 месяцев

Сообщение #1820 seriousstas » 28.04.2017, 15:21

MC Web
.. , предложил какое-то обновление, тут только kgena_ua подсилу это расшифровать :)
еще говорит нужно через window.CreateTooltip(name, size_px, style) делать подсказку ..
Последний раз редактировалось seriousstas 28.04.2017, 17:19, всего редактировалось 2 раз(а).
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 1 месяц

Пред.След.

Вернуться в Секреты foobar2000