using System.ComponentModel.DataAnnotations.Schema; using Newtonsoft.Json; namespace Icarus.Models; public class Song { #region Properties [JsonProperty("id")] public int Id { get; set; } [JsonProperty("title")] public string Title { get; set; } [JsonProperty("album")] [Column("Album")] public string AlbumTitle { get; set; } [JsonProperty("artist")] public string Artist { get; set; } [JsonProperty("album_artist")] public string AlbumArtist { get; set; } [JsonProperty("year")] public int? Year { get; set; } [JsonProperty("genre")] public string Genre { get; set; } [JsonProperty("duration")] public int Duration { get; set; } [JsonProperty("filename")] public string Filename { get; set; } [JsonIgnore] public string SongDirectory { get; set; } [JsonProperty("track")] public int Track { get; set; } = 0; [JsonProperty("track_count")] public int TrackCount { get; set; } = 0; [JsonProperty("disc")] public int Disc { get; set; } = 0; [JsonProperty("disc_count")] public int DiscCount { get; set; } = 0; [JsonIgnore] public int? AlbumId { get; set; } [JsonIgnore] public int? ArtistId { get; set; } [JsonIgnore] public int? GenreId { get; set; } [JsonIgnore] public int? CoverArtId { get; set; } [JsonProperty("date_created")] public DateTime DateCreated { get; set; } [JsonProperty("user_id")] public int UserId { get; set; } #endregion #region Constructors #endregion #region Methods public void PrintMetadata() { Console.WriteLine("\n\nMetadata of the song:"); Console.WriteLine($"ID: {this.Id}"); Console.WriteLine($"Title: {this.Title}"); Console.WriteLine($"Artist: {this.Artist}"); Console.WriteLine($"Album: {this.AlbumTitle}"); Console.WriteLine($"Genre: {this.Genre}"); Console.WriteLine($"Year: {this.Year}"); Console.WriteLine($"Duration: {this.Duration}"); Console.WriteLine($"AlbumID: {this.AlbumId}"); Console.WriteLine($"ArtistID: {this.ArtistId}"); Console.WriteLine($"GenreID: {this.GenreId}"); Console.WriteLine($"Song Path: {this.SongPath()}"); Console.WriteLine($"Filename: {this.Filename}"); Console.WriteLine("\n"); } public string SongPath() { var fullPath = SongDirectory; if (fullPath[fullPath.Length -1] != '/') { fullPath += "/"; } fullPath += Filename; return fullPath; } public string GenerateFilename(int flag = 0) { int length = Constants.DirectoryPaths.FILENAME_LENGTH; string chars = Constants.DirectoryPaths.FILENAME_CHARACTERS; var filename = this.Generate(length, chars); var extension = Icarus.Constants.FileExtensions.DEFAULT_AUDIO_EXTENSION; return flag == 0 ? filename : $"{filename}{extension}"; } public async Task GenerateFilenameAsync(int flag = 0) { int length = Constants.DirectoryPaths.FILENAME_LENGTH; string chars = Constants.DirectoryPaths.FILENAME_CHARACTERS; var extension = Icarus.Constants.FileExtensions.DEFAULT_AUDIO_EXTENSION; var filename = await Task.Run(() => { return this.Generate(length, chars); }); return flag == 0 ? filename : $"{filename}{extension}"; } private string Generate(int length, string chars) { var random = new Random(); var filename = new string(Enumerable.Repeat(chars, length).Select(s => s[random.Next(s.Length)]).ToArray()); return filename; } #endregion }