public async Task <bool> ProcessTrack(string id, AlbumInfo albumInfo = null, TrackInfo trackInfo = null) { var trackProgress = new ProgressBar(100, 100); if (trackInfo == null) { trackInfo = await GetTrackInfo(id); if (trackInfo == null) { trackProgress.Refresh(0, $"{id} | Failed to get track info"); return(false); } } if (albumInfo == null) { string albumId = trackInfo.TrackTags.AlbumId; albumInfo = await GetAlbumInfo(albumId) ?? new AlbumInfo { AlbumTags = new AlbumTags { Artists = new [] { new Artists { Name = "Unknown Artist" } }, Type = "Unknown", Title = albumId ?? "Unknown Collection " + Helpers.GetRandomChars(5), NumberOfDiscs = "0", NumberOfTracks = "0" } }; } AudioQuality qualityToUse = FindAvailableAudioQuality(trackInfo); if (qualityToUse == AudioQuality.None) { Helpers.RedMessage("Failed to find any available audio quality"); return(false); } string trackProgressTitle = $"\nDownloading {albumInfo.AlbumTags.Artists[0].Name} - {trackInfo.TrackTags.Title} | Quality: {DeezerHelpers.AudioQualityToOutputString[qualityToUse]}"; trackProgress.Next($"{trackProgressTitle} | Getting save location"); string saveLocation = DeezerHelpers.BuildSaveLocation(trackInfo, albumInfo, qualityToUse); string saveLocationDirectory = Path.GetDirectoryName(saveLocation); string tempTrackPath = DeezerHelpers.GetTempTrackPath(saveLocationDirectory, trackInfo.TrackTags.Id); if (File.Exists(saveLocation)) { trackProgress.Refresh(100, $"{trackProgressTitle} | file already exists"); return(true); } byte[] decryptedBytes = await GetDecryptedBytes(trackInfo, qualityToUse, trackProgress, trackProgressTitle); trackProgress.Next($"{trackProgressTitle} | Writing to disk"); if (!DeezerHelpers.WriteTrackBytes(decryptedBytes, tempTrackPath)) { trackProgress.Refresh(0, $"{trackProgressTitle} | Failed to write file to disk"); return(false); } byte[] albumCover = await GetAndSaveAlbumArt(albumInfo.AlbumTags.PictureId, saveLocationDirectory); trackProgress.Next($"{trackProgressTitle} | Writing metadata"); var metadataWriter = new MetadataWriter(trackInfo, albumInfo, tempTrackPath, albumCover); if (!metadataWriter.WriteMetaData(qualityToUse == AudioQuality.Flac)) { trackProgress.Refresh(0, $"{trackProgressTitle} | Failed to write tags"); } DeezerHelpers.RenameFiles(tempTrackPath, saveLocation, saveLocationDirectory); trackProgress.Next($"{trackProgressTitle} | Complete"); return(true); }