using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using CommunityToolkit.Diagnostics; using OwlCore.AbstractUI.Models; using OwlCore.Events; using StrixMusic.Cores.Files.Models; using StrixMusic.Cores.Files.Services; using StrixMusic.Sdk.AppModels; using StrixMusic.Sdk.CoreModels; using StrixMusic.Sdk.FileMetadata; using StrixMusic.Sdk.MediaPlayback; namespace StrixMusic.Cores.Files { /// /// A common base class for all cores that handle scanning any kind of file system for audio files. /// public abstract class FilesCore : ICore { /// /// Initializes a new instance of the class. /// /// A unique identifier for this core instance. protected FilesCore(string instanceId) { InstanceId = instanceId; Devices = new List(); Library = new FilesCoreLibrary(this); } /// public abstract CoreMetadata Registration { get; } /// public string InstanceId { get; } /// public virtual string InstanceDescriptor { get; set; } = string.Empty; /// public abstract AbstractUICollection AbstractConfigPanel { get; } /// public virtual MediaPlayerType PlaybackType => MediaPlayerType.Standard; /// public ICore SourceCore => this; /// /// Manages scanning and caching of all music metadata from files in a folder. /// public IFileMetadataManager? FileMetadataManager { get; set; } /// public virtual CoreState CoreState { get; protected set; } /// public ICoreUser? User => null; /// public IReadOnlyList Devices { get; } /// public ICoreLibrary Library { get; protected set; } /// public ICoreSearch? Search => null; /// public ICoreRecentlyPlayed? RecentlyPlayed => null; /// public ICoreDiscoverables? Discoverables => null; /// public ICorePlayableCollectionGroup? Pins => null; /// public abstract event EventHandler? CoreStateChanged; /// public event CollectionChangedEventHandler? DevicesChanged; /// public abstract event EventHandler? AbstractConfigPanelChanged; /// public abstract event EventHandler? InstanceDescriptorChanged; /// public abstract Task InitAsync(CancellationToken cancellationToken = default); /// public bool IsInitialized { get; protected set; } /// public virtual ValueTask DisposeAsync() { // Dispose any resources not known to the SDK. // Do not dispose Library, Devices, etc. manually. The SDK will dispose these for you. return default; } /// public async Task GetContextByIdAsync(string id, CancellationToken cancellationToken = default) { Guard.IsNotNull(FileMetadataManager, nameof(FileMetadataManager)); var artist = await FileMetadataManager.Artists.GetByIdAsync(id); if (artist != null) return InstanceCache.Artists.GetOrCreate(id, SourceCore, artist); var album = await FileMetadataManager.Albums.GetByIdAsync(id); if (album != null) return InstanceCache.Albums.GetOrCreate(id, SourceCore, album); var track = await FileMetadataManager.Tracks.GetByIdAsync(id); if (track != null) return new FilesCoreTrack(SourceCore, track); return null; } /// /// /// You may override this and return a different MediaSourceConfig if needed, such as a Stream instead of a file path. /// public virtual Task GetMediaSourceAsync(ICoreTrack track, CancellationToken cancellationToken = default) { if (!(track is FilesCoreTrack t)) return Task.FromResult(null); Guard.IsNotNullOrWhiteSpace(t.LocalTrackPath, nameof(t.LocalTrackPath)); var mediaSource = new MediaSourceConfig(track, track.Id, new Uri(t.LocalTrackPath)); return Task.FromResult(mediaSource); } } }