diff --git a/Shoko.Server/Commands/TvDB/CommandRequest_TvDBSearchAnime.cs b/Shoko.Server/Commands/TvDB/CommandRequest_TvDBSearchAnime.cs index 5303413fb..694c94e0f 100644 --- a/Shoko.Server/Commands/TvDB/CommandRequest_TvDBSearchAnime.cs +++ b/Shoko.Server/Commands/TvDB/CommandRequest_TvDBSearchAnime.cs @@ -131,12 +131,18 @@ public override void ProcessCommand() bool foundResult = false; foreach (AniDB_Anime_Title title in anime.GetTitles()) { - if (title.TitleType.ToUpper() != Shoko.Models.Constants.AnimeTitleType.Official.ToUpper()) + if (!title.TitleType.Equals(Shoko.Models.Constants.AnimeTitleType.Official, StringComparison.InvariantCultureIgnoreCase)) + continue; + if (!title.Language.Equals(Shoko.Models.Constants.AniDBLanguageType.English, + StringComparison.InvariantCultureIgnoreCase) && + !title.Language.Equals(Shoko.Models.Constants.AniDBLanguageType.Romaji, + StringComparison.InvariantCultureIgnoreCase)) continue; - if (searchCriteria.ToUpper() == title.Title.ToUpper()) continue; + if (searchCriteria.Equals(title.Title, StringComparison.InvariantCultureIgnoreCase)) continue; - results = TvDBApiHelper.SearchSeries(title.Title); + searchCriteria = title.Title; + results = TvDBApiHelper.SearchSeries(searchCriteria); if (results.Count > 0) foundResult = true; logger.Trace("Found {0} tvdb results for search on {1}", results.Count, title.Title); if (ProcessSearchResults(results, title.Title)) return; diff --git a/Shoko.Server/Providers/TvDB/TvDBApiHelper.cs b/Shoko.Server/Providers/TvDB/TvDBApiHelper.cs index b01b3f4d3..5e2c15199 100644 --- a/Shoko.Server/Providers/TvDB/TvDBApiHelper.cs +++ b/Shoko.Server/Providers/TvDB/TvDBApiHelper.cs @@ -21,6 +21,7 @@ using Shoko.Commons.Extensions; using TvDbSharper.Clients.Updates.Json; using TvDbSharper.Clients.Episodes.Json; +using HttpUtility = Nancy.Helpers.HttpUtility; namespace Shoko.Server.Providers.TvDB { @@ -107,6 +108,7 @@ public static async Task> SearchSeriesAsync(st { List results = new List(); + criteria = HttpUtility.UrlEncode(criteria); try { await _checkAuthorizationAsync(); @@ -134,8 +136,8 @@ public static async Task> SearchSeriesAsync(st if (client.Authentication.Token != null) return await SearchSeriesAsync(criteria); // suppress 404 and move on - } else if (exception.StatusCode == HttpStatusCode.NotFound) return null; - logger.Error(exception, "TvDB returned an error code: " + exception.StatusCode + "\n " + exception.Message); + } else if (exception.StatusCode == HttpStatusCode.NotFound) return results; + logger.Error(exception, "TvDB returned an error code: " + exception.StatusCode + "\n " + exception.Message + "\n when searching for " + criteria); } catch (Exception ex) { @@ -152,7 +154,7 @@ public static async Task> SearchSeriesAsync(st { if (!additiveLink) // remove all current links - RemoveAllAniDBTvDBLinks(session.Wrap(), animeID); + RemoveAllAniDBTvDBLinks(session.Wrap(), animeID, -1, false); // check if we have this information locally // if not download it now @@ -200,8 +202,6 @@ public static async Task> SearchSeriesAsync(st RepoFactory.CrossRef_AniDB_TvDBV2.Save(xref); - SVR_AniDB_Anime.UpdateStatsByAnimeID(animeID); - logger.Trace("Changed tvdb association: {0}", animeID); if (!excludeFromWebCache) @@ -231,7 +231,7 @@ public static async Task> SearchSeriesAsync(st return ""; } - public static void RemoveAllAniDBTvDBLinks(ISessionWrapper session, int animeID, int aniEpType = -1) + public static void RemoveAllAniDBTvDBLinks(ISessionWrapper session, int animeID, int aniEpType = -1, bool updateStats = true) { // check for Trakt associations List trakt = RepoFactory.CrossRef_AniDB_TraktV2.GetByAnimeID(animeID); @@ -274,7 +274,7 @@ public static void RemoveAllAniDBTvDBLinks(ISessionWrapper session, int animeID, } } - SVR_AniDB_Anime.UpdateStatsByAnimeID(animeID); + if (updateStats) SVR_AniDB_Anime.UpdateStatsByAnimeID(animeID); } public static List GetLanguages() @@ -908,6 +908,10 @@ public static async void UpdateAllInfoAndImages(int seriesID, bool forceRefresh, if (!existingEpIds.Contains(oldEp.Id)) RepoFactory.TvDB_Episode.Delete(oldEp.TvDB_EpisodeID); } + + var xref = RepoFactory.CrossRef_AniDB_TvDBV2.GetByTvDBID(tvSeries.SeriesID).FirstOrDefault(); + if (xref == null) return; + SVR_AniDB_Anime.UpdateStatsByAnimeID(xref.AnimeID); } catch (Exception ex) { diff --git a/Shoko.Server/Repositories/Direct/CrossRef_AniDB_TvDBV2Repository.cs b/Shoko.Server/Repositories/Direct/CrossRef_AniDB_TvDBV2Repository.cs index dbff77539..74c6d53d7 100644 --- a/Shoko.Server/Repositories/Direct/CrossRef_AniDB_TvDBV2Repository.cs +++ b/Shoko.Server/Repositories/Direct/CrossRef_AniDB_TvDBV2Repository.cs @@ -42,6 +42,26 @@ public List GetByAnimeID(ISessionWrapper session, int id) return new List(xrefs); } + public List GetByTvDBID(int id) + { + using (var session = DatabaseFactory.SessionFactory.OpenSession()) + { + return GetByTvDBID(session.Wrap(), id); + } + } + + public List GetByTvDBID(ISessionWrapper session, int id) + { + var xrefs = session + .CreateCriteria(typeof(CrossRef_AniDB_TvDBV2)) + .Add(Restrictions.Eq("TvDBID", id)) + .AddOrder(Order.Asc("AniDBStartEpisodeType")) + .AddOrder(Order.Asc("AniDBStartEpisodeNumber")) + .List(); + + return new List(xrefs); + } + public ILookup GetByAnimeIDs(ISessionWrapper session, IReadOnlyCollection animeIds) {