У меня есть приложение с текстами песен, где мне нужно скачать тексты песен из всех песен в библиотеке Spotify. Этот процесс имеет 3 функции: первая вызывает API Spotify для получения списка песен и сохраняет его в списке; вторая вызывает API Genius для поиска в своей базе данных и пытается найти песню с соответствующим названием и исполнителем; третий снова вызывает API Genius для получения деталей песни, таких как название альбома и избранные исполнители, а также загружает страницу, содержащую текст, чтобы затем сохранить все в файл.
Проблема в том, что по какой-то причине всякий раз, когда анализатор JSON (из JSON.NET) находит нулевое значение, он замораживает всю задачу, не вызывая исключения или чего-либо еще. В основном, у меня есть тот же код, реализованный в моей основной деятельности, и всякий раз, когда есть нулевое значение, он просто возвращает пустую строку. По какой-то причине в этот раз он просто отказывается продолжать.
Вот код из части третьей функции:
private async Task getDetails(string APIPath)
{
Log.WriteLine(LogPriority.Info, "SmartLyrics", "getDetails (SpotifyDownload): Starting getDetails operation");
string results = await Genius.GetSongDetails(APIPath, "Bearer my_apps_auth_code"); //This method gives a "Reading content stream..." message
JObject parsed = JObject.Parse(results); //on the log when it recieves a JSON from the API
Song song = new Song() //This is a custom class to store song information throught the app.
{
title = (string)parsed["response"]["song"]["title"],
artist = (string)parsed["response"]["song"]["primary_artist"]["name"],
album = (string)parsed["response"]["song"]["album"]["name"],
header = (string)parsed["response"]["song"]["header_image_url"],
cover = (string)parsed["response"]["song"]["song_art_image_url"],
APIPath = (string)parsed["response"]["song"]["api_path"],
path = (string)parsed["response"]["song"]["path"]
}; //This is where it gets stuck. You can see in the log file that it recieves the JSON from the API but never processes it.
Log.WriteLine(LogPriority.Debug, "SmartLyrics", "getDetails (SpotifyDownload): Created new Song variable");
if (parsed["response"]["song"]["featured_artists"].HasValues)
{
Log.WriteLine(LogPriority.Info, "SmartLyrics", "getDetails (SpotifyDownload): Track has featured artists");
//...
}
else
{
Log.WriteLine(LogPriority.Info, "SmartLyrics", "getDetails (SpotifyDownload): Track does not have featured artists");
song.featuredArtist = "";
}
string downloadedLyrics;
HtmlWeb web = new HtmlWeb();
Log.WriteLine(LogPriority.Debug, "SmartLyrics", "getDetails (SpotifyDownload): Trying to load page");
var doc = await web.LoadFromWebAsync("https://genius.com" + song.path);
Log.WriteLine(LogPriority.Verbose, "SmartLyrics", "getDetails (SpotifyDownload): Loaded Genius page");
var lyricsBody = doc.DocumentNode.SelectSingleNode("//div[@class='lyrics']");
downloadedLyrics = Regex.Replace(lyricsBody.InnerText, @"^\s*", ""); //these regexes just removes some
downloadedLyrics = Regex.Replace(downloadedLyrics, @"[\s]+$", ""); //whitespace on the start and end of the lyrics
song.lyrics = downloadedLyrics;
Log.WriteLine(LogPriority.Info, "SmartLyrics", "getDetails (SpotifyDownload): Completed getDetails task for " + song.APIPath);
}
Этот метод вызывается 3 раза подряд, и есть еще одна функция, которая проверяет, выполнены ли последние 3 вызова или нет, прежде чем вызывать его еще три раза.
Вот LogCat:
06-26 14:26:21.189: I/SmartLyrics(31087): getGeniusSearchResults (SpotifyDownload): No tasks are running!
06-26 14:26:21.189: I/SmartLyrics(31087): getDetails (SpotifyDownload): Starting getDetails operation
06-26 14:26:21.190: V/SmartLyrics(31087): GeniusRequests.cs: Adding Auth headers to HttpClient
06-26 14:26:21.190: W/SmartLyrics(31087): Url sent to HttpClient: https://api.genius.com/songs/3393276
06-26 14:26:21.193: I/SmartLyrics(31087): getGeniusSearchResults (SpotifyDownload): foreach for index 4 completed.
06-26 14:26:21.193: I/SmartLyrics(31087): getDetails (SpotifyDownload): Starting getDetails operation
06-26 14:26:21.194: V/SmartLyrics(31087): GeniusRequests.cs: Adding Auth headers to HttpClient
06-26 14:26:21.194: W/SmartLyrics(31087): Url sent to HttpClient: https://api.genius.com/songs/3125896
06-26 14:26:21.195: I/SmartLyrics(31087): getGeniusSearchResults (SpotifyDownload): foreach for index 5 completed.
06-26 14:26:21.196: I/SmartLyrics(31087): getDetails (SpotifyDownload): Starting getDetails operation
06-26 14:26:21.196: V/SmartLyrics(31087): GeniusRequests.cs: Adding Auth headers to HttpClient
06-26 14:26:21.196: W/SmartLyrics(31087): Url sent to HttpClient: https://api.genius.com/songs/2822309
06-26 14:26:21.198: I/SmartLyrics(31087): getGeniusSearchResults (SpotifyDownload): foreach for index 6 completed. //All three calls made, now it will wait until all of them are finished to call three more
06-26 14:26:21.198: E/SmartLyrics(31087): getGeniusSearchResults (SpotifyDownload): getDetails tasks still running //This is from a while loop that checks if all tasks have finished.
06-26 14:26:21.958: V/SmartLyrics(31087): GeniusRequests.cs: Reading content stream... //1
06-26 14:26:21.968: D/SmartLyrics(31087): getDetails (SpotifyDownload): Created new Song variable
06-26 14:26:21.968: I/SmartLyrics(31087): getDetails (SpotifyDownload): Track does not have featured artists
06-26 14:26:21.968: D/SmartLyrics(31087): getDetails (SpotifyDownload): Trying to load page
06-26 14:26:21.972: V/SmartLyrics(31087): GeniusRequests.cs: Reading content stream... //2
06-26 14:26:22.536: V/SmartLyrics(31087): GeniusRequests.cs: Reading content stream... //3 This means that all 3 of them recieved a response from the API
06-26 14:26:22.540: D/SmartLyrics(31087): getDetails (SpotifyDownload): Created new Song variable
06-26 14:26:22.540: I/SmartLyrics(31087): getDetails (SpotifyDownload): Track does not have featured artists
06-26 14:26:22.540: D/SmartLyrics(31087): getDetails (SpotifyDownload): Trying to load page
06-26 14:26:24.618: V/SmartLyrics(31087): getDetails (SpotifyDownload): Loaded Genius page
06-26 14:26:24.619: I/SmartLyrics(31087): getDetails (SpotifyDownload): Completed getDetails task for /songs/3393276 //1
06-26 14:26:24.850: V/SmartLyrics(31087): getDetails (SpotifyDownload): Loaded Genius page
06-26 14:26:24.852: I/SmartLyrics(31087): getDetails (SpotifyDownload): Completed getDetails task for /songs/3125896 //2 Only two of the three finished.
06-26 14:26:26.199: E/SmartLyrics(31087): getGeniusSearchResults (SpotifyDownload): getDetails tasks still running
06-26 14:26:31.200: E/SmartLyrics(31087): getGeniusSearchResults (SpotifyDownload): getDetails tasks still running
06-26 14:26:36.201: E/SmartLyrics(31087): getGeniusSearchResults (SpotifyDownload): getDetails tasks still running
06-26 14:26:41.202: E/SmartLyrics(31087): getGeniusSearchResults (SpotifyDownload): getDetails tasks still running //It gets stuck in a loop here because the getDetails method never fiishes.
Единственная песня, которая застревает, это та, которая имеет нулевое значение для объекта «альбом». Любая помощь здесь?