using Icarus.Constants; using Icarus.Controllers.Utilities; using Icarus.Database.Contexts; using Icarus.Models; using Icarus.Types; namespace Icarus.Controllers.Managers; public class CoverArtManager : BaseManager { #region Fields private string _rootCoverArtPath; private CoverArtContext _coverArtContext; private byte[] _stockCoverArt = null; #endregion #region Constructors public CoverArtManager(IConfiguration config) { _config = config; _connectionString = _config.GetConnectionString("DefaultConnection"); _rootCoverArtPath = _config.GetValue("CoverArtPath"); Initialize(); } #endregion #region Methods public void SaveCoverArtToDatabase(ref Song song, ref CoverArt coverArt) { _logger.Info("Saving cover art record to the database"); _coverArtContext.Add(coverArt); _coverArtContext.SaveChanges(); song.CoverArtID = coverArt.CoverArtID; } public void DeleteCoverArtFromDatabase(CoverArt coverArt) { _logger.Info("Attempting to delete cover art from the database"); _coverArtContext.Attach(coverArt); _coverArtContext.Remove(coverArt); _coverArtContext.SaveChanges(); } public void DeleteCoverArt(CoverArt coverArt) { try { var stockCoverArtPath = _rootCoverArtPath + "CoverArt.png"; if (!string.Equals(stockCoverArtPath, coverArt.ImagePath(), StringComparison.CurrentCultureIgnoreCase)) { _logger.Info("Song does not contain the stock cover art"); File.Delete(coverArt.ImagePath()); _logger.Info("Cover art deleted from the filesystem"); } else { _logger.Info("Song contains the stock cover art"); _logger.Info("Will not delete from from the filesystem"); } } catch (Exception ex) { var msg = ex.Message; _logger.Error(msg, "An error occurred"); } } public CoverArt SaveCoverArt(Song song) { try { var dirMgr = new DirectoryManager(_rootCoverArtPath); var defaultExtension = ".png"; dirMgr.CreateDirectory(song); var coverArt = new CoverArt { SongTitle = song.Title }; var segment = coverArt.GenerateFilename(0); // var imagePath = dirMgr.SongDirectory + segment + defaultExtension; // coverArt.ImagePath = imagePath; coverArt.Directory = dirMgr.SongDirectory; coverArt.Filename = segment + defaultExtension; var metaData = new MetadataRetriever(); var imgBytes = metaData.RetrieveCoverArtBytes(song); if (imgBytes != null) { _logger.Info("Saving cover art to the filesystem"); File.WriteAllBytes(coverArt.ImagePath(), imgBytes); } else { _logger.Info("Song has no cover art, applying stock cover art"); var coverArtFilePath = _rootCoverArtPath + $"{segment}{defaultExtension}"; // coverArt.ImagePath = DirectoryPaths.CoverArtPath; coverArt.Directory = DirectoryPaths.CoverArtDirectory; coverArt.Filename = DirectoryPaths.CoverArtFilename; metaData.UpdateCoverArt(song, coverArt); coverArt.Directory = this._rootCoverArtPath; coverArt.Filename = $"{segment}{defaultExtension}"; // coverArt.ImagePath = coverArtFilePath; File.WriteAllBytes(coverArt.ImagePath(), _stockCoverArt); } coverArt.Type = metaData.CoverArtFileExtensionType(coverArt); if (string.IsNullOrEmpty(coverArt.Type)) { Console.WriteLine("File type is empty"); Console.WriteLine($"Directory: {coverArt.Directory}"); Console.WriteLine($"Filename: {coverArt.Filename}"); } return coverArt; } catch (Exception ex) { var msg = ex.Message; _logger.Error(msg, "An error occurred"); } return null; } // TODO: Create emthods to save the cover art to a temporary location // to get the type of the cover art. public CoverArt SaveCoverArt(IFormFile data, Song song) { var cover = new CoverArt { SongTitle = song.Title }; try { MetadataRetriever metaData = new MetadataRetriever(); var dirMgr = new DirectoryManager(_rootCoverArtPath); var defaultExtension = "." + metaData.FileExtensionType(data); dirMgr.CreateDirectory(song); var segment = cover.GenerateFilename(0); var imagePath = dirMgr.SongDirectory + segment + defaultExtension; cover.Directory = dirMgr.SongDirectory; cover.Filename = segment + defaultExtension; // cover.ImagePath = imagePath; using (var fileStream = new FileStream(cover.ImagePath(), FileMode.Create)) { data.CopyTo(fileStream); } } catch (Exception ex) { _logger.Error(ex.Message, "An error occurred"); } return cover; } public CoverArt GetCoverArt(Song song) { return _coverArtContext.CoverArtImages.FirstOrDefault(cov => cov.SongTitle.Equals(song.Title)); } private void Initialize() { _coverArtContext = new CoverArtContext(_connectionString); if (System.IO.File.Exists(DirectoryPaths.CoverArtPath)) _stockCoverArt = File.ReadAllBytes(DirectoryPaths.CoverArtPath); if (!File.Exists(_rootCoverArtPath + "CoverArt.png")) { File.WriteAllBytes(_rootCoverArtPath + "CoverArt.png", _stockCoverArt); Console.WriteLine("Copied Stock Cover Art"); } } #endregion }