Song uploads

Uploading songs is functional and does not use the song metadata for the filename or directory creation
This commit is contained in:
kdeng00
2021-12-25 21:36:42 -05:00
parent 64e6f33d7c
commit b529731c95
9 changed files with 105 additions and 77 deletions
+10 -8
View File
@@ -37,9 +37,7 @@ namespace Icarus.Controllers.Managers
{ {
_logger.Info("Saving cover art record to the database"); _logger.Info("Saving cover art record to the database");
_coverArtContext.Add(coverArt); _coverArtContext.Add(coverArt);
var songTitle = coverArt.SongTitle; _coverArtContext.SaveChanges();
coverArt = _coverArtContext.CoverArtImages.FirstOrDefault(cov => cov.SongTitle.Equals(songTitle));
song.CoverArtID = coverArt.CoverArtID; song.CoverArtID = coverArt.CoverArtID;
} }
@@ -80,15 +78,19 @@ namespace Icarus.Controllers.Managers
try try
{ {
var dirMgr = new DirectoryManager(_rootCoverArtPath); var dirMgr = new DirectoryManager(_rootCoverArtPath);
var defaultExtension = ".png";
dirMgr.CreateDirectory(song); dirMgr.CreateDirectory(song);
// TODO: Do not use metadata for file structure
var imagePath = dirMgr.SongDirectory + song.Title + ".png";
var coverArt = new CoverArt var coverArt = new CoverArt
{ {
SongTitle = song.Title, SongTitle = song.Title
ImagePath = imagePath
}; };
var segment = coverArt.GenerateFilename(0);
var imagePath = dirMgr.SongDirectory + segment + defaultExtension;
coverArt.ImagePath = imagePath;
var metaData = new MetadataRetriever(); var metaData = new MetadataRetriever();
var imgBytes = metaData.RetrieveCoverArtBytes(song); var imgBytes = metaData.RetrieveCoverArtBytes(song);
@@ -100,7 +102,7 @@ namespace Icarus.Controllers.Managers
else else
{ {
_logger.Info("Song has no cover art, applying stock cover art"); _logger.Info("Song has no cover art, applying stock cover art");
coverArt.ImagePath = _rootCoverArtPath + "CoverArt.png"; coverArt.ImagePath = _rootCoverArtPath + $"{segment}{defaultExtension}";
metaData.UpdateCoverArt(song, coverArt); metaData.UpdateCoverArt(song, coverArt);
File.WriteAllBytes(coverArt.ImagePath, _stockCoverArt); File.WriteAllBytes(coverArt.ImagePath, _stockCoverArt);
} }
+19 -29
View File
@@ -50,24 +50,7 @@ namespace Icarus.Controllers.Managers
#region Methods #region Methods
public void CreateDirectory() public void CreateDirectory()
{ {
try CreateDirectory(_song);
{
_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)
{
Console.WriteLine($"An error occurred {ex.Message}");
}
} }
public void CreateDirectory(Song song) public void CreateDirectory(Song song)
{ {
@@ -209,34 +192,41 @@ namespace Icarus.Controllers.Managers
private string AlbumDirectory() private string AlbumDirectory()
{ {
string directory = _rootSongDirectory; return AlbumDirectory(_song);
directory += $@"{_song.Artist}/{_song.AlbumTitle}/";
return directory;
} }
private string AlbumDirectory(Song song) private string AlbumDirectory(Song song)
{ {
var directory = _rootSongDirectory; var directory = ArtistDirectory(song);
directory += $@"{song.Artist}/{song.AlbumTitle}/"; var segment = SerializeValue(song.AlbumTitle);
directory += $@"{segment}/";
Console.WriteLine($"Album directory {directory}"); Console.WriteLine($"Album directory {directory}");
return directory; return directory;
} }
private string ArtistDirectory() private string ArtistDirectory()
{ {
var directory = _rootSongDirectory; return ArtistDirectory(_song);
directory += $@"{_song.Artist}/";
return directory;
} }
private string ArtistDirectory(Song song) private string ArtistDirectory(Song song)
{ {
var directory = _rootSongDirectory; var directory = _rootSongDirectory;
directory += $@"{song.Artist}/"; var segment = SerializeValue(song.Artist);
directory += $@"{segment}/";
Console.WriteLine($"Artist directory {directory}"); Console.WriteLine($"Artist directory {directory}");
return directory; return directory;
} }
private string SerializeValue(string value)
{
const int length = 15;
const string chars = "ABCDEF0123456789";
var random = new Random();
var output = new string(Enumerable.Repeat(chars, length).Select(s =>
s[random.Next(s.Length)]).ToArray());
return output;
}
#endregion #endregion
} }
} }
+30 -35
View File
@@ -162,18 +162,15 @@ namespace Icarus.Controllers.Managers
{ {
_logger.Info("Starting the process of saving the song to the filesystem"); _logger.Info("Starting the process of saving the song to the filesystem");
var fileTempPath = Path.Combine(_tempDirectoryRoot, songFile.FileName); var song = await SaveSongTemp(songFile);
var song = await SaveSongTemp(songFile, fileTempPath); System.IO.File.Delete(song.SongPath());
song.SongDirectory = _tempDirectoryRoot;
song.Filename = songFile.FileName;
DirectoryManager dirMgr = new DirectoryManager(_config, song); DirectoryManager dirMgr = new DirectoryManager(_config, song);
dirMgr.CreateDirectory(); dirMgr.CreateDirectory();
System.IO.File.Delete(fileTempPath); var fileDir = dirMgr.SongDirectory;
var filePath = fileDir;
var filePath = dirMgr.SongDirectory; var songFilename = song.Filename;
var songFilename = songFile.FileName;
if (!songFilename.EndsWith(".mp3")) if (!songFilename.EndsWith(".mp3"))
filePath += $"{songFilename}.mp3"; filePath += $"{songFilename}.mp3";
@@ -188,7 +185,6 @@ namespace Icarus.Controllers.Managers
await (songFile.CopyToAsync(fileStream)); await (songFile.CopyToAsync(fileStream));
song.SongDirectory = dirMgr.SongDirectory; song.SongDirectory = dirMgr.SongDirectory;
_logger.Info("Song successfully saved to filesystem"); _logger.Info("Song successfully saved to filesystem");
} }
@@ -209,7 +205,8 @@ namespace Icarus.Controllers.Managers
public async Task<SongData> RetrieveSong(Song songMetaData) public async Task<SongData> RetrieveSong(Song songMetaData)
{ {
SongData song = new SongData(); var song = new SongData();
try try
{ {
Console.WriteLine("Fetching song from filesystem"); Console.WriteLine("Fetching song from filesystem");
@@ -235,9 +232,11 @@ namespace Icarus.Controllers.Managers
Data = uncompressedSong Data = uncompressedSong
}; };
} }
private async Task<Song> SaveSongTemp(IFormFile songFile, string filePath) private async Task<Song> SaveSongTemp(IFormFile songFile)
{ {
var song = new Song(); var song = new Song();
var filename = song.GenerateFilename();
var filePath = Path.Combine(_tempDirectoryRoot, filename);
using (var filestream = new FileStream(filePath, FileMode.Create)) using (var filestream = new FileStream(filePath, FileMode.Create))
@@ -250,7 +249,8 @@ namespace Icarus.Controllers.Managers
song = meta.RetrieveMetaData(filePath); song = meta.RetrieveMetaData(filePath);
_logger.Info("Assigning song filename"); _logger.Info("Assigning song filename");
song.Filename = songFile.FileName; song.Filename = filename;
song.SongDirectory = _tempDirectoryRoot;
song.DateCreated = DateTime.Now; song.DateCreated = DateTime.Now;
return song; return song;
@@ -300,14 +300,15 @@ namespace Icarus.Controllers.Managers
{ {
_logger.Info("Starting process to save the song to the database"); _logger.Info("Starting process to save the song to the database");
SaveAlbumToDatabase(ref song);//, albumStore); SaveAlbumToDatabase(ref song);
SaveArtistToDatabase(ref song);//, artistStore); SaveArtistToDatabase(ref song);
SaveGenreToDatabase(ref song);//, genreStore); SaveGenreToDatabase(ref song);
var info = "Saving Song to DB"; var info = "Saving Song to DB";
Console.WriteLine(info); Console.WriteLine(info);
_logger.Info(info); _logger.Info(info);
_songContext.Add(song); _songContext.Add(song);
_songContext.SaveChanges();
} }
private void SaveAlbumToDatabase(ref Song song) private void SaveAlbumToDatabase(ref Song song)
{ {
@@ -318,22 +319,22 @@ namespace Icarus.Controllers.Managers
album.Title = song.AlbumTitle; album.Title = song.AlbumTitle;
album.AlbumArtist = song.Artist; album.AlbumArtist = song.Artist;
var albumTitle = song.AlbumTitle; var albumTitle = song.AlbumTitle;
var albumArtist = song.Artist;
AlbumContext albumContext = new AlbumContext(_connectionString); AlbumContext albumContext = new AlbumContext(_connectionString);
if (!(albumContext.Albums.FirstOrDefault(alb => alb.Title.Equals(albumTitle)) != null)) var albumRetrieved = albumContext.Albums.FirstOrDefault(alb => alb.Title.Equals(albumTitle) && alb.AlbumArtist.Equals(albumArtist));
if (albumRetrieved == null)
{ {
album.SongCount = 1; album.SongCount = 1;
albumContext.Add(album); albumContext.Add(album);
album = albumContext.Albums.FirstOrDefault(alb => alb.Title.Equals(albumTitle)); albumContext.SaveChanges();
Console.WriteLine($"Album Id {album.AlbumID}"); Console.WriteLine($"Album Id {album.AlbumID}");
} }
else else
{ {
var albumRetrieved = albumContext.Albums.FirstOrDefault(alb => alb.Title.Equals(albumTitle));
album.AlbumID = albumRetrieved.AlbumID; album.AlbumID = albumRetrieved.AlbumID;
album.SongCount = albumRetrieved.SongCount + 1;
albumContext.Update(album);
} }
song.AlbumID = album.AlbumID; song.AlbumID = album.AlbumID;
@@ -349,20 +350,17 @@ namespace Icarus.Controllers.Managers
var artistTitle = artist.Name; var artistTitle = artist.Name;
ArtistContext artistContext = new ArtistContext(_connectionString); ArtistContext artistContext = new ArtistContext(_connectionString);
if (!(artistContext.Artists.FirstOrDefault(art => art.Name.Equals(artistTitle)) != null)) var artistRetrieved = artistContext.Artists.FirstOrDefault(art => art.Name.Equals(artistTitle));
if (artistRetrieved == null)
{ {
artist.SongCount = 1; artist.SongCount = 1;
artistContext.Add(artist); artistContext.Add(artist);
artist = artistContext.Artists.FirstOrDefault(art => art.Name.Equals(artistTitle)); artistContext.SaveChanges();
} }
else else
{ {
var artistRetrieved = artistContext.Artists.FirstOrDefault(art => art.Name.Equals(artistTitle));
artist.ArtistID = artistRetrieved.ArtistID; artist.ArtistID = artistRetrieved.ArtistID;
artist.SongCount = artistRetrieved.SongCount + 1;
artistContext.Update(artist);
artistContext.SaveChanges();
} }
song.ArtistID = artist.ArtistID; song.ArtistID = artist.ArtistID;
@@ -379,12 +377,14 @@ namespace Icarus.Controllers.Managers
var genreName = song.Genre; var genreName = song.Genre;
var genreContext = new GenreContext(_connectionString); var genreContext = new GenreContext(_connectionString);
var genreRetrieved = genreContext.Genres.FirstOrDefault(gnr => gnr.GenreName.Equals(genreName));
if (! (genreContext.Genres.FirstOrDefault(gnr => gnr.GenreName.Equals(genreName)) != null)) if (genreRetrieved == null)
{ {
genreContext.Add(genre); genreContext.Add(genre);
genreContext.SaveChanges();
Console.WriteLine("Going to find genre"); Console.WriteLine("Going to find genre");
genre = genreContext.Genres.FirstOrDefault(gnr => gnr.GenreName.Equals(genreName));
var genreDump = $"Genre ID {genre.GenreID} GenreName {genre.GenreName}" + var genreDump = $"Genre ID {genre.GenreID} GenreName {genre.GenreName}" +
$" Genre song Count {genre.SongCount}"; $" Genre song Count {genre.SongCount}";
Console.WriteLine(genreDump); Console.WriteLine(genreDump);
@@ -392,12 +392,7 @@ namespace Icarus.Controllers.Managers
} }
else else
{ {
var genreRetrieved = genreContext.Genres.FirstOrDefault(gnr => gnr.GenreName.Equals(genreName));
genre.GenreID = genreRetrieved.GenreID; genre.GenreID = genreRetrieved.GenreID;
genre.SongCount = genreRetrieved.SongCount + 1;
genreContext.Update(genre);
genreContext.SaveChanges();
} }
song.GenreID = genre.GenreID; song.GenreID = genre.GenreID;
+7 -3
View File
@@ -55,15 +55,15 @@ namespace Icarus.Controllers.V1
var songContext = new SongContext(_connectionString); var songContext = new SongContext(_connectionString);
var songMetaData = songContext.RetrieveRecord(new Song { SongID = id}); var songMetaData = songContext.RetrieveRecord(new Song { SongID = id});
SongData song = await _songMgr.RetrieveSong(songMetaData); var song = await _songMgr.RetrieveSong(songMetaData);
return File(song.Data, "application/x-msdownload", songMetaData.Filename); return File(song.Data, "application/x-msdownload", songMetaData.Filename);
} }
[HttpPost] [HttpPost("upload"), DisableRequestSizeLimit]
[Route("private-scoped")] [Route("private-scoped")]
[Authorize("upload:songs")] [Authorize("upload:songs")]
public async Task Post([FromForm(Name = "file")] List<IFormFile> songData) public async Task<IActionResult> Post([FromForm(Name = "file")] List<IFormFile> songData)
{ {
try try
{ {
@@ -81,12 +81,16 @@ namespace Icarus.Controllers.V1
await _songMgr.SaveSongToFileSystem(sng); await _songMgr.SaveSongToFileSystem(sng);
} }
return Ok();
} }
catch (Exception ex) catch (Exception ex)
{ {
var msg = ex.Message; var msg = ex.Message;
_logger.LogError(msg, "An error occurred"); _logger.LogError(msg, "An error occurred");
} }
return NotFound();
} }
[HttpDelete("{id}")] [HttpDelete("{id}")]
+3
View File
@@ -13,10 +13,13 @@ namespace Icarus.Models
[JsonProperty("title")] [JsonProperty("title")]
public string Title { get; set; } public string Title { get; set; }
[JsonProperty("album_artist")] [JsonProperty("album_artist")]
[Column("Artist")]
public string AlbumArtist { get; set; } public string AlbumArtist { get; set; }
[JsonProperty("song_count")] [JsonProperty("song_count")]
[NotMapped] [NotMapped]
public int SongCount { get; set; } public int SongCount { get; set; }
[JsonProperty("year")]
public int Year { get; set; }
[JsonIgnore] [JsonIgnore]
[NotMapped] [NotMapped]
+1
View File
@@ -11,6 +11,7 @@ namespace Icarus.Models
[JsonProperty("artist_id")] [JsonProperty("artist_id")]
public int ArtistID { get; set; } public int ArtistID { get; set; }
[JsonProperty("name")] [JsonProperty("name")]
[Column("Artist")]
public string Name { get; set; } public string Name { get; set; }
[JsonProperty("song_count")] [JsonProperty("song_count")]
[NotMapped] [NotMapped]
+21 -2
View File
@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text; using System.Text;
using Newtonsoft.Json; using Newtonsoft.Json;
@@ -9,16 +10,34 @@ namespace Icarus.Models
{ {
public class CoverArt public class CoverArt
{ {
#region Properties
[JsonProperty("cover_art_id")] [JsonProperty("cover_art_id")]
public int CoverArtID { get; set; } public int CoverArtID { get; set; }
[JsonProperty("title")] [JsonProperty("title")]
public string SongTitle { get; set; } public string SongTitle { get; set; }
[JsonIgnore] [JsonIgnore]
public string ImagePath { get; set; } public string ImagePath { get; set; }
[JsonProperty("song_id")] [JsonIgnore]
public int SongId { get; set; } [NotMapped]
public int SongID { get; set; }
[JsonIgnore] [JsonIgnore]
[NotMapped] [NotMapped]
public List<Song> Songs { get; set; } public List<Song> Songs { get; set; }
#endregion
#region Methods
public string GenerateFilename(int flag)
{
const int length = 25;
const string chars = "ABCDEF0123456789";
var random = new Random();
var filename = new string(Enumerable.Repeat(chars, length).Select(s =>
s[random.Next(s.Length)]).ToArray());
var extension = ".mp3";
return (flag == 0) ? filename : $"{filename}{extension}";
}
#endregion
} }
} }
+1
View File
@@ -11,6 +11,7 @@ namespace Icarus.Models
[JsonProperty("genre_id")] [JsonProperty("genre_id")]
public int GenreID { get; set; } public int GenreID { get; set; }
[JsonProperty("genre")] [JsonProperty("genre")]
[Column("Category")]
public string GenreName { get; set; } public string GenreName { get; set; }
[JsonProperty("song_count")] [JsonProperty("song_count")]
[NotMapped] [NotMapped]
+13
View File
@@ -1,5 +1,6 @@
using System; using System;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using Newtonsoft.Json; using Newtonsoft.Json;
@@ -58,6 +59,18 @@ namespace Icarus.Models
return fullPath; return fullPath;
} }
public string GenerateFilename()
{
const int length = 25;
const string chars = "ABCDEF0123456789";
var random = new Random();
var filename = new string(Enumerable.Repeat(chars, length).Select(s =>
s[random.Next(s.Length)]).ToArray());
var extension = ".mp3";
return $"{filename}{extension}";
}
#endregion #endregion
} }
} }