namespace Music; public class SefonAudioProvider : IMusicAudioProvider { public string Id => SefonSupport.ProviderId; public string Name => "Sefon"; public bool Enabled => ModInit.conf?.sefon_audio_enabled == true; public bool RequiresAuth => false; public bool CacheMissingMatches => true; public async Task> MatchTrackAsync(MusicTrack track, string playbackMode = null, string profileId = null, CancellationToken cancellationToken = default) { if (track == null || MusicPlaybackModeService.IsVideo(playbackMode)) return Array.Empty(); try { return await SefonSupport.SearchAsync(track, cancellationToken); } catch (OperationCanceledException) { throw; } catch (Exception ex) { throw new MusicAudioTransientException(Id, "match", ex); } } public Task> GetStreamsAsync(MusicAudioMatch match, string playbackMode = null, string profileId = null, CancellationToken cancellationToken = default) { if (match == null || MusicPlaybackModeService.IsVideo(playbackMode)) return Task.FromResult>(Array.Empty()); return Task.FromResult(SefonSupport.BuildSources(match)); } public Task TryGetPreferredStreamAsync(MusicAudioMatch match, string playbackMode = null, string profileId = null, CancellationToken cancellationToken = default) { return Task.FromResult(null); } public Task> SearchMatchesByQueryAsync(string query, CancellationToken cancellationToken = default) { return Task.FromResult>(Array.Empty()); } public bool IsRelevantMatch(MusicTrack track, MusicAudioMatch match) { return SefonSupport.IsRelevantMatch(track, match); } public bool ShouldValidatePinnedMatch(MusicTrack track, MusicAudioMatch match) { return false; } public IReadOnlyList GetFallbackProviderIds(MusicTrack track) { return Array.Empty(); } }