using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Selector.CLI.Extensions; using Selector.Model; using Selector.Model.Extensions; using System; using System.CommandLine; using System.CommandLine.Invocation; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace Selector.CLI { public class ScrobbleMapCommand : Command { public ScrobbleMapCommand(string name, string description = null) : base(name, description) { var delayOption = new Option("--delay", getDefaultValue: () => 100, "milliseconds to delay"); delayOption.AddAlias("-d"); AddOption(delayOption); var simulOption = new Option("--simultaneous", getDefaultValue: () => 3, "simultaneous connections when pulling"); simulOption.AddAlias("-s"); AddOption(simulOption); var limitOption = new Option("--limit", getDefaultValue: () => 200, "limit number of objects to poll"); limitOption.AddAlias("-l"); AddOption(limitOption); Handler = CommandHandler.Create(async (int delay, int simultaneous, int? limit, CancellationToken token) => await Execute(delay, simultaneous, limit, token)); } public static async Task Execute(int delay, int simultaneous, int? limit, CancellationToken token) { try { var context = new CommandContext().WithLogger().WithDb().WithSpotify(); var logger = context.Logger.CreateLogger("Scrobble"); using var db = new ApplicationDbContext(context.DatabaseConfig.Options, context.Logger.CreateLogger()); await new ScrobbleMapper( context.Spotify.Search, new () { InterRequestDelay = new TimeSpan(0, 0, 0, 0, delay), SimultaneousConnections = simultaneous, Limit = limit }, new ScrobbleRepository(db), new ScrobbleMappingRepository(db), context.Logger.CreateLogger(), context.Logger) .Execute(token); } catch (Exception ex) { Console.WriteLine(ex); return 1; } return 0; } } }