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