Esempio n. 1
0
        public async Task <JObject> HitUnofficialApi(string method, JObject data, int retries = 3)
        {
            string queryString = await DeezerHelpers.BuildDeezerApiQueryString(_apiToken, method);

            string url = $"{ApiUrl}?{queryString}";

            string bodyData = JsonConvert.SerializeObject(data);

            var body = new StringContent(bodyData, Encoding.UTF8, "application/json");

            var attempts = 1;

            while (attempts <= retries)
            {
                try
                {
                    using (HttpResponseMessage apiResponse = await _httpClient.PostAsync(url, body))
                    {
                        if (apiResponse.IsSuccessStatusCode)
                        {
                            string bodyContent = await apiResponse.Content.ReadAsStringAsync();

                            if (!string.IsNullOrWhiteSpace(bodyContent))
                            {
                                try
                                {
                                    return(JObject.Parse(bodyContent));
                                }
                                catch (JsonReaderException ex)
                                {
                                    Console.WriteLine(ex.Message);
                                }
                            }
                        }
                    }
                }
                catch (HttpRequestException ex)
                {
                    Console.WriteLine(ex.Message);
                }

                attempts++;
                Helpers.RedMessage("Request failed, waiting 5s...");
                await Task.Delay(5000);
            }

            return(null);
        }
Esempio n. 2
0
        // the way this works is that if the wanted quality was not found, the next best will be tried and so on
        // until it wraps around to the start and tries the lower quality options, starting at highest lower quality
        // I.E. 320 -> FLAC -> 256 -> 128 -> null
        private AudioQuality FindAvailableAudioQuality(TrackInfo trackInfo)
        {
            var enumIds = new List <int> {
                1, 5, 3, 9
            };

            int startIndex = enumIds.IndexOf((int)_audioQuality);

            if (_audioQuality == AudioQuality.Flac)
            {
                enumIds.Reverse();
                startIndex = 0;
            }

            AudioQuality newQuality = ValidAudioQualityFound(startIndex, enumIds.Count);

            if (newQuality != AudioQuality.None)
            {
                return(newQuality);
            }

            if (_audioQuality != AudioQuality.Flac)
            {
                enumIds.RemoveRange(startIndex, 4 - startIndex);
                enumIds.Reverse();
            }

            return(ValidAudioQualityFound(0, startIndex));

            AudioQuality ValidAudioQualityFound(int startingIndex, int endIndex)
            {
                for (int index = startingIndex; index < endIndex; index++)
                {
                    int  enumId             = enumIds[index];
                    var  quality            = (AudioQuality)enumId;
                    bool qualityIsAvailable = DeezerHelpers.CheckIfQualityIsAvailable(quality, trackInfo);

                    if (qualityIsAvailable)
                    {
                        return(quality);
                    }
                }

                return(AudioQuality.None);
            }
        }
Esempio n. 3
0
        public async Task <bool> GetApiToken()
        {
            Console.WriteLine("Grabbing API token...");
            using (FormUrlEncodedContent formContent = DeezerHelpers.BuildDeezerApiContent("", "deezer.getUserData"))
            {
                using (HttpResponseMessage apiRequest = await _httpClient.PostAsync(ApiUrl, formContent))
                {
                    if (!apiRequest.IsSuccessStatusCode)
                    {
                        Helpers.RedMessage("Failed to contact initial API");
                        return(false);
                    }

                    string apiRequestBody = await apiRequest.Content.ReadAsStringAsync();

                    JObject apiRequestJson = JObject.Parse(apiRequestBody);

                    if (apiRequestJson == null)
                    {
                        Helpers.RedMessage("Failed to parse API token request JSON");
                        return(false);
                    }

                    apiRequestJson.DisplayDeezerErrors("API Token");

                    if (apiRequestJson["results"]?["USER"]?["USER_ID"].Value <int>() == 0)
                    {
                        Helpers.RedMessage("Invalid credentials");
                        return(false);
                    }

                    if (apiRequestJson["results"]?["checkForm"] != null)
                    {
                        _apiToken = apiRequestJson["results"]["checkForm"].Value <string>();
                        return(true);
                    }

                    Helpers.RedMessage("Unable to get checkform");
                    return(false);
                }
            }
        }
Esempio n. 4
0
        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);
        }