From e4f050c362a8cc362bbb4a06b5514a8102c46386 Mon Sep 17 00:00:00 2001 From: amazing-username Date: Thu, 21 Mar 2019 22:36:57 -0400 Subject: [PATCH] Implemented functionality to download a song #11 --- Controllers/Managers/SongManager.cs | 165 +++++++++++++++++++++++++--- Controllers/SongController.cs | 2 +- Controllers/SongDataController.cs | 32 ++---- Icarus.csproj | 2 + Models/Song.cs | 4 + 5 files changed, 165 insertions(+), 40 deletions(-) diff --git a/Controllers/Managers/SongManager.cs b/Controllers/Managers/SongManager.cs index e185cfc..194a93c 100644 --- a/Controllers/Managers/SongManager.cs +++ b/Controllers/Managers/SongManager.cs @@ -2,12 +2,17 @@ using System; using System.Collections.Generic; using System.Configuration; using System.Data; +using System.IO; using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; +using Id3; +using Id3.Frames; using MySql.Data; using MySql.Data.MySqlClient; +using TagLib; using Icarus.Models; @@ -20,10 +25,22 @@ namespace Icarus.Controllers.Managers private Song _song; private IConfiguration _config; private string _connectionString; + private string _songRootDirectory; #endregion #region Properties + public Song SongDetails + { + get + { + return _song; + } + set + { + _song = value; + } + } #endregion @@ -43,21 +60,57 @@ namespace Icarus.Controllers.Managers _config = config; Initialize(); } + public SongManager(IConfiguration config, string songDirectoryRoot) + { + _config = config; + _songRootDirectory = songDirectoryRoot; + Initialize(); + } #endregion #region Methods - public void SaveSongDetails(Song song) + public void SaveSongDetails() { - _song = song; try { - Console.WriteLine($"Connection string is: {_connectionString}"); using (MySqlConnection conn = new MySqlConnection(_connectionString)) { conn.Open(); - string query = "INSERT INTO Song(Title, Album, Artist, Year, Genre, Duration) " + - "VALUES(@Title, @Album, @Artist, @Year, @Genre, @Duration)"; + string query = "INSERT INTO Song(Title, Album, Artist, Year, Genre, Duration, " + + "Filename, SongPath) VALUES(@Title, @Album, @Artist, @Year, @Genre, " + + "@Duration, @Filename, @SongPath)"; + using (MySqlCommand cmd = new MySqlCommand(query, conn)) + { + cmd.Parameters.AddWithValue("@Title", _song.Title); + cmd.Parameters.AddWithValue("@Album", _song.Album); + cmd.Parameters.AddWithValue("@Artist", _song.Artist); + cmd.Parameters.AddWithValue("@Year", _song.Year); + cmd.Parameters.AddWithValue("@Genre", _song.Genre); + cmd.Parameters.AddWithValue("@Duration", _song.Duration); + cmd.Parameters.AddWithValue("@Filename", _song.Filename); + cmd.Parameters.AddWithValue("@SongPath", _song.SongPath); + + cmd.ExecuteNonQuery(); + } + } + } + catch (Exception ex) + { + var exMsg = ex.Message; + Console.WriteLine($"An Error Occurred: {exMsg}"); + } + } + public void SaveSongDetails(Song song) + { + try + { + using (MySqlConnection conn = new MySqlConnection(_connectionString)) + { + conn.Open(); + string query = "INSERT INTO Song(Title, Album, Artist, Year, Genre, Duration, " + + ", Filename, SongPath) VALUES(@Title, @Album, @Artist, @Year, @Genre, " + + "@Duration, @Filename, @SongPath)"; using (MySqlCommand cmd = new MySqlCommand(query, conn)) { cmd.Parameters.AddWithValue("@Title", song.Title); @@ -66,6 +119,8 @@ namespace Icarus.Controllers.Managers cmd.Parameters.AddWithValue("@Year", song.Year); cmd.Parameters.AddWithValue("@Genre", song.Genre); cmd.Parameters.AddWithValue("@Duration", song.Duration); + cmd.Parameters.AddWithValue("@Filename", song.Filename); + cmd.Parameters.AddWithValue("@SongPath", song.SongPath); cmd.ExecuteNonQuery(); } @@ -99,25 +154,39 @@ namespace Icarus.Controllers.Managers Console.WriteLine($"An error occurred: {exMsg}"); } } - - public Song RetrieveSongDetails(int id) + public async Task SaveSongToFileSystem(IFormFile song) { - return new Song(); + try + { + var filePath = Path.Combine(_songRootDirectory, song.FileName); + using (var fileStream = new FileStream(filePath, FileMode.Create)) + { + await song.CopyToAsync(fileStream); + _song = RetrieveMetaData(filePath); + _song.Filename = song.FileName; + SaveSongDetails(); + } + } + catch (Exception ex) + { + var exMsg = ex.Message; + Console.WriteLine($"An error occurred: {exMsg}"); + } } - public async Task RetrieveSong(int id) + + public async Task RetrieveSongDetails(int id) { - SongData song = new SongData(); DataTable results = new DataTable(); + try { using (MySqlConnection conn = new MySqlConnection(_connectionString)) { conn.Open(); - string query = "SELECT Id, Data From SongData WHERE Id=@Id"; + string query = "SELECT * FROM Song WHERE Id=@Id"; using (MySqlCommand cmd = new MySqlCommand(query, conn)) { cmd.Parameters.AddWithValue("@Id", id); - cmd.ExecuteNonQuery(); using (MySqlDataAdapter dataDump = new MySqlDataAdapter(cmd)) @@ -126,9 +195,28 @@ namespace Icarus.Controllers.Managers } } } - DataRow row = results.Rows[0]; - song.Data = (byte[])row[1]; + } + catch (Exception ex) + { + var exMsg = ex.Message; + Console.WriteLine($"An error occurred"); + } + DataRow row = results.Rows[0]; + return new Song + { + Id = Int32.Parse(row["Id"].ToString()), + Filename = row["Filename"].ToString(), + SongPath = row["SongPath"].ToString() + }; + } + public async Task RetrieveSong(int id) + { + SongData song = new SongData(); + try + { + _song = await RetrieveSongDetails(id); + song = RetrieveSongFromFileSystem(_song); } catch (Exception ex) { @@ -140,6 +228,55 @@ namespace Icarus.Controllers.Managers } + Song RetrieveMetaData(string filePath) + { + string title, artist, album, genre; + int year, duration; + + TagLib.File tfile = TagLib.File.Create(filePath); + duration = (int)tfile.Properties.Duration.TotalSeconds; + + + using (var mp3 = new Mp3(filePath)) + { + Id3Tag tag = mp3.GetTag(Id3TagFamily.Version2X); + title = tag.Title; + artist = tag.Artists; + album = tag.Album; + genre = "Not Implemented"; + year = (int)tag.Year; + Console.WriteLine("Title: {0}", title); + Console.WriteLine("Artist: {0}", artist); + Console.WriteLine("Album: {0}", album); + Console.WriteLine("Genre: {0}", genre); + Console.WriteLine("Year: {0}", year); + Console.WriteLine("Duration: {0}", duration); + } + + _song = new Song + { + Title = title, + Artist = artist, + Album = album, + Year = year, + Genre = genre, + Duration = duration, + SongPath = filePath + }; + + return _song; + } + + SongData RetrieveSongFromFileSystem(Song details) + { + + return new SongData + { + Data = System.IO.File.ReadAllBytes(details.SongPath) + }; + } + + void Initialize() { try diff --git a/Controllers/SongController.cs b/Controllers/SongController.cs index 5be9125..2a2ff07 100644 --- a/Controllers/SongController.cs +++ b/Controllers/SongController.cs @@ -49,7 +49,7 @@ namespace Icarus.Controllers [HttpGet("{id}")] public ActionResult Get(int id) { - Song song = _songMgr.RetrieveSongDetails(id); + Song song = _songMgr.RetrieveSongDetails(id).Result; return song; } diff --git a/Controllers/SongDataController.cs b/Controllers/SongDataController.cs index 41d1e0c..5c807fd 100644 --- a/Controllers/SongDataController.cs +++ b/Controllers/SongDataController.cs @@ -21,7 +21,7 @@ namespace Icarus.Controllers #region Fields private IConfiguration _config; private SongManager _songMgr; - private string _songDir = @""; + private string _songDir; #endregion @@ -33,7 +33,8 @@ namespace Icarus.Controllers public SongDataController(IConfiguration config) { _config = config; - _songMgr = new SongManager(config); + _songDir = _config.GetValue("FilePath"); + _songMgr = new SongManager(config, _songDir); } #endregion @@ -54,7 +55,7 @@ namespace Icarus.Controllers song = await _songMgr.RetrieveSong(id); - return File(song.Data, "application/x-msdownload", "dfdf.mp3"); + return File(song.Data, "application/x-msdownload", _songMgr.SongDetails.Filename); } [HttpPost] @@ -64,32 +65,13 @@ namespace Icarus.Controllers { Console.WriteLine("Uploading song..."); - var uploads = Path.Combine(_songDir, "uploads"); - Console.WriteLine($"Song Path {uploads}"); + var uploads = _songDir; + Console.WriteLine($"Song Root Path {uploads}"); foreach (var sng in songData) { byte[] data; if (sng.Length > 0) { - - using (var ms = new MemoryStream()) - { - sng.CopyTo(ms); - data = ms.ToArray(); - } - SongData songD = new SongData - { - Data = data - }; - - _songMgr.SaveSong(songD); - - - /** - var filePath = Path.Combine(uploads, sng.FileName); - using (var fileStream = new FileStream(filePath, FileMode.Create)) { - await sng.CopyToAsync(fileStream); - } - */ + await _songMgr.SaveSongToFileSystem(sng); } } } diff --git a/Icarus.csproj b/Icarus.csproj index da147b4..c079427 100644 --- a/Icarus.csproj +++ b/Icarus.csproj @@ -6,10 +6,12 @@ + + diff --git a/Models/Song.cs b/Models/Song.cs index 1bc3e14..4c25fcf 100644 --- a/Models/Song.cs +++ b/Models/Song.cs @@ -20,5 +20,9 @@ namespace Icarus.Models public string Genre { get; set; } [JsonProperty("duration")] public int Duration { get; set; } + [JsonProperty("filename")] + public string Filename { get; set; } + [JsonProperty("song_path")] + public string SongPath { get; set; } } }