using YamlDotNet.Serialization; namespace Jellyfin.Plugin.SmartPlaylist { public interface IStore { Task GetSmartPlaylistAsync(SmartPlaylistId smartPlaylistId); Task GetAllSmartPlaylistsAsync(); Task SaveSmartPlaylistAsync(SmartPlaylistDto smartPlaylist); void DeleteSmartPlaylist(SmartPlaylistDto smartPlaylist); } public class Store : IStore { private readonly ISmartPlaylistFileSystem _fileSystem; public Store(ISmartPlaylistFileSystem fileSystem) { _fileSystem = fileSystem; } private async Task LoadPlaylistAsync(string filename) { var r = File.ReadAllText(filename); var dto = new DeserializerBuilder().Build().Deserialize(r); if (dto == null) { throw new ApplicationException(""); } dto.Filename = filename; return dto; } public async Task GetSmartPlaylistAsync(SmartPlaylistId smartPlaylistId) { string filename = _fileSystem.FindSmartPlaylistFilePath(smartPlaylistId); return await LoadPlaylistAsync(filename).ConfigureAwait(false); } public async Task GetAllSmartPlaylistsAsync() { var t = _fileSystem.FindAllSmartPlaylistFilePaths().Select(LoadPlaylistAsync).ToArray(); await Task.WhenAll(t).ConfigureAwait(false); return t.Where(x => x != null).Select(x => x.Result).ToArray(); } public async Task SaveSmartPlaylistAsync(SmartPlaylistDto smartPlaylist) { string filename = _fileSystem.GetSmartPlaylistFilePath(smartPlaylist.Id); var text = new SerializerBuilder().Build().Serialize(smartPlaylist); File.WriteAllText(filename, text); } private void DeleteSmartPlaylistById(SmartPlaylistId smartPlaylistId) { try { string filename = _fileSystem.FindSmartPlaylistFilePath(smartPlaylistId); if (File.Exists(filename)) { File.Delete(filename); } } catch (System.InvalidOperationException) {} } public void DeleteSmartPlaylist(SmartPlaylistDto smartPlaylist) { if (File.Exists(smartPlaylist.Filename)) { File.Delete(smartPlaylist.Filename); } DeleteSmartPlaylistById(smartPlaylist.Id); } } }