namespace Music; public class SoundCloudAudioProvider : IMusicAudioProvider { public string Id => SoundCloudSupport.AudioProviderId; public string Name => "SoundCloud"; public bool Enabled => SoundCloudSupport.IsAudioEnabled; public bool RequiresAuth => false; public bool CacheMissingMatches => false; 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 SoundCloudSupport.SearchAudioAsync(track, cancellationToken); } catch (OperationCanceledException) { throw; } catch (Exception ex) { throw new MusicAudioTransientException(Id, "match", ex); } } public async Task> GetStreamsAsync(MusicAudioMatch match, string playbackMode = null, string profileId = null, CancellationToken cancellationToken = default) { if (match == null || MusicPlaybackModeService.IsVideo(playbackMode)) return Array.Empty(); try { return await SoundCloudSupport.BuildAudioSourcesAsync(match, cancellationToken); } catch (OperationCanceledException) { throw; } catch (Exception ex) { throw new MusicAudioTransientException(Id, "stream", ex); } } public async Task TryGetPreferredStreamAsync(MusicAudioMatch match, string playbackMode = null, string profileId = null, CancellationToken cancellationToken = default) { if (match == null || MusicPlaybackModeService.IsVideo(playbackMode)) return null; try { return await SoundCloudSupport.BuildPreferredAudioSourceAsync(match, cancellationToken); } catch { return null; } } public Task> SearchMatchesByQueryAsync(string query, CancellationToken cancellationToken = default) { return Task.FromResult>(Array.Empty()); } public bool IsRelevantMatch(MusicTrack track, MusicAudioMatch match) { return SoundCloudSupport.IsRelevantAudioMatch(track, match); } public bool ShouldValidatePinnedMatch(MusicTrack track, MusicAudioMatch match) { return SoundCloudSupport.HasExactTrackId(track); } public IReadOnlyList GetFallbackProviderIds(MusicTrack track) { return new[] { SefonSupport.ProviderId, YouTubeMusicSearchSupport.ProviderId }; } }