From 095054697dfc80729a997ae9f7655952b373e46b Mon Sep 17 00:00:00 2001 From: Elwador <75888166+Elwador@users.noreply.github.com> Date: Sun, 26 May 2024 00:02:45 +0200 Subject: [PATCH] Add - Added Sonarr support --- CRD/Assets/crunchy_icon_round.png | Bin 0 -> 116598 bytes CRD/Assets/sonarr.png | Bin 0 -> 13245 bytes CRD/Assets/sonarr_inactive.png | Bin 0 -> 11338 bytes CRD/Downloader/CRAuth.cs | 5 +- CRD/Downloader/CrEpisode.cs | 5 +- CRD/Downloader/CrSeries.cs | 7 +- CRD/Downloader/Crunchyroll.cs | 33 +- CRD/Downloader/History.cs | 284 ++++++++++++++++-- CRD/Utils/Enums/EnumCollection.cs | 132 ++++++-- CRD/Utils/Files/CfgManager.cs | 1 + CRD/Utils/Helpers.cs | 44 ++- CRD/Utils/Sonarr/Models/SonarrEpisode.cs | 141 +++++++++ CRD/Utils/Sonarr/Models/SonarrImage.cs | 21 ++ .../Sonarr/Models/SonarrQualityProfile.cs | 14 + CRD/Utils/Sonarr/Models/SonarrSeason.cs | 38 +++ CRD/Utils/Sonarr/Models/SonarrSeries.cs | 223 ++++++++++++++ CRD/Utils/Sonarr/Models/SonarrStatistics.cs | 60 ++++ CRD/Utils/Sonarr/SonarrClient.cs | 154 ++++++++++ CRD/Utils/Structs/CrDownloadOptions.cs | 4 + CRD/ViewModels/AddDownloadPageViewModel.cs | 1 - CRD/ViewModels/SeriesPageViewModel.cs | 70 ++++- CRD/ViewModels/SettingsPageViewModel.cs | 60 +++- CRD/Views/SeriesPageView.axaml | 47 ++- CRD/Views/SettingsPageView.axaml | 34 +++ 24 files changed, 1272 insertions(+), 106 deletions(-) create mode 100644 CRD/Assets/crunchy_icon_round.png create mode 100644 CRD/Assets/sonarr.png create mode 100644 CRD/Assets/sonarr_inactive.png create mode 100644 CRD/Utils/Sonarr/Models/SonarrEpisode.cs create mode 100644 CRD/Utils/Sonarr/Models/SonarrImage.cs create mode 100644 CRD/Utils/Sonarr/Models/SonarrQualityProfile.cs create mode 100644 CRD/Utils/Sonarr/Models/SonarrSeason.cs create mode 100644 CRD/Utils/Sonarr/Models/SonarrSeries.cs create mode 100644 CRD/Utils/Sonarr/Models/SonarrStatistics.cs create mode 100644 CRD/Utils/Sonarr/SonarrClient.cs diff --git a/CRD/Assets/crunchy_icon_round.png b/CRD/Assets/crunchy_icon_round.png new file mode 100644 index 0000000000000000000000000000000000000000..76afd46fec2eaaf52914690ec16e36722f40e43e GIT binary patch literal 116598 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 z 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%0AxvZP1=>HiaKmcb*L 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 T|Mnk6bH|<6{WJFu%fJ6WB#3Rs literal 0 HcmV?d00001 diff --git a/CRD/Assets/sonarr.png b/CRD/Assets/sonarr.png new file mode 100644 index 0000000000000000000000000000000000000000..dc7ac680c479f9c6a32dbd10022e404efd5c6678 GIT binary patch literal 13245 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 G|Nj9}0Cjr+ literal 0 HcmV?d00001 diff --git a/CRD/Assets/sonarr_inactive.png b/CRD/Assets/sonarr_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..24c8b3dd6cb2e650e95a5873e7d6962571ef3328 GIT binary patch literal 11338 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 literal 0 HcmV?d00001 diff --git a/CRD/Downloader/CRAuth.cs b/CRD/Downloader/CRAuth.cs index 244551b..4202951 100644 --- a/CRD/Downloader/CRAuth.cs +++ b/CRD/Downloader/CRAuth.cs @@ -12,7 +12,10 @@ using YamlDotNet.Core.Tokens; namespace CRD.Downloader; -public class CrAuth(Crunchyroll crunInstance){ +public class CrAuth{ + + private readonly Crunchyroll crunInstance = Crunchyroll.Instance; + public async Task AuthAnonymous(){ var formData = new Dictionary{ { "grant_type", "client_id" }, diff --git a/CRD/Downloader/CrEpisode.cs b/CRD/Downloader/CrEpisode.cs index fe5897c..7e4d098 100644 --- a/CRD/Downloader/CrEpisode.cs +++ b/CRD/Downloader/CrEpisode.cs @@ -12,7 +12,10 @@ using Newtonsoft.Json; namespace CRD.Downloader; -public class CrEpisode(Crunchyroll crunInstance){ +public class CrEpisode(){ + + private readonly Crunchyroll crunInstance = Crunchyroll.Instance; + public async Task ParseEpisodeById(string id,string locale){ if (crunInstance.CmsToken?.Cms == null){ Console.WriteLine("Missing CMS Access Token"); diff --git a/CRD/Downloader/CrSeries.cs b/CRD/Downloader/CrSeries.cs index 82aabb5..f6f34b9 100644 --- a/CRD/Downloader/CrSeries.cs +++ b/CRD/Downloader/CrSeries.cs @@ -13,7 +13,10 @@ using Newtonsoft.Json; namespace CRD.Downloader; -public class CrSeries(Crunchyroll crunInstance){ +public class CrSeries(){ + + private readonly Crunchyroll crunInstance = Crunchyroll.Instance; + public async Task> DownloadFromSeriesId(string id, CrunchyMultiDownload data){ var series = await ListSeriesId(id, "" ,data); @@ -353,7 +356,7 @@ public class CrSeries(Crunchyroll crunInstance){ } NameValueCollection query = HttpUtility.ParseQueryString(new UriBuilder().Query); - + query["preferred_audio_language"] = "ja-JP"; if (!string.IsNullOrEmpty(locale)){ query["locale"] = Languages.Locale2language(locale).CrLocale; diff --git a/CRD/Downloader/Crunchyroll.cs b/CRD/Downloader/Crunchyroll.cs index 0511b61..42e610f 100644 --- a/CRD/Downloader/Crunchyroll.cs +++ b/CRD/Downloader/Crunchyroll.cs @@ -17,6 +17,8 @@ using CRD.Utils.CustomList; using CRD.Utils.DRM; using CRD.Utils.HLS; using CRD.Utils.Muxing; +using CRD.Utils.Sonarr; +using CRD.Utils.Sonarr.Models; using CRD.Utils.Structs; using CRD.ViewModels; using CRD.Views; @@ -62,6 +64,8 @@ public class Crunchyroll{ Seasons =[] }; + public List SonarrSeries =[]; + #endregion public string DefaultLocale = "en"; @@ -101,10 +105,10 @@ public class Crunchyroll{ public async Task Init(){ _widevine = Widevine.Instance; - CrAuth = new CrAuth(Instance); - CrEpisode = new CrEpisode(Instance); - CrSeries = new CrSeries(Instance); - CrHistory = new History(Instance); + CrAuth = new CrAuth(); + CrEpisode = new CrEpisode(); + CrSeries = new CrSeries(); + CrHistory = new History(); Profile = new CrProfile{ Username = "???", @@ -146,6 +150,7 @@ public class Crunchyroll{ CrunOptions.Theme = "System"; CrunOptions.SelectedCalendarLanguage = "de"; CrunOptions.DlVideoOnce = true; + CrunOptions.UseNonDrmStreams = true; CrunOptions.History = true; @@ -155,6 +160,8 @@ public class Crunchyroll{ if (File.Exists(CfgManager.PathCrHistory)){ HistoryList = JsonConvert.DeserializeObject>(File.ReadAllText(CfgManager.PathCrHistory)) ??[]; } + + RefreshSonarr(); } @@ -173,16 +180,14 @@ public class Crunchyroll{ }; } - // public async void TestMethode(){ - // // One Pice - GRMG8ZQZR - // // Studio - G9VHN9QWQ - // var episodesMeta = await DownloadFromSeriesId("G9VHN9QWQ", new CrunchyMultiDownload(Crunchy.Instance.CrunOptions.dubLang, true)); - // - // - // foreach (var crunchyEpMeta in episodesMeta){ - // await DownloadEpisode(crunchyEpMeta, CrunOptions, false); - // } - // } + public async void RefreshSonarr(){ + if (CrunOptions.SonarrProperties != null && !string.IsNullOrEmpty(CrunOptions.SonarrProperties.ApiKey)){ + SonarrClient.Instance.SetApiUrl(); + SonarrSeries = await SonarrClient.Instance.GetSeries(); + CrHistory.MatchHistorySeriesWithSonarr(true); + } + } + public async Task GetCalendarForDate(string weeksMondayDate, bool forceUpdate){ if (!forceUpdate && calendar.TryGetValue(weeksMondayDate, out var forDate)){ diff --git a/CRD/Downloader/History.cs b/CRD/Downloader/History.cs index fbf91a3..df2fedb 100644 --- a/CRD/Downloader/History.cs +++ b/CRD/Downloader/History.cs @@ -1,15 +1,14 @@ using System; using System.Collections.Generic; -using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Net.Http; using System.Text.RegularExpressions; using System.Threading.Tasks; using Avalonia.Media.Imaging; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; using CRD.Utils; +using CRD.Utils.Sonarr; +using CRD.Utils.Sonarr.Models; using CRD.Utils.Structs; using CRD.Views; using Newtonsoft.Json; @@ -17,11 +16,13 @@ using ReactiveUI; namespace CRD.Downloader; -public class History(Crunchyroll crunInstance){ +public class History(){ + private readonly Crunchyroll crunInstance = Crunchyroll.Instance; + public async Task UpdateSeries(string seriesId, string? seasonId){ await crunInstance.CrAuth.RefreshToken(true); - - CrSeriesSearch? parsedSeries = await crunInstance.CrSeries.ParseSeriesById(seriesId, "ja"); + + CrSeriesSearch? parsedSeries = await crunInstance.CrSeries.ParseSeriesById(seriesId, "ja"); if (parsedSeries == null){ Console.WriteLine("Parse Data Invalid"); @@ -43,11 +44,12 @@ public class History(Crunchyroll crunInstance){ if (sVersion.Guid != null){ sId = sVersion.Guid; } + break; } } } - + var seasonData = await crunInstance.CrSeries.GetSeasonDataById(sId); UpdateWithSeasonData(seasonData); } @@ -103,12 +105,22 @@ public class History(Crunchyroll crunInstance){ if (historySeries != null){ var historySeason = historySeries.Seasons.Find(s => s.SeasonId == episode.SeasonId); + var series = await crunInstance.CrSeries.SeriesById(seriesId); + if (series?.Data != null){ + historySeries.SeriesTitle = series.Data.First().Title; + } + if (historySeason != null){ + historySeason.SeasonTitle = episode.SeasonTitle; + historySeason.SeasonNum = episode.SeasonNumber + ""; if (historySeason.EpisodesList.All(e => e.EpisodeId != episode.Id)){ var newHistoryEpisode = new HistoryEpisode{ - EpisodeTitle = episode.Title, + EpisodeTitle = episode.Identifier.Contains("|M|") ? episode.SeasonTitle : episode.Title, + EpisodeDescription = episode.Description, EpisodeId = episode.Id, Episode = episode.Episode, + EpisodeSeasonNum = episode.SeasonNumber + "", + SpecialEpisode = !int.TryParse(episode.Episode, out _), }; historySeason.EpisodesList.Add(newHistoryEpisode); @@ -122,6 +134,7 @@ public class History(Crunchyroll crunInstance){ historySeries.Seasons = historySeries.Seasons.OrderBy(s => s.SeasonNum != null ? int.Parse(s.SeasonNum) : 0).ToList(); } + historySeries.UpdateNewEpisodes(); } else{ var newHistorySeries = new HistorySeries{ @@ -136,6 +149,7 @@ public class History(Crunchyroll crunInstance){ if (series?.Data != null){ newHistorySeries.SeriesDescription = series.Data.First().Description; newHistorySeries.ThumbnailImageUrl = GetSeriesThumbnail(series); + newHistorySeries.SeriesTitle = series.Data.First().Title; } newHistorySeries.Seasons.Add(newSeason); @@ -148,6 +162,7 @@ public class History(Crunchyroll crunInstance){ crunInstance.HistoryList.Add(item); } + MatchHistorySeriesWithSonarr(false); UpdateHistoryFile(); } @@ -158,27 +173,38 @@ public class History(Crunchyroll crunInstance){ var historySeries = crunInstance.HistoryList.FirstOrDefault(series => series.SeriesId == seriesId); if (historySeries != null){ var historySeason = historySeries.Seasons.Find(s => s.SeasonId == firstEpisode.SeasonId); + var series = await crunInstance.CrSeries.SeriesById(seriesId); + if (series?.Data != null){ + historySeries.SeriesTitle = series.Data.First().Title; + } if (historySeason != null){ + historySeason.SeasonTitle = firstEpisode.SeasonTitle; + historySeason.SeasonNum = firstEpisode.SeasonNumber + ""; foreach (var crunchyEpisode in seasonData.Data){ - var historyEpisode = historySeason.EpisodesList.Find(e => e.EpisodeId == crunchyEpisode.Id); - + if (historyEpisode == null){ var newHistoryEpisode = new HistoryEpisode{ - EpisodeTitle = crunchyEpisode.Title, + EpisodeTitle = crunchyEpisode.Identifier.Contains("|M|") ? crunchyEpisode.SeasonTitle : crunchyEpisode.Title, + EpisodeDescription = crunchyEpisode.Description, EpisodeId = crunchyEpisode.Id, Episode = crunchyEpisode.Episode, + EpisodeSeasonNum = crunchyEpisode.SeasonNumber + "", SpecialEpisode = !int.TryParse(crunchyEpisode.Episode, out _), }; historySeason.EpisodesList.Add(newHistoryEpisode); } else{ //Update existing episode - historyEpisode.EpisodeTitle = crunchyEpisode.Title; + historyEpisode.EpisodeTitle = crunchyEpisode.Identifier.Contains("|M|") ? crunchyEpisode.SeasonTitle : crunchyEpisode.Title; historyEpisode.SpecialEpisode = !int.TryParse(crunchyEpisode.Episode, out _); + historyEpisode.EpisodeDescription = crunchyEpisode.Description; + historyEpisode.EpisodeId = crunchyEpisode.Id; + historyEpisode.Episode = crunchyEpisode.Episode; + historyEpisode.EpisodeSeasonNum = crunchyEpisode.SeasonNumber + ""; + } - } historySeason.EpisodesList.Sort(new NumericStringPropertyComparer()); @@ -191,6 +217,7 @@ public class History(Crunchyroll crunInstance){ historySeries.Seasons = historySeries.Seasons.OrderBy(s => s.SeasonNum != null ? int.Parse(s.SeasonNum) : 0).ToList(); } + historySeries.UpdateNewEpisodes(); } else{ var newHistorySeries = new HistorySeries{ @@ -208,11 +235,12 @@ public class History(Crunchyroll crunInstance){ if (series?.Data != null){ newHistorySeries.SeriesDescription = series.Data.First().Description; newHistorySeries.ThumbnailImageUrl = GetSeriesThumbnail(series); + newHistorySeries.SeriesTitle = series.Data.First().Title; } newHistorySeries.Seasons.Add(newSeason); - + newHistorySeries.UpdateNewEpisodes(); } } @@ -223,6 +251,7 @@ public class History(Crunchyroll crunInstance){ crunInstance.HistoryList.Add(item); } + MatchHistorySeriesWithSonarr(false); UpdateHistoryFile(); } @@ -255,9 +284,11 @@ public class History(Crunchyroll crunInstance){ foreach (var crunchyEpisode in seasonData.Data!){ var newHistoryEpisode = new HistoryEpisode{ - EpisodeTitle = crunchyEpisode.Title, + EpisodeTitle = crunchyEpisode.Identifier.Contains("|M|") ? crunchyEpisode.SeasonTitle : crunchyEpisode.Title, + EpisodeDescription = crunchyEpisode.Description, EpisodeId = crunchyEpisode.Id, Episode = crunchyEpisode.Episode, + EpisodeSeasonNum = firstEpisode.SeasonNumber + "", SpecialEpisode = !int.TryParse(crunchyEpisode.Episode, out _), }; @@ -276,9 +307,11 @@ public class History(Crunchyroll crunInstance){ }; var newHistoryEpisode = new HistoryEpisode{ - EpisodeTitle = episode.Title, + EpisodeTitle = episode.Identifier.Contains("|M|") ? episode.SeasonTitle : episode.Title, + EpisodeDescription = episode.Description, EpisodeId = episode.Id, Episode = episode.Episode, + EpisodeSeasonNum = episode.SeasonNumber + "", SpecialEpisode = !int.TryParse(episode.Episode, out _), }; @@ -287,6 +320,170 @@ public class History(Crunchyroll crunInstance){ return newSeason; } + + public void MatchHistorySeriesWithSonarr(bool updateAll){ + foreach (var historySeries in crunInstance.HistoryList){ + if (updateAll || string.IsNullOrEmpty(historySeries.SonarrSeriesId)){ + var sonarrSeries = FindClosestMatch(historySeries.SeriesTitle); + if (sonarrSeries != null){ + historySeries.SonarrSeriesId = sonarrSeries.Id + ""; + historySeries.SonarrTvDbId = sonarrSeries.TvdbId + ""; + historySeries.SonarrSlugTitle = sonarrSeries.TitleSlug; + } + } + } + } + + public async void MatchHistoryEpisodesWithSonarr(bool updateAll, HistorySeries historySeries){ + if (!string.IsNullOrEmpty(historySeries.SonarrSeriesId)){ + var episodes = await SonarrClient.Instance.GetEpisodes(int.Parse(historySeries.SonarrSeriesId)); + + List allHistoryEpisodes =[]; + + foreach (var historySeriesSeason in historySeries.Seasons){ + allHistoryEpisodes.AddRange(historySeriesSeason.EpisodesList); + } + + List failedEpisodes =[]; + + foreach (var historyEpisode in allHistoryEpisodes){ + if (updateAll || string.IsNullOrEmpty(historyEpisode.SonarrEpisodeId)){ + var episode = FindClosestMatchEpisodes(episodes, historyEpisode.EpisodeTitle); + if (episode != null){ + historyEpisode.SonarrEpisodeId = episode.Id + ""; + historyEpisode.SonarrEpisodeNumber = episode.EpisodeNumber + ""; + historyEpisode.SonarrHasFile = episode.HasFile; + historyEpisode.SonarrAbsolutNumber = episode.AbsoluteEpisodeNumber + ""; + historyEpisode.SonarrSeasonNumber = episode.SeasonNumber + ""; + episodes.Remove(episode); + } else{ + failedEpisodes.Add(historyEpisode); + } + } + } + + foreach (var historyEpisode in failedEpisodes){ + var episode = episodes.Find(ele => ele.EpisodeNumber + "" == historyEpisode.Episode && ele.SeasonNumber + "" == historyEpisode.EpisodeSeasonNum); + if (episode != null){ + historyEpisode.SonarrEpisodeId = episode.Id + ""; + historyEpisode.SonarrEpisodeNumber = episode.EpisodeNumber + ""; + historyEpisode.SonarrHasFile = episode.HasFile; + historyEpisode.SonarrAbsolutNumber = episode.AbsoluteEpisodeNumber + ""; + historyEpisode.SonarrSeasonNumber = episode.SeasonNumber + ""; + episodes.Remove(episode); + } else{ + var episode1 = episodes.Find(ele => !string.IsNullOrEmpty(historyEpisode.EpisodeDescription) && !string.IsNullOrEmpty(ele.Overview) && Helpers.CalculateCosineSimilarity(ele.Overview, historyEpisode.EpisodeDescription) > 0.8); + + if (episode1 != null){ + historyEpisode.SonarrEpisodeId = episode1.Id + ""; + historyEpisode.SonarrEpisodeNumber = episode1.EpisodeNumber + ""; + historyEpisode.SonarrHasFile = episode1.HasFile; + historyEpisode.SonarrAbsolutNumber = episode1.AbsoluteEpisodeNumber + ""; + historyEpisode.SonarrSeasonNumber = episode1.SeasonNumber + ""; + episodes.Remove(episode1); + } else{ + var episode2 = episodes.Find(ele => ele.AbsoluteEpisodeNumber + "" == historyEpisode.Episode); + if (episode2 != null){ + historyEpisode.SonarrEpisodeId = episode2.Id + ""; + historyEpisode.SonarrEpisodeNumber = episode2.EpisodeNumber + ""; + historyEpisode.SonarrHasFile = episode2.HasFile; + historyEpisode.SonarrAbsolutNumber = episode2.AbsoluteEpisodeNumber + ""; + historyEpisode.SonarrSeasonNumber = episode2.SeasonNumber + ""; + episodes.Remove(episode2); + } else{ + Console.WriteLine("Could not match episode to sonarr episode"); + } + } + } + + } + + + + } + } + + private SonarrSeries? FindClosestMatch(string title){ + SonarrSeries? closestMatch = null; + double highestSimilarity = 0.0; + + Parallel.ForEach(crunInstance.SonarrSeries, series => { + double similarity = CalculateSimilarity(series.Title, title); + if (similarity > highestSimilarity){ + highestSimilarity = similarity; + closestMatch = series; + } + }); + + return highestSimilarity < 0.8 ? null : closestMatch; + } + + public SonarrEpisode? FindClosestMatchEpisodes(List episodeList, string title){ + SonarrEpisode? closestMatch = null; + double highestSimilarity = 0.0; + object lockObject = new object(); // To synchronize access to shared variables + + Parallel.ForEach(episodeList, episode => { + double similarity = CalculateSimilarity(episode.Title, title); + lock (lockObject) // Ensure thread-safe access to shared variables + { + if (similarity > highestSimilarity){ + highestSimilarity = similarity; + closestMatch = episode; + } + } + }); + + return highestSimilarity < 0.8 ? null : closestMatch; + } + + private double CalculateSimilarity(string source, string target){ + int distance = LevenshteinDistance(source, target); + return 1.0 - (double)distance / Math.Max(source.Length, target.Length); + } + + private int LevenshteinDistance(string source, string target){ + if (string.IsNullOrEmpty(source)){ + return string.IsNullOrEmpty(target) ? 0 : target.Length; + } + + if (string.IsNullOrEmpty(target)){ + return source.Length; + } + + int n = source.Length; + int m = target.Length; + + // Create two work arrays of integer distances. + int[] previousDistances = new int[m + 1]; + int[] currentDistances = new int[m + 1]; + + // Initialize the previous distance array. + for (int j = 0; j <= m; j++){ + previousDistances[j] = j; + } + + for (int i = 1; i <= n; i++){ + // Initialize the current distance array. + currentDistances[0] = i; + + for (int j = 1; j <= m; j++){ + int cost = (target[j - 1] == source[i - 1]) ? 0 : 1; + + currentDistances[j] = Math.Min( + Math.Min(currentDistances[j - 1] + 1, previousDistances[j] + 1), + previousDistances[j - 1] + cost); + } + + // Swap the arrays for the next iteration. + var temp = previousDistances; + previousDistances = currentDistances; + currentDistances = temp; + } + + // The final distance is in the previous distance array. + return previousDistances[m]; + } } public class NumericStringPropertyComparer : IComparer{ @@ -294,7 +491,7 @@ public class NumericStringPropertyComparer : IComparer{ if (int.TryParse(x.Episode, out int xInt) && int.TryParse(y.Episode, out int yInt)){ return xInt.CompareTo(yInt); } - + // Fall back to string comparison if not parseable as integers return String.Compare(x.Episode, y.Episode, StringComparison.Ordinal); } @@ -307,6 +504,15 @@ public class HistorySeries : INotifyPropertyChanged{ [JsonProperty("series_id")] public string? SeriesId{ get; set; } + [JsonProperty("sonarr_series_id")] + public string? SonarrSeriesId{ get; set; } + + [JsonProperty("sonarr_tvdb_id")] + public string? SonarrTvDbId{ get; set; } + + [JsonProperty("sonarr_slug_title")] + public string? SonarrSlugTitle{ get; set; } + [JsonProperty("series_description")] public string? SeriesDescription{ get; set; } @@ -346,18 +552,16 @@ public class HistorySeries : INotifyPropertyChanged{ // Iterate over the Seasons list from the end to the beginning for (int i = Seasons.Count - 1; i >= 0 && !foundWatched; i--){ - if (Seasons[i].SpecialSeason == true){ continue; } - + // Iterate over the Episodes from the end to the beginning for (int j = Seasons[i].EpisodesList.Count - 1; j >= 0 && !foundWatched; j--){ - if (Seasons[i].EpisodesList[j].SpecialEpisode){ continue; } - + if (!Seasons[i].EpisodesList[j].WasDownloaded){ count++; } else{ @@ -365,27 +569,26 @@ public class HistorySeries : INotifyPropertyChanged{ } } } + NewEpisodes = count; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(NewEpisodes))); } - + public async Task AddNewMissingToDownloads(){ bool foundWatched = false; // Iterate over the Seasons list from the end to the beginning for (int i = Seasons.Count - 1; i >= 0 && !foundWatched; i--){ - if (Seasons[i].SpecialSeason == true){ continue; } - + // Iterate over the Episodes from the end to the beginning for (int j = Seasons[i].EpisodesList.Count - 1; j >= 0 && !foundWatched; j--){ - if (Seasons[i].EpisodesList[j].SpecialEpisode){ continue; } - + if (!Seasons[i].EpisodesList[j].WasDownloaded){ //ADD to download queue await Seasons[i].EpisodesList[j].DownloadEpisode(); @@ -410,9 +613,10 @@ public class HistorySeason : INotifyPropertyChanged{ [JsonProperty("season_cr_season_number")] public string? SeasonNum{ get; set; } - + [JsonProperty("season_special_season")] public bool? SpecialSeason{ get; set; } + [JsonIgnore] public string CombinedProperty => SpecialSeason ?? false ? $"Specials {SeasonNum}" : $"Season {SeasonNum}"; @@ -450,15 +654,36 @@ public partial class HistoryEpisode : INotifyPropertyChanged{ [JsonProperty("episode_cr_episode_number")] public string? Episode{ get; set; } + + [JsonProperty("episode_cr_episode_description")] + public string? EpisodeDescription{ get; set; } + + [JsonProperty("episode_cr_season_number")] + public string? EpisodeSeasonNum{ get; set; } [JsonProperty("episode_was_downloaded")] public bool WasDownloaded{ get; set; } [JsonProperty("episode_special_episode")] - public bool SpecialEpisode{ get; set; } + public bool SpecialEpisode{ get; set; } + + [JsonProperty("sonarr_episode_id")] + public string? SonarrEpisodeId{ get; set; } + + [JsonProperty("sonarr_has_file")] + public bool SonarrHasFile{ get; set; } + + [JsonProperty("sonarr_episode_number")] + public string? SonarrEpisodeNumber{ get; set; } + + [JsonProperty("sonarr_season_number")] + public string? SonarrSeasonNumber{ get; set; } + + [JsonProperty("sonarr_absolut_number")] + public string? SonarrAbsolutNumber{ get; set; } public event PropertyChangedEventHandler? PropertyChanged; - + public void ToggleWasDownloaded(){ WasDownloaded = !WasDownloaded; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(WasDownloaded))); @@ -466,6 +691,5 @@ public partial class HistoryEpisode : INotifyPropertyChanged{ public async Task DownloadEpisode(){ await Crunchyroll.Instance.AddEpisodeToQue(EpisodeId, Crunchyroll.Instance.DefaultLocale, Crunchyroll.Instance.CrunOptions.DubLang); - } } \ No newline at end of file diff --git a/CRD/Utils/Enums/EnumCollection.cs b/CRD/Utils/Enums/EnumCollection.cs index a2671f3..e18a745 100644 --- a/CRD/Utils/Enums/EnumCollection.cs +++ b/CRD/Utils/Enums/EnumCollection.cs @@ -8,25 +8,62 @@ namespace CRD.Utils; [DataContract] [JsonConverter(typeof(LocaleConverter))] public enum Locale{ - [EnumMember(Value = "")] DefaulT, - [EnumMember(Value = "un")] Unknown, - [EnumMember(Value = "en-US")] EnUs, - [EnumMember(Value = "es-LA")] EsLa, - [EnumMember(Value = "es-419")] Es419, - [EnumMember(Value = "es-ES")] EsEs, - [EnumMember(Value = "pt-BR")] PtBr, - [EnumMember(Value = "fr-FR")] FrFr, - [EnumMember(Value = "de-DE")] DeDe, - [EnumMember(Value = "ar-ME")] ArMe, - [EnumMember(Value = "ar-SA")] ArSa, - [EnumMember(Value = "it-IT")] ItIt, - [EnumMember(Value = "ru-RU")] RuRu, - [EnumMember(Value = "tr-TR")] TrTr, - [EnumMember(Value = "hi-IN")] HiIn, - [EnumMember(Value = "zh-CN")] ZhCn, - [EnumMember(Value = "ko-KR")] KoKr, - [EnumMember(Value = "ja-JP")] JaJp, - [EnumMember(Value = "id-ID")] IdId, + [EnumMember(Value = "")] + DefaulT, + + [EnumMember(Value = "un")] + Unknown, + + [EnumMember(Value = "en-US")] + EnUs, + + [EnumMember(Value = "es-LA")] + EsLa, + + [EnumMember(Value = "es-419")] + Es419, + + [EnumMember(Value = "es-ES")] + EsEs, + + [EnumMember(Value = "pt-BR")] + PtBr, + + [EnumMember(Value = "fr-FR")] + FrFr, + + [EnumMember(Value = "de-DE")] + DeDe, + + [EnumMember(Value = "ar-ME")] + ArMe, + + [EnumMember(Value = "ar-SA")] + ArSa, + + [EnumMember(Value = "it-IT")] + ItIt, + + [EnumMember(Value = "ru-RU")] + RuRu, + + [EnumMember(Value = "tr-TR")] + TrTr, + + [EnumMember(Value = "hi-IN")] + HiIn, + + [EnumMember(Value = "zh-CN")] + ZhCn, + + [EnumMember(Value = "ko-KR")] + KoKr, + + [EnumMember(Value = "ja-JP")] + JaJp, + + [EnumMember(Value = "id-ID")] + IdId, } public static class EnumExtensions{ @@ -49,34 +86,67 @@ public static class EnumExtensions{ [DataContract] public enum ChannelId{ - [EnumMember(Value = "crunchyroll")] Crunchyroll, + [EnumMember(Value = "crunchyroll")] + Crunchyroll, } [DataContract] public enum ImageType{ - [EnumMember(Value = "poster_tall")] PosterTall, + [EnumMember(Value = "poster_tall")] + PosterTall, - [EnumMember(Value = "poster_wide")] PosterWide, + [EnumMember(Value = "poster_wide")] + PosterWide, - [EnumMember(Value = "promo_image")] PromoImage, + [EnumMember(Value = "promo_image")] + PromoImage, - [EnumMember(Value = "thumbnail")] Thumbnail, + [EnumMember(Value = "thumbnail")] + Thumbnail, } [DataContract] public enum MaturityRating{ - [EnumMember(Value = "TV-14")] Tv14, + [EnumMember(Value = "TV-14")] + Tv14, } [DataContract] public enum MediaType{ - [EnumMember(Value = "episode")] Episode, + [EnumMember(Value = "episode")] + Episode, } [DataContract] public enum DownloadMediaType{ - [EnumMember(Value = "Video")] Video, - [EnumMember(Value = "Audio")] Audio, - [EnumMember(Value = "Chapters")] Chapters, - [EnumMember(Value = "Subtitle")] Subtitle, -} \ No newline at end of file + [EnumMember(Value = "Video")] + Video, + + [EnumMember(Value = "Audio")] + Audio, + + [EnumMember(Value = "Chapters")] + Chapters, + + [EnumMember(Value = "Subtitle")] + Subtitle, +} + +public enum SonarrCoverType{ + Banner, + FanArt, + Poster, + ClearLogo, +} + +public enum SonarrSeriesType{ + Anime, + Standard, + Daily +} + +public enum SonarrStatus{ + Continuing, + Upcoming, + Ended +}; \ No newline at end of file diff --git a/CRD/Utils/Files/CfgManager.cs b/CRD/Utils/Files/CfgManager.cs index d7ef619..1c25349 100644 --- a/CRD/Utils/Files/CfgManager.cs +++ b/CRD/Utils/Files/CfgManager.cs @@ -142,6 +142,7 @@ public class CfgManager{ Crunchyroll.Instance.CrunOptions.AccentColor = loadedOptions.AccentColor; Crunchyroll.Instance.CrunOptions.History = loadedOptions.History; Crunchyroll.Instance.CrunOptions.UseNonDrmStreams = loadedOptions.UseNonDrmStreams; + Crunchyroll.Instance.CrunOptions.SonarrProperties = loadedOptions.SonarrProperties; } private static object fileLock = new object(); diff --git a/CRD/Utils/Helpers.cs b/CRD/Utils/Helpers.cs index edfd4bc..f71ac05 100644 --- a/CRD/Utils/Helpers.cs +++ b/CRD/Utils/Helpers.cs @@ -1,5 +1,7 @@ using System; +using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using System.Runtime.Serialization; using System.Threading.Tasks; using Newtonsoft.Json; @@ -14,9 +16,9 @@ public class Helpers{ /// The JSON string to deserialize. /// The settings for deserialization if null default settings will be used /// The deserialized object of type T. - public static T? Deserialize(string json,JsonSerializerSettings? serializerSettings){ + public static T? Deserialize(string json, JsonSerializerSettings? serializerSettings){ try{ - return JsonConvert.DeserializeObject(json,serializerSettings); + return JsonConvert.DeserializeObject(json, serializerSettings); } catch (JsonException ex){ Console.WriteLine($"Error deserializing JSON: {ex.Message}"); throw; @@ -77,4 +79,42 @@ public class Helpers{ return (IsOk: isSuccess, ErrorCode: process.ExitCode); } } + + public static double CalculateCosineSimilarity(string text1, string text2){ + var vector1 = ComputeWordFrequency(text1); + var vector2 = ComputeWordFrequency(text2); + + return CosineSimilarity(vector1, vector2); + } + + private static Dictionary ComputeWordFrequency(string text){ + var wordFrequency = new Dictionary(); + var words = text.Split(new[]{ ' ', ',', '.', ';', ':', '-', '_', '\'' }, StringSplitOptions.RemoveEmptyEntries); + + foreach (var word in words){ + var lowerWord = word.ToLower(); + if (!wordFrequency.ContainsKey(lowerWord)){ + wordFrequency[lowerWord] = 0; + } + + wordFrequency[lowerWord]++; + } + + return wordFrequency; + } + + private static double CosineSimilarity(Dictionary vector1, Dictionary vector2){ + var intersection = vector1.Keys.Intersect(vector2.Keys); + + double dotProduct = intersection.Sum(term => vector1[term] * vector2[term]); + double normA = Math.Sqrt(vector1.Values.Sum(val => val * val)); + double normB = Math.Sqrt(vector2.Values.Sum(val => val * val)); + + if (normA == 0 || normB == 0){ + // If either vector has zero length, return 0 similarity. + return 0; + } + + return dotProduct / (normA * normB); + } } \ No newline at end of file diff --git a/CRD/Utils/Sonarr/Models/SonarrEpisode.cs b/CRD/Utils/Sonarr/Models/SonarrEpisode.cs new file mode 100644 index 0000000..da60c98 --- /dev/null +++ b/CRD/Utils/Sonarr/Models/SonarrEpisode.cs @@ -0,0 +1,141 @@ +using System; +using Newtonsoft.Json; + +namespace CRD.Utils.Sonarr.Models; + +public class SonarrEpisode{ + /// + /// Gets or sets the series identifier. + /// + /// + /// The series identifier. + /// + [JsonProperty("seriesId")] + public int SeriesId{ get; set; } + + /// + /// Gets or sets the episode file identifier. + /// + /// + /// The episode file identifier. + /// + [JsonProperty("episodeFileId")] + public int EpisodeFileId{ get; set; } + + /// + /// Gets or sets the season number. + /// + /// + /// The season number. + /// + [JsonProperty("seasonNumber")] + public int SeasonNumber{ get; set; } + + /// + /// Gets or sets the episode number. + /// + /// + /// The episode number. + /// + [JsonProperty("episodeNumber")] + public int EpisodeNumber{ get; set; } + + /// + /// Gets or sets the title. + /// + /// + /// The title. + /// + [JsonProperty("title")] + public string Title{ get; set; } + + /// + /// Gets or sets the air date. + /// + /// + /// The air date. + /// + [JsonProperty("airDate")] + public DateTimeOffset AirDate{ get; set; } + + /// + /// Gets or sets the air date UTC. + /// + /// + /// The air date UTC. + /// + [JsonProperty("airDateUtc")] + public DateTimeOffset AirDateUtc{ get; set; } + + /// + /// Gets or sets the overview. + /// + /// + /// The overview. + /// + [JsonProperty("overview")] + public string Overview{ get; set; } + + /// + /// Gets or sets a value indicating whether this instance has file. + /// + /// + /// true if this instance has file; otherwise, false. + /// + [JsonProperty("hasFile")] + public bool HasFile{ get; set; } + + /// + /// Gets or sets a value indicating whether this is monitored. + /// + /// + /// true if monitored; otherwise, false. + /// + [JsonProperty("monitored")] + public bool Monitored{ get; set; } + + /// + /// Gets or sets the scene episode number. + /// + /// + /// The scene episode number. + /// + [JsonProperty("sceneEpisodeNumber")] + public int SceneEpisodeNumber{ get; set; } + + /// + /// Gets or sets the scene season number. + /// + /// + /// The scene season number. + /// + [JsonProperty("sceneSeasonNumber")] + public int SceneSeasonNumber{ get; set; } + + /// + /// Gets or sets the tv database episode identifier. + /// + /// + /// The tv database episode identifier. + /// + [JsonProperty("tvDbEpisodeId")] + public int TvDbEpisodeId{ get; set; } + + /// + /// Gets or sets the absolute episode number. + /// + /// + /// The absolute episode number. + /// + [JsonProperty("absoluteEpisodeNumber")] + public int AbsoluteEpisodeNumber{ get; set; } + + /// + /// Gets or sets the identifier. + /// + /// + /// The identifier. + /// + [JsonProperty("id")] + public int Id{ get; set; } +} \ No newline at end of file diff --git a/CRD/Utils/Sonarr/Models/SonarrImage.cs b/CRD/Utils/Sonarr/Models/SonarrImage.cs new file mode 100644 index 0000000..0a6b7f9 --- /dev/null +++ b/CRD/Utils/Sonarr/Models/SonarrImage.cs @@ -0,0 +1,21 @@ +using Newtonsoft.Json; + +namespace CRD.Utils.Sonarr.Models; + +public class SonarrImage{ + /// + /// Gets or sets the type of the cover. + /// + /// + /// The type of the cover. + /// + [JsonProperty("coverType")] public SonarrCoverType CoverType { get; set; } + + /// + /// Gets or sets the URL. + /// + /// + /// The URL. + /// + [JsonProperty("url")] public string Url { get; set; } +} \ No newline at end of file diff --git a/CRD/Utils/Sonarr/Models/SonarrQualityProfile.cs b/CRD/Utils/Sonarr/Models/SonarrQualityProfile.cs new file mode 100644 index 0000000..429ea26 --- /dev/null +++ b/CRD/Utils/Sonarr/Models/SonarrQualityProfile.cs @@ -0,0 +1,14 @@ +using Newtonsoft.Json; +using YamlDotNet.Core.Tokens; + +namespace CRD.Utils.Sonarr.Models; + +public class SonarrQualityProfile{ + + [JsonProperty("value")] + public Value Value{ get; set; } + + + [JsonProperty("isLoaded")] + public bool IsLoaded{ get; set; } +} \ No newline at end of file diff --git a/CRD/Utils/Sonarr/Models/SonarrSeason.cs b/CRD/Utils/Sonarr/Models/SonarrSeason.cs new file mode 100644 index 0000000..1de64b0 --- /dev/null +++ b/CRD/Utils/Sonarr/Models/SonarrSeason.cs @@ -0,0 +1,38 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace CRD.Utils.Sonarr.Models; + +public class SonarrSeason{ + /// + /// Gets or sets the season number. + /// + /// + /// The season number. + /// + [JsonProperty("seasonNumber")] public int SeasonNumber { get; set; } + + /// + /// Gets or sets a value indicating whether this is monitored. + /// + /// + /// true if monitored; otherwise, false. + /// + [JsonProperty("monitored")] public bool Monitored { get; set; } + + /// + /// Gets or sets the statistics. + /// + /// + /// The statistics. + /// + [JsonProperty("statistics")] public SonarrStatistics Statistics { get; set; } + + /// + /// Gets or sets the images. + /// + /// + /// The images. + /// + [JsonProperty("images")] public List Images { get; set; } +} \ No newline at end of file diff --git a/CRD/Utils/Sonarr/Models/SonarrSeries.cs b/CRD/Utils/Sonarr/Models/SonarrSeries.cs new file mode 100644 index 0000000..f14604e --- /dev/null +++ b/CRD/Utils/Sonarr/Models/SonarrSeries.cs @@ -0,0 +1,223 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace CRD.Utils.Sonarr.Models; + +public class SonarrSeries{ + /// + /// Gets or sets the TVDB identifier. + /// + /// + /// The TVDB identifier. + /// + [JsonProperty("tvdbId")] + public int TvdbId{ get; set; } + + /// + /// Gets or sets the tv rage identifier. + /// + /// + /// The tv rage identifier. + /// + [JsonProperty("tvRageId")] + public long TvRageId{ get; set; } + + /// + /// Gets or sets the imdb identifier. + /// + /// + /// The imdb identifier. + /// + [JsonProperty("imdbId")] + public string ImdbId{ get; set; } + + /// + /// Gets or sets the title. + /// + /// + /// The title. + /// + [JsonProperty("title")] + public string Title{ get; set; } + + /// + /// Gets or sets the clean title. + /// + /// + /// The clean title. + /// + [JsonProperty("cleanTitle")] + public string CleanTitle{ get; set; } + + /// + /// Gets or sets the status. + /// + /// + /// The status. + /// + [JsonProperty("status")] + public SonarrStatus Status{ get; set; } + + /// + /// Gets or sets the overview. + /// + /// + /// The overview. + /// + [JsonProperty("overview")] + public string Overview{ get; set; } + + /// + /// Gets or sets the air time. + /// + /// + /// The air time. + /// + [JsonProperty("airTime")] + public string AirTime{ get; set; } + + /// + /// Gets or sets a value indicating whether this is monitored. + /// + /// + /// true if monitored; otherwise, false. + /// + [JsonProperty("monitored")] + public bool Monitored{ get; set; } + + /// + /// Gets or sets the quality profile identifier. + /// + /// + /// The quality profile identifier. + /// + [JsonProperty("qualityProfileId")] + public long QualityProfileId{ get; set; } + + /// + /// Gets or sets a value indicating whether [season folder]. + /// + /// + /// true if [season folder]; otherwise, false. + /// + [JsonProperty("seasonFolder")] + public bool SeasonFolder{ get; set; } + + /// + /// Gets or sets the last information synchronize. + /// + /// + /// The last information synchronize. + /// + [JsonProperty("lastInfoSync")] + public DateTimeOffset LastInfoSync{ get; set; } + + /// + /// Gets or sets the runtime. + /// + /// + /// The runtime. + /// + [JsonProperty("runtime")] + public long Runtime{ get; set; } + + /// + /// Gets or sets the images. + /// + /// + /// The images. + /// + [JsonProperty("images")] + public List Images{ get; set; } + + /// + /// Gets or sets the type of the series. + /// + /// + /// The type of the series. + /// + [JsonProperty("seriesType")] + public SonarrSeriesType SeriesType{ get; set; } + + /// + /// Gets or sets the network. + /// + /// + /// The network. + /// + [JsonProperty("network")] + public string Network{ get; set; } + + /// + /// Gets or sets a value indicating whether [use scene numbering]. + /// + /// + /// true if [use scene numbering]; otherwise, false. + /// + [JsonProperty("useSceneNumbering")] + public bool UseSceneNumbering{ get; set; } + + /// + /// Gets or sets the title slug. + /// + /// + /// The title slug. + /// + [JsonProperty("titleSlug")] + public string TitleSlug{ get; set; } + + /// + /// Gets or sets the path. + /// + /// + /// The path. + /// + [JsonProperty("path")] + public string Path{ get; set; } + + /// + /// Gets or sets the year. + /// + /// + /// The year. + /// + [JsonProperty("year")] + public int Year{ get; set; } + + /// + /// Gets or sets the first aired. + /// + /// + /// The first aired. + /// + [JsonProperty("firstAired")] + public DateTimeOffset FirstAired{ get; set; } + + /// + /// Gets or sets the quality profile. + /// + /// + /// The quality profile. + /// + [JsonProperty("qualityProfile")] + public SonarrQualityProfile QualityProfile{ get; set; } + + /// + /// Gets or sets the seasons. + /// + /// + /// The seasons. + /// + [JsonProperty("seasons")] + public List Seasons{ get; set; } + + /// + /// Gets or sets the identifier. + /// + /// + /// The identifier. + /// + [JsonProperty("id")] + public int Id{ get; set; } +} \ No newline at end of file diff --git a/CRD/Utils/Sonarr/Models/SonarrStatistics.cs b/CRD/Utils/Sonarr/Models/SonarrStatistics.cs new file mode 100644 index 0000000..108bd4a --- /dev/null +++ b/CRD/Utils/Sonarr/Models/SonarrStatistics.cs @@ -0,0 +1,60 @@ +using System; +using Newtonsoft.Json; + +namespace CRD.Utils.Sonarr.Models; + +public class SonarrStatistics{ + /// + /// Gets or sets the previous airing. + /// + /// + /// The previous airing. + /// + [JsonProperty("previousAiring")] + public DateTimeOffset PreviousAiring{ get; set; } + + /// + /// Gets or sets the episode file count. + /// + /// + /// The episode file count. + /// + [JsonProperty("episodeFileCount")] + public int EpisodeFileCount{ get; set; } + + /// + /// Gets or sets the episode count. + /// + /// + /// The episode count. + /// + [JsonProperty("episodeCount")] + public int EpisodeCount{ get; set; } + + /// + /// Gets or sets the total episode count. + /// + /// + /// The total episode count. + /// + [JsonProperty("totalEpisodeCount")] + public int TotalEpisodeCount{ get; set; } + + /// + /// Gets or sets the size on disk. + /// + /// + /// The size on disk. + /// + [JsonProperty("sizeOnDisk")] + public long SizeOnDisk{ get; set; } + + /// + /// Gets or sets the percent of episodes. + /// + /// + /// The percent of episodes. + /// + [JsonProperty("percentOfEpisodes")] + public double PercentOfEpisodes{ get; set; } +} \ No newline at end of file diff --git a/CRD/Utils/Sonarr/SonarrClient.cs b/CRD/Utils/Sonarr/SonarrClient.cs new file mode 100644 index 0000000..3e8496b --- /dev/null +++ b/CRD/Utils/Sonarr/SonarrClient.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Diagnostics; +using System.Net; +using System.Net.Http; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using CRD.Downloader; +using CRD.Utils.Sonarr.Models; +using CRD.Views; +using Newtonsoft.Json; + +namespace CRD.Utils.Sonarr; + +public class SonarrClient{ + private string apiUrl; + + private HttpClient httpClient; + + private SonarrProperties properties; + + #region Singelton + + private static SonarrClient? _instance; + private static readonly object Padlock = new(); + + public static SonarrClient Instance{ + get{ + if (_instance == null){ + lock (Padlock){ + if (_instance == null){ + _instance = new SonarrClient(); + } + } + } + + return _instance; + } + } + + #endregion + + public SonarrClient(){ + httpClient = new HttpClient(); + } + + public void SetApiUrl(){ + if (Crunchyroll.Instance.CrunOptions.SonarrProperties != null) properties = Crunchyroll.Instance.CrunOptions.SonarrProperties; + + if (properties != null){ + apiUrl = $"http{(properties.UseSsl ? "s" : "")}://{properties.Host}:{properties.Port}{(properties.UrlBase ?? "")}/api"; + } + } + + public async Task> GetSeries(){ + var json = await GetJson($"/v3/series{(true ? $"?includeSeasonImages={true}" : "")}"); + + List series = []; + + try{ + series = JsonConvert.DeserializeObject>(json) ?? []; + } catch (Exception e){ + MainWindow.Instance.ShowError("Sonarr GetSeries error \n" + e); + Console.WriteLine(e); + } + + return series; + } + + public async Task> GetEpisodes(int seriesId){ + var json = await GetJson($"/v3/episode?seriesId={seriesId}"); + + List episodes = []; + + try{ + episodes = JsonConvert.DeserializeObject>(json) ?? []; + } catch (Exception e){ + MainWindow.Instance.ShowError("Sonarr GetSeries error \n" + e); + Console.WriteLine(e); + } + + return episodes; + } + + + public async Task GetEpisode(int episodeId){ + var json = await GetJson($"/v3/episode/id={episodeId}"); + var episode = new SonarrEpisode(); + try{ + episode = JsonConvert.DeserializeObject(json) ?? new SonarrEpisode(); + } catch (Exception e){ + MainWindow.Instance.ShowError("Sonarr GetSeries error \n" + e); + Console.WriteLine(e); + } + + return episode; + } + + private async Task GetJson(string endpointUrl){ + Debug.WriteLine($"[DEBUG] [SonarrClient.PostJson] Endpoint URL: '{endpointUrl}'"); + + var request = CreateRequestMessage($"{apiUrl}{endpointUrl}", HttpMethod.Get); + HttpResponseMessage response; + var content = string.Empty; + + try{ + response = await httpClient.SendAsync(request); + response.EnsureSuccessStatusCode(); + + content = await response.Content.ReadAsStringAsync(); + + } catch (Exception ex){ + Debug.WriteLine($"[ERROR] [SonarrClient.GetJson] Endpoint URL: '{endpointUrl}', {ex}"); + } + + + if (!string.IsNullOrEmpty(content)) // Convert response to UTF8 + content = Encoding.UTF8.GetString(Encoding.Default.GetBytes(content)); + + return content; + } + + public HttpRequestMessage CreateRequestMessage(string uri, HttpMethod requestMethod, [Optional] NameValueCollection query){ + UriBuilder uriBuilder = new UriBuilder(uri); + + if (query != null){ + uriBuilder.Query = query.ToString(); + } + + var request = new HttpRequestMessage(requestMethod, uriBuilder.ToString()); + + request.Headers.Add("X-Api-Key", properties.ApiKey); + + request.Headers.UserAgent.ParseAdd($"{Assembly.GetExecutingAssembly().GetName().Name.Replace(" ", ".")}.v{Assembly.GetExecutingAssembly().GetName().Version}"); + + + return request; + } + +} + + + +public class SonarrProperties(){ + public string? Host{ get; set; } + public int Port{ get; set; } + public string? ApiKey{ get; set; } + public bool UseSsl{ get; set; } + + public string? UrlBase{ get; set; } +} \ No newline at end of file diff --git a/CRD/Utils/Structs/CrDownloadOptions.cs b/CRD/Utils/Structs/CrDownloadOptions.cs index f28978a..05eac33 100644 --- a/CRD/Utils/Structs/CrDownloadOptions.cs +++ b/CRD/Utils/Structs/CrDownloadOptions.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using CRD.Utils.Sonarr; using YamlDotNet.Serialization; namespace CRD.Utils.Structs; @@ -115,4 +116,7 @@ public class CrDownloadOptions{ [YamlMember(Alias = "user_non_drm_streams", ApplyNamingConventions = false)] public bool UseNonDrmStreams{ get; set; } + [YamlMember(Alias = "sonarr_properties", ApplyNamingConventions = false)] + public SonarrProperties? SonarrProperties{ get; set; } + } \ No newline at end of file diff --git a/CRD/ViewModels/AddDownloadPageViewModel.cs b/CRD/ViewModels/AddDownloadPageViewModel.cs index ca3101a..5b693b2 100644 --- a/CRD/ViewModels/AddDownloadPageViewModel.cs +++ b/CRD/ViewModels/AddDownloadPageViewModel.cs @@ -39,7 +39,6 @@ public partial class AddDownloadPageViewModel : ViewModelBase{ private CrunchySeriesList? currentSeriesList; public AddDownloadPageViewModel(){ - // Items.Add(new ItemModel("", "Test", "22:33", "Test", "S1", "E1", 1, new List())); SelectedItems.CollectionChanged += OnSelectedItemsChanged; } diff --git a/CRD/ViewModels/SeriesPageViewModel.cs b/CRD/ViewModels/SeriesPageViewModel.cs index 561214b..e228e46 100644 --- a/CRD/ViewModels/SeriesPageViewModel.cs +++ b/CRD/ViewModels/SeriesPageViewModel.cs @@ -1,55 +1,93 @@ using System; +using System.Diagnostics; using System.Threading.Tasks; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using CRD.Downloader; using CRD.Utils; +using CRD.Utils.Sonarr; using CRD.Views; using ReactiveUI; namespace CRD.ViewModels; public partial class SeriesPageViewModel : ViewModelBase{ - - [ObservableProperty] public HistorySeries _selectedSeries; - + [ObservableProperty] public static bool _editMode; + [ObservableProperty] + public static bool _sonarrAvailable; + public SeriesPageViewModel(){ _selectedSeries = Crunchyroll.Instance.SelectedSeries; - + if (_selectedSeries.ThumbnailImage == null){ _selectedSeries.LoadImage(); } + + if (!string.IsNullOrEmpty(SelectedSeries.SonarrSeriesId)){ + SonarrAvailable = SelectedSeries.SonarrSeriesId.Length > 0; + Crunchyroll.Instance.CrHistory.MatchHistoryEpisodesWithSonarr(true,SelectedSeries); + CfgManager.WriteJsonToFile(CfgManager.PathCrHistory, Crunchyroll.Instance.HistoryList); + } else{ + SonarrAvailable = false; + } + } - + + [RelayCommand] + public void OpenSonarrPage(){ + var sonarrProp = Crunchyroll.Instance.CrunOptions.SonarrProperties; + + if (sonarrProp == null) return; + + OpenUrl($"http{(sonarrProp.UseSsl ? "s" : "")}://{sonarrProp.Host}:{sonarrProp.Port}{(sonarrProp.UrlBase ?? "")}/series/{SelectedSeries.SonarrSlugTitle}"); + } + + [RelayCommand] + public void OpenCrPage(){ + + OpenUrl($"https://www.crunchyroll.com/series/{SelectedSeries.SeriesId}"); + + } + [RelayCommand] public async Task UpdateData(string? season){ await SelectedSeries.FetchData(season); - MessageBus.Current.SendMessage(new NavigationMessage(typeof(SeriesPageViewModel),false,true)); + MessageBus.Current.SendMessage(new NavigationMessage(typeof(SeriesPageViewModel), false, true)); } - + [RelayCommand] public void RemoveSeason(string? season){ - HistorySeason? objectToRemove = SelectedSeries.Seasons.Find(se => se.SeasonId == season) ?? null; - if (objectToRemove != null) { + if (objectToRemove != null){ SelectedSeries.Seasons.Remove(objectToRemove); } - CfgManager.WriteJsonToFile(CfgManager.PathCrHistory, Crunchyroll.Instance.HistoryList); - MessageBus.Current.SendMessage(new NavigationMessage(typeof(SeriesPageViewModel),false,true)); + + CfgManager.WriteJsonToFile(CfgManager.PathCrHistory, Crunchyroll.Instance.HistoryList); + MessageBus.Current.SendMessage(new NavigationMessage(typeof(SeriesPageViewModel), false, true)); } - - - + + [RelayCommand] public void NavBack(){ SelectedSeries.UpdateNewEpisodes(); - MessageBus.Current.SendMessage(new NavigationMessage(null,true,false)); + MessageBus.Current.SendMessage(new NavigationMessage(null, true, false)); + } + + + private void OpenUrl(string url){ + try{ + Process.Start(new ProcessStartInfo{ + FileName = url, + UseShellExecute = true + }); + } catch (Exception e){ + Console.WriteLine($"An error occurred: {e.Message}"); + } } - } \ No newline at end of file diff --git a/CRD/ViewModels/SettingsPageViewModel.cs b/CRD/ViewModels/SettingsPageViewModel.cs index 027abef..2f721ec 100644 --- a/CRD/ViewModels/SettingsPageViewModel.cs +++ b/CRD/ViewModels/SettingsPageViewModel.cs @@ -12,6 +12,7 @@ using Avalonia.Styling; using CommunityToolkit.Mvvm.ComponentModel; using CRD.Downloader; using CRD.Utils; +using CRD.Utils.Sonarr; using CRD.Utils.Structs; using FluentAvalonia.Styling; @@ -35,7 +36,7 @@ public partial class SettingsPageViewModel : ViewModelBase{ [ObservableProperty] private bool _history; - + [ObservableProperty] private bool _useNonDrmEndpoint = true; @@ -87,6 +88,18 @@ public partial class SettingsPageViewModel : ViewModelBase{ [ObservableProperty] private Color _customAccentColor = Colors.SlateBlue; + [ObservableProperty] + private string _sonarrHost = "localhost"; + + [ObservableProperty] + private string _sonarrPort = "8989"; + + [ObservableProperty] + private string _sonarrApiKey = ""; + + [ObservableProperty] + private bool _sonarrUseSsl = false; + public ObservableCollection PredefinedColors{ get; } = new(){ Color.FromRgb(255, 185, 0), Color.FromRgb(255, 140, 0), @@ -193,10 +206,10 @@ public partial class SettingsPageViewModel : ViewModelBase{ } CrDownloadOptions options = Crunchyroll.Instance.CrunOptions; - + ComboBoxItem? hsLang = HardSubLangList.FirstOrDefault(a => a.Content != null && (string)a.Content == options.Hslang) ?? null; SelectedHSLang = hsLang ?? HardSubLangList[0]; - + var softSubLang = SubLangList.Where(a => options.DlSubs.Contains(a.Content)).ToList(); SelectedSubLang.Clear(); @@ -213,6 +226,14 @@ public partial class SettingsPageViewModel : ViewModelBase{ UpdateSubAndDubString(); + var props = options.SonarrProperties; + + if (props != null){ + SonarrUseSsl = props.UseSsl; + SonarrHost = props.Host + ""; + SonarrPort = props.Port + ""; + SonarrApiKey = props.ApiKey + ""; + } UseNonDrmEndpoint = options.UseNonDrmStreams; DownloadVideo = !options.Novids; @@ -292,6 +313,17 @@ public partial class SettingsPageViewModel : ViewModelBase{ Crunchyroll.Instance.CrunOptions.History = History; + var props = new SonarrProperties(); + + props.UseSsl = SonarrUseSsl; + props.Host = SonarrHost; + props.Port = Convert.ToInt32(SonarrPort); + props.ApiKey = SonarrApiKey; + + Crunchyroll.Instance.CrunOptions.SonarrProperties = props; + + Crunchyroll.Instance.RefreshSonarr(); + //TODO - Mux Options CfgManager.WriteSettingsToFile(); @@ -370,8 +402,6 @@ public partial class SettingsPageViewModel : ViewModelBase{ } - - private void Changes(object? sender, NotifyCollectionChangedEventArgs e){ UpdateSettings(); } @@ -416,7 +446,27 @@ public partial class SettingsPageViewModel : ViewModelBase{ UpdateSettings(); } + partial void OnUseNonDrmEndpointChanged(bool value){ + UpdateSettings(); + } + partial void OnHistoryChanged(bool value){ UpdateSettings(); } + + partial void OnSonarrHostChanged(string value){ + UpdateSettings(); + } + + partial void OnSonarrPortChanged(string value){ + UpdateSettings(); + } + + partial void OnSonarrApiKeyChanged(string value){ + UpdateSettings(); + } + + partial void OnSonarrUseSslChanged(bool value){ + UpdateSettings(); + } } \ No newline at end of file diff --git a/CRD/Views/SeriesPageView.axaml b/CRD/Views/SeriesPageView.axaml index 9da0a8d..b940b51 100644 --- a/CRD/Views/SeriesPageView.axaml +++ b/CRD/Views/SeriesPageView.axaml @@ -40,9 +40,36 @@ - - - Edit + + + + + + + + + + + + + + Edit + + + @@ -80,6 +107,20 @@ + + + + + + + + + + +