public void Changed_BeatSaver() { var c = new PluginConfig(); var defaultValue = c.BeatSaver; var newValue = new BeatSaverConfig(); Assert.AreEqual(defaultValue, c.BeatSaver); c.ResetConfigChanged(); Assert.IsFalse(c.ConfigChanged); c.BeatSaver = newValue; Assert.IsTrue(c.ConfigChanged); Assert.AreEqual(newValue, c.BeatSaver); }
public static void CreateBeatSaverSettingsUI(SubMenu parent, BeatSaverConfig sourceConfig) { string sourceName = "BeatSaver"; CreateSourceSettings(sourceName, parent, sourceConfig); var maxConcurrentPageChecks = parent.AddInt("Max Concurrent Page Checks", $"How many {sourceName} pages to check at the same time.", 1, 15, 1); maxConcurrentPageChecks.GetValue += delegate { return(sourceConfig.MaxConcurrentPageChecks); }; maxConcurrentPageChecks.SetValue += delegate(int value) { if (sourceConfig.MaxConcurrentPageChecks == value) { return; } sourceConfig.MaxConcurrentPageChecks = value; // Config.ConfigChanged = true; }; var favoriteMappers = CreateFeedSettings("Favorite Mappers", sourceName, sourceConfig.FavoriteMappers, parent, "Feed to get songs from mappers listed in UserData\\FavoriteMappers.ini. Max Songs is per mapper."); var separateMapperPlaylists = favoriteMappers.AddBool("Separate Mapper Playlists", $"Create a playlist for each mapper in FavoriteMappers.ini (must also have CreatePlaylist enabled)."); separateMapperPlaylists.GetValue += delegate { return(sourceConfig.FavoriteMappers.SeparateMapperPlaylists); }; separateMapperPlaylists.SetValue += delegate(bool value) { if (sourceConfig.FavoriteMappers.SeparateMapperPlaylists == value) { return; } sourceConfig.FavoriteMappers.SeparateMapperPlaylists = value; }; var hot = CreateFeedSettings("Hot", sourceName, sourceConfig.Hot, parent); var downloads = CreateFeedSettings("Downloads", sourceName, sourceConfig.Downloads, parent); }
protected async Task <JobStats> GetBeatSaverAsync(BeatSyncConfig config, IJobBuilder jobBuilder, JobManager jobManager, CancellationToken cancellationToken) { BeatSaverConfig sourceConfig = config.BeatSaver; JobStats sourceStats = new JobStats(); if (!sourceConfig.Enabled) { return(sourceStats); } BeatSaverReader reader = new BeatSaverReader(); FeedConfigBase[] feedConfigs = new FeedConfigBase[] { sourceConfig.Hot, sourceConfig.Downloads, sourceConfig.Latest }; if (!(feedConfigs.Any(f => f.Enabled) || sourceConfig.FavoriteMappers.Enabled)) { Logger.log?.Info($"No feeds enabled for {reader.Name}"); return(sourceStats); } SourceStarted?.Invoke(this, "BeatSaver"); foreach (FeedConfigBase?feedConfig in feedConfigs.Where(c => c.Enabled)) { Logger.log?.Info($" Starting {feedConfig.GetType().Name} feed..."); FeedResult results = await reader.GetSongsFromFeedAsync(feedConfig.ToFeedSettings(), cancellationToken).ConfigureAwait(false); if (results.Successful) { IEnumerable <IJob>?jobs = CreateJobs(results, jobBuilder, jobManager, cancellationToken); JobResult[] jobResults = await Task.WhenAll(jobs.Select(j => j.JobTask).ToArray()); JobStats feedStats = new JobStats(jobResults); ProcessFinishedJobs(jobs, jobBuilder.SongTargets, config, feedConfig); Logger.log?.Info($" Finished {feedConfig.GetType().Name} feed: ({feedStats})."); sourceStats += feedStats; } else { if (results.Exception != null) { Logger.log?.Error($" Error getting results from {feedConfig.GetType().Name}{results.Exception.Message}"); Logger.log?.Debug($"{results.Exception}"); } else { Logger.log?.Error($" Error getting results from {feedConfig.GetType().Name}: Unknown error."); } } } string[] mappers = sourceConfig.FavoriteMappers.Mappers ?? Array.Empty <string>(); if (sourceConfig.FavoriteMappers.Enabled) { FeedConfigBase feedConfig = sourceConfig.FavoriteMappers; if (mappers.Length > 0) { Logger.log?.Info(" Starting FavoriteMappers feed..."); List <IPlaylist> playlists = new List <IPlaylist>(); List <IPlaylist> feedPlaylists = new List <IPlaylist>(); List <IPlaylist> recentPlaylists = new List <IPlaylist>(); JobStats feedStats = new JobStats(); foreach (string?mapper in mappers) { Logger.log?.Info($" Getting songs by {mapper}..."); playlists.Clear(); FeedResult results = await reader.GetSongsFromFeedAsync(sourceConfig.FavoriteMappers.ToFeedSettings(mapper)).ConfigureAwait(false); if (results.Successful) { foreach (ITargetWithPlaylists?targetWithPlaylist in jobBuilder.SongTargets.Where(t => t is ITargetWithPlaylists).Select(t => (ITargetWithPlaylists)t)) { PlaylistManager?playlistManager = targetWithPlaylist.PlaylistManager; if (playlistManager != null) { if (config.RecentPlaylistDays > 0) { recentPlaylists.Add(playlistManager.GetOrAddPlaylist(BuiltInPlaylist.BeatSyncRecent)); } if (config.AllBeatSyncSongsPlaylist) { playlists.Add(playlistManager.GetOrAddPlaylist(BuiltInPlaylist.BeatSyncAll)); } if (sourceConfig.FavoriteMappers.CreatePlaylist) { IPlaylist feedPlaylist; try { if (sourceConfig.FavoriteMappers.SeparateMapperPlaylists) { feedPlaylist = playlistManager.GetOrCreateAuthorPlaylist(mapper); } else { feedPlaylist = playlistManager.GetOrAddPlaylist(BuiltInPlaylist.BeatSaverFavoriteMappers); } feedPlaylists.Add(feedPlaylist); playlists.Add(feedPlaylist); } catch (ArgumentException ex) { Logger.log?.Error($"Error getting playlist for FavoriteMappers: {ex.Message}"); Logger.log?.Debug(ex); } } } } IEnumerable <IJob> jobs = CreateJobs(results, jobBuilder, jobManager, cancellationToken) ?? Array.Empty <IJob>(); JobResult[] jobResults = await Task.WhenAll(jobs.Select(j => j.JobTask).ToArray()); JobStats mapperStats = new JobStats(jobResults); feedStats += mapperStats; if (jobs.Any(j => j.Result?.Successful ?? false) && feedConfig.PlaylistStyle == PlaylistStyle.Replace) { // TODO: This should only apply to successful targets. foreach (IPlaylist?feedPlaylist in feedPlaylists) { feedPlaylist.Clear(); feedPlaylist.RaisePlaylistChanged(); } } ProcessFinishedJobs(jobs, playlists, recentPlaylists); Logger.log?.Info($" Finished getting songs by {mapper}: ({mapperStats})."); } else { if (results.Exception != null) { Logger.log?.Error($"Error getting songs by {mapper}: {results.Exception.Message}"); Logger.log?.Debug(results.Exception); } else { Logger.log?.Error($"Error getting songs by {mapper}"); } } } sourceStats += feedStats; Logger.log?.Info($" Finished {feedConfig.GetType().Name} feed: ({feedStats})."); } else { Logger.log?.Warn(" No FavoriteMappers found, skipping..."); } } Logger.log?.Info($" Finished BeatSaver reading: ({sourceStats})."); return(sourceStats); }