tsk-103: Confirmed functionality is working

This commit is contained in:
phoenix
2025-02-16 17:16:53 -05:00
parent 6bff36bc03
commit 63f3c955a1
28 changed files with 148 additions and 76 deletions
+1 -1
View File
@@ -85,7 +85,7 @@ public class AlbumManager : BaseManager
if (string.IsNullOrEmpty(newAlbumTitle))
newAlbumTitle = oldAlbumTitle;
if ((string.IsNullOrEmpty(newAlbumTitle) && string.IsNullOrEmpty(newAlbumArtist) ||
if ((string.IsNullOrEmpty(newAlbumTitle) && string.IsNullOrEmpty(newAlbumArtist) ||
oldAlbumTitle!.Equals(newAlbumTitle) && oldAlbumArtist!.Equals(newAlbumArtist)))
{
_logger.Info("No change to the song's album");
+1 -1
View File
@@ -84,7 +84,7 @@ public class ArtistManager : BaseManager
_artistContext.Add(newArtistRecord);
_artistContext.SaveChanges();
return newArtistRecord;
}
else
@@ -48,7 +48,7 @@ public class CoverArtManager : BaseManager
try
{
var stockCoverArtPath = _rootCoverArtPath + _filename;
if (!string.Equals(stockCoverArtPath, coverArt.ImagePath(),
if (!string.Equals(stockCoverArtPath, coverArt.ImagePath(),
StringComparison.CurrentCultureIgnoreCase))
{
_logger.Info("Song does not contain the stock cover art");
@@ -87,7 +87,7 @@ public class CoverArtManager : BaseManager
var metaData = new MetadataRetriever();
var imgBytes = metaData.RetrieveCoverArtBytes(song);
if (imgBytes != null)
{
_logger.Info("Saving cover art to the filesystem");
@@ -121,7 +121,7 @@ public class CoverArtManager : BaseManager
var msg = ex.Message;
_logger.Error(msg, "An error occurred");
}
return null;
}
@@ -173,7 +173,7 @@ public class CoverArtManager : BaseManager
if (!File.Exists(_rootCoverArtPath + _filename))
{
File.WriteAllBytes(_rootCoverArtPath + _filename,
File.WriteAllBytes(_rootCoverArtPath + _filename,
_stockCoverArt!);
Console.WriteLine("Copied Stock Cover Art");
}
@@ -53,7 +53,7 @@ public class DirectoryManager : BaseManager
public static string GenerateDownloadFilename(int length, string extension, string title, bool? randomize)
{
if (randomize.HasValue && randomize.Value)
if (randomize.HasValue && randomize.Value)
{
return GenerateFilename(length) + extension;
}
@@ -100,13 +100,13 @@ public class DirectoryManager : BaseManager
var artistDirectory = ArtistDirectory();
if (IsDirectoryEmpty(albumDirectory))
{
Directory.Delete(albumDirectory);
Console.WriteLine($"directory {albumDirectory} deleted");
Directory.Delete(albumDirectory);
Console.WriteLine($"directory {albumDirectory} deleted");
}
if (IsDirectoryEmpty(artistDirectory))
{
Directory.Delete(artistDirectory);
Console.WriteLine($"directory {artistDirectory} deleted");
Directory.Delete(artistDirectory);
Console.WriteLine($"directory {artistDirectory} deleted");
}
}
catch (Exception ex)
@@ -116,6 +116,42 @@ public class DirectoryManager : BaseManager
}
}
public int DeleteEmptyDirectories(string? directory, int level)
{
var deleted = 0;
try
{
var curDir = directory;
for (var i = 0; i < level; i++)
{
if (!System.IO.Directory.Exists(curDir))
{
// return deleted;
continue;
}
if (this.IsDirectoryEmpty(curDir))
{
System.IO.Directory.Delete(curDir);
}
curDir = System.IO.Directory.GetParent(curDir).ToString();
}
}
catch (Exception ex)
{
var exMsg = ex.Message;
Console.WriteLine($"An error occurred {exMsg}");
}
return deleted;
}
public void DeleteEmptyDirectories(Song song)
{
try
@@ -125,12 +161,12 @@ public class DirectoryManager : BaseManager
if (IsDirectoryEmpty(albumDirectory))
{
Directory.Delete(albumDirectory);
Directory.Delete(albumDirectory);
_logger.Info("Album directory deleted");
}
if (IsDirectoryEmpty(artistDirectory))
{
Directory.Delete(artistDirectory);
Directory.Delete(artistDirectory);
_logger.Info("Artist directory deleted");
}
}
@@ -187,7 +223,7 @@ public class DirectoryManager : BaseManager
private class DirEnt
{
public string? Pre { get; set;}
public string? Pre { get; set; }
public string? Path { get; set; }
public string? Post { get; set; }
}
+10 -3
View File
@@ -110,10 +110,17 @@ public class SongManager : BaseManager
{
var songPath = songMetaData.SongPath();
System.IO.File.Delete(songPath);
successful = true;
successful = !System.IO.File.Exists(songPath);
if (successful)
{
Console.WriteLine("Song successfully deleted");
}
DirectoryManager dirMgr = new DirectoryManager(_config!, songMetaData);
dirMgr.DeleteEmptyDirectories();
Console.WriteLine("Song successfully deleted");
var deletedAmount = dirMgr.DeleteEmptyDirectories(songMetaData.SongDirectory, 1);
if (deletedAmount > 0)
{
Console.WriteLine($"{deletedAmount} directories deleted");
}
}
catch (Exception ex)
{
+19 -14
View File
@@ -53,7 +53,7 @@ public class TokenManager : BaseManager
_logger.Info("Serializing token object into JSON");
var tokenObject = JsonConvert.SerializeObject(tokenRequest);
request.AddParameter("application/json; charset=utf-8",
request.AddParameter("application/json; charset=utf-8",
tokenObject, ParameterType.RequestBody);
request.RequestFormat = DataFormat.Json;
@@ -74,7 +74,7 @@ public class TokenManager : BaseManager
public LoginResult LoginSymmetric(User user)
{
var tokenResult = new TokenTierOne{ TokenType = "JWT" };
var tokenResult = new TokenTierOne { TokenType = "JWT" };
var payload = Payload();
payload.Add(new Claim("user_id", user.Id.ToString(), ClaimValueTypes.Integer));
@@ -91,7 +91,7 @@ public class TokenManager : BaseManager
Expires = DateTime.UtcNow.AddHours(1),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature),
Issuer = _config["Jwt:Issuer"], // Add this line
Audience = _config["Jwt:Audience"]
Audience = _config["Jwt:Audience"]
};
tokenResult.AccessToken = tokenHandler.WriteToken(tokenHandler.CreateToken(tokenDescriptor));
@@ -112,8 +112,11 @@ public class TokenManager : BaseManager
{
return new LoginResult
{
UserId = user.Id, Username = user.Username, Token = token.AccessToken,
TokenType = token.TokenType, Expiration = token.Expiration,
UserId = user.Id,
Username = user.Username,
Token = token.AccessToken,
TokenType = token.TokenType,
Expiration = token.Expiration,
Message = SUCCESSFUL_TOKEN_MESSAGE
};
}
@@ -162,13 +165,13 @@ public class TokenManager : BaseManager
"download:songs",
"read:song_details",
"upload:songs",
"delete:songs",
"read:albums",
"delete:songs",
"read:albums",
"read:artists",
"update:songs",
"stream:songs",
"read:genre",
"read:year",
"update:songs",
"stream:songs",
"read:genre",
"read:year",
"download:cover_art"
};
@@ -217,15 +220,17 @@ public class TokenManager : BaseManager
{
return await System.IO.File.ReadAllTextAsync(filepath);
}
private TokenRequest RetrieveTokenRequest()
{
_logger.Info("Retrieving token object");
return new TokenRequest
{
ClientId = _clientId, ClientSecret = _clientSecret,
Audience = _audience, GrantType = _grantType
ClientId = _clientId,
ClientSecret = _clientSecret,
Audience = _audience,
GrantType = _grantType
};
}
@@ -9,8 +9,8 @@ public class MetadataRetriever
{
#region Fields
private static NLog.Logger? _logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
private List<string>? _supportedAudioFileTypes = new List<string> {"wav", "flac"};
private List<string>? _supportedImageFileTypes = new List<string> {"jpeg", "jpg", "png"};
private List<string>? _supportedAudioFileTypes = new List<string> { "wav", "flac" };
private List<string>? _supportedImageFileTypes = new List<string> { "jpeg", "jpg", "png" };
private Song? _updatedSong;
private string? _message;
private string? _title;
@@ -99,7 +99,7 @@ public class MetadataRetriever
public bool IsSupportedFile(IFormFile file)
{
var supportedTypes = this._supportedAudioFileTypes;
this._supportedImageFileTypes!.ForEach(t =>
this._supportedImageFileTypes!.ForEach(t =>
{
if (!supportedTypes!.Contains(t))
{
@@ -115,7 +115,7 @@ public class MetadataRetriever
public bool IsSupportedFile(string path)
{
var supportedTypes = this._supportedAudioFileTypes;
this._supportedImageFileTypes!.ForEach(t =>
this._supportedImageFileTypes!.ForEach(t =>
{
if (!supportedTypes!.Contains(t))
{
@@ -199,7 +199,7 @@ public class MetadataRetriever
return [];
}
public void UpdateMetadata(Song updatedSong, Song oldSong)
{
try
@@ -267,7 +267,7 @@ public class MetadataRetriever
break;
case "artists":
_updatedSong!.Artist = artist;
fileTag.Tag.Performers = new []{artist};
fileTag.Tag.Performers = new[] { artist };
break;
case "album":
_updatedSong!.AlbumTitle = album;
@@ -275,7 +275,7 @@ public class MetadataRetriever
break;
case "genre":
_updatedSong!.Genre = genre;
fileTag.Tag.Genres = new []{genre};
fileTag.Tag.Genres = new[] { genre };
break;
case "year":
_updatedSong!.Year = year;
@@ -283,7 +283,7 @@ public class MetadataRetriever
break;
case "albumartist":
_updatedSong!.AlbumArtist = albumArtist;
fileTag.Tag.AlbumArtists = new []{albumArtist};
fileTag.Tag.AlbumArtists = new[] { albumArtist };
break;
case "track":
_updatedSong!.Track = track;
@@ -352,7 +352,7 @@ public class MetadataRetriever
}
return songValues;
}
}
private bool CheckIntField(int? value)
{
@@ -70,14 +70,14 @@ public class PasswordEncryption
password: password, salt: salt,
prf: KeyDerivationPrf.HMACSHA1,
iterationCount: 10000,
numBytesRequested: 256/8));
numBytesRequested: 256 / 8));
return hashed;
}
byte[] GenerateSalt()
{
byte[] salt = new byte[128/8];
byte[] salt = new byte[128 / 8];
using (var rng = RandomNumberGenerator.Create())
rng.GetBytes(salt);
@@ -43,10 +43,10 @@ public class SongCompression
{
var archivePath = RetrieveCompressesSongPath(song);
Console.WriteLine($"Compressed song saved to: {archivePath}");
songData.Data = await System.IO.File.ReadAllBytesAsync(archivePath);
}
catch(Exception ex)
catch (Exception ex)
{
var exMsg = ex.Message;
Console.WriteLine($"An error ocurred: \n{exMsg}");
+1 -1
View File
@@ -48,7 +48,7 @@ public class AlbumController : BaseController
[HttpGet("{id}")]
public IActionResult GetAlbum(int id)
{
Album album = new Album{ Id = id };
Album album = new Album { Id = id };
var albumContext = new AlbumContext(_connectionString!);
+1 -1
View File
@@ -49,7 +49,7 @@ public class ArtistController : BaseController
public IActionResult GetArtist(int id)
{
Artist artist = new Artist { Id = id };
var artistContext = new ArtistContext(_connectionString!);
if (artistContext.DoesRecordExist(artist))
+2 -2
View File
@@ -20,7 +20,7 @@ public class BaseController : ControllerBase
const string otherTokenType = "Jwt";
var req = Request;
var auth = req.Headers.Authorization;
var auth = req.Headers.Authorization;
var val = auth.ToString();
if ((val.Contains(tokenType) || val.Contains(otherTokenType)) && val.Split(" ").Count() > 1)
@@ -31,7 +31,7 @@ public class BaseController : ControllerBase
return token;
}
}
#endregion
}
+4 -4
View File
@@ -63,7 +63,7 @@ public class CoverArtController : BaseController
var coverArtBytes = System.IO.File.ReadAllBytes(
coverArt.ImagePath());
return File(coverArtBytes, "application/x-msdownload",
return File(coverArtBytes, "application/x-msdownload",
coverArt.SongTitle);
}
else
@@ -78,14 +78,14 @@ public class CoverArtController : BaseController
{
var songContext = new SongContext(_connectionString!);
var covMgr = new CoverArtManager(this._config!);
var songMetaData = songContext.RetrieveRecord(new Song { Id = id});
var songMetaData = songContext.RetrieveRecord(new Song { Id = id });
var c = covMgr.GetCoverArt(songMetaData);
var filename = DirectoryManager.GenerateDownloadFilename(10, Constants.FileExtensions.JPG_EXTENSION, songMetaData.Title!, randomizeFilename);
var data = await c.GetData();
return File(data, "application/x-msdownload", filename);
}
#endregion
+1 -1
View File
@@ -58,7 +58,7 @@ public class GenreController : BaseController
if (genreStore.DoesRecordExist(genre))
{
genre = genreStore.RetrieveRecord(genre);
genre = genreStore.RetrieveRecord(genre);
return Ok(genre);
}
+1 -1
View File
@@ -44,7 +44,7 @@ public class LoginController : ControllerBase
var context = new UserContext(_connectionString!);
_logger.LogInformation("Starting process of validating credentials");
var message = "Invalid credentials";
var password = user.Password;
@@ -42,11 +42,11 @@ public class SongCompressedDataController : BaseController
var context = new SongContext(_connectionString!);
SongCompression cmp = new SongCompression(_archiveDir!);
Console.WriteLine($"Archive directory root: {_archiveDir}");
Console.WriteLine("Starting process of retrieving comrpessed song");
var sng = context.RetrieveRecord(new Song{ Id = id });
var sng = context.RetrieveRecord(new Song { Id = id });
SongData song = await cmp.RetrieveCompressedSong(sng);
var filename = DirectoryManager.GenerateDownloadFilename(10, Constants.FileExtensions.ZIP_EXTENSION, sng.Title!, randomizeFilename);
+3 -3
View File
@@ -41,7 +41,7 @@ public class SongController : BaseController
{
Console.WriteLine("Attemtping to retrieve songs");
_logger!.LogInformation("Attempting to retrieve songs");
var context = new SongContext(_connectionString!);
var songs = context.Songs!.ToList();
@@ -60,8 +60,8 @@ public class SongController : BaseController
public IActionResult GetSong(int id)
{
var context = new SongContext(_connectionString!);
var song = context.RetrieveRecord(new Song{ Id = id });
var song = context.RetrieveRecord(new Song { Id = id });
Console.WriteLine("Here");
+20 -3
View File
@@ -7,6 +7,8 @@ using Icarus.Database.Contexts;
namespace Icarus.Controllers.V1;
[Route("api/v1/song/data")]
[ApiController]
[Authorize]
@@ -151,10 +153,13 @@ public class SongDataController : BaseController
switch (song.AudioType)
{
case "wav":
// song = _songMgr.SaveSongToFileSystem(up.SongData, up.CoverArtData, song);
// TODO: Make sure the tmp file gets deleted. Check
var _ = _songMgr.DeleteSongFromFileSystem(tmpSong);
return BadRequest("No support for .wav files");
return BadRequest(new UploadSongWithDataResponse
{
Subject = "No longer supported",
Message = "No support for .wav files",
Songs = new List<Song>()
});
case "flac":
song = _songMgr.SaveFlacSongToFileSystem(up.SongData, up.CoverArtData, song);
break;
@@ -209,4 +214,16 @@ public class SongDataController : BaseController
[FromForm(Name = "metadata")]
public string? SongFile { get; set; }
}
public class UploadSongWithDataResponse
{
#region Properties
[Newtonsoft.Json.JsonProperty("message")]
public string Message { get; set; }
[Newtonsoft.Json.JsonProperty("subject")]
public string Subject { get; set; }
[Newtonsoft.Json.JsonProperty("data")]
public List<Song> Songs { get; set; }
#endregion
}
}
@@ -39,7 +39,7 @@ public class SongStreamController : BaseController
var stream = new FileStream(song!.SongPath(), FileMode.Open, FileAccess.Read);
stream.Position = 0;
var filename = song.Filename;
if (string.IsNullOrEmpty(song.Filename))
{
filename = song.GenerateFilename();
@@ -48,7 +48,8 @@ public class SongStreamController : BaseController
_logger!.LogInformation("Starting to stream song...>");
Console.WriteLine("Starting to streamsong...");
return await Task.Run(() => {
return await Task.Run(() =>
{
return File(stream, "application/octet-stream", filename);
});
}