Скрипты для foo_uie_wsh_panel_mod

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

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

Сообщение #541 kgena_ua » 27.11.2015, 19:07

Hi, zeremy, glad to see you.
I know your script. I used your achievements. You use a script common8 ("% fb2k_profile_path% marc2003 \ common8.js"), but it is too complicated for me.
and I can not download from www.hydrogenaud, always 404.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет

Сообщение #542 MC Web » 27.11.2015, 19:26

kgena_ua, пытался заставить этот скрипт lastfm_bio.vbs загружать на русском - не получается.

zeremy, спасибо за скрипт, но почему то на русском языке не грузит, хотя на основе:

Код: Выделить всё
// ==PREPROCESSOR==
// @name "Biography Text theaudiodb.com"
// @author "zeremy"
// @import "%fb2k_profile_path%marc2003\common8.js"
// @feature "v1.4"
// @feature "watch-metadb"
// ==/PREPROCESSOR==

!!! Сравнил Ваш и marc2003
Изображение
MC Web
Репутация: 248
С нами: 10 лет 8 месяцев

Сообщение #543 Гость » 27.11.2015, 22:02

тащемта марк давно все переписал https://github.com/19379/js-marc2003/releases
Гость
Гость

Сообщение #544 kgena_ua » 28.11.2015, 17:59

MC Web, с утра решил заняться common8.js от marc2003 по поводу биографии из www.last.fm
(просто иногда какая-нибудь идея возникнет, и не могу успокоится :smile:).
Получился такой скоипт. Переключение языка через меню по пр.кл.
Гость, я согласен, по биографии на WSH есть вполне работающие скрипты, я просто решил сделать что-то простое - скопировал - вставил.

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

function RGB(r,g,b) { return (0xff000000|(r<<16)|(g<<8)|(b)); }

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

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 bgcolor = RGB(50,50,50);
var a_color = RGB(150,150,150);
var b_color = RGB(255,255,230);

var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
var doc = new ActiveXObject("htmlfile");   

var abc = "";

var artist, old_artis;
var text = "", response = "";
var data = ""; b_text = "";

var col = 20;   
var r_margin = 10;   
var row = 50;   
var b_text_row_height0;   
var b_text_rows = 0;   
var b_text_height = 0;   

var s = 0;   
var strings_array = [];   
var b_text_array = [];   

var metadb;   
on_item_focus_change();   

function on_paint(gr){   
   !window.IsTransparent && gr.FillSolidRect(0, 0, ww, wh, bgcolor);
       
    gr.GdiDrawText(artist, a_font, a_color, col, 10, ww - 20, wh, DT_LEFT | DT_WORD_ELLIPSIS );   

    for (var i = 0; i < b_text_height; i++) {   
        gr.GdiDrawText(b_text_array[i + s], b_font, b_color, col, row + b_text_row_height * i, ww, wh, DT_LEFT );   
    }      
}   

function on_mouse_wheel(delta) {   
    if (b_text_rows > b_text_height){   
        if (delta < 0) {s = b_text_rows - s <= b_text_height ? b_text_rows - b_text_height : s += 1}   
        if (delta > 0) {s = s <= 0 ? 0 : s -= 1}   
        window.Repaint();   
    }   
}   

function on_mouse_move(x, y) {
    on_mouse = true;
    window.SetCursor(32649);
    window.Repaint();
}

function on_mouse_leave() {
    on_mouse = false;
    window.SetCursor(32512);
    window.Repaint();
}

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

function on_item_focus_change() {   
    text = "";   
   metadb = fb.IsPlaying ? fb.GetNowPlaying() : fb.GetFocusItem();
    if (metadb) on_metadb_changed();   
}   

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

function on_metadb_changed() {
    artist = Eval("%artist%");
    if (artist != old_artis){
        response = "";
        get();
        old_artis = artist;
    }
    window.Repaint();
}

function get(){
    if (artist == "" || artist == "?") {get_b_text_array(); return};

    var url2 = ("http://www.last.fm/" + abc + "music/" + encodeURIComponent(artist) + "/+wiki");
    xmlhttp.open("GET", url2, true);
    xmlhttp.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
    xmlhttp.send();
    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState == 4) {
            if (xmlhttp.status == 200) {
                text = xmlhttp.responsetext;

                doc.open();      
                var div = doc.createElement("div");      
                div.innerHTML = this.xmlhttp.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;
                    } else {
                        text = "";
                    }   
                }      
                doc.close();

                get_b_text_array();
                window.Repaint();
            }
        }
    }
}

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() {
    s = 0;
    strings_array = [];
    b_text_array = [];

    ww = window.Width; 
   
    temp_bmp = gdi.CreateImage(1, 1);
    temp_gr = temp_bmp.GetGraphics();

    b_text_row_height = temp_gr.CalcTextHeight("text", b_font)

    if(text) strings_array = temp_gr.EstimateLineWrap(text, b_font, ww - col - r_margin).toArray();

    for (var i = 0; i < strings_array.length; i += 2) {
        b_text_array.push(strings_array[i]);
    }
               
    b_text_rows = b_text_array.length;
    b_text_height = Math.ceil((wh - row - 20) / b_text_row_height);
   
    temp_bmp.ReleaseGraphics(temp_gr);
    temp_bmp.Dispose();
    temp_gr = null;
    temp_bmp = null;
}

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

    MF_ENABLED = 0x00000000;
    MF_GRAYED = 0x00000001;
   
    _menu.AppendMenuItem(MF_ENABLED, i++, "EN text");
    _menu.AppendMenuItem(MF_ENABLED, i++, "RU text");
   
    ShiftDown = utils.IsKeyPressed(0x10) ? true : false;
   
//    if (ShiftDown) {
        _menu.AppendMenuItem(0x00000800, 0, 0);
        _menu.AppendMenuItem(0x00000000, 10, "Reload");
        _menu.AppendMenuItem(0x00000800, 0, 0);
        _menu.AppendMenuItem(0x00000000, 20, "Properties");
        _menu.AppendMenuItem(0x00000000, 30, "Configure ...");
//    }

    ret = _menu.TrackPopupMenu(x,y);

    switch (ret) {
    case 1:   
        if (metadb)
            abc = "";{get();
            window.Repaint();
        }
        break;
    case 2:
        if (metadb) {get();
            abc = "ru/";
            get();
        }
        window.Repaint();
        break;
    case 10:
        window.Reload();
        break;
    case 20:
        window.ShowProperties();
        break;   
    case 30:
        window.ShowConfigure();      
        break;
   }
    _menu.Dispose();
    return true;
}
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет

Сообщение #545 MC Web » 28.11.2015, 18:52

kgena_ua, спасибо, хорошо работает !!!
Не знаю правда, надолго ли. Все от last.fm зависит. :smile:
Осталось добавить "бесследную" загрузку картинок и было бы замечательно.
MC Web
Репутация: 248
С нами: 10 лет 8 месяцев

Сообщение #546 vladj » 28.11.2015, 19:39

MC Web:Осталось добавить "бесследную" загрузку картинок и было бы замечательно
Я уже спрашивал на писикаре ...сказали невозможно, а автор скрипта и слышать не хочет про это.
Хорошо что на обычный винт био грузит, почиситить просто. Скоро планшет прийдёт...вот тут я задумаюсь
уже грузить-ли картинки в его память этим скриптом. Прикольно конечно слушать инет радио и видеть картинки
исполнителя, но столько скапливается...
vladj M
Аватара
Откуда: Пермский край
Репутация: 427
С нами: 14 лет 2 месяца

Сообщение #547 iprad » 04.12.2015, 11:09

Всем доброго.
Возник такой вопросик...
Пробую сейчас оптимизировать использование ресурсов в скинах, и попал в тупик.
Грузим изображение:
Код: Выделить всё
img_bg_preload = gdi.Image(pathTheme +  "images\\bg_preload.png");
Отрисовываем. Вроде всё нормально. Однако на поверку оказывается, что всё не так хорошо:
ЦП - 50% Память - 39 000 кб. Такой способ начинает интенсивно использовать процессор
Добавляем строку:
Код: Выделить всё
 img_bg_preload = img_bg_preload.Resize(img_bg_preload.Width,img_bg_preload.Height);
ЦП - 24% Память - 215 000 кб.
Использование процессора уменьшается на 50%, но... потребляемая память увеличивается в 5 раз !!!
Плюс время на выполнение Resize. В итоге, если скин делать с быстрой загрузкой - начинаются тормоза при работе, медленная загрузка- очень долго грузится, но работает без тормозов.
Что посоветуете? Или может есть другой вариант это обойти?
iprad M
Аватара
Репутация: 89
С нами: 11 лет 1 месяц

Сообщение #548 InFive » 08.12.2015, 23:03

Имею две строки состояния... первая - стандартная, внизу экрана, хочу её убрать, а оставить только вторую строку состояния, в виде WSH-панели она сделана, которая выше стандартной...
стандартную та легко убрать, но она выполняет несколько важных функций
  1. показывает информацию о вопроизводимом треке
  2. при двойном клике по стандартной строке состояния происходит переход в плейлист, откуда вопроизводится текущий трек
  3. показывает сообщения когда бегаешь по строке меню
  4. на ней вызывается контекстное меню
самое важное для меня - это инфа о треке (1) и переход в плейлист (2), (3) тоже полезно... вот и вопрос - в скрипте для WSH-панели можно ли прописать хотя бы, чтобы WSH строка состояния реагировала на двойной клик мышки для перехода в плейлист, откуда вопроизводится текущий трек?

код WSH-панели строки состояния
Спойлер
// Used in window.GetColorDUI()
var ColorTypeDUI = {
text: 0,
background: 1,
highlight: 2,
selection: 3
};

var DT_CENTER = 0x00000001;
var DT_NOPREFIX = 0x00000800;
var g_syscolor = 0;

function get_colors() {
g_textcolor_sel = window.GetColorDUI(ColorTypeDUI.selection);
g_textcolor = window.GetColorDUI(ColorTypeDUI.text);
g_textcolor_hl = window.GetColorDUI(ColorTypeDUI.highlight);
g_backcolor = window.GetColorDUI(ColorTypeDUI.background);
g_syscolor = utils.GetSysColor(15);

}
get_colors();

function FormatTimeLong(duration) {
var rs = duration.toString();
switch (rs.length) {
case 4:
rs = "00:0" + rs;
break;
case 5:
rs = "00:" + rs;
break;
case 7:
rs = "0" + rs;
break;
}
return rs;
}

function PrefixTimeLong(duration) {
var rs = duration.toString();
switch (rs.length) {
case 4:
rs = "00:0";
break;
case 5:
rs = "00:";
break;
case 7:
rs = "0";
break;
}
return rs;
}

//Time formatting secondes -> 0:00
function TimeFmt(t){
var zpad = function(n){
var str = n.toString();
return (str.length<2) ? "0"+str : str;
}
var h = Math.floor(t/3600); t-=h*3600;
var m = Math.floor(t/60); t-=m*60;
var s = Math.floor(t);
if(h>0) return h.toString()+":"+zpad(m)+":"+zpad(s);
return m.toString()+":"+zpad(s);
}

//Text formatting function
function StringFormat() {
var h_align = 0,
v_align = 0,
trimming = 0,
flags = 0;
switch (arguments.length) {
// fall-thru
case 4:
flags = arguments[3];
case 3:
trimming = arguments[2];
case 2:
v_align = arguments[1];
case 1:
h_align = arguments[0];
break;
default:
return 0;
}
return ((h_align << 28) | (v_align << 24) | (trimming << 20) | flags);
}

StringAlignment = {
Near: 0,
Centre: 1,
Far: 2
};

var l_stringformat = StringFormat(StringAlignment.Near, StringAlignment.Centre);
var c_stringformat = StringFormat(StringAlignment.Centre, StringAlignment.Centre);
var r_stringformat = StringFormat(StringAlignment.Far, StringAlignment.Centre);

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


var len = fb.Titleformat("%length%");
var elap = fb.TitleFormat("%playback_time%");
var elap_seconds = 0;
var remain = fb.TitleFormat("%playback_time_remaining%");
var len_seconds = 0;
var g_timer;
var refresh_timer=500;

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

var ww;
var wh;

var pad_x=5;

var font1 = gdi.Font("alarm clock", 21, 0);//"Logostile", 18, 0
var font2 = gdi.Font("lucida console", 12, 0);
var tf_colour = g_backcolor ;
var pointille_colour = g_backcolor ;

var tf_playbacktime;
var tf_playbacktime_remaining;
var tf_length;

var tf_codec;
var tf_bitrate;
var tf_samplerate;
var tf_channels;
var tf_info;

// colors (screen infos)
var techinfo_color = g_syscolor;
var techinfobox_color_dark = g_textcolor&0xfacccccc;

function on_size() {
window.MinHeight = window.MaxHeight = 21;
ww = window.Width;
wh = 21;
refresh_timer = (fb.PlaybackLength>0)?(Math.floor(len_seconds/60)*25):50;
if (refresh_timer<20) refresh_timer=20;
refresh_timer=500;
refresh_TF_info();
}

function on_paint(gr) {
var i;
var box_width;

// background
gr.FillSolidRect(0, 0, ww, wh, g_syscolor);
// Track Info
gr.SetTextRenderingHint(5);

gr.GdiDrawText(FormatTimeLong(tf_playbacktime), font1, tf_colour, 5, 0, ww-10, wh, 0x00000000 | DT_NOPREFIX);//левый таймер

gr.GdiDrawText(FormatTimeLong(tf_length), font1, tf_colour, 5, 0, ww-11, wh, 0x00000002 | DT_NOPREFIX);// правый

// tech info at bottom
gr.SetSmoothingMode(2);
if (fb.IsPlaying || fb.IsPaused) {

gr.FillSolidRect(90, 20, ww-180, wh, g_syscolor);

box_width = (ww-pad_x*2-180) / 4;
gr.FillRoundRect(91+pad_x-0+(0*box_width), wh-20, box_width-5, 20, 3, 3, techinfobox_color_dark);
gr.GdiDrawText(tf_codec, font2, techinfo_color, Math.round(91+pad_x+(0*box_width)), wh-16, box_width-3, 14, DT_CENTER);

gr.FillRoundRect(91+pad_x-0+(1*box_width), wh-20, box_width-5, 20, 3, 3, techinfobox_color_dark);
gr.GdiDrawText(tf_bitrate, font2, techinfo_color, Math.round(91+pad_x+(1*box_width)), wh-16, box_width-3, 14, DT_CENTER);

gr.FillRoundRect(91+pad_x-0+(2*box_width), wh-20, box_width-5, 20, 3, 3, techinfobox_color_dark);
gr.GdiDrawText(tf_samplerate, font2, techinfo_color, Math.round(91+pad_x+(2*box_width)), wh-16, box_width-3, 14, DT_CENTER);

gr.FillRoundRect(91+pad_x-0+(3*box_width), wh-20, box_width-5, 20, 3, 3, techinfobox_color_dark);
gr.GdiDrawText(tf_channels, font2, techinfo_color, Math.round(91+pad_x+(3*box_width)), wh-16, box_width-3, 14, DT_CENTER);

}
gr.SetSmoothingMode(0);

}

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

// ==============================================================/ Playback Stop
function on_playback_stop(reason)
{
if(reason==0) // Stop
{
percent=0;
if(g_timer){
window.KillTimer(g_timer);
}
refresh_TF_info();
window.Repaint();
}
}

// ==============================================================/ Playback Pause
function on_playback_pause(state)
{
window.Repaint();
}

// ==============================================================/ Playback Time
function on_playback_time(time) {
refresh_TF_info();
window.RepaintRect(0, 0, 100, 20);//();Rect(91+pad_x, 0, ww-pad_x*2, 20);
}

// ==============================================================/ New Track
function on_playback_new_track(info) {
refresh_TF_info();

refresh_timer=Math.floor(len_seconds/60)*25;
if (refresh_timer<50) refresh_timer=50;
refresh_timer=500;
//if(fb.PlaybackLength>0) g_timer = window.CreateTimerInterval(refresh_timer);
//window.Repaint();
CollectGarbage();
}

function refresh_TF_info() {

tf_playbacktime = "";
if(fb.IsPlaying || fb.IsPaused)
{
tf_playbacktime = fb.TitleFormat("$if2(%playback_time%,0:00)").Eval(true);
elap_seconds = fb.TitleFormat("%playback_time_seconds%").Eval(true);
} else {
tf_playbacktime = "";
elap_seconds = 0;
}
if(fb.PlaybackLength>0)
{
tf_playbacktime_remaining = fb.TitleFormat("$if2(%playback_time_remaining%,0:00)").Eval(true);
tf_length = fb.TitleFormat("$if2(%length%,0:00)").Eval(true);
len_seconds = fb.Titleformat("%length_seconds%").Eval(true);
tf_codec = fb.TitleFormat("%__codec%").Eval(true);
tf_bitrate = fb.TitleFormat("$if(%__bitrate_dynamic%,$if(%_isplaying%,$select($add($mod(%_time_elapsed_seconds%,2),1),%__bitrate_dynamic%,%__bitrate_dynamic%),%__bitrate_dynamic%),%__bitrate%)' Kb/s'").Eval(true);
tf_samplerate = fb.TitleFormat("%__samplerate%' Hz'").Eval(true);
tf_channels = fb.TitleFormat("$if($stricmp($codec(),MP3),$get(space2)$caps(%__mp3_stereo_mode%),$if(%__channels%,$ifgreater(%__channels%,1,Stereo,Mono),$if($strcmp(%__channels%,4),4 Ch,$sub(%__channels%,1)'.1' Ch)))").Eval(true)

} else {
tf_playbacktime_remaining = "";
tf_length = "";
tf_codec = "";
tf_bitrate = "";
tf_samplerate = "";
tf_channels = "";
len_seconds = 0;
}
}

function on_playback_dynamic_info() {
tf_bitrate = fb.TitleFormat("$if(%__bitrate_dynamic%,$if(%_isplaying%,$select($add($mod(%_time_elapsed_seconds%,2),1),%__bitrate_dynamic%,%__bitrate_dynamic%),%__bitrate_dynamic%),%__bitrate%)' Kb/s'").Eval(true);
window.RepaintRect(pad_x,wh-18,ww-pad_x*2,30);
}
скриншот
Спойлер
foobar.jpg
панели строки состояния
InFive
Репутация: 2
С нами: 8 лет 4 месяца

Сообщение #549 kgena_ua » 09.12.2015, 13:11

InFive:реагировала на двойной клик мышки для перехода в плейлист, откуда вопроизводится текущий трек
InFive, например при двойном нажатии на лев.кл.
Код: Выделить всё
function on_mouse_lbtn_dblclk(x,y) {
    fb.RunMainMenuCommand('View/Columns playlist/Activate now playing');
}
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет

Сообщение #550 InFive » 09.12.2015, 22:23

kgena_ua:например при двойном нажатии на лев.кл.
Код:
function on_mouse_lbtn_dblclk(x,y) {
    fb.RunMainMenuCommand('View/Columns playlist/Activate now playing');
}
я добавил ее в код WSH-панели, затем запустил песню, затем перешел в другой плейлист, делаю двойной клик мышкой по панели, но тут же переход в плейлист, откуда происходит воспроизведение песни, не происходит, а при двойном клике на стандартной строке состояния происходит... не похоже на то, чтобы такой переход совершался засчет вызова/активации команды главного меню...

хотелось бы, чтобы по двойному клику происходил переход в плейлист, а не активация команды главного меню...
InFive
Репутация: 2
С нами: 8 лет 4 месяца

Сообщение #551 kgena_ua » 09.12.2015, 22:42

InFive, только что проверил. Взял "код WSH-панели строки состояния", нормально работает, тем более я ничего нового не написал - это простая команда.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет

Сообщение #552 vladj » 09.12.2015, 22:53

InFive, интерфейс DUI...щёлкни правой возле твоих кнопок, Customise Buttons, справа выбери опцию Viev/Show Nov Playing,
пониже щёлкни по ADD (добавить). Появится в том ряду кнопочка, которой ты будешь переходить к играющему треку.
У тебя там много места правей кнопок, можешь любые надобавлять, имхо.
vladj M
Аватара
Откуда: Пермский край
Репутация: 427
С нами: 14 лет 2 месяца

Сообщение #553 kgena_ua » 09.12.2015, 23:04

Да, vladj, а я то на CUI проверял.
Тогда наверное
fb.RunMainMenuCommand('Viev/Show Nov Playing');
должно сработать.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет

Сообщение #554 InFive » 10.12.2015, 00:17

vladj:У тебя там много места правей кнопок, можешь любые надобавлять
спасибо, кнопку сделал, но я привык за годы кликать мышкой для этого, да и эта сборка программа экспериментальная, в основной программе кнопок поболее...

kgena_ua:Тогда наверное
fb.RunMainMenuCommand('View/Show Nov Playing');
оказалось дело в русском интерфейсе, прописал по русски
Код: Выделить всё
fb.RunMainMenuCommand('Вид/Перейти к текущему треку');
и теперь переходить по двойному клику... здорово...

вот теперь если я скрою стандартную строку состояния, где бы теперь сделать, чтобы выводились подсказки комманд из строки меню?
в этой второй строке состояния никак?
InFive
Репутация: 2
С нами: 8 лет 4 месяца

Сообщение #555 kgena_ua » 10.12.2015, 18:54

Загрузка картинок с last.fm.
"бесследную" загрузку картинок сделать не получается.
Как вариант, создается папка tmp_Biography, где будут картинки только для одного, выбранного в данный момент, исполнителя.
Пока только тест.
Дополнительно ничего не надо ставить.
Код: Выделить всё
// ==PREPROCESSOR==                  
// @name "Picrure. www.last.fm"                  
// @feature "v1.4"                  
// @feature "watch-metadb"   
// ==/PREPROCESSOR==                  

function RGB(r,g,b) { return (0xff000000|(r<<16)|(g<<8)|(b)); }                  

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

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 bgcolor = RGB(40,40,40);
var a_color = RGB(255,255,230);
var b_color = RGB(255,255,230);

var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
var doc = new ActiveXObject("htmlfile");
var fso = new ActiveXObject("Scripting.FileSystemObject");
var objADOStream = new ActiveXObject("ADODB.Stream");

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

var artist, old_artis;
var files = [], selected = 0;

var col = 20;
var row = 50;

var limit = window.GetProperty("limit",5);

var metadb;
on_item_focus_change();

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

    if(fso.FileExists(tmp_b_path + files[selected]) ) {
        g_img = gdi.Image(tmp_b_path + files[selected]); 

        var scale_w = ww / g_img.Width;
        var scale_h = wh / g_img.Height;
        var scale = Math.min(scale_w, scale_h);
        var pos_x = 0;
        var pos_y = 0;

        if (scale_w < scale_h) pos_y = (wh - g_img.Height * scale) / 2;
        else if (scale_w > scale_h) pos_x = (ww - g_img.Width * scale) / 2;
   
        g_img = g_img.CreateRawBitmap();
        gr.GdiDrawBitmap(g_img, pos_x, pos_y, g_img.Width * scale, g_img.Height * scale, 0, 0, g_img.Width, g_img.Height);
    }

    gr.GdiDrawText(artist, a_font, bgcolor, col + 1, 10 + 2, ww - col + 1, wh + 2, DT_LEFT | DT_WORD_ELLIPSIS );   
    gr.GdiDrawText(artist, a_font, a_color, col, 10, ww - col, wh, DT_LEFT | DT_WORD_ELLIPSIS );
   
    gr.GdiDrawText(selected + 1 + " (" + files.length + ")", a_font, bgcolor, col + 1, 30 + 2, ww - col + 1, wh + 2, DT_LEFT | DT_WORD_ELLIPSIS );   
    gr.GdiDrawText(selected + 1 + " (" + files.length + ")", a_font, a_color, col, 30, ww - col, wh, DT_LEFT | DT_WORD_ELLIPSIS );   

}   

function on_mouse_wheel(delta) {   
    if (delta < 0) {selected = selected <= 0 ? files.length - 1 : selected -= 1}   
    if (delta > 0) {selected = selected >= files.length - 1 ? 0 : selected += 1}   
    window.Repaint();
}

function on_mouse_move(x, y) {
    on_mouse = true;
    window.SetCursor(32649);
    window.Repaint();
}

function on_mouse_leave() {
    on_mouse = false;
    window.SetCursor(32512);
    window.Repaint();
}

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

function on_item_focus_change() {   
   metadb = fb.IsPlaying ? fb.GetNowPlaying() : fb.GetFocusItem();
    if (metadb) on_metadb_changed();   
}   

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

function on_metadb_changed() {
    artist = Eval("%artist%");
    if (artist != old_artis){
     try {
        fso.deleteFile(tmp_b_path + "*.*" );
    } catch(e) {};
        get();
        selected = 0;
        old_artis = artist;
    }
    //window.Repaint();
}

function get(){
    if (artist == "" || artist == "?") {return};
   
    var url = ("http://www.last.fm/music/" + encodeURIComponent(artist) + "/+images");
    xmlhttp.open("GET", url, true);
    xmlhttp.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
    xmlhttp.send();
    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState == 4) {
            if (xmlhttp.status == 200) {
                doc.open();
              var div = doc.createElement("div");
              div.innerHTML = xmlhttp.responsetext;
              var data = div.getElementsByTagName("img");
              var urls = [];
                for (i = 0; i < data.length; i++) {
                 if (data[i].src.indexOf("http://img2-ak.lst.fm/i/u/60x60/") == 0) urls.push(data[i].src.replace("60x60", "ar0"));
                }
              for (i = 0; i < Math.min(urls.length, limit); i++) {
                    get_p(urls[i],i);
                }
              doc.close();
                get_files_from_dir();

            } else {
                artist = ""
            }
            window.Repaint();
        }
    }
}

function get_p(url, i){
    if(!fso.FileExists(tmp_b_path + i + ".jpg") ) {
        xmlhttp.open("GET", url, true);   
        xmlhttp.send();   
          //xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState == 4) {
            if (xmlhttp.status == 200) {   
               var objADOStream = new ActiveXObject("ADODB.Stream");
               objADOStream.Open;
               objADOStream.Type = 1;
               objADOStream.Write(xmlhttp.ResponseBody);
               objADOStream.Position = 0;
                try {
                   objADOStream.SaveToFile(tmp_b_path + i + ".jpg");
                } catch(e) {};

               objADOStream.Close;
            //}   
            }
        }
    }
}

function get_files_from_dir() {
    files = [];
    var e = new Enumerator( fso.GetFolder(tmp_b_path).Files );
    while ( !e.atEnd() ) {
        var name = e.item().Name;
        name = name.toLowerCase(name);
        files.push(name);
        e.moveNext();
    }
}

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

    MF_ENABLED = 0x00000000;
    MF_GRAYED = 0x00000001;
   
    _menu.AppendMenuItem(MF_ENABLED, i++, "...");
    _menu.AppendMenuItem(MF_ENABLED, i++, "...");
   
    ShiftDown = utils.IsKeyPressed(0x10) ? true : false;
   
//    if (ShiftDown) {
        _menu.AppendMenuItem(0x00000800, 0, 0);
        _menu.AppendMenuItem(0x00000000, 10, "Reload");
        _menu.AppendMenuItem(0x00000800, 0, 0);
        _menu.AppendMenuItem(0x00000000, 20, "Properties");
        _menu.AppendMenuItem(0x00000000, 30, "Configure ...");
//    }

    ret = _menu.TrackPopupMenu(x,y);

    switch (ret) {
    case 1:
        break;
    case 2:
        break;
    case 10:
        window.Reload();
        break;
    case 20:
        window.ShowProperties();
        break;       
    case 30:   
        window.ShowConfigure();   
        break;   
   }
    _menu.Dispose();   
    return true;   
}
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет

Сообщение #556 MC Web » 10.12.2015, 19:53

kgena_ua, спасибо, интересно.
Только сравнил с marc2003 (его панель справа), не все изображения показывает.
Скриншот
Изображение
Нажимаешь Reload - ошибка:
Код: Выделить всё
Ошибка: Панель WSH (модуль) (Picrure. www.last.fm): Ошибка выполнения Microsoft JScript:
Объект не поддерживает это свойство или метод
File: <main>
Ln: 235, Col: 9
<source text only available at compile time>
WSH Panel Mod (Picrure. www.last.fm): initialized in 19 ms
WSH Panel Mod (Picrure. www.last.fm): initialized in 17 ms
После перезапуска WSH Panel Mod начинает показывать.

Я сделал немного по другому: фото "бесследно качает" foo_uie_biography (правда одно), а для биографии использую Ваш скрипт WSH Biography Text Last.fm.
Получилось так и еще разделителем можно регулировать пропорции полей фото / текст:
Скриншот
Изображение
MC Web
Репутация: 248
С нами: 10 лет 8 месяцев

Сообщение #557 Aum » 10.12.2015, 21:28

Хелп!))
Задача: при нажатии на кнопку - очистить существующее выделение в текущем плейлисте, затем выделить все треки, затем вывести свойства всех выделенных треков.
Как задать значение массива [0] = всем трекам плейлиста? Или другие варианты?

Код: Выделить всё
var pl = plman.ActivePlaylist;
plman.ClearPlaylistSelection(pl);

plman.SetPlaylistSelection(pl, [0], true);

var sel_pl = plman.GetPlaylistSelectedItems(pl);
     
fb.RunContextCommandWithMetadb('Properties',sel_pl);
Aum M
Аватара
Репутация: 20
С нами: 14 лет 1 месяц

Сообщение #558 kgena_ua » 11.12.2015, 12:44

Aum, может такое подойдет:
Код: Выделить всё
function on_mouse_lbtn_up (x, y){
    var items = plman.GetPlaylistItems(plman.ActivePlaylist);
    plman.ClearPlaylistSelection(plman.ActivePlaylist);

    for (var i = 0; i < items.count; i++) {
        plman.SetPlaylistSelectionSingle(plman.ActivePlaylist, i, 1);
    }
       
    fb.RunContextCommandWithMetadb('Properties', plman.GetPlaylistSelectedItems(plman.ActivePlaylist));
}

MC Web, будем работать :smile:
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет

Сообщение #559 Aum » 11.12.2015, 15:14

kgena_ua, спасибо!
Мне понравилась ваша панелька биографии-просто и то что нужно (а картинку можно и правда вывести стандартным био). Но возможно ли добавить условие: если по русски 0, то показать по англицки?)

Народ, а Марка скрипт "биография" (последний с гитхаба) у всех картинки отображает? У меня только текс.
Aum M
Аватара
Репутация: 20
С нами: 14 лет 1 месяц

Сообщение #560 vladj » 11.12.2015, 17:11

Я скрипты беру из сборок, которые выкладываются ТУТ, все проверенные рабочие.
У Марка в основном два скрипта био в ходу, в одной из сборок у меня оба установлены и работают.
На одном есть возможность включить-выключить био, коврик, инфо, в другом картинка, ниже уменьшенные (сколько нашлось),
а Био включается с кнопки и встаёт поверх затемнённой картинки.
vladj M
Аватара
Откуда: Пермский край
Репутация: 427
С нами: 14 лет 2 месяца

Пред.След.

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