diff --git a/Constants/DirectoryPaths.cs b/Constants/DirectoryPaths.cs new file mode 100644 index 0000000..49ccb32 --- /dev/null +++ b/Constants/DirectoryPaths.cs @@ -0,0 +1,11 @@ +using System; +using System.IO; + +namespace Icarus.Constants +{ + public class DirectoryPaths + { + public static string CoverArtPath => + Directory.GetCurrentDirectory() + "/Images/Stock/CoverArt.png"; + } +} diff --git a/Controllers/Managers/CoverArtManager.cs b/Controllers/Managers/CoverArtManager.cs index 79f5f9e..3994299 100644 --- a/Controllers/Managers/CoverArtManager.cs +++ b/Controllers/Managers/CoverArtManager.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.IO; +using Icarus.Constants; using Icarus.Controllers.Utilities; using Icarus.Database.Repositories; using Icarus.Models; @@ -13,6 +14,7 @@ namespace Icarus.Controllers.Managers { #region Fields private string _rootCoverArtPath; + private byte[] _stockCoverArt = null; #endregion @@ -20,6 +22,7 @@ namespace Icarus.Controllers.Managers public CoverArtManager(string rootPath) { _rootCoverArtPath = rootPath; + Initialize(); } #endregion @@ -28,12 +31,17 @@ namespace Icarus.Controllers.Managers public void SaveCoverArtToDatabase(ref Song song, ref CoverArt coverArt, CoverArtRepository coverArtRepository) { + Console.WriteLine("Gonig to save cover art record"); coverArtRepository.SaveCoverArt(coverArt); + Console.WriteLine($"tlte {coverArt.SongTitle}"); coverArt = coverArtRepository.GetCoverArt(CoverArtField.SongTitle, coverArt); + Console.WriteLine($"cover art id {coverArt.CoverArtId}"); song.CoverArtId = coverArt.CoverArtId; + Console.WriteLine("Nothing wrong here"); + Console.WriteLine($"song cover art id {song.CoverArtId}"); } public CoverArt SaveCoverArt(Song song) @@ -52,7 +60,15 @@ namespace Icarus.Controllers.Managers var metaData = new MetadataRetriever(); var imgBytes = metaData.RetrieveCoverArtBytes(song); - File.WriteAllBytes(imagePath, imgBytes); + if (imgBytes != null) + File.WriteAllBytes(coverArt.ImagePath, imgBytes); + else + { + Console.WriteLine("Song has no cover art"); + coverArt.ImagePath = _rootCoverArtPath + "CoverArt.png"; + metaData.UpdateCoverArt(song, coverArt); + File.WriteAllBytes(coverArt.ImagePath, _stockCoverArt); + } return coverArt; } @@ -65,6 +81,19 @@ namespace Icarus.Controllers.Managers return null; } + + private void Initialize() + { + 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 } } diff --git a/Controllers/Managers/SongManager.cs b/Controllers/Managers/SongManager.cs index 7ff87cb..8e16233 100644 --- a/Controllers/Managers/SongManager.cs +++ b/Controllers/Managers/SongManager.cs @@ -354,8 +354,6 @@ namespace Icarus.Controllers.Managers DirectoryManager dirMgr = new DirectoryManager(_config, song); dirMgr.CreateDirectory(); - var coverMgr = new CoverArtManager(_config.GetValue("CoverArtPath")); - var coverArt = coverMgr.SaveCoverArt(song); System.IO.File.Delete(fileTempPath); @@ -369,6 +367,7 @@ namespace Icarus.Controllers.Managers _logger.Info($"Absolute song path: {filePath}"); + using (var fileStream = new FileStream(filePath, FileMode.Create)) { await (songFile.CopyToAsync(fileStream)); @@ -377,6 +376,9 @@ namespace Icarus.Controllers.Managers _logger.Info("Song successfully saved to filesystem"); } + var coverMgr = new CoverArtManager(_config.GetValue("CoverArtPath")); + var coverArt = coverMgr.SaveCoverArt(song); + coverMgr.SaveCoverArtToDatabase(ref song, ref coverArt, coverArtStore); SaveSongToDatabase(song, songStore, albumStore, artistStore, genreStore, diff --git a/Controllers/Utilities/MetadataRetriever.cs b/Controllers/Utilities/MetadataRetriever.cs index 35cc66b..392c5c3 100644 --- a/Controllers/Utilities/MetadataRetriever.cs +++ b/Controllers/Utilities/MetadataRetriever.cs @@ -103,16 +103,21 @@ namespace Icarus.Controllers.Utilities public byte[] RetrieveCoverArtBytes(Song song) { - Console.WriteLine("Fetching image"); - var tag = TagLib.File.Create(song.SongPath); - byte[] imgBytes = tag.Tag.Pictures[0].Data.Data; - if (imgBytes == null) + try { - Console.WriteLine("Null image"); - return null; + Console.WriteLine("Fetching image"); + var tag = TagLib.File.Create(song.SongPath); + byte[] imgBytes = tag.Tag.Pictures[0].Data.Data; + + return imgBytes; + } + catch (Exception ex) + { + var msg = ex.Message; + _logger.Error(msg, "An error occurred in MetadataRetriever"); } - return imgBytes; + return null; } public void UpdateMetadata(Song song) @@ -154,6 +159,22 @@ namespace Icarus.Controllers.Utilities Message = "Failed to update metadata"; } } + public void UpdateCoverArt(Song song, CoverArt coverArt) + { + Console.WriteLine("Updating song's cover art"); + + var tag = TagLib.File.Create(song.SongPath); + var pics = tag.Tag.Pictures; + Array.Resize(ref pics, 1); + + pics[0] = new Picture(coverArt.ImagePath) + { + Description = "Cover Art" + }; + + tag.Tag.Pictures = pics; + tag.Save(); + } private void PerformUpdate(Song updatedSong, SortedDictionary checkedValues) { diff --git a/Database/Repositories/SongRepository.cs b/Database/Repositories/SongRepository.cs index de8b3d3..e628b4c 100644 --- a/Database/Repositories/SongRepository.cs +++ b/Database/Repositories/SongRepository.cs @@ -36,9 +36,10 @@ namespace Icarus.Database.Repositories conn.Open(); string query = "INSERT INTO Song(Title, AlbumTitle, Artist," + " Year, Genre, Duration, Filename, SongPath, AlbumId, " + - "ArtistId, GenreId, YearId) VALUES(@Title, @AlbumTitle, " + - "@Artist, @Year, @Genre, @Duration, @Filename, @SongPath, " + - "@AlbumId, @ArtistId, @GenreId, @YearId)"; + "ArtistId, GenreId, YearId, CoverArtId) VALUES(@Title," + + " @AlbumTitle, @Artist, @Year, @Genre, @Duration, " + + "@Filename, @SongPath, @AlbumId, @ArtistId, @GenreId," + + " @YearId, @CoverArtId)"; using (MySqlCommand cmd = new MySqlCommand(query, conn)) { cmd.Parameters.AddWithValue("@Title", song.Title); diff --git a/Icarus.csproj b/Icarus.csproj index 4f3ca44..cbdd51d 100644 --- a/Icarus.csproj +++ b/Icarus.csproj @@ -30,6 +30,7 @@ + diff --git a/Images/Stock/CoverArt.png b/Images/Stock/CoverArt.png new file mode 100644 index 0000000..2af8c30 Binary files /dev/null and b/Images/Stock/CoverArt.png differ