Немного доработать скрипт

Список разделов foobar2000 Есть вопрос!

Описание: У вас проблемы с foobar2000 и вам необходима помощь? Спрашивайте здесь!
Правила раздела: Одна тема — один вопрос или группа связанных вопросов. Обязательно формируйте внятный заголовок, максимально отражающий суть. Подробно описывайте проблему. Не забывайте указать версию плеера, название сборки, по возможности добавить скриншоты проблемы.

Сообщение #1 RoxMarty » 09.01.2023, 04:06

Приветствую всех.

Занялся для себя созданием простых кнопочек для быстрого выполнения желаемых команд (чтоб не лазить по меню постоянно).

За основу взял код со сборки DarkOne Additional Buttons Panel:

Код: Выделить всё
// ==PREPROCESSOR==
// @name "DarkOne Additional Buttons Panel"
// @version "3.0"
// @author "tedGo"
// @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 = window.MaxWidth = 200;

// ----- CREATE BUTTONS ---------------------------------------------
var imgPath = configPath + "Buttons\\Control\\";

Buttons.a = new Button(63, 5, 57, 14, {normal: imgPath + "AddOnRight.png", hover: imgPath + "AddOnRightMH.png"}, function(){fb.RunContextCommand("Properties");});
Buttons.b = new Button(5, 5, 60, 14, {normal: imgPath + "AddOnLeft.png", hover: imgPath + "AddOnLeftMH.png"}, function(){fb.RunMainMenuCommand("View/ELPlaylist/Refresh");});

Buttons.c = new Button(5, 25, 58, 14, {normal: imgPath + "AddOnLeft.png", hover: imgPath + "AddOnLeftMH.png"}, function(){fb.RunContextCommand("Automatically analyse BPMs");});
Buttons.d = new Button(63, 25, 57, 14, {normal: imgPath + "AddOnRight.png", hover: imgPath + "AddOnRightMH.png"}, function(){fb.RunContextCommand("Dynamic Range Meter");});

Buttons.e = new Button(170, 5, 60, 14, {normal: imgPath + "AddOnAlone.png", hover: imgPath + "AddOnAloneMH.png"}, function(){fb.RunContextCommand("Tagging/Scripts/[CDM]");});
Buttons.f = new Button(170, 25, 60, 14, {normal: imgPath + "AddOnAlone.png", hover: imgPath + "AddOnAloneMH.png"}, function(){fb.RunContextCommand("Tagging/Scripts/[CDS]");});

Buttons.g = new Button(270, 5, 60, 14, {normal: imgPath + "AddOnAlone.png", hover: imgPath + "AddOnAloneMH.png"}, function(){fb.RunContextCommand("Convert/WAV here");});
Buttons.h = new Button(270, 25, 60, 14, {normal: imgPath + "AddOnAlone.png", hover: imgPath + "AddOnAloneMH.png"}, function(){fb.RunContextCommand("Convert/MP3 here");});

Buttons.i = new Button(370, 5, 60, 14, {normal: imgPath + "AddOnAlone.png", hover: imgPath + "AddOnAloneMH.png"}, function(){fb.RunContextCommand("Convert/ED FLAC [for BEST]");});
Buttons.j = new Button(370, 25, 60, 14, {normal: imgPath + "AddOnAlone.png", hover: imgPath + "AddOnAloneMH.png"}, function(){fb.RunContextCommand("Convert/ED MP3 [for BEST]");});

Buttons.k = new Button(470, 5, 85, 14, {normal: imgPath + "AddOnAlone.png", hover: imgPath + "AddOnAloneMH.png"}, function(){fb.RunMainMenuCommand("Album List");});




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

   buttonsDraw(gr);

    gr.GdiDrawText("REFRESH", btn_font, ui_btntxtcol, 5, 6, 60, 10, 33);
    gr.GdiDrawText("PROPERTIES", btn_font, ui_btntxtcol, 66, 6, 54, 10, 32);
 
    gr.GdiDrawText("BPM", btn_font, ui_btntxtcol, 25, 26, 54, 10, 32);
    gr.GdiDrawText("DRM", btn_font, ui_btntxtcol, 44, 26, 54, 10, 34);

    gr.GdiDrawText("...[CDM]", btn_font, ui_btntxtcol, 170, 6, 60, 10, 33);
    gr.GdiDrawText("...[CDS]", btn_font, ui_btntxtcol, 170, 26, 60, 10, 33);

    gr.GdiDrawText("...►[WAV]", btn_font, ui_btntxtcol, 270, 6, 60, 10, 33);
    gr.GdiDrawText("...►[MP3]", btn_font, ui_btntxtcol, 270, 26, 60, 10, 33);
   
    gr.GdiDrawText("ED ►[FLAC]", btn_font, ui_btntxtcol, 370, 6, 60, 10, 33);
    gr.GdiDrawText("ED ►[MP3]", btn_font, ui_btntxtcol, 370, 26, 60, 10, 33);
   
    gr.GdiDrawText("ALBUM LIST", btn_font, ui_btntxtcol, 470, 6, 54, 10, 34);
   

   
}


Практически всё работает как нужно, но есть проблемы:

1) Не всё удаётся "вынуть" из контекстного меню (RunContextCommand), например, ничего из контекстного меню Legacy Commands (unsorted) - может там какой-то другой код прописан, я не знаю...

Но главная проблема:

2) Выполнение кода (конвертирование, тегирование и т.п. - см. код выше) действует только на текущий (проигрываемый) трек, но никак не на выделение нужного блока. При ручном выделении (равно как и по горячим клавишам) и вызова соответствующих команд из контекстного меню - всё работает как нужно.

Поможете доработать код, чтоб решить хотя бы главную проблему?

P.S. Добавляю через WSH Scripts (Columns UI)
RoxMarty
Автор темы
Репутация: 1
С нами: 15 лет 4 месяца

Сообщение #2 Azaza » 09.01.2023, 04:38

RoxMarty:Выполнение кода (конвертирование, тегирование и т.п. - см. код выше) действует только на текущий (проигрываемый) трек, но никак не на выделение нужного блока. При ручном выделении (равно как и по горячим клавишам) и вызова соответствующих команд из контекстного меню - всё работает как нужно.
Тут дело даже не в скрипте - https://hydrogenaud.io/index.php/topic,121473.0.html
Azaza M
Аватара
Репутация: 412
С нами: 8 лет 2 месяца

Сообщение #3 kutuzof » 09.01.2023, 11:05

RoxMarty:действует только на текущий (проигрываемый) трек, но никак не на выделение нужного блока
Код: Выделить всё
function(){fb.RunContextCommandWithMetadb("Dynamic Range Meter", plman.GetPlaylistSelectedItems(plman.ActivePlaylist))}
kutuzof M
Аватара
Откуда: г. Орёл, Россия
Репутация: 256
С нами: 8 лет 1 месяц

Сообщение #4 imfam » 09.01.2023, 12:00

RoxMarty, посмотри как у меня сделано: скрипты на панелях Tools и Service.
imfam M
Откуда: Германия
Репутация: 28
С нами: 11 лет 5 месяцев

Сообщение #5 RoxMarty » 09.01.2023, 15:47

Всем спасибо за ответы!
kutuzof, благодарю. Идеально!
RoxMarty
Автор темы
Репутация: 1
С нами: 15 лет 4 месяца

Сообщение #6 RoxMarty » 29.01.2023, 18:43

Прошу помощи ещё немного доработать.

Есть две разные кнопки:

Код: Выделить всё
Buttons.e = new Button(145, 5, 45, 26, {normal: imgPath + "CDM.png", hover: imgPath + "CDM+.png"}, function(){fb.RunContextCommandWithMetadb("Tagging/Scripts/[CDM]", plman.GetPlaylistSelectedItems(plman.ActivePlaylist))});

+

Код: Выделить всё
Buttons.d = new Button(110, 5, 30, 45, {normal: imgPath + "UPdate.png", hover: imgPath + "UPdate+.png"}, function(){fb.RunMainMenuCommand("View/ELPlaylist/Refresh")});

Как можно объединить эти функционалы в одну кнопку последовательным автовыполнением? Чтоб не приходилось запускать вторую кнопку отдельно после первой.
RoxMarty
Автор темы
Репутация: 1
С нами: 15 лет 4 месяца

Сообщение #7 RoxMarty » 31.01.2023, 20:59

Пробовал по всякому, никак не срабатывает после первой команды вторая ("обновление"):
Код: Выделить всё
Buttons.e = new Button(145, 5, 45, 26, {normal: imgPath + "CDM.png", hover: imgPath + "CDM+.png"}, function(){fb.RunContextCommandWithMetadb("Tagging/Scripts/[CDM]", plman.GetPlaylistSelectedItems(plman.ActivePlaylist))}, function(){fb.RunMainMenuCommand("View/ELPlaylist/Refresh")}  );
RoxMarty
Автор темы
Репутация: 1
С нами: 15 лет 4 месяца

Сообщение #8 kutuzof » 31.01.2023, 22:45

RoxMarty, попробуй так:
Код: Выделить всё
Buttons.e = new Button(145, 5, 45, 26, {normal: imgPath + "CDM.png", hover: imgPath + "CDM+.png"}, function(){fb.RunContextCommandWithMetadb("Tagging/Scripts/[CDM]",plman.GetPlaylistSelectedItems(plman.ActivePlaylist)); fb.RunMainMenuCommand("View/ELPlaylist/Refresh");}, "");
kutuzof M
Аватара
Откуда: г. Орёл, Россия
Репутация: 256
С нами: 8 лет 1 месяц

Сообщение #9 RoxMarty » 31.01.2023, 23:11

kutuzof,
К сожалению, всё так же, отрабатывает только первая команда...
Быть может нужно сделать что-то одно из двух:

1) выполнить вторую команду только после выполнения первой
или
2) поставить паузу (например, в секунду) перед выполнением второй команды (может, не успевает отрабатывать первая команда, там же тег прописывается)

Есть такие возможности?
RoxMarty
Автор темы
Репутация: 1
С нами: 15 лет 4 месяца

Сообщение #10 kutuzof » 31.01.2023, 23:48

RoxMarty:всё так же, отрабатывает только первая команда...
Отрабатывают обе команды, просто (как вы написали) первая не успевает записать тег.
RoxMarty:поставить паузу (например, в секунду) перед выполнением второй команды
RoxMarty:Есть такие возможности?
Не могу сказать :-)
kutuzof M
Аватара
Откуда: г. Орёл, Россия
Репутация: 256
С нами: 8 лет 1 месяц

Сообщение #11 RoxMarty » 01.02.2023, 01:28

kutuzof:Отрабатывают обе команды, просто (как вы написали) первая не успевает записать тег.
Увы, это так :(

Пробовал тут уже с разными "паузами", но безуспешно - или игнорится или крашится.

Подумал, может надо вставить третью команду посередине, такая чтоб вроде ничего не делала, но хотя бы секунду чем-то "напрягала" фубар :)
Хотя... в случае, когда надо будет обработать много треков и альбомов, задержки тоже может не хватить.

Но спасибо всем за ответы! Если будут ещё идеи - пишите. Если что-то придумаю - я тоже напишу
RoxMarty
Автор темы
Репутация: 1
С нами: 15 лет 4 месяца

Сообщение #12 vincenzo44 » 01.02.2023, 20:34

RoxMarty:Прошу помощи ещё немного доработать.

Есть две разные кнопки:

Код: Выделить всё
Buttons.e = new Button(145, 5, 45, 26, {normal: imgPath + "CDM.png", hover: imgPath + "CDM+.png"}, function(){fb.RunContextCommandWithMetadb("Tagging/Scripts/[CDM]", plman.GetPlaylistSelectedItems(plman.ActivePlaylist))});


+

Код: Выделить всё
Buttons.d = new Button(110, 5, 30, 45, {normal: imgPath + "UPdate.png", hover: imgPath + "UPdate+.png"}, function(){fb.RunMainMenuCommand("View/ELPlaylist/Refresh")});


Как можно объединить эти функционалы в одну кнопку последовательным автовыполнением? Чтоб не приходилось запускать вторую кнопку отдельно после первой.
Код: Выделить всё
function(){var items = plman.GetPlaylistSelectedItems(plman.ActivePlaylist);fb.RunContextCommandWithMetadb("Tagging/Scripts/[CDM]", items);
window.SetTimeout(function() {
fb.RunMainMenuCommand("View/ELPlaylist/Refresh")}
    }, 1000);}

вот так должно работать (именно эти команды проверить не могу, но с моими работает). Сначала запускается tagging и через 1000 мс - refresh
vincenzo44
Репутация: 4
С нами: 8 лет 9 месяцев

Сообщение #13 RoxMarty » 01.02.2023, 22:32

vincenzo44:вот так должно работать
Я верно подставил?

Код: Выделить всё
Buttons.e = new Button(145, 5, 45, 26, {normal: imgPath + "CDM.png", hover: imgPath + "CDM+.png"},
function(){var items = plman.GetPlaylistSelectedItems(plman.ActivePlaylist);fb.RunContextCommandWithMetadb("Tagging/Scripts/[CDM]", items);
window.SetTimeout(function() {
fb.RunMainMenuCommand("View/ELPlaylist/Refresh")}
    }, 1000);}

WSH Panel выводит сразу:

Scripting Engine Initialization Failed (DarkOne Additional Buttons Panel remake by RoxMarty v3.0 by tedGo, CODE: 0x80020101)
Check the console for more information (Always caused by unexcepted script error).

В консоли:

Ошибка компиляции Microsoft JScript:
Предполагается наличие ')'
File: <main>
Ln: 33, Col: 5
}, 1000);}

Я так понял, скобки недостаёт закрывающей, поставил перед фигурной скобкой и..

Error: WSH Panel Mod (DarkOne Additional Buttons Panel remake by RoxMarty v3.0 by tedGo): Ошибка компиляции Microsoft JScript:
Синтаксическая ошибка
File: <main>
Ln: 33, Col: 15
)}, 1000);}

Видимо тут лишняя фигурная скобка в конце, убрал и её, но...

Спойлер
Код: Выделить всё
Buttons.e = new Button(145, 5, 45, 26, {normal: imgPath + "CDM.png", hover: imgPath + "CDM+.png"},
function(){var items = plman.GetPlaylistSelectedItems(plman.ActivePlaylist);fb.RunContextCommandWithMetadb("Tagging/Scripts/[CDM]", items);
window.SetTimeout(function() {
fb.RunMainMenuCommand("View/ELPlaylist/Refresh")}
    )}, 1000);

Error: WSH Panel Mod (DarkOne Additional Buttons Panel remake by RoxMarty v3.0 by tedGo): Ошибка выполнения Microsoft JScript:
Недопустимое число аргументов или присвоение значения свойства
File: <main>
Ln: 31, Col: 1
<source text only available at compile time>

31 строка у меня это вот такая:
Код: Выделить всё
window.SetTimeout(function() {

Добавлено спустя 11 минут 30 секунд:
В общем, перепроверил все скобки, и всё получилось!

Код: Выделить всё
Buttons.e = new Button(145, 5, 45, 26, {normal: imgPath + "CDM.png", hover: imgPath + "CDM+.png"},
function(){var items = plman.GetPlaylistSelectedItems(plman.ActivePlaylist);fb.RunContextCommandWithMetadb("Tagging/Scripts/[CDM]", items);
window.SetTimeout(function() {fb.RunMainMenuCommand("View/ELPlaylist/Refresh")}    ,1000);})

Огромное спасибо! Вопрос решён!
RoxMarty
Автор темы
Репутация: 1
С нами: 15 лет 4 месяца

Сообщение #14 vincenzo44 » 01.02.2023, 22:54

Код: Выделить всё
Buttons.e = new Button(145, 5, 45, 26, {normal: imgPath + "CDM.png", hover: imgPath + "CDM+.png"},function(){var items = plman.GetPlaylistSelectedItems(plman.ActivePlaylist);fb.RunContextCommandWithMetadb("Tagging/Scripts/[CDM]", items);
window.SetTimeout(function() {fb.RunMainMenuCommand("View/ELPlaylist/Refresh")}, 1000)});


а так?

Добавлено спустя 28 секунд:
а, уже)
vincenzo44
Репутация: 4
С нами: 8 лет 9 месяцев

Сообщение #15 imfam » 02.02.2023, 15:11

Интересно, сработает ли, если вместо задержки поставить && - означает, что вторая команда исполняется по завершении первой (нагуглил).
Код: Выделить всё
Buttons.e = new Button(145, 5, 45, 26, {normal: imgPath + "CDM.png", hover: imgPath + "CDM+.png"},function(){var items = plman.GetPlaylistSelectedItems(plman.ActivePlaylist);fb.RunContextCommandWithMetadb("Tagging/Scripts/[CDM]", items) && fb.RunMainMenuCommand("View/ELPlaylist/Refresh");
Я на ваших командах проверить не могу.
imfam M
Откуда: Германия
Репутация: 28
С нами: 11 лет 5 месяцев

Сообщение #16 RoxMarty » 03.02.2023, 14:16

imfam:сработает ли, если вместо задержки поставить && - означает, что вторая команда исполняется по завершении первой (нагуглил)
ага, я тоже на такое натыкался и пробовал

imfam:Buttons.e = new Button(145, 5, 45, 26, {normal: imgPath + "CDM.png", hover: imgPath + "CDM+.png"},function(){var items = plman.GetPlaylistSelectedItems(plman.ActivePlaylist);fb.RunContextCommandWithMetadb("Tagging/Scripts/[CDM]", items) && fb.RunMainMenuCommand("View/ELPlaylist/Refresh");
Тут ещё недостаёт перед финальной точкой с запятой в конце фигурной и обычной скобки, но, к сожалению, это не работает. Верней, первая команда точно срабатывает (как и всегда), а вторая - если и срабатывает, то никак не последовательно, а сразу :(

Либо всё же она срабатывает последовательно, но без учёта отработки предыдущей команды (полагаю, ей просто неизвестно когда окончится обработка первой команды, но это лишь мои догадки)

Но спасибо за помощь!

Если что - я не против потестировать ещё какие идеи если будут в будущем :)
RoxMarty
Автор темы
Репутация: 1
С нами: 15 лет 4 месяца


Вернуться в Есть вопрос!