Код:
// ==PREPROCESSOR==
// @name "Playlist Total Progress Bar"
// @version "1.1"
// ==/PREPROCESSOR==
// ================================================== //
// (2025-03-21)
// ================================================== //
// Функция формирования строкового формата для выравнивания
function StringFormat() {
var h_align = 0,
v_align = 0,
trimming = 0,
flags = 0; // Инициализация переменных
switch (arguments.length) {
case 4:
flags = arguments[3];
break; // Добавлен break для предотвращения "падения" в следующий case
case 3:
trimming = arguments[2];
break; // Добавлен break
case 2:
v_align = arguments[1];
//break; // Добавлен break
case 1:
h_align = arguments[0];
break; // Добавлен break
default:
return 0; // Если аргументы не подходят, вернуть 0
}
// Формирование битового представления параметров
return ((h_align << 28) | (v_align << 24) | (trimming << 20) | flags);
}
// Объект с параметрами выравнивания
StringAlignment = {
Near: 0,
Center: 1,
Far: 2
};
// Функция для создания цвета в формате RGB
function RGB(r, g, b) {
return (0xff000000 | (r << 16) | (g << 8) | (b)); // Установка альфа-канала на 255
}
// Функция форматирования времени
function formatPlaylistTotalDurationText(seconds) {
var DURATION = {
weeks: 0,
days: 0,
text: ""
};
// Вычисляем недели и дни
if (seconds > 0) {
if (Math.floor(seconds / 604800) > 0) {
DURATION.weeks = Math.floor(seconds / 604800);
seconds -= DURATION.weeks * 604800;
DURATION.text = DURATION.weeks + (DURATION.weeks > 1 ? "нд" : "нд");
}
if (Math.floor(seconds / 86400) > 0) {
DURATION.days = Math.floor(seconds / 86400);
seconds -= DURATION.days * 86400;
if (DURATION.text.length > 0) {
DURATION.text += " " + DURATION.days + (DURATION.days > 1 ? "д" : "д");
} else {
DURATION.text = DURATION.days + (DURATION.days > 1 ? "д" : "д");
}
}
}
// Форматируем оставшиеся секунды в формате HH:MM:SS
var hours = Math.floor(seconds / 3600);
seconds %= 3600;
var minutes = Math.floor(seconds / 60);
var remainingSeconds = Math.floor(seconds % 60); // Берём только целые секунды
// Добавляем ведущие нули, если необходимо
var formattedTime = (hours < 10 ? "0" + hours : hours) + ":" +
(minutes < 10 ? "0" + minutes : minutes) + ":" +
(remainingSeconds < 10 ? "0" + remainingSeconds : remainingSeconds);
// Объединяем текст для недель/дней с отформатированным временем
if (DURATION.text.length > 0) {
return DURATION.text + " " + formattedTime;
} else {
return formattedTime;
}
}
var g_timer; // Таймер для обновления
var ww, wh; // Переменные для ширины и высоты окна
var g_font = gdi.Font("Segoe UI", 12, 0); // Шрифт для отображения текста
var g_tfo = fb.GetPlaylistName(fb.PlayingPlaylist); // Имя текущего плейлиста
var g_stringformat = StringFormat(StringAlignment.Center, StringAlignment.Center); // Формат строки для центрирования
// Цвета для фона и прогресса
var bg_color = RGB(190, 190, 190); // Цвет фона
var fg_color = RGB(0, 150, 200); // Цвет прогресса
// Обработка изменения размера окна
function on_size() {
ww = window.Width; // Установка ширины
wh = window.Height; // Установка высоты
}
// Основная функция рисования
function on_paint(gr) {
gr.SetTextRenderingHint(5); // Установка режима рендеринга текста
var playlist = plman.GetPlaylistItems(plman.PlayingPlaylist); // Получение текущего плейлиста
var total_tracks = plman.PlaylistItemCount(plman.PlayingPlaylist); // Общее число треков в плейлисте
var txt; // Переменная для текста
// Вычисление общей продолжительности треков
var total_duration = 0;
for (var i = 0; i < total_tracks; i++) {
total_duration += playlist.Item(i).Length; // Суммирование длительностей
}
// Вычисление текущего времени воспроизведения
var current_time = 0;
var now_playing = fb.GetNowPlaying(); // Получение текущего воспроизводимого трека
if (now_playing && total_tracks > 0) { // Проверка на наличие воспроизводимого трека и треков в плейлисте
var current_index = -1; // Индекс текущего трека
// Определение индекса текущего трека в плейлисте
for (var i = 0; i < total_tracks; i++) {
if (playlist.Item(i).Path === now_playing.Path) {
current_index = i; // Запоминаем индекс трека
break; // Прерываем цикл
}
}
if (current_index !== -1) { // Если текущий трек найден
// Суммируем продолжительности всех предыдущих треков
for (var i = 0; i < current_index; i++) {
current_time += playlist.Item(i).Length; // Добавляем время предыдущих треков
}
current_time += fb.PlaybackTime; // Добавляем текущее время воспроизведения
}
}
// Вычисление процента прогресса
var progress = (total_duration > 0) ? (current_time / total_duration) * 100 : 0;
// Рисование прогресс-бара
txt = g_tfo + ": " + formatPlaylistTotalDurationText(current_time) + " / " + formatPlaylistTotalDurationText(total_duration); // Форматирование текста
gr.FillSolidRect(0, 0, ww, wh, bg_color); // Заливка фона
//gr.FillSolidRect(0, 0, (ww * progress) / 100, wh, fg_color); // Заливка прогресс-бара
gr.FillGradRect(0, 0, (ww * progress) / 100, wh, 90, RGB(240, 240, 240), RGB(0, 100, 150));
// Отображение текста с прогрессом
gr.DrawString(txt, g_font, RGB(0, 0, 0), 0, 0, window.Width, window.Height, g_stringformat);
gr.DrawRect(0, 0, ww - 1, wh - 1, 1.0, RGB(150, 150, 150));
}
// Переключение плейлиста
function on_playlist_switch() {
g_tfo = fb.GetPlaylistName(fb.PlayingPlaylist); // Обновляем имя текущего плейлиста
window.Repaint(); // Перерисовка окна
}
// Обработка нового трека
function on_playback_new_track(info) {
g_tfo = fb.GetPlaylistName(fb.PlayingPlaylist); // Обновляем имя текущего плейлиста
window.Repaint(); // Перерисовка окна
}
// Обработка остановки воспроизведения
function on_playback_stop() {
if (g_timer) { // Проверка существует ли таймер
window.KillTimer(g_timer); // Убийство таймера
}
window.Repaint(); // Перерисовка окна
}
// Обработка изменения времени воспроизведения
function on_playback_time() {
if (g_timer) { // Проверка существует ли таймер
window.KillTimer(g_timer); // Убийство таймера
}
// Установка нового таймера, если длина воспроизведения больше 0
if (fb.PlaybackLength > 0) {
g_timer = window.CreateTimerInterval(200); // Установка интервала обновления
}
window.Repaint(); // Перерисовка окна
}
// Обработка таймеров
function on_timer() {
window.Repaint(); // Перерисовка окна
}