diff --git a/Controllers/Utilities/MetadataRetriever.cs b/Controllers/Utilities/MetadataRetriever.cs index c90ce8c..6793889 100644 --- a/Controllers/Utilities/MetadataRetriever.cs +++ b/Controllers/Utilities/MetadataRetriever.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using TagLib; @@ -9,6 +10,8 @@ namespace Icarus.Controllers.Utilities public class MetadataRetriever { #region Fields + private Song _updatedSong; + private string _message; private string _title; private string _artist; private string _album; @@ -19,6 +22,16 @@ namespace Icarus.Controllers.Utilities #region Properties + public Song UpdatedSongRecord + { + get => _updatedSong; + set => _updatedSong = value; + } + public string Message + { + get => _message; + set => _message = value; + } #endregion @@ -74,9 +87,92 @@ namespace Icarus.Controllers.Utilities catch (Exception ex) { var msg = ex.Message; + Console.WriteLine($"An error occurred: \n{msg}"); + } + } + public void UpdateMetadata(Song updatedSong, Song oldSong) + { + try + { + InitializeUpdatedSong(oldSong); + var songValues = CheckSongValues(updatedSong); + PerformUpdate(updatedSong, songValues); + Message = "Successfully updated metadata"; + } + catch (Exception ex) + { + var msg = ex.Message; + Console.WriteLine($"An error occurred: {msg}"); + Message = "Failed to update metadata"; } } + private void PerformUpdate(Song updatedSong, SortedDictionary checkedValues) + { + var filePath = updatedSong.SongPath; + var title = updatedSong.Title; + var artist = updatedSong.Artist; + var album = updatedSong.Album; + var genre = updatedSong.Genre; + var year = updatedSong.Year; + TagLib.File fileTag = TagLib.File.Create(filePath); + try + { + Console.WriteLine($"Updating metadata of {title}"); + foreach (var key in checkedValues.Keys) + { + bool result = checkedValues[key]; + if (!result) + { + switch (key.ToLower()) + { + case "title": + _updatedSong.Title = title; + fileTag.Tag.Title = title; + break; + case "artists": + _updatedSong.Artist = artist; + fileTag.Tag.Artists = new []{artist}; + break; + case "album": + _updatedSong.Album = album; + fileTag.Tag.Album = album; + break; + case "genre": + _updatedSong.Genre = genre; + fileTag.Tag.Genres = new []{genre}; + break; + case "year": + _updatedSong.Year = year; + fileTag.Tag.Year = (uint)year; + break; + } + } + } + fileTag.Save(); + Console.WriteLine("Successfully updated metadata"); + } + catch (Exception ex) + { + var msg = ex.Message; + Console.WriteLine($"An error occurred:\n{msg}"); + } + } + private void InitializeUpdatedSong(Song song) + { + _updatedSong = new Song + { + Id = song.Id, + Title = song.Title, + Album = song.Album, + Artist = song.Artist, + Genre = song.Genre, + Year = song.Year, + Duration = song.Duration, + Filename = song.Filename, + SongPath = song.SongPath + }; + } private void PrintMetadata() { Console.WriteLine("\n\nMetadata of the song:"); @@ -87,6 +183,45 @@ namespace Icarus.Controllers.Utilities Console.WriteLine($"Year: {_year}"); Console.WriteLine($"Duration: {_duration}\n\n"); } + private void PrintMetadata(Song song, string message) + { + Console.WriteLine($"\n\n{message}"); + Console.WriteLine($"Title: {song.Title}"); + Console.WriteLine($"Artist: {song.Artist}"); + Console.WriteLine($"Album: {song.Album}"); + Console.WriteLine($"Genre: {song.Genre}"); + Console.WriteLine($"Year: {song.Year}"); + Console.WriteLine($"Duration: {song.Duration}\n\n"); + } + + private SortedDictionary CheckSongValues(Song song) + { + var songValues = new SortedDictionary(); + Console.WriteLine("Checking for null data"); + try + { + songValues["Title"] = String.IsNullOrEmpty(song.Title); + songValues["Artists"] = String.IsNullOrEmpty(song.Artist); + songValues["Album"] = String.IsNullOrEmpty(song.Album); + songValues["Genre"] = String.IsNullOrEmpty(song.Genre); + if (song.Year==0) + { + songValues["Year"] = true; + } + else + { + songValues["Year"] = false; + } + Console.WriteLine("Checking for null data completed"); + } + catch (Exception ex) + { + var msg = ex.Message; + Console.WriteLine($"An error occurred: \n{msg}"); + } + + return songValues; + } #endregion } } diff --git a/Models/Context/MusicStoreContext.cs b/Models/Context/MusicStoreContext.cs index 56cfdb1..9dec0c3 100644 --- a/Models/Context/MusicStoreContext.cs +++ b/Models/Context/MusicStoreContext.cs @@ -56,8 +56,9 @@ namespace Icarus.Models.Context conn.Open(); string query = "UPDATE Songs SET Title=@Title, Album=@Album, " + - "Artist=@Artist, Year=@Year, Genre=@Genre, " + - "Duration=@Duration, Filename=@Filename, SongPath=@SongPath"; + "Artist=@Artist, Year=@Year, Genre=@Genre, " + + "Duration=@Duration, Filename=@Filename, " + + "SongPath=@SongPath WHERE Id=@Id"; using (MySqlCommand cmd = new MySqlCommand(query, conn)) { cmd.Parameters.AddWithValue("@Title", song.Title); @@ -68,6 +69,7 @@ namespace Icarus.Models.Context cmd.Parameters.AddWithValue("@Duration", song.Duration); cmd.Parameters.AddWithValue("@Filename", song.Filename); cmd.Parameters.AddWithValue("@SongPath", song.SongPath); + cmd.Parameters.AddWithValue(@"Id", song.Id); cmd.ExecuteNonQuery(); } @@ -82,114 +84,114 @@ namespace Icarus.Models.Context } public void DeleteSong(int id) { - try - { - using (MySqlConnection conn = GetConnection()) + try + { + using (MySqlConnection conn = GetConnection()) { - conn.Open(); - string query = "DELETE FROM Songs WHERE Id=@Id"; + conn.Open(); + string query = "DELETE FROM Songs WHERE Id=@Id"; - using (MySqlCommand cmd = new MySqlCommand(query, conn)) - { - cmd.Parameters.AddWithValue("@Id", id); + using (MySqlCommand cmd = new MySqlCommand(query, conn)) + { + cmd.Parameters.AddWithValue("@Id", id); cmd.ExecuteNonQuery(); - } + } } - } - catch (Exception ex) - { - var exMsg = ex.Message; + } + catch (Exception ex) + { + var exMsg = ex.Message; Console.WriteLine($"An error occurred:\n{exMsg}"); - } + } } public List GetAllSongs() { - List songs = new List(); - try - { - using (MySqlConnection conn = GetConnection()) + List songs = new List(); + try + { + using (MySqlConnection conn = GetConnection()) { - conn.Open(); - var query = "SELECT * FROM Songs"; - MySqlCommand cmd = new MySqlCommand(query, conn); - using (var reader = cmd.ExecuteReader()) - { + conn.Open(); + var query = "SELECT * FROM Songs"; + MySqlCommand cmd = new MySqlCommand(query, conn); + using (var reader = cmd.ExecuteReader()) + { while (reader.Read()) { - songs.Add(new Song - { - Id = Convert.ToInt32(reader["Id"]), - Title = reader["Title"].ToString(), - Album = reader["Album"].ToString(), - Artist = reader["Artist"].ToString(), - Year = Convert.ToInt32(reader["Year"]), - Genre = reader["Genre"].ToString(), - Duration = Convert.ToInt32(reader["Duration"]), - Filename = reader["Filename"].ToString(), - SongPath = reader["SongPath"].ToString() - }); + songs.Add(new Song + { + Id = Convert.ToInt32(reader["Id"]), + Title = reader["Title"].ToString(), + Album = reader["Album"].ToString(), + Artist = reader["Artist"].ToString(), + Year = Convert.ToInt32(reader["Year"]), + Genre = reader["Genre"].ToString(), + Duration = Convert.ToInt32(reader["Duration"]), + Filename = reader["Filename"].ToString(), + SongPath = reader["SongPath"].ToString() + }); } - } + } } - } - catch (Exception ex) - { - var exMsg = ex.Message; + } + catch (Exception ex) + { + var exMsg = ex.Message; Console.WriteLine($"An error ocurred:\n{exMsg}"); songs.Clear(); - } + } - return songs; + return songs; } public Song GetSong(int id) { - Song song = new Song(); + Song song = new Song(); - try - { - using (MySqlConnection conn = GetConnection()) + try + { + using (MySqlConnection conn = GetConnection()) { - conn.Open(); - var query = "SELECT * FROM Songs WHERE Id=@Id"; + conn.Open(); + var query = "SELECT * FROM Songs WHERE Id=@Id"; - MySqlCommand cmd = new MySqlCommand(query, conn); - cmd.Parameters.AddWithValue("@Id", id); + MySqlCommand cmd = new MySqlCommand(query, conn); + cmd.Parameters.AddWithValue("@Id", id); - using (var reader = cmd.ExecuteReader()) - { + using (var reader = cmd.ExecuteReader()) + { while (reader.Read()) { - song = new Song - { - Id = Convert.ToInt32(reader["Id"]), - Title = reader["Title"].ToString(), - Album = reader["Album"].ToString(), - Artist = reader["Artist"].ToString(), - Year = Convert.ToInt32(reader["Year"]), - Genre = reader["Genre"].ToString(), - Duration = Convert.ToInt32(reader["Duration"]), - Filename = reader["Filename"].ToString(), - SongPath = reader["SongPath"].ToString() - }; + song = new Song + { + Id = Convert.ToInt32(reader["Id"]), + Title = reader["Title"].ToString(), + Album = reader["Album"].ToString(), + Artist = reader["Artist"].ToString(), + Year = Convert.ToInt32(reader["Year"]), + Genre = reader["Genre"].ToString(), + Duration = Convert.ToInt32(reader["Duration"]), + Filename = reader["Filename"].ToString(), + SongPath = reader["SongPath"].ToString() + }; } - } + } } - } - catch(Exception ex) - { - var exMsg = ex.Message; + } + catch(Exception ex) + { + var exMsg = ex.Message; Console.WriteLine($"An error ocurred: {exMsg}"); - } + } - return song; + return song; } - private MySqlConnection GetConnection() - { - return new MySqlConnection(ConnectionString); - } - } + private MySqlConnection GetConnection() + { + return new MySqlConnection(ConnectionString); + } + } }