Files
PlaylistShared/PlaylistShared.Pwa/Services/IAudioPlayerService.cs

97 lines
5.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
namespace PlaylistShared.Pwa.Services;
/// <summary>
/// Глобальный сервис управления аудиоплеером.
/// Позволяет управлять воспроизведением из любого компонента.
/// </summary>
public interface IAudioPlayerService
{
// ---------- Состояние плеера (для чтения) ----------
/// <summary>ID текущего воспроизводимого трека (null, если ничего не играет).</summary>
string? CurrentTrackId { get; }
/// <summary>Играет ли в данный момент (true) или приостановлен (false).</summary>
bool IsPlaying { get; }
/// <summary>Текущая громкость (0100).</summary>
double CurrentVolume { get; set; }
/// <summary>Прогресс воспроизведения в процентах (0100).</summary>
double CurrentProgress { get; }
/// <summary>Отформатированное текущее время (мм:сс).</summary>
string CurrentTime { get; }
/// <summary>Отформатированная общая длительность (мм:сс).</summary>
string TotalTime { get; }
// ---------- Команды управления (вызываются из компонентов) ----------
/// <summary>Загрузить и начать воспроизведение трека.</summary>
/// <param name="trackId">ID трека.</param>
/// <param name="accessToken">Опциональный access-токен (если не указан, будет взят из хранилища).</param>
/// <param name="sharedPlaylistId">ID расшаренного плейлиста (для неавторизованного доступа).</param>
Task LoadAndPlayAsync(string trackId, string? accessToken = null, string? sharedPlaylistId = null);
/// <summary>Воспроизвести (если трек загружен и на паузе).</summary>
Task PlayAsync();
/// <summary>Поставить на паузу.</summary>
Task PauseAsync();
/// <summary>Остановить воспроизведение и выгрузить трек.</summary>
Task StopAsync();
/// <summary>Перемотать на указанный процент (0100).</summary>
Task SeekToAsync(double percent);
/// <summary>Установить громкость (0100).</summary>
Task SetVolumeAsync(double volume);
// ---------- События для подписки на изменения состояния ----------
/// <summary>
/// Событие, возникающее при любом изменении состояния плеера:
/// смена трека, старт/пауза/стоп, обновление прогресса, изменение громкости, окончание трека.
/// Подписывайтесь на него, чтобы перерисовывать UI (например, иконку "пауза/плей").
/// </summary>
event Action? OnStateChanged;
// ---------- События для связи с реальным компонентом AudioPlayer ----------
// (Эти события вызываются сервисом, а компонент AudioPlayer на них подписывается,
// чтобы выполнить фактические операции с HTML5 Audio.)
/// <summary>Запрос на загрузку и воспроизведение трека.</summary>
event Func<string, string?, string?, Task>? OnLoadAndPlayRequested;
/// <summary>Запрос на воспроизведение (снять с паузы).</summary>
event Func<Task>? OnPlayRequested;
/// <summary>Запрос на паузу.</summary>
event Func<Task>? OnPauseRequested;
/// <summary>Запрос на остановку и выгрузку трека.</summary>
event Func<Task>? OnStopRequested;
/// <summary>Запрос на перемотку (процент 0100).</summary>
event Func<double, Task>? OnSeekRequested;
/// <summary>Запрос на изменение громкости (0100).</summary>
event Func<double, Task>? OnVolumeChangeRequested;
// ---------- Методы для обновления состояния из AudioPlayer ----------
// (Вызываются компонентом AudioPlayer, когда реальный аудиоэлемент меняет своё состояние.)
/// <summary>Уведомить сервис о том, что трек начал или прекратил играть.</summary>
void SetPlayingState(bool isPlaying);
/// <summary>Установить ID текущего трека.</summary>
void SetCurrentTrack(string? trackId);
/// <summary>Обновить прогресс и отображаемое время.</summary>
void UpdateProgress(double progress, string currentTime, string totalTime);
/// <summary>Уведомить об окончании трека.</summary>
void NotifyTrackEnded();
}