/// <summary> /// Imports the user tracks. /// </summary> /// <param name="userId">The user identifier.</param> /// <param name="username">The username.</param> /// <param name="page">The page.</param> /// <returns></returns> public async Task ImportUserTracks(string userId, string username, int page) { ApplicationUser user = _userManager.FindById(userId); Uri trackUri = new Uri( $"http://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&api_key={ApiKey}&format=json" + $"&limit=200&user={username}&page={page}"); HttpResponseMessage result = await(new HttpClient()).GetAsync(trackUri); if (result.IsSuccessStatusCode) { JObject response = JObject.Parse(await result.Content.ReadAsStringAsync()); JToken recentTracks = response["recenttracks"]["track"]; int totalPages = (int)response["recenttracks"]["@attr"]["totalPages"]; foreach (JObject item in recentTracks) { string artistName = (string)item["artist"]["#text"]; if (!_redis.KeyExists($"matchfm.ids.artists.{artistName}")) { Meta artist = _artistRepository.FetchOrCreateByName(new Artist { Name = artistName }); _redis.StringSet($"matchfm.ids.artists.{artistName}", artist.Id); } } foreach (JObject item in recentTracks) { string artistName = (string)item["artist"]["#text"]; string albumName = (string)item["album"]["#text"]; if (!_redis.KeyExists($"matchfm.ids.artists.{artistName}.albums.{albumName}")) { int artistId = (int)_redis.StringGet($"matchfm.ids.artists.{artistName}"); Meta album = _albumRepository.FetchOrCreateByNameAndArtist(new Album { Name = albumName, ArtistId = artistId }); _redis.StringSet($"matchfm.ids.artists.{artistName}.albums.{albumName}", album.Id); } } foreach (JObject item in recentTracks) { string artistName = (string)item["artist"]["#text"]; string albumName = (string)item["album"]["#text"]; string trackName = (string)item["name"]; DateTime listenDate = new DateTime(1970, 1, 1, 0, 0, 0, 0); listenDate = listenDate.AddSeconds((int)item["date"]["uts"]); int trackId; if (!_redis.KeyExists($"matchfm.ids.artists.{artistName}.albums.{albumName}.tracks.{trackName}")) { int albumId = (int)_redis.StringGet($"matchfm.ids.artists.{artistName}.albums.{albumName}"); trackId = ((Track)_trackRepository.FetchOrCreateByNameAndAlbum(new Track { Name = trackName, AlbumId = albumId })).Id; _redis.StringSet($"matchfm.ids.artists.{artistName}.albums.{albumName}.tracks.{trackName}", trackId); } else { trackId = (int) _redis.StringGet($"matchfm.ids.artists.{artistName}.albums.{albumName}.tracks.{trackName}"); } UserTracks userTrack = new UserTracks { User = user, TrackId = trackId, ListenDate = listenDate }; _context.UserTracks.Add(userTrack); } _context.SaveChanges(); if (page < totalPages) { BackgroundJob.Enqueue <LastFMImportJob>(x => x.ImportUserTracks(userId, username, page + 1)); } _context.SaveChanges(); } }