New endpoint

New endpoint to upload song with metadata and cover art as separate entities
This commit is contained in:
kdeng00
2021-12-29 14:06:52 -05:00
parent aa0a1ab5fe
commit 3a6e0f64bc
10 changed files with 221 additions and 40 deletions
+31 -1
View File
@@ -1,9 +1,11 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.Configuration;
using System.IO;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Icarus.Constants;
using Icarus.Controllers.Utilities;
using Icarus.Database.Contexts;
@@ -118,6 +120,34 @@ namespace Icarus.Controllers.Managers
return null;
}
public CoverArt SaveCoverArt(IFormFile data, Song song)
{
var cover = new CoverArt { SongTitle = song.Title };
try
{
var dirMgr = new DirectoryManager(_rootCoverArtPath);
var defaultExtension = ".png";
dirMgr.CreateDirectory(song);
var segment = cover.GenerateFilename(0);
var imagePath = dirMgr.SongDirectory + segment + defaultExtension;
cover.ImagePath = imagePath;
using (var fileStream = new FileStream(imagePath, FileMode.Create))
{
data.CopyTo(fileStream);
}
}
catch (Exception ex)
{
_logger.Error(ex.Message, "An error occurred");
}
return cover;
}
public CoverArt GetCoverArt(Song song)
{
return _coverArtContext.CoverArtImages.FirstOrDefault(cov => cov.SongTitle.Equals(song.Title));
+63 -18
View File
@@ -176,27 +176,24 @@ namespace Icarus.Controllers.Managers
_logger.Info("Starting the process of saving the song to the filesystem");
var song = await SaveSongTemp(songFile);
System.IO.File.Delete(song.SongPath());
DirectoryManager dirMgr = new DirectoryManager(_config, song);
dirMgr.CreateDirectory();
var fileDir = dirMgr.SongDirectory;
var filePath = fileDir;
var songFilename = song.Filename;
if (!songFilename.EndsWith(".mp3"))
filePath += $"{songFilename}.mp3";
else
filePath += $"{songFilename}";
var filePath = dirMgr.SongDirectory;
filePath += $"{song.Filename}";
_logger.Info($"Absolute song path: {filePath}");
using (var fileStream = new FileStream(filePath, FileMode.Create))
{
await (songFile.CopyToAsync(fileStream));
song.SongDirectory = fileDir;
var songBytes = await System.IO.File.ReadAllBytesAsync(song.SongPath());
System.IO.File.WriteAllBytesAsync(filePath, songBytes);
System.IO.File.Delete(song.SongPath());
song.SongDirectory = dirMgr.SongDirectory;
_logger.Info("Song successfully saved to filesystem");
}
@@ -214,6 +211,55 @@ namespace Icarus.Controllers.Managers
}
}
public async Task SaveSongToFileSystem(IFormFile songFile, IFormFile coverArtData, Song song)
{
if (string.IsNullOrEmpty(song.Filename))
{
song.Filename = song.GenerateFilename(1);
}
song.SongDirectory = _tempDirectoryRoot;
song.DateCreated = DateTime.Now;
using (var filestream = new FileStream(song.SongPath(), FileMode.Create))
{
_logger.Info("Saving song to temporary directory");
await songFile.CopyToAsync(filestream);
}
var coverMgr = new CoverArtManager(_config);
var coverArt = coverMgr.SaveCoverArt(coverArtData, song);
var meta = new MetadataRetriever();
song.Duration = meta.RetrieveSongDuration(song.SongPath());
// const int trackCount = meta.RetrieveTrackCount(song.)
meta.UpdateMetadata(song, song);
meta.UpdateCoverArt(song, coverArt);
DirectoryManager dirMgr = new DirectoryManager(_config, song);
dirMgr.CreateDirectory();
var filePath = dirMgr.SongDirectory + song.Filename;
_logger.Info($"Absolute song path: {filePath}");
using (var fileStream = new FileStream(filePath, FileMode.Create))
{
var songBytes = await System.IO.File.ReadAllBytesAsync(song.SongPath());
await System.IO.File.WriteAllBytesAsync(filePath, songBytes);
System.IO.File.Delete(song.SongPath());
song.SongDirectory = dirMgr.SongDirectory;
_logger.Info("Song successfully saved to filesystem");
}
coverMgr.SaveCoverArtToDatabase(ref song, ref coverArt);
SaveSongToDatabase(song);
}
public async Task<SongData> RetrieveSong(Song songMetaData)
@@ -248,22 +294,21 @@ namespace Icarus.Controllers.Managers
private async Task<Song> SaveSongTemp(IFormFile songFile)
{
var song = new Song();
var filename = song.GenerateFilename();
var filePath = Path.Combine(_tempDirectoryRoot, filename);
_logger.Info("Assigning song filename");
song.SongDirectory = _tempDirectoryRoot;
song.Filename = song.GenerateFilename(1);
using (var filestream = new FileStream(filePath, FileMode.Create))
using (var filestream = new FileStream(song.SongPath(), FileMode.Create))
{
_logger.Info("Saving song to temporary directory");
await songFile.CopyToAsync(filestream);
}
MetadataRetriever meta = new MetadataRetriever();
song = meta.RetrieveMetaData(filePath);
song = meta.RetrieveMetaData(song.SongPath());
_logger.Info("Assigning song filename");
song.Filename = filename;
song.SongDirectory = _tempDirectoryRoot;
song.Filename = song.GenerateFilename(1);
song.DateCreated = DateTime.Now;
return song;