private static ICollection <TrackPlaylist> ArrangePlaylist(PlaylistConfigDTO playlistConfigDTO, ICollection <TrackPlaylist> trackPlaylist) { if (playlistConfigDTO.UseTopTracks) { trackPlaylist = trackPlaylist.OrderBy(t => t.Track.Rank).ToList(); } else { trackPlaylist = trackPlaylist.OrderByDescending(t => t.Track.Rank).ToList(); } return(trackPlaylist); }
private async Task <IReadOnlyCollection <Track> > RandomTracksByGenreConfig(PlaylistConfigDTO playlistConfigDTO, string genreName) { var genreNames = playlistConfigDTO.GenreConfigs .Where(g => g.IsChecked == true) .Select(g => g.Name); var tracks = await _appDbContext.Tracks .AsNoTracking() .Where(t => t.IsDeleted == false) .Include(g => g.Genre) .Where(t => genreNames.Contains(t.Genre.Name) && t.Genre.Name.Equals(genreName)) .OrderBy(t => Guid.NewGuid()) .ToListAsync(); return(tracks); }
public async Task <PlaylistDTO> GeneratePlaylist(string from, string to, PlaylistConfigDTO playlistConfigDTO, Guid userId) { var travelDuration = await GetTravelDurationAsync(from, to); if (travelDuration <= 0 || playlistConfigDTO == null) { return(null); } int totalDuration = 0; var genres = playlistConfigDTO.GenreConfigs .Where(x => x.IsChecked == true); // Get only checked genres int genresCount = genres.Count(); if (genresCount <= 0) { return(null); } int avgMinPerGenre = 300 / genresCount; // Get Average additional minute per genre ( 5min MAX ) //Initialize playlist var playlist = new Playlist() { CreatedOn = DateTime.Now, Title = playlistConfigDTO.Title, UserId = userId, }; ICollection <TrackPlaylist> trackPlaylist = new List <TrackPlaylist>(); foreach (var genre in genres) { int durationPerGenre = 0; int genreDuration = 0; var genreTracks = await RandomTracksByGenreConfig(playlistConfigDTO, genre.Name); if (genre.Percentage <= 0 && playlistConfigDTO.IsAdvanced == false) { double genrePercent = 100 / genresCount; durationPerGenre = (int)Math.Floor(travelDuration * genrePercent) / 100; } else { durationPerGenre = (travelDuration * genre.Percentage) / 100; } int count = 0; while (true) { if (count >= genreTracks.Count()) { break; } //Gets Element at index var track = genreTracks.ElementAt(count); //Break if next track will surpass Max duation per genre if (genreDuration + track.Duration > durationPerGenre + avgMinPerGenre) { break; } totalDuration += track.Duration; genreDuration += track.Duration; trackPlaylist.Add(new TrackPlaylist() { CreatedOn = DateTime.Now, PlaylistId = playlist.Id, Playlist = playlist, TrackId = track.Id, Track = _mapper.Map <Track>(track), }); count++; } } trackPlaylist = ArrangePlaylist(playlistConfigDTO, trackPlaylist); playlist.Rank = (int)trackPlaylist.Average(t => t.Track.Rank); playlist.Duration = totalDuration; var trackPlaylistDB = trackPlaylist .Select(x => new TrackPlaylist() { PlaylistId = x.PlaylistId, TrackId = x.TrackId, }) .ToList(); playlist.TrackPlaylists = trackPlaylistDB; await _appDbContext.Playlists.AddAsync(playlist); await _appDbContext.SaveChangesAsync(); playlist.TrackPlaylists = trackPlaylist; var playlistDTO = _mapper.Map <PlaylistDTO>(playlist); return(playlistDTO); }