Song uploads
Uploading songs is functional and does not use the song metadata for the filename or directory creation
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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}")]
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user