Skip to content

Commit

Permalink
feat: add character & creator filters
Browse files Browse the repository at this point in the history
  • Loading branch information
revam committed Jan 26, 2025
1 parent 4ff0b0a commit 009c144
Show file tree
Hide file tree
Showing 14 changed files with 713 additions and 42 deletions.
1 change: 1 addition & 0 deletions Shoko.Server/API/v3/Controllers/FilterController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ public ActionResult<Filter> AddNewFilter(Filter.Input.CreateOrUpdateFilterBody b
IWithDateParameter => Filter.FilterExpressionHelp.FilterExpressionParameterType.Date,
IWithNumberParameter => Filter.FilterExpressionHelp.FilterExpressionParameterType.Number,
IWithStringParameter => Filter.FilterExpressionHelp.FilterExpressionParameterType.String,
IWithStringSetParameter => Filter.FilterExpressionHelp.FilterExpressionParameterType.StringSet,
IWithTimeSpanParameter => Filter.FilterExpressionHelp.FilterExpressionParameterType.TimeSpan,
_ => null
};
Expand Down
1 change: 1 addition & 0 deletions Shoko.Server/API/v3/Models/Shoko/Filter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,7 @@ public enum FilterExpressionParameterType
String,
TimeSpan,
Bool,
StringSet,
}
}

Expand Down
45 changes: 44 additions & 1 deletion Shoko.Server/Filters/FilterExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
using Shoko.Commons.Extensions;
using Shoko.Models.Enums;
using Shoko.Models.MediaInfo;
using Shoko.Plugin.Abstractions.DataModels;
using Shoko.Server.Models;
using Shoko.Server.Providers.AniDB;
using Shoko.Server.Repositories;
using Shoko.Server.Server;
using AnimeType = Shoko.Models.Enums.AnimeType;
using EpisodeType = Shoko.Models.Enums.EpisodeType;

Expand Down Expand Up @@ -63,6 +63,23 @@ public static Filterable ToFilterable(this SVR_AnimeSeries series)
series.GetAvailableImageTypes(),
PreferredImageTypesDelegate = () =>
series.GetPreferredImageTypes(),
CharacterAppearancesDelegate = () =>
RepoFactory.AniDB_Anime_Character.GetByAnimeID(series.AniDB_ID)
.GroupBy(a => a.Appearance)
.ToDictionary(a => a.Key, a => a.Select(b => b.CharacterID.ToString()).ToHashSet()) as IReadOnlyDictionary<CharacterAppearanceType, IReadOnlySet<string>>,
CharacterIDsDelegate = () =>
RepoFactory.AniDB_Anime_Character.GetByAnimeID(series.AniDB_ID)
.Select(a => a.CharacterID.ToString())
.ToHashSet(),
CreatorIDsDelegate = () =>
RepoFactory.AniDB_Anime_Character_Creator.GetByAnimeID(series.AniDB_ID).Select(a => a.CreatorID.ToString())
.Concat(RepoFactory.AniDB_Anime_Staff.GetByAnimeID(series.AniDB_ID).Select(a => a.CreatorID.ToString()))
.ToHashSet(),
CreatorRolesDelegate = () =>
RepoFactory.AniDB_Anime_Staff.GetByAnimeID(series.AniDB_ID).Select(a => (a.RoleType, a.CreatorID))
.Concat(RepoFactory.AniDB_Anime_Character_Creator.GetByAnimeID(series.AniDB_ID).Select(a => (RoleType: CreatorRoleType.Actor, a.CreatorID)))
.GroupBy(a => a.RoleType)
.ToDictionary(a => a.Key, a => a.Select(b => b.CreatorID.ToString()).ToHashSet()) as IReadOnlyDictionary<CreatorRoleType, IReadOnlySet<string>>,
HasTmdbLinkDelegate = () =>
series.TmdbShowCrossReferences.Count is > 0 || series.TmdbMovieCrossReferences.Count is > 0,
HasMissingTmdbLinkDelegate = () =>
Expand Down Expand Up @@ -215,6 +232,32 @@ public static Filterable ToFilterable(this SVR_AnimeGroup group)
group.AvailableImageTypes,
PreferredImageTypesDelegate = () =>
group.PreferredImageTypes,
CharacterIDsDelegate = () =>
series.SelectMany(ser => RepoFactory.AniDB_Anime_Character.GetByAnimeID(ser.AniDB_ID))
.Select(a => a.CharacterID.ToString())
.ToHashSet(),
CharacterAppearancesDelegate = () =>
series.SelectMany(ser => RepoFactory.AniDB_Anime_Character.GetByAnimeID(ser.AniDB_ID))
.DistinctBy(a => (a.Appearance, a.CharacterID))
.Select(a => (a.Appearance, a.CharacterID))
.GroupBy(a => a.Appearance)
.ToDictionary(a => a.Key, a => a.Select(b => b.CharacterID.ToString()).ToHashSet()) as IReadOnlyDictionary<CharacterAppearanceType, IReadOnlySet<string>>,
CreatorIDsDelegate = () =>
series.SelectMany(ser => RepoFactory.AniDB_Anime_Character_Creator.GetByAnimeID(ser.AniDB_ID))
.Select(a => a.CreatorID.ToString())
.Concat(series.SelectMany(ser => RepoFactory.AniDB_Anime_Staff.GetByAnimeID(ser.AniDB_ID).Select(a => a.CreatorID.ToString())))
.ToHashSet(),
CreatorRolesDelegate = () =>
series.SelectMany(ser => RepoFactory.AniDB_Anime_Staff.GetByAnimeID(ser.AniDB_ID))
.Select(a => (a.RoleType, a.CreatorID))
.DistinctBy(a => (a.RoleType, a.CreatorID))
.Concat(
series.SelectMany(ser => RepoFactory.AniDB_Anime_Character_Creator.GetByAnimeID(ser.AniDB_ID)
.DistinctBy(a => a.CreatorID)
.Select(a => (RoleType: CreatorRoleType.Actor, a.CreatorID)))
)
.GroupBy(a => a.RoleType)
.ToDictionary(a => a.Key, a => a.Select(b => b.CreatorID.ToString()).ToHashSet()) as IReadOnlyDictionary<CreatorRoleType, IReadOnlySet<string>>,
HasTmdbLinkDelegate = () =>
series.Any(a => a.TmdbShowCrossReferences.Count is > 0 || a.TmdbMovieCrossReferences.Count is > 0),
HasMissingTmdbLinkDelegate = () =>
Expand Down
Loading

0 comments on commit 009c144

Please sign in to comment.