From 3dd143fa4dd1e5fdb1646c922ae0b3a9e31aab17 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Thu, 20 Jun 2024 20:20:47 -0400 Subject: [PATCH 1/5] #94: Saving the file type of cover art, but there is still some work to do The filename of cover art is hard coded to have the png extension. Need to correct this --- Constants/DirectoryPaths.cs | 4 +++ Controllers/Managers/CoverArtManager.cs | 36 ++++++++++++++++------ Controllers/Managers/SongManager.cs | 9 ++++++ Controllers/Utilities/MetadataRetriever.cs | 29 ++++++++++++++++- Controllers/v1/CoverArtController.cs | 2 +- Icarus.csproj | 1 + Models/CoverArt.cs | 22 +++++++++++-- 7 files changed, 89 insertions(+), 14 deletions(-) diff --git a/Constants/DirectoryPaths.cs b/Constants/DirectoryPaths.cs index 016cd53..d23e749 100644 --- a/Constants/DirectoryPaths.cs +++ b/Constants/DirectoryPaths.cs @@ -2,8 +2,12 @@ namespace Icarus.Constants; public class DirectoryPaths { + // TODO: Remove this public static string CoverArtPath => Directory.GetCurrentDirectory() + "/Images/Stock/CoverArt.png"; + public static string CoverArtDirectory => + Directory.GetCurrentDirectory() + "/Images/Stock/"; + public static string CoverArtFilename => "CoverArt.png"; public static string FILENAME_CHARACTERS = "ABCDEF0123456789"; public static int FILENAME_LENGTH = 25; } diff --git a/Controllers/Managers/CoverArtManager.cs b/Controllers/Managers/CoverArtManager.cs index 8988305..47a4358 100644 --- a/Controllers/Managers/CoverArtManager.cs +++ b/Controllers/Managers/CoverArtManager.cs @@ -48,11 +48,11 @@ public class CoverArtManager : BaseManager try { var stockCoverArtPath = _rootCoverArtPath + "CoverArt.png"; - if (!string.Equals(stockCoverArtPath, coverArt.ImagePath, + if (!string.Equals(stockCoverArtPath, coverArt.ImagePath(), StringComparison.CurrentCultureIgnoreCase)) { _logger.Info("Song does not contain the stock cover art"); - File.Delete(coverArt.ImagePath); + File.Delete(coverArt.ImagePath()); _logger.Info("Cover art deleted from the filesystem"); } else @@ -82,9 +82,11 @@ public class CoverArtManager : BaseManager }; var segment = coverArt.GenerateFilename(0); - var imagePath = dirMgr.SongDirectory + segment + defaultExtension; + // var imagePath = dirMgr.SongDirectory + segment + defaultExtension; - coverArt.ImagePath = imagePath; + // coverArt.ImagePath = imagePath; + coverArt.Directory = dirMgr.SongDirectory; + coverArt.Filename = segment + defaultExtension; var metaData = new MetadataRetriever(); var imgBytes = metaData.RetrieveCoverArtBytes(song); @@ -92,17 +94,29 @@ public class CoverArtManager : BaseManager if (imgBytes != null) { _logger.Info("Saving cover art to the filesystem"); - File.WriteAllBytes(coverArt.ImagePath, imgBytes); + 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.ImagePath = DirectoryPaths.CoverArtPath; + coverArt.Directory = DirectoryPaths.CoverArtDirectory; + coverArt.Filename = DirectoryPaths.CoverArtFilename; metaData.UpdateCoverArt(song, coverArt); - coverArt.ImagePath = coverArtFilePath; - File.WriteAllBytes(coverArt.ImagePath, _stockCoverArt); + 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; @@ -129,9 +143,11 @@ public class CoverArtManager : BaseManager var segment = cover.GenerateFilename(0); var imagePath = dirMgr.SongDirectory + segment + defaultExtension; - cover.ImagePath = imagePath; + cover.Directory = dirMgr.SongDirectory; + cover.Filename = segment + defaultExtension; + // cover.ImagePath = imagePath; - using (var fileStream = new FileStream(imagePath, FileMode.Create)) + using (var fileStream = new FileStream(cover.ImagePath(), FileMode.Create)) { data.CopyTo(fileStream); } diff --git a/Controllers/Managers/SongManager.cs b/Controllers/Managers/SongManager.cs index 8234e06..ecea25f 100644 --- a/Controllers/Managers/SongManager.cs +++ b/Controllers/Managers/SongManager.cs @@ -232,6 +232,15 @@ public class SongManager : BaseManager var coverMgr = new CoverArtManager(_config); var coverArt = coverMgr.SaveCoverArt(coverArtData, song); + MetadataRetriever metaData = new MetadataRetriever(); + 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}"); + } + DirectoryManager dirMgr = new DirectoryManager(_config, song); dirMgr.CreateDirectory(); diff --git a/Controllers/Utilities/MetadataRetriever.cs b/Controllers/Utilities/MetadataRetriever.cs index c0f6a3a..fda7bef 100644 --- a/Controllers/Utilities/MetadataRetriever.cs +++ b/Controllers/Utilities/MetadataRetriever.cs @@ -68,6 +68,33 @@ public class MetadataRetriever _logger.Info($"Year: {song.Year}"); _logger.Info($"Duration: {song.Duration}"); } + + public string CoverArtFileExtensionType(CoverArt cover) + { + Console.WriteLine("Retrieving CoverArt file extension type"); + + using (var fileStream = System.IO.File.OpenRead(cover.ImagePath())) + { + var isRecognizableType = FileTypeChecker.FileTypeValidator.IsTypeRecognizable(fileStream); + + if (!isRecognizableType) + { + return string.Empty; + } + + + var fileType = FileTypeChecker.FileTypeValidator.GetFileType(fileStream); + // Console.WriteLine("Type Name: {0}", fileType.Name); + // Console.WriteLine("Type Extension: {0}", fileType.Extension); + // Console.WriteLine("Is Image?: {0}", fileStream.IsImage()); + // Console.WriteLine("Is Bitmap?: {0}", fileStream.Is()); + // + Console.WriteLine($"Filetype: {fileType}"); + + return fileType.Extension; + } + } + public Song RetrieveMetaData(string filePath) { Song song = new Song(); @@ -162,7 +189,7 @@ public class MetadataRetriever var pics = tag.Tag.Pictures; Array.Resize(ref pics, 1); - pics[0] = new Picture(coverArt.ImagePath) + pics[0] = new Picture(coverArt.ImagePath()) { Description = "Cover Art" }; diff --git a/Controllers/v1/CoverArtController.cs b/Controllers/v1/CoverArtController.cs index 338ecb2..241e3e1 100644 --- a/Controllers/v1/CoverArtController.cs +++ b/Controllers/v1/CoverArtController.cs @@ -61,7 +61,7 @@ public class CoverArtController : BaseController { _logger.LogInformation("Found cover art record"); var coverArtBytes = System.IO.File.ReadAllBytes( - coverArt.ImagePath); + coverArt.ImagePath()); return File(coverArtBytes, "application/x-msdownload", coverArt.SongTitle); diff --git a/Icarus.csproj b/Icarus.csproj index b5fada8..4a7e949 100644 --- a/Icarus.csproj +++ b/Icarus.csproj @@ -12,6 +12,7 @@ + diff --git a/Models/CoverArt.cs b/Models/CoverArt.cs index 370c252..5c22aab 100644 --- a/Models/CoverArt.cs +++ b/Models/CoverArt.cs @@ -10,11 +10,29 @@ public class CoverArt [JsonProperty("title")] public string SongTitle { get; set; } [JsonIgnore] - public string ImagePath { get; set; } + public string Directory { get; set; } + [JsonProperty("filename")] + public string Filename { get; set; } + [JsonProperty("type")] + public string Type { get; set; } #endregion #region Methods + public string ImagePath() + { + var fullPath = this.Directory; + + if (fullPath[fullPath.Length -1] != '/') + { + fullPath += "/"; + } + + fullPath += Filename; + + return fullPath; + } + public string GenerateFilename(int flag) { int length = Constants.DirectoryPaths.FILENAME_LENGTH; @@ -27,6 +45,6 @@ public class CoverArt return (flag == 0) ? filename : $"{filename}{extension}"; } - public async Task GetData() => await File.ReadAllBytesAsync(this.ImagePath); + public async Task GetData() => await File.ReadAllBytesAsync(this.ImagePath()); #endregion } -- 2.47.3 From b14fdd74d1269e383574ecf45b731f817c7ad6b3 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Thu, 20 Jun 2024 20:33:29 -0400 Subject: [PATCH 2/5] #94: Added a TODO --- Controllers/Managers/CoverArtManager.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Controllers/Managers/CoverArtManager.cs b/Controllers/Managers/CoverArtManager.cs index 47a4358..db3387b 100644 --- a/Controllers/Managers/CoverArtManager.cs +++ b/Controllers/Managers/CoverArtManager.cs @@ -130,6 +130,8 @@ public class CoverArtManager : BaseManager 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 }; -- 2.47.3 From 6c3bb7bd81b68271d1139ae1e5a156dfa5625051 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Fri, 21 Jun 2024 20:06:59 -0400 Subject: [PATCH 3/5] #94: Corrected file extension being saved in the db --- Controllers/Managers/CoverArtManager.cs | 3 ++- Controllers/Utilities/MetadataRetriever.cs | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/Controllers/Managers/CoverArtManager.cs b/Controllers/Managers/CoverArtManager.cs index db3387b..7caa8ee 100644 --- a/Controllers/Managers/CoverArtManager.cs +++ b/Controllers/Managers/CoverArtManager.cs @@ -138,8 +138,9 @@ public class CoverArtManager : BaseManager try { + MetadataRetriever metaData = new MetadataRetriever(); var dirMgr = new DirectoryManager(_rootCoverArtPath); - var defaultExtension = ".png"; + var defaultExtension = "." + metaData.FileExtensionType(data); dirMgr.CreateDirectory(song); var segment = cover.GenerateFilename(0); diff --git a/Controllers/Utilities/MetadataRetriever.cs b/Controllers/Utilities/MetadataRetriever.cs index fda7bef..2ab0d29 100644 --- a/Controllers/Utilities/MetadataRetriever.cs +++ b/Controllers/Utilities/MetadataRetriever.cs @@ -95,6 +95,26 @@ public class MetadataRetriever } } + public string FileExtensionType(IFormFile file) + { + using (var fileStream = file.OpenReadStream()) + { + var isRecognizableType = FileTypeChecker.FileTypeValidator.IsTypeRecognizable(fileStream); + + if (!isRecognizableType) + { + return string.Empty; + } + + + var fileType = FileTypeChecker.FileTypeValidator.GetFileType(fileStream); + Console.WriteLine($"Filetype: {fileType}"); + Console.WriteLine($"Extension: {fileType.Extension}"); + + return fileType.Extension; + } + } + public Song RetrieveMetaData(string filePath) { Song song = new Song(); -- 2.47.3 From 8513ee83ef48853afcb094d667d6e061c4ff7b24 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Fri, 21 Jun 2024 20:17:31 -0400 Subject: [PATCH 4/5] Cleanup --- Constants/DirectoryPaths.cs | 6 +----- Controllers/Managers/CoverArtManager.cs | 16 +++++----------- Controllers/Managers/SongManager.cs | 9 --------- Controllers/Utilities/MetadataRetriever.cs | 7 +------ 4 files changed, 7 insertions(+), 31 deletions(-) diff --git a/Constants/DirectoryPaths.cs b/Constants/DirectoryPaths.cs index d23e749..37d96c4 100644 --- a/Constants/DirectoryPaths.cs +++ b/Constants/DirectoryPaths.cs @@ -2,11 +2,7 @@ namespace Icarus.Constants; public class DirectoryPaths { - // TODO: Remove this - public static string CoverArtPath => - Directory.GetCurrentDirectory() + "/Images/Stock/CoverArt.png"; - public static string CoverArtDirectory => - Directory.GetCurrentDirectory() + "/Images/Stock/"; + public static string CoverArtDirectory => Directory.GetCurrentDirectory() + "/Images/Stock/"; public static string CoverArtFilename => "CoverArt.png"; public static string FILENAME_CHARACTERS = "ABCDEF0123456789"; public static int FILENAME_LENGTH = 25; diff --git a/Controllers/Managers/CoverArtManager.cs b/Controllers/Managers/CoverArtManager.cs index 7caa8ee..dbd259d 100644 --- a/Controllers/Managers/CoverArtManager.cs +++ b/Controllers/Managers/CoverArtManager.cs @@ -82,9 +82,6 @@ public class CoverArtManager : BaseManager }; var segment = coverArt.GenerateFilename(0); - // var imagePath = dirMgr.SongDirectory + segment + defaultExtension; - - // coverArt.ImagePath = imagePath; coverArt.Directory = dirMgr.SongDirectory; coverArt.Filename = segment + defaultExtension; @@ -101,13 +98,11 @@ public class CoverArtManager : BaseManager _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); } @@ -130,8 +125,6 @@ public class CoverArtManager : BaseManager 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 }; @@ -140,7 +133,8 @@ public class CoverArtManager : BaseManager { MetadataRetriever metaData = new MetadataRetriever(); var dirMgr = new DirectoryManager(_rootCoverArtPath); - var defaultExtension = "." + metaData.FileExtensionType(data); + cover.Type = metaData.FileExtensionType(data); + var defaultExtension = "." + cover.Type; dirMgr.CreateDirectory(song); var segment = cover.GenerateFilename(0); @@ -148,7 +142,6 @@ public class CoverArtManager : BaseManager cover.Directory = dirMgr.SongDirectory; cover.Filename = segment + defaultExtension; - // cover.ImagePath = imagePath; using (var fileStream = new FileStream(cover.ImagePath(), FileMode.Create)) { @@ -171,9 +164,10 @@ public class CoverArtManager : BaseManager private void Initialize() { _coverArtContext = new CoverArtContext(_connectionString); + var path = DirectoryPaths.CoverArtDirectory + DirectoryPaths.CoverArtFilename; - if (System.IO.File.Exists(DirectoryPaths.CoverArtPath)) - _stockCoverArt = File.ReadAllBytes(DirectoryPaths.CoverArtPath); + if (System.IO.File.Exists(path)) + _stockCoverArt = File.ReadAllBytes(path); if (!File.Exists(_rootCoverArtPath + "CoverArt.png")) { diff --git a/Controllers/Managers/SongManager.cs b/Controllers/Managers/SongManager.cs index ecea25f..8234e06 100644 --- a/Controllers/Managers/SongManager.cs +++ b/Controllers/Managers/SongManager.cs @@ -232,15 +232,6 @@ public class SongManager : BaseManager var coverMgr = new CoverArtManager(_config); var coverArt = coverMgr.SaveCoverArt(coverArtData, song); - MetadataRetriever metaData = new MetadataRetriever(); - 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}"); - } - DirectoryManager dirMgr = new DirectoryManager(_config, song); dirMgr.CreateDirectory(); diff --git a/Controllers/Utilities/MetadataRetriever.cs b/Controllers/Utilities/MetadataRetriever.cs index 2ab0d29..ee15437 100644 --- a/Controllers/Utilities/MetadataRetriever.cs +++ b/Controllers/Utilities/MetadataRetriever.cs @@ -82,13 +82,8 @@ public class MetadataRetriever return string.Empty; } - var fileType = FileTypeChecker.FileTypeValidator.GetFileType(fileStream); - // Console.WriteLine("Type Name: {0}", fileType.Name); - // Console.WriteLine("Type Extension: {0}", fileType.Extension); - // Console.WriteLine("Is Image?: {0}", fileStream.IsImage()); - // Console.WriteLine("Is Bitmap?: {0}", fileStream.Is()); - // + Console.WriteLine($"Filetype: {fileType}"); return fileType.Extension; -- 2.47.3 From 8499ee1b8ac13fc9c69e6970c9b93b4bd8ae6660 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Fri, 21 Jun 2024 20:17:52 -0400 Subject: [PATCH 5/5] Saving databasescripts --- Scripts/Migrations/Linux/AddUpdate.sh | 25 +++++++++++++------------ Scripts/MySQL/delete_all.sql | 4 +++- 2 files changed, 16 insertions(+), 13 deletions(-) mode change 100644 => 100755 Scripts/Migrations/Linux/AddUpdate.sh diff --git a/Scripts/Migrations/Linux/AddUpdate.sh b/Scripts/Migrations/Linux/AddUpdate.sh old mode 100644 new mode 100755 index 6a1759c..493ceb5 --- a/Scripts/Migrations/Linux/AddUpdate.sh +++ b/Scripts/Migrations/Linux/AddUpdate.sh @@ -1,27 +1,28 @@ echo "Adding migrations..." + echo "Adding User migration" -dotnet-ef migrations add User --context UserContext +~/.dotnet/tools/dotnet-ef migrations add User --context UserContext echo "Adding Album migration" -dotnet-ef migrations add Album --context AlbumContext +~/.dotnet/tools/dotnet-ef migrations add Album --context AlbumContext echo "Adding Artist migration" -dotnet-ef migrations add Artist --context ArtistContext +~/.dotnet/tools/dotnet-ef migrations add Artist --context ArtistContext echo "Adding Genre migration" -dotnet-ef migrations add Genre --context GenreContext +~/.dotnet/tools/dotnet-ef migrations add Genre --context GenreContext echo "Adding Cover art migration" -dotnet-ef migrations add CoverArt --context CoverArtContext +~/.dotnet/tools/dotnet-ef migrations add CoverArt --context CoverArtContext echo "Adding Song migration" -dotnet-ef migrations add Song --context SongContext +~/.dotnet/tools/dotnet-ef migrations add Song --context SongContext echo "Updating migrations.." echo "Updating User migration" -dotnet-ef database update --context UserContext +~/.dotnet/tools/dotnet-ef database update --context UserContext echo "Updating Album migration" -dotnet-ef database update --context AlbumContext +~/.dotnet/tools/dotnet-ef database update --context AlbumContext echo "Updating Artist migration" -dotnet-ef database update --context ArtistContext +~/.dotnet/tools/dotnet-ef database update --context ArtistContext echo "Updating Genre migration" -dotnet-ef database update --context GenreContext +~/.dotnet/tools/dotnet-ef database update --context GenreContext echo "Updating Cover art migration" -dotnet-ef database update --context CoverArtContext +~/.dotnet/tools/dotnet-ef database update --context CoverArtContext echo "Updating Song migration" -dotnet-ef database update --context SongContext +~/.dotnet/tools/dotnet-ef database update --context SongContext diff --git a/Scripts/MySQL/delete_all.sql b/Scripts/MySQL/delete_all.sql index 8ce8313..d33190e 100644 --- a/Scripts/MySQL/delete_all.sql +++ b/Scripts/MySQL/delete_all.sql @@ -1,5 +1,7 @@ -delete from Song; delete from Album; delete from Artist; +delete from CoverArt; delete from Genre; delete from CoverArt; +delete from Song; +delete from User; -- 2.47.3