From 079e12664899a1285ddfa0351d6a73f4320409e1 Mon Sep 17 00:00:00 2001 From: andy Date: Wed, 22 Jun 2022 21:51:38 +0100 Subject: [PATCH] ui tweaks, scrobble matcher trailing dupes --- .../ScrobbleRepositoryExtensions.cs | 26 ++++++++++++--- Selector.Web/CSS/index.scss | 26 +++++++++++++++ Selector.Web/CSS/now.scss | 14 -------- Selector.Web/Pages/Index.cshtml | 16 +++++++-- Selector.Web/Pages/Index.cshtml.cs | 21 ++++++++++-- Selector.Web/Pages/Now.cshtml | 2 +- Selector.Web/Pages/Shared/_Layout.cshtml | 18 +++++----- Selector.Web/scripts/Now/PlayCountGraph.ts | 6 +++- Selector.Web/scripts/now.ts | 6 ++-- Selector/Scrobble/ScrobbleMatcher.cs | 33 ++++++++++++------- 10 files changed, 119 insertions(+), 49 deletions(-) diff --git a/Selector.Model/Extensions/ScrobbleRepositoryExtensions.cs b/Selector.Model/Extensions/ScrobbleRepositoryExtensions.cs index a02c9f7..3174631 100644 --- a/Selector.Model/Extensions/ScrobbleRepositoryExtensions.cs +++ b/Selector.Model/Extensions/ScrobbleRepositoryExtensions.cs @@ -1,13 +1,29 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Selector.Model.Extensions { public static class ScrobbleRepositoryExtensions { - + public static int CountToday(this IScrobbleRepository repo, string userId = null, string username = null, string track = null, string album = null, string artist = null) + { + if (!string.IsNullOrWhiteSpace(userId)) + { + return repo.Count(userId: userId, from: DateTime.Now.ToUniversalTime().Date, + artistName: artist, + albumName: album, + trackName: track); + } + else if (!string.IsNullOrWhiteSpace(username)) + { + return repo.Count(username: username, from: DateTime.Now.ToUniversalTime().Date, + artistName: artist, + albumName: album, + trackName: track); + } + else + { + throw new ArgumentNullException("user"); + } + } } } diff --git a/Selector.Web/CSS/index.scss b/Selector.Web/CSS/index.scss index 39e42c5..b8fcadc 100644 --- a/Selector.Web/CSS/index.scss +++ b/Selector.Web/CSS/index.scss @@ -83,3 +83,29 @@ input[type=text], input[type=email], input[type=tel], input[type=password] { color: $text-color; } } + +.card { + background-color: #333232; + color: $text-color; + margin: 5px; + padding: 15px; + box-shadow: 4px 4px 2px $shadow-color; + transition: box-shadow 0.5s; + + &:hover { + box-shadow: none; + offset: 4px 4px; + } +} + +.daily-scrobbles-card { + margin-top: 30px; + margin-left: auto; + margin-right: auto; + max-width: 250px; + + p { + margin: 10px; + font-size: 45px; + } +} \ No newline at end of file diff --git a/Selector.Web/CSS/now.scss b/Selector.Web/CSS/now.scss index 1565612..117ef61 100644 --- a/Selector.Web/CSS/now.scss +++ b/Selector.Web/CSS/now.scss @@ -5,20 +5,6 @@ $text-color: white; $shadow-color: #1e1e1e; -.card { - background-color: #333232; - color: $text-color; - margin: 5px; - padding: 15px; - box-shadow: 4px 4px 2px $shadow-color; - transition: box-shadow 0.5s; - - &:hover { - box-shadow: none; - offset: 4px 4px; - } -} - .now-playing-card { // max-width: 300px; diff --git a/Selector.Web/Pages/Index.cshtml b/Selector.Web/Pages/Index.cshtml index cda4653..bb8f9a5 100644 --- a/Selector.Web/Pages/Index.cshtml +++ b/Selector.Web/Pages/Index.cshtml @@ -1,13 +1,23 @@ @page @model IndexModel @{ - ViewData["Title"] = "Home page"; + ViewData["Title"] = "Selector"; }
-

Welcome

+

run that

-

Selector is a tool for monitoring Spotify usage.

+

Selector is a live dashboard that presents Spotify data with Last.fm listening stats.

Now Playing + + @if(Model.DailyScrobbles is not null) + { +
+

Today

+

@Model.DailyScrobbles

+ +
+ } +
\ No newline at end of file diff --git a/Selector.Web/Pages/Index.cshtml.cs b/Selector.Web/Pages/Index.cshtml.cs index d6da548..0a2ef3e 100644 --- a/Selector.Web/Pages/Index.cshtml.cs +++ b/Selector.Web/Pages/Index.cshtml.cs @@ -6,6 +6,9 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Logging; +using Microsoft.AspNetCore.Identity; +using Selector.Model; +using Selector.Model.Extensions; namespace Selector.Web.Pages { @@ -13,15 +16,29 @@ namespace Selector.Web.Pages public class IndexModel : PageModel { private readonly ILogger _logger; + private readonly UserManager _userManager; + private readonly IScrobbleRepository _scrobbleRepo; - public IndexModel(ILogger logger) + public IndexModel(ILogger logger, UserManager userManager, IScrobbleRepository scrobbleRepo) { _logger = logger; + _userManager = userManager; + _scrobbleRepo = scrobbleRepo; } + [BindProperty] + public int? DailyScrobbles { get; set; } + public void OnGet() { - + if(User.Identity.IsAuthenticated) + { + var user = _userManager.GetUserAsync(User).Result; + if(user.ScrobbleSavingEnabled()) + { + DailyScrobbles = _scrobbleRepo.CountToday(userId: user.Id); + } + } } } } diff --git a/Selector.Web/Pages/Now.cshtml b/Selector.Web/Pages/Now.cshtml index 2f0b94f..f75e347 100644 --- a/Selector.Web/Pages/Now.cshtml +++ b/Selector.Web/Pages/Now.cshtml @@ -1,7 +1,7 @@ @page @model NowModel @{ - ViewData["Title"] = "Now"; + ViewData["Title"] = "Now - Selector"; }
diff --git a/Selector.Web/Pages/Shared/_Layout.cshtml b/Selector.Web/Pages/Shared/_Layout.cshtml index 27d5f52..74fddb4 100644 --- a/Selector.Web/Pages/Shared/_Layout.cshtml +++ b/Selector.Web/Pages/Shared/_Layout.cshtml @@ -3,7 +3,7 @@ - @ViewData["Title"] - Selector + @ViewData["Title"] @@ -33,13 +33,15 @@
© 2021 - Selector.Web - Privacy
- AP + + AP + @await RenderSectionAsync("Scripts", required: false) diff --git a/Selector.Web/scripts/Now/PlayCountGraph.ts b/Selector.Web/scripts/Now/PlayCountGraph.ts index 59bcaf3..ab09b11 100644 --- a/Selector.Web/scripts/Now/PlayCountGraph.ts +++ b/Selector.Web/scripts/Now/PlayCountGraph.ts @@ -7,7 +7,7 @@ Chart.register(LineController, CategoryScale, LinearScale, TimeSeriesScale, Poin const months = ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"]; export let PlayCountChartCard: Vue.Component = { - props: ['data_points', 'title', 'chart_id'], + props: ['data_points', 'title', 'chart_id', 'link'], data() { return { chartData: { @@ -33,6 +33,7 @@ export let PlayCountChartCard: Vue.Component = {

{{ title }}

+
`, mounted() { @@ -56,6 +57,9 @@ export let PlayCountChartCard: Vue.Component = { // } }, scales: { + yAxis: { + suggestedMin: 0 + } } } }) diff --git a/Selector.Web/scripts/now.ts b/Selector.Web/scripts/now.ts index 5b82a97..c799958 100644 --- a/Selector.Web/scripts/now.ts +++ b/Selector.Web/scripts/now.ts @@ -55,13 +55,13 @@ const app = Vue.createApp({ return ""; }, showArtistChart(){ - return this.playCount !== null && this.playCount !== undefined && this.playCount.artistCountData.length > 0; + return this.playCount !== null && this.playCount !== undefined && this.playCount.artistCountData.length > 3; }, showAlbumChart() { - return this.playCount !== null && this.playCount !== undefined && this.playCount.albumCountData.length > 0; + return this.playCount !== null && this.playCount !== undefined && this.playCount.albumCountData.length > 3; }, showTrackChart(){ - return this.playCount !== null && this.playCount !== undefined && this.playCount.trackCountData.length > 0; + return this.playCount !== null && this.playCount !== undefined && this.playCount.trackCountData.length > 3; } }, created() { diff --git a/Selector/Scrobble/ScrobbleMatcher.cs b/Selector/Scrobble/ScrobbleMatcher.cs index efd5cd8..6daa5c9 100644 --- a/Selector/Scrobble/ScrobbleMatcher.cs +++ b/Selector/Scrobble/ScrobbleMatcher.cs @@ -23,27 +23,36 @@ namespace Selector var toAdd = new List(); var toRemove = new List(); + var toApplyOverrun = false; + if (toApplyIter.MoveNext()) { if (existing.Any()) { foreach (var currentExisting in existing) { - while (toApplyIter.Current.Timestamp < currentExisting.Timestamp) + if (!toApplyOverrun) { - toAdd.Add(toApplyIter.Current); - - toApplyIter.MoveNext(); - } - - if (MatchTime(currentExisting, toApplyIter.Current)) - { - if (matchContents) + while (toApplyIter.Current.Timestamp < currentExisting.Timestamp) { - MatchData(currentExisting, toApplyIter.Current); + toAdd.Add(toApplyIter.Current); + + toApplyIter.MoveNext(); } - toApplyIter.MoveNext(); + if (MatchTime(currentExisting, toApplyIter.Current)) + { + if (matchContents) + { + MatchData(currentExisting, toApplyIter.Current); + } + + toApplyOverrun = !toApplyIter.MoveNext(); + } + else + { + toRemove.Add(currentExisting); + } } else { @@ -51,7 +60,7 @@ namespace Selector } } - if (toApplyIter.Current is not null) + if (toApplyIter.Current is not null && !toApplyOverrun) { toAdd.Add(toApplyIter.Current);