public async Task SetPlaylist(DataForTrackSaving tracksInfo, string provider, int index) { _socialNetworkApi = SocialNetworkApiFactory.GetSocialNetworkApi(provider); bool tracksToEnd = index == -1; using (var unitOfWork = _unitOfWorkFactory.NewUnitOfWork()) { var playlistTrackRepository = unitOfWork.GetRepository<PlaylistTrack>(); var trackRepository = unitOfWork.GetRepository<Track>(); List<VkTrackResponse.Audio> trackDatas = null; //get checked tracks var socialNetworkData = GetSocialNetworkData(unitOfWork, provider); trackDatas = await _socialNetworkApi.GetSelectedTracks(tracksInfo, socialNetworkData.AccessToken); if (trackDatas.Any()) { var playlist = unitOfWork.PlaylistRepository.GetOne(pl => pl.Id == tracksInfo.PlaylistId); playlist.PlaylistTracks = playlistTrackRepository.Get(s => s.Identifier.Playlist.Id == tracksInfo.PlaylistId).ToList(); int i = 0; //create Track objects var artistRepo = unitOfWork.GetRepository<Artist>(); try { foreach (var trackData in trackDatas) { if (trackData.Artist.Length > 50) { trackData.Artist = trackData.Artist.Substring(0, 50); } if (trackData.Title.Length > 50) { trackData.Title = trackData.Title.Substring(0, 50); } var artist = new Artist { Name = trackData.Artist }; var album = new Album { Name = "", Artist = artist, }; artist.Albums.Add(album); artistRepo.AddItem(artist); var track = new Track { Duration = trackData.Duration.ToString(CultureInfo.InvariantCulture), //Lyrics = // await _socialNetworkApi.GetLyricsById(socialNetworkData.ThirdPartId, trackData.Id, // socialNetworkData.AccessToken), Name = trackData.Title, Album = album, ThirdPartId = Convert.ToString(trackData.Id), OwnerId = Convert.ToString(trackData.OwnerId), Genre = trackData.GenreId.ToString(), }; track.Playlists.Add(playlist); album.Tracks.Add(track); trackRepository.AddItem(track); if (index == -1) { index = (playlist.Tracks.Any()) ? playlist.Tracks.Count() : 0; } var playlistTrack = new PlaylistTrack { Identifier = new PlaylistTracksIdentifier { Playlist = playlist, Track = track }, TrackPosition = index + i++ }; playlistTrackRepository.AddItem(playlistTrack); playlist.PlaylistTracks.Add(playlistTrack); } } catch (Exception exp) { var s = exp; } if (tracksToEnd == false) { playlist.PlaylistTracks.ForEach((item, n) => { if (n < playlist.PlaylistTracks.Count - i && item.TrackPosition >= index) { item.TrackPosition += i; } }); } } unitOfWork.Commit(); } }
public async Task<HttpResponseMessage> Post(DataForTrackSaving tracksInfo, string provider, int index) { await _userTracksService.SetPlaylist(tracksInfo, provider, index); return Request.CreateResponse(HttpStatusCode.OK); }
public async Task<List<VkTrackResponse.Audio>> GetSelectedTracks(DataForTrackSaving tracksInfo, string accessToken) { var result = new List<VkTrackResponse.Audio>(); for (int offset = 0; offset < tracksInfo.TrackInfos.Count; offset += 100) { var url = BaseUri + "audio.getById?audios="; url = tracksInfo.TrackInfos.Skip(offset) .Take(100) .Aggregate(url, (current, track) => current + (track.OwnerId + "_" + track.ThirdPartId + ",")); url = url.Remove(url.Length - 1); url += "&itunes=0&v=5.24&access_token=" + accessToken; var json = await _webClient.GetWebData(url); var tracks = JsonConvert.DeserializeObject<VkTrackResponse>(json); if (tracks.Response == null) { var error = JsonConvert.DeserializeObject<ErrorData>(json); if (error.Error == null && tracks.Response != null) { return tracks.Response; } int code = error.Error.ErrorCode; string message = error.Error.ErrorMessage; switch (code) { case 1: throw new UnknownErrorException(message, code); case 2: throw new ApplicationDisabledException(message, code); case 4: throw new IncorrectSignatureException(message, code); case 5: throw new UserAuthorizationException(message, code); case 6: throw new ManyRequestException(message, code); case 100: throw new BadParametersException(message, code); default: throw new VkApiException(message, code); } } result.AddRange(tracks.Response); } return result; }