From 026a528a811cd3daa203c920cfe37c8e037b9c8c Mon Sep 17 00:00:00 2001 From: amazing-username Date: Fri, 12 Jul 2019 23:13:32 -0400 Subject: [PATCH] Cover art functionality added. Left TODO's on where to continue on. #50 --- Controllers/Managers/CoverArtManager.cs | 41 +++++++++++++++++--- Controllers/Managers/DirectoryManager.cs | 45 +++++++++++++++------- Controllers/Managers/SongManager.cs | 10 ++++- Controllers/Utilities/MetadataRetriever.cs | 14 +++++++ Controllers/v1/SongDataController.cs | 23 ++++++----- Types/DirectoryTypes.cs | 10 +++++ 6 files changed, 110 insertions(+), 33 deletions(-) create mode 100644 Types/DirectoryTypes.cs diff --git a/Controllers/Managers/CoverArtManager.cs b/Controllers/Managers/CoverArtManager.cs index 3f26d17..6b769d5 100644 --- a/Controllers/Managers/CoverArtManager.cs +++ b/Controllers/Managers/CoverArtManager.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using Icarus.Controllers.Utilities; using Icarus.Database.Repositories; @@ -23,14 +24,42 @@ namespace Icarus.Controllers.Managers #region Methods - public bool SaveCoverArt(Song song) + public void SaveCoverArtToDatabase(ref Song song, ref CoverArt coverArt, + CoverArtRepository coverArtRepository) { - // TODO: Implement functionality to save - // cover art to the filesystem. The result - // will determine if the the cover art record will - // be saved to the DB + // TODO: Implement saving Cover Art record to + // the database. + } + public CoverArt SaveCoverArt(Song song) + { + try + { + var dirMgr = new DirectoryManager(_rootCoverArtPath); + dirMgr.CreateDirectory(song); + var imagePath = dirMgr.SongDirectory + song.Title + ".png"; + var coverArt = new CoverArt + { + SongTitle = song.Title, + ImagePath = imagePath + }; + + Console.WriteLine($"Cover path {imagePath}"); + var metaData = new MetadataRetriever(); + var imgBytes = metaData.RetrieveCoverArtBytes(song); + + Console.WriteLine("Saving image"); + File.WriteAllBytes(imagePath, imgBytes); + + return coverArt; + } + catch (Exception ex) + { + var msg = ex.Message; + _logger.Error(msg, "An error occurred"); + Console.WriteLine(msg); + } - return false; + return null; } #endregion } diff --git a/Controllers/Managers/DirectoryManager.cs b/Controllers/Managers/DirectoryManager.cs index c7dfa1b..55880d2 100644 --- a/Controllers/Managers/DirectoryManager.cs +++ b/Controllers/Managers/DirectoryManager.cs @@ -5,6 +5,7 @@ using System.Linq; using Microsoft.Extensions.Configuration; using Icarus.Models; +using Icarus.Types; namespace Icarus.Controllers.Managers { @@ -39,6 +40,10 @@ namespace Icarus.Controllers.Managers _config = config; Initialize(); } + public DirectoryManager(string rootDirectory) + { + _rootSongDirectory = rootDirectory; + } #endregion @@ -58,12 +63,35 @@ namespace Icarus.Controllers.Managers Console.WriteLine($"The song will be saved in the following" + $" directory: {_songDirectory}"); - } + } catch (Exception ex) { Console.WriteLine($"An error occurred {ex.Message}"); } } + public void CreateDirectory(Song song) + { + _song = song; + + try + { + _songDirectory = AlbumDirectory(); + + if (!Directory.Exists(_songDirectory)) + { + Directory.CreateDirectory(_songDirectory); + Console.WriteLine($"The directory has been created"); + } + + Console.WriteLine($"The song will be saved in the following" + + $" directory: {_songDirectory}"); + } + catch (Exception ex) + { + var msg = ex.Message; + _logger.Error(msg, "An error occurred"); + } + } public void DeleteEmptyDirectories() { try @@ -160,14 +188,14 @@ namespace Icarus.Controllers.Managers return songPath; } - private void Initialize(DirectoryTypes dirTypes = DirectoryTypes.Music) + private void Initialize(DirectoryType dirTypes = DirectoryType.Music) { switch (dirTypes) { - case DirectoryTypes.Music: + case DirectoryType.Music: _rootSongDirectory = _config.GetValue("RootMusicPath"); break; - case DirectoryTypes.CoverArt: + case DirectoryType.CoverArt: _rootSongDirectory = _config.GetValue("CoverArtPath"); break; } @@ -209,14 +237,5 @@ namespace Icarus.Controllers.Managers return directory; } #endregion - - - #region enums - private enum DirectoryTypes - { - Music = 0, - CoverArt - }; - #endregion } } diff --git a/Controllers/Managers/SongManager.cs b/Controllers/Managers/SongManager.cs index 1dbd530..7ff87cb 100644 --- a/Controllers/Managers/SongManager.cs +++ b/Controllers/Managers/SongManager.cs @@ -342,7 +342,7 @@ namespace Icarus.Controllers.Managers public async Task SaveSongToFileSystem(IFormFile songFile, SongRepository songStore, AlbumRepository albumStore, ArtistRepository artistStore, GenreRepository genreStore, YearRepository yearStore, - CoverArtRepository coverStore) + CoverArtRepository coverArtStore) { try { @@ -350,10 +350,14 @@ namespace Icarus.Controllers.Managers var fileTempPath = Path.Combine(_tempDirectoryRoot, songFile.FileName); var song = await SaveSongTemp(songFile, fileTempPath); - System.IO.File.Delete(fileTempPath); + song.SongPath = fileTempPath; 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); var filePath = dirMgr.SongDirectory; var songFilename = songFile.FileName; @@ -373,6 +377,8 @@ namespace Icarus.Controllers.Managers _logger.Info("Song successfully saved to filesystem"); } + coverMgr.SaveCoverArtToDatabase(ref song, ref coverArt, + coverArtStore); SaveSongToDatabase(song, songStore, albumStore, artistStore, genreStore, yearStore); } diff --git a/Controllers/Utilities/MetadataRetriever.cs b/Controllers/Utilities/MetadataRetriever.cs index f3e484d..35cc66b 100644 --- a/Controllers/Utilities/MetadataRetriever.cs +++ b/Controllers/Utilities/MetadataRetriever.cs @@ -101,6 +101,20 @@ namespace Icarus.Controllers.Utilities return song; } + 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) + { + Console.WriteLine("Null image"); + return null; + } + + return imgBytes; + } + public void UpdateMetadata(Song song) { try diff --git a/Controllers/v1/SongDataController.cs b/Controllers/v1/SongDataController.cs index af90623..d778a76 100644 --- a/Controllers/v1/SongDataController.cs +++ b/Controllers/v1/SongDataController.cs @@ -68,6 +68,14 @@ namespace Icarus.Controllers.V1 _genreRepository = HttpContext .RequestServices .GetService(typeof(GenreRepository)) as GenreRepository; + + _yearRepository = HttpContext + .RequestServices + .GetService(typeof(YearRepository)) as YearRepository; + + _coverArtRepository = HttpContext + .RequestServices + .GetService(typeof(CoverArtRepository)) as CoverArtRepository; } @@ -76,9 +84,8 @@ namespace Icarus.Controllers.V1 [Authorize("download:songs")] public async Task Get(int id) { - SongRepository context = HttpContext.RequestServices - .GetService(typeof(SongRepository)) as SongRepository; - var songMetaData = context.GetSong(id); + Initialize(); + var songMetaData = _songRepository.GetSong(id); SongData song = await _songMgr.RetrieveSong(songMetaData); @@ -93,14 +100,6 @@ namespace Icarus.Controllers.V1 { Initialize(); - YearRepository yearStore = HttpContext.RequestServices - .GetService(typeof(YearRepository)) as YearRepository; - - CoverArtRepository coverArtRepository = HttpContext - .RequestServices - .GetService - (typeof(CoverArtRepository)) as CoverArtRepository; - Console.WriteLine("Uploading song..."); _logger.LogInformation("Uploading song..."); @@ -114,7 +113,7 @@ namespace Icarus.Controllers.V1 await _songMgr.SaveSongToFileSystem(sng, _songRepository, _albumRepository, _artistRepository, - _genreRepository, yearStore, coverArtRepository); + _genreRepository, _yearRepository, _coverArtRepository); } } catch (Exception ex) diff --git a/Types/DirectoryTypes.cs b/Types/DirectoryTypes.cs new file mode 100644 index 0000000..fcad47c --- /dev/null +++ b/Types/DirectoryTypes.cs @@ -0,0 +1,10 @@ +using System; + +namespace Icarus.Types +{ + public enum DirectoryType + { + Music = 0, + CoverArt + }; +}