Скрипты для foo_uie_wsh_panel_mod

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

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

Сообщение #1001 duzzy » 21.04.2016, 17:41

maklaud
Да не за что :wink: я не сильно и помог..

посидел немного поковырял скрипт, кнопки стали маштабироваться, но режимы(наведение/нажатие) съезжают при маштабировании...
попробуй замени on_draw на это...
function on_draw(gr, x, y, w, h, img, img2, op, state) {
gr.DrawImage(img, Math.ceil(x), Math.ceil(y), Math.ceil(w), Math.ceil(h), 0, state*h, img.width, img.height/3, 0, 255);
gr.DrawImage(img2,Math.ceil(x), Math.ceil(y), Math.ceil(w), Math.ceil(h), 0, state *h, img2.width, img2.height/3, 0, 255);
}
попробуй поковыряй может что и выйдет толковое...
На всякий случай этот скрипт кнопок я выдрал из сборки fooAero CUI от eXtremeHunter1972.
duzzy
Репутация: 25
С нами: 8 лет 8 месяцев

Сообщение #1002 iprad » 22.04.2016, 11:48

Это не поможет. Нужно делать ресайз координат вывода изображений, и ресайз координат области кнопки. В принципе, они в большинстве случаев совпадают. А потом по новой создавать сами кнопки
iprad M
Аватара
Репутация: 89
С нами: 11 лет

Сообщение #1003 maklaud » 23.04.2016, 22:10

iprad:Это не поможет.
Да, не получилось.

Составил такой скрипт:
Код: Выделить всё
// ==PREPROCESSOR==
// @name "Buttons"
// ==/PREPROCESSOR==

var prev_img = gdi.Image("themes\\wsh\\prev.png");  //пикча
var bckgrnd_col = window.GetColorCUI(3);            //цвет фона
var c_ttl = 9;                                      //всего кдров в пикче
var fps = 30;                                       //скорость анимации (кадров/сек)

//  -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   //

var img_h = prev_img.height;    //смотрит высоту пикчи
var img_w = prev_img.width;     //смотрит ширену пикчи
var h_c = img_h/c_ttl;          //считает высоту одного кадра
var t = 1000/fps;               //считает время интервала (задержка кадра)
var c = 1;                      //стартовый кадр
var on_mouse = false;
var lbtn_down = false;

function on_paint(gr) {
    gr.FillSolidRect(0, 0, ww, wh, bckgrnd_col);                        //рисует фон
    gr.DrawImage(prev_img, 0, 0, wh, wh, 0, cdr_to_pxl(c), img_w, h_c); //рисует кадр № "c" из пикчи
}

function cdr_to_pxl(c) { return ((c-1)*h_c); }  //конвертит номер кадра в пиксели

timer_01 = window.setInterval(
    function() {
        if (on_mouse) {             //если наведен курсор
            c = c+1;                    //то прибавляет 1 кадр к текущему номеру кадра, через интервал "t"
            if (c > c_ttl-1) {          //если досчитал более этого кадра
                c = c_ttl-1;                //то показать этот кадр
                if (lbtn_down) {        //если нажата ЛКМ
                    c = c_ttl               //то последний кадр
                }
            }
        } else {                    //если наведен курсор, иначе
            c = 1;                     //кадр № 1
        };
        window.Repaint();
    },t
);

function on_size() {
    ww = window.Width;
    wh = window.Height;
}

function on_mouse_lbtn_down() {
    lbtn_down = true;
    fb.Prev();
}

function on_mouse_lbtn_up() {
    lbtn_down = false;
}

function on_mouse_leave() {
    on_mouse = false;
}

function on_mouse_move() {
    on_mouse = true;
}


Пикча кнопки, перетащить в папку:
foobar2000\themes\wsh
prev.png
prev.png (3.99 КБ) Просмотров: 6327


Работает, но, это только одна кнопка :toothless:, вся панель по-сути - кнопка. Хочу добавить ещё кнопок.
Как определить для каждой кнопки соответствующий функционал?
maklaud
Аватара
Репутация: 30
С нами: 8 лет 8 месяцев

Сообщение #1004 maklaud » 26.04.2016, 10:31

Немного передоработал, и теперь и теперь есть 3 скрипта: предыдущий, плэй/пауза, следующий.
Видео (3 WSH панели).

Но лучше "потрогать" - на видео както нетак.
Архив (3 скрипта, 4 картинки).

Так и не сумел сплавить всё в один скрипт. Подскажите кто знает или догадывается как объединить их. :help:

Добавлено спустя 12 минут 4 секунды:
Ещё есть такой проблем: когда открываю музыкфайлы из проводника вындоус, панели крэшутся:
WSH Panel Mod:Ошибка выполнения Microsoft JScript:
Требуется объект
File: <main>
Line: 11, Col: 1.

В остальных случаях работают нормально.
Что это значит?
maklaud
Аватара
Репутация: 30
С нами: 8 лет 8 месяцев

Сообщение #1005 seriousstas » 26.04.2016, 18:27

maklaud
как объединить их
Круть ! ,попробуй по аналогии , это полный вариант, который предлагал duzzy. "3" - это к-во кнопок :
Код: Выделить всё
 for (var i = 0; i < 3; i++) {
       $buttons[i].draw(gr);
    }

Спойлер
Код: Выделить всё
// ==PREPROCESSOR==
// @name "DEL BUTTON PANEL"
// ==/PREPROCESSOR==

//================================ 3 Buttons Panel
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));
}

DT_TOP = 0x00000000;
DT_LEFT = 0x00000000;
DT_CENTER = 0x00000001;
DT_RIGHT = 0x00000002;
DT_VCENTER = 0x00000004;
DT_BOTTOM = 0x00000008;
DT_WORDBREAK = 0x00000010;
DT_SINGLELINE = 0x00000020;
DT_EXPANDTABS = 0x00000040;
DT_TABSTOP = 0x00000080;
DT_NOCLIP = 0x00000100;
DT_EXTERNALLEADING = 0x00000200;
DT_CALCRECT = 0x00000400;  // [1.2.1] Handles well
DT_NOPREFIX = 0x00000800;  // NOTE: Please use this flag, or a '&' character will become a underline '_'
DT_INTERNAL = 0x00001000;
DT_EDITCONTROL = 0x00002000;
DT_PATH_ELLIPSIS = 0x00004000;
DT_END_ELLIPSIS = 0x00008000;
DT_RTLREADING = 0x00020000;
DT_WORD_ELLIPSIS = 0x00040000;
DT_NOFULLWIDTHCHARBREAK = 0x00080000;
DT_HIDEPREFIX = 0x00100000;
DT_PREFIXONLY = 0x00200000;

//======================================================= Variables
var WshShell = new ActiveXObject("WScript.Shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");

var butt_type = window.GetProperty("Button_type","del.exe");
var butt_type2 = window.GetProperty("Button_type2","ctrl.exe");
var butt_type3 = window.GetProperty("Button_type3","ctrl_up.exe");

var set_path = fb.ProfilePath + "\\settings\\";
var imgPath = fb.FoobarPath + "Themes\\4Icar\\Images\\";

var font_name_prop = window.GetProperty("Font Name","Segoe MDL2 Assets");
var font_size_prop = window.GetProperty("Font Size",15);

var background_color = RGB(15,15,15);

var lbtn_down = false;
var ww = wh = 0;
var height = wh;

var g_font = gdi.Font(font_name_prop, font_size_prop,0);

var on_mouse = false;
try{
    var btn_type = utils.ReadINI( set_path + 'settings.ini', 'Button Folder', 'Button Folder');
    };catch(err){
   var btn_type = "btn_set_1";
};

//=================================================================//
var B = gdi.Image(imgPath + "Buttons\\" + btn_type + "\\BUTTON.png");
var ANIM_BUT_L = gdi.Image(imgPath + "Buttons\\" + btn_type + "\\ANIM_BUT_L.png");

var ctrl = gdi.Image(imgPath + "Buttons\\" + btn_type + "\\ctrl.png");
var del_tracks = gdi.Image(imgPath + "Buttons\\" + btn_type + "\\addlib.png");
var se = gdi.Image(imgPath + "Buttons\\" + btn_type + "\\clear.png");

var ctrl_timeout = utils.ReadINI(set_path + 'settings.ini', 'ctrl_timer', 'TimeWait','')/1000;
var ctrl_status = window.GetProperty("Ctrl Status", true);
var trace_on = window.GetProperty("Trace ON Status", true);

if(ctrl_status == true){
    window.SetProperty("Ctrl Status", false);
    };
//var text_width;
var hbtn;
var dbtn;

//function Button(x, x2, y, w, h, img, img2, onclick, tiptext) {
function Button(x, y, w, h, img, img2, onclick) {
    this.x = x;
    //this.x2 = x2;
    this.y = y;
    this.w = w;
    this.h = h;
    this.img = img;
    this.img2 = img2;
    this.onclick = onclick;
    this.state = 0;
    //this.opacity = 0;
    this.refresh = 0;
    //this.tiptext = tiptext;
   

    this.xy = function (x, y) {

        return (this.x <= x) && (x <= this.x + this.w) && (this.y <= y) && (y <= this.y + this.h);

    }

   
//=================================== 
    this.changeState = function (state) {
   
        //if (!button_timer) button_timer = window.CreateTimerInterval(60);
        window.RepaintRect(this.x-2, this.y-2, this.w+4, this.h+4);
       
        this.state = state;
        this.refresh = 1;

        switch (state) {
        case 0:
        //if(window.GetProperty("TipText")==true){
        //tooltip.Deactivate();}
        //window.SetCursor(32512);
        break;
        case 1:
        //if(window.GetProperty("TipText")==true){
        //tooltip.Text = this.tiptext;
        //tooltip.Activate();}
        //window.SetCursor(32512);
        break;
        case 2:
        }
    }
//------------------> Draw Buttons
  this.draw = function (gr) {
 
    var state = this.state;
    var op = this.opacity;
    on_draw(gr, x, y, w, h, img, img2, op, state);

   }
// ===================================
    /*
    this.Opacity = function () {
             
        if(this.state == 1 && this.opacity < 255)
        this.opacity = Math.min(this.opacity + 10, 255);
       
        if(this.state == 0 && this.opacity > 0)
        this.opacity = Math.max(0,this.opacity - 10);
       
        if (this.opacity == 0){
        this.refresh = 0;
        button_timeout = window.CreateTimerTimeout(3000);
        }             
     
        //window.RepaintRect(ww/2-H.width/2, wh-H.height+1, H.width, H.height);
 
    };
*/
// ===================================
   
    this.onClick = function () {
        this.onclick && this.onclick();
    }
}
//================================================================//
// ========================================================================== //
buttons_on_mouse_move = function(x, y){

    xy = false;

    for (var i = 0; i < $buttons.length; i++)

    if ($buttons[i].xy(x, y)) {

    xy = true;

    if (hbtn != $buttons[i]) {
    if (hbtn) hbtn.changeState(0);
        hbtn = $buttons[i];
        hbtn.changeState(1);
        };
    }
   
    if (xy == false) {
        if (hbtn) {
        hbtn.changeState(0);
        hbtn = undefined;
        };
    }
}
// ========================================================================== //
buttons_on_mouse_lbtn_down = function (x, y) {

    if (hbtn) {
        dbtn = hbtn;
        dbtn.changeState(2);

    }
}
// ========================================================================== //
buttons_on_mouse_lbtn_up = function (x, y) {

    if (dbtn) {
        dbtn.changeState(1);
        dbtn.onClick();
        dbtn = undefined;
    }

}
// ========================================================================== //
buttons_on_mouse_leave = function () {

    if (hbtn) {
        hbtn.changeState(0);
        hbtn = undefined;
    }
    }
// ========================================================================== //
buttons_on_timer = function(id){

    if (button_timeout && id == button_timeout.ID) {
        if (button_timer) window.KillTimer(button_timer);
        button_timer = false;

    }

    for (var i = 0; i < $buttons.length; i++) {
        if ($buttons[2].refresh) {
            $buttons[2].Opacity();
        }
    }
}
//======================================================= recalc
function recalc_dimensions(){
ww = window.Width;
wh = window.Height;

    bw = B.width;
   bh = B.height;

try{
    var btn_type = utils.ReadINI( set_path + 'settings.ini', 'Button Folder', 'Button Folder');
    };catch(err){
   var btn_type = "btn_set_1";
};
   
    ctrl_timeout = utils.ReadINI(set_path + 'settings.ini', 'ctrl_timer', 'TimeWait','')/1000;
    //var bd = 20;
    //bx = ww/2-PLAY.width/2 ;
   //glass == 0 ? by = wh-PLAY.height/3-4 : by = wh-PLAY.height/3-1;
$buttons = [
            new Button(0,0 , B.width, B.height, ANIM_BUT_L, ctrl, function () {
            window.GetProperty("Ctrl Status");
            ctrl_status ? ctrl_keyb_sw(1) : ctrl_keyb_sw(0);
            ctrl_status = !ctrl_status;
            window.SetProperty("Ctrl Status", ctrl_status);// 1
       
      }),
      // 2

           new Button(0, bh, B.width, B.height, ANIM_BUT_L, del_tracks, function () {
               try {
               window.SetProperty("Ctrl Status", false);
               window.ClearInterval(t_);
             window.NotifyOthers("library", "send_to_pl");
             WshShell.SendKeys("^");
             WshShell.Run("taskkill /f /im ctrl.exe",0);
               } catch(e) {};
             recalc_dimensions();
             window.Repaint();
      }),
      // 3
      new Button(0, bh*2, B.width, B.height, ANIM_BUT_L, se, function () {
           
        fb.RunMainMenuCommand("Edit/Clear");               

      })
      
]
}
//------------------------------------------------------------------------//
recalc_dimensions();
// ================================================== //

function on_draw(gr, x, y, w, h, img, img2, op, state) {

   gr.DrawImage(img, Math.ceil(x), Math.ceil(y), Math.ceil(w), Math.ceil(h), 0, state*h, Math.ceil(w), Math.ceil(h), 0, 255);
   //gr.DrawImage(H, Math.ceil(ww/2-H.width/2), Math.ceil(wh-H.height+1), Math.ceil(H.width), Math.ceil(H.height), 0, 0, Math.ceil(H.width), Math.ceil(H.height), 0, op);
   //gr.DrawImage(img2, Math.ceil(x2), Math.ceil(y), Math.ceil(w), Math.ceil(h), 0, 0, Math.ceil(w), Math.ceil(h), 0, 250);
   gr.DrawImage(img2,Math.ceil(x), Math.ceil(y), Math.ceil(w), Math.ceil(h),0,state *h,Math.ceil(w), Math.ceil(h), 0, 255);
   
}
// ================================================== //
function on_paint (gr) {
    ctrl_status = window.GetProperty("Ctrl Status");
   
    gr.FillSolidRect(0,0,ww,wh,background_color)
   
    for (var i = 0; i < 3; i++) {
       $buttons[i].draw(gr);
    }
   
    if(window.IsVisible){
        //var ctrl_timeout = utils.ReadINI(set_path + 'settings.ini', 'ctrl_timer', 'TimeWait','')/1000;
      var text_width = gr.CalcTextWidth(ctrl_timeout, g_font);
        //gr.GdiDrawText(ctrl_timeout, g_font, RGB(200,200,210), bw/2-text_width/2-10, bh+bh/2-8, text_width, font_size_prop+10,DT_CENTER | DT_VCENTER | DT_WORD_ELLIPSIS); // dsp text
        gr.GdiDrawText("", g_font,ctrl_status == false ? RGBA(235,235,210,255):((j & 1) == 0? RGBA(0,255,0,255):RGBA(0,0,0,40)), bw/2-text_width/2-9, 0+bh/2-11, text_width+5, font_size_prop+10,DT_CENTER | DT_VCENTER | DT_WORD_ELLIPSIS); // dsp text
    };
}

// ================================================== //

function on_size() {
if (!window.Width || !window.Height) {
       return;
    }
ww = window.Width;
wh = window.Height;
//default_layout();

    bw = B.width;
   bh = B.height;

recalc_dimensions();

if (ww <= 0 || wh <= 0) return;

    //var bd = 20;
    //bx = ww/2-PLAY.width/2 ;
    //glass == 0 ? by = wh-PLAY.height/3-4 : by = wh-PLAY.height/3-1;
}
// ================================================== //
function on_mouse_move(x, y) {
   
buttons_on_mouse_move(x, y);
}
//==================================================//
function on_mouse_lbtn_down(x, y) {
   
    recalc_dimensions();
   
    on_mouse_move(x, y);

    buttons_on_mouse_lbtn_down(x, y);

}
// ================================================== //
function on_mouse_lbtn_up(x, y) {

    lbtn_down = false;
       

if(utils.ReadINI( set_path + 'settings.ini', 'del', 'del_off', 0 )){
     utils.WriteINI( set_path + 'settings.ini', 'del', 'del_off', 1 );
}   
    //fb.trace("time::: " + ctrl_timeout)
        ctrl_status = window.GetProperty("Ctrl Status");

    ctrl_sts_chg();
    window.Repaint();
    buttons_on_mouse_lbtn_up(x, y);
}

// ================================================== //
function on_mouse_leave() {
   
 buttons_on_mouse_leave();
}
// ================================================== //
function on_timer(id) {
  buttons_on_timer();
}
// ================================================== //
function on_mouse_lbtn_dblclk(x, y) {

}
// ================================================== //

function on_mouse_rbtn_down(x, y) {

    //ShiftDown = utils.IsKeyPressed(0x10) ? true : false;
   //ShiftDown = true;

}

function on_playback_new_track() {
//recalc_dimensions();
CollectGarbage();
}   
// ================================================== //
function on_notify_data(name, info) {
    if(name == "lib_btns" && info == "send_to_pl_ok") {
       
             window.SetProperty("Ctrl Status", false);
             recalc_dimensions();
             window.Repaint();
        };
};

var t_ = false;
var j = 0;
function ctrl_sts_chg(){
    ctrl_timeout = utils.ReadINI(set_path + 'settings.ini', 'ctrl_timer', 'TimeWait','')/1000;
    j = 0;
    window.ClearInterval(t_);
    t_ = window.SetInterval(function(){
      j = j + 1;
    if(ctrl_status = window.GetProperty("Ctrl Status") == false){
        window.ClearInterval(t_);
        j = 0;
        recalc_dimensions();
        window.Repaint();
        };
    if(j >= ctrl_timeout){
        window.ClearInterval(t_);
        j = 0;
        window.SetProperty("Ctrl Status", false);
        recalc_dimensions();
        window.Repaint();
        };     
        //if(trace_on)fb.trace("ctrl_timeout::: "+j);
        window.Repaint();
        //var text_width = gr.CalcTextWidth(ctrl_timeout, g_font);
        //window.RepaintRect(bw/2-text_width/2-10, bh+bh/2-8, text_width, font_size_prop+10);
        },1000);
    //window.SetProperty("Ctrl Status", false);
    //recalc_dimensions();
    //window.Repaint();
    };
var s;
function ctrl_keyb_sw(s){
    switch(s){
    case 0:
    WshShell.Run(".\\settings\\" + butt_type2);
    break;
    case 1:
    //WshShell.Run("taskkill /im ctrl.exe",0);
    WshShell.Run("taskkill /f /im ctrl.exe",0);
    WshShell.SendKeys("^");
       break;
       };
};
когда открываю музыкфайлы из проводника вындоус, панели крэшутся:
походу в этот момент фубар теряет связь с файлом, предполагаю что-то с файловой системой самой винды ,
у меня не замечено такого .
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 1 месяц

Сообщение #1006 maklaud » 27.04.2016, 09:42

seriousstas:попробуй по аналогии
Мозгов не хватает, увы)).

maklaud:когда открываю музыкфайлы из проводника вындоус, панели крэшутся:
оказалось проблем был в:
var prev_img = gdi.Image("themes\\wsh\\prev.png");
а надо:
var prev_img = gdi.Image(fb.FoobarPath + "themes\\wsh\\prev.png");
странно, что вообще работало.
maklaud
Аватара
Репутация: 30
С нами: 8 лет 8 месяцев

Сообщение #1007 maklaud » 01.05.2016, 16:22

Так и сплавил кнопки в одну панель. Может кому пригодится.
Видео.
Архив.

(Картинки поместить в foobar2000\themes\Pulsar Buttons)

Код: Выделить всё
// ==PREPROCESSOR==
// @name "Pulsar Buttons"
// ==/PREPROCESSOR==

var BackColor = 0xff202020;
var FP = fb.FoobarPath + "themes\\Pulsar Buttons\\";
var P = {
    STOP:gdi.Image(FP+"stop.png"),
    PREV:gdi.Image(FP+"prev.png"),
    NEXT:gdi.Image(FP+"next.png"),
    PLAY:gdi.Image(FP+"play.png"),
    PAUS:gdi.Image(FP+"pause.png")};
var BT = 4;             //всего позиций кнопок
var FT = 9;             //всего кадров в пикче
var IW = 60;            //ширена пикчи
var IH = 540;           //высота пикчи
var FPS = 30;           //скорость анимации (кадров/сек)
var FH = IH/FT;         //высота кадра в пикче
var TimBefSeek = 400;   //пройдёт перед перемоткой, мс.
var IntSeek = 200;      //время интервала перемотки, мс.
var TimSeek = 5;        //перемотать на, сек.
var N = {STOP:1, PREV:2, PLAY:3, PAUS:3, NEXT:4}; //порядок кнопок (№ п/п)
var f = {STOP:1, PREV:1, PLAY:1, PAUS:1, NEXT:1}; //стартовый кадр
var m = {};
var b = {};
var FrameIntrvl = window.setInterval(Frame, 1000/FPS), BackAheaInt, PrevNextTmt;
var repaint = 0;

function on_paint(gr) {
    gr.FillSolidRect(0, 0, ww, wh, BackColor);
    gr.DrawImage(P.STOP, NTP(N.STOP), 0, wh, wh, 0, FTP(f.STOP), IW, FH);
    gr.DrawImage(P.PREV, NTP(N.PREV), 0, wh, wh, 0, FTP(f.PREV), IW, FH);
    gr.DrawImage(P.NEXT, NTP(N.NEXT), 0, wh, wh, 0, FTP(f.NEXT), IW, FH);
    if (fb.IsPaused || !fb.IsPlaying) {
        gr.DrawImage(P.PLAY, NTP(N.PLAY), 0, wh, wh, 0, FTP(f.PLAY), IW, FH);
    } else {
        gr.DrawImage(P.PAUS, NTP(N.PAUS), 0, wh, wh, 0, FTP(f.PAUS), IW, FH);
    }
}

function on_mouse_move(x,y) {
    onY= y<wh&&y>0 ? 1 : 0;
    m.STOP = x > NTP(N.STOP) && x < NTP(N.STOP)+wh && onY ? 1 : 0;
    m.PREV = x > NTP(N.PREV) && x < NTP(N.PREV)+wh && onY ? 1 : 0;
    m.NEXT = x > NTP(N.NEXT) && x < NTP(N.NEXT)+wh && onY ? 1 : 0;
    if (fb.IsPaused || !fb.IsPlaying) {
        m.PLAY = x > NTP(N.PLAY) && x < NTP(N.PLAY)+wh && onY ? 1 : 0;
        m.PAUS = 0;
    } else {
        m.PAUS = x > NTP(N.PAUS) && x < NTP(N.PAUS)+wh && onY ? 1 : 0;
        m.PLAY = 0;
    }
}

function on_mouse_leave() {m = {STOP:0, PREV:0, PLAY:0, PAUS:0, NEXT:0};}

function on_mouse_lbtn_down(x,y) {
    b = {STOP:m.STOP, PREV:m.PREV, PLAY:m.PLAY, PAUS:m.PAUS, NEXT:m.NEXT};
    if (b.PREV||b.NEXT) {PrevNextTmt = window.SetTimeout(PrevNextAbort, TimBefSeek)}
}

function PrevNextAbort() {
    b = {PREV:0, NEXT:0};
    BackAheaInt = window.SetInterval(function Back() {
        if (m.PREV) {fb.PlaybackTime -= TimSeek};
        if (m.NEXT) {fb.PlaybackTime += TimSeek};
    }, IntSeek);
}

function on_mouse_lbtn_up() {
    window.ClearInterval(BackAheaInt);
    window.ClearTimeout(PrevNextTmt);
    if (b.STOP && m.STOP) {fb.Stop()};
    if (b.PREV && m.PREV) {fb.Prev()};
    if (b.NEXT && m.NEXT) {fb.Next()};
    if (b.PLAY && m.PLAY || b.PAUS && m.PAUS) {fb.PlayOrPause()};
    b = {STOP:0, PREV:0, PLAY:0, PAUS:0, NEXT:0};
}

function Frame() {
    f.STOP = CalcFrame(m.STOP, b.STOP, f.STOP);
    f.PREV = CalcFrame(m.PREV, b.PREV, f.PREV);
    f.NEXT = CalcFrame(m.NEXT, b.NEXT, f.NEXT);
    f.PLAY = CalcFrame(m.PLAY, b.PLAY, f.PLAY);
    f.PAUS = CalcFrame(m.PAUS, b.PAUS, f.PAUS);
    if (repaint){window.Repaint();}
    repaint= f.STOP!=1||f.PREV!=1||f.NEXT!=1||f.PLAY!=1||f.PAUS!=1 ? 1 : 0;
}

function CalcFrame(m,b,f) {return m?b?FT:f<FT-1?f+1:FT-1:f<=1?1:f<FT&&f>7?f-3:f-1;}

function NTP(n) {return n*(ww/(BT+1))-wh/2;}

function FTP(f) {return (f-1)*FH;}

function on_colors_changed() {window.Repaint();}

function on_size() {
    ww = window.Width;
    wh = window.Height;
}

Добавлено спустя 2 минуты 45 секунд:
Если долго жать предыдущий/следующий, - мотает назад/вперёд

Добавлено спустя 13 минут 13 секунд:
Также выслушаю замечания, предложения, может какие баги обнаружатся :) .
maklaud
Аватара
Репутация: 30
С нами: 8 лет 8 месяцев

Сообщение #1008 AHAPXICT » 04.05.2016, 20:25

maklaud, респект :beer: Новаторские идеи, по кадровая анимация, масштабирование - выглядит супер. Только подбор цвета для бекграунда жути нагоняет :biggrin:
AHAPXICT M
Аватара
Откуда: Киев
Репутация: 252
С нами: 10 лет 4 месяца

Сообщение #1009 kgena_ua » 08.05.2016, 02:31

maklaud, :beer:

Get Covers (Artwork)
version "06052016"

Безымянный1.jpg

Код: Выделить всё
// ==PREPROCESSOR==      
// @name "Get Covers (Artwork)"   
// @author "kgena_ua"   
// @version "06052016"   
// @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);};   

var font = gdi.Font("Arial",12, 0);   
var a_font = gdi.Font("Arial",12, 1);   
var b_font = gdi.Font("Arial",12, 0);
var ww = 200, wh = 200;

DT_LEFT = 0x00000000;
DT_RIGHT = 0x00000002;
DT_CENTER = 0x00000001;
DT_VCENTER = 0x00000004;
DT_SINGLELINE = 0x00000020;
DT_WORD_ELLIPSIS = 0x00040000;
/*
ColorTypeCUI = {
    text: 0,
    selection_text: 1,
    inactive_selection_text: 2,
    background: 3,
    selection_background: 4,
    inactive_selection_background: 5,
    active_item_frame: 6
};

function get_color(){   
    bgcolor = window.GetColorCUI(ColorTypeCUI.background);
    a_color = window.GetColorCUI(ColorTypeCUI.text);
    b_color = window.GetColorCUI(ColorTypeCUI.inactive_selection_text);
}

get_color();

function on_colors_changed(){
    get_color();
}
*/
var bgcolor = RGB(31,41,48);
var a_color = RGB(255,255,230);
var b_color = RGB(255,255,230);

var transparent = 200;

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

var dir_name, album;
var old_dir_name, old_album;

var g_img = null
var cover_name;
var cover_size;
var cover_width;
var cover_height;
var nocover_path = window.GetProperty("nocover path",".\\nocover\\nocover.png");
var nocover = window.GetProperty("nocover image", false);
var nocover_transparent = window.GetProperty("nocover 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 covernumber = 0;

var root_folders = new Array("cover", "covers", "scan", "scans", "artwork", "artworks", "images");

var set_external = window.GetProperty("external", 1);
var set_embedded = window.GetProperty("embedded", 1);
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", 5);
var align_mode_a = new Array("adjust", "adjust top - center", "adjust top - left", "centre", "centre - top", "stretch");
var align_mode = window.GetProperty("align mode", 0);
var p_margin = window.GetProperty("margin", 0);

var file_operation = false;

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

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

    paint(gr);   
    draw_set(gr);
    draw_info(gr);
   
    gr.GdiDrawText("", font, b_color, 10, 0, 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() {
    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(metadb) {   
   on_item_focus_change();   
}   

function on_item_focus_change() {   
    a6 = 1;     
    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){
        dir_name = fb.Titleformat("$directory_path(%path%)").EvalWithMetadb(metadb);
        album = fb.Titleformat("%album%").EvalWithMetadb(metadb);
        if (dir_name != old_dir_name || album != old_album){
            covernumber = 0;
            get_covers();
            old_dir_name = dir_name;
            old_album = album
        }
    }
}

function get_covers() {
    g_img = null;

    get_external_covers(dir_name);
    get_embedded_covers();

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

    next_image(0);
    window.Repaint();
}

function get_embedded_covers() {   
    embedded = [];
    if ( metadb ) {
        for (var i = 0; i < 5; i++) {
            //0 - front, 1 - back, 2 - disc, 3 - icon, 4 - artist
            var temp = utils.GetAlbumArtEmbedded(metadb.RawPath, i);
            if (temp) embedded.push(temp);
        }
    }
}

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()) {
                    get_covers_from_dir(covers_root_subs, e.item() );
                }
            }
        }
    } catch(e) {};
   
    covers_external = covers_external.concat(covers_dir, covers_root, covers_dir_subs, covers_root_subs);

    if (covers_external.length > 0) {
        for (i in covers_external) {
            var name = covers_external[i];
           
            if (get_file_name(name).toLowerCase() == album.toLowerCase() || 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 get_file_name(n) {
    if (!n) return;
    var file_name_ext = n.substr(n.lastIndexOf("\\") + 1, n.length);
    var file_name = file_name_ext.substr(0, file_name_ext.length - 4);
    return file_name;
}

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 (typeof covers[covernumber] == 'object' ) {
        g_img = covers[covernumber];
    } else {
        g_img = resize_image(gdi.Image(covers[covernumber]));   
    }

    if (g_img && fade_effect) fader_timer();
}

function resize_image(img){
    if (!img) return;
   
    var scale_w = ww / img.Width;
    var scale_h = wh / img.Height;
    //var scale = Math.min(scale_w, scale_h);
    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);
   
    CollectGarbage();
    return temp_bmp;
    temp_bmp.Dispose();
    temp_gr = null;
    temp_bmp = null;
}

function paint(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 (covers.length == 0 && 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) {};
    }
}

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, b_font, b_color, 0, 20, ww, wh, DT_CENTER | DT_WORD_ELLIPSIS );
    }
}

function draw_info(gr){
    var text_h = gr.CalcTextHeight("00", font);   
    var text_y = wh -  text_h * 3 - 5;   

    if(info){   
        !set_cycle && gr.FillSolidRect(0, text_y - 5, ww, wh - text_y + 5, RGBA(getRed(bgcolor),getGreen(bgcolor),getBlue(bgcolor),transparent));   

        if (covers[covernumber]) {
            if (typeof covers[covernumber] != 'object'){
                cover_name = covers[covernumber].substring(covers[covernumber].lastIndexOf("\\") + 1);
                cover_width = gdi.Image(covers[covernumber]).width;
                cover_height = gdi.Image(covers[covernumber]).Height;
           
                cover_size = fso.GetFile( covers[covernumber]).size;
                if (cover_size > 1024 * 1024){
                    cover_size =  Math.round(cover_size / 1024 / 1024 * 100) / 100 + " MB"
                } else if (cover_size > 1024){
                    cover_size = Math.round(cover_size / 1024 * 100 ) / 100 + " KB"
                } else {
                    cover_size = cover_size + " Bytes";
                }
                cover_size = "   " + cover_size;
            }
           
            if (typeof covers[covernumber] == 'object'){
                cover_name = "embedded";
                cover_width = covers[covernumber].width;
                cover_height = covers[covernumber].Height;
                cover_size = "";
            }
           
            gr.GdiDrawText(cover_name, font, b_color, 0, text_y, ww, wh, DT_CENTER | DT_WORD_ELLIPSIS );
            gr.GdiDrawText(cover_width + " x " + cover_height + "" + cover_size, font, b_color, 0, text_y + text_h, ww, wh, DT_CENTER | DT_WORD_ELLIPSIS );
            info_text = covernumber + 1 + " (" + covers.length + ")   " + external.length + " external   " + embedded.length + " embedded";
            gr.GdiDrawText(info_text, font, b_color, 0, text_y + text_h * 2, ww, wh, DT_CENTER | DT_WORD_ELLIPSIS );
        }
    }
   
    if (!g_img) {
        gr.GdiDrawText("no image", font, a_color, 0, 0, ww, wh, DT_SINGLELINE | DT_CENTER | DT_VCENTER | DT_WORD_ELLIPSIS );
    }
}

function on_mouse_lbtn_dblclk (x,y){
    if (typeof covers[covernumber] != 'object' ) {
        if (covers[covernumber]) WshShell.run( '"' + covers[covernumber] + '"' );
    }
}

function on_mouse_wheel(delta) {
    ShiftDown = utils.IsKeyPressed(0x10) ? true : false;
   
    if (!delay && !ShiftDown && covers.length > 1){
        delay = true;
        fdelay();
        next_image(delta);
    }

    if (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_move(x, y) {
    window.SetCursor(32649);
}

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) {
    if (vkey == 16){
        set_cycle = true;
        dis_set();
        window.Repaint();
    }
}

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){
            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 + fade_step;
        if (fader >= 255) {
            fader= 255;
            window.ClearInterval(ftimer);
        }
    window.Repaint();
    }, 10 );
}

function change_filename(){
    var c_file_name = get_file_name(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) {
        try {
            var dir = covers[covernumber].replace(/\\([^\\]*)$/g, '');
            var ext = covers[covernumber].replace(/(.*)\.([^\.]*)$/,'$2');
            fso.MoveFile( covers[covernumber], dir + "\\" + n_file_name + "." + ext );
            get_covers();
           
            for (var i = 0; i < covers.length; i++) {
                var name = covers[i];
                if (get_file_name(name) == n_file_name) {
                    covernumber = i;
                    window.Repaint();
                }
            }
        } catch(e) {}
    }
    file_operation = false;
}

function delete_file(){ 
    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(){ 
    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);
        var file_attributes = file.Attributes;
        return file_attributes == 32 ? true : false;
    }
}

function on_size(){
    ww = window.Width;   
    wh = window.Height;
}

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: // adjust top - left
        var sw = ww / img.Width;
        var sh = wh / img.Height;
        var s = Math.min(sw, sh);
       
        var x = 0;
        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 3: // 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);
         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: // 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 5: // 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 + p_margin;
    size.y = y + p_margin;
    size.width = width - p_margin * 2;
    size.height = height - p_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_ENABLED = 0x00000000;
    MF_GRAYED = 0x00000001;
    MF_SEPARATOR = 0x00000800;
   
    _menu.AppendMenuItem(MF_ENABLED, 10, "External covers");
    _menu.CheckMenuItem(10, set_external);
    _menu.AppendMenuItem(MF_ENABLED, 11, "Embedded covers");
    _menu.CheckMenuItem(11, set_embedded);

    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 20, "Priority external");   
    _menu.AppendMenuItem(MF_ENABLED, 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);
   
    var _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.AppendMenuItem(MF_ENABLED, 65, align_mode_a[5]);
    _firstgroup.CheckMenuRadioItem(60, 65, align_mode + 60);
    _firstgroup.EnableMenuItem(align_mode + 60, 1);

    var MF_ = covers[covernumber] && typeof covers[covernumber] != 'object' ? MF_ENABLED : MF_GRAYED;
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_, 70, "Open folder");
    _menu.AppendMenuItem(MF_, 71, "Rename file");
    _menu.AppendMenuItem(MF_, 72, "Delete file");
    _menu.AppendMenuItem(MF_, 73, "Change file attributes");

    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    //_menu.AppendMenuItem(MF_ENABLED, 100, "Reload");
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 110, "Properties");
    _menu.AppendMenuItem(MF_ENABLED, 120, "Configure ...");

    ret = _menu.TrackPopupMenu(x,y);

    switch (ret) {
    case 10:
        set_external = set_external == 0 ? 1 : set_embedded == 0 ? 1 : 0;
        window.SetProperty("external", set_external);
        get_covers();
        break;
    case 11:
        set_embedded = set_embedded == 0 ? 1 : set_external == 0 ? 1 : 0;                ;
        window.GetProperty("embedded", set_embedded);
        get_covers();
        break;
    case 20:
        set_priority = 0;
        window.SetProperty("set_priority", set_priority);
        get_covers();
        break;
    case 21:
        set_priority = 1;
        window.SetProperty("set_priority", set_priority);
        get_covers();
        break;
    case 30:
        selection_mode = 0;
        window.SetProperty("selection_mode", selection_mode);
        on_item_focus_change();
        break;
    case 31:
        selection_mode = 1;      
        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:
    case 65:
        align_mode = ret - 60;
        window.SetProperty("align mode", align_mode);
        window.Repaint();
        break;
    case 70:      
      if (covers[covernumber] && typeof covers[covernumber] != 'object') WshShell.run( '"' + covers[covernumber].substring(0, covers[covernumber].lastIndexOf("\\")) + '"' );
        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 100:   
        //window.Reload();   
        break;   
    case 110:
        window.ShowProperties();
        break;   
    case 120:
        window.ShowConfigure();   
        break;   
   }
    _menu.Dispose();
    return true;   

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

Сообщение #1010 kgena_ua » 14.05.2016, 12:16

Biography Text && Picture. www.last.fm
version "14052016"


Добавлена возможность сохранения текста.

Безымянный.png


Код: Выделить всё
// ==PREPROCESSOR==
// @name "Biography Text && Picture. www.last.fm"
// @author "kgena_ua"
// @version "14052016"
// @feature "v1.4"
// @feature "watch-metadb"
// ==/PREPROCESSOR==

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)); }
function getRed(color) {return ((color >> 16) & 0xff);};
function getGreen(color) {return ((color >> 8) & 0xff);};
function getBlue(color) {return (color & 0xff);};

DT_LEFT = 0x00000000;
DT_RIGHT = 0x00000002;
DT_CENTER = 0x00000001;
DT_VCENTER = 0x00000004;
DT_SINGLELINE = 0x00000020;
DT_WORD_ELLIPSIS = 0x00040000;
DT_WORDBREAK = 0x00000010;
DT_CALCRECT = 0x00000400;
DT_NOPREFIX = 0x00000800;

var ww = 200, wh = 200;

var font_name_a = window.GetProperty("font name: artist", "Arial");
var font_name_b = window.GetProperty("font name: biography", "Arial");
var font_size_a_d = window.GetProperty("font size: artist (delta)", 0);
var font_size_b = window.GetProperty("font size: biography", 12);
var a_font_style = window.GetProperty("font style: artist", 1);
var b_font_style = window.GetProperty("font style: biography", 0);
var min_font_size = 10;
var max_font_size = 16;

var a_font, b_font;
get_font();

function get_font(){
    a_font = gdi.Font(font_name_a, font_size_b + font_size_a_d, a_font_style);
    b_font = gdi.Font(font_name_b, font_size_b, b_font_style);
}   
/*
ColorTypeCUI = {
    text: 0,
    selection_text: 1,
    inactive_selection_text: 2,
    background: 3,
    selection_background: 4,
    inactive_selection_background: 5,
    active_item_frame: 6
};

function get_color(){   
    bgcolor = window.GetColorCUI(ColorTypeCUI.background);
    a_color = window.GetColorCUI(ColorTypeCUI.text);
    b_color = window.GetColorCUI(ColorTypeCUI.inactive_selection_text);
    window.Repaint();
}

get_color();

function on_colors_changed(){
    get_color();
}
*/
var bgcolor = RGB(31,41,48);
var a_color = RGB(220,220,220);
var b_color = RGB(255,255,230);

var transparent = 200;

var fso = new ActiveXObject("Scripting.FileSystemObject");

var tmp_b_path = fb.ProfilePath + "\\tmp_Biography\\";
if (!fso.FolderExists(tmp_b_path)) {fso.CreateFolder(tmp_b_path)};

var script_path = tmp_b_path + "_download\\";
if (!fso.FolderExists(script_path)) {fso.CreateFolder(script_path)};
if (!fso.FileExists(script_path + "download.vbs")) {create_download_file()};

var doc = new ActiveXObject("htmlfile");
var WshShell = new ActiveXObject("WScript.Shell");
var vbs = "cscript //nologo \"" + script_path + "download.vbs\"";

var nocover_path = window.GetProperty("nocover path",".\\nocover\\nocover.png");
var nocover = window.GetProperty("nocover image", false);
var nocover_transparent = window.GetProperty("nocover transparent (0-255)", 100);

load_last_fm_logo();
var logo_img = gdi.Image(script_path + "last_fm_logo.jpg");

var artist, old_artis;
var path, directory_path;

function clean_name(n) {
    return n.replace(/[\/\:\*\?\"\<\>\|]/g,' ');
}

function artist_folder_path(n) {
    return tmp_b_path + clean_name(n);
}

function check_folder(n) {
    if(!fso.FolderExists(n)) {fso.CreateFolder(n)};
}

var g_img = null;
var p_margin = window.GetProperty("margin: picture", 10);
var align_mode_a = new Array("adjust", "adjust top - center", "adjust top - left", "centre", "centre - top", "stretch");
var align_mode = window.GetProperty("align mode", 0);
var selected = 0;
var files = [];
var images = [];
var found = 0;
var save_images = window.GetProperty("save images", false);
var limit = window.GetProperty("download limit",5);
var cycle = window.GetProperty("auto cycle (sec)", 0);
if (cycle > 0) set_cycle_timer();
var fader = 255;
var fade_effect = window.GetProperty("fade effect", false);
var fade_step = window.GetProperty("fade step", 5);
var on_pic = false;

var scrollbar = window.GetProperty("scrollbar", true);
var scrollbar_k;
var sb_posy = 0;
var on_sb = false;
var on_sb_down = false;

var b_file;
var t_margin = window.GetProperty("margin: text", 10);
var txt_x = window.GetProperty("txt_x", window.Width / 2);
var txt_y = window.GetProperty("txt_y", window.Height / 2);
var delta_x, delta_y;
var a_x, a_y;
var b_x, b_y;
var text = "";
var s_text = 0;
var a_text_row_height = 0;
var b_text_row_height = 0;
var b_text_rows = 0;
var b_text_visable_rows = 0;
var b_text_visable_height = 0;
var b_text_array = [];
var on_artist = false;
var on_text = false;
var on_text_down = false;

var abc_lang = new Array("", "ru/");
var abc = window.GetProperty("abc", 0);
var if_not_found = new Array(". . .", ". . .");
var select_p_a = window.GetProperty("pictures/albums", 0);
var p_a = new Array("images", "albums");

var selection_mode = window.GetProperty("selection mode", 0);
var metadb;
on_item_focus_change();

function on_paint(gr){   
   !window.IsTransparent && gr.FillSolidRect(0, 0, ww, wh, bgcolor);
    paint(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";   
        set_cycle && gr.GdiDrawText("auto cycle \n" + txt_cycle, b_font, b_color, 15, 15, ww, wh, DT_LEFT | DT_WORD_ELLIPSIS );   
    } else{   
        gr.FillSolidRect(txt_x, txt_y, ww - txt_x, wh - txt_y, RGBA(getRed(bgcolor),getGreen(bgcolor),getBlue(bgcolor),transparent));   
    }   

    gr.GdiDrawText(artist, a_font, RGB(0,0,0), a_x + 1, a_y + 2, ww - a_x - t_margin, wh, DT_LEFT | DT_WORD_ELLIPSIS | DT_NOPREFIX );   
    gr.GdiDrawText(artist, a_font, a_color, a_x, a_y, ww - a_x - t_margin, wh, DT_LEFT | DT_WORD_ELLIPSIS | DT_NOPREFIX );   

    for (var i = 0; i < b_text_visable_rows * 2; i += 2) {
    try {
        gr.GdiDrawText(b_text_array[i + s_text * 2].replace(/^\s+|\s+$/g, ""), b_font, RGB(0,0,0), b_x + 1, b_y + b_text_row_height * i / 2 + 2, ww, wh, DT_LEFT | DT_NOPREFIX );
        gr.GdiDrawText(b_text_array[i + s_text * 2].replace(/^\s+|\s+$/g, ""), b_font, b_color, b_x, b_y + b_text_row_height * i / 2 , ww, wh, DT_LEFT | DT_NOPREFIX );
    } catch(e) {}
    }

    scrollbar && draw_scrollbar(gr);

    gr.GdiDrawText( "", gdi.Font("Arial",12, 0), b_color, 15, 20, ww, wh, DT_LEFT | DT_WORD_ELLIPSIS );
}

function paint(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, images.length > 0 ? fader : nocover_transparent);
    }
   
    if (logo_img && images.length == 0 && !nocover){
        gr.DrawImage(logo_img, p_margin, p_margin, logo_img.Width * 0.8, logo_img.Height * 0.8, 0, 0, logo_img.Width, logo_img.Height, 0, 255);   
    }

    if (images.length == 0 && 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) {};
    }
}

function draw_scrollbar(gr){
    scrollbar_h = b_text_rows > b_text_visable_rows ? b_text_visable_height * (b_text_visable_rows / b_text_rows) : 0;
    if (b_text_rows > b_text_visable_rows){ scrollbar_h = Math.max(5, scrollbar_h)}
    scrollbar_y = s_text > 0 ? s_text * scrollbar_k : 0;
   
    gr.FillSolidRect(ww - 4, b_y + scrollbar_y, 2, scrollbar_h, a_color);
}

function on_playlist_switch() {
    on_item_focus_change();
}

function on_playback_new_track() {
    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(metadb) {
   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 Eval(field) {   
    if (!metadb) return;   
    path = fb.Titleformat("%path%").EvalWithMetadb(metadb);
    directory_path = fb.Titleformat("$directory_path(%path%)").EvalWithMetadb(metadb);
    return path.indexOf('://') > 0 ? fb.TitleFormat("[" + field + "]").Eval() : fb.TitleFormat("[" + field + "]").EvalWithMetadb(metadb);   
    //return fb.Titleformat("[" + field + "]").EvalWithMetadb(metadb) ? fb.TitleFormat("[" + field + "]").EvalWithMetadb(metadb) : fb.TitleFormat("[" + field + "]").Eval(true);   
}   

function on_metadb_changed() {
    if (!metadb) return;   
    artist = Eval("%artist%").replace(/^\s+|\s+$/g, "");
    if (artist != old_artis){
        if (!save_images) del_folders();
        get_text();
        get_pic();
        old_artis = artist;
    }
}   

function get_pic() {
    g_img = null;
    files = [];
    images = [];
    found = 0;
    selected = 0;
    window.Repaint();
   
    check_folder(artist_folder_path(artist));
    get_files_from_dir(artist_folder_path(artist));
    if (!g_img && images.length > 0) {
        next_image(0);
    } else {
        get_lastFM_pic(artist_folder_path(artist));
    }
}

function get_lastFM_pic(p){
    xmlhttp1 = new ActiveXObject("Microsoft.XMLHTTP");     
    url1 = ("http://www.last.fm/music/" + encodeURIComponent(artist) + "/+" + p_a[select_p_a]);     
    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 urls = [];
                for (i = 0; i < data.length; i++) {     
                    if (data[i].className == "image-list-image" && select_p_a == 0){       
                        if (data[i].src.indexOf("http://img2-ak.lst.fm/i/u/avatar170s") == 0) {
                            urls.push(data[i].src.replace("avatar170s", "770x0"));
                        }     
                    }       
                    if (data[i].className == "album-grid-album-art" && select_p_a == 1){         
                        if (data[i].src.indexOf("http://img2-ak.lst.fm/i/u/300") == 0 && data[i].src.indexOf("c6f59c1e5e7240a4c0d427abd71f3dbb") < 0) {
                            urls.push(data[i].src.replace("300", ""))
                        }     
                    }       
                }
                found = Math.min(urls.length, limit); window.Repaint();             
                for (i = 0; i < Math.min(urls.length, limit); i++) {     
                    file = "\"" + p + "\\" + clean_name(artist) + "_"  + i + "_" + p_a[select_p_a] + ".jpg" + "\"";     
                    WshShell.Run(vbs + " " + urls[i] + " " + file, false);
                }     
                doc.close();
                if (found > 0) get_files_if_loaded();
            }
        }     
    }     
}

function get_files_from_dir(p) {
    if (!artist) return;
    p = p + "\\";
    images = [];
    files = utils.Glob(p + "*.*").toArray();
    for (i in files) {
        if (files[i].indexOf(clean_name(artist)) > 0 && files[i].indexOf(p_a[select_p_a]) > 0){
            try {
                images.push(resize_image(gdi.Image(files[i])));
            } catch(e) {}
        }
    }
}

function next_image(d){
    fader = fade_effect ? 0 : 255;
    if (d < 0) {selected = selected <= 0 ? images.length - 1 : selected = selected - 1};
    if (d > 0) {selected = selected >= images.length - 1 ? 0 : selected = selected + 1};
    g_img = images[selected];
    if (g_img && fade_effect) fader_timer();
    window.Repaint();
}

function resize_image(img){
    if (!img) return;

    var scale_w = (window.Width - p_margin * 2) / img.Width;
    var scale_h = (window.Height - p_margin * 2) / img.Height;
    var scale = Math.min(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);
   
    CollectGarbage();
    return temp_bmp;
    temp_bmp.Dispose();
    temp_gr = null;
    temp_bmp = null;
}

function get_text() {
    s_text = 0;
    text = "";
    get_b_text_array();

    b_file = artist_folder_path(artist) + "\\" + clean_name(artist) + "_biography_" + clean_name(abc_lang[abc]) + ".txt";

    if (fso.FileExists(b_file)){
        text = utils.ReadTextFile(b_file);
        get_b_text_array();
    } else{
        get_lastFM_b_text(b_file);
    }
}

function get_lastFM_b_text(p){
    xmlhttp2 = new ActiveXObject("Microsoft.XMLHTTP");
    url2 = ("http://www.last.fm/" + abc_lang[abc] + "music/" + encodeURIComponent(artist) + "/+wiki");
    xmlhttp2.open("GET", url2, true);
    xmlhttp2.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
    xmlhttp2.send(null);
    xmlhttp2.onreadystatechange = function () {
        if (xmlhttp2.readyState == 4) {
            if (xmlhttp2.status == 200) {
                doc.open();
                var div = doc.createElement("div");
                div.innerHTML = xmlhttp2.responsetext;
                var data = div.getElementsByTagName("div");
                for (i = 0; i < data.length; i++) {
                    if (data[i].className == "wiki-content") {
                        text = strip_tags(data[i].innerHTML);
                        break;
                    }
                }
                doc.close();
            }
            if (text == "") text = if_not_found[abc];
            get_b_text_array();
            save_biography_file(text, p);
        }
    }
}

function strip_tags(t) {
    doc.open();
    var div = doc.createElement("div");
    div.innerHTML = t.replace(/<[Pp][^>]*>/g, "").replace(/<\/[Pp]>/g, "<br>").replace(/\n/g, "<br>");
    var text = div.innerText;
    doc.close();
    return text;
}

function get_b_text_array() {
    a_x = txt_x + t_margin;
    a_y = txt_y + t_margin;
 
    temp_bmp = gdi.CreateImage(1, 1);
    temp_gr = temp_bmp.GetGraphics();

    a_text_row_height = temp_gr.CalcTextHeight("text", a_font);
    b_text_row_height = temp_gr.CalcTextHeight("text", b_font);
   
    b_x = txt_x + t_margin;
    b_y = a_y + a_text_row_height + b_text_row_height;

    string_width = Math.max(ww - b_x - t_margin, 0);

    b_text_array = [];
    if (text) b_text_array = temp_gr.EstimateLineWrap(text, b_font, string_width).toArray();
   
    b_text_rows = b_text_array.length / 2;

    b_text_visable_height = Math.round(Math.max(0, wh - t_margin - b_y));
    b_text_visable_rows = Math.round(b_text_visable_height / b_text_row_height);

    if (b_text_visable_rows + s_text > b_text_rows && s_text > 0) {
        s_text = (b_text_rows - b_text_visable_rows);
    };
   
    scrollbar_k = b_text_visable_height / b_text_rows;
   
    temp_bmp.ReleaseGraphics(temp_gr);
    temp_bmp.Dispose();
    temp_gr = null;
    temp_bmp = null;

    window.Repaint();
}

function save_biography_file(t, p){
    if (!artist) return;
    try {
        file = fso.OpenTextFile( p, 2, true, -1)
        file.WriteLine(t);
        file.Close();
    } catch(e) {
        return;
    }
}

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

    MF_ENABLED = 0x00000000;   
    MF_GRAYED = 0x00000001;   
    MF_SEPARATOR = 0x00000800;   
     
    _menu.AppendMenuItem(MF_ENABLED, 10, "EN text");   
    _menu.AppendMenuItem(MF_ENABLED, 11, "RU text");   
    _menu.CheckMenuRadioItem(10, 11, abc + 10);         
    _menu.EnableMenuItem(abc + 10, 1);     

    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);   
       
    _menu.AppendMenuItem(MF_ENABLED, 12, "Prefer now playing");   
    _menu.AppendMenuItem(MF_ENABLED, 13, "Follow selected track");   
    _menu.CheckMenuRadioItem(12, 13 , selection_mode + 12);   
   _menu.EnableMenuItem(selection_mode + 12, 1);
       
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);   
    _menu.AppendMenuItem(MF_ENABLED, 14, "Artist pictures");   
    _menu.AppendMenuItem(MF_ENABLED, 15, "Albums pictures");   
    _menu.CheckMenuRadioItem(14, 15 , select_p_a + 14);   
   _menu.EnableMenuItem(select_p_a + 14, 1);

    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);   
    var is_artist = artist ? MF_ENABLED : MF_GRAYED;   
    _menu.AppendMenuItem(is_artist, 16, "last.fm Artist");   
   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 17, "Fade effect");
    _menu.CheckMenuItem(17, fade_effect);

    var _firstgroup = window.CreatePopupMenu();
    _firstgroup.AppendTo(_menu,MF_ENABLED,  "Align : " + align_mode_a[align_mode]);
   
    _firstgroup.AppendMenuItem(MF_ENABLED, 20, align_mode_a[0]);         
    _firstgroup.AppendMenuItem(MF_ENABLED, 21, align_mode_a[1]);
    _firstgroup.AppendMenuItem(MF_ENABLED, 22, align_mode_a[2]);
    _firstgroup.AppendMenuItem(MF_ENABLED, 23, align_mode_a[3]);
    _firstgroup.AppendMenuItem(MF_ENABLED, 24, align_mode_a[4]);
    _firstgroup.AppendMenuItem(MF_ENABLED, 25, align_mode_a[5]);
    _firstgroup.CheckMenuRadioItem(20, 25, align_mode + 20);
    _firstgroup.EnableMenuItem(align_mode + 20, 1);
   
   
    var MF_ = images.length > 0 ? MF_ENABLED : MF_GRAYED;
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_, 30, "Copy to folder containing track...");
   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
    _menu.AppendMenuItem(MF_ENABLED, 40, "Save images and text");
    _menu.CheckMenuItem(40, save_images);

    //_menu.AppendMenuItem(MF_SEPARATOR, 0, 0);   
    //_menu.AppendMenuItem(MF_ENABLED, 100, "Reload");   
    _menu.AppendMenuItem(MF_SEPARATOR, 0, 0);   
    _menu.AppendMenuItem(MF_ENABLED, 110, "Properties");   
    _menu.AppendMenuItem(MF_ENABLED, 120, "Configure ...");

    ret = _menu.TrackPopupMenu(x,y);

    switch (ret) {
    case 10:
        abc = 0;
        window.SetProperty("abc", abc);
        get_text();
        break;
    case 11:
        abc = 1;
        window.SetProperty("abc", abc);
        get_text();
        break;
    case 12:
        selection_mode = 0;
        window.SetProperty("selection mode", selection_mode);
        on_item_focus_change();
        break;
    case 13:
        selection_mode = 1;
        window.SetProperty("selection mode", selection_mode);
        on_item_focus_change();
        break;
    case 14:
        select_p_a = 0;
        window.SetProperty("pictures/albums", select_p_a);
        get_pic();
        break;
    case 15:
        select_p_a = 1;
        window.SetProperty("pictures/albums", select_p_a);
        get_pic();
        break;
    case 16:
        WshShell.run("http://www.last.fm/" + abc_lang[abc] + "music/" + encodeURIComponent(artist));
        break;
    case 17:
        window.SetProperty("fade effect", !fade_effect);
        fade_effect = window.GetProperty("fade effect");
        break;
    case 20:
    case 21:
    case 22:
    case 23:
    case 24:
    case 25:
        align_mode = ret - 20;
        window.SetProperty("align mode", align_mode);
        window.Repaint();
        break;
    case 30:
        copy_files();
        break;
    case 40:
        window.SetProperty("Save images", !save_images);
        save_images = window.GetProperty("Save images");
        break;
    case 100:
        //window.Reload();
        break;
    case 110:
        window.ShowProperties();
        break;   
    case 120:
        window.ShowConfigure();   
        break;   
   }
    _menu.Dispose();   
    return true;   
}   

var timer;

function get_files_if_loaded(){
    fff = 0;
    timer && window.ClearInterval(timer);
    timer = window.SetInterval(function() {
        get_files_from_dir(artist_folder_path(artist));
        if (!g_img && images.length > 0) next_image(0);
       
        if (found > 0 && images.length == found && g_img) {
            window.ClearInterval(timer);     
        }
    }, 500 );
}

var set_cycle = false;

function on_key_down(vkey) {
    if (vkey == 16){
        set_cycle = true;
        dis_set();
        window.Repaint();
    }
}

var cycle_timer, step = 0;

function set_cycle_timer(){
    cycle_timer && window.ClearInterval(cycle_timer);
    cycle_timer = window.SetInterval(function() {
        step =  set_cycle ? 0 : step + 1;
        if (cycle > 0 && step >= cycle){
            if (images.length > 1){
                next_image(1);
                window.Repaint();
                step = 0;
            }
        }
    window.Repaint();
    }, 1000 );
}

var dis_timer, dis = 0;

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 delay = false;

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

var ftimer;

function fader_timer(){
    fader = 0;
    ftimer && window.ClearInterval(ftimer);
    ftimer = window.SetInterval(function() {
    fader = fader + fade_step;
        if (fader >= 255) {
            fader= 255;
            window.ClearInterval(ftimer);
        }
    window.Repaint();
    }, 10 );
}

function load_last_fm_logo(){
    if(!fso.FileExists(script_path + "last_fm_logo.jpg")) {
        var url = "http://www.last.fm/static/images/logo_beta.png?eb6d3ca20e73"
        var file = "\"" + script_path + "last_fm_logo.jpg" + "\"";
        WshShell.Run(vbs + " " + url + " " + file, false);
        var url = "http://static-web.last.fm/static/images/favicon.702b239b6194.ico"
        var file = "\"" + script_path + "last_fm_ico.ico" + "\"";
        WshShell.Run(vbs + " " + url + " " + file, false);
    }
}

function create_download_file() {
    try {
        file = fso.CreateTextFile(script_path + "download.vbs" )
       
        var text =   
            "If (WScript.Arguments.Count <> 2) Then" + "\n\r" +   
            "   WScript.Quit" + "\n\r" +
            "End If" + "\n\r" + "\n\r" +   

            "url = WScript.Arguments(0)" + "\n\r" +   
            "file = WScript.Arguments(1)" + "\n\r"  + "\n\r" +   

            "Set objFSO = Createobject(" + '"Scripting.FileSystemObject"' + ")" + "\n\r" +   
            "If objFSO.Fileexists(file) Then" + "\n\r" +   
            "   Set objFSO = Nothing" + "\n\r" +
            "   WScript.Quit" + "\n\r" +
            "End If" + "\n\r" + "\n\r" +   

            "Set objXMLHTTP = CreateObject(" + '"MSXML2.XMLHTTP"' + ")" + "\n\r" +   
            "objXMLHTTP.open " + '"GET"' + ", url,false" + "\n\r" +   
            "objXMLHTTP.send()" + "\n\r" + "\n\r" +   

            "If objXMLHTTP.Status = 200 Then" + "\n\r" +   
            "   Set objADOStream = CreateObject(" + '"ADODB.Stream"' + ")" + "\n\r" +
            "   objADOStream.Open" + "\n\r" +
            "   objADOStream.Type = 1" + "\n\r" +
            "   objADOStream.Write objXMLHTTP.ResponseBody" + "\n\r" +
            "   objADOStream.Position = 0" + "\n\r" +
            "   objADOStream.SaveToFile file" + "\n\r" +
            "   objADOStream.Close" + "\n\r" +
            "   Set objADOStream = Nothing" + "\n\r" +
            "End If" + "\n\r" + "\n\r" +   

            "Set objFSO = Nothing" + "\n\r" +   
            "Set objXMLHTTP = Nothing"   
        ;

        file.WriteLine(text);
        file.Close();
    } catch(e) {};
}

function on_mouse_move(x, y) {
    window.SetCursor(32649);
   
    on_text = x >= txt_x && x < ww - 20 && y  >= txt_y ? true : false;
    on_sb =  x > ww - 20 && y  >= txt_y ? true : false;
    on_pic = !on_text && !on_sb ? true : false;
   
    //if (on_pic && c_selected == selected){ //****
    //    delay = true; //****
    //    fdelay(); //****
    //    if (x > pic_posx) next_image(1); //****
    //    if (x < pic_posx) next_image(-1); //****
    //    if (cycle > 0) step = 0; //****
    //} //****
   
    if (on_text_down){
        txt_x = x - delta_x;
        txt_y = y - delta_y;

        txt_x = txt_x <= 0 ? 0 : txt_x >= ww - 50 ? ww - 50: txt_x;
        txt_y = txt_y <= 0 ? 0 : txt_y >= wh - (a_text_row_height + t_margin * 2) ? wh - (a_text_row_height + t_margin * 2) : txt_y;

        get_b_text_array();
    }

    if (on_sb_down && scrollbar && b_text_rows > b_text_visable_rows){
        sb_posy = y + delta_y;
        s_text = y + delta_y >= 0 ? y + delta_y <= (b_text_rows - b_text_visable_rows) * scrollbar_k ? Math.round(sb_posy / scrollbar_k) : b_text_rows - b_text_visable_rows : 0;
        window.Repaint();
    }
}

function on_mouse_wheel(delta) {
    ShiftDown = utils.IsKeyPressed(0x10) ? true : false;
   
    if (on_pic && !ShiftDown && !delay && images.length > 1){
        delay = true;
        fdelay();
        next_image(delta);
        if (cycle > 0) step = 0;
    }
   
    if (on_text && !ShiftDown){
        if (b_text_rows > b_text_visable_rows){
            if (delta < 0) {s_text = b_text_rows - s_text <= b_text_visable_rows ? b_text_rows - b_text_visable_rows : s_text += 1}
            if (delta > 0) {s_text = s_text <= 0 ? 0 : s_text -= 1}
        }
    }
   
    if (on_text && ShiftDown && !delay){
        delay = true;
        fdelay();
        if (delta < 0) {font_size_b = font_size_b <= min_font_size ? min_font_size : font_size_b - 2;};
        if (delta > 0) {font_size_b = font_size_b >= max_font_size ? max_font_size : font_size_b + 2;};
        window.SetProperty("font size: biography", font_size_b);
        get_font();
        calc_text_height();
        get_b_text_array();
    }
   
    if (set_cycle && on_pic) {
        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();
}

//var pic_posx = 0; //****
//var c_selected; //****

function on_mouse_lbtn_down(x,y){
    //on_text = x >= txt_x && x < ww  && y >= txt_y && y <= b_y ? true : false; //****
    //on_sb = x >= txt_x && x < ww && y >= b_y ? true : false; //****
    //on_pic = !on_text && !on_sb ? true : false; //****
   
    //if (on_pic){ //****
    //    pic_posx = x; //****
    //    c_selected = selected; //****
    //} //****
   
    if (on_text){
        on_text_down = true;
        delta_x = x - txt_x;
        delta_y = y - txt_y;
    }
    if (on_sb){
        on_sb_down = true;
        sb_posy = s_text * scrollbar_k;
        delta_y = sb_posy - y;
    }
}

function on_mouse_lbtn_up(x,y){
    window.SetProperty("txt_x", txt_x);
    window.SetProperty("txt_y", txt_y);
    on_text_down = false;
    on_sb_down = false;
   
    //on_pic = false; //****
}

function on_mouse_lbtn_dblclk (x,y){
    if (on_text){
        abc = abc == 1 ? 0 : 1;
        window.SetProperty("abc", abc);
        get_text();
    }
   
    try {
        if (on_pic && images[selected]) WshShell.run( '"' + artist_folder_path(artist)+ "\\" + clean_name(artist) + "_"  + selected + "_" + p_a[select_p_a] + ".jpg" + '"' );
    } catch(e) {}
}

function on_mouse_leave() {
    window.SetCursor(32512);
}

function on_size(){
    ww = window.Width;   
    wh = window.Height;
   
    txt_x = window.GetProperty("txt_x");
    txt_y = window.GetProperty("txt_y");

    txt_x = txt_x >= ww - 50 && txt_x >= 0 ? ww - 50 : txt_x;
    txt_y = txt_y >= wh - (a_text_row_height + t_margin * 2) && txt_y >= 0 ? wh - (a_text_row_height + t_margin * 2) : txt_y;
   
    get_b_text_array();
}

function del_folders(){
    dir = fso.GetFolder(tmp_b_path);
    var e = new Enumerator( dir.SubFolders );
    try {
        for(; !e.atEnd(); e.moveNext() ) {
            var name = e.item().Name;
            if (name.indexOf("_download") < 0){
                if (name.indexOf(clean_name(artist)) < 0){
                    fso.deleteFolder(tmp_b_path + name);
                }
            }   
        }
    } catch(e) {};
}

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: // adjust top - left
        var sw = ww / img.Width;
        var sh = wh / img.Height;
        var s = Math.min(sw, sh);
       
        var x = 0;
        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 3: // 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);
         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: // 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 5: // 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 + p_margin;
    size.y = y + p_margin;
    size.width = width - p_margin * 2;
    size.height = height - p_margin * 2;
    size.cx = cx;
    size.cy = cy;
    size.cwidth = cwidth;
    size.cheight = cheight;
   
    return size;
}

function copy_files(){
    var save_images_state = save_images;
    if (!save_images_state) save_images = true;

    var destination_path;
    var tmp_files = files;
    var tmp_artist = artist;
    var tmp_p_a = p_a[select_p_a];
    var tmp_directory_path;
   
    if (path.indexOf('://') > 0 || path.indexOf('youtube') == 0 || path.indexOf('cdda') == 0) {
        tmp_directory_path = fb.ProfilePath + tmp_p_a + "\\";
    } else {
        tmp_directory_path = directory_path + "\\" + tmp_p_a + "\\";
    }   
   
    var nl = "\" + chr(10) + \"";
    var input_box_text = "Copy  " + nl + nl + tmp_artist + " " + tmp_p_a + ".jpg" + nl + "files to";

    var string = input_box(input_box_text, tmp_directory_path, "Foobar 2000");

    if (string){
        destination_path = folder_exists(string);
        if (!destination_path) {
            copy_files();
        } else{
            copy_files_to_folder(destination_path, tmp_files, tmp_p_a);
        }
    }
    save_images = save_images_state;
}

function copy_files_to_folder(p, f, pa){
    if (p.length != "\\"){p = p + "\\"}
    for (i in f) {
        if (f[i].indexOf(pa) > 0){
            try {
                fso.CopyFile (f[i], p  , 1 );
            } catch(e) {}
        }
    }
}

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 clean_path_name(n) {
    return n.replace(/[\/\:\*\?\"\<\>\|]/g,'');
}

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

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

Сообщение #1011 MC Web » 14.05.2016, 17:55

kgena_ua, спасибо за работу.

Заметил одну особенность в версиях после Biography Text && Picture (09032016):
- при прослушивании радиостанций, т.к. последнее время их больше слушаю, иногда начинает подтормаживать индикатор анализатора спектра
- проверяю - выводится 1 фотография исполнителя
- перехожу на другую станцию или переключаюсь на Обложки исполнителя, а потом возвращаюсь обратно
- подтормаживание индикатора пропадает и выводится на этом же исполнителе больше фотографий

С чем это связано, так и не понял...
MC Web
Репутация: 248
С нами: 10 лет 6 месяцев

Сообщение #1012 vladj » 16.05.2016, 10:40

seriousstas, решил спросить тут, ибо ветка подходящая и что-бы не мусорить лишними вопросами на карписи.
В твоей крайней сборке при работе скрипта от marc2003 (био) на разрешении 800х600 кнопки налезают друг на друга.
Как пару левых кнопок переместить ещё полевей. Ведь слева от кнопки корзины есть ещё много места. Посмотри работу
скрипта пож-та при таком разрешении. Потом ещё наверное с твоего позволения спрошу ещё по скрипту некоторые вещи
ибо сборка при подготовке её для машины как - то незаметно, тихой сапой, оказалась в основных на домашнем компе.
vladj M
Аватара
Откуда: Пермский край
Репутация: 427
С нами: 14 лет 1 месяц

Сообщение #1013 seriousstas » 16.05.2016, 21:37

vladj
сборка при подготовке её для машины как - то незаметно, тихой сапой, оказалась в основных на домашнем компе.
аналогично :)
по Марку - под IcarDS - сместил всё вправо под шаблон FSReal и его кнопку слева, что-б не было наложения ..
Меняется здесь (некоторые кнопки подписаны) внутри:
317 function on_size()
.......
del_btn.x = del_btn.w + 50; // button del moving in the X coordinates
по аналогии - другие передвигай ..
Потом ещё наверное с твоего позволения спрошу ещё по скрипту некоторые вещи
спрашивай конечно !
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 1 месяц

Сообщение #1014 vladj » 16.05.2016, 23:38

seriousstas:по аналогии - другие передвигай
Спасибо, тем кто едет на разрешении 800х600 более-менее распределил что-бы не наезжали
Код: Выделить всё
panel.size();
        thumbs.size();
        text.x = 20;
        text.y = np_text ? 52 : panel.h-20;
        text.w = panel.w - 20;
        text.h = panel.h - text.y;
        text.size();
        change_bio_lang_btn.x = panel.w - change_bio_lang_btn.w - 90;
        close_btn.x = panel.w - close_btn.w - 10; // button close bio X coordinates
        show_btn.x = panel.w - show_btn.w - 14; // button show bio X coordinates
        del_btn.x = del_btn.w - 30; // button del moving in the X coordinates
        download_off_btn.x = panel.w - download_off_btn.w - 80;// button download on\off moving in the X coordinates   
        //download_off_btn.x = download_off_btn.w*5 - 25; // button download on\off moving in the X coordinates     
        //change_bio_lang_btn.x = change_bio_lang_btn.w*6;
        showtr_btn.x = panel.w - showtr_btn.w - 200;
        clear_close_btn.x = panel.w - clear_close_btn.w - 140;
        pic_size_aspect_btn.x = pic_size_aspect_btn.w*2-10;
        pic_down_lim_btn.x = pic_down_lim_btn.w*4-10;
        pic_size_selector_btn.x = pic_size_selector_btn.w*6-10;
        cycle_time_btn.x = cycle_time_btn.w*8-10;
vladj M
Аватара
Откуда: Пермский край
Репутация: 427
С нами: 14 лет 1 месяц

Сообщение #1015 seriousstas » 19.05.2016, 01:02

MC Web » 14.05.2016, 17:55
kgena_ua, спасибо за работу.

Заметил одну особенность в версиях после Biography Text && Picture (09032016):
- при прослушивании радиостанций, т.к. последнее время их больше слушаю, иногда начинает подтормаживать индикатор анализатора спектра
- проверяю - выводится 1 фотография исполнителя
- перехожу на другую станцию или переключаюсь на Обложки исполнителя, а потом возвращаюсь обратно
- подтормаживание индикатора пропадает и выводится на этом же исполнителе больше фотографий

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

Сообщение #1016 MC Web » 19.05.2016, 01:09

seriousstas, откатился на версию 09032016, разницу между ней и последними версиями не искал, но эта работает стабильнее, только "подтормаживание" при смене картинок. Что бы этого не было kgena_ua делал изменения, скорее всего с этим связано...
MC Web
Репутация: 248
С нами: 10 лет 6 месяцев

Сообщение #1017 seriousstas » 19.05.2016, 01:19

откатился на версию 09032016
Понял, получается - эта , которая до оптимизации - тормозит "других" ) при смене картинок, а последняя
при переключении трека и произвольно ..
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 1 месяц

Сообщение #1018 MC Web » 19.05.2016, 01:31

В версии 09032016 иногда заметно подтормаживание при смене картинок прокручиванием колесика мыши, а в процессе работы не заметно.
MC Web
Репутация: 248
С нами: 10 лет 6 месяцев

Сообщение #1019 seriousstas » 20.05.2016, 01:05

kgena_ua
Вот снова "словил" . На видео движение строки рывками (это из-за записи), но каждых 3 секунды - полная остановка (в этом и проблема)
и после удаления скрипта - все гладко ... когда вернул скрипт - тоже гладко :
phpBB [media]

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

Сообщение #1020 seriousstas » 24.05.2016, 05:35

Думаю нашел причину .
Дело в function get_files_if_loaded()
При переключении инет-станции в какой-то момент поиск файлов заходит в цикл и начинаются тормоза в зависимости , какой стоит таймер (у меня 3 сек ).
По у молчанию 500мс .
seriousstas
Откуда: Украина , Ивано-Франковск
Репутация: 110
С нами: 9 лет 1 месяц

Пред.След.

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