// 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 OwlCore.ComponentModel; using StrixMusic.Sdk.AppModels; namespace StrixMusic.Sdk.Plugins.Model { /// /// The global plugin connector applies common interface plugins to other plugins that derive them. /// /// For example, if you create a plugin for , that plugin is applied to /// , , and every other /// plugin which implements . /// public static class GlobalModelPluginConnector { /// /// Gets a value that identifies a plugin as the global plugin connector. /// public static ModelPluginMetadata PluginMetadata { get; } = new( id: "GlobalModelPluginConnector", displayName: "Global Model Plugin Connector", description: "Required for common plugins to be applied globally. Should always be last in the load order.", new Version(0, 0, 0)); /// /// Creates a new instance of from the provided and /// inserts a new "Global Model Plugin Connector" plugin at the end of each plugin chain, which applies common /// interface plugins to other plugins that derive them. /// /// /// For example, if you create a plugin for , that plugin is applied to /// , , and every other /// plugin which implements . /// /// /// /// A global connector is only ever built if all user-added plugins have executed and none of them /// have blocked/ignored the next plugin in their chain. /// Once this happens, the connector executes and collects all plugins which derive other /// plugin-enabled interfaces, chaining them so each has a chance to execute. /// The resulting chain is constructed as a single plugin and neatly placed at the end of a new plugin /// chain with all provided user-added plugins preceding it. /// /// A plugin container which contains existing plugins to weave with the global plugin connector. /// A new instance of with the provided plugins applied to all common types. public static SdkModelPlugin Create(SdkModelPlugin plugins) { // Create plugin connectors inside of a buildable plugin. // Note that only plugins which derived other plugin-enabled interfaces need setup here. // The derived interface plugins are applied inside each method. var playableBuilder = GenerateGlobalPlayablePluginBuilder(plugins); var playableCollectionGroupBuilder = GenerateGlobalPlayableCollectionGroupPluginBuilder(plugins); var libraryBuilder = GenerateGlobalLibraryPluginBuilder(plugins); var discoverablesBuilder = GenerateGlobalDiscoverablesPluginBuilder(plugins); var recentlyPlayedBuilder = GenerateGlobalRecentlyPlayedPluginBuilder(plugins); var searchHistoryBuilder = GenerateGlobalSearchHistoryPluginBuilder(plugins); var searchResultsBuilder = GenerateGlobalSearchResultsPluginBuilder(plugins); var albumCollectionBuilder = GenerateGlobalAlbumCollectionPluginBuilder(plugins); var artistCollectionBuilder = GenerateGlobalArtistCollectionPluginBuilder(plugins); var trackCollectionBuilder = GenerateGlobalTrackCollectionPluginBuilder(plugins); var albumBuilder = GenerateGlobalAlbumPluginBuilder(plugins); var artistBuilder = GenerateGlobalArtistPluginBuilder(plugins); var playlistBuilder = GenerateGlobalPlaylistPluginBuilder(plugins); var trackBuilder = GenerateGlobalTrackPluginBuilder(plugins); // Clone plugin container & add global connectors. // Global connectors must be added to a new instance, otherwise some global connectors could // treat other global connectors as a user-added plugin and attempt to ingest them, causing // undesired behavior. var pluginsWithGlobalConnectors = new SdkModelPlugin(PluginMetadata); pluginsWithGlobalConnectors.Import(plugins); pluginsWithGlobalConnectors.Playable.Add(x => new PlayablePluginBase(PluginMetadata, playableBuilder.Execute(x))); pluginsWithGlobalConnectors.PlayableCollectionGroup.Add(x => new PlayableCollectionGroupPluginBase(PluginMetadata, playableCollectionGroupBuilder.Execute(x))); pluginsWithGlobalConnectors.Library.Add(x => new LibraryPluginBase(PluginMetadata, libraryBuilder.Execute(x))); pluginsWithGlobalConnectors.Discoverables.Add(x => new DiscoverablesPluginBase(PluginMetadata, discoverablesBuilder.Execute(x))); pluginsWithGlobalConnectors.RecentlyPlayed.Add(x => new RecentlyPlayedPluginBase(PluginMetadata, recentlyPlayedBuilder.Execute(x))); pluginsWithGlobalConnectors.SearchHistory.Add(x => new SearchHistoryPluginBase(PluginMetadata, searchHistoryBuilder.Execute(x))); pluginsWithGlobalConnectors.SearchResults.Add(x => new SearchResultsPluginBase(PluginMetadata, searchResultsBuilder.Execute(x))); pluginsWithGlobalConnectors.AlbumCollection.Add(x => new AlbumCollectionPluginBase(PluginMetadata, albumCollectionBuilder.Execute(x))); pluginsWithGlobalConnectors.ArtistCollection.Add(x => new ArtistCollectionPluginBase(PluginMetadata, artistCollectionBuilder.Execute(x))); pluginsWithGlobalConnectors.TrackCollection.Add(x => new TrackCollectionPluginBase(PluginMetadata, trackCollectionBuilder.Execute(x))); pluginsWithGlobalConnectors.Album.Add(x => new AlbumPluginBase(PluginMetadata, albumBuilder.Execute(x))); pluginsWithGlobalConnectors.Artist.Add(x => new ArtistPluginBase(PluginMetadata, artistBuilder.Execute(x))); pluginsWithGlobalConnectors.Playlist.Add(x => new PlaylistPluginBase(PluginMetadata, playlistBuilder.Execute(x))); pluginsWithGlobalConnectors.Track.Add(x => new TrackPluginBase(PluginMetadata, trackBuilder.Execute(x))); return pluginsWithGlobalConnectors; } private static ChainedProxyBuilder GenerateGlobalPlayablePluginBuilder(SdkModelPlugin plugins) => new() { x => new PlayablePluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Downloadable.Execute(x), InnerImageCollection = plugins.ImageCollection.Execute(x), InnerUrlCollection = plugins.UrlCollection.Execute(x), }, }; private static ChainedProxyBuilder GenerateGlobalPlayableCollectionGroupPluginBuilder(SdkModelPlugin plugins) => new() { // Downloadable members // UrlCollection members // ImageCollection members x => new PlayableCollectionGroupPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Downloadable.Execute(x), InnerImageCollection = plugins.ImageCollection.Execute(x), InnerUrlCollection = plugins.UrlCollection.Execute(x), }, // Playable members x => new PlayableCollectionGroupPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Playable.Execute(x), InnerPlayable = plugins.Playable.Execute(x), InnerImageCollection = plugins.Playable.Execute(x), InnerUrlCollection = plugins.Playable.Execute(x), }, // AlbumCollection members x => new PlayableCollectionGroupPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.AlbumCollection.Execute(x), InnerPlayable = plugins.AlbumCollection.Execute(x), InnerImageCollection = plugins.AlbumCollection.Execute(x), InnerUrlCollection = plugins.AlbumCollection.Execute(x), InnerAlbumCollection = plugins.AlbumCollection.Execute(x), }, // ArtistCollection members x => new PlayableCollectionGroupPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.ArtistCollection.Execute(x), InnerPlayable = plugins.ArtistCollection.Execute(x), InnerImageCollection = plugins.ArtistCollection.Execute(x), InnerUrlCollection = plugins.ArtistCollection.Execute(x), InnerArtistCollection = plugins.ArtistCollection.Execute(x), }, // PlaylistCollection members x => new PlayableCollectionGroupPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.PlaylistCollection.Execute(x), InnerPlayable = plugins.PlaylistCollection.Execute(x), InnerImageCollection = plugins.PlaylistCollection.Execute(x), InnerUrlCollection = plugins.PlaylistCollection.Execute(x), InnerPlaylistCollection = plugins.PlaylistCollection.Execute(x), }, // TrackCollection members x => new PlayableCollectionGroupPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.TrackCollection.Execute(x), InnerPlayable = plugins.TrackCollection.Execute(x), InnerImageCollection = plugins.TrackCollection.Execute(x), InnerUrlCollection = plugins.TrackCollection.Execute(x), InnerTrackCollection = plugins.TrackCollection.Execute(x), }, }; private static ChainedProxyBuilder GenerateGlobalLibraryPluginBuilder(SdkModelPlugin plugins) => new() { // Downloadable members // UrlCollection members // ImageCollection members x => new LibraryPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Downloadable.Execute(x), InnerImageCollection = plugins.ImageCollection.Execute(x), InnerUrlCollection = plugins.UrlCollection.Execute(x), }, // Playable members x => new LibraryPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Playable.Execute(x), InnerPlayable = plugins.Playable.Execute(x), InnerImageCollection = plugins.Playable.Execute(x), InnerUrlCollection = plugins.Playable.Execute(x), }, // AlbumCollection members x => new LibraryPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.AlbumCollection.Execute(x), InnerPlayable = plugins.AlbumCollection.Execute(x), InnerImageCollection = plugins.AlbumCollection.Execute(x), InnerUrlCollection = plugins.AlbumCollection.Execute(x), InnerAlbumCollection = plugins.AlbumCollection.Execute(x), }, // ArtistCollection members x => new LibraryPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.ArtistCollection.Execute(x), InnerPlayable = plugins.ArtistCollection.Execute(x), InnerImageCollection = plugins.ArtistCollection.Execute(x), InnerUrlCollection = plugins.ArtistCollection.Execute(x), InnerArtistCollection = plugins.ArtistCollection.Execute(x), }, // PlaylistCollection members x => new LibraryPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.PlaylistCollection.Execute(x), InnerPlayable = plugins.PlaylistCollection.Execute(x), InnerImageCollection = plugins.PlaylistCollection.Execute(x), InnerUrlCollection = plugins.PlaylistCollection.Execute(x), InnerPlaylistCollection = plugins.PlaylistCollection.Execute(x), }, // TrackCollection members x => new LibraryPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.TrackCollection.Execute(x), InnerPlayable = plugins.TrackCollection.Execute(x), InnerImageCollection = plugins.TrackCollection.Execute(x), InnerUrlCollection = plugins.TrackCollection.Execute(x), InnerTrackCollection = plugins.TrackCollection.Execute(x), }, }; private static ChainedProxyBuilder GenerateGlobalDiscoverablesPluginBuilder(SdkModelPlugin plugins) => new() { // Downloadable members // UrlCollection members // ImageCollection members x => new DiscoverablesPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Downloadable.Execute(x), InnerImageCollection = plugins.ImageCollection.Execute(x), InnerUrlCollection = plugins.UrlCollection.Execute(x), }, // Playable members x => new DiscoverablesPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Playable.Execute(x), InnerPlayable = plugins.Playable.Execute(x), InnerImageCollection = plugins.Playable.Execute(x), InnerUrlCollection = plugins.Playable.Execute(x), }, // AlbumCollection members x => new DiscoverablesPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.AlbumCollection.Execute(x), InnerPlayable = plugins.AlbumCollection.Execute(x), InnerImageCollection = plugins.AlbumCollection.Execute(x), InnerUrlCollection = plugins.AlbumCollection.Execute(x), InnerAlbumCollection = plugins.AlbumCollection.Execute(x), }, // ArtistCollection members x => new DiscoverablesPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.ArtistCollection.Execute(x), InnerPlayable = plugins.ArtistCollection.Execute(x), InnerImageCollection = plugins.ArtistCollection.Execute(x), InnerUrlCollection = plugins.ArtistCollection.Execute(x), InnerArtistCollection = plugins.ArtistCollection.Execute(x), }, // PlaylistCollection members x => new DiscoverablesPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.PlaylistCollection.Execute(x), InnerPlayable = plugins.PlaylistCollection.Execute(x), InnerImageCollection = plugins.PlaylistCollection.Execute(x), InnerUrlCollection = plugins.PlaylistCollection.Execute(x), InnerPlaylistCollection = plugins.PlaylistCollection.Execute(x), }, // TrackCollection members x => new DiscoverablesPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.TrackCollection.Execute(x), InnerPlayable = plugins.TrackCollection.Execute(x), InnerImageCollection = plugins.TrackCollection.Execute(x), InnerUrlCollection = plugins.TrackCollection.Execute(x), InnerTrackCollection = plugins.TrackCollection.Execute(x), }, }; private static ChainedProxyBuilder GenerateGlobalRecentlyPlayedPluginBuilder(SdkModelPlugin plugins) => new() { // Downloadable members // UrlCollection members // ImageCollection members x => new RecentlyPlayedPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Downloadable.Execute(x), InnerImageCollection = plugins.ImageCollection.Execute(x), InnerUrlCollection = plugins.UrlCollection.Execute(x), }, // Playable members x => new RecentlyPlayedPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Playable.Execute(x), InnerPlayable = plugins.Playable.Execute(x), InnerImageCollection = plugins.Playable.Execute(x), InnerUrlCollection = plugins.Playable.Execute(x), }, // AlbumCollection members x => new RecentlyPlayedPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.AlbumCollection.Execute(x), InnerPlayable = plugins.AlbumCollection.Execute(x), InnerImageCollection = plugins.AlbumCollection.Execute(x), InnerUrlCollection = plugins.AlbumCollection.Execute(x), InnerAlbumCollection = plugins.AlbumCollection.Execute(x), }, // ArtistCollection members x => new RecentlyPlayedPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.ArtistCollection.Execute(x), InnerPlayable = plugins.ArtistCollection.Execute(x), InnerImageCollection = plugins.ArtistCollection.Execute(x), InnerUrlCollection = plugins.ArtistCollection.Execute(x), InnerArtistCollection = plugins.ArtistCollection.Execute(x), }, // PlaylistCollection members x => new RecentlyPlayedPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.PlaylistCollection.Execute(x), InnerPlayable = plugins.PlaylistCollection.Execute(x), InnerImageCollection = plugins.PlaylistCollection.Execute(x), InnerUrlCollection = plugins.PlaylistCollection.Execute(x), InnerPlaylistCollection = plugins.PlaylistCollection.Execute(x), }, // TrackCollection members x => new RecentlyPlayedPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.TrackCollection.Execute(x), InnerPlayable = plugins.TrackCollection.Execute(x), InnerImageCollection = plugins.TrackCollection.Execute(x), InnerUrlCollection = plugins.TrackCollection.Execute(x), InnerTrackCollection = plugins.TrackCollection.Execute(x), }, }; private static ChainedProxyBuilder GenerateGlobalSearchHistoryPluginBuilder(SdkModelPlugin plugins) => new() { // Downloadable members // UrlCollection members // ImageCollection members x => new SearchHistoryPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Downloadable.Execute(x), InnerImageCollection = plugins.ImageCollection.Execute(x), InnerUrlCollection = plugins.UrlCollection.Execute(x), }, // Playable members x => new SearchHistoryPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Playable.Execute(x), InnerPlayable = plugins.Playable.Execute(x), InnerImageCollection = plugins.Playable.Execute(x), InnerUrlCollection = plugins.Playable.Execute(x), }, // AlbumCollection members x => new SearchHistoryPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.AlbumCollection.Execute(x), InnerPlayable = plugins.AlbumCollection.Execute(x), InnerImageCollection = plugins.AlbumCollection.Execute(x), InnerUrlCollection = plugins.AlbumCollection.Execute(x), InnerAlbumCollection = plugins.AlbumCollection.Execute(x), }, // ArtistCollection members x => new SearchHistoryPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.ArtistCollection.Execute(x), InnerPlayable = plugins.ArtistCollection.Execute(x), InnerImageCollection = plugins.ArtistCollection.Execute(x), InnerUrlCollection = plugins.ArtistCollection.Execute(x), InnerArtistCollection = plugins.ArtistCollection.Execute(x), }, // PlaylistCollection members x => new SearchHistoryPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.PlaylistCollection.Execute(x), InnerPlayable = plugins.PlaylistCollection.Execute(x), InnerImageCollection = plugins.PlaylistCollection.Execute(x), InnerUrlCollection = plugins.PlaylistCollection.Execute(x), InnerPlaylistCollection = plugins.PlaylistCollection.Execute(x), }, // TrackCollection members x => new SearchHistoryPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.TrackCollection.Execute(x), InnerPlayable = plugins.TrackCollection.Execute(x), InnerImageCollection = plugins.TrackCollection.Execute(x), InnerUrlCollection = plugins.TrackCollection.Execute(x), InnerTrackCollection = plugins.TrackCollection.Execute(x), }, }; private static ChainedProxyBuilder GenerateGlobalSearchResultsPluginBuilder(SdkModelPlugin plugins) => new() { // Downloadable members // UrlCollection members // ImageCollection members x => new SearchResultsPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Downloadable.Execute(x), InnerImageCollection = plugins.ImageCollection.Execute(x), InnerUrlCollection = plugins.UrlCollection.Execute(x), }, // Playable members x => new SearchResultsPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Playable.Execute(x), InnerPlayable = plugins.Playable.Execute(x), InnerImageCollection = plugins.Playable.Execute(x), InnerUrlCollection = plugins.Playable.Execute(x), }, // AlbumCollection members x => new SearchResultsPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.AlbumCollection.Execute(x), InnerPlayable = plugins.AlbumCollection.Execute(x), InnerImageCollection = plugins.AlbumCollection.Execute(x), InnerUrlCollection = plugins.AlbumCollection.Execute(x), InnerAlbumCollection = plugins.AlbumCollection.Execute(x), }, // ArtistCollection members x => new SearchResultsPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.ArtistCollection.Execute(x), InnerPlayable = plugins.ArtistCollection.Execute(x), InnerImageCollection = plugins.ArtistCollection.Execute(x), InnerUrlCollection = plugins.ArtistCollection.Execute(x), InnerArtistCollection = plugins.ArtistCollection.Execute(x), }, // PlaylistCollection members x => new SearchResultsPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.PlaylistCollection.Execute(x), InnerPlayable = plugins.PlaylistCollection.Execute(x), InnerImageCollection = plugins.PlaylistCollection.Execute(x), InnerUrlCollection = plugins.PlaylistCollection.Execute(x), InnerPlaylistCollection = plugins.PlaylistCollection.Execute(x), }, // TrackCollection members x => new SearchResultsPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.TrackCollection.Execute(x), InnerPlayable = plugins.TrackCollection.Execute(x), InnerImageCollection = plugins.TrackCollection.Execute(x), InnerUrlCollection = plugins.TrackCollection.Execute(x), InnerTrackCollection = plugins.TrackCollection.Execute(x), }, }; private static ChainedProxyBuilder GenerateGlobalArtistCollectionPluginBuilder(SdkModelPlugin plugins) => new() { x => new ArtistCollectionPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Downloadable.Execute(x), InnerPlayable = plugins.Playable.Execute(x), InnerImageCollection = plugins.ImageCollection.Execute(x), InnerUrlCollection = plugins.UrlCollection.Execute(x), }, // Playable members x => new ArtistCollectionPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Playable.Execute(x), InnerPlayable = plugins.Playable.Execute(x), InnerImageCollection = plugins.Playable.Execute(x), InnerUrlCollection = plugins.Playable.Execute(x), }, }; private static ChainedProxyBuilder GenerateGlobalAlbumCollectionPluginBuilder(SdkModelPlugin plugins) => new() { x => new AlbumCollectionPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Downloadable.Execute(x), InnerPlayable = plugins.Playable.Execute(x), InnerImageCollection = plugins.ImageCollection.Execute(x), InnerUrlCollection = plugins.UrlCollection.Execute(x), }, // Playable members x => new AlbumCollectionPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Playable.Execute(x), InnerPlayable = plugins.Playable.Execute(x), InnerImageCollection = plugins.Playable.Execute(x), InnerUrlCollection = plugins.Playable.Execute(x), }, }; private static ChainedProxyBuilder GenerateGlobalTrackCollectionPluginBuilder(SdkModelPlugin plugins) => new() { x => new TrackCollectionPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Downloadable.Execute(x), InnerImageCollection = plugins.ImageCollection.Execute(x), InnerUrlCollection = plugins.UrlCollection.Execute(x), }, // Playable members x => new TrackCollectionPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Playable.Execute(x), InnerPlayable = plugins.Playable.Execute(x), InnerImageCollection = plugins.Playable.Execute(x), InnerUrlCollection = plugins.Playable.Execute(x), }, }; private static ChainedProxyBuilder GenerateGlobalAlbumPluginBuilder(SdkModelPlugin plugins) => new() { // Downloadable members // UrlCollection members // GenreCollection members // ImageCollection members x => new AlbumPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Downloadable.Execute(x), InnerImageCollection = plugins.ImageCollection.Execute(x), InnerGenreCollection = plugins.GenreCollection.Execute(x), InnerUrlCollection = plugins.UrlCollection.Execute(x), }, // Playable members x => new AlbumPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Playable.Execute(x), InnerPlayable = plugins.Playable.Execute(x), InnerImageCollection = plugins.Playable.Execute(x), InnerUrlCollection = plugins.Playable.Execute(x), }, // ArtistCollection members x => new AlbumPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.ArtistCollection.Execute(x), InnerPlayable = plugins.ArtistCollection.Execute(x), InnerImageCollection = plugins.ArtistCollection.Execute(x), InnerUrlCollection = plugins.ArtistCollection.Execute(x), InnerArtistCollection = plugins.ArtistCollection.Execute(x), }, // TrackCollection members x => new AlbumPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.TrackCollection.Execute(x), InnerPlayable = plugins.TrackCollection.Execute(x), InnerImageCollection = plugins.TrackCollection.Execute(x), InnerUrlCollection = plugins.TrackCollection.Execute(x), InnerTrackCollection = plugins.TrackCollection.Execute(x), } }; private static ChainedProxyBuilder GenerateGlobalArtistPluginBuilder(SdkModelPlugin plugins) => new() { // Downloadable members // UrlCollection members // GenreCollection members // ImageCollection members x => new ArtistPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Downloadable.Execute(x), InnerImageCollection = plugins.ImageCollection.Execute(x), InnerGenreCollection = plugins.GenreCollection.Execute(x), InnerUrlCollection = plugins.UrlCollection.Execute(x), }, // Playable members x => new ArtistPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Playable.Execute(x), InnerPlayable = plugins.Playable.Execute(x), InnerImageCollection = plugins.Playable.Execute(x), InnerUrlCollection = plugins.Playable.Execute(x), }, // AlbumCollection members x => new ArtistPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.AlbumCollection.Execute(x), InnerPlayable = plugins.AlbumCollection.Execute(x), InnerImageCollection = plugins.AlbumCollection.Execute(x), InnerUrlCollection = plugins.AlbumCollection.Execute(x), InnerAlbumCollection = plugins.AlbumCollection.Execute(x), }, // TrackCollection members x => new ArtistPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.TrackCollection.Execute(x), InnerPlayable = plugins.TrackCollection.Execute(x), InnerImageCollection = plugins.TrackCollection.Execute(x), InnerUrlCollection = plugins.TrackCollection.Execute(x), InnerTrackCollection = plugins.TrackCollection.Execute(x), } }; private static ChainedProxyBuilder GenerateGlobalPlaylistPluginBuilder(SdkModelPlugin plugins) => new() { // Downloadable members // UrlCollection members // ImageCollection members x => new PlaylistPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Downloadable.Execute(x), InnerImageCollection = plugins.ImageCollection.Execute(x), InnerUrlCollection = plugins.UrlCollection.Execute(x), }, // Playable members x => new PlaylistPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Playable.Execute(x), InnerPlayable = plugins.Playable.Execute(x), InnerImageCollection = plugins.Playable.Execute(x), InnerUrlCollection = plugins.Playable.Execute(x), }, // TrackCollection members x => new PlaylistPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.TrackCollection.Execute(x), InnerPlayable = plugins.TrackCollection.Execute(x), InnerImageCollection = plugins.TrackCollection.Execute(x), InnerUrlCollection = plugins.TrackCollection.Execute(x), InnerTrackCollection = plugins.TrackCollection.Execute(x), } }; private static ChainedProxyBuilder GenerateGlobalTrackPluginBuilder(SdkModelPlugin plugins) => new() { // Downloadable members // UrlCollection members // GenreCollection members // ImageCollection members x => new TrackPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Downloadable.Execute(x), InnerImageCollection = plugins.ImageCollection.Execute(x), InnerGenreCollection = plugins.GenreCollection.Execute(x), InnerUrlCollection = plugins.UrlCollection.Execute(x), }, // Playable members x => new TrackPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.Playable.Execute(x), InnerPlayable = plugins.Playable.Execute(x), InnerImageCollection = plugins.Playable.Execute(x), InnerUrlCollection = plugins.Playable.Execute(x), }, // ArtistCollection members x => new TrackPluginBase(PluginMetadata, x) { InnerDownloadable = plugins.ArtistCollection.Execute(x), InnerPlayable = plugins.ArtistCollection.Execute(x), InnerImageCollection = plugins.ArtistCollection.Execute(x), InnerUrlCollection = plugins.ArtistCollection.Execute(x), InnerArtistCollection = plugins.ArtistCollection.Execute(x), }, }; } }