// 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);
}