JSplitter v3.6.1.14 [16.02.2025]

Список разделов foobar2000 Плагины

Описание: Все о плагинах, компонентах, расширениях

Сообщение #1 LUR » 21.03.2018, 06:06

Плагин представляет собой панель, совмещающую функциональность сплиттера (контейнера для панелей других плагинов) и хоста скриптов JavaScript.

Особенности функционала:

1. Панели добавляются в сплиттер в произвольном порядке, где с ними можно работать как с обычными окнами Windows, а именно: перемещать, изменять их размер, сворачивать, разворачивать, закрывать. Т.е. при работе с плагином foobar2000 превращается в приложение с MDI интерфейсом (Multi Document Interface). Для точного позиционирования панелей предусмотрено отображение координат и их редактирование "на лету" в заголовке окна панели (полезно при дизайне интерфейса сборки). Также имеется возможность настраивать цвета и шрифт заголовка окон панелей.
Функциональность сплиттера работает как в DUI, так и в CUI.

1.PNG


2. Поддерживается управление размещением панелей в сплиттере через стандартный "размещатель" Columns UI. Также поддерживается в DUI то, что похоже на его стандартные сплиттеры, и что поддерживается теперь самим автором плеера.
3. В основе хоста скриптов лежит Spider Monkey Panel, соответственно имеет все возможности данной панели + дополнительные расширения API, касающиеся сплиттера.
4. Поддерживается управление панелями в сплиттере из скриптов. Возможно программно перемещать, скрывать, изменять размер панелей.
5. Имеется специальное API для быстрого создания кнопок в корне панели и обработки их нажатия.

Итог: по своей задумке функционала повторяет Mega Panel Splitter, но с приятными дополнениями в виде ручного управления перемещением панелей и простого API для создания кнопок. Ну а еще может кому-то просто понравится использовать foobar2000 в виде MDI приложения, кто знает.

Дисклеймер:
JSplitter основывается на последней версии Spider Monkey Panel, поэтому несет все изменения, задуманные автором. Если вы заметили какие-либо изменения в работе своих скриптов, то обратитесь к странице релиза Spider Monkey Panel, где автор может указывать изменения, способные повлиять на существующий код.

СКАЧАТЬ
АНГЛИЙСКАЯ ВЕРСИЯ
РУССКАЯ ВЕРСИЯ
ЗЕРКАЛО
АНГЛИЙСКАЯ ВЕРСИЯ
РУССКАЯ ВЕРСИЯ

Краткое руководство
Для добавления панелей в сплиттер можно воспользоваться следующими способами:

1. С помощью контекстного меню панели плагина:

2.PNG
2.PNG (7.04 КБ) Просмотров: 128360


2. С помощью стандартного размещателя Columns UI:

4.PNG


3. С помощью списка панелей, вызываемого из контекстного меню плагина:

10.png
10.png (8 КБ) Просмотров: 22946


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

Снимок.PNG


4. В стандартном режиме редактирования разметки (Default UI / Columns UI)

9.png


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

3.PNG


ВНИМАНИЕ! Порядок размещения панелей в сплиттере зависит от глубины их визуального расположения. Самое верхнее окно будет последним в списке. Если вы активируете мышкой какую-либо панель, она переместится в конец списка. Учитывайте это при использовании функции GetPanelByIndex (см. ниже). Чтобы случайных перемещений по списку не происходило, вы можете заблокировать панель (см. ниже)

Show caption - включает/отключает отображение рамки (бордюра) окна панели
Locked - заблокировать панель. С установленной галочкой окно не реагирует на попытки переместить/изменить/закрыть окно.
Show coords - отобразить координаты. В заголовке окна будут отображены координаты окна, которые будут обновляться по мере перемещения/изменения размера окна.
Support pseudo transparency - некоторым окнам необходима поддержка "прозрачности". С включенной опцией плагин будет заменять фон окна панели на содержимое корневого окна плагина. Т.е. например все, что нарисовано в скрипте с помощью on_paint(gr) будет скопировано в окно.

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

7.PNG


Настройки внешнего вида окон панелей расположены здесь:

8.png


Show tools menu for panels' caption - включает/отключает меню для заголовка окон панелей.
Move panels with middle button - позволяет перемещать панели при помощи средней кнопки мыши. Полезно когда бордюр окна скрыт (меню Show caption).
Align panels to edges of each other when dragging - выравнивать панели по краям друг друга при перетаскивании окошек. Полезно при построении интерфейса сборки, где панели должны быть расположены плотно друг к другу.
Show scrollbars for out-of-view panels - экспериментальная функция показа полос прокрутки, если панели выходят из зоны видимости. Прокручиваются только панели, содержимое отрисованного окна не меняется и не скроллится.
Hide panels on close - скрывать окна вместо их закрытия. Полезно для временного скрытия панели с помощью кнопки закрытия окна. Вернуть обратно окна можно в размещателе Columns UI сняв галочку Hidden с панели (или из "списка панелей" см. выше):

6.PNG



Программный интерфейс
Базовое API всегда зависит от плагина, на котором основана текущая версия JSplitter. Документация к плагину прилагается. Плюс к этому доступны следующие дополнения для объекта window:

window.GetPanel(caption) - получить объект для доступа к панели по тексту заголовка. Будет возвращена первая панель, совпавшая по тексту с аргументом. Текст панели указывается в заголовке. По умолчанию он имеет значение имени плагина панели, но его можно изменить как напрямую в заголовке окна (Show coords -> Click in caption text), так и в размещателе Columns UI (Use custom title)
window.GetPanelByIndex(index) - получить объект для доступа к панели по индексу. Вообще порядок изначально тот, в котором добавляются панели, но так же порядок можно увидеть в размещателе Columns UI, там же его и изменить.
window.CreateButton(x, y, images, hover_images) - создать кнопку в сплиттере. Кнопка будет создана в корне окна и будет размещена по координатам (x, y). Также функции передаются изображения для задания внешнего вида кнопки. Собственно от количества изображений images, переданных функции, будет зависеть количество состояний, которые может принимать кнопка. hover_images - изображения кнопки, отображающиеся при наведении курсора мыши. Функция достаточно гибкая для создания различного вида кнопок, например:
var path = fb.FoobarPath + "themes\\lur\\black\\bio.png";
var hpath = fb.FoobarPath + "themes\\lur\\black\\bio_on.png";
var a = window.CreateButton(0, 0, path, hpath); - создает обычную кнопку с картинкой bio.png, которая меняется на bio_on.png при наведении курсора мыши
var b = window.CreateButton(0, 0, [path, hpath], null); - создает чекбокс-кнопку. Обычное состояние - bio.png, нажатое (галочка установлена) - bio_on.png. Обратите внимание, что изображения для наведения курсора отсутствуют. Обычно чекбоксам они и не нужны, но можно их установить при желании.
var c = window.CreateButton(0, 0, [path1, path2, path3], [path1_on, path2_on, path3_on]); - можно создать кнопку с тремя (и более) состояниями. Они будут циклически переключаться при нажатии. Текущее состояние кнопки можно будет получить с помощью свойства кнопки State (см. ниже).
Также можно создать группу радио-кнопок (взаимоисключающих) с помощью следующей функции:
window.RadioButtons(buttons) - создает группу радио-кнопок. Принимает в качестве аргумента массив кнопок. Каждая кнопка должна иметь не менее двух состояний, иначе функция свалится. Пример:
var a = window.CreateButton(0, 0, [path, hpath], null);
var b = window.CreateButton(30, 0, [path, hpath], null);
window.RadioButtons([a, b]);
Теперь при нажатии на одну кнопку (состояние 1), другая будет "отключаться" (переходить в состояние 0) и наоборот.
window.GetButton(id) - получить кнопку по значению ее идентификатора (Button.ID)
window.RemoveButton(button) - удаляет кнопку
window.HandOnButtons - переключает курсор мыши для всех кнопок либо на руку, либо на стрелку. Данное свойство также действует на все создаваемые впоследствии кнопки. У каждой кнопки это свойство можно менять индивидуально (см. ниже).

Введены вспомогательные методы для управления главным окном плеера.
window.FoobarWindowX - возвращает и устанавливает положение главного окна foobar2000 по оси X.
window.FoobarWindowY - возвращает и устанавливает положение главного окна foobar2000 по оси Y.
window.FoobarWindowWidth - возвращает и устанавливает ширину главного окна foobar2000.
window.FoobarWindowHeight - возвращает и устанавливает высоту главного окна foobar2000.

Так как JSplitter не получает никакой информации о передвижении мыши над панелями самих плагинов, но иногда это требуется, то введено API для получения данных событий. Перед использованием данного API его необходимо явно разрешить в настройках JSplitter (опция "Track mouse over panels (for on_panel_mouse_*)"/"Отслеживать мышь над панелями (для on_panel_mouse_*)").
window.TrackMouseEnterLeaveOnPanels = true; - включает отслеживание входа/выхода курсора мыши из области панелей. По умолчанию false. Для обработки событий используются следующие функции:
on_panel_mouse_enter(name) - событие входа курсора в область панели, name - имя панели
on_panel_mouse_leave(name) - событие выхода курсора из области панели, name - имя панели
window.TrackMouseMoveOnPanels = true; - включает отслеживание позиции курсора мыши в пределах области панели. По умолчанию false. Для обработки события используется следующая функция:
on_panel_mouse_move(name, x, y, mask) - событие перемещения курсора в пределах области панели, name - имя панели, x,y - координаты точки на панели

Объекты, получаемые при помощи функций, указанных выше, имеют следующие свойства и методы:

ПАНЕЛИ (GetPanel, GetPanelByIndex)
Свойства:
(readonly) String Name;
(read, write) String Text;
(read, write) boolean Hidden;
(read, write) boolean Locked;
(read, write) boolean ShowCaption;
(read, write) boolean SupportPseudoTransparency;
(read, write) int X;
(read, write) int Y;
(read, write) int Width;
(read, write) int Height;
(read, write) boolean TopMost;
(read, write) boolean EraseBackground;
Методы:
void Show(show = true);
void Move(x, y, width, height, repaintParent = false);

КНОПКИ (CreateButton, GetButton)
Свойства:
(readonly) ushort ID;
(read, write) int X;
(read, write) int Y;
(read, write) int Width;
(read, write) int Height;
(read, write) boolean Hidden;
(read, write) boolean HandOnHover;
(read, write) Function Click;
(read, write) uint State;
Методы:
void Show(show = true);
void Move(x, y);
void Resize(width, height);

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

1. При помощи задания свойства Click объекта кнопки:
var a = window.CreateButton(0, 0, [path, hpath], null);
a.Click = function() { do_something(); }

2. При помощи специального callback'a, который вызывается при нажатии ВСЕХ кнопок, созданных с помощью window.CreateButton:
function on_button_click(id) - принимает идентификатор кнопки, который можно получить через свойство кнопки ID.
switch(id) {
case a.ID:
do_something();
break;
}


ПРИМЕЧАНИЕ: В отличие от панелей, существующих вне зависимости от скрипта, кнопки создаются только программно с помощью скрипта и всегда уничтожаются при выгрузке скрипта.


Пример конфигурации
Распаковать в папку с чистым портативным фубаром.
СКАЧАТЬ / ЗЕРКАЛО

Пример от zeremy

История версий
Версия 3.6.1.14 [16.02.2025]
● Исправлена критическая ошибка в функции setInterval (скрипты, использующие ее, работали некорректно).
● Добавлена реализация свойства Click (чтение/запись) объекта кнопки, созданного функцией window.CreateButton.

Версия 3.6.1.12 [15.02.2025]
● Вызовы «связанных функций» (получаемых с помощью Function.prototype.bind()) в SMP API были сломаны из-за изменений в API движка JS.

Версия 3.6.1.11 [14.02.2025]
● Обновлен движок JS до SpiderMonkey ESR128 (128.7.0esr)
● Обновлен движок редактора кода до Scintilla 5.5.4
● Обновлен foobar2000 SDK до 20241203
● При импорте пакета скриптов возникала ошибка (mz_zip_reader_init_file failed with error 0x11: file open failed), когда путь к архиву содержал нелатинские символы.
● При завершении работы плеера иногда происходил сбой, при этом создавался дамп в crash_reports (Access violation, Symbol: "D2D1CreateFactory")
● При выполнении utils.IsFile / utils.IsDirectory возникали ошибки скрипта, если происходили ошибки доступа к файловой системе. Теперь функции просто возвращают false.
● Теперь при вызове utils.ColourPicker цвета сохраняются в наборе до выхода из программы.
● Комплект скриптов примеров в папке samples\complete обновлен в соответствии с исправлениями regor от 29.10.2024
● ВНИМАНИЕ! Начиная с этой версии Windows 7 не поддерживается.

Версия 3.6.1.10 [05.10.2024]
● При переключении тем DUI, включающих в состав себя панель JSplitter, не выполнялось обновление корневого окна.

Версия 3.6.1.9 [04.10.2024]
● При импорте темы DUI, включающей в состав себя панель JSplitter, дополнительно выполнялся скрипт из текущей темы, что приводило к сообщениям об ошике при обращении скрипта к несуществующим более панелям
● Обновлен движок редактора кода до Scintilla 5.5.2

Версия 3.6.1.8 [25.07.2024]
● Возвращены следующие функции:
Код: Выделить всё
plman.GetGUID(playlistIndex)
plman.FindByGUID(guid)
● Обновлен движок редактора кода до Scintilla 5.5.1

Версия 3.6.1.7 [11.05.2024]
● Исправлен баг с неверным изменением порядка панелей при перетягивании мышкой в Panel list (Список панелей)
● Обновлен движок редактора кода до Scintilla 5.5.0

Версия 3.6.1.6 [10.05.2024]
● Откат движка JS до SpiderMonkey ESR102 (102.15.1esr) ввиду наличия многочисленных рандомных ошибок при инициализации скриптов (касается больше версии x64)

Версия 3.6.1.5 [05.05.2024]
● Добавлена поддержка архитектуры x64
● Обновлен движок JS до SpiderMonkey ESR115 (115.9.1esr)
● Расширены настройки цветовой схемы редактора (см. Options->Configure..., а также примеры в Options->Presets)
● Добавлено мультиредактирование (Ctrl+клик мыши для установки следующего курсора) и мультивыделение (Ctrl+новое выделение) (добавлена настройка редактора selection.multiple = 1)
● Добавлено подсвечивание аналогичного текста при выделении (добавлена настройка редактора selection.match = 1)
● Добавлено сворачивание/разворачивание блоков кода (добавлена настройка редактора fold.show = 1), добавлены горячие клавиши для сворачивания/разворачивания всех блоков: Ctrl+Alt+PgUp/Ctrl+Alt+PgDn

Версия 3.6.1.3 [27.02.2024]
● Исправлено игнорирование свойства features в window.DefinePanel и window.DefineScript

Версия 3.6.1.2 [15.02.2024]
● Mozilla SpiderMonkey ESR91 (91.13.0esr)
● plman.GetGUID(playlistIndex)
● plman.FindByGUID(guid)

Версия 2.8.8 [06.08.2022]
● JScript Panel 2.8.8

Версия 2.8.7 [03.08.2022]
● JScript Panel 2.8.7
● Обработчики событий кнопок мыши игнорировали результат возврата

Версия 2.8.6.2 [06.05.2022]
● JScript Panel 2.8.6.2

Версия 2.8.0 [17.01.2022]
● JScript Panel 2.8.0

Версия 3.6.1 [17.01.2022]
● Spider Monkey Panel 1.6.1

Версия 3.5.2-p5 [29.11.2021]
● Добавлена опция в настройках для разрешения использования API отслеживания мыши над панелями (опция "Track mouse over panels (for on_panel_mouse_*)"/"Отслеживать мышь над панелями (для on_panel_mouse_*)")

Версия 2.7.2.1 [29.11.2021]
● JScript Panel 2.7.2.1
● Добавлена опция в настройках для разрешения использования API отслеживания мыши над панелями (опция "Track mouse over panels (for on_panel_mouse_*)"/"Отслеживать мышь над панелями (для on_panel_mouse_*)")

Версия 3.5.2-p4 [24.10.2021]
● Исправлена ошибка появления окна с информацией об отсутствии shared.dll в операционных системах ниже Windows 10

Версия 2.7.2-p2 [24.10.2021]
● Исправлена ошибка появления окна с информацией об отсутствии shared.dll в операционных системах ниже Windows 10

Версия 2.7.2-p1 [14.10.2021]
● Исправлено зависание плеера при установке псевдопрозрачности для дочерней панели JSplitter

Версия 3.5.2-p3 [25.09.2021]
● Исправления API для отслеживания курсора мыши над панелями плагинов

Версия 2.7.2 [25.09.2021]
● JScript Panel 2.7.2
● Исправления API для отслеживания курсора мыши над панелями плагинов

Версия 2.7.0.1-p2 [21.09.2021]
● Добавлено исправление в работе API для отслеживания курсора мыши над панелями многопоточных плагинов

Версия 3.5.2-p2 [20.09.2021]
● Добавлено API для отслеживания курсора мыши над панелями плагинов

Версия 2.7.0.1-p1 [20.09.2021]
● Добавлено API для отслеживания курсора мыши над панелями плагинов

Версия 2.7.0.1 [18.09.2021]
● JScript Panel 2.7.0.1
● Мелкие фиксы

Версия 3.5.2 [14.09.2021]
● Spider Monkey Panel 1.5.2
Реализована поддержка DUI (Default User Interface)
● Расширено окно управления панелями (добавлены столбцы для скрытия/отображения панели и ее рамки)
● Изменен механизм сворачивания панелей (оконный менеджер плагина)

Версия 2.7.0 [14.09.2021]
● JScript Panel 2.7.0
● Изменен механизм сворачивания панелей (оконный менеджер плагина)

Версия 2.6.2.3 [03.09.2021]
● JScript Panel 2.6.2.3
Реализована поддержка DUI (Default User Interface)
● Расширено окно управления панелями (добавлены столбцы для скрытия/отображения панели и ее рамки)

Версия 3.3.1 [23.07.2020]
● Spider Monkey Panel 1.3.1

Версия 3.3.0 [17.07.2020]
● Spider Monkey Panel 1.3.0

Версия 3.2.4b [07.07.2020]
● Spider Monkey Panel 1.2.4b

Версия 2.3.3.1 [01.12.2019]
● JScript Panel 2.3.3.1
● Немного улучшено окно управления панелями

Версия 2.2.1 [15.03.2019]
● JScript Panel 2.2.1

Версия 2.2.0 [25.01.2019]
● JScript Panel 2.2.0

Версия 2.1.8 [03.01.2019]
● JScript Panel 2.1.8

Версия 2.1.7.1 [26.09.2018]
● JScript Panel 2.1.7.1
● Введены вспомогательные методы для управления главным окном плеера.
window.FoobarWindowX - возвращает и устанавливает положение главного окна foobar2000 по оси X.
window.FoobarWindowY - возвращает и устанавливает положение главного окна foobar2000 по оси Y.
window.FoobarWindowWidth - возвращает и устанавливает ширину главного окна foobar2000.
window.FoobarWindowHeight - возвращает и устанавливает высоту главного окна foobar2000.

Версия 2.1.6.3 / 1.5.10.2 [25.08.2018]
● Улучшена производительность прорисовки панелей: устранено мерцание за счет отключения прорисовки фона панели операционной системой.
● API: добавлено свойство EraseBackground для панелей, указывающее позволять ли операционной системе отрисовывать фон панели. Предназначено для панелей, которые не могут отобразить свой фон самостоятельно. По умолчанию свойство равно false для всех панелей кроме следующих панелей Columns UI: Buttons, Filter Search, Menu, Seekbar, Volume.

Версия 2.1.6.2 [10.08.2018]
● Исправлена работоспособность конфигурации JSplitter в Columns UI Layout (кнопка Configure)
● Мелкие улучшения Panel list
● Убран раздел статистики JScript Panel из свойств трека

Версия 2.1.6.1 [03.08.2018]
● Порядок размещения панелей в сплиттере теперь привязан к глубине их расположения. Самое верхнее окно - последнее в списке.
● Добавлено свойство TopMost для объекта панели. Установка в true переносит панель на самый верх.
● Теперь изображения на кнопках масштабируются при изменении размера кнопок.
● Исправлено падение обработчика Click для кнопок
● Создано окно управления списком панелей для просмотра их размеров и редактирования всех данных на месте. Доступ: правая кнопка мыши на сплиттере -> Изменить скрипт... -> Панели.

Версия 2.1.6.0 [30.07.2018]
● Версия, основанная на JScrpt Panel 2.1.6

Версия 1.5.10.1 [24.05.2018]
● Слегка уменьшено мерцание при перерисовке панелей

Версия 2.1.4.1 [18.05.2018]
● Исправлена ошибка "Load Scintilla failed."

Версия 2.1.4 [17.05.2018]
● Версия, основанная на JScrpt Panel 2.1.4

Версия 1.0.4 [28.03.2018]
● Исправлено: в Windows XP свойства fb.FoobarPath, fb.ProfilePath возвращали пустую строку.
● Изменение API: теперь window.GetPanel принимает в качестве аргумента текст заголовка панели, window.GetPanelByIndex - индекс панели

Версия 1.0.3 [22.03.2018]
● Исправление ошибок функционала выравнивания панелей

Версия 1.0.2 [22.03.2018]
● Исправление ошибок функционала выравнивания панелей

Версия 1.0.1 [21.03.2018]
● Добавлено выравнивание/прилипание панелей по краям друг друга, а также к границам окна самого плагина при перетаскивании (есть опция в настройках)

Версия 1.0 [20.03.2018]
LUR M
Автор темы, Модератор
Аватара
Откуда: Минск
Репутация: 405
С нами: 12 лет 3 месяца


Сообщение #421 yeyo » 12.11.2024, 08:45

Hi, LUR!
Is there any way to freeze the hidden window to reduce resource usage until it is activated again when the hiding is canceled? Thank you!

Also, the d2d1 crash when exiting fb has been bugging me, is it related to this one that marc2003 has fed back? I'll upload the crash report for your reference!
marc2003:About this crash on exit... it's because you're calling Scintilla_ReleaseResources from DllMain>DLL_PROCESS_DETACH.

This was fine in original JSP/SMP using the default technology but crashes since you now seem to be using Technology::DirectWrite.

So call Scintilla_ReleaseResources from initquit::on_quit or use this macro...

FB2K_RUN_ON_QUIT(Scintilla_ReleaseResources);
Вложения
crash reports.rar
(44.67 КБ) Скачиваний: 44
yeyo
Репутация: 1
С нами: 2 года 6 месяцев

Сообщение #422 LUR » 13.02.2025, 09:35

regor:some changes to current features (which hopefully should be easy to implement), like the limit of heap size at advanced preferences.
SpiderMonkey API has a limit for context memory:
// Create a new context (and runtime) for this thread.
extern JS_PUBLIC_API JSContext* JS_NewContext(uint32_t maxbytes, JSRuntime* parentRuntime = nullptr);
But I can increase the limit for the garbage collection threshold (now it is 256MB).

Добавлено спустя 12 минут 31 секунду:
regor:And please, the limit of 60s on the slow script warning. Allowing a 0 or -1 to disable it and much higher values too. This one alone has provoked a lot of script reports when tagging huge libraries on batch using scripts and similar things.

Do you really think a “slow” script has the right to live in any more or less normally designed program environment? There is a substitution of notions here. It is not a “slow” script, it is a script that is similar to a program that “does not respond”. This should not happen in principle. Any long operation should be executed in a separate thread, allowing the user to continue working or at least to see that the process of execution continues, not hangs. Here is a video example of how to write functions that execute something for a very long time (by the way, judging by your scripts, you know what asynchrony is). And with this approach, you won't even see the “slow script message” because the program will keep responding to your actions:

phpBB [media]


Добавлено спустя 7 минут 17 секунд:
regor:1. Packages are not loaded properly
Fixed in an upcoming version.

Добавлено спустя 39 секунд:
regor:Have to test other things, not sure if you implemented these fixes:
Added

Добавлено спустя 21 минуту 6 секунд:
regor:There are some remaining important bugs, like ActiveX objects connecting to internet crashing foobar2000 on panel reload/shutdown. Can give more details if needed. In particular 'WinHttp.WinHttpRequest.5.1' or 'Microsoft.XMLHTTP' and their variants.

I have not dealt with these issues, but in my build still lives a large biography script by our forum member. The script hasn't been updated in 3 years almost, but it works. Microsoft.XMLHTTP is there too and nothing crashes.
LUR M
Автор темы, Модератор
Аватара
Откуда: Минск
Репутация: 405
С нами: 12 лет 3 месяца

Сообщение #423 LUR » 14.02.2025, 06:17

Версия 3.6.1.11 [14.02.2025]

● Обновлен движок JS до SpiderMonkey ESR128 (128.7.0esr)
● Обновлен движок редактора кода до Scintilla 5.5.4
● Обновлен foobar2000 SDK до 20241203
● При импорте пакета скриптов возникала ошибка (mz_zip_reader_init_file failed with error 0x11: file open failed), когда путь к архиву содержал нелатинские символы.
● При завершении работы плеера иногда происходил сбой, при этом создавался дамп в crash_reports (Access violation, Symbol: "D2D1CreateFactory")
● При выполнении utils.IsFile / utils.IsDirectory возникали ошибки скрипта, если происходили ошибки доступа к файловой системе. Теперь функции просто возвращают false.
● Теперь при вызове utils.ColourPicker цвета сохраняются в наборе до выхода из программы.
● Комплект скриптов примеров в папке samples\complete обновлен в соответствии с исправлениями regor от 29.10.2024
● ВНИМАНИЕ! Начиная с этой версии Windows 7 не поддерживается.
LUR M
Автор темы, Модератор
Аватара
Откуда: Минск
Репутация: 405
С нами: 12 лет 3 месяца

Сообщение #424 LUR » 15.02.2025, 04:27

Версия 3.6.1.12 [15.02.2025]

● Вызовы "связанных" функций, получаемых с помощью Function.prototype.bind(), в SMP API были сломаны из-за изменений в API движка JS.
LUR M
Автор темы, Модератор
Аватара
Откуда: Минск
Репутация: 405
С нами: 12 лет 3 месяца

Сообщение #425 dreamawake » 15.02.2025, 05:06

Thanks for the update
dreamawake
Репутация: 3
С нами: 1 год 10 месяцев

Сообщение #426 yeyo » 15.02.2025, 11:16

Thanks for the update

After updating to 3.6.1.12, all js panels will not work properly, reaction freeze or click operation, etc. will be invalid, and everything will be normal when returning to 3.6.1.11.
yeyo
Репутация: 1
С нами: 2 года 6 месяцев

Сообщение #427 LUR » 15.02.2025, 18:55

yeyo:all js panels will not work properly
Give me please examples of your panels, I will look into it later.
LUR M
Автор темы, Модератор
Аватара
Откуда: Минск
Репутация: 405
С нами: 12 лет 3 месяца

Сообщение #428 yeyo » 16.02.2025, 04:26

LUR:Give me please examples of your panels, I will look into it later.
You can use the included sample scripts to test, such as: samples\jsplaylist-mod, samples\jsplaylist-mod and so on, all js work is abnormal
yeyo
Репутация: 1
С нами: 2 года 6 месяцев

Сообщение #429 LUR » 16.02.2025, 12:47

Версия 3.6.1.14 [16.02.2025]

● Исправлена критическая ошибка в функции setInterval (скрипты, использующие ее, работали некорректно).
● Добавлена реализация свойства Click (чтение/запись) объекта кнопки, созданного функцией window.CreateButton.
LUR M
Автор темы, Модератор
Аватара
Откуда: Минск
Репутация: 405
С нами: 12 лет 3 месяца

Сообщение #430 yeyo » 16.02.2025, 16:14

Thanks for the update, it's working fine now.
yeyo
Репутация: 1
С нами: 2 года 6 месяцев

Сообщение #431 regor » 17.02.2025, 18:43

LUR:SpiderMonkey API has a limit for context memory:
// Create a new context (and runtime) for this thread.
extern JS_PUBLIC_API JSContext* JS_NewContext(uint32_t maxbytes, JSRuntime* parentRuntime = nullptr);
So the max value can not be greater than 4294967295 (in bytes)? i.e. 4 Gbs?

Do you really think a “slow” script has the right to live in any more or less normally designed program environment?

I get your point but there is a misconception here. That warning was added to avoid infinite loops (i.e. program not responding anymore as you say) ok; but the problem is such warnings are useless for actions which require a lot of time since there are not additional threads on SMP (contrary to browsers which have web-workers). Your example is trivial, you are just using async to perform an action which requires a few ms to process, but it's still being processed on the same thread (just later).

See this: https://insights.encora.com/insights/javascript-settimeout-and-promise-under-the-hood

The bottom of the page explains the problem, it doesn't matter if you wrap intensive operations on timeouts or promises since they are still being processed on a single thread (they are just added to the queue after other code), so the process is still blocked at that point.

You can not easily ASYNC process your entire library. i.e. if you retrieve a tag for all tracks from your library, no matter how you do it it will take some time on large libraries. You have these kind of problems for really intensive operations, like fingerprinting matching, track comparison, etc. And the only way to "avoid" it, is by artificcially adding timers without processing between chunks.

An example of the problem:
Спойлер
Код: Выделить всё
"use strict";

      console.log('This example works fine for small libraries, but it will show problems when you are having +100k tracks...');
      console.log('Note %PLAYED_TIMES% may easily had thousands of values when you have enhanced playback statistics component installed since years');
      const librarySize = 100000;
      const tf = fb.TitleFormat('%GENRE%|%STYLE%|%RATING%|%PLAYCOUNT%|%PLAYED_TIMES%');

      const test = new FbProfiler('test');
      console.log('This is blocking the program while processing');
      let handleList = fb.GetLibraryItems();
      while (handleList.Count < librarySize) { // Obviously really huge libraries need more time than this trick
         handleList.InsertRange(handleList.Count, fb.GetLibraryItems());
      }
      tf.EvalWithMetadbs(handleList);
      test.Print('Sync');

      test.Reset();
      new Promise((resolve) => {
         console.log('This is also blocking the program while processing, since .EvalWithMetadbs is not done on another process even if it\'s wrapped in a promise');
         handleList = fb.GetLibraryItems();
         while (handleList.Count < librarySize) {
            handleList.InsertRange(handleList.Count, fb.GetLibraryItems());
         }
         resolve(tf.EvalWithMetadbs(handleList));
      }).then(() => test.Print('Async'));

In my library (aprox. 100K tracks) it needs between 3 and 5 seconds. Note it's just retrieving the tags, not even doing anything with it! I have seen reports at multiple places where SMP also had problems with much bigger libraries (x3 at least).

Note most SMP method are not async, so in the end, for large data, you have a problem unless the popup can be disabled.

This problem can be somewhat avoid by creating an artificial async method, which slices the input on chunks which are expected to be processed under the refresh frame rate. Time not used by code (under 25 ms) is used by the program to parse the UI input, but this is totally arbitrary since you can not ensure at all that timeout is enough for every system to process the chunk. Therefore there will be some cases and systems where this still blocks the UI.

Спойлер
Код: Выделить всё
FbTitleFormat.prototype.EvalWithMetadbsAsync = function EvalWithMetadbsAsync(handleList, slice = 1000) {
         const size = handleList.Count;
         // eslint-disable-next-line no-async-promise-executor
         return new Promise(async (resolve) => { // NOSONAR
            const items = handleList.Convert();
            const count = items.length;
            const total = Math.ceil(size / slice);
            const tags = [];
            let prevProgress = -1;
            for (let i = 1; i <= total; i++) {
               await new Promise((resolve) => {
                  setTimeout(() => {
                     const iItems = new FbMetadbHandleList(items.slice((i - 1) * slice, i === total ? count : i * slice));
                     tags.push(...this.EvalWithMetadbs(iItems));
                     const progress = Math.round(i / total * 100);
                     if (progress % 25 === 0 && progress > prevProgress) { prevProgress = progress; console.log('EvalWithMetadbsAsync (' + this.Expression + ') ' + progress + '%.'); }
                     resolve('done');
                  }, 25);
               });
            }
            resolve(tags);
         });
      };

You can see this kind of code working on my statistics framework:
https://github.com/regorxxx/Timeline-SMP

It has both sync and async modes, sync mode just blocks the UI during processing which is unavoidable using standard SMP methods. The process in chunks hack (which is clearly working over something which should be done in C++) just tries to not process to much at once to not block the UI. The total processing time may easily be x3 or x4 due to the timeouts overhead and even then it's not 100% sure that UI is not blocked (for sure the popup is avoided, but not the real problem!).


Also note CMD calls within SMP need to be synchronous some times to work properly. For ex. calling ffmpeg to process a track within a SMP panel. It may easily take 20 seconds. Using something like this:

Спойлер
Код: Выделить всё
const WshShell = new ActiveXObject('WScript.Shell');
WshShell.Run(command, iShow, bWait);

If you don't run it with 'bWait' it's async, but you have NO RETURN at all. No promises. Nothing. So you never know when the external process ends. The only -reliable- solution is waiting for the process to end, and SMP considers that as an "infinite loop".

In resume all CMD actions (which could be used to backup files, process tracks with SOX/ffmpeg, downloads, etc.) and actions which process the entire library (library managers, track comparison by feature-vectors, fingerprint comparison, library taggers, etc.) have these kind of problems. And that slow script warning does nothing but annoying the final user. If there is something which can be improved on code, it will be obvious on normal usage and people will still report it, whether you have the warning or not. But for sure for special cases where code needs time and there is no workaround, it's just an annoyance. I'm fine with maintaining it by default if you think it's a good safe-measure, but being able to disable is essential for serious development and heavy scripts. I think you added such possibility on the latest releases, much appreciated! I had a few users with really big libraries or slow systems which will surely appreciate it.

I have not dealt with these issues, but in my build still lives a large biography script by our forum member. The script hasn't been updated in 3 years almost, but it works. Microsoft.XMLHTTP is there too and nothing crashes.

I was talking about Wiilb script, which may be using another method than the one you use. I will send you a sample file to test it asap. It's an error which has been reproduced by at least +10 people on the other forum in SMP.
regor
Репутация: 0
С нами: 4 месяца 15 дней

Пред.

Вернуться в Плагины