// Copyright (c) Arlo Godfrey. All Rights Reserved. // Licensed under the GNU Lesser General Public License, Version 3.0 with additional terms. // See the LICENSE, LICENSE.LESSER and LICENSE.ADDITIONAL files in the project root for more information. using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using CommunityToolkit.Diagnostics; using OwlCore.Events; using StrixMusic.Sdk.AdapterModels; using StrixMusic.Sdk.AppModels; using StrixMusic.Sdk.CoreModels; using StrixMusic.Sdk.MediaPlayback; using StrixMusic.Sdk.Plugins.Model; namespace StrixMusic.Sdk.PluginModels; /// /// Wraps an instance of with the provided plugins. /// public abstract class PlayableCollectionGroupPluginWrapperBase : IPlayableCollectionGroup { private readonly IPlayableCollectionGroup _playableCollectionGroup; private readonly SdkModelPlugin[] _plugins; private readonly SdkModelPlugin _activePlugins = new(PluginModelWrapperInfo.Metadata); /// /// Initializes a new instance of the class. /// /// The instance to wrap around and apply plugins to. /// The plugins that are applied to items returned from or emitted by this collection. internal PlayableCollectionGroupPluginWrapperBase(IPlayableCollectionGroup playableCollectionGroup, params SdkModelPlugin[] plugins) { _playableCollectionGroup = playableCollectionGroup; _plugins = plugins; foreach (var item in plugins) _activePlugins.Import(item); AttachEvents(playableCollectionGroup); } private void AttachEvents(IPlayableCollectionGroup playableCollectionGroup) { playableCollectionGroup.SourcesChanged += OnSourcesChanged; playableCollectionGroup.ImagesCountChanged += OnImagesCountChanged; playableCollectionGroup.UrlsCountChanged += OnUrlsCountChanged; playableCollectionGroup.PlaybackStateChanged += OnPlaybackStateChanged; playableCollectionGroup.NameChanged += OnNameChanged; playableCollectionGroup.DescriptionChanged += OnDescriptionChanged; playableCollectionGroup.DurationChanged += OnDurationChanged; playableCollectionGroup.LastPlayedChanged += OnLastPlayedChanged; playableCollectionGroup.IsChangeNameAsyncAvailableChanged += OnIsChangeNameAsyncAvailableChanged; playableCollectionGroup.IsChangeDescriptionAsyncAvailableChanged += OnIsChangeDescriptionAsyncAvailableChanged; playableCollectionGroup.IsChangeDurationAsyncAvailableChanged += OnIsChangeDurationAsyncAvailableChanged; playableCollectionGroup.IsPlayPlaylistCollectionAsyncAvailableChanged += OnIsPlayPlaylistCollectionAsyncAvailableChanged; playableCollectionGroup.IsPausePlaylistCollectionAsyncAvailableChanged += OnIsPausePlaylistCollectionAsyncAvailableChanged; playableCollectionGroup.PlaylistItemsCountChanged += OnPlaylistItemsCountChanged; playableCollectionGroup.IsPlayTrackCollectionAsyncAvailableChanged += OnIsPlayTrackCollectionAsyncAvailableChanged; playableCollectionGroup.IsPauseTrackCollectionAsyncAvailableChanged += OnIsPauseTrackCollectionAsyncAvailableChanged; playableCollectionGroup.TracksCountChanged += OnTracksCountChanged; playableCollectionGroup.IsPlayAlbumCollectionAsyncAvailableChanged += OnIsPlayAlbumCollectionAsyncAvailableChanged; playableCollectionGroup.IsPauseAlbumCollectionAsyncAvailableChanged += OnIsPauseAlbumCollectionAsyncAvailableChanged; playableCollectionGroup.AlbumItemsCountChanged += OnAlbumItemsCountChanged; playableCollectionGroup.IsPlayArtistCollectionAsyncAvailableChanged += OnIsPlayArtistCollectionAsyncAvailableChanged; playableCollectionGroup.IsPauseArtistCollectionAsyncAvailableChanged += OnIsPauseArtistCollectionAsyncAvailableChanged; playableCollectionGroup.ArtistItemsCountChanged += OnArtistItemsCountChanged; playableCollectionGroup.ChildrenCountChanged += OnChildrenCountChanged; playableCollectionGroup.ImagesChanged += OnImagesChanged; playableCollectionGroup.UrlsChanged += OnUrlsChanged; playableCollectionGroup.DownloadInfoChanged += OnDownloadInfoChanged; playableCollectionGroup.PlaylistItemsChanged += OnPlaylistItemsChanged; playableCollectionGroup.TracksChanged += OnTracksChanged; playableCollectionGroup.AlbumItemsChanged += OnAlbumItemsChanged; playableCollectionGroup.ArtistItemsChanged += OnArtistItemsChanged; playableCollectionGroup.ChildItemsChanged += OnChildItemsChanged; } private void DetachEvents(IPlayableCollectionGroup playableCollectionGroup) { playableCollectionGroup.SourcesChanged -= OnSourcesChanged; playableCollectionGroup.ImagesCountChanged -= OnImagesCountChanged; playableCollectionGroup.UrlsCountChanged -= OnUrlsCountChanged; playableCollectionGroup.PlaybackStateChanged -= OnPlaybackStateChanged; playableCollectionGroup.NameChanged -= OnNameChanged; playableCollectionGroup.DescriptionChanged -= OnDescriptionChanged; playableCollectionGroup.DurationChanged -= OnDurationChanged; playableCollectionGroup.LastPlayedChanged -= OnLastPlayedChanged; playableCollectionGroup.IsChangeNameAsyncAvailableChanged -= OnIsChangeNameAsyncAvailableChanged; playableCollectionGroup.IsChangeDescriptionAsyncAvailableChanged -= OnIsChangeDescriptionAsyncAvailableChanged; playableCollectionGroup.IsChangeDurationAsyncAvailableChanged -= OnIsChangeDurationAsyncAvailableChanged; playableCollectionGroup.IsPlayPlaylistCollectionAsyncAvailableChanged -= OnIsPlayPlaylistCollectionAsyncAvailableChanged; playableCollectionGroup.IsPausePlaylistCollectionAsyncAvailableChanged -= OnIsPausePlaylistCollectionAsyncAvailableChanged; playableCollectionGroup.PlaylistItemsCountChanged -= OnPlaylistItemsCountChanged; playableCollectionGroup.IsPlayTrackCollectionAsyncAvailableChanged -= OnIsPlayTrackCollectionAsyncAvailableChanged; playableCollectionGroup.IsPauseTrackCollectionAsyncAvailableChanged -= OnIsPauseTrackCollectionAsyncAvailableChanged; playableCollectionGroup.TracksCountChanged -= OnTracksCountChanged; playableCollectionGroup.IsPlayAlbumCollectionAsyncAvailableChanged -= OnIsPlayAlbumCollectionAsyncAvailableChanged; playableCollectionGroup.IsPauseAlbumCollectionAsyncAvailableChanged -= OnIsPauseAlbumCollectionAsyncAvailableChanged; playableCollectionGroup.AlbumItemsCountChanged -= OnAlbumItemsCountChanged; playableCollectionGroup.IsPlayArtistCollectionAsyncAvailableChanged -= OnIsPlayArtistCollectionAsyncAvailableChanged; playableCollectionGroup.IsPauseArtistCollectionAsyncAvailableChanged -= OnIsPauseArtistCollectionAsyncAvailableChanged; playableCollectionGroup.ArtistItemsCountChanged -= OnArtistItemsCountChanged; playableCollectionGroup.ChildrenCountChanged -= OnChildrenCountChanged; playableCollectionGroup.ImagesChanged -= OnImagesChanged; playableCollectionGroup.UrlsChanged -= OnUrlsChanged; playableCollectionGroup.DownloadInfoChanged -= OnDownloadInfoChanged; playableCollectionGroup.PlaylistItemsChanged -= OnPlaylistItemsChanged; playableCollectionGroup.TracksChanged -= OnTracksChanged; playableCollectionGroup.AlbumItemsChanged -= OnAlbumItemsChanged; playableCollectionGroup.ArtistItemsChanged -= OnArtistItemsChanged; playableCollectionGroup.ChildItemsChanged -= OnChildItemsChanged; } private void OnSourcesChanged(object sender, EventArgs e) => SourcesChanged?.Invoke(sender, e); private void OnChildItemsChanged(object sender, IReadOnlyList> addedItems, IReadOnlyList> removedItems) { var wrappedAdded = addedItems.Select(x => new CollectionChangedItem(new PlayableCollectionGroupPluginWrapper(x.Data, _plugins), x.Index)).ToList(); var wrappedRemoved = removedItems.Select(x => new CollectionChangedItem(new PlayableCollectionGroupPluginWrapper(x.Data, _plugins), x.Index)).ToList(); ChildItemsChanged?.Invoke(sender, wrappedAdded, wrappedRemoved); } private void OnArtistItemsChanged(object sender, IReadOnlyList> addedItems, IReadOnlyList> removedItems) { var wrappedAdded = addedItems.Select(x => new CollectionChangedItem(Transform(x.Data), x.Index)).ToList(); var wrappedRemoved = removedItems.Select(x => new CollectionChangedItem(Transform(x.Data), x.Index)).ToList(); ArtistItemsChanged?.Invoke(sender, wrappedAdded, wrappedRemoved); } private void OnAlbumItemsChanged(object sender, IReadOnlyList> addedItems, IReadOnlyList> removedItems) { var wrappedAdded = addedItems.Select(x => new CollectionChangedItem(Transform(x.Data), x.Index)).ToList(); var wrappedRemoved = removedItems.Select(x => new CollectionChangedItem(Transform(x.Data), x.Index)).ToList(); AlbumItemsChanged?.Invoke(sender, wrappedAdded, wrappedRemoved); } private void OnTracksChanged(object sender, IReadOnlyList> addedItems, IReadOnlyList> removedItems) { var wrappedAdded = addedItems.Select(x => new CollectionChangedItem(Transform(x.Data), x.Index)).ToList(); var wrappedRemoved = removedItems.Select(x => new CollectionChangedItem(Transform(x.Data), x.Index)).ToList(); TracksChanged?.Invoke(sender, wrappedAdded, wrappedRemoved); } private void OnPlaylistItemsChanged(object sender, IReadOnlyList> addedItems, IReadOnlyList> removedItems) { var wrappedAdded = addedItems.Select(x => new CollectionChangedItem(Transform(x.Data), x.Index)).ToList(); var wrappedRemoved = removedItems.Select(x => new CollectionChangedItem(Transform(x.Data), x.Index)).ToList(); PlaylistItemsChanged?.Invoke(sender, wrappedAdded, wrappedRemoved); } private void OnUrlsChanged(object sender, IReadOnlyList> addedItems, IReadOnlyList> removedItems) { var wrappedAdded = addedItems.Select(x => new CollectionChangedItem(new UrlPluginWrapper(x.Data, _plugins), x.Index)).ToList(); var wrappedRemoved = removedItems.Select(x => new CollectionChangedItem(new UrlPluginWrapper(x.Data, _plugins), x.Index)).ToList(); UrlsChanged?.Invoke(sender, wrappedAdded, wrappedRemoved); } private void OnImagesChanged(object sender, IReadOnlyList> addedItems, IReadOnlyList> removedItems) { var wrappedAdded = addedItems.Select(x => new CollectionChangedItem(new ImagePluginWrapper(x.Data, _plugins), x.Index)).ToList(); var wrappedRemoved = removedItems.Select(x => new CollectionChangedItem(new ImagePluginWrapper(x.Data, _plugins), x.Index)).ToList(); ImagesChanged?.Invoke(sender, wrappedAdded, wrappedRemoved); } private void OnDownloadInfoChanged(object sender, DownloadInfo e) => DownloadInfoChanged?.Invoke(sender, e); private void OnChildrenCountChanged(object sender, int e) => ChildrenCountChanged?.Invoke(sender, e); private void OnArtistItemsCountChanged(object sender, int e) => ArtistItemsCountChanged?.Invoke(sender, e); private void OnIsPauseArtistCollectionAsyncAvailableChanged(object sender, bool e) => IsPauseArtistCollectionAsyncAvailableChanged?.Invoke(sender, e); private void OnIsPlayArtistCollectionAsyncAvailableChanged(object sender, bool e) => IsPlayArtistCollectionAsyncAvailableChanged?.Invoke(sender, e); private void OnAlbumItemsCountChanged(object sender, int e) => AlbumItemsCountChanged?.Invoke(sender, e); private void OnIsPauseAlbumCollectionAsyncAvailableChanged(object sender, bool e) => IsPauseAlbumCollectionAsyncAvailableChanged?.Invoke(sender, e); private void OnIsPlayAlbumCollectionAsyncAvailableChanged(object sender, bool e) => IsPlayAlbumCollectionAsyncAvailableChanged?.Invoke(sender, e); private void OnTracksCountChanged(object sender, int e) => TracksCountChanged?.Invoke(sender, e); private void OnIsPauseTrackCollectionAsyncAvailableChanged(object sender, bool e) => IsPauseTrackCollectionAsyncAvailableChanged?.Invoke(sender, e); private void OnIsPlayTrackCollectionAsyncAvailableChanged(object sender, bool e) => IsPlayTrackCollectionAsyncAvailableChanged?.Invoke(sender, e); private void OnPlaylistItemsCountChanged(object sender, int e) => PlaylistItemsCountChanged?.Invoke(sender, e); private void OnIsPausePlaylistCollectionAsyncAvailableChanged(object sender, bool e) => IsPausePlaylistCollectionAsyncAvailableChanged?.Invoke(sender, e); private void OnIsPlayPlaylistCollectionAsyncAvailableChanged(object sender, bool e) => IsPlayPlaylistCollectionAsyncAvailableChanged?.Invoke(sender, e); private void OnIsChangeDurationAsyncAvailableChanged(object sender, bool e) => IsChangeDurationAsyncAvailableChanged?.Invoke(sender, e); private void OnIsChangeDescriptionAsyncAvailableChanged(object sender, bool e) => IsChangeDescriptionAsyncAvailableChanged?.Invoke(sender, e); private void OnIsChangeNameAsyncAvailableChanged(object sender, bool e) => IsChangeNameAsyncAvailableChanged?.Invoke(sender, e); private void OnLastPlayedChanged(object sender, DateTime? e) => LastPlayedChanged?.Invoke(sender, e); private void OnDurationChanged(object sender, TimeSpan e) => DurationChanged?.Invoke(sender, e); private void OnDescriptionChanged(object sender, string? e) => DescriptionChanged?.Invoke(sender, e); private void OnNameChanged(object sender, string e) => NameChanged?.Invoke(sender, e); private void OnPlaybackStateChanged(object sender, PlaybackState e) => PlaybackStateChanged?.Invoke(sender, e); private void OnUrlsCountChanged(object sender, int e) => UrlsCountChanged?.Invoke(sender, e); private void OnImagesCountChanged(object sender, int e) => ImagesCountChanged?.Invoke(sender, e); /// public event EventHandler? SourcesChanged; /// public event EventHandler? ImagesCountChanged; /// public event EventHandler? UrlsCountChanged; /// public event EventHandler? PlaybackStateChanged; /// public event EventHandler? NameChanged; /// public event EventHandler? DescriptionChanged; /// public event EventHandler? DurationChanged; /// public event EventHandler? LastPlayedChanged; /// public event EventHandler? IsChangeNameAsyncAvailableChanged; /// public event EventHandler? IsChangeDescriptionAsyncAvailableChanged; /// public event EventHandler? IsChangeDurationAsyncAvailableChanged; /// public event EventHandler? IsPlayPlaylistCollectionAsyncAvailableChanged; /// public event EventHandler? IsPausePlaylistCollectionAsyncAvailableChanged; /// public event EventHandler? PlaylistItemsCountChanged; /// public event EventHandler? IsPlayTrackCollectionAsyncAvailableChanged; /// public event EventHandler? IsPauseTrackCollectionAsyncAvailableChanged; /// public event EventHandler? TracksCountChanged; /// public event EventHandler? IsPlayAlbumCollectionAsyncAvailableChanged; /// public event EventHandler? IsPauseAlbumCollectionAsyncAvailableChanged; /// public event EventHandler? AlbumItemsCountChanged; /// public event EventHandler? IsPlayArtistCollectionAsyncAvailableChanged; /// public event EventHandler? IsPauseArtistCollectionAsyncAvailableChanged; /// public event EventHandler? ArtistItemsCountChanged; /// public event EventHandler? ChildrenCountChanged; /// public event CollectionChangedEventHandler? ImagesChanged; /// public event CollectionChangedEventHandler? UrlsChanged; /// public event EventHandler? DownloadInfoChanged; /// public event CollectionChangedEventHandler? PlaylistItemsChanged; /// public event CollectionChangedEventHandler? TracksChanged; /// public event CollectionChangedEventHandler? AlbumItemsChanged; /// public event CollectionChangedEventHandler? ArtistItemsChanged; /// public event CollectionChangedEventHandler? ChildItemsChanged; /// public int TotalImageCount => _playableCollectionGroup.TotalImageCount; /// public Task IsAddImageAvailableAsync(int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.IsAddImageAvailableAsync(index, cancellationToken); /// public Task IsRemoveImageAvailableAsync(int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.IsRemoveImageAvailableAsync(index, cancellationToken); /// public Task RemoveImageAsync(int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.RemoveImageAsync(index, cancellationToken); /// public int TotalUrlCount => _playableCollectionGroup.TotalUrlCount; /// public Task RemoveUrlAsync(int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.RemoveUrlAsync(index, cancellationToken); /// public Task IsAddUrlAvailableAsync(int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.IsAddUrlAvailableAsync(index, cancellationToken); /// public Task IsRemoveUrlAvailableAsync(int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.IsRemoveUrlAvailableAsync(index, cancellationToken); /// public string Id => _playableCollectionGroup.Id; /// public string Name => _playableCollectionGroup.Name; /// public string? Description => _playableCollectionGroup.Description; /// public DateTime? LastPlayed => _playableCollectionGroup.LastPlayed; /// public PlaybackState PlaybackState => _playableCollectionGroup.PlaybackState; /// public TimeSpan Duration => _playableCollectionGroup.Duration; /// public bool IsChangeNameAsyncAvailable => _playableCollectionGroup.IsChangeNameAsyncAvailable; /// public bool IsChangeDescriptionAsyncAvailable => _playableCollectionGroup.IsChangeDescriptionAsyncAvailable; /// public bool IsChangeDurationAsyncAvailable => _playableCollectionGroup.IsChangeDurationAsyncAvailable; /// public Task ChangeNameAsync(string name, CancellationToken cancellationToken = default) => _playableCollectionGroup.ChangeNameAsync(name, cancellationToken); /// public Task ChangeDescriptionAsync(string? description, CancellationToken cancellationToken = default) => _playableCollectionGroup.ChangeDescriptionAsync(description, cancellationToken); /// public Task ChangeDurationAsync(TimeSpan duration, CancellationToken cancellationToken = default) => _playableCollectionGroup.ChangeDurationAsync(duration, cancellationToken); /// public DateTime? AddedAt => _playableCollectionGroup.AddedAt; /// public int TotalPlaylistItemsCount => _playableCollectionGroup.TotalPlaylistItemsCount; /// public bool IsPlayPlaylistCollectionAsyncAvailable => _playableCollectionGroup.IsPlayPlaylistCollectionAsyncAvailable; /// public bool IsPausePlaylistCollectionAsyncAvailable => _playableCollectionGroup.IsPausePlaylistCollectionAsyncAvailable; /// public Task PlayPlaylistCollectionAsync(CancellationToken cancellationToken = default) => _playableCollectionGroup.PlayPlaylistCollectionAsync(cancellationToken); /// public Task PausePlaylistCollectionAsync(CancellationToken cancellationToken = default) => _playableCollectionGroup.PausePlaylistCollectionAsync(cancellationToken); /// public Task RemovePlaylistItemAsync(int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.RemovePlaylistItemAsync(index, cancellationToken); /// public Task IsAddPlaylistItemAvailableAsync(int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.IsAddPlaylistItemAvailableAsync(index, cancellationToken); /// public Task IsRemovePlaylistItemAvailableAsync(int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.IsRemovePlaylistItemAvailableAsync(index, cancellationToken); /// public int TotalTrackCount => _playableCollectionGroup.TotalTrackCount; /// public bool IsPlayTrackCollectionAsyncAvailable => _playableCollectionGroup.IsPlayTrackCollectionAsyncAvailable; /// public bool IsPauseTrackCollectionAsyncAvailable => _playableCollectionGroup.IsPauseTrackCollectionAsyncAvailable; /// public Task PlayTrackCollectionAsync(CancellationToken cancellationToken = default) => _playableCollectionGroup.PlayTrackCollectionAsync(cancellationToken); /// public Task PauseTrackCollectionAsync(CancellationToken cancellationToken = default) => _playableCollectionGroup.PauseTrackCollectionAsync(cancellationToken); /// public Task RemoveTrackAsync(int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.RemoveTrackAsync(index, cancellationToken); /// public Task IsAddTrackAvailableAsync(int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.IsAddTrackAvailableAsync(index, cancellationToken); /// public Task IsRemoveTrackAvailableAsync(int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.IsRemoveTrackAvailableAsync(index, cancellationToken); /// public int TotalAlbumItemsCount => _playableCollectionGroup.TotalAlbumItemsCount; /// public bool IsPlayAlbumCollectionAsyncAvailable => _playableCollectionGroup.IsPlayAlbumCollectionAsyncAvailable; /// public bool IsPauseAlbumCollectionAsyncAvailable => _playableCollectionGroup.IsPauseAlbumCollectionAsyncAvailable; /// public Task PlayAlbumCollectionAsync(CancellationToken cancellationToken = default) => _playableCollectionGroup.PlayAlbumCollectionAsync(cancellationToken); /// public Task PauseAlbumCollectionAsync(CancellationToken cancellationToken = default) => _playableCollectionGroup.PauseAlbumCollectionAsync(cancellationToken); /// public Task RemoveAlbumItemAsync(int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.RemoveAlbumItemAsync(index, cancellationToken); /// public Task IsAddAlbumItemAvailableAsync(int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.IsAddAlbumItemAvailableAsync(index, cancellationToken); /// public Task IsRemoveAlbumItemAvailableAsync(int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.IsRemoveAlbumItemAvailableAsync(index, cancellationToken); /// public int TotalArtistItemsCount => _playableCollectionGroup.TotalArtistItemsCount; /// public bool IsPlayArtistCollectionAsyncAvailable => _playableCollectionGroup.IsPlayArtistCollectionAsyncAvailable; /// public bool IsPauseArtistCollectionAsyncAvailable => _playableCollectionGroup.IsPauseArtistCollectionAsyncAvailable; /// public Task PlayArtistCollectionAsync(CancellationToken cancellationToken = default) => _playableCollectionGroup.PlayArtistCollectionAsync(cancellationToken); /// public Task PauseArtistCollectionAsync(CancellationToken cancellationToken = default) => _playableCollectionGroup.PauseArtistCollectionAsync(cancellationToken); /// public Task RemoveArtistItemAsync(int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.RemoveArtistItemAsync(index, cancellationToken); /// public Task IsAddArtistItemAvailableAsync(int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.IsAddArtistItemAvailableAsync(index, cancellationToken); /// public Task IsRemoveArtistItemAvailableAsync(int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.IsRemoveArtistItemAvailableAsync(index, cancellationToken); /// public Task PlayPlayableCollectionGroupAsync(CancellationToken cancellationToken = default) => _playableCollectionGroup.PlayPlayableCollectionGroupAsync(cancellationToken); /// public Task PausePlayableCollectionGroupAsync(CancellationToken cancellationToken = default) => _playableCollectionGroup.PausePlayableCollectionGroupAsync(cancellationToken); /// public int TotalChildrenCount => _playableCollectionGroup.TotalChildrenCount; /// public Task RemoveChildAsync(int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.RemoveChildAsync(index, cancellationToken); /// public Task IsAddChildAvailableAsync(int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.IsAddChildAvailableAsync(index, cancellationToken); /// public Task IsRemoveChildAvailableAsync(int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.IsRemoveChildAvailableAsync(index, cancellationToken); /// public bool Equals(ICoreImageCollection other) => _playableCollectionGroup.Equals(other); /// IReadOnlyList IMerged.Sources => ((IMerged)_playableCollectionGroup).Sources; /// IReadOnlyList IMerged.Sources => ((IMerged)_playableCollectionGroup).Sources; /// IReadOnlyList IMerged.Sources => ((IMerged)_playableCollectionGroup).Sources; /// IReadOnlyList IMerged.Sources => ((IMerged)_playableCollectionGroup).Sources; /// IReadOnlyList IMerged.Sources => ((IMerged)_playableCollectionGroup).Sources; /// IReadOnlyList IMerged.Sources => ((IMerged)_playableCollectionGroup).Sources; /// IReadOnlyList IMerged.Sources => ((IMerged)_playableCollectionGroup).Sources; /// IReadOnlyList IMerged.Sources => ((IMerged)_playableCollectionGroup).Sources; /// IReadOnlyList IMerged.Sources => ((IMerged)_playableCollectionGroup).Sources; /// IReadOnlyList IMerged.Sources => ((IMerged)_playableCollectionGroup).Sources; /// IReadOnlyList IMerged.Sources => ((IMerged)_playableCollectionGroup).Sources; /// public IAsyncEnumerable GetImagesAsync(int limit, int offset, CancellationToken cancellationToken = default) => _playableCollectionGroup.GetImagesAsync(limit, offset, cancellationToken).Select(x => new ImagePluginWrapper(x, _plugins)); /// public Task AddImageAsync(IImage image, int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.AddImageAsync(image, index, cancellationToken); /// public bool Equals(ICoreUrlCollection other) => _playableCollectionGroup.Equals(other); /// public IAsyncEnumerable GetUrlsAsync(int limit, int offset, CancellationToken cancellationToken = default) => _playableCollectionGroup.GetUrlsAsync(limit, offset, cancellationToken).Select(x => new UrlPluginWrapper(x, _plugins)); /// public Task AddUrlAsync(IUrl url, int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.AddUrlAsync(url, index, cancellationToken); /// public DownloadInfo DownloadInfo => _playableCollectionGroup.DownloadInfo; /// public Task StartDownloadOperationAsync(DownloadOperation operation, CancellationToken cancellationToken = default) => _playableCollectionGroup.StartDownloadOperationAsync(operation, cancellationToken); /// public bool Equals(ICorePlaylistCollectionItem other) => _playableCollectionGroup.Equals(other); /// public bool Equals(ICorePlaylistCollection other) => _playableCollectionGroup.Equals(other); /// public Task PlayPlaylistCollectionAsync(IPlaylistCollectionItem playlistItem, CancellationToken cancellationToken = default) => _playableCollectionGroup.PlayPlaylistCollectionAsync(playlistItem, cancellationToken); /// public IAsyncEnumerable GetPlaylistItemsAsync(int limit, int offset, CancellationToken cancellationToken = default) => _playableCollectionGroup.GetPlaylistItemsAsync(limit, offset, cancellationToken).Select(Transform); /// public Task AddPlaylistItemAsync(IPlaylistCollectionItem playlistItem, int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.AddPlaylistItemAsync(playlistItem, index, cancellationToken); /// public bool Equals(ICoreTrackCollection other) => _playableCollectionGroup.Equals(other); /// public Task PlayTrackCollectionAsync(ITrack track, CancellationToken cancellationToken = default) => _playableCollectionGroup.PlayTrackCollectionAsync(track, cancellationToken); /// public IAsyncEnumerable GetTracksAsync(int limit, int offset, CancellationToken cancellationToken = default) => _playableCollectionGroup.GetTracksAsync(limit, offset, cancellationToken).Select(Transform); /// public Task AddTrackAsync(ITrack track, int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.AddTrackAsync(track, index, cancellationToken); /// public bool Equals(ICoreAlbumCollectionItem other) => _playableCollectionGroup.Equals(other); /// public bool Equals(ICoreAlbumCollection other) => _playableCollectionGroup.Equals(other); /// public Task PlayAlbumCollectionAsync(IAlbumCollectionItem albumItem, CancellationToken cancellationToken = default) => _playableCollectionGroup.PlayAlbumCollectionAsync(albumItem, cancellationToken); /// public IAsyncEnumerable GetAlbumItemsAsync(int limit, int offset, CancellationToken cancellationToken = default) => _playableCollectionGroup.GetAlbumItemsAsync(limit, offset, cancellationToken).Select(Transform); /// public Task AddAlbumItemAsync(IAlbumCollectionItem albumItem, int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.AddAlbumItemAsync(albumItem, index, cancellationToken); /// public bool Equals(ICoreArtistCollectionItem other) => _playableCollectionGroup.Equals(other); /// public bool Equals(ICoreArtistCollection other) => _playableCollectionGroup.Equals(other); /// public Task PlayArtistCollectionAsync(IArtistCollectionItem artistItem, CancellationToken cancellationToken = default) => _playableCollectionGroup.PlayArtistCollectionAsync(artistItem, cancellationToken); /// public IAsyncEnumerable GetArtistItemsAsync(int limit, int offset, CancellationToken cancellationToken = default) => _playableCollectionGroup.GetArtistItemsAsync(limit, offset, cancellationToken).Select(Transform); /// public Task AddArtistItemAsync(IArtistCollectionItem artistItem, int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.AddArtistItemAsync(artistItem, index, cancellationToken); /// public bool Equals(ICorePlayableCollectionGroupChildren other) => _playableCollectionGroup.Equals(other); /// public Task PlayPlayableCollectionGroupAsync(IPlayableCollectionGroup collectionGroup, CancellationToken cancellationToken = default) => _playableCollectionGroup.PlayPlayableCollectionGroupAsync(collectionGroup, cancellationToken); /// public IAsyncEnumerable GetChildrenAsync(int limit, int offset, CancellationToken cancellationToken = default) => _playableCollectionGroup.GetChildrenAsync(limit, offset, cancellationToken).Select(x => new PlayableCollectionGroupPluginWrapper(x, _plugins)); /// public Task AddChildAsync(IPlayableCollectionGroup child, int index, CancellationToken cancellationToken = default) => _playableCollectionGroup.AddChildAsync(child, index, cancellationToken); /// public bool Equals(ICorePlayableCollectionGroup other) => _playableCollectionGroup.Equals(other); /// public ValueTask DisposeAsync() { DetachEvents(_playableCollectionGroup); return _playableCollectionGroup.DisposeAsync(); } private IArtistCollectionItem Transform(IArtistCollectionItem item) => item switch { IArtist artist => new ArtistPluginWrapper(artist, _plugins), IArtistCollection artistCollection => new ArtistCollectionPluginWrapper(artistCollection, _plugins), _ => ThrowHelper.ThrowArgumentOutOfRangeException() }; private IAlbumCollectionItem Transform(IAlbumCollectionItem item) => item switch { IAlbum album => new AlbumPluginWrapper(album, _plugins), IAlbumCollection albumCollection => new AlbumCollectionPluginWrapper(albumCollection, _plugins), _ => ThrowHelper.ThrowArgumentOutOfRangeException() }; private IPlaylistCollectionItem Transform(IPlaylistCollectionItem item) => item switch { IPlaylist playlist => new PlaylistPluginWrapper(playlist, _plugins), IPlaylistCollection playlistCollection => new PlaylistCollectionPluginWrapper(playlistCollection, _plugins), _ => ThrowHelper.ThrowArgumentOutOfRangeException() }; private ITrack Transform(ITrack item) => new TrackPluginWrapper(item, _plugins); }