namespace PlaylistShared.Pwa.Services; /// /// Глобальный сервис управления аудиоплеером. /// Позволяет управлять воспроизведением из любого компонента. /// public interface IAudioPlayerService { #region Состояние плеера (для чтения) /// ID текущего воспроизводимого трека (null, если ничего не играет). string? CurrentTrackId { get; } /// Играет ли в данный момент (true) или приостановлен (false). bool IsPlaying { get; } /// Текущая громкость (0–100). double CurrentVolume { get; set; } /// Прогресс воспроизведения в процентах (0–100). double CurrentProgress { get; } /// Отформатированное текущее время (мм:сс). string CurrentTime { get; } /// Отформатированная общая длительность (мм:сс). string TotalTime { get; } /// Отформатированное название текущего трека. string? CurrentTrackTitle { get; } /// URL обложки текущего трека. string? CurrentTrackCoverUrl { get; } #endregion #region Команды управления (вызываются из компонентов) /// Загрузить и начать воспроизведение трека. /// ID трека. /// Опциональный access-токен (если не указан, будет взят из хранилища). /// ID расшаренного плейлиста (для неавторизованного доступа). /// Название трека. (Если не передано, вызывает api для получения) /// URL обложки трека. (Если не передано, вызывает api для получения) Task LoadAndPlayAsync(string trackId, string? accessToken = null, string? sharedPlaylistId = null, string? title = null, string? coverUrl = null); /// Воспроизвести (если трек загружен и на паузе). Task PlayAsync(); /// Поставить на паузу. Task PauseAsync(); /// Остановить воспроизведение и выгрузить трек. Task StopAsync(); /// Перемотать на указанный процент (0–100). Task SeekToAsync(double percent); /// Установить громкость (0–100). Task SetVolumeAsync(double volume); #endregion #region События для подписки на изменения состояния /// /// Событие, возникающее при любом изменении состояния плеера: /// смена трека, старт/пауза/стоп, обновление прогресса, изменение громкости, окончание трека. /// Подписывайтесь на него, чтобы перерисовывать UI (например, иконку "пауза/плей"). /// event Action? OnStateChanged; #endregion #region События для связи с реальным компонентом AudioPlayer (Эти события вызываются сервисом) /// Запрос на загрузку и воспроизведение трека. event Func? OnLoadAndPlayRequested; /// Запрос на воспроизведение (снять с паузы). event Func? OnPlayRequested; /// Запрос на паузу. event Func? OnPauseRequested; /// Запрос на остановку и выгрузку трека. event Func? OnStopRequested; /// Запрос на перемотку (процент 0–100). event Func? OnSeekRequested; /// Запрос на изменение громкости (0–100). event Func? OnVolumeChangeRequested; #endregion #region Методы для обновления состояния из AudioPlayer (Вызываются компонентом AudioPlayer, когда реальный аудиоэлемент меняет своё состояние.) /// Уведомить сервис о том, что трек начал или прекратил играть. void SetPlayingState(bool isPlaying); /// Установить ID текущего трека. void SetCurrentTrack(string? trackId); /// Обновить прогресс и отображаемое время. void UpdateProgress(double progress, string currentTime, string totalTime); /// Уведомить об окончании трека. void NotifyTrackEnded(); #endregion }