65 lines
2.8 KiB
C#
65 lines
2.8 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
|
|
public class PlayListSynchronizer
|
|
{
|
|
private SpotifyApiClient _spotifyAPIClient;
|
|
|
|
public PlayListSynchronizer(SpotifyApiClient spotifyAPIClient)
|
|
{
|
|
_spotifyAPIClient = spotifyAPIClient;
|
|
}
|
|
|
|
public async Task SynchronizePlaylistAsync(SmartPlaylistDefinition playlist)
|
|
{
|
|
var songsToInclude = new List<Song>();
|
|
using (var dci = DataContext.Instance)
|
|
{
|
|
songsToInclude.AddRange(dci.SongSuggestions.Where(ss => ss.HasUsedSuggestion && playlist.Categories.Contains(ss.SuggestionHelper) && !songsToInclude.Contains(ss.Song)).Select(ss => ss.Song));
|
|
songsToInclude.AddRange(playlist.ExplicitlyIncludedSongs.Where(ss => !songsToInclude.Contains(ss)));
|
|
if (playlist.IncludesUnCategorizedSongs)
|
|
{
|
|
songsToInclude.AddRange(dci.SongSuggestions.Where(ss => !ss.HasUsedSuggestion && !songsToInclude.Contains(ss.Song)).Select(ss => ss.Song));
|
|
}
|
|
if (playlist.IncludesLikedSongs)
|
|
{
|
|
var userWithLikes = dci.Users.Include(u => u.LikedSongs).Where(u => u.UserId == playlist.CreatedBy.UserId).SingleOrDefault();
|
|
var likedSongs = userWithLikes.LikedSongs;
|
|
songsToInclude.AddRange(likedSongs.Where(s => !songsToInclude.Contains(s)));
|
|
}
|
|
}
|
|
songsToInclude.RemoveAll(song => playlist.ExplicitlyExcludedSongs.Contains(song));
|
|
var spotifyIdsToInclude = songsToInclude.Select(s => s.SpotifyId);
|
|
|
|
var apiClient = await _spotifyAPIClient.WithUserAuthorizationAsync(playlist.CreatedBy);
|
|
|
|
var songsAlreadyInPlaylist = await apiClient.GetSongsInPlaylist(playlist.SpotifyPlaylistId);
|
|
|
|
var songsToAdd = spotifyIdsToInclude.Where(sti => !songsAlreadyInPlaylist.Contains(sti)).ToList();
|
|
var songsToRemove = songsAlreadyInPlaylist.Where(sai => !spotifyIdsToInclude.Contains(sai)).ToList();
|
|
|
|
apiClient.AddSongsToPlaylist(playlist.SpotifyPlaylistId, songsToAdd);
|
|
apiClient.RemoveSongsFromPlaylist(playlist.SpotifyPlaylistId, songsToRemove);
|
|
}
|
|
|
|
public async Task SynchronizePlaylistsAsync(IList<SmartPlaylistDefinition> playlists)
|
|
{
|
|
foreach(var playlist in playlists)
|
|
{
|
|
await SynchronizePlaylistAsync(playlist);
|
|
}
|
|
}
|
|
|
|
public async Task SynchronizeUserPlaylistsAsync(User user)
|
|
{
|
|
using(var dci = DataContext.Instance)
|
|
{
|
|
var userPlayLists = dci.SmartPlaylistDefinitions
|
|
.Include(pl => pl.ExplicitlyIncludedSongs)
|
|
.Include(pl => pl.ExplicitlyExcludedSongs)
|
|
.Include(pl => pl.Categories)
|
|
.Include(pl => pl.CreatedBy)
|
|
.Where(pl => pl.CreatedBy == user).ToList();
|
|
await SynchronizePlaylistsAsync(userPlayLists);
|
|
}
|
|
}
|
|
} |