From 74debc94bc9fa96fa320d7bf6097d9900b298633 Mon Sep 17 00:00:00 2001 From: Athul Raj Date: Sun, 25 Jun 2023 22:25:08 +0530 Subject: [PATCH] fix detection logic, fix tracking updating logic #33 --- Totoro.Core/Models/Tracking.cs | 25 ++++++++++++- Totoro.WinUI/App.xaml.cs | 46 ++++++++++++++---------- Totoro.WinUI/Services/ToastService.cs | 3 +- Totoro.WinUI/Services/ViewService.cs | 51 ++++++++++++++++++++------- 4 files changed, 90 insertions(+), 35 deletions(-) diff --git a/Totoro.Core/Models/Tracking.cs b/Totoro.Core/Models/Tracking.cs index ad665c3e..75b5c511 100644 --- a/Totoro.Core/Models/Tracking.cs +++ b/Totoro.Core/Models/Tracking.cs @@ -1,4 +1,6 @@ -namespace Totoro.Core.Models; +using MalApi; + +namespace Totoro.Core.Models; public record Tracking { @@ -29,4 +31,25 @@ public static Tracking Next(AnimeModel anime) return tracking; } + + public static Tracking WithEpisode(AnimeModel anime, int episode) + { + var tracking = new Tracking + { + WatchedEpisodes = episode + }; + + if (tracking.WatchedEpisodes == anime.TotalEpisodes) + { + tracking.Status = AnimeStatus.Completed; + tracking.FinishDate = DateTime.Today; + } + else if (tracking.WatchedEpisodes == 1) + { + tracking.Status = AnimeStatus.Watching; + tracking.StartDate = DateTime.Today; + } + + return tracking; + } } diff --git a/Totoro.WinUI/App.xaml.cs b/Totoro.WinUI/App.xaml.cs index bfabd69f..f0561421 100644 --- a/Totoro.WinUI/App.xaml.cs +++ b/Totoro.WinUI/App.xaml.cs @@ -104,28 +104,36 @@ private void OnExit(object sender, EventArgs e) private async void ToastNotificationManagerCompat_OnActivated(ToastNotificationActivatedEventArgsCompat e) { - var args = ToastArguments.Parse(e.Argument); - - if(!args.Contains("Type")) + try { - return; - } + var args = ToastArguments.Parse(e.Argument); - switch (args.GetEnum("Type")) + if (!args.Contains("Type")) + { + return; + } + + switch (args.GetEnum("Type")) + { + case ToastType.DownloadComplete: + Process.Start(new ProcessStartInfo { FileName = args.Get("File"), UseShellExecute = true }); + break; + case ToastType.FinishedEpisode: + var anime = JsonSerializer.Deserialize(args.Get("Payload")); + var ep = args.GetInt("Episode"); + var trackingService = GetService(); + await trackingService.Update(anime.Id, Tracking.WithEpisode(anime, ep)); + break; + case ToastType.SelectAnime: + var id = long.Parse((string)e.UserInput["animeId"]); + var nowPlayingViewModel = GetService(); + RxApp.MainThreadScheduler.Schedule(async () => await nowPlayingViewModel.SetAnime(id)); + break; + } + } + catch (Exception ex) { - case ToastType.DownloadComplete: - Process.Start(new ProcessStartInfo { FileName = args.Get("File"), UseShellExecute = true }); - break; - case ToastType.FinishedEpisode: - var anime = JsonSerializer.Deserialize(args.Get("Payload")); - var trackingService = GetService(); - await trackingService.Update(anime.Id, Tracking.Next(anime)); - break; - case ToastType.SelectAnime: - var id = long.Parse((string)e.UserInput["animeId"]); - var nowPlayingViewModel = GetService(); - RxApp.MainThreadScheduler.Schedule(async () => await nowPlayingViewModel.SetAnime(id)); - break; + this.Log().Error(ex); } } diff --git a/Totoro.WinUI/Services/ToastService.cs b/Totoro.WinUI/Services/ToastService.cs index d68fc80e..e5681fd8 100644 --- a/Totoro.WinUI/Services/ToastService.cs +++ b/Totoro.WinUI/Services/ToastService.cs @@ -1,7 +1,6 @@ using System.IO; using System.Text.Json; using CommunityToolkit.WinUI.Notifications; -using Windows.ApplicationModel.Store; namespace Totoro.WinUI.Services { @@ -13,7 +12,7 @@ public void CheckEpisodeComplete(AnimeModel anime, int currentEp) new ToastContentBuilder() .SetToastScenario(ToastScenario.Reminder) .AddText($"Did you finish watching {anime.Title} Episode {currentEp}") - .AddButton("Yes", ToastActivationType.Background, $"Type={ToastType.FinishedEpisode};Payload={payload}") + .AddButton("Yes", ToastActivationType.Background, $"Type={ToastType.FinishedEpisode};Payload={payload};Episode={currentEp}") .AddButton("No", ToastActivationType.Background, $"Type={ToastType.NoAction}") .Show(); } diff --git a/Totoro.WinUI/Services/ViewService.cs b/Totoro.WinUI/Services/ViewService.cs index f5cde140..0f336875 100644 --- a/Totoro.WinUI/Services/ViewService.cs +++ b/Totoro.WinUI/Services/ViewService.cs @@ -172,20 +172,32 @@ public async Task SelectModel(IEnumerable models, T defaultValue = defa return null; } - var filtered = candidates.Where(x => Fuzz.PartialRatio(x.Title, title) > 80 || x.AlternativeTitles.Any(x => Fuzz.PartialRatio(title, x) > 80)).ToList(); + if (!candidates.Any()) + { + this.Log().Fatal($"no candidates found for title {title}"); + return null; + } + + if (candidates.FirstOrDefault(x => x.Title == title || x.AlternativeTitles.Any(x => x == title)) is { } result) + { + return result.Id; + } + + var ratios = candidates.Select(x => (x, Fuzz.PartialRatio(x.Title, title))).OrderByDescending(x => x.Item2).ToList(); + var filtered = ratios.Where(x => x.Item2 > 80).ToList(); if (filtered.Count == 1) { - return filtered[0].Id; + return filtered[0].x.Id; } else { - if (!candidates.Any()) + var hundredPercent = filtered.Where(x => x.Item2 == 100).ToList(); + if (hundredPercent.Count == 1) { - this.Log().Fatal($"no candidates found for title {title}"); - return null; + return hundredPercent[0].x.Id; } - var model = await SelectModel(candidates, filtered.FirstOrDefault() ?? candidates.FirstOrDefault(), _animeService.GetAnime); + var model = await SelectModel(candidates, filtered.FirstOrDefault().x ?? candidates.FirstOrDefault(), _animeService.GetAnime); return model?.Id; } } @@ -203,20 +215,33 @@ public async Task SelectModel(IEnumerable models, T defaultValue = defa return null; } - var filtered = candidates.Where(x => Fuzz.PartialRatio(x.Title, title) > 80 || x.AlternativeTitles.Any(x => Fuzz.PartialRatio(title, x) > 80)).ToList(); + if (!candidates.Any()) + { + this.Log().Fatal($"no candidates found for title {title}"); + return null; + } + + if (candidates.FirstOrDefault(x => x.Title == title || x.AlternativeTitles.Any(x => x == title)) is { } result) + { + return result.Id; + } + + var ratios = candidates.Select(x => (x, Fuzz.PartialRatio(x.Title, title))).OrderByDescending(x => x.Item2).ToList(); + var filtered = ratios.Where(x => x.Item2 > 80).ToList(); if (filtered.Count == 1) { - return filtered[0].Id; + return filtered[0].x.Id; } else { - if (!candidates.Any()) + var hundredPercent = filtered.Where(x => x.Item2 == 100).ToList(); + if (hundredPercent.Count == 1) { - this.Log().Fatal($"no candidates found for title {title}"); - return null; + return hundredPercent[0].x.Id; } - _toastService.PromptAnimeSelection(candidates, filtered.FirstOrDefault() ?? candidates.FirstOrDefault()); + _toastService.PromptAnimeSelection(candidates, filtered.FirstOrDefault().x ?? candidates.FirstOrDefault()); + return null; } } @@ -307,7 +332,7 @@ public async Task Information(string title, string message) PrimaryButtonText = "Yes", }; - var result = await dialog.ShowAsync(); + await dialog.ShowAsync(); return Unit.Default; }