added clear command, apply network changes to db
This commit is contained in:
parent
cd176cea2e
commit
a9f33d38f4
16
Selector.CLI/Command/Scrobble/Scrobble.cs
Normal file
16
Selector.CLI/Command/Scrobble/Scrobble.cs
Normal file
@ -0,0 +1,16 @@
|
||||
using System.CommandLine;
|
||||
|
||||
namespace Selector.CLI
|
||||
{
|
||||
public class ScrobbleCommand : Command
|
||||
{
|
||||
public ScrobbleCommand(string name, string description = null) : base(name, description)
|
||||
{
|
||||
var saveCommand = new ScrobbleSaveCommand("save", "save scrobbles to database");
|
||||
AddCommand(saveCommand);
|
||||
|
||||
var clearCommand = new ScrobbleClearCommand("clear", "clear user scrobbles");
|
||||
AddCommand(clearCommand);
|
||||
}
|
||||
}
|
||||
}
|
70
Selector.CLI/Command/Scrobble/ScrobbleClear.cs
Normal file
70
Selector.CLI/Command/Scrobble/ScrobbleClear.cs
Normal file
@ -0,0 +1,70 @@
|
||||
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 ScrobbleClearCommand : Command
|
||||
{
|
||||
public ScrobbleClearCommand(string name, string description = null) : base(name, description)
|
||||
{
|
||||
var fromOption = new Option<DateTime>("--from", "Date from which to pull scrobbles");
|
||||
AddOption(fromOption);
|
||||
|
||||
var toOption = new Option<DateTime>( "--to", "Last date for which to pull scrobbles");
|
||||
AddOption(toOption);
|
||||
|
||||
var username = new Option<string>("--username", "user to pulls scrobbles for");
|
||||
username.AddAlias("-u");
|
||||
AddOption(username);
|
||||
|
||||
Handler = CommandHandler.Create(async (DateTime? from, DateTime? to, string username, CancellationToken token) => await Execute(from, to, username, token));
|
||||
}
|
||||
|
||||
public static async Task<int> Execute(DateTime? from, DateTime? to, string username, CancellationToken token)
|
||||
{
|
||||
try
|
||||
{
|
||||
var context = new CommandContext().WithLogger().WithDb();
|
||||
var logger = context.Logger.CreateLogger("Scrobble");
|
||||
|
||||
var db = new ApplicationDbContext(context.DatabaseConfig.Options, context.Logger.CreateLogger<ApplicationDbContext>());
|
||||
|
||||
logger.LogInformation("Searching for {0}", username);
|
||||
var user = db.Users
|
||||
.Include(u => u.Scrobbles)
|
||||
.FirstOrDefault(u => u.UserName == username);
|
||||
|
||||
if (user is not null)
|
||||
{
|
||||
user.Scrobbles = user.Scrobbles
|
||||
.Where(s => s.Timestamp < (from ?? DateTime.MinValue)
|
||||
&& s.Timestamp > (to ?? DateTime.MaxValue))
|
||||
.ToList();
|
||||
|
||||
await db.SaveChangesAsync();
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.LogError("{0} not found", username);
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine(ex);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
@ -12,16 +12,6 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace Selector.CLI
|
||||
{
|
||||
public class ScrobbleCommand : Command
|
||||
{
|
||||
public ScrobbleCommand(string name, string description = null) : base(name, description)
|
||||
{
|
||||
|
||||
var saveCommand = new ScrobbleSaveCommand("save", "save scrobbles to");
|
||||
AddCommand(saveCommand);
|
||||
}
|
||||
}
|
||||
|
||||
public class ScrobbleSaveCommand : Command
|
||||
{
|
||||
public ScrobbleSaveCommand(string name, string description = null) : base(name, description)
|
@ -9,7 +9,7 @@
|
||||
},
|
||||
"Selector.CLI.Scrobble": {
|
||||
"commandName": "Project",
|
||||
"commandLineArgs": "scrobble save -u sarsoo --from \"2022/01/01\"",
|
||||
"commandLineArgs": "scrobble save -u sarsoo --from \"2022/01/01\" -nr -na",
|
||||
"environmentVariables": {
|
||||
"DOTNET_ENVIRONMENT": "Development"
|
||||
},
|
||||
@ -17,7 +17,15 @@
|
||||
},
|
||||
"Selector.CLI.Scrobble.All": {
|
||||
"commandName": "Project",
|
||||
"commandLineArgs": "scrobble save -u sarsoo --from \"2017/01/01\" -p 200 -d 75 --no-remove",
|
||||
"commandLineArgs": "scrobble save -u sarsoo --from \"2017/01/01\" -p 200 -d 75 -na -nr",
|
||||
"environmentVariables": {
|
||||
"DOTNET_ENVIRONMENT": "Development"
|
||||
},
|
||||
"nativeDebugging": true
|
||||
},
|
||||
"Selector.CLI.Scrobble.Clear": {
|
||||
"commandName": "Project",
|
||||
"commandLineArgs": "scrobble clear -u sarsoo --from \"2022/01/01\"",
|
||||
"environmentVariables": {
|
||||
"DOTNET_ENVIRONMENT": "Development"
|
||||
},
|
||||
|
@ -8,6 +8,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
@ -69,6 +70,8 @@ namespace Selector
|
||||
}
|
||||
}
|
||||
|
||||
IdentifyDuplicates(scrobbles);
|
||||
|
||||
logger.LogDebug("Ordering and filtering pulled scrobbles");
|
||||
|
||||
var nativeScrobbles = scrobbles
|
||||
@ -154,5 +157,34 @@ namespace Selector
|
||||
|
||||
return tasks;
|
||||
}
|
||||
|
||||
private void IdentifyDuplicates(IEnumerable<LastTrack> tracks)
|
||||
{
|
||||
logger.LogDebug("Identifying duplicates");
|
||||
|
||||
var duplicates = tracks
|
||||
.GroupBy(t => t.TimePlayed?.UtcDateTime)
|
||||
.Where(g => g.Count() > 1);
|
||||
|
||||
foreach(var dupe in duplicates)
|
||||
{
|
||||
var dupeString = new StringBuilder();
|
||||
|
||||
foreach(var scrobble in dupe)
|
||||
{
|
||||
dupeString.Append("(");
|
||||
dupeString.Append(scrobble.Name);
|
||||
dupeString.Append(", ");
|
||||
dupeString.Append(scrobble.AlbumName);
|
||||
dupeString.Append(", ");
|
||||
dupeString.Append(scrobble.ArtistName);
|
||||
dupeString.Append(")");
|
||||
|
||||
dupeString.Append(" ");
|
||||
}
|
||||
|
||||
logger.LogInformation("Duplicate at {0}: {1}", dupe.Key, dupeString.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
using IF.Lastfm.Core.Objects;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Linq;
|
||||
@ -13,7 +14,7 @@ namespace Selector
|
||||
public static bool MatchTime(Scrobble nativeScrobble, Scrobble serviceScrobble)
|
||||
=> serviceScrobble.Timestamp.Equals(nativeScrobble.Timestamp);
|
||||
|
||||
public static (IEnumerable<Scrobble>, IEnumerable<Scrobble>) IdentifyDiffs(IEnumerable<Scrobble> existing, IEnumerable<Scrobble> toApply)
|
||||
public static (IEnumerable<Scrobble>, IEnumerable<Scrobble>) IdentifyDiffs(IEnumerable<Scrobble> existing, IEnumerable<Scrobble> toApply, bool matchContents = true)
|
||||
{
|
||||
existing = existing.OrderBy(s => s.Timestamp);
|
||||
toApply = toApply.OrderBy(s => s.Timestamp);
|
||||
@ -37,6 +38,11 @@ namespace Selector
|
||||
|
||||
if (MatchTime(currentExisting, toApplyIter.Current))
|
||||
{
|
||||
if (matchContents)
|
||||
{
|
||||
MatchData(currentExisting, toApplyIter.Current);
|
||||
}
|
||||
|
||||
toApplyIter.MoveNext();
|
||||
}
|
||||
else
|
||||
@ -54,6 +60,24 @@ namespace Selector
|
||||
return (toAdd, toRemove);
|
||||
}
|
||||
|
||||
public static void MatchData(Scrobble currentExisting, Scrobble toApply)
|
||||
{
|
||||
if (!currentExisting.TrackName.Equals(toApply.TrackName, StringComparison.InvariantCultureIgnoreCase))
|
||||
{
|
||||
currentExisting.TrackName = toApply.TrackName;
|
||||
}
|
||||
|
||||
if (!currentExisting.AlbumName.Equals(toApply.AlbumName, StringComparison.InvariantCultureIgnoreCase))
|
||||
{
|
||||
currentExisting.AlbumName = toApply.AlbumName;
|
||||
}
|
||||
|
||||
if (!currentExisting.ArtistName.Equals(toApply.ArtistName, StringComparison.InvariantCultureIgnoreCase))
|
||||
{
|
||||
currentExisting.ArtistName = toApply.ArtistName;
|
||||
}
|
||||
}
|
||||
|
||||
public static (IEnumerable<Scrobble>, IEnumerable<Scrobble>) IdentifyDiffsContains(IEnumerable<Scrobble> existing, IEnumerable<Scrobble> toApply)
|
||||
{
|
||||
var toAdd = toApply.Where(s => !existing.Contains(s, new ScrobbleComp()));
|
||||
|
Loading…
Reference in New Issue
Block a user