Скрипты для foo_uie_wsh_panel_mod

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

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

Сообщение #2761 imfam » 23.08.2020, 17:41

Давай. Тогда конкретно
panel.png
panel.png (10.87 КБ) Просмотров: 5464

Есть две картинки: активная (outputMH.png) и неактивная (output.png) кнопки. По клику на неактивной кнопке переключается вывод и картинки должны меняться так, чтобы оставалась индикация текущего вывода.
imfam M
Откуда: Германия
Репутация: 28
С нами: 10 лет 10 месяцев

Сообщение #2762 AHAPXICT » 23.08.2020, 22:33

imfam, извиняюсь, задержали дела...
imfam:Давай. Тогда конкретно
Да я это и понял ещё по первому вопросу. Нужно что бы кнопка оставалась нажатой как в старой радиоле например. Разные варианты предлагал с точки зрения дизайна, что может выглядеть более выигрышно в данном случае, ну или более простая реализация с тем же эффектом. Но это всё лирика, перейдём к делу. Мне надо рабочий скрипт, в смысле не отрезок как в примере, попробую его отредактировать в Notepad++, потому что в своей сборке не получится запустить без переделки всё равно. Модифицированный не надо, лезть в "кнопки" я не буду, там специальный скрипт отдельный, проще сделать отдельно.
Так будет быстрее, без переписки, и никто никого ждать не будет.
AHAPXICT M
Аватара
Откуда: Киев
Репутация: 252
С нами: 10 лет 4 месяца

Сообщение #2763 imfam » 23.08.2020, 22:46

AHAPXICT, я дал выше ссылку на свою сборку . Там все скрипты: пкм на кнопках. Нужно только свои устройства вывода звука вписать вместо моих, иначе переключать будет нечего.

Кнопки, как на картинке
Код: Выделить всё
// DarkOne v2.1 Control Panel
// Code by T.P Wang and tedGo

// ==PREPROCESSOR==
// @import "%fb2k_path%themes\DarkOne\Others\WSH Scripts\DO Global Script.js"
// @import "%fb2k_path%themes\DarkOne\Others\WSH Scripts\DO Global Button Script.js"
// ==/PREPROCESSOR==

window.MinWidth = 280;

// ----- CREATE BUTTONS --------------------------------------------
var imgPath = fb.foobarPath + "themes\\DarkOne\\Buttons\\Control\\";
var btn_font = gdi.Font("Tahoma", 12, 0);
var r = {normal: imgPath + "output.png", hover: imgPath + "outputMH.png"};
var s = {normal: imgPath + "output.png", hover: imgPath + "outputMH.png"};
var t = {normal: imgPath + "output.png", hover: imgPath + "outputMH.png"};
var u = {normal: imgPath + "output.png", hover: imgPath + "outputMH.png"};

Buttons.DEV = new Button(ww / 2 - 110, 22, 55, 14, r, function(){fb.RunMainMenuCommand("Playback/Device/Preferences...")}, "Output");
Buttons.EXT = new Button(ww / 2 - 55, 22, 55, 14, s, function(){fb.RunMainMenuCommand("Playback/Device/KS : AudioQuest DragonFly");}, "External");
Buttons.SHARED = new Button(ww / 2 + 0, 22, 55, 14, t, function(){fb.RunMainMenuCommand("Playback/Device/WASAPI (shared) : Speakers (Realtek(R) Audio)");}, "Shared");
Buttons.ASIO = new Button(ww / 2 + 55, 22, 55, 14, u, function(){fb.RunMainMenuCommand("Playback/Device/ASIO : Realtek ASIO");}, "ASIO");


// ----- DRAW ------------------------------------------------------
function on_paint(gr) {

   gr.FillSolidRect(0, 0, ww, wh, ui_backcol);

   buttonsDraw(gr);

      var x2 = ww / 2 - 110;
      var x3 = ww / 2 - 55;
      var x4 = ww / 2 + 0;
      var x5 = ww / 2 + 55;
   
    gr.GdiDrawText("Output", btn_font, ui_btntxtcol, x2, 06, 55, 12, 33);
    gr.GdiDrawText("External", btn_font, ui_btntxtcol, x3, 06, 55, 12, 33);
    gr.GdiDrawText("Shared", btn_font, ui_btntxtcol, x4, 06, 55, 12, 33);
   gr.GdiDrawText("ASIO", btn_font, ui_btntxtcol, x5, 06, 55, 12, 33);

}

// ----- EVENTS ----------------------------------------------------
function on_size() {
   ww = window.Width;
   wh = window.Height;

        Buttons.DEV.changePos(ww / 2 - 110, 22, 55, 14);
      Buttons.DEV.alterImage(r);
      Buttons.EXT.changePos(ww / 2 - 55, 22, 55, 14);
        Buttons.EXT.alterImage(s);
      Buttons.SHARED.changePos(ww / 2 + 0, 22, 55, 14);
      Buttons.SHARED.alterImage(t);
      Buttons.ASIO.changePos(ww / 2 + 55, 22, 55, 14);
      Buttons.ASIO.alterImage(u);

   }
      
imfam M
Откуда: Германия
Репутация: 28
С нами: 10 лет 10 месяцев

Сообщение #2764 AHAPXICT » 23.08.2020, 23:16

imfam, к сожалению у меня уже начались проблемы со зрением, это не шутка, сейчас прям в упор смотрел и не заметил с первого раза(задолбал ноут уже..) Кликнул, как выяснилось ссылка не подходит. думаю подойдёт текстовый документ со скриптом или сод-ом вложите в сообщение.
Отлично, код подойдёт
AHAPXICT M
Аватара
Откуда: Киев
Репутация: 252
С нами: 10 лет 4 месяца

Сообщение #2765 imfam » 24.08.2020, 00:08

imfam M
Откуда: Германия
Репутация: 28
С нами: 10 лет 10 месяцев

Сообщение #2766 AHAPXICT » 24.08.2020, 00:27

imfam, как вы поняли вариантов много, сам где-то полгода назад столкнулся с подобной проблемой когда хотел изменения в отображение кнопок внести, вернее там всё привязано к отдельному скрипту, поэтому я пошёл обходным путём. Ну как я заметил у вас всё проще, а у меня все кнопки разные да ещё это зависит от ширины панели и т.д., судя по скрипту всё 55, ну да ладно. Проверил концепт на своей сборке. Удалите не нужные строки из скрипта.
Код: Выделить всё
// DarkOne v2.1 Control Panel
// Code by T.P Wang and tedGo

// ==PREPROCESSOR==
// @import "%fb2k_path%themes\DarkOne\Others\WSH Scripts\DO Global Script.js"
// @import "%fb2k_path%themes\DarkOne\Others\WSH Scripts\DO Global Button Script.js"
// ==/PREPROCESSOR==

window.MinWidth = 280;

var active_device = window.GetProperty("active device buttons", 0);
var button_dev = gdi.Image(imgPath + "outputMH.png");

// ----- CREATE BUTTONS --------------------------------------------
var imgPath = fb.foobarPath + "themes\\DarkOne\\Buttons\\Control\\";
var btn_font = gdi.Font("Tahoma", 12, 0);
var r = {normal: imgPath + "output.png", hover: imgPath + "outputMH.png"};
var s = {normal: imgPath + "output.png", hover: imgPath + "outputMH.png"};
var t = {normal: imgPath + "output.png", hover: imgPath + "outputMH.png"};
var u = {normal: imgPath + "output.png", hover: imgPath + "outputMH.png"};

Buttons.DEV = new Button(ww / 2 - 110, 22, 55, 14, r, function(){active_device = 0, activedevice(), fb.RunMainMenuCommand("Playback/Device/Preferences...")}, "Output");
Buttons.EXT = new Button(ww / 2 - 55, 22, 55, 14, s, function(){active_device = 1, activedevice(), fb.RunMainMenuCommand("Playback/Device/KS : AudioQuest DragonFly");}, "External");
Buttons.SHARED = new Button(ww / 2 + 0, 22, 55, 14, t, function(){active_device = 2, activedevice(), fb.RunMainMenuCommand("Playback/Device/WASAPI (shared) : Speakers (Realtek(R) Audio)");}, "Shared");
Buttons.ASIO = new Button(ww / 2 + 55, 22, 55, 14, u, function(){active_device = 3, activedevice(), fb.RunMainMenuCommand("Playback/Device/ASIO : Realtek ASIO");}, "ASIO");


// ----- DRAW ------------------------------------------------------
function on_paint(gr) {

   gr.FillSolidRect(0, 0, ww, wh, ui_backcol);

   buttonsDraw(gr);

      var x2 = ww / 2 - 110;
      var x3 = ww / 2 - 55;
      var x4 = ww / 2 + 0;
      var x5 = ww / 2 + 55;
/*   
    gr.GdiDrawText("Output", btn_font, ui_btntxtcol, x2, 06, 55, 12, 33);
    gr.GdiDrawText("External", btn_font, ui_btntxtcol, x3, 06, 55, 12, 33);
    gr.GdiDrawText("Shared", btn_font, ui_btntxtcol, x4, 06, 55, 12, 33);
    gr.GdiDrawText("ASIO", btn_font, ui_btntxtcol, x5, 06, 55, 12, 33);
*/
    gr.GdiDrawText("Output", btn_font, active_device == 0 ? RGB(128,192,255) : ui_btntxtcol, x2, 06, 55, 12, 33);
    gr.GdiDrawText("External", btn_font, active_device == 1 ? RGB(128,192,255) : ui_btntxtcol, x3, 06, 55, 12, 33);
    gr.GdiDrawText("Shared", btn_font, active_device == 2 ? RGB(128,192,255) : ui_btntxtcol, x4, 06, 55, 12, 33);
    gr.GdiDrawText("ASIO", btn_font, active_device == 3 ? RGB(128,192,255) : ui_btntxtcol, x5, 06, 55, 12, 33);


    gr.DrawImage(button_dev, ww / 2 - 110 + 55 * active_device, 22, 55, 14, 0, 0, 55, 14, 0, 255); //255 alpha
//    gr.FillSolidRect(ww / 2 - 110 + 54 * active_device, 25, 53, 8, RGBA(19, 30, 38, 150));
//   gr.FillSolidRect(ww / 2 - 74 + 55 * active_device, 28, 38, 2, RGBA(245, 55, 0, 230));
}

// ----- EVENTS ----------------------------------------------------
function on_size() {
   ww = window.Width;
   wh = window.Height;

        Buttons.DEV.changePos(ww / 2 - 110, 22, 55, 14);
      Buttons.DEV.alterImage(r);
      Buttons.EXT.changePos(ww / 2 - 55, 22, 55, 14);
        Buttons.EXT.alterImage(s);
      Buttons.SHARED.changePos(ww / 2 + 0, 22, 55, 14);
      Buttons.SHARED.alterImage(t);
      Buttons.ASIO.changePos(ww / 2 + 55, 22, 55, 14);
      Buttons.ASIO.alterImage(u);

   }
     
function activedevice() {
    window.SetProperty("active device buttons", active_device)
    window.Repaint();
}
imgonline-com-ua-GIF-Animation-aeN1XWyjsdexeR.gif
imgonline-com-ua-GIF-Animation-aeN1XWyjsdexeR.gif (38.51 КБ) Просмотров: 5387
AHAPXICT M
Аватара
Откуда: Киев
Репутация: 252
С нами: 10 лет 4 месяца

Сообщение #2767 imfam » 24.08.2020, 00:52

Спасибо. Теперь уже завтра продолжу.
Сейчас консоль даёт ошибку
Код: Выделить всё
WSH Panel Mod ({B38385B4-7CBE-4019-BB99-8CCE46084548}): Parsing file "C:\Utilities\foobar2000\themes\DarkOne\Others\WSH Scripts\DO Global Script.js"
WSH Panel Mod ({B38385B4-7CBE-4019-BB99-8CCE46084548}): Parsing file "C:\Utilities\foobar2000\themes\DarkOne\Others\WSH Scripts\DO Global Button Script.js"
WSH Panel Mod ({B38385B4-7CBE-4019-BB99-8CCE46084548}): initialized in 3 ms
Error: WSH Panel Mod ({B38385B4-7CBE-4019-BB99-8CCE46084548}): Microsoft JScript runtime error:
Object expected
File: <main>
Ln: 46, Col: 5
<source text only available at compile time>
imfam M
Откуда: Германия
Репутация: 28
С нами: 10 лет 10 месяцев

Сообщение #2768 AHAPXICT » 24.08.2020, 02:30

imfam, не расстраивайтесь, я так и предполагал (что будут косяки). Не помог и тест на своей сборке)) Там всё просто,скачал вашу сборку, посмотрел, решил проблему. Я то не обратил даже внимание, что строка с путём для картинки стоит выше чем imgPath :oops: , ну дальше просто чего-то не хватило))Вот ваш скрипт, проверил на вашей сборке. Подсветку текста мою удалите, свои строки разремте, посмотрите так же как подсведка кнопок работает.(две строки под основной)
Код: Выделить всё
// DarkOne v2.1 Control Panel
// Code by T.P Wang and tedGo

// ==PREPROCESSOR==
// @import "%fb2k_path%themes\DarkOne\Others\WSH Scripts\DO Global Script.js"
// @import "%fb2k_path%themes\DarkOne\Others\WSH Scripts\DO Global Button Script.js"
// ==/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));}

window.MinWidth = 280;

var active_device = window.GetProperty("active device buttons", 0);
// ----- CREATE BUTTONS --------------------------------------------
var imgPath = fb.foobarPath + "themes\\DarkOne\\Buttons\\Control\\";
var button_dev = gdi.Image(imgPath + "outputMH.png");
var btn_font = gdi.Font("Tahoma", 12, 0);
var r = {normal: imgPath + "output.png", hover: imgPath + "outputMH.png"};
var s = {normal: imgPath + "output.png", hover: imgPath + "outputMH.png"};
var t = {normal: imgPath + "output.png", hover: imgPath + "outputMH.png"};
var u = {normal: imgPath + "output.png", hover: imgPath + "outputMH.png"};

Buttons.DEV = new Button(ww / 2 - 110, 22, 55, 14, r, function(){active_device = 0, activedevice(), fb.RunMainMenuCommand("Playback/Device/Preferences...")}, "Output");
Buttons.EXT = new Button(ww / 2 - 55, 22, 55, 14, s, function(){active_device = 1, activedevice(), fb.RunMainMenuCommand("Playback/Device/KS : AudioQuest DragonFly");}, "External");
Buttons.SHARED = new Button(ww / 2 + 0, 22, 55, 14, t, function(){active_device = 2, activedevice(), fb.RunMainMenuCommand("Playback/Device/WASAPI (shared) : Speakers (Realtek(R) Audio)");}, "Shared");
Buttons.ASIO = new Button(ww / 2 + 55, 22, 55, 14, u, function(){active_device = 3, activedevice(), fb.RunMainMenuCommand("Playback/Device/ASIO : Realtek ASIO");}, "ASIO");


// ----- DRAW ------------------------------------------------------
function on_paint(gr) {

   gr.FillSolidRect(0, 0, ww, wh, ui_backcol);

   buttonsDraw(gr);

      var x2 = ww / 2 - 110;
      var x3 = ww / 2 - 55;
      var x4 = ww / 2 + 0;
      var x5 = ww / 2 + 55;
/*   
    gr.GdiDrawText("Output", btn_font, ui_btntxtcol, x2, 06, 55, 12, 33);
    gr.GdiDrawText("External", btn_font, ui_btntxtcol, x3, 06, 55, 12, 33);
    gr.GdiDrawText("Shared", btn_font, ui_btntxtcol, x4, 06, 55, 12, 33);
    gr.GdiDrawText("ASIO", btn_font, ui_btntxtcol, x5, 06, 55, 12, 33);
*/
    gr.GdiDrawText("Output", btn_font, active_device == 0 ? RGB(128,192,255) : ui_btntxtcol, x2, 06, 55, 12, 33);
    gr.GdiDrawText("External", btn_font, active_device == 1 ? RGB(128,192,255) : ui_btntxtcol, x3, 06, 55, 12, 33);
    gr.GdiDrawText("Shared", btn_font, active_device == 2 ? RGB(128,192,255) : ui_btntxtcol, x4, 06, 55, 12, 33);
    gr.GdiDrawText("ASIO", btn_font, active_device == 3 ? RGB(128,192,255) : ui_btntxtcol, x5, 06, 55, 12, 33);


    gr.DrawImage(button_dev, ww / 2 - 110 + 55 * active_device, 22, 55, 14, 0, 0, 55, 14, 0, 255); //Image 255 alpha
//    gr.FillSolidRect(ww / 2 - 110 + 55 * active_device, 25, 55, 8, RGBA(19, 30, 38, 200)); // Down Color
//    gr.FillSolidRect(ww / 2 - 100 + 55 * active_device, 27, 38, 2, RGBA(245, 55, 0, 230)); //Orange light
}

// ----- EVENTS ----------------------------------------------------
function on_size() {
   ww = window.Width;
   wh = window.Height;

        Buttons.DEV.changePos(ww / 2 - 110, 22, 55, 14);
      Buttons.DEV.alterImage(r);
      Buttons.EXT.changePos(ww / 2 - 55, 22, 55, 14);
        Buttons.EXT.alterImage(s);
      Buttons.SHARED.changePos(ww / 2 + 0, 22, 55, 14);
      Buttons.SHARED.alterImage(t);
      Buttons.ASIO.changePos(ww / 2 + 55, 22, 55, 14);
      Buttons.ASIO.alterImage(u);

   }
     
function activedevice() {
    window.SetProperty("active device buttons", active_device)
    window.Repaint();
}
imgonline-com-ua-GIF-Animation-Lx2hIAHUrYV.gif
imgonline-com-ua-GIF-Animation-Lx2hIAHUrYV.gif (21.11 КБ) Просмотров: 5378
AHAPXICT M
Аватара
Откуда: Киев
Репутация: 252
С нами: 10 лет 4 месяца

Сообщение #2769 imfam » 24.08.2020, 10:13

AHAPXICT, задача решена. Скрипт работает и менять ничего не надо. Подсветка текста тоже к месту.
Спасибо!
imfam M
Откуда: Германия
Репутация: 28
С нами: 10 лет 10 месяцев

Сообщение #2770 NikosColev » 04.09.2020, 16:23

Если все компоненты сборки на Spider Monkey Panel, то использовать Biography, albums, title, similar artist info.www.last.fm не получится или есть варианты?

Добавлено спустя 3 часа 29 минут:
Не пойму, а с WSH скрипт точно совместим?
Код: Выделить всё
Scripting Engine Initialization Failed (Biography, albums, title, similar artist info.www.last.fm. v10062020 by kgena_ua, CODE: 0x80020101)
Check the console for more information (Always caused by unexcepted script error).
Код: Выделить всё
WSH Panel Mod ({A59FEF58-89B7-4955-B166-24E7D03BCAF8}): initialized in 49 ms
Error: WSH Panel Mod (Biography, albums, title, similar artist info.www.last.fm. v10062020 by kgena_ua): Ошибка выполнения Microsoft JScript:
Невозможно создание объекта сервером программирования объектов
File: <main>
Ln: 298, Col: 1
<source text only available at compile time>
NikosColev
Аватара
Откуда: net
Репутация: 1
С нами: 17 лет 9 месяцев

Сообщение #2771 Marakobes » 05.10.2020, 19:45

NikosColev, рекомендую Вам использовать https://hydrogenaud.io/index.php?topic=112914.msg978270#msg978270 скрипт заточенный под Spider Monkey Panel

здесь автор не отвечает, и появляется раз в квартал, это вынудило меня искать более продвинутые компоненты, чего и вам советую :wink:

Спойлер
биография

ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ОБЛАДАТЕЛЯМИ АВТОРСКИХ ПРАВ И СОСТАВЛЯМИ «КАК ЕСТЬ», И ЛЮБЫЕ ЯВНЫЕ ИЛИ ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ, ВКЛЮЧАЯ, НЕ ОГРАНИЧИВАясь, ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ КОММЕРЧЕСКОЙ ЦЕННОСТИ И ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ, ОТКАЗЫВАЮТСЯ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ ИЛИ СОСТАВНИКИ НЕ НЕСЕТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ, КОСВЕННЫЕ, СЛУЧАЙНЫЕ, ОСОБЫЕ, ПРИМЕРНЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ЗАКУПКИ ТОВАРОВ ИЛИ УСЛУГ; ПРЕРЫВАНИЕ ДЕЯТЕЛЬНОСТИ), ОДНАКО ВЫЗВАННЫМ И ПО ЛЮБОЙ ТЕОРИИ ОТВЕТСТВЕННОСТИ, ЛИБО ПО КОНТРАКТУ, СТРОГОЙ ОТВЕТСТВЕННОСТИ ИЛИ ПЕРЕДАЧИ (ВКЛЮЧАЯ НЕБРЕЖНОСТЬ ИЛИ Иным образом), ВОЗНИКАЮЩИХ ЛЮБОЙ СПОСОБОМ ИСПОЛЬЗОВАНИЯ ДАННОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, ДАЖЕ ПРЕДНАЗНАЧЕННАЯ ВОЗМОЖНОСТЬ.


ТРЕБОВАНИЯ

Панель Spider Monkey 1.2.2+
IE9 или новее

Необязательно: FontAwesome: https://github.com/FortAwesome/Font-Awesome/blob/ ... ntawesome-webfont.ttf?raw=true. Настоятельно рекомендуется для лучшего рендеринга некоторых кнопок. Если не установлен, затронутые кнопки возвращаются к другому стилю


УСТАНОВКА

Добавьте панель Spider Monkey в макет обычным способом. Щелкните панель Spider Monkey (или щелкните правой кнопкой мыши и выберите «Настроить»), чтобы открыть редактор. Используйте меню "Файл", чтобы импортировать сценарий биографии.


ОБНОВЛЕНИЕ

Shift + щелкните правой кнопкой мыши и выберите настроить. Используйте меню "Файл" для импорта новой версии.


ФУНКЦИИ

Находит и отображает биографии исполнителей и обзоры альбомов с last.fm + allmusic

Получает и отображает фотографии исполнителей с last.fm

Возможность получать и автоматически сохранять обложки для музыкальных файлов в указанном месте (меню> источники> настройки сервера)

Выбирает и отображает обзоры треков с last.fm

Совместимость с пользовательским интерфейсом по умолчанию (DUI) и пользовательским интерфейсом столбцов (CUI)

Поддерживает прозрачность (требуется CUI и разделитель стека панелей или аналогичный)

Универсальный дисплей

Установите предпочтительный исходный порядок

Простые переключатели:

Щелчок левой кнопкой: переключает режим: исполнитель или альбом. Возможность использовать двойной щелчок, если это необходимо (меню> макет> параметры)

Нажатие средней кнопки: переключение между текстом или изображением и двойным режимом (имеется изображение, текст и т. Д.). Переключить также в меню правой кнопки мыши

По умолчанию двойной режим работает в автоматическом стиле. Автоматический стиль можно отключить, чтобы всегда отображать изображение + текст, если это необходимо (меню> макет> параметры)

Автообновление источников и дополнительное принудительное обновление в меню правой кнопки мыши

Для last.fm можно установить язык (меню> источники> язык last.fm)

Стили макета: предустановки для изображения сверху, слева, снизу или справа. Фристайл, позволяющий размещать изображения и текст в любом месте. Возможность создания новых стилей. Нажмите CTRL с указателем мыши, чтобы изменить макеты (панель должна иметь фокус [например, щелкните по ней])

Предустановки темной, смешанной и светлой тем

Сначала сводка - текстовый вариант

Параметры изображения: автоматическое увеличение при наведении указателя мыши, автозаполнение, настраиваемое выравнивание, граница, отражение, точки поиска или полоса и / или счетчик, когда> 1 изображение, тени и эффекты плавного перехода (меню> изображение). Отражение: силу можно регулировать с помощью Shift + колесико мыши над изображением; размер и градиент можно настроить в свойствах панели

Эффекты наложения

Заголовок: включить: меню> макет. Clickable> переключает источник. Поддерживает форматирование заголовков (введите в свойствах панели). Поля, относящиеся к биографии% BIO_ALBUMARTIST%,% BIO_ARTIST%,% BIO_ALBUM% и% BIO_TITLE%, обычно должны использоваться там, где это необходимо, для обеспечения правильного отображения

Рейтинг: опционально показывать рейтинги альбомов last.fm и allmusic в заголовке, на отдельной строке или в тексте

Плавная прокрутка текста

Дискретная полоса прокрутки по умолчанию; можно изменить размер / скрыть. Доступны другие типы полос прокрутки, включая тематические окна. Шаг прокрутки можно настраивать (сенсорные панели, вероятно, лучше всего работают с шагом 1). Для прокрутки страницы щелкните полосу прокрутки, установите шаг прокрутки на страницу или используйте PgDn / PgUp.

Сенсорное управление (включить: меню> макет> параметры)

Для переключения между изображениями можно использовать клавиши со стрелками влево и вправо. PgUp & PgDn работает с текстом. Панель должна иметь фокус и т. Д.

Статистика: опционально отображать скробблы и слушателей last.fm, если они доступны (свойства панели> Статистика Last.fm ...)

Цвета и шрифты: устанавливаются в настройках foobar2000 для DUI или CUI

Размер шрифта: задается шрифтом списка воспроизведения DUI или шрифтом списка CUI. Или используйте наведение мыши с помощью CTRL + колесико мыши, чтобы увеличить размер шрифта (сбрасывается, если размер шрифта пользовательского интерфейса изменился). Заголовок масштабируется независимо

Размер шрифта всплывающей подсказки: устанавливается с помощью «Zoom Tooltip (%)» в свойствах панели.

Дополнительные настраиваемые параметры цвета / шрифта находятся в свойствах панели


СОЗДАВАЙТЕ СТИЛИ И УПРАВЛЯЙТЕ ими (меню> макет)

Поддерживаются два движка стилей

1) Авто. Простой стиль, который используется предустановленными стилями вверху, слева, внизу или справа. Для настройки нажмите CTRL с указателем мыши. Перепозиционирование рассчитывается автоматически. Прокладка> свойства панели. Выравнивание изображения> меню

2) Фристайл. Используется предустановкой стиля наложения. Предлагает стиль перетаскивания изображений и текстовых полей, а также наложение текста. Нажмите CTRL с указателем мыши, чтобы отобразить поля перетаскивания. Эффекты наложения:

Тип наложения: меню> макет> темы
Сила наложения: Shift + колесо мыши над текстом
Прочие настройки наложения: свойства панели («Наложение ...»)

Выравнивание изображения> меню
Отступы> свойства панели [применяется внутри ящиков]

Меню предлагает варианты для создания новых макетов вольного стиля + переименования, удаления и экспорта пользовательских стилей или сброса макетов. Новые макеты для фристайла основаны на текущем макете


КНОПКА БОЛЬШЕ ПРЕДМЕТОВ: ПОДОБНЫЕ ИСПОЛНИТЕЛИ, ТОП-АЛЬБОМЫ И ДОПОЛНИТЕЛЬНЫЕ ТЭГИ (включить: щелкните правой кнопкой мыши> меню> источники)

Выпадающее меню (вверху слева), которое позволяет отображать информацию, относящуюся к текущему элементу:

Похожие исполнители, несколько полей и многозначные теги: получение и отображение биографий и фотографий

Лучшие альбомы: получение и отображение обзоров и изображений для обзора

Формат заголовка может быть установлен для отображения источника информации, если требуется, например

Биография: заголовок, формат заголовка для идентификации похожих или помеченных художников:
$ if2 ($ if (% MORE_ITEM%, [% BIO_ARTIST%: аналогично $ meta (artist, 0)], [% BIO_ARTIST%]), Artist Unknown)

Обзор: формат заголовка для определения лучших альбомов:
$ if2 (% BIO_ALBUMARTIST%, исполнитель неизвестен) $ if2 ($ if (% MORE_ITEM%, [-% BIO_ALBUM% '[' Top Album ']'], [-% BIO_ALBUM%]), - Album Unknown)

% MORE_ITEM% доступен для использования в заголовках. Оценивается как истинное или ложное

Опция автоматического цикла

Можно установить количество отображаемых похожих исполнителей (0-10) ["Меню> Источники> Настройки сервера" (biography.ini)]

Используйте наведение мыши с помощью CTRL + колесико мыши, чтобы увеличить размер кнопки

Техническая информация
Многополевые и многозначные теги расширяют все поля, на которые ссылается "% BIO_ARTIST%" в biography.ini, и включают многозначные значения. Дополнительные поля могут быть добавлены в конце оператора $ if3 и т. Д. Из-за ограничений поиска новые полностью музыкальные биографии не могут быть извлечены, но уже существующие могут быть загружены. Также имеется расширенная опция в «Меню> Источники> Настройки сервера» (biography.ini) для кэширования новых * данных, полученных с помощью кнопки «Дополнительная информация», отдельно от основного места, если это необходимо. Это настраивается путем применения «Найти»> «Заменить» к основным шаблонам сохранения, чтобы сохранить основные шаблоны сохранения. Несколько пар "Найти> Заменить" можно разделить знаком |, например
yttm> yttm \ bio_supplemental | данные пользователя> данные пользователя \ дополнительные
Заменяет:
yttm с yttm \ bio_supplemental &
пользовательские данные с пользовательскими данными \ дополнительными
* основные места сохранения будут по-прежнему использоваться для элементов, обнаруженных как находящиеся в медиатеке, стандартные элементы, такие как воспроизводимые треки и элементы, уже существующие


ЗАМОК

Возможность заблокировать основного исполнителя, альбом и трек текущими. Требуется включить "Меню> Источники> Кнопка" Показать больше элементов ". Переключите блокировку / разблокировку средним нажатием кнопки. Кнопка меняется, показывая состояние блокировки. По-прежнему доступны другие пункты меню, переключатели и т. Д. More flyout также имеет возможность автоматически подключаться при просмотре истории и подобных исполнителей и т. Д.


НЕАКТИВИРОВАТЬ

Биографию можно сделать полностью неактивной. Нет поиска в Интернете. Нет загрузки текста или изображения. Включить: SHIFT + щелчок правой кнопкой мыши> меню> отключить


МЕНЮ (ПРАВЫЙ ЩЕЛЧОК)

Содержит часто используемые настройки. По умолчанию «Вставить текст из буфера обмена» и «Записать теги в выбранные файлы» для отображения требуется нажатие клавиши Shift, а «Списки воспроизведения» не отображаются. Поведение можно изменить в свойствах панели: «Пункты меню ...»


СВОЙСТВА ПАНЕЛИ

Свойства панели также применяются к отдельным панелям биографии и содержат настройки, которые обычно нужно менять нечасто.

Доступ по щелчку правой кнопкой мыши

*** ВСЕГДА ОБЕСПЕЧИВАЙТЕ ЗАПЯТУЮ "," СЕПАРАТОРЫ, ИСПОЛЬЗУЕМЫЕ В СВОЙСТВАХ ПАНЕЛИ ***

Свойства панели можно сбросить до значений по умолчанию, удалив -> применить

Доступность пользовательских значков может зависеть от установленных шрифтов. Шрифт значка можно установить в свойствах панели. Можно вставлять символы шрифта. Рекомендуемые шрифты для значков: Segoe UI Symbol, Segoe MDL2 Assets, FontAwesome, Guifx v2 Transports и Wingdings. Вертикальное смещение и зазор обеспечивают небольшую регулировку, достаточную для точной настройки положения значка.


БИОГРАФИЧЕСКИЙ СЕРВЕР

«Настройки сервера» находятся в biography.ini и применяются ко всем панелям биографии: foobar2000 (profile) \ yttm \ biography.ini

Меню> Источники> Настройки сервера можно использовать для открытия biography.ini.

Содержит настройки, для каких источников следует выполнять автоматическую выборку, переназначение имен, места сохранения и различные прочие и расширенные параметры.


СПАСТИ

Шаблоны сохранения по умолчанию упорядочивают информацию по типу и источнику. Если вы предпочитаете организовывать по исполнителям, можно использовать следующие

[СПАСТИ]
Обзор альбома [Allmusic] Папка =% profile% \ user-data \% BIO_ALBUMARTIST% \ allmusic
Обзор альбома [Lastfm] Folder =% profile% \ user-data \% BIO_ALBUMARTIST% \ lastfm
Биография [Allmusic] Папка =% profile% \ user-data \% BIO_ARTIST% \ allmusic
Биография [Lastfm] Folder =% profile% \ user-data \% BIO_ARTIST% \ lastfm
Изображение [Исполнитель] Папка =% profile% \ user-data \% BIO_ARTIST%
Изображение [Обзор] Папка =% profile% \ user-data \% BIO_ARTIST%


БИОГРАФИИ И ОТЗЫВЫ АЛЬБОМОВ ИСПОЛНИТЕЛЕЙ

Скрипт автоматически обновляет кэшированные данные в соответствии со временем «Истечение срока действия кеша» в biography.ini, если исполнитель или альбом воспроизводятся / выбираются. По умолчанию 28 дней можно легко увеличить до 90-180 + дней. Биографии веб-сайтов развиваются медленно и нечасто, обычно не более 1-2 раз в год для действующих художников и никогда или редко для неактивных художников. Обзоры альбомов: allmusic не меняется и не обновляется автоматически; last.fm периодически меняются. Принудительное обновление в меню, вызываемом правой кнопкой мыши, отменяет время истечения срока действия кэша и немедленно обновляет включенные источники.


ТАМОЖЕННЫЕ БИОГРАФИИ И ОТЗЫВЫ

«SHIFT * + щелкните правой кнопкой мыши> Меню> Источники> Вставить из буфера обмена». Флаг «Пользовательская биография» или «Пользовательский обзор» используется для предотвращения попыток биографии автоматически обновлять любые пользовательские биографии и обзоры, и это следует оставить на месте. «Принудительное обновление» отменяет флаг. Пункты меню отображаются серым цветом в режиме «только изображение» или если отсутствуют данные из буфера обмена или требуемые имена исполнителей / альбомов. * Может быть установлено, что сдвиг не требуется в свойствах панели: «Пункты меню ...»


НАЗВАНИЕ АЛЬБОМА АВТОЧИСТКА (необязательно)

При необходимости удаляет ключевые слова перед поиском в сети, например «Deluxe Version», «[2011 - Remaster]», «Expanded Edition» и многие другие. Улучшает результаты поиска, если такие фразы используются в названиях альбомов. По умолчанию выключено. Включить в biography.ini («РАЗЛИЧНЫЙ ЗАГОЛОВОК»)

Метод поиска, если включен
Охватывает. Сначала выполните поиск по полному названию альбома, так как часто доступны варианты обложки. Если обложка не найдена, ищите, используя вырезанное имя "ядра", если оно отличается. Например, попробуйте «Мадонна - сердце мятежника (Super Deluxe Edition)»; если обложка не найдена, попробуйте "Мадонна - сердце мятежника"
Обзоры альбомов. Искать с вырезанным "основным" именем, поскольку имена с "дополнительной информацией" в большинстве случаев не работают или находят некачественный обзор.

Метод поиска, если отключен
Обложки и обзоры альбомов. Искать по полному названию альбома


ИЗОБРАЖЕНИЯ ХУДОЖНИКОВ

Они взяты с last.fm. «Настройки сервера» (biography.ini) позволяют указать количество изображений для каждого художника. В меню изображения есть опция черного списка, чтобы остановить отображение и загрузку нежелательных изображений (данные черного списка сохранены в профиле fb2k \ yttm \ blacklist_image)

Если вы используете функциональный загрузчик изображений художника с другим плагином / скриптом, который сохраняет изображения по папкам, отключите сборщик биографий и введите расположение папки в biography.ini. Локация будет отслеживаться в реальном времени.


ОБЛОЖКИ И ОБЗОР ИЗОБРАЖЕНИЙ

Они взяты с last.fm

[ОБЛОЖКИ: МУЗЫКАЛЬНЫЕ ФАЙЛЫ]
Включите автосохранение, чтобы обложки музыкальных файлов сохранялись в указанном месте. Цель состоит в том, чтобы получить недостающие обложки. Если автосохранение включено, ищет, когда невозможно загрузить обложку в соответствии с основными настройками foobar2000 (отображение> обложка альбома> передняя обложка> шаблоны поиска), и нет сохраненной обложки

[AUTO-FETCH]
Изображение [Review] Auto-Fetch: применяется к запросам «Дополнительные элементы меню»: выбирает изображения для обзора

Настройки находятся в «Настройках сервера» (biography.ini).


ДИСПЛЕЙ ИЗОБРАЖЕНИЯ

Охватывает

Проверяет: foobar2000> настройки> отображение> обложки альбомов> шаблоны + места сохранения и, если включено, циклическое расположение

Изображения художников

Проверяет: расположение папки изображений исполнителя last.fm, затем foobar2000> настройки> отображение> обложка альбома> шаблоны исполнителей. Если фото установлено на исполнителя, проверяется только последний

Шаблоны возврата или изображения-заглушки можно установить в foobar2000> настройки> отображение> обложка альбома.

Поиск и счетчик изображений

Seeker поддерживает кликабельные точки, а также стиль полосы для выбора изображения. Оба можно перетащить. Счетчик необязательно + может отображаться отдельно. Настройки: меню> изображение> искатель. Показать, когда> 1 изображение
Технические примечания
1) Некоторые раскладки фристайла несовместимы с искателем и счетчиком. В этих случаях они отключены (пункт меню неактивен). Этого можно избежать, если изображение и текстовые поля не перекрываются.
2) Позиционирование искателя. Макеты в стиле левого и правого изображения обычно приводят к изменению высоты изображения при загрузке разных изображений. Тем не менее, искатель должен оставаться на той же высоте, чтобы его можно было перетаскивать и щелкать, и поэтому относительно высоты изображения положение искателя может варьироваться. Этого можно избежать, установив высоту изображения с помощью:
1) Круглые изображения
2) Автозаполнение с макетом произвольного стиля («меню> макет> создать новый стиль»), если затем требуется дополнительная настройка поля изображения.


ОТОБРАЖЕНИЕ ИЗОБРАЖЕНИЙ ДРУГИМИ Зрителями ARTWORK и плейлистами

Большинство компонентов загружают изображения через основные настройки foobar2000 (отображение> обложка альбома). Недействительные символы в именах папок и файлов обрабатываются автоматически. Примеры с настройками по умолчанию:

Отображение выбранных обложек: добавьте в шаблоны поиска "Передняя обложка" следующие строки:
обложка.*

Отображение выбранных изображений исполнителей: добавьте следующее в шаблоны поиска «Исполнитель»:
XX \ foobar2000 \ yttm \ art_img \ $ cut (% artist%, 1) \% artist% \ *
где XX - ваш собственный путь. Для каждого художника будет выбрано одно изображение

Если используются многозначные теги, $ meta (artist, 0) и т. Д. Могут работать лучше, чем% artist%

Вышеупомянутые стили также можно использовать в источниках графических изображений CUI.

Сценарий всегда заменяет начальные точки в метаданных подчеркиванием в именах папок и файлов. Это потому, что foobar2000 не обрабатывает этот случай автоматически и не загружает изображения, если в какой-либо папке в шаблоне поиска есть начальная точка ".". Этот сценарий встречается редко и может игнорироваться большинством пользователей. Но если у вас есть такие художники, как ".38 Special", подумайте об использовании вместо этого следующего стиля, который обеспечит загрузку изображений художников для всех художников:
XX \ foobar2000 \ yttm \ art_img \ $ replace ($ cut (% artist%, 1),., _) \ $ If ($ stricmp ($ cut (% artist%, 1),.), _ $ Substr (% artist%, 2, $ len (% artist%)),% artist%) \ *


НАПИСАНИЕ ТЕГОВ

«SHIFT * + щелчок правой кнопкой мыши> меню> Записать теги для выбранных треков» (отображается серым цветом, если файлы списка воспроизведения не выбраны). * Может быть установлено, что сдвиг не требуется в свойствах панели: «Пункты меню ...»

В меню показаны теги, которые нужно записать. Включите / отключите по мере необходимости. Написанные теги многозначны, за исключением рейтинга альбома AllMusic

Доступные теги:

Жанр альбома AllMusic
Альбом Mood AllMusic
Рейтинг альбома AllMusic
Тема альбома AllMusic
Исполнитель Жанр AllMusic
Жанр альбома Last.fm
Жанр исполнителя Last.fm
Локаль Last.fm
Похожие исполнители Last.fm

При необходимости измените имена тегов в настройках сервера (biography.ini)

Все теги пишутся из сохраненных источников (т.е. пишется только существующая информация в уже сохраненных биографиях, обзорах и подобных исполнителях). Это должно работать лучше всего, если вы уже какое-то время пользуетесь биографией. Файлы с отсутствующими тегами обычно можно определить, выбрав "?" вверху просмотров библиотеки и т. д.

По умолчанию теги жанра last.fm очищаются перед записью. Это направлено на удаление тегов, не относящихся к жанру, из списков основных тегов last.fm и сортировку вариантов написания. При необходимости настройте параметры в «ADV.Last.fmGenreTag ...» в свойствах панели; отключите очистку, чтобы записать оригинальные топ-теги

Количество похожих художников для написания может быть установлено (0-100). Из биографии читается до 4-х. Для использования 5+ требуется сохраненный список (сохранение автоматически включается по умолчанию, если для номера установлено значение 5+). Если установлено значение 5+, нет возможности вернуться к чтению 4 в биографии. Если вы пишете> 20 похожих художников, вероятно, потребуется увеличить ограничения на размер в «LargeFieldsConfig.txt» для правильной работы.

Хорошо работает с видами библиотеки, такими как:

Просмотр по жанру альбома AllMusic //% <жанр альбома allmusic>% | [% исполнителя альбома% -]% альбома% | [[% discnumber%.]% Tracknumber%. ] [% исполнитель% -]% название%

Просмотр по жанру альбома Last.fm //% <жанр альбома last.fm>% | [% исполнителя альбома% -]% альбома% | [[% discnumber%.]% Tracknumber%. ] [% исполнитель% -]% название%

Просмотр по альбому Настроение AllMusic //% <альбомное настроение allmusic>% | [% альбом исполнителя% -]% альбом% | [[% discnumber%.]% Tracknumber%. ] [% исполнитель% -]% название%

Просмотр по рейтингу альбома AllMusic //% рейтинга альбома allmusic% | [% альбома исполнителя% -]% альбома% | [[% discnumber%.]% Tracknumber%. ] [% исполнитель% -]% название%

Просмотр по теме альбома AllMusic //% <тема альбома allmusic>% | [% исполнитель альбома% -]% альбом% | [[% discnumber%.]% Tracknumber%. ] [% исполнитель% -]% название%

Просмотр по исполнителям Жанр AllMusic //% <исполнитель жанр allmusic>% |% artist% |% album% | [[% discnumber%.]% Tracknumber%. ] [% исполнитель% -]% название%

Просмотр по исполнителю Жанр Last.fm //% <исполнитель жанр last.fm>% |% artist% |% album% | [[% discnumber%.]% Tracknumber%. ] [% исполнитель% -]% название%

Просмотр по городу // $ if ($ meta (locale last.fm, 0), $ meta (locale last.fm, 0) '(' $ meta (locale last.fm, $ sub ($ meta_num (locale last.fm ), 1)) ')' ,?) |% artist% |% album% | [[% discnumber%.]% Tracknumber%. ] [% исполнитель% -]% название%

Просмотр по стране // $ if2 ($ meta (locale last.fm, $ sub ($ meta_num (locale last.fm), 1)) ,?) |% artist% |% album% | [[% discnumber%.] %номер дорожки%. ] [% исполнитель% -]% название%

Просмотр по стране: Город // $ if2 ($ meta (locale last.fm, $ sub ($ meta_num (locale last.fm), 1)) $ if ($ meta_num (locale last.fm) ,: $ meta (locale last.fm, 0)) ,?) |% artist% |% album% | [[% discnumber%.]% tracknumber%. ] [% исполнитель% -]% название%

Просмотр по языку Last.fm //% <locale last.fm>% |% artist% |% album% | [[% discnumber%.]% Tracknumber%. ] [% исполнитель% -]% название%

Просмотр похожих исполнителей Last.fm //% <похожие исполнители last.fm>% |% artist% |% album% | [[% discnumber%.]% Tracknumber%. ] [% исполнитель% -]% название%

Рейтинг альбома AllMusic написан по шкале от 0 до 10 для облегчения сортировки и обработки запросов.

Locale Last.fm пишет «Основанный в» (группы) или «Родившийся в» (исполнители), как прочитано из биографии last.fm (поддерживает языковые варианты). Тег многозначен для максимальной гибкости. % locale last.fm% или $ meta (locale last.fm) должны отображаться так, как написано в биографии

$ meta (locale last.fm, 0) // возвращает первое значение, обычно город / город, например The Beatles -> Liverpool; Мадонна -> Бэй-Сити

$ meta (locale last.fm, $ sub ($ meta_num (locale last.fm), 1)) // возвращает последнее значение, обычно страну, например United Kingdom или United States

Во время записи тега вся информация сначала считывается с диска и обрабатывается. Поэтому при записи большого количества файлов может возникнуть задержка перед появлением окна выполнения обновления файлов.

Рекомендуется сначала попробовать написать теги для репрезентативного набора файлов, чтобы оптимизировать настройки и убедиться, что он работает должным образом и т. Д. Исполнитель, исполнитель альбома и альбом определяются настройками сервера (biography.ini) для% BIO_ARTIST%,% BIO_ALBUMARTIST% и % BIO_ALBUM%


ПОТЕРЯННАЯ ИНФОРМАЦИЯ

Биография может проверять отсутствующие биографии, обзоры и изображения исполнителей. Поскольку это предназначено для отладки или нишевых пользователей, он доступен как дополнительный пункт меню (по умолчанию не показан). Чтобы отобразить: настройки панели> «Элементы меню Hide-0 Shift-1 Show-2»> установите «Missing Data» на 1 (требуется сдвиг) или 2 (всегда отображается)


ДОПОЛНИТЕЛЬНО: СПОСОБЫ ПОЛЬЗОВАТЕЛЯ

Большинству пользователей эта функция не нужна, поскольку обложки загружаются автоматически через foobar2000> настройки> дисплей> обложки альбомов> шаблоны или из мест сохранения. Включите при необходимости в настройках сервера (biography.ini). Затем сначала будут проверены пользовательские пути к обложке. Для пользовательских путей введите полный путь минус расширение; в отдельных строках можно ввести до 5, что позволяет указать разные местоположения и имена файлов. Поддерживается все форматирование заголовков + абсолютные пути. Используйте $ replace для пользовательской замены недопустимого символа (здесь нет автоматической замены). % BIO_ALBUMARTIST%,% BIO_ARTIST%,% BIO_ALBUM% и% BIO_TITLE% поддерживаются, но не должны использоваться, если стандартные поля работают. % path% ОК, здесь только загрузка, несовместимость сохранения с радиопотоками и т. д.

Пример пути =% profile% \ cover \ $ replace (% album artist% -% album%, /, _, \, _, |, _,:, _, *, _, ", _, <, _,> ,_,?,_) '['%Дата%']'


Marakobes
Репутация: 1
С нами: 11 лет 7 месяцев

Сообщение #2772 Zork » 10.11.2020, 19:58

2 ALL
Подскажите пожалуйста, кто знает. Имеется скрипт в сборке от Alex Realist, который показывает картинку обложки и артиста. С картинкой обложки проблем нет, а вот с артистом - засада. Она достаётся отсюда - var g_artist_path = fb.FoobarPath + "lastfm\\artist\\"; Но у меня все картинки об артистах получает другой скрипт (Biography 1.1.3) и складывает их в свою папку, создавая иерархию: папка фубара\yttm\art_img\папка первой буквы артиста\артист\картинки (в виде %artist%_GUID.jpg). Как я понимаю, скрипту нужен конкретный файл в конкретной папке с именем артиста. Что нужно изменить, чтобы скрипт видел подпапки и мог находить нужную папку с артистом и использовал имеющиеся там картинки? Заранее благодарю за ответ.


Спойлер
// ==PREPROCESSOR==
// @name "Albumart"
// @author "Alex Realist"
// ==/PREPROCESSOR==
var g_filename_default = fb.FoobarPath + "skins\\nocover.png";
var g_img_default = gdi.Image(g_filename_default);
var g_img_gloss = gdi.Image(fb.FoobarPath + "skins\\bento\\gloss.png");
var g_artist_path = fb.FoobarPath + "lastfm\\artist\\";
var WshShell = new ActiveXObject("WScript.Shell");
var g_focus_metadb = null;

var art_mode = window.GetProperty("Mode.Art", 1);
var display_mode = window.GetProperty("Mode.Display", 1);
var fade_effect = window.GetProperty("Mode.Fade-effect", true);
var gloss_effect = window.GetProperty("Mode.Gloss-effect", true);

var fader = 0;
var fading_step = 15;
var g_timer;
var g_timer_refresh = 25;
var g_filename1 = null;
var g_filename2 = null;
var g_image1 = null;
var g_image2 = null;
var fix_init = true;
var switch_dispmode = false;

// Used in window.GetColorCUI()
ColorTypeCUI = {
text: 0,
selection_text: 1,
inactive_selection_text: 2,
background: 3,
selection_background: 4,
inactive_selection_background: 5,
active_item_frame: 6
};
var g_backcolor = window.GetColorCUI(ColorTypeCUI.background);

change_image();
function on_paint(gr){
gr.FillSolidRect(0, 0, window.Width, window.Height, g_backcolor);
if(g_image2) gr.DrawImage(g_image2, 0, 0, window.Width, window.Height, 0, 0, g_image2.Width, g_image2.Height, 0, fader);
if(g_image1) gr.DrawImage(g_image1, 0, 0, window.Width, window.Height, 0, 0, g_image1.Width, g_image1.Height, 0, 255-fader);
if(fix_init) {fix_init=false; change_image()} // На случай !g_focus_metadb
}
function change_image(){
g_filename2 = g_filename1;
g_focus_metadb = fb.GetFocusItem();
if(!g_focus_metadb) {if(!fix_init) make_image(null)}
else {fix_init=false; utils.GetAlbumArtAsync(window.ID, g_focus_metadb, 0, false, false, (art_mode==1) ? false : true)}
}
function on_get_album_art_done(metadb, art_id, image, image_path){
g_filename1 = image_path;
make_image(image);
}
function make_image(prm_image){
if(!g_focus_metadb){
g_filename1 = g_filename_default;
var g_img = g_img_default;
}
else{
if(art_mode==1){
var g_img = prm_image;
if(!g_img) {g_filename1 = g_filename_default; g_img = g_img_default}
}
else{
switch(art_mode){
case 2: var filename = g_artist_path+fb.TitleFormat("$replace(%artist%,'/','_')").EvalWithMetadb(g_focus_metadb); break;
//case 3: var filename = g_artist_path+fb.TitleFormat("$replace(%artist%,'/','_')").EvalWithMetadb(g_focus_metadb)+"_01"; break;
//case 4: var filename = g_artist_path+fb.TitleFormat("$replace(%artist%,'/','_')").EvalWithMetadb(g_focus_metadb)+"_02";
}
g_filename1 = null;
var fso = new ActiveXObject("Scripting.FileSystemObject");
var ts = null;
var g_maxdatetime = 0;
var g_tempdatetime = null;
var g_tempfilename = filename+".gif";
if(fso.fileexists(g_tempfilename)){
ts = fso.getfile(g_tempfilename);
g_tempdatetime = ts.datelastmodified;
if(g_tempdatetime>g_maxdatetime){
g_maxdatetime = g_tempdatetime;
g_filename1 = g_tempfilename;
}
}
g_tempfilename = filename+".jpg";
if(fso.fileexists(g_tempfilename)){
ts = fso.getfile(g_tempfilename);
g_tempdatetime=ts.datelastmodified;
if(g_tempdatetime>g_maxdatetime){
g_maxdatetime = g_tempdatetime;
g_filename1 = g_tempfilename;
}
}
g_tempfilename = filename+".png";
if(fso.fileexists(g_tempfilename)){
ts = fso.getfile(g_tempfilename);
g_tempdatetime=ts.datelastmodified;
if(g_tempdatetime>g_maxdatetime){
g_maxdatetime = g_tempdatetime;
g_filename1 = g_tempfilename;
}
}
if(g_filename1) g_img = gdi.Image(g_filename1);
else {g_filename1 = g_filename_default; g_img = g_img_default}
}
}
if(g_filename1!=g_filename2 || switch_dispmode){
if(switch_dispmode) switch_dispmode = false;
// Анализ режимов
var iw = window.Width;
var ih = window.Height;
var panel_ratio = iw/ih;
var img_info = {ratio: 0, x: 0, y: 0, w: 0, h: 0};
img_info.ratio = g_img.Width/g_img.Height;
var cut;
if(img_info.ratio>panel_ratio){
switch(display_mode){
case 1: // Adjust
img_info.w = iw;
img_info.h = ih/img_info.ratio*panel_ratio;
cut = ih-img_info.h;
img_info.x = 0;
img_info.y = cut/2;
break;
case 2: // Filling
img_info.w = iw*img_info.ratio/panel_ratio;
img_info.h = ih;
cut = img_info.w - iw;
img_info.x = 0-(cut/2);
img_info.y = 0;
break;
case 3: // Stretch
img_info.w = iw;
img_info.h = ih;
img_info.x = 0;
img_info.y = 0;
}
}
else if(img_info.ratio<panel_ratio){
switch(display_mode){
case 1: // Adjust
img_info.h = ih;
img_info.w = iw*img_info.ratio/panel_ratio;
cut = iw-img_info.w;
img_info.y = 0;
img_info.x = cut/2;
break;
case 2: // Filling
img_info.w = iw;
img_info.h = ih/img_info.ratio*panel_ratio;
cut = img_info.h - ih;
img_info.x = 0;
img_info.y = 0-(cut/2);
break;
case 3: // Stretch
img_info.w = iw;
img_info.h = ih;
img_info.x = 0;
img_info.y = 0;
}
}
else{
img_info.w = iw;
img_info.h = ih;
img_info.x = 0;
img_info.y = 0;
}
// Dispose previous images to save memory
if(g_image2) g_image2.Dispose();
if(g_image1) {g_image2 = g_image1.Clone(0, 0, window.Width, window.Height); g_image1.Dispose()}
// -----------------------------------------------------------------------
g_image1 = gdi.CreateImage(window.Width, window.Height);
var gp = g_image1.GetGraphics();
gp.FillSolidRect(0, 0, window.Width, window.Height, g_backcolor);
gp.SetInterpolationMode(2);
gp.DrawImage(g_img, img_info.x, img_info.y, img_info.w, img_info.h, 0, 0, g_img.Width, g_img.Height);
if(gloss_effect)
if(display_mode==1) gp.DrawImage(g_img_gloss, img_info.x, img_info.y, img_info.w, img_info.h*0.37, 0, 0, g_img_gloss.Width, g_img_gloss.Height);
else gp.DrawImage(g_img_gloss, 0, 0, window.Width, window.Height*0.37, 0, 0, g_img_gloss.Width, g_img_gloss.Height);
g_image1.ReleaseGraphics(gp);
// -----------------------------------------------------------------------
if(g_image2 && fade_effect){
if(fader>0) window.ClearInterval(g_timer);
fader = 255; g_timer = window.SetInterval(function(){
fader = fader-fading_step;
if(fader<=0) {fader = 0; window.ClearInterval(g_timer)}
window.Repaint();
}, g_timer_refresh);
}
window.Repaint();
}
}
function on_colors_changed(){
g_backcolor = window.GetColorCUI(ColorTypeCUI.background);
switch_dispmode = true;
change_image();
}
function on_item_focus_change(){
change_image();
}
function on_playlist_switch(){
change_image();
}
function on_mouse_lbtn_dblclk(){
if(g_filename1!=g_filename_default){
switch (g_filename1){
case fb.TitleFormat("%path%").EvalWithMetadb(g_focus_metadb): break;
default: WshShell.run('"'+g_filename1+'"');
}
}
}
function on_mouse_rbtn_down(x,y){
var _menu = window.CreatePopupMenu();
var _child1 = window.CreatePopupMenu();
var _child2 = window.CreatePopupMenu();
var _child3 = window.CreatePopupMenu();
_child1.AppendTo(_menu, 0x00000000, "Current image");
_child1.AppendMenuItem(0x00000000, 6, "Album");
_child1.AppendMenuItem(0x00000000, 7, "Artist");
//_child1.AppendMenuItem(0x00000000, 8, "Artist_01");
//_child1.AppendMenuItem(0x00000000, 9, "Artist_02");
_child1.CheckMenuRadioItem(6, 9, art_mode+5);
_menu.AppendMenuItem(0x00000800, 0, 0);
_child2.AppendTo(_menu, 0x00000000, "Aspect settings");
_child2.AppendMenuItem(0x00000000, 1, "Adjust image");
_child2.AppendMenuItem(0x00000000, 2, "Filling image");
_child2.AppendMenuItem(0x00000000, 3, "Stretch image");
_child2.CheckMenuRadioItem(1, 3, display_mode);
_child3.AppendTo(_menu, 0x00000000, "Additional settings");
_child3.AppendMenuItem(0x00000000, 10, "Fade-effect");
_child3.CheckMenuItem(10, fade_effect);
_child3.AppendMenuItem(0x00000000, 11, "Gloss-effect");
_child3.CheckMenuItem(11, gloss_effect);
_menu.AppendMenuItem(0x00000800, 0, 0);
_menu.AppendMenuItem(0x00000000, 4, "Properties");
_menu.AppendMenuItem(0x00000000, 5, "Configure...");
var ret = _menu.TrackPopupMenu(x, y);
if(ret>=6 && ret<=9){
window.SetProperty("Mode.Art", ret-5);
art_mode = window.GetProperty("Mode.Art");
change_image();
}
else{
if(ret>=1 && ret<=3){
window.SetProperty("Mode.Display", ret);
display_mode = window.GetProperty("Mode.Display");
switch_dispmode = true;
change_image();
}
else switch (ret){
case 4: window.ShowProperties(); break;
case 5: window.ShowConfigure(); break;
case 10: fade_effect_change(); break;
case 11: gloss_effect_change();
}
}
_child1.Dispose(); _child2.Dispose(); _child3.Dispose();
_menu.Dispose();
}
function fade_effect_change(){
window.SetProperty("Mode.Fade-effect", !fade_effect);
fade_effect = window.GetProperty("Mode.Fade-effect");
}
function gloss_effect_change(){
window.SetProperty("Mode.Gloss-effect", !gloss_effect);
gloss_effect = window.GetProperty("Mode.Gloss-effect");
switch_dispmode = true;
change_image();
}
function on_mouse_wheel(delta){
if(delta>0)
if(art_mode>1) window.SetProperty("Mode.Art", art_mode-1);
//else window.SetProperty("Mode.Art", 4);
else window.SetProperty("Mode.Art", 2);
else
//if(art_mode<4) window.SetProperty("Mode.Art", art_mode+1);
if(art_mode<2) window.SetProperty("Mode.Art", art_mode+1);
else window.SetProperty("Mode.Art", 1);
art_mode = window.GetProperty("Mode.Art");
change_image();
}
//EOF
Zork
Репутация: 2
С нами: 10 лет 1 месяц

Сообщение #2773 SergPuh.68 » 23.11.2020, 11:44

Можно ли сделать как то что бы движение seekbar было не рывками а более плавно?
Спойлер
var g_drag = 0;
var g_drag_seek = 0;
var gradient_lenght = 16;
var tooltip = window.CreateTooltip();
var old_x = -1;

var property_log = window.GetProperty("BackColor.Auto", true);
var property_rgb1 = window.GetProperty("BackColor1.Red", "0");
var property_rgb2 = window.GetProperty("BackColor2.Green", "0");
var property_rgb3 = window.GetProperty("BackColor3.Blue", "0");

function RGB(r,g,b){
return (0xff000000|(r<<16)|(g<<8)|(b));
}
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);
}
function on_paint(gr){
if(property_log) var back_color = window.GetColorCUI(3)-4296480535;
else var back_color = RGB(property_rgb1,property_rgb2,property_rgb3);
var color1 = RGB(177,35,35);
var color2 = window.GetColorCUI(1);

var pos = 0;
var length = Math.floor(fb.PlaybackLength);
if(length>0){
if(g_drag)
pos = Math.round(window.Width*g_drag_seek);
else{
var percent = fb.PlaybackTime/length;
if(percent>=0.995)
pos = window.Width;
else
pos = window.Width*percent;
}
}
gr.FillGradRect(pos-gradient_lenght, 0, gradient_lenght, window.Height, 0, color1, color2);
gr.FillSolidRect(0, 0, pos-gradient_lenght+1, window.Height, color1);
gr.FillSolidRect(pos, 0, window.Width-pos, window.Height, back_color);
}
function on_mouse_lbtn_down(x,y){
g_drag = 1;
old_x = -1;
}
function on_mouse_lbtn_up(x,y){
if(g_drag){
g_drag = 0;
g_drag_seek = x/window.Width;
g_drag_seek = (g_drag_seek<0) ? 0 : (g_drag_seek<1) ? g_drag_seek : 1;
fb.PlaybackTime = Math.floor(fb.PlaybackLength)*g_drag_seek;
}
}
function on_mouse_move(x,y){
window.SetCursor(32649);
if(g_drag){
g_drag_seek = x/window.Width;
g_drag_seek = (g_drag_seek<0) ? 0 : (g_drag_seek<1) ? g_drag_seek : 1;
window.Repaint();
}
if(x!=old_x){
old_x=x;
if(fb.PlaybackLength>0){
var seek_me = x/window.Width;
seek_me = (seek_me<0) ? 0 : (seek_me<1) ? seek_me : 1;
tooltip.Text = TimeFmt(fb.PlaybackLength*seek_me);
tooltip.Activate();
}
}
}
function on_mouse_leave(){
tooltip.Deactivate();
}
function on_playback_new_track(info){
window.Repaint();
tooltip.Deactivate();
}
function on_playback_stop(){
window.Repaint();
tooltip.Deactivate();
}
function on_playback_seek(time){
window.Repaint();
}
function on_playback_time(time){
window.Repaint();
}
//EOF
SergPuh.68 M
Аватара
Откуда: Украина
Репутация: 142
С нами: 5 лет 2 месяца

Сообщение #2774 MC Web » 23.11.2020, 12:20

SergPuh.68, в foo_wave_minibar_mod курсор движется плавно. Форму волны можно отключить, оставив один курсор. Получится практически то же самое, как и скрипт, если не планируются дополнительные навороты к нему.
MC Web
Репутация: 248
С нами: 10 лет 7 месяцев

Сообщение #2775 SergPuh.68 » 23.11.2020, 12:31

MC Web, foo_wave_minibar_mod сюда не подойдёт :fie:
2020-11-23_102855.png
2020-11-23_102855.png (2.07 КБ) Просмотров: 3848
SergPuh.68 M
Аватара
Откуда: Украина
Репутация: 142
С нами: 5 лет 2 месяца

Сообщение #2776 MC Web » 23.11.2020, 12:44

SergPuh.68, дело хозяйское, кому что нужно.

Изображение

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

Сообщение #2777 kgena_ua » 23.11.2020, 20:05

SergPuh.68:Можно ли сделать как то что бы движение seekbar было не рывками а более плавно?
заменить
Код: Выделить всё
function on_playback_time(time){
window.Repaint();
}
на
Код: Выделить всё
var seek_timer;

function on_playback_time(time){
    seek_timer && window.ClearInterval(seek_timer);
    seek_timer = window.SetInterval(function() {
        window.Repaint();
    }, 40 );
}
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 10 лет 11 месяцев

Сообщение #2778 SergPuh.68 » 23.11.2020, 20:29

kgena_ua, спасибо,работает.
SergPuh.68 M
Аватара
Откуда: Украина
Репутация: 142
С нами: 5 лет 2 месяца

Сообщение #2779 kgena_ua » 23.11.2020, 20:42

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

Сообщение #2780 kgena_ua » 01.01.2021, 17:09

Все с наступившим Новым Годом.
Удачи.
Здоровья близким.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 10 лет 11 месяцев

Пред.След.

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