From 70ac9e2b6000861180512fbc2f2b93d20b478317 Mon Sep 17 00:00:00 2001 From: csylwip Date: Sat, 7 Feb 2026 10:24:54 +0200 Subject: [PATCH 01/14] Added tags to baseAnime --- internal/api/anilist/client_gen.go | 1006 +++++++++++++++++ internal/api/anilist/queries/anime.graphql | 22 + .../anilist_platform/anilist_platform.go | 3 + 3 files changed, 1031 insertions(+) diff --git a/internal/api/anilist/client_gen.go b/internal/api/anilist/client_gen.go index 123335e8d..aaae5a706 100644 --- a/internal/api/anilist/client_gen.go +++ b/internal/api/anilist/client_gen.go @@ -60,6 +60,7 @@ type BaseAnime struct { MeanScore *int "json:\"meanScore,omitempty\" graphql:\"meanScore\"" Description *string "json:\"description,omitempty\" graphql:\"description\"" Genres []*string "json:\"genres,omitempty\" graphql:\"genres\"" + Tags []*BaseAnime_Tags "json:\"tags,omitempty\" graphql:\"tags\"" Duration *int "json:\"duration,omitempty\" graphql:\"duration\"" Trailer *BaseAnime_Trailer "json:\"trailer,omitempty\" graphql:\"trailer\"" Title *BaseAnime_Title "json:\"title,omitempty\" graphql:\"title\"" @@ -165,6 +166,12 @@ func (t *BaseAnime) GetGenres() []*string { } return t.Genres } +func (t *BaseAnime) GetTags() []*BaseAnime_Tags { + if t == nil { + t = &BaseAnime{} + } + return t.Tags +} func (t *BaseAnime) GetDuration() *int { if t == nil { t = &BaseAnime{} @@ -945,6 +952,73 @@ func (t *UserReleaseYearStats) GetChaptersRead() int { return t.ChaptersRead } +type BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &BaseAnime_Tags{} + } + return t.Category +} +func (t *BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &BaseAnime_Tags{} + } + return t.Description +} +func (t *BaseAnime_Tags) GetID() int { + if t == nil { + t = &BaseAnime_Tags{} + } + return t.ID +} +func (t *BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *BaseAnime_Tags) GetName() string { + if t == nil { + t = &BaseAnime_Tags{} + } + return t.Name +} +func (t *BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &BaseAnime_Tags{} + } + return t.Rank +} +func (t *BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &BaseAnime_Tags{} + } + return t.UserID +} + type BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -1273,6 +1347,73 @@ func (t *CompleteAnime_NextAiringEpisode) GetEpisode() int { return t.Episode } +type CompleteAnime_Relations_Edges_Node_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Category +} +func (t *CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Description +} +func (t *CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetID() int { + if t == nil { + t = &CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.ID +} +func (t *CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetName() string { + if t == nil { + t = &CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Name +} +func (t *CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Rank +} +func (t *CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.UserID +} + type CompleteAnime_Relations_Edges_Node_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -1788,6 +1929,73 @@ func (t *AnimeCollection_MediaListCollection_Lists_Entries_CompletedAt) GetDay() return t.Day } +type AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags{} + } + return t.Category +} +func (t *AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags{} + } + return t.Description +} +func (t *AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags) GetID() int { + if t == nil { + t = &AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags{} + } + return t.ID +} +func (t *AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags) GetName() string { + if t == nil { + t = &AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags{} + } + return t.Name +} +func (t *AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags{} + } + return t.Rank +} +func (t *AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags{} + } + return t.UserID +} + type AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -2283,6 +2491,73 @@ func (t *AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_Co return t.Episode } +type AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Category +} +func (t *AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Description +} +func (t *AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetID() int { + if t == nil { + t = &AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.ID +} +func (t *AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetName() string { + if t == nil { + t = &AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Name +} +func (t *AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Rank +} +func (t *AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.UserID +} + type AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -2593,6 +2868,73 @@ func (t *AnimeCollectionWithRelations_MediaListCollection) GetLists() []*AnimeCo return t.Lists } +type BaseAnimeByMalId_Media_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *BaseAnimeByMalId_Media_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &BaseAnimeByMalId_Media_BaseAnime_Tags{} + } + return t.Category +} +func (t *BaseAnimeByMalId_Media_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &BaseAnimeByMalId_Media_BaseAnime_Tags{} + } + return t.Description +} +func (t *BaseAnimeByMalId_Media_BaseAnime_Tags) GetID() int { + if t == nil { + t = &BaseAnimeByMalId_Media_BaseAnime_Tags{} + } + return t.ID +} +func (t *BaseAnimeByMalId_Media_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &BaseAnimeByMalId_Media_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *BaseAnimeByMalId_Media_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &BaseAnimeByMalId_Media_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *BaseAnimeByMalId_Media_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &BaseAnimeByMalId_Media_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *BaseAnimeByMalId_Media_BaseAnime_Tags) GetName() string { + if t == nil { + t = &BaseAnimeByMalId_Media_BaseAnime_Tags{} + } + return t.Name +} +func (t *BaseAnimeByMalId_Media_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &BaseAnimeByMalId_Media_BaseAnime_Tags{} + } + return t.Rank +} +func (t *BaseAnimeByMalId_Media_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &BaseAnimeByMalId_Media_BaseAnime_Tags{} + } + return t.UserID +} + type BaseAnimeByMalId_Media_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -2757,6 +3099,73 @@ func (t *BaseAnimeByMalId_Media_BaseAnime_NextAiringEpisode) GetEpisode() int { return t.Episode } +type BaseAnimeById_Media_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *BaseAnimeById_Media_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &BaseAnimeById_Media_BaseAnime_Tags{} + } + return t.Category +} +func (t *BaseAnimeById_Media_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &BaseAnimeById_Media_BaseAnime_Tags{} + } + return t.Description +} +func (t *BaseAnimeById_Media_BaseAnime_Tags) GetID() int { + if t == nil { + t = &BaseAnimeById_Media_BaseAnime_Tags{} + } + return t.ID +} +func (t *BaseAnimeById_Media_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &BaseAnimeById_Media_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *BaseAnimeById_Media_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &BaseAnimeById_Media_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *BaseAnimeById_Media_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &BaseAnimeById_Media_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *BaseAnimeById_Media_BaseAnime_Tags) GetName() string { + if t == nil { + t = &BaseAnimeById_Media_BaseAnime_Tags{} + } + return t.Name +} +func (t *BaseAnimeById_Media_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &BaseAnimeById_Media_BaseAnime_Tags{} + } + return t.Rank +} +func (t *BaseAnimeById_Media_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &BaseAnimeById_Media_BaseAnime_Tags{} + } + return t.UserID +} + type BaseAnimeById_Media_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -2932,6 +3341,73 @@ func (t *SearchBaseAnimeByIds_Page_PageInfo) GetHasNextPage() *bool { return t.HasNextPage } +type SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags{} + } + return t.Category +} +func (t *SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags{} + } + return t.Description +} +func (t *SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags) GetID() int { + if t == nil { + t = &SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags{} + } + return t.ID +} +func (t *SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags) GetName() string { + if t == nil { + t = &SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags{} + } + return t.Name +} +func (t *SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags{} + } + return t.Rank +} +func (t *SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags{} + } + return t.UserID +} + type SearchBaseAnimeByIds_Page_Media_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -3278,6 +3754,73 @@ func (t *CompleteAnimeById_Media_CompleteAnime_NextAiringEpisode) GetEpisode() i return t.Episode } +type CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Category +} +func (t *CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Description +} +func (t *CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetID() int { + if t == nil { + t = &CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.ID +} +func (t *CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetName() string { + if t == nil { + t = &CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Name +} +func (t *CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Rank +} +func (t *CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.UserID +} + type CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -3471,6 +4014,73 @@ func (t *CompleteAnimeById_Media_CompleteAnime_Relations) GetEdges() []*Complete return t.Edges } +type AnimeDetailsById_Media_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *AnimeDetailsById_Media_Tags) GetCategory() *string { + if t == nil { + t = &AnimeDetailsById_Media_Tags{} + } + return t.Category +} +func (t *AnimeDetailsById_Media_Tags) GetDescription() *string { + if t == nil { + t = &AnimeDetailsById_Media_Tags{} + } + return t.Description +} +func (t *AnimeDetailsById_Media_Tags) GetID() int { + if t == nil { + t = &AnimeDetailsById_Media_Tags{} + } + return t.ID +} +func (t *AnimeDetailsById_Media_Tags) GetIsAdult() *bool { + if t == nil { + t = &AnimeDetailsById_Media_Tags{} + } + return t.IsAdult +} +func (t *AnimeDetailsById_Media_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &AnimeDetailsById_Media_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *AnimeDetailsById_Media_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &AnimeDetailsById_Media_Tags{} + } + return t.IsMediaSpoiler +} +func (t *AnimeDetailsById_Media_Tags) GetName() string { + if t == nil { + t = &AnimeDetailsById_Media_Tags{} + } + return t.Name +} +func (t *AnimeDetailsById_Media_Tags) GetRank() *int { + if t == nil { + t = &AnimeDetailsById_Media_Tags{} + } + return t.Rank +} +func (t *AnimeDetailsById_Media_Tags) GetUserID() *int { + if t == nil { + t = &AnimeDetailsById_Media_Tags{} + } + return t.UserID +} + type AnimeDetailsById_Media_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -4053,6 +4663,73 @@ func (t *AnimeDetailsById_Media_Recommendations) GetEdges() []*AnimeDetailsById_ return t.Edges } +type AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Category +} +func (t *AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Description +} +func (t *AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags) GetID() int { + if t == nil { + t = &AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.ID +} +func (t *AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags) GetName() string { + if t == nil { + t = &AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Name +} +func (t *AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Rank +} +func (t *AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.UserID +} + type AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -4251,6 +4928,7 @@ type AnimeDetailsById_Media struct { ID int "json:\"id\" graphql:\"id\"" Duration *int "json:\"duration,omitempty\" graphql:\"duration\"" Genres []*string "json:\"genres,omitempty\" graphql:\"genres\"" + Tags []*AnimeDetailsById_Media_Tags "json:\"tags,omitempty\" graphql:\"tags\"" AverageScore *int "json:\"averageScore,omitempty\" graphql:\"averageScore\"" Popularity *int "json:\"popularity,omitempty\" graphql:\"popularity\"" MeanScore *int "json:\"meanScore,omitempty\" graphql:\"meanScore\"" @@ -4290,6 +4968,12 @@ func (t *AnimeDetailsById_Media) GetGenres() []*string { } return t.Genres } +func (t *AnimeDetailsById_Media) GetTags() []*AnimeDetailsById_Media_Tags { + if t == nil { + t = &AnimeDetailsById_Media{} + } + return t.Tags +} func (t *AnimeDetailsById_Media) GetAverageScore() *int { if t == nil { t = &AnimeDetailsById_Media{} @@ -4408,6 +5092,73 @@ func (t *ListAnime_Page_PageInfo) GetLastPage() *int { return t.LastPage } +type ListAnime_Page_Media_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *ListAnime_Page_Media_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &ListAnime_Page_Media_BaseAnime_Tags{} + } + return t.Category +} +func (t *ListAnime_Page_Media_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &ListAnime_Page_Media_BaseAnime_Tags{} + } + return t.Description +} +func (t *ListAnime_Page_Media_BaseAnime_Tags) GetID() int { + if t == nil { + t = &ListAnime_Page_Media_BaseAnime_Tags{} + } + return t.ID +} +func (t *ListAnime_Page_Media_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &ListAnime_Page_Media_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *ListAnime_Page_Media_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &ListAnime_Page_Media_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *ListAnime_Page_Media_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &ListAnime_Page_Media_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *ListAnime_Page_Media_BaseAnime_Tags) GetName() string { + if t == nil { + t = &ListAnime_Page_Media_BaseAnime_Tags{} + } + return t.Name +} +func (t *ListAnime_Page_Media_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &ListAnime_Page_Media_BaseAnime_Tags{} + } + return t.Rank +} +func (t *ListAnime_Page_Media_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &ListAnime_Page_Media_BaseAnime_Tags{} + } + return t.UserID +} + type ListAnime_Page_Media_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -4629,6 +5380,73 @@ func (t *ListRecentAnime_Page_PageInfo) GetLastPage() *int { return t.LastPage } +type ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags{} + } + return t.Category +} +func (t *ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags{} + } + return t.Description +} +func (t *ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags) GetID() int { + if t == nil { + t = &ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags{} + } + return t.ID +} +func (t *ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags) GetName() string { + if t == nil { + t = &ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags{} + } + return t.Name +} +func (t *ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags{} + } + return t.Rank +} +func (t *ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags{} + } + return t.UserID +} + type ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -6979,6 +7797,73 @@ func (t *ViewerStats_Viewer) GetStatistics() *ViewerStats_Viewer_Statistics { return t.Statistics } +type StudioDetails_Studio_Media_Nodes_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *StudioDetails_Studio_Media_Nodes_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &StudioDetails_Studio_Media_Nodes_BaseAnime_Tags{} + } + return t.Category +} +func (t *StudioDetails_Studio_Media_Nodes_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &StudioDetails_Studio_Media_Nodes_BaseAnime_Tags{} + } + return t.Description +} +func (t *StudioDetails_Studio_Media_Nodes_BaseAnime_Tags) GetID() int { + if t == nil { + t = &StudioDetails_Studio_Media_Nodes_BaseAnime_Tags{} + } + return t.ID +} +func (t *StudioDetails_Studio_Media_Nodes_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &StudioDetails_Studio_Media_Nodes_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *StudioDetails_Studio_Media_Nodes_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &StudioDetails_Studio_Media_Nodes_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *StudioDetails_Studio_Media_Nodes_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &StudioDetails_Studio_Media_Nodes_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *StudioDetails_Studio_Media_Nodes_BaseAnime_Tags) GetName() string { + if t == nil { + t = &StudioDetails_Studio_Media_Nodes_BaseAnime_Tags{} + } + return t.Name +} +func (t *StudioDetails_Studio_Media_Nodes_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &StudioDetails_Studio_Media_Nodes_BaseAnime_Tags{} + } + return t.Rank +} +func (t *StudioDetails_Studio_Media_Nodes_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &StudioDetails_Studio_Media_Nodes_BaseAnime_Tags{} + } + return t.UserID +} + type StudioDetails_Studio_Media_Nodes_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -7597,6 +8482,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -7757,6 +8653,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -7832,6 +8739,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -7907,6 +8825,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -7987,6 +8916,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -8130,6 +9070,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -8189,6 +9140,17 @@ const AnimeDetailsByIDDocument = `query AnimeDetailsById ($id: Int) { id duration genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } averageScore popularity meanScore @@ -8334,6 +9296,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -8418,6 +9391,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -8518,6 +9502,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -9429,6 +10424,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id diff --git a/internal/api/anilist/queries/anime.graphql b/internal/api/anilist/queries/anime.graphql index 4746fc437..721a2232f 100644 --- a/internal/api/anilist/queries/anime.graphql +++ b/internal/api/anilist/queries/anime.graphql @@ -98,6 +98,17 @@ query AnimeDetailsById ($id: Int) { id duration genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } averageScore popularity meanScore @@ -283,6 +294,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id diff --git a/internal/platforms/anilist_platform/anilist_platform.go b/internal/platforms/anilist_platform/anilist_platform.go index 511e7f7a5..4f68ba20b 100644 --- a/internal/platforms/anilist_platform/anilist_platform.go +++ b/internal/platforms/anilist_platform/anilist_platform.go @@ -240,6 +240,9 @@ func (ap *AnilistPlatform) GetAnimeDetails(ctx context.Context, mediaID int) (*a } media := ret.GetMedia() + for _, value := range media.GetTags() { + ap.logger.Debug().Msg("Tag name: " + value.GetName()) + } return ap.helper.TriggerGetAnimeDetailsEvent(media) } From cd2712e4f31dc622d88a18979d60bab6bd0eebea Mon Sep 17 00:00:00 2001 From: csylwip Date: Sat, 7 Feb 2026 14:48:59 +0200 Subject: [PATCH 02/14] Working tags --- codegen/generated/handlers.json | 9 + codegen/generated/public_structs.json | 1627 +++++++-- internal/api/anilist/client.go | 6 +- internal/api/anilist/client_gen.go | 9 +- internal/api/anilist/client_mock.go | 4 +- internal/api/anilist/list.go | 8 + internal/api/anilist/queries/anime.graphql | 2 + .../extension_repo/goja_plugin_types/app.d.ts | 75 +- internal/handlers/anilist.go | 3 + internal/handlers/anime_entries.go | 1 + .../platforms/shared_platform/cachelayer.go | 4 +- internal/plugin/anilist.go | 4 +- .../src/api/generated/endpoint.types.ts | 8 +- seanime-web/src/api/generated/endpoints.ts | 10 +- seanime-web/src/api/generated/types.ts | 48 +- .../plugin/generated/plugin-events.ts | 232 +- .../_components/advanced-search-options.tsx | 17 +- .../search/_lib/advanced-search-constants.ts | 2933 +++++++++++++++++ .../search/_lib/advanced-search.atoms.ts | 4 +- .../search/_lib/handle-advanced-search.ts | 2 + seanime-web/src/app/(main)/search/page.tsx | 4 +- 21 files changed, 4604 insertions(+), 406 deletions(-) diff --git a/codegen/generated/handlers.json b/codegen/generated/handlers.json index 0f59df0ac..88e3c4f57 100644 --- a/codegen/generated/handlers.json +++ b/codegen/generated/handlers.json @@ -381,6 +381,15 @@ "required": false, "descriptions": [] }, + { + "name": "Tags", + "jsonName": "tags", + "goType": "[]anilist.BaseAnime_Tags", + "usedStructType": "anilist.BaseAnime_Tags", + "typescriptType": "Array\u003cAL_BaseAnime_Tags\u003e", + "required": false, + "descriptions": [] + }, { "name": "AverageScoreGreater", "jsonName": "averageScore_greater", diff --git a/codegen/generated/public_structs.json b/codegen/generated/public_structs.json index 0658b614e..ec121f89e 100644 --- a/codegen/generated/public_structs.json +++ b/codegen/generated/public_structs.json @@ -231,6 +231,17 @@ "public": true, "comments": [] }, + { + "name": "Tags", + "jsonName": "tags", + "goType": "[]BaseAnime_Tags", + "typescriptType": "Array\u003cAL_BaseAnime_Tags\u003e", + "usedTypescriptType": "AL_BaseAnime_Tags", + "usedStructName": "anilist.BaseAnime_Tags", + "required": false, + "public": true, + "comments": [] + }, { "name": "Duration", "jsonName": "duration", @@ -1367,50 +1378,13 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "BaseAnime_Trailer", - "formattedName": "AL_BaseAnime_Trailer", + "name": "BaseAnime_Tags", + "formattedName": "AL_BaseAnime_Tags", "package": "anilist", "fields": [ { - "name": "ID", - "jsonName": "id", - "goType": "string", - "typescriptType": "string", - "required": false, - "public": true, - "comments": [] - }, - { - "name": "Site", - "jsonName": "site", - "goType": "string", - "typescriptType": "string", - "required": false, - "public": true, - "comments": [] - }, - { - "name": "Thumbnail", - "jsonName": "thumbnail", - "goType": "string", - "typescriptType": "string", - "required": false, - "public": true, - "comments": [] - } - ], - "comments": [] - }, - { - "filepath": "../internal/api/anilist/client_gen.go", - "filename": "client_gen.go", - "name": "BaseAnime_Title", - "formattedName": "AL_BaseAnime_Title", - "package": "anilist", - "fields": [ - { - "name": "UserPreferred", - "jsonName": "userPreferred", + "name": "Category", + "jsonName": "category", "goType": "string", "typescriptType": "string", "required": false, @@ -1418,8 +1392,8 @@ "comments": [] }, { - "name": "Romaji", - "jsonName": "romaji", + "name": "Description", + "jsonName": "description", "goType": "string", "typescriptType": "string", "required": false, @@ -1427,128 +1401,53 @@ "comments": [] }, { - "name": "English", - "jsonName": "english", - "goType": "string", - "typescriptType": "string", - "required": false, + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, "public": true, "comments": [] }, { - "name": "Native", - "jsonName": "native", - "goType": "string", - "typescriptType": "string", - "required": false, - "public": true, - "comments": [] - } - ], - "comments": [] - }, - { - "filepath": "../internal/api/anilist/client_gen.go", - "filename": "client_gen.go", - "name": "BaseAnime_CoverImage", - "formattedName": "AL_BaseAnime_CoverImage", - "package": "anilist", - "fields": [ - { - "name": "ExtraLarge", - "jsonName": "extraLarge", - "goType": "string", - "typescriptType": "string", + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", "required": false, "public": true, "comments": [] }, { - "name": "Large", - "jsonName": "large", - "goType": "string", - "typescriptType": "string", + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", "required": false, "public": true, "comments": [] }, { - "name": "Medium", - "jsonName": "medium", - "goType": "string", - "typescriptType": "string", + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", "required": false, "public": true, "comments": [] }, { - "name": "Color", - "jsonName": "color", + "name": "Name", + "jsonName": "name", "goType": "string", "typescriptType": "string", - "required": false, - "public": true, - "comments": [] - } - ], - "comments": [] - }, - { - "filepath": "../internal/api/anilist/client_gen.go", - "filename": "client_gen.go", - "name": "BaseAnime_StartDate", - "formattedName": "AL_BaseAnime_StartDate", - "package": "anilist", - "fields": [ - { - "name": "Year", - "jsonName": "year", - "goType": "int", - "typescriptType": "number", - "required": false, - "public": true, - "comments": [] - }, - { - "name": "Month", - "jsonName": "month", - "goType": "int", - "typescriptType": "number", - "required": false, - "public": true, - "comments": [] - }, - { - "name": "Day", - "jsonName": "day", - "goType": "int", - "typescriptType": "number", - "required": false, - "public": true, - "comments": [] - } - ], - "comments": [] - }, - { - "filepath": "../internal/api/anilist/client_gen.go", - "filename": "client_gen.go", - "name": "BaseAnime_EndDate", - "formattedName": "AL_BaseAnime_EndDate", - "package": "anilist", - "fields": [ - { - "name": "Year", - "jsonName": "year", - "goType": "int", - "typescriptType": "number", - "required": false, + "required": true, "public": true, "comments": [] }, { - "name": "Month", - "jsonName": "month", + "name": "Rank", + "jsonName": "rank", "goType": "int", "typescriptType": "number", "required": false, @@ -1556,8 +1455,8 @@ "comments": [] }, { - "name": "Day", - "jsonName": "day", + "name": "UserID", + "jsonName": "userId", "goType": "int", "typescriptType": "number", "required": false, @@ -1570,45 +1469,8 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "BaseAnime_NextAiringEpisode", - "formattedName": "AL_BaseAnime_NextAiringEpisode", - "package": "anilist", - "fields": [ - { - "name": "AiringAt", - "jsonName": "airingAt", - "goType": "int", - "typescriptType": "number", - "required": true, - "public": true, - "comments": [] - }, - { - "name": "TimeUntilAiring", - "jsonName": "timeUntilAiring", - "goType": "int", - "typescriptType": "number", - "required": true, - "public": true, - "comments": [] - }, - { - "name": "Episode", - "jsonName": "episode", - "goType": "int", - "typescriptType": "number", - "required": true, - "public": true, - "comments": [] - } - ], - "comments": [] - }, - { - "filepath": "../internal/api/anilist/client_gen.go", - "filename": "client_gen.go", - "name": "CompleteAnime_Trailer", - "formattedName": "AL_CompleteAnime_Trailer", + "name": "BaseAnime_Trailer", + "formattedName": "AL_BaseAnime_Trailer", "package": "anilist", "fields": [ { @@ -1644,8 +1506,8 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "CompleteAnime_Title", - "formattedName": "AL_CompleteAnime_Title", + "name": "BaseAnime_Title", + "formattedName": "AL_BaseAnime_Title", "package": "anilist", "fields": [ { @@ -1690,8 +1552,8 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "CompleteAnime_CoverImage", - "formattedName": "AL_CompleteAnime_CoverImage", + "name": "BaseAnime_CoverImage", + "formattedName": "AL_BaseAnime_CoverImage", "package": "anilist", "fields": [ { @@ -1736,8 +1598,8 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "CompleteAnime_StartDate", - "formattedName": "AL_CompleteAnime_StartDate", + "name": "BaseAnime_StartDate", + "formattedName": "AL_BaseAnime_StartDate", "package": "anilist", "fields": [ { @@ -1773,8 +1635,8 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "CompleteAnime_EndDate", - "formattedName": "AL_CompleteAnime_EndDate", + "name": "BaseAnime_EndDate", + "formattedName": "AL_BaseAnime_EndDate", "package": "anilist", "fields": [ { @@ -1810,8 +1672,8 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "CompleteAnime_NextAiringEpisode", - "formattedName": "AL_CompleteAnime_NextAiringEpisode", + "name": "BaseAnime_NextAiringEpisode", + "formattedName": "AL_BaseAnime_NextAiringEpisode", "package": "anilist", "fields": [ { @@ -1847,8 +1709,8 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_Trailer", - "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_Trailer", + "name": "CompleteAnime_Trailer", + "formattedName": "AL_CompleteAnime_Trailer", "package": "anilist", "fields": [ { @@ -1884,8 +1746,8 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_Title", - "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_Title", + "name": "CompleteAnime_Title", + "formattedName": "AL_CompleteAnime_Title", "package": "anilist", "fields": [ { @@ -1930,8 +1792,8 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_CoverImage", - "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_CoverImage", + "name": "CompleteAnime_CoverImage", + "formattedName": "AL_CompleteAnime_CoverImage", "package": "anilist", "fields": [ { @@ -1976,8 +1838,8 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_StartDate", - "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_StartDate", + "name": "CompleteAnime_StartDate", + "formattedName": "AL_CompleteAnime_StartDate", "package": "anilist", "fields": [ { @@ -2013,8 +1875,339 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_EndDate", - "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_EndDate", + "name": "CompleteAnime_EndDate", + "formattedName": "AL_CompleteAnime_EndDate", + "package": "anilist", + "fields": [ + { + "name": "Year", + "jsonName": "year", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Month", + "jsonName": "month", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Day", + "jsonName": "day", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "CompleteAnime_NextAiringEpisode", + "formattedName": "AL_CompleteAnime_NextAiringEpisode", + "package": "anilist", + "fields": [ + { + "name": "AiringAt", + "jsonName": "airingAt", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "TimeUntilAiring", + "jsonName": "timeUntilAiring", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Episode", + "jsonName": "episode", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + } + ], + "comments": [] + }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_Tags", + "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_Trailer", + "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_Trailer", + "package": "anilist", + "fields": [ + { + "name": "ID", + "jsonName": "id", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Site", + "jsonName": "site", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Thumbnail", + "jsonName": "thumbnail", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_Title", + "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_Title", + "package": "anilist", + "fields": [ + { + "name": "UserPreferred", + "jsonName": "userPreferred", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Romaji", + "jsonName": "romaji", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "English", + "jsonName": "english", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Native", + "jsonName": "native", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_CoverImage", + "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_CoverImage", + "package": "anilist", + "fields": [ + { + "name": "ExtraLarge", + "jsonName": "extraLarge", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Large", + "jsonName": "large", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Medium", + "jsonName": "medium", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Color", + "jsonName": "color", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_StartDate", + "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_StartDate", + "package": "anilist", + "fields": [ + { + "name": "Year", + "jsonName": "year", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Month", + "jsonName": "month", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Day", + "jsonName": "day", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_EndDate", + "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_EndDate", "package": "anilist", "fields": [ { @@ -2623,6 +2816,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags", + "formattedName": "AL_AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -3356,6 +3640,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags", + "formattedName": "AL_AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -3828,6 +4203,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "BaseAnimeByMalId_Media_BaseAnime_Tags", + "formattedName": "AL_BaseAnimeByMalId_Media_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -4068,6 +4534,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "BaseAnimeById_Media_BaseAnime_Tags", + "formattedName": "AL_BaseAnimeById_Media_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -4327,6 +4884,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags", + "formattedName": "AL_SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -4839,6 +5487,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags", + "formattedName": "AL_CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -5132,6 +5871,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "AnimeDetailsById_Media_Tags", + "formattedName": "AL_AnimeDetailsById_Media_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -6034,6 +6864,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags", + "formattedName": "AL_AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -6370,6 +7291,17 @@ "public": true, "comments": [] }, + { + "name": "Tags", + "jsonName": "tags", + "goType": "[]AnimeDetailsById_Media_Tags", + "typescriptType": "Array\u003cAL_AnimeDetailsById_Media_Tags\u003e", + "usedTypescriptType": "AL_AnimeDetailsById_Media_Tags", + "usedStructName": "anilist.AnimeDetailsById_Media_Tags", + "required": false, + "public": true, + "comments": [] + }, { "name": "AverageScore", "jsonName": "averageScore", @@ -6563,6 +7495,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "ListAnime_Page_Media_BaseAnime_Tags", + "formattedName": "AL_ListAnime_Page_Media_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -6890,6 +7913,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags", + "formattedName": "AL_ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -10514,6 +11628,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "StudioDetails_Studio_Media_Nodes_BaseAnime_Tags", + "formattedName": "AL_StudioDetails_Studio_Media_Nodes_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -26685,7 +27890,7 @@ "comments": [] }, { - "filepath": "../internal/continuity/history.go", + "filepath": "..\\internal\\continuity\\history.go", "filename": "history.go", "name": "WatchHistory", "formattedName": "Continuity_WatchHistory", @@ -29484,7 +30689,7 @@ "comments": [] }, { - "filepath": "../internal/database/models/models.go", + "filepath": "..\\internal\\database\\models\\models.go", "filename": "models.go", "name": "LibraryPaths", "formattedName": "Models_LibraryPaths", @@ -29600,7 +30805,7 @@ "comments": [] }, { - "filepath": "../internal/database/models/models.go", + "filepath": "..\\internal\\database\\models\\models.go", "filename": "models.go", "name": "IntSlice", "formattedName": "Models_IntSlice", @@ -31742,7 +32947,7 @@ ] }, { - "filepath": "../internal/database/models/models.go", + "filepath": "..\\internal\\database\\models\\models.go", "filename": "models.go", "name": "StringSlice", "formattedName": "Models_StringSlice", @@ -54286,7 +55491,7 @@ ] }, { - "filepath": "../internal/local/database_models.go", + "filepath": "..\\internal\\local\\database_models.go", "filename": "database_models.go", "name": "StringMap", "formattedName": "Local_StringMap", @@ -54300,7 +55505,7 @@ "comments": null }, { - "filepath": "../internal/local/database_models.go", + "filepath": "..\\internal\\local\\database_models.go", "filename": "database_models.go", "name": "LocalMangaChapterContainers", "formattedName": "Local_LocalMangaChapterContainers", @@ -55772,7 +56977,7 @@ "comments": [] }, { - "filepath": "../internal/manga/download.go", + "filepath": "..\\internal\\manga\\download.go", "filename": "download.go", "name": "MediaMap", "formattedName": "Manga_MediaMap", @@ -55787,7 +56992,7 @@ "comments": null }, { - "filepath": "../internal/manga/download.go", + "filepath": "..\\internal\\manga\\download.go", "filename": "download.go", "name": "ProviderDownloadMap", "formattedName": "Manga_ProviderDownloadMap", @@ -56215,7 +57420,7 @@ "comments": [] }, { - "filepath": "../internal/manga/downloader/chapter_downloader.go", + "filepath": "..\\internal\\manga\\downloader\\chapter_downloader.go", "filename": "chapter_downloader.go", "name": "Registry", "formattedName": "ChapterDownloader_Registry", @@ -66471,7 +67676,7 @@ "comments": [] }, { - "filepath": "../internal/nakama/share.go", + "filepath": "..\\internal\\nakama\\share.go", "filename": "share.go", "name": "NakamaCustomSourceMap", "formattedName": "Nakama_NakamaCustomSourceMap", diff --git a/internal/api/anilist/client.go b/internal/api/anilist/client.go index 3d6d17350..bda4454b5 100644 --- a/internal/api/anilist/client.go +++ b/internal/api/anilist/client.go @@ -34,7 +34,7 @@ type AnilistClient interface { SearchBaseAnimeByIds(ctx context.Context, ids []*int, page *int, perPage *int, status []*MediaStatus, inCollection *bool, sort []*MediaSort, season *MediaSeason, year *int, genre *string, format *MediaFormat, interceptors ...clientv2.RequestInterceptor) (*SearchBaseAnimeByIds, error) CompleteAnimeByID(ctx context.Context, id *int, interceptors ...clientv2.RequestInterceptor) (*CompleteAnimeByID, error) AnimeDetailsByID(ctx context.Context, id *int, interceptors ...clientv2.RequestInterceptor) (*AnimeDetailsByID, error) - ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, averageScoreGreater *int, season *MediaSeason, seasonYear *int, format *MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListAnime, error) + ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, tags []*string, averageScoreGreater *int, season *MediaSeason, seasonYear *int, format *MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListAnime, error) ListRecentAnime(ctx context.Context, page *int, perPage *int, airingAtGreater *int, airingAtLesser *int, notYetAired *bool, interceptors ...clientv2.RequestInterceptor) (*ListRecentAnime, error) UpdateMediaListEntry(ctx context.Context, mediaID *int, status *MediaListStatus, scoreRaw *int, progress *int, startedAt *FuzzyDateInput, completedAt *FuzzyDateInput, interceptors ...clientv2.RequestInterceptor) (*UpdateMediaListEntry, error) UpdateMediaListEntryProgress(ctx context.Context, mediaID *int, progress *int, status *MediaListStatus, interceptors ...clientv2.RequestInterceptor) (*UpdateMediaListEntryProgress, error) @@ -207,9 +207,9 @@ func (ac *AnilistClientImpl) CompleteAnimeByID(ctx context.Context, id *int, int return ac.Client.CompleteAnimeByID(ctx, id, interceptors...) } -func (ac *AnilistClientImpl) ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, averageScoreGreater *int, season *MediaSeason, seasonYear *int, format *MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListAnime, error) { +func (ac *AnilistClientImpl) ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, tags []*string, averageScoreGreater *int, season *MediaSeason, seasonYear *int, format *MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListAnime, error) { ac.logger.Debug().Msg("anilist: Fetching media list") - return ac.Client.ListAnime(ctx, page, search, perPage, sort, status, genres, averageScoreGreater, season, seasonYear, format, isAdult, interceptors...) + return ac.Client.ListAnime(ctx, page, search, perPage, sort, status, genres, tags, averageScoreGreater, season, seasonYear, format, isAdult, interceptors...) } func (ac *AnilistClientImpl) ListRecentAnime(ctx context.Context, page *int, perPage *int, airingAtGreater *int, airingAtLesser *int, notYetAired *bool, interceptors ...clientv2.RequestInterceptor) (*ListRecentAnime, error) { diff --git a/internal/api/anilist/client_gen.go b/internal/api/anilist/client_gen.go index aaae5a706..2ade705ad 100644 --- a/internal/api/anilist/client_gen.go +++ b/internal/api/anilist/client_gen.go @@ -17,7 +17,7 @@ type GithubGraphQLClient interface { SearchBaseAnimeByIds(ctx context.Context, ids []*int, page *int, perPage *int, status []*MediaStatus, inCollection *bool, sort []*MediaSort, season *MediaSeason, year *int, genre *string, format *MediaFormat, interceptors ...clientv2.RequestInterceptor) (*SearchBaseAnimeByIds, error) CompleteAnimeByID(ctx context.Context, id *int, interceptors ...clientv2.RequestInterceptor) (*CompleteAnimeByID, error) AnimeDetailsByID(ctx context.Context, id *int, interceptors ...clientv2.RequestInterceptor) (*AnimeDetailsByID, error) - ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, averageScoreGreater *int, season *MediaSeason, seasonYear *int, format *MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListAnime, error) + ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, tags []*string, averageScoreGreater *int, season *MediaSeason, seasonYear *int, format *MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListAnime, error) ListRecentAnime(ctx context.Context, page *int, perPage *int, airingAtGreater *int, airingAtLesser *int, notYetAired *bool, interceptors ...clientv2.RequestInterceptor) (*ListRecentAnime, error) AnimeAiringSchedule(ctx context.Context, ids []*int, season *MediaSeason, seasonYear *int, previousSeason *MediaSeason, previousSeasonYear *int, nextSeason *MediaSeason, nextSeasonYear *int, interceptors ...clientv2.RequestInterceptor) (*AnimeAiringSchedule, error) AnimeAiringScheduleRaw(ctx context.Context, ids []*int, interceptors ...clientv2.RequestInterceptor) (*AnimeAiringScheduleRaw, error) @@ -9360,7 +9360,7 @@ func (c *Client) AnimeDetailsByID(ctx context.Context, id *int, interceptors ... return &res, nil } -const ListAnimeDocument = `query ListAnime ($page: Int, $search: String, $perPage: Int, $sort: [MediaSort], $status: [MediaStatus], $genres: [String], $averageScore_greater: Int, $season: MediaSeason, $seasonYear: Int, $format: MediaFormat, $isAdult: Boolean) { +const ListAnimeDocument = `query ListAnime ($page: Int, $search: String, $perPage: Int, $sort: [MediaSort], $status: [MediaStatus], $genres: [String], $tags: [String], $averageScore_greater: Int, $season: MediaSeason, $seasonYear: Int, $format: MediaFormat, $isAdult: Boolean) { Page(page: $page, perPage: $perPage) { pageInfo { hasNextPage @@ -9369,7 +9369,7 @@ const ListAnimeDocument = `query ListAnime ($page: Int, $search: String, $perPag currentPage lastPage } - media(type: ANIME, search: $search, sort: $sort, status_in: $status, isAdult: $isAdult, format: $format, genre_in: $genres, averageScore_greater: $averageScore_greater, season: $season, seasonYear: $seasonYear, format_not: MUSIC) { + media(type: ANIME, search: $search, sort: $sort, status_in: $status, isAdult: $isAdult, format: $format, genre_in: $genres, tag_in: $tags, averageScore_greater: $averageScore_greater, season: $season, seasonYear: $seasonYear, format_not: MUSIC) { ... baseAnime } } @@ -9438,7 +9438,7 @@ fragment baseAnime on Media { } ` -func (c *Client) ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, averageScoreGreater *int, season *MediaSeason, seasonYear *int, format *MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListAnime, error) { +func (c *Client) ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, tags []*string, averageScoreGreater *int, season *MediaSeason, seasonYear *int, format *MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListAnime, error) { vars := map[string]any{ "page": page, "search": search, @@ -9446,6 +9446,7 @@ func (c *Client) ListAnime(ctx context.Context, page *int, search *string, perPa "sort": sort, "status": status, "genres": genres, + "tags": tags, "averageScore_greater": averageScoreGreater, "season": season, "seasonYear": seasonYear, diff --git a/internal/api/anilist/client_mock.go b/internal/api/anilist/client_mock.go index 53015d2e0..2249abb2b 100644 --- a/internal/api/anilist/client_mock.go +++ b/internal/api/anilist/client_mock.go @@ -511,9 +511,9 @@ func (ac *MockAnilistClientImpl) CompleteAnimeByID(ctx context.Context, id *int, return ac.realAnilistClient.CompleteAnimeByID(ctx, id, interceptors...) } -func (ac *MockAnilistClientImpl) ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, averageScoreGreater *int, season *MediaSeason, seasonYear *int, format *MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListAnime, error) { +func (ac *MockAnilistClientImpl) ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, tags []*string, averageScoreGreater *int, season *MediaSeason, seasonYear *int, format *MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListAnime, error) { ac.logger.Debug().Msg("anilist: Fetching media list") - return ac.realAnilistClient.ListAnime(ctx, page, search, perPage, sort, status, genres, averageScoreGreater, season, seasonYear, format, isAdult, interceptors...) + return ac.realAnilistClient.ListAnime(ctx, page, search, perPage, sort, status, genres, tags, averageScoreGreater, season, seasonYear, format, isAdult, interceptors...) } func (ac *MockAnilistClientImpl) ListRecentAnime(ctx context.Context, page *int, perPage *int, airingAtGreater *int, airingAtLesser *int, notYetAired *bool, interceptors ...clientv2.RequestInterceptor) (*ListRecentAnime, error) { diff --git a/internal/api/anilist/list.go b/internal/api/anilist/list.go index c8c70cf33..190009fd3 100644 --- a/internal/api/anilist/list.go +++ b/internal/api/anilist/list.go @@ -139,6 +139,7 @@ func ListAnimeM( Sort []*MediaSort, Status []*MediaStatus, Genres []*string, + Tags []*string, AverageScoreGreater *int, Season *MediaSeason, SeasonYear *int, @@ -168,6 +169,9 @@ func ListAnimeM( if Genres != nil { variables["genres"] = Genres } + if Tags != nil { + variables["tags"] = Tags + } if AverageScoreGreater != nil { variables["averageScore_greater"] = *AverageScoreGreater } @@ -361,6 +365,7 @@ func ListAnimeCacheKey( Sort []*MediaSort, Status []*MediaStatus, Genres []*string, + Tags []*string, AverageScoreGreater *int, Season *MediaSeason, SeasonYear *int, @@ -388,6 +393,9 @@ func ListAnimeCacheKey( if Genres != nil { key += fmt.Sprintf("_%v", Genres) } + if Tags != nil { + key += fmt.Sprintf("_%v", Tags) + } if AverageScoreGreater != nil { key += fmt.Sprintf("_%d", *AverageScoreGreater) } diff --git a/internal/api/anilist/queries/anime.graphql b/internal/api/anilist/queries/anime.graphql index 721a2232f..381e2ec8a 100644 --- a/internal/api/anilist/queries/anime.graphql +++ b/internal/api/anilist/queries/anime.graphql @@ -224,6 +224,7 @@ query ListAnime( $sort: [MediaSort] $status: [MediaStatus] $genres: [String] + $tags: [String] $averageScore_greater: Int $season: MediaSeason $seasonYear: Int @@ -246,6 +247,7 @@ query ListAnime( isAdult: $isAdult format: $format genre_in: $genres + tag_in: $tags averageScore_greater: $averageScore_greater season: $season seasonYear: $seasonYear diff --git a/internal/extension_repo/goja_plugin_types/app.d.ts b/internal/extension_repo/goja_plugin_types/app.d.ts index a1202b699..ad92be017 100644 --- a/internal/extension_repo/goja_plugin_types/app.d.ts +++ b/internal/extension_repo/goja_plugin_types/app.d.ts @@ -553,8 +553,7 @@ declare namespace $app { * @file internal/continuity/hook_events.go * @description * WatchHistoryItemRequestedEvent is triggered when a watch history item is requested. - * Prevent default to skip getting the watch history item from the file cache, in this case the event should have a valid WatchHistoryItem object - * or set it to nil to indicate that the watch history item was not found. + * Prevent default to skip getting the watch history item from the file cache, in this case the event should have a valid WatchHistoryItem object or set it to nil to indicate that the watch history item was not found. */ function onWatchHistoryItemRequested(cb: (event: WatchHistoryItemRequestedEvent) => void): void; @@ -701,10 +700,10 @@ declare namespace $app { * @event DiscordPresenceAnimeActivityRequestedEvent * @file internal/discordrpc/presence/hook_events.go * @description - * DiscordPresenceAnimeActivityRequestedEvent is triggered when anime activity is requested, after the [animeActivity] is processed, and right - * before the activity is sent to queue. There is no guarantee as to when or if the activity will be successfully sent to discord. Note that - * this event is triggered every 6 seconds or so, avoid heavy processing or perform it only when the activity is changed. Prevent default to - * stop the activity from being sent to discord. + * DiscordPresenceAnimeActivityRequestedEvent is triggered when anime activity is requested, after the [animeActivity] is processed, and right before the activity is sent to queue. + * There is no guarantee as to when or if the activity will be successfully sent to discord. + * Note that this event is triggered every 6 seconds or so, avoid heavy processing or perform it only when the activity is changed. + * Prevent default to stop the activity from being sent to discord. */ function onDiscordPresenceAnimeActivityRequested(cb: (event: DiscordPresenceAnimeActivityRequestedEvent) => void): void; @@ -742,10 +741,10 @@ declare namespace $app { * @event DiscordPresenceMangaActivityRequestedEvent * @file internal/discordrpc/presence/hook_events.go * @description - * DiscordPresenceMangaActivityRequestedEvent is triggered when manga activity is requested, after the [mangaActivity] is processed, and right - * before the activity is sent to queue. There is no guarantee as to when or if the activity will be successfully sent to discord. Note that - * this event is triggered every 6 seconds or so, avoid heavy processing or perform it only when the activity is changed. Prevent default to - * stop the activity from being sent to discord. + * DiscordPresenceMangaActivityRequestedEvent is triggered when manga activity is requested, after the [mangaActivity] is processed, and right before the activity is sent to queue. + * There is no guarantee as to when or if the activity will be successfully sent to discord. + * Note that this event is triggered every 6 seconds or so, avoid heavy processing or perform it only when the activity is changed. + * Prevent default to stop the activity from being sent to discord. */ function onDiscordPresenceMangaActivityRequested(cb: (event: DiscordPresenceMangaActivityRequestedEvent) => void): void; @@ -819,8 +818,9 @@ declare namespace $app { * @event HydrateOnlinestreamFillerDataRequestedEvent * @file internal/library/fillermanager/hook_events.go * @description - * HydrateOnlinestreamFillerDataRequestedEvent is triggered when the filler manager requests to hydrate the filler data for online streaming - * episodes. This is used by the online streaming episode list. Prevent default to skip the default behavior and return your own data. + * HydrateOnlinestreamFillerDataRequestedEvent is triggered when the filler manager requests to hydrate the filler data for online streaming episodes. + * This is used by the online streaming episode list. + * Prevent default to skip the default behavior and return your own data. */ function onHydrateOnlinestreamFillerDataRequested(cb: (event: HydrateOnlinestreamFillerDataRequestedEvent) => void): void; @@ -1131,9 +1131,9 @@ declare namespace $app { * @file internal/api/metadata/hook_events.go * @description * AnimeEpisodeMetadataEvent is triggered when anime episode metadata is available and is about to be returned. - * In the current implementation, episode metadata is requested for display purposes. It is used to get a more complete metadata object since the - * original AnimeMetadata object is not complete. This event is triggered after [AnimeEpisodeMetadataRequestedEvent]. If the modified episode - * metadata is nil, an empty EpisodeMetadata object will be returned. + * In the current implementation, episode metadata is requested for display purposes. It is used to get a more complete metadata object since the original AnimeMetadata object is not complete. + * This event is triggered after [AnimeEpisodeMetadataRequestedEvent]. + * If the modified episode metadata is nil, an empty EpisodeMetadata object will be returned. */ function onAnimeEpisodeMetadata(cb: (event: AnimeEpisodeMetadataEvent) => void): void; @@ -1500,8 +1500,8 @@ declare namespace $app { * PlaybackLocalFileDetailsRequestedEvent is triggered when the local files details for a specific path are requested. * This event is triggered right after the media player loads an episode. * The playback manager uses the local files details to track the progress, propose next episodes, etc. - * In the current implementation, the details are fetched by selecting the local file from the database and making requests to retrieve the media - * and anime list entry. Prevent default to skip the default fetching and override the details. + * In the current implementation, the details are fetched by selecting the local file from the database and making requests to retrieve the media and anime list entry. + * Prevent default to skip the default fetching and override the details. */ function onPlaybackLocalFileDetailsRequested(cb: (event: PlaybackLocalFileDetailsRequestedEvent) => void): void; @@ -1523,8 +1523,7 @@ declare namespace $app { * @description * PlaybackStreamDetailsRequestedEvent is triggered when the stream details are requested. * Prevent default to skip the default fetching and override the details. - * In the current implementation, the details are fetched by selecting the anime from the anime collection. If nothing is found, the stream is - * still tracked. + * In the current implementation, the details are fetched by selecting the anime from the anime collection. If nothing is found, the stream is still tracked. */ function onPlaybackStreamDetailsRequested(cb: (event: PlaybackStreamDetailsRequestedEvent) => void): void; @@ -1923,6 +1922,7 @@ declare namespace $app { id: number; duration?: number; genres?: Array; + tags?: Array; averageScore?: number; popularity?: number; meanScore?: number; @@ -2127,6 +2127,21 @@ declare namespace $app { id: number; } + /** + * - Filepath: internal/api/anilist/client_gen.go + */ + interface AL_AnimeDetailsById_Media_Tags { + category?: string; + description?: string; + id: number; + isAdult?: boolean; + isGeneralSpoiler?: boolean; + isMediaSpoiler?: boolean; + name: string; + rank?: number; + userId?: number; + } + /** * - Filepath: internal/api/anilist/client_gen.go */ @@ -2161,6 +2176,7 @@ declare namespace $app { meanScore?: number; description?: string; genres?: Array; + tags?: Array; duration?: number; trailer?: AL_BaseAnime_Trailer; title?: AL_BaseAnime_Title; @@ -2207,6 +2223,21 @@ declare namespace $app { day?: number; } + /** + * - Filepath: internal/api/anilist/client_gen.go + */ + interface AL_BaseAnime_Tags { + category?: string; + description?: string; + id: number; + isAdult?: boolean; + isGeneralSpoiler?: boolean; + isMediaSpoiler?: boolean; + name: string; + rank?: number; + userId?: number; + } + /** * - Filepath: internal/api/anilist/client_gen.go */ @@ -3521,7 +3552,7 @@ declare namespace $app { } /** - * - Filepath: internal/continuity/history.go + * - Filepath: ..\internal\continuity\history.go */ export type Continuity_WatchHistory = Record; @@ -3703,12 +3734,12 @@ declare namespace $app { } /** - * - Filepath: internal/manga/download.go + * - Filepath: ..\internal\manga\download.go */ export type Manga_MediaMap = Record; /** - * - Filepath: internal/manga/download.go + * - Filepath: ..\internal\manga\download.go */ export type Manga_ProviderDownloadMap = Record>; diff --git a/internal/handlers/anilist.go b/internal/handlers/anilist.go index 8acadd555..ca5c2ab54 100644 --- a/internal/handlers/anilist.go +++ b/internal/handlers/anilist.go @@ -275,6 +275,7 @@ func (h *Handler) HandleAnilistListAnime(c echo.Context) error { Sort []*anilist.MediaSort `json:"sort,omitempty"` Status []*anilist.MediaStatus `json:"status,omitempty"` Genres []*string `json:"genres,omitempty"` + Tags []*string `json:"tags,omitempty"` AverageScoreGreater *int `json:"averageScore_greater,omitempty"` Season *anilist.MediaSeason `json:"season,omitempty"` SeasonYear *int `json:"seasonYear,omitempty"` @@ -305,6 +306,7 @@ func (h *Handler) HandleAnilistListAnime(c echo.Context) error { p.Sort, p.Status, p.Genres, + p.Tags, p.AverageScoreGreater, p.Season, p.SeasonYear, @@ -326,6 +328,7 @@ func (h *Handler) HandleAnilistListAnime(c echo.Context) error { p.Sort, p.Status, p.Genres, + p.Tags, p.AverageScoreGreater, p.Season, p.SeasonYear, diff --git a/internal/handlers/anime_entries.go b/internal/handlers/anime_entries.go index 28e36cad5..b0f1cd32e 100644 --- a/internal/handlers/anime_entries.go +++ b/internal/handlers/anime_entries.go @@ -326,6 +326,7 @@ func (h *Handler) HandleFetchAnimeEntrySuggestions(c echo.Context) error { nil, nil, nil, + nil, h.App.Logger, h.App.GetUserAnilistToken(), ) diff --git a/internal/platforms/shared_platform/cachelayer.go b/internal/platforms/shared_platform/cachelayer.go index a36f2c351..f13f837d8 100644 --- a/internal/platforms/shared_platform/cachelayer.go +++ b/internal/platforms/shared_platform/cachelayer.go @@ -885,10 +885,10 @@ func (c *CacheLayer) AnimeDetailsByID(ctx context.Context, id *int, interceptors return result, err } -func (c *CacheLayer) ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*anilist.MediaSort, status []*anilist.MediaStatus, genres []*string, averageScoreGreater *int, season *anilist.MediaSeason, seasonYear *int, format *anilist.MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*anilist.ListAnime, error) { +func (c *CacheLayer) ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*anilist.MediaSort, status []*anilist.MediaStatus, genres []*string, tags []*string, averageScoreGreater *int, season *anilist.MediaSeason, seasonYear *int, format *anilist.MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*anilist.ListAnime, error) { cacheKey := c.generateCacheKey(page, search, perPage, sort, status, genres, averageScoreGreater, season, seasonYear, format, isAdult) return networkFirstGetWithBoundedCache(c, ListAnimeBucket, cacheKey, func() (*anilist.ListAnime, error) { - return c.anilistClientRef.Get().ListAnime(ctx, page, search, perPage, sort, status, genres, averageScoreGreater, season, seasonYear, format, isAdult, interceptors...) + return c.anilistClientRef.Get().ListAnime(ctx, page, search, perPage, sort, status, genres, tags, averageScoreGreater, season, seasonYear, format, isAdult, interceptors...) }) } diff --git a/internal/plugin/anilist.go b/internal/plugin/anilist.go index eaf1ef021..72bf1f64c 100644 --- a/internal/plugin/anilist.go +++ b/internal/plugin/anilist.go @@ -79,8 +79,8 @@ func (a *AppContextImpl) BindAnilist(vm *goja.Runtime, logger *zerolog.Logger, e _ = anilistObj.Set("getStudioDetails", func(studioID int) (*anilist.StudioDetails, error) { return anilistPlatformRef.Get().GetStudioDetails(context.Background(), studioID) }) - _ = anilistObj.Set("listAnime", func(page *int, search *string, perPage *int, sort []*anilist.MediaSort, status []*anilist.MediaStatus, genres []*string, averageScoreGreater *int, season *anilist.MediaSeason, seasonYear *int, format *anilist.MediaFormat, isAdult *bool) (*anilist.ListAnime, error) { - return anilistPlatformRef.Get().GetAnilistClient().ListAnime(context.Background(), page, search, perPage, sort, status, genres, averageScoreGreater, season, seasonYear, format, isAdult) + _ = anilistObj.Set("listAnime", func(page *int, search *string, perPage *int, sort []*anilist.MediaSort, status []*anilist.MediaStatus, genres []*string, tags []*string, averageScoreGreater *int, season *anilist.MediaSeason, seasonYear *int, format *anilist.MediaFormat, isAdult *bool) (*anilist.ListAnime, error) { + return anilistPlatformRef.Get().GetAnilistClient().ListAnime(context.Background(), page, search, perPage, sort, status, genres, tags, averageScoreGreater, season, seasonYear, format, isAdult) }) _ = anilistObj.Set("listManga", func(page *int, search *string, perPage *int, sort []*anilist.MediaSort, status []*anilist.MediaStatus, genres []*string, averageScoreGreater *int, startDateGreater *string, startDateLesser *string, format *anilist.MediaFormat, countryOfOrigin *string, isAdult *bool) (*anilist.ListManga, error) { return anilistPlatformRef.Get().GetAnilistClient().ListManga(context.Background(), page, search, perPage, sort, status, genres, averageScoreGreater, startDateGreater, startDateLesser, format, countryOfOrigin, isAdult) diff --git a/seanime-web/src/api/generated/endpoint.types.ts b/seanime-web/src/api/generated/endpoint.types.ts index 09e11a77f..1144fe790 100644 --- a/seanime-web/src/api/generated/endpoint.types.ts +++ b/seanime-web/src/api/generated/endpoint.types.ts @@ -3,6 +3,7 @@ import type { AL_AiringSort, AL_BaseAnime, + AL_BaseAnime_Tags, AL_FuzzyDateInput, AL_MediaFormat, AL_MediaListStatus, @@ -15,9 +16,9 @@ import type { Anime_PlaylistEpisode, ChapterDownloader_DownloadID, Continuity_UpdateWatchHistoryItemOptions, - Debrid_TorrentItem, DebridClient_CancelStreamOptions, DebridClient_StreamPlaybackType, + Debrid_TorrentItem, HibikeTorrent_AnimeTorrent, HibikeTorrent_BatchEpisodeFiles, LibraryExplorer_SuperUpdateFileOptions, @@ -119,6 +120,7 @@ export type AnilistListAnime_Variables = { sort?: Array status?: Array genres?: Array + tags?: Array averageScore_greater?: number season?: AL_MediaSeason seasonYear?: number @@ -1961,7 +1963,7 @@ export type TorrentClientAddMagnetFromRule_Variables = { export type SearchTorrent_Variables = { /** * "smart" or "simple" - * + * * "smart" or "simple" */ type?: string @@ -2034,7 +2036,7 @@ export type TorrentstreamStartStream_Variables = { batchEpisodeFiles?: HibikeTorrent_BatchEpisodeFiles /** * Preload is true if the stream should only be prepared. - * + * * Preload is true if the stream should only be prepared. */ preload?: boolean diff --git a/seanime-web/src/api/generated/endpoints.ts b/seanime-web/src/api/generated/endpoints.ts index bb93dd1cf..dd1c48787 100644 --- a/seanime-web/src/api/generated/endpoints.ts +++ b/seanime-web/src/api/generated/endpoints.ts @@ -1,9 +1,9 @@ // This code was generated by codegen/main.go. DO NOT EDIT. export type ApiEndpoints = Record> export const API_ENDPOINTS = { @@ -1639,8 +1639,8 @@ export const API_ENDPOINTS = { * Route returns the episode list for the given media and provider. * It returns the episode list for the given media and provider. * The episodes are cached using a file cache. - * The episode list is just a list of episodes with no video sources, it's what the client uses to display the episodes and subsequently - * fetch the sources. The episode list might be nil or empty if nothing could be found, but the media will always be returned. + * The episode list is just a list of episodes with no video sources, it's what the client uses to display the episodes and subsequently fetch the sources. + * The episode list might be nil or empty if nothing could be found, but the media will always be returned. */ GetOnlineStreamEpisodeList: { key: "ONLINESTREAM-get-online-stream-episode-list", diff --git a/seanime-web/src/api/generated/types.ts b/seanime-web/src/api/generated/types.ts index 173691d03..f41408bfc 100644 --- a/seanime-web/src/api/generated/types.ts +++ b/seanime-web/src/api/generated/types.ts @@ -102,6 +102,7 @@ export type AL_AnimeDetailsById_Media = { id: number duration?: number genres?: Array + tags?: Array averageScore?: number popularity?: number meanScore?: number @@ -348,6 +349,23 @@ export type AL_AnimeDetailsById_Media_Studios_Nodes = { id: number } +/** + * - Filepath: internal/api/anilist/client_gen.go + * - Filename: client_gen.go + * - Package: anilist + */ +export type AL_AnimeDetailsById_Media_Tags = { + category?: string + description?: string + id: number + isAdult?: boolean + isGeneralSpoiler?: boolean + isMediaSpoiler?: boolean + name: string + rank?: number + userId?: number +} + /** * - Filepath: internal/api/anilist/client_gen.go * - Filename: client_gen.go @@ -407,6 +425,7 @@ export type AL_BaseAnime = { meanScore?: number description?: string genres?: Array + tags?: Array duration?: number trailer?: AL_BaseAnime_Trailer title?: AL_BaseAnime_Title @@ -461,6 +480,23 @@ export type AL_BaseAnime_StartDate = { day?: number } +/** + * - Filepath: internal/api/anilist/client_gen.go + * - Filename: client_gen.go + * - Package: anilist + */ +export type AL_BaseAnime_Tags = { + category?: string + description?: string + id: number + isAdult?: boolean + isGeneralSpoiler?: boolean + isMediaSpoiler?: boolean + name: string + rank?: number + userId?: number +} + /** * - Filepath: internal/api/anilist/client_gen.go * - Filename: client_gen.go @@ -1931,7 +1967,7 @@ export type Continuity_UpdateWatchHistoryItemOptions = { } /** - * - Filepath: internal/continuity/history.go + * - Filepath: ..\internal\continuity\history.go * - Filename: history.go * - Package: continuity */ @@ -3327,7 +3363,7 @@ export type Manga_PageDimension = { } /** - * - Filepath: internal/manga/download.go + * - Filepath: ..\internal\manga\download.go * - Filename: download.go * - Package: manga */ @@ -3785,14 +3821,14 @@ export type Models_HomeItem = { } /** - * - Filepath: internal/database/models/models.go + * - Filepath: ..\internal\database\models\models.go * - Filename: models.go * - Package: models */ export type Models_IntSlice = Array /** - * - Filepath: internal/database/models/models.go + * - Filepath: ..\internal\database\models\models.go * - Filename: models.go * - Package: models */ @@ -3978,7 +4014,7 @@ export type Models_SilencedMediaEntry = { } /** - * - Filepath: internal/database/models/models.go + * - Filepath: ..\internal\database\models\models.go * - Filename: models.go * - Package: models */ @@ -4140,7 +4176,7 @@ export type Nakama_NakamaAnimeLibrary = { } /** - * - Filepath: internal/nakama/share.go + * - Filepath: ..\internal\nakama\share.go * - Filename: share.go * - Package: nakama */ diff --git a/seanime-web/src/app/(main)/_features/plugin/generated/plugin-events.ts b/seanime-web/src/app/(main)/_features/plugin/generated/plugin-events.ts index b2b9e00a2..7ea527668 100644 --- a/seanime-web/src/app/(main)/_features/plugin/generated/plugin-events.ts +++ b/seanime-web/src/app/(main)/_features/plugin/generated/plugin-events.ts @@ -1,6 +1,6 @@ // This file is auto-generated. Do not edit. -import { useWebsocketPluginMessageListener, useWebsocketSender } from "@/app/(main)/_hooks/handle-websockets" -import { useCallback } from "react" + import { useWebsocketPluginMessageListener, useWebsocketSender } from "@/app/(main)/_hooks/handle-websockets" + import { useCallback } from "react" export enum PluginClientEvents { RenderTray = "tray:render", @@ -88,7 +88,8 @@ export enum PluginServerEvents { // Client to server ///////////////////////////////////////////////////////////////////////////////////// -export type Plugin_Client_RenderTrayEventPayload = {} +export type Plugin_Client_RenderTrayEventPayload = { +} export function usePluginSendRenderTrayEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -102,7 +103,8 @@ export function usePluginSendRenderTrayEvent() { } } -export type Plugin_Client_ListTrayIconsEventPayload = {} +export type Plugin_Client_ListTrayIconsEventPayload = { +} export function usePluginSendListTrayIconsEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -116,7 +118,8 @@ export function usePluginSendListTrayIconsEvent() { } } -export type Plugin_Client_TrayOpenedEventPayload = {} +export type Plugin_Client_TrayOpenedEventPayload = { +} export function usePluginSendTrayOpenedEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -130,7 +133,8 @@ export function usePluginSendTrayOpenedEvent() { } } -export type Plugin_Client_TrayClosedEventPayload = {} +export type Plugin_Client_TrayClosedEventPayload = { +} export function usePluginSendTrayClosedEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -144,7 +148,8 @@ export function usePluginSendTrayClosedEvent() { } } -export type Plugin_Client_TrayClickedEventPayload = {} +export type Plugin_Client_TrayClickedEventPayload = { +} export function usePluginSendTrayClickedEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -158,7 +163,8 @@ export function usePluginSendTrayClickedEvent() { } } -export type Plugin_Client_WebviewSidebarMountedEventPayload = {} +export type Plugin_Client_WebviewSidebarMountedEventPayload = { +} export function usePluginSendWebviewSidebarMountedEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -238,7 +244,8 @@ export function usePluginSendWebviewPostMessageEvent() { } } -export type Plugin_Client_ListCommandPalettesEventPayload = {} +export type Plugin_Client_ListCommandPalettesEventPayload = { +} export function usePluginSendListCommandPalettesEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -252,7 +259,8 @@ export function usePluginSendListCommandPalettesEvent() { } } -export type Plugin_Client_CommandPaletteOpenedEventPayload = {} +export type Plugin_Client_CommandPaletteOpenedEventPayload = { +} export function usePluginSendCommandPaletteOpenedEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -266,7 +274,8 @@ export function usePluginSendCommandPaletteOpenedEvent() { } } -export type Plugin_Client_CommandPaletteClosedEventPayload = {} +export type Plugin_Client_CommandPaletteClosedEventPayload = { +} export function usePluginSendCommandPaletteClosedEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -280,7 +289,8 @@ export function usePluginSendCommandPaletteClosedEvent() { } } -export type Plugin_Client_RenderCommandPaletteEventPayload = {} +export type Plugin_Client_RenderCommandPaletteEventPayload = { +} export function usePluginSendRenderCommandPaletteEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -326,14 +336,13 @@ export function usePluginSendCommandPaletteItemSelectedEvent() { } } -export type Plugin_Client_ActionRenderAnimePageButtonsEventPayload = {} +export type Plugin_Client_ActionRenderAnimePageButtonsEventPayload = { +} export function usePluginSendActionRenderAnimePageButtonsEvent() { const { sendPluginMessage } = useWebsocketSender() - const sendActionRenderAnimePageButtonsEvent = useCallback((payload: Plugin_Client_ActionRenderAnimePageButtonsEventPayload, - extensionID?: string, - ) => { + const sendActionRenderAnimePageButtonsEvent = useCallback((payload: Plugin_Client_ActionRenderAnimePageButtonsEventPayload, extensionID?: string) => { sendPluginMessage(PluginClientEvents.ActionRenderAnimePageButtons, payload, extensionID) }, []) @@ -342,14 +351,13 @@ export function usePluginSendActionRenderAnimePageButtonsEvent() { } } -export type Plugin_Client_ActionRenderAnimePageDropdownItemsEventPayload = {} +export type Plugin_Client_ActionRenderAnimePageDropdownItemsEventPayload = { +} export function usePluginSendActionRenderAnimePageDropdownItemsEvent() { const { sendPluginMessage } = useWebsocketSender() - const sendActionRenderAnimePageDropdownItemsEvent = useCallback((payload: Plugin_Client_ActionRenderAnimePageDropdownItemsEventPayload, - extensionID?: string, - ) => { + const sendActionRenderAnimePageDropdownItemsEvent = useCallback((payload: Plugin_Client_ActionRenderAnimePageDropdownItemsEventPayload, extensionID?: string) => { sendPluginMessage(PluginClientEvents.ActionRenderAnimePageDropdownItems, payload, extensionID) }, []) @@ -358,14 +366,13 @@ export function usePluginSendActionRenderAnimePageDropdownItemsEvent() { } } -export type Plugin_Client_ActionRenderMangaPageButtonsEventPayload = {} +export type Plugin_Client_ActionRenderMangaPageButtonsEventPayload = { +} export function usePluginSendActionRenderMangaPageButtonsEvent() { const { sendPluginMessage } = useWebsocketSender() - const sendActionRenderMangaPageButtonsEvent = useCallback((payload: Plugin_Client_ActionRenderMangaPageButtonsEventPayload, - extensionID?: string, - ) => { + const sendActionRenderMangaPageButtonsEvent = useCallback((payload: Plugin_Client_ActionRenderMangaPageButtonsEventPayload, extensionID?: string) => { sendPluginMessage(PluginClientEvents.ActionRenderMangaPageButtons, payload, extensionID) }, []) @@ -374,14 +381,13 @@ export function usePluginSendActionRenderMangaPageButtonsEvent() { } } -export type Plugin_Client_ActionRenderMediaCardContextMenuItemsEventPayload = {} +export type Plugin_Client_ActionRenderMediaCardContextMenuItemsEventPayload = { +} export function usePluginSendActionRenderMediaCardContextMenuItemsEvent() { const { sendPluginMessage } = useWebsocketSender() - const sendActionRenderMediaCardContextMenuItemsEvent = useCallback((payload: Plugin_Client_ActionRenderMediaCardContextMenuItemsEventPayload, - extensionID?: string, - ) => { + const sendActionRenderMediaCardContextMenuItemsEvent = useCallback((payload: Plugin_Client_ActionRenderMediaCardContextMenuItemsEventPayload, extensionID?: string) => { sendPluginMessage(PluginClientEvents.ActionRenderMediaCardContextMenuItems, payload, extensionID) }, []) @@ -390,14 +396,13 @@ export function usePluginSendActionRenderMediaCardContextMenuItemsEvent() { } } -export type Plugin_Client_ActionRenderAnimeLibraryDropdownItemsEventPayload = {} +export type Plugin_Client_ActionRenderAnimeLibraryDropdownItemsEventPayload = { +} export function usePluginSendActionRenderAnimeLibraryDropdownItemsEvent() { const { sendPluginMessage } = useWebsocketSender() - const sendActionRenderAnimeLibraryDropdownItemsEvent = useCallback((payload: Plugin_Client_ActionRenderAnimeLibraryDropdownItemsEventPayload, - extensionID?: string, - ) => { + const sendActionRenderAnimeLibraryDropdownItemsEvent = useCallback((payload: Plugin_Client_ActionRenderAnimeLibraryDropdownItemsEventPayload, extensionID?: string) => { sendPluginMessage(PluginClientEvents.ActionRenderAnimeLibraryDropdownItems, payload, extensionID) }, []) @@ -406,14 +411,13 @@ export function usePluginSendActionRenderAnimeLibraryDropdownItemsEvent() { } } -export type Plugin_Client_ActionRenderEpisodeCardContextMenuItemsEventPayload = {} +export type Plugin_Client_ActionRenderEpisodeCardContextMenuItemsEventPayload = { +} export function usePluginSendActionRenderEpisodeCardContextMenuItemsEvent() { const { sendPluginMessage } = useWebsocketSender() - const sendActionRenderEpisodeCardContextMenuItemsEvent = useCallback((payload: Plugin_Client_ActionRenderEpisodeCardContextMenuItemsEventPayload, - extensionID?: string, - ) => { + const sendActionRenderEpisodeCardContextMenuItemsEvent = useCallback((payload: Plugin_Client_ActionRenderEpisodeCardContextMenuItemsEventPayload, extensionID?: string) => { sendPluginMessage(PluginClientEvents.ActionRenderEpisodeCardContextMenuItems, payload, extensionID) }, []) @@ -422,14 +426,13 @@ export function usePluginSendActionRenderEpisodeCardContextMenuItemsEvent() { } } -export type Plugin_Client_ActionRenderEpisodeGridItemMenuItemsEventPayload = {} +export type Plugin_Client_ActionRenderEpisodeGridItemMenuItemsEventPayload = { +} export function usePluginSendActionRenderEpisodeGridItemMenuItemsEvent() { const { sendPluginMessage } = useWebsocketSender() - const sendActionRenderEpisodeGridItemMenuItemsEvent = useCallback((payload: Plugin_Client_ActionRenderEpisodeGridItemMenuItemsEventPayload, - extensionID?: string, - ) => { + const sendActionRenderEpisodeGridItemMenuItemsEvent = useCallback((payload: Plugin_Client_ActionRenderEpisodeGridItemMenuItemsEventPayload, extensionID?: string) => { sendPluginMessage(PluginClientEvents.ActionRenderEpisodeGridItemMenuItems, payload, extensionID) }, []) @@ -644,7 +647,8 @@ export function usePluginSendDOMEventTriggeredEvent() { } } -export type Plugin_Client_DOMReadyEventPayload = {} +export type Plugin_Client_DOMReadyEventPayload = { +} export function usePluginSendDOMReadyEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -658,7 +662,8 @@ export function usePluginSendDOMReadyEvent() { } } -export type Plugin_Client_DOMMainTabReadyEventPayload = {} +export type Plugin_Client_DOMMainTabReadyEventPayload = { +} export function usePluginSendDOMMainTabReadyEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -697,9 +702,7 @@ export type Plugin_Server_TrayUpdatedEventPayload = { components: any } -export function usePluginListenTrayUpdatedEvent(cb: (payload: Plugin_Server_TrayUpdatedEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenTrayUpdatedEvent(cb: (payload: Plugin_Server_TrayUpdatedEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.TrayUpdated, @@ -733,9 +736,7 @@ export type Plugin_Server_TrayBadgeUpdatedEventPayload = { badgeIntent: string } -export function usePluginListenTrayBadgeUpdatedEvent(cb: (payload: Plugin_Server_TrayBadgeUpdatedEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenTrayBadgeUpdatedEvent(cb: (payload: Plugin_Server_TrayBadgeUpdatedEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.TrayBadgeUpdated, @@ -772,9 +773,7 @@ export type Plugin_Server_WebviewUpdatedEventPayload = { components: any } -export function usePluginListenWebviewUpdatedEvent(cb: (payload: Plugin_Server_WebviewUpdatedEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenWebviewUpdatedEvent(cb: (payload: Plugin_Server_WebviewUpdatedEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.WebviewUpdated, @@ -789,9 +788,7 @@ export type Plugin_Server_WebviewIframeEventPayload = { options: any } -export function usePluginListenWebviewIframeEvent(cb: (payload: Plugin_Server_WebviewIframeEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenWebviewIframeEvent(cb: (payload: Plugin_Server_WebviewIframeEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.WebviewIframe, @@ -804,9 +801,7 @@ export type Plugin_Server_WebviewSidebarEventPayload = { icon: string } -export function usePluginListenWebviewSidebarEvent(cb: (payload: Plugin_Server_WebviewSidebarEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenWebviewSidebarEvent(cb: (payload: Plugin_Server_WebviewSidebarEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.WebviewSidebar, @@ -821,9 +816,7 @@ export type Plugin_Server_WebviewSyncStateEventPayload = { token: string } -export function usePluginListenWebviewSyncStateEvent(cb: (payload: Plugin_Server_WebviewSyncStateEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenWebviewSyncStateEvent(cb: (payload: Plugin_Server_WebviewSyncStateEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.WebviewSyncState, @@ -835,9 +828,7 @@ export type Plugin_Server_WebviewCloseEventPayload = { webviewId: string } -export function usePluginListenWebviewCloseEvent(cb: (payload: Plugin_Server_WebviewCloseEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenWebviewCloseEvent(cb: (payload: Plugin_Server_WebviewCloseEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.WebviewClose, @@ -850,9 +841,7 @@ export type Plugin_Server_CommandPaletteInfoEventPayload = { keyboardShortcut: string } -export function usePluginListenCommandPaletteInfoEvent(cb: (payload: Plugin_Server_CommandPaletteInfoEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenCommandPaletteInfoEvent(cb: (payload: Plugin_Server_CommandPaletteInfoEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.CommandPaletteInfo, @@ -865,9 +854,7 @@ export type Plugin_Server_CommandPaletteUpdatedEventPayload = { items: any } -export function usePluginListenCommandPaletteUpdatedEvent(cb: (payload: Plugin_Server_CommandPaletteUpdatedEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenCommandPaletteUpdatedEvent(cb: (payload: Plugin_Server_CommandPaletteUpdatedEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.CommandPaletteUpdated, @@ -875,11 +862,10 @@ export function usePluginListenCommandPaletteUpdatedEvent(cb: (payload: Plugin_S }) } -export type Plugin_Server_CommandPaletteOpenEventPayload = {} +export type Plugin_Server_CommandPaletteOpenEventPayload = { +} -export function usePluginListenCommandPaletteOpenEvent(cb: (payload: Plugin_Server_CommandPaletteOpenEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenCommandPaletteOpenEvent(cb: (payload: Plugin_Server_CommandPaletteOpenEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.CommandPaletteOpen, @@ -887,11 +873,10 @@ export function usePluginListenCommandPaletteOpenEvent(cb: (payload: Plugin_Serv }) } -export type Plugin_Server_CommandPaletteCloseEventPayload = {} +export type Plugin_Server_CommandPaletteCloseEventPayload = { +} -export function usePluginListenCommandPaletteCloseEvent(cb: (payload: Plugin_Server_CommandPaletteCloseEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenCommandPaletteCloseEvent(cb: (payload: Plugin_Server_CommandPaletteCloseEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.CommandPaletteClose, @@ -899,11 +884,10 @@ export function usePluginListenCommandPaletteCloseEvent(cb: (payload: Plugin_Ser }) } -export type Plugin_Server_CommandPaletteGetInputEventPayload = {} +export type Plugin_Server_CommandPaletteGetInputEventPayload = { +} -export function usePluginListenCommandPaletteGetInputEvent(cb: (payload: Plugin_Server_CommandPaletteGetInputEventPayload, - extensionId: string, -) => void, extensionID: string) { +export function usePluginListenCommandPaletteGetInputEvent(cb: (payload: Plugin_Server_CommandPaletteGetInputEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.CommandPaletteGetInput, @@ -915,9 +899,7 @@ export type Plugin_Server_CommandPaletteSetInputEventPayload = { value: string } -export function usePluginListenCommandPaletteSetInputEvent(cb: (payload: Plugin_Server_CommandPaletteSetInputEventPayload, - extensionId: string, -) => void, extensionID: string) { +export function usePluginListenCommandPaletteSetInputEvent(cb: (payload: Plugin_Server_CommandPaletteSetInputEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.CommandPaletteSetInput, @@ -929,9 +911,7 @@ export type Plugin_Server_ActionRenderAnimePageButtonsEventPayload = { buttons: any } -export function usePluginListenActionRenderAnimePageButtonsEvent(cb: (payload: Plugin_Server_ActionRenderAnimePageButtonsEventPayload, - extensionId: string, -) => void, extensionID: string) { +export function usePluginListenActionRenderAnimePageButtonsEvent(cb: (payload: Plugin_Server_ActionRenderAnimePageButtonsEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.ActionRenderAnimePageButtons, @@ -943,9 +923,7 @@ export type Plugin_Server_ActionRenderAnimePageDropdownItemsEventPayload = { items: any } -export function usePluginListenActionRenderAnimePageDropdownItemsEvent(cb: (payload: Plugin_Server_ActionRenderAnimePageDropdownItemsEventPayload, - extensionId: string, -) => void, extensionID: string) { +export function usePluginListenActionRenderAnimePageDropdownItemsEvent(cb: (payload: Plugin_Server_ActionRenderAnimePageDropdownItemsEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.ActionRenderAnimePageDropdownItems, @@ -957,9 +935,7 @@ export type Plugin_Server_ActionRenderMangaPageButtonsEventPayload = { buttons: any } -export function usePluginListenActionRenderMangaPageButtonsEvent(cb: (payload: Plugin_Server_ActionRenderMangaPageButtonsEventPayload, - extensionId: string, -) => void, extensionID: string) { +export function usePluginListenActionRenderMangaPageButtonsEvent(cb: (payload: Plugin_Server_ActionRenderMangaPageButtonsEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.ActionRenderMangaPageButtons, @@ -971,9 +947,7 @@ export type Plugin_Server_ActionRenderMediaCardContextMenuItemsEventPayload = { items: any } -export function usePluginListenActionRenderMediaCardContextMenuItemsEvent(cb: (payload: Plugin_Server_ActionRenderMediaCardContextMenuItemsEventPayload, - extensionId: string, -) => void, extensionID: string) { +export function usePluginListenActionRenderMediaCardContextMenuItemsEvent(cb: (payload: Plugin_Server_ActionRenderMediaCardContextMenuItemsEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.ActionRenderMediaCardContextMenuItems, @@ -985,9 +959,7 @@ export type Plugin_Server_ActionRenderEpisodeCardContextMenuItemsEventPayload = items: any } -export function usePluginListenActionRenderEpisodeCardContextMenuItemsEvent(cb: (payload: Plugin_Server_ActionRenderEpisodeCardContextMenuItemsEventPayload, - extensionId: string, -) => void, extensionID: string) { +export function usePluginListenActionRenderEpisodeCardContextMenuItemsEvent(cb: (payload: Plugin_Server_ActionRenderEpisodeCardContextMenuItemsEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.ActionRenderEpisodeCardContextMenuItems, @@ -999,9 +971,7 @@ export type Plugin_Server_ActionRenderEpisodeGridItemMenuItemsEventPayload = { items: any } -export function usePluginListenActionRenderEpisodeGridItemMenuItemsEvent(cb: (payload: Plugin_Server_ActionRenderEpisodeGridItemMenuItemsEventPayload, - extensionId: string, -) => void, extensionID: string) { +export function usePluginListenActionRenderEpisodeGridItemMenuItemsEvent(cb: (payload: Plugin_Server_ActionRenderEpisodeGridItemMenuItemsEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.ActionRenderEpisodeGridItemMenuItems, @@ -1013,9 +983,7 @@ export type Plugin_Server_ActionRenderAnimeLibraryDropdownItemsEventPayload = { items: any } -export function usePluginListenActionRenderAnimeLibraryDropdownItemsEvent(cb: (payload: Plugin_Server_ActionRenderAnimeLibraryDropdownItemsEventPayload, - extensionId: string, -) => void, extensionID: string) { +export function usePluginListenActionRenderAnimeLibraryDropdownItemsEvent(cb: (payload: Plugin_Server_ActionRenderAnimeLibraryDropdownItemsEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.ActionRenderAnimeLibraryDropdownItems, @@ -1041,9 +1009,7 @@ export type Plugin_Server_FormSetValuesEventPayload = { data: Record } -export function usePluginListenFormSetValuesEvent(cb: (payload: Plugin_Server_FormSetValuesEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenFormSetValuesEvent(cb: (payload: Plugin_Server_FormSetValuesEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.FormSetValues, @@ -1056,9 +1022,7 @@ export type Plugin_Server_FieldRefSetValueEventPayload = { value: any } -export function usePluginListenFieldRefSetValueEvent(cb: (payload: Plugin_Server_FieldRefSetValueEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenFieldRefSetValueEvent(cb: (payload: Plugin_Server_FieldRefSetValueEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.FieldRefSetValue, @@ -1070,9 +1034,7 @@ export type Plugin_Server_FatalErrorEventPayload = { error: string } -export function usePluginListenFatalErrorEvent(cb: (payload: Plugin_Server_FatalErrorEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenFatalErrorEvent(cb: (payload: Plugin_Server_FatalErrorEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.FatalError, @@ -1084,9 +1046,7 @@ export type Plugin_Server_ScreenNavigateToEventPayload = { path: string } -export function usePluginListenScreenNavigateToEvent(cb: (payload: Plugin_Server_ScreenNavigateToEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenScreenNavigateToEvent(cb: (payload: Plugin_Server_ScreenNavigateToEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.ScreenNavigateTo, @@ -1094,11 +1054,10 @@ export function usePluginListenScreenNavigateToEvent(cb: (payload: Plugin_Server }) } -export type Plugin_Server_ScreenReloadEventPayload = {} +export type Plugin_Server_ScreenReloadEventPayload = { +} -export function usePluginListenScreenReloadEvent(cb: (payload: Plugin_Server_ScreenReloadEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenScreenReloadEvent(cb: (payload: Plugin_Server_ScreenReloadEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.ScreenReload, @@ -1106,11 +1065,10 @@ export function usePluginListenScreenReloadEvent(cb: (payload: Plugin_Server_Scr }) } -export type Plugin_Server_ScreenGetCurrentEventPayload = {} +export type Plugin_Server_ScreenGetCurrentEventPayload = { +} -export function usePluginListenScreenGetCurrentEvent(cb: (payload: Plugin_Server_ScreenGetCurrentEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenScreenGetCurrentEvent(cb: (payload: Plugin_Server_ScreenGetCurrentEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.ScreenGetCurrent, @@ -1142,9 +1100,7 @@ export type Plugin_Server_DOMQueryOneEventPayload = { identifyChildren: boolean } -export function usePluginListenDOMQueryOneEvent(cb: (payload: Plugin_Server_DOMQueryOneEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenDOMQueryOneEvent(cb: (payload: Plugin_Server_DOMQueryOneEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.DOMQueryOne, @@ -1160,9 +1116,7 @@ export type Plugin_Server_DOMObserveEventPayload = { identifyChildren: boolean } -export function usePluginListenDOMObserveEvent(cb: (payload: Plugin_Server_DOMObserveEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenDOMObserveEvent(cb: (payload: Plugin_Server_DOMObserveEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.DOMObserve, @@ -1174,9 +1128,7 @@ export type Plugin_Server_DOMStopObserveEventPayload = { observerId: string } -export function usePluginListenDOMStopObserveEvent(cb: (payload: Plugin_Server_DOMStopObserveEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenDOMStopObserveEvent(cb: (payload: Plugin_Server_DOMStopObserveEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.DOMStopObserve, @@ -1204,9 +1156,7 @@ export type Plugin_Server_DOMManipulateEventPayload = { requestId: string } -export function usePluginListenDOMManipulateEvent(cb: (payload: Plugin_Server_DOMManipulateEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenDOMManipulateEvent(cb: (payload: Plugin_Server_DOMManipulateEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.DOMManipulate, @@ -1223,9 +1173,7 @@ export type Plugin_Server_DOMObserveInViewEventPayload = { margin: string } -export function usePluginListenDOMObserveInViewEvent(cb: (payload: Plugin_Server_DOMObserveInViewEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenDOMObserveInViewEvent(cb: (payload: Plugin_Server_DOMObserveInViewEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.DOMObserveInView, @@ -1235,9 +1183,7 @@ export function usePluginListenDOMObserveInViewEvent(cb: (payload: Plugin_Server export type Plugin_Server_DOMGetViewportSizeEventPayload = {} -export function usePluginListenDOMGetViewportSizeEvent(cb: (payload: Plugin_Server_DOMGetViewportSizeEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenDOMGetViewportSizeEvent(cb: (payload: Plugin_Server_DOMGetViewportSizeEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.DOMGetViewportSize, diff --git a/seanime-web/src/app/(main)/search/_components/advanced-search-options.tsx b/seanime-web/src/app/(main)/search/_components/advanced-search-options.tsx index fcd38fe7a..32e37965f 100644 --- a/seanime-web/src/app/(main)/search/_components/advanced-search-options.tsx +++ b/seanime-web/src/app/(main)/search/_components/advanced-search-options.tsx @@ -9,6 +9,7 @@ import { ADVANCED_SEARCH_SORTING_MANGA, ADVANCED_SEARCH_STATUS, ADVANCED_SEARCH_TYPE, + ADVANCED_SEARCH_MEDIA_TAGS } from "@/app/(main)/search/_lib/advanced-search-constants" import { __advancedSearch_paramsAtom } from "@/app/(main)/search/_lib/advanced-search.atoms" import { AppLayoutStack } from "@/components/ui/app-layout" @@ -43,7 +44,8 @@ export function AdvancedSearchOptions() { (params.genre === null || !params.genre.length) && (params.status === null || !params.status.length) && params.format === null && params.season === null && params.year === null && params.isAdult === false && params.minScore === null && - (params.countryOfOrigin === null || params.type === "anime")) + (params.countryOfOrigin === null || params.type === "anime")) && + (params.tags === null || !params.tags.length) }, [params]) return ( @@ -90,6 +92,18 @@ export function AdvancedSearchOptions() { })} fieldLabelClass="hidden" /> + ({ value: tag.name, label: tag.name, textValue: tag.name }))} + value={params.tags ? params.tags : []} + onValueChange={v => setParams(draft => { + draft.tags = v + return + })} + fieldLabelClass="hidden" + /> {params.type === "anime" && } diff --git a/seanime-web/src/lib/helpers/filtering.ts b/seanime-web/src/lib/helpers/filtering.ts index aed46edba..f3ce86573 100644 --- a/seanime-web/src/lib/helpers/filtering.ts +++ b/seanime-web/src/lib/helpers/filtering.ts @@ -107,6 +107,7 @@ export type CollectionType = "anime" | "manga" export type CollectionParams = { sorting: CollectionSorting genre: string[] | null + tags: string[] | null status: AL_MediaStatus | null format: AL_MediaFormat | null season: AL_MediaSeason | null @@ -122,6 +123,7 @@ export type CollectionParams = { export const DEFAULT_COLLECTION_PARAMS: CollectionParams<"anime"> = { sorting: "SCORE_DESC", genre: null, + tags: null, status: null, format: null, season: null, @@ -133,6 +135,7 @@ export const DEFAULT_COLLECTION_PARAMS: CollectionParams<"anime"> = { export const DEFAULT_ANIME_COLLECTION_PARAMS: CollectionParams<"anime"> = { sorting: "SCORE_DESC", genre: null, + tags: null, status: null, format: null, season: null, @@ -144,6 +147,7 @@ export const DEFAULT_ANIME_COLLECTION_PARAMS: CollectionParams<"anime"> = { export const DEFAULT_MANGA_COLLECTION_PARAMS: CollectionParams<"manga"> = { sorting: "SCORE_DESC", genre: null, + tags: null, status: null, format: null, season: null, @@ -214,6 +218,13 @@ export function filterListEntries { + const tags = n.media?.tags?.map(t => t.name) ?? [] + return params.tags?.every(tag => tags.includes(tag)) + }) + } + // Initial sort by name arr = sortBy(arr, n => n?.media?.title?.userPreferred).reverse() From 9f434585244d36c1d6474d9ebdec4919ad4a0d31 Mon Sep 17 00:00:00 2001 From: csylwip Date: Sat, 7 Feb 2026 10:24:54 +0200 Subject: [PATCH 08/14] Added tags to baseAnime --- internal/api/anilist/client_gen.go | 1006 +++++++++++++++++ internal/api/anilist/queries/anime.graphql | 22 + .../anilist_platform/anilist_platform.go | 3 + 3 files changed, 1031 insertions(+) diff --git a/internal/api/anilist/client_gen.go b/internal/api/anilist/client_gen.go index 123335e8d..aaae5a706 100644 --- a/internal/api/anilist/client_gen.go +++ b/internal/api/anilist/client_gen.go @@ -60,6 +60,7 @@ type BaseAnime struct { MeanScore *int "json:\"meanScore,omitempty\" graphql:\"meanScore\"" Description *string "json:\"description,omitempty\" graphql:\"description\"" Genres []*string "json:\"genres,omitempty\" graphql:\"genres\"" + Tags []*BaseAnime_Tags "json:\"tags,omitempty\" graphql:\"tags\"" Duration *int "json:\"duration,omitempty\" graphql:\"duration\"" Trailer *BaseAnime_Trailer "json:\"trailer,omitempty\" graphql:\"trailer\"" Title *BaseAnime_Title "json:\"title,omitempty\" graphql:\"title\"" @@ -165,6 +166,12 @@ func (t *BaseAnime) GetGenres() []*string { } return t.Genres } +func (t *BaseAnime) GetTags() []*BaseAnime_Tags { + if t == nil { + t = &BaseAnime{} + } + return t.Tags +} func (t *BaseAnime) GetDuration() *int { if t == nil { t = &BaseAnime{} @@ -945,6 +952,73 @@ func (t *UserReleaseYearStats) GetChaptersRead() int { return t.ChaptersRead } +type BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &BaseAnime_Tags{} + } + return t.Category +} +func (t *BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &BaseAnime_Tags{} + } + return t.Description +} +func (t *BaseAnime_Tags) GetID() int { + if t == nil { + t = &BaseAnime_Tags{} + } + return t.ID +} +func (t *BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *BaseAnime_Tags) GetName() string { + if t == nil { + t = &BaseAnime_Tags{} + } + return t.Name +} +func (t *BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &BaseAnime_Tags{} + } + return t.Rank +} +func (t *BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &BaseAnime_Tags{} + } + return t.UserID +} + type BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -1273,6 +1347,73 @@ func (t *CompleteAnime_NextAiringEpisode) GetEpisode() int { return t.Episode } +type CompleteAnime_Relations_Edges_Node_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Category +} +func (t *CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Description +} +func (t *CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetID() int { + if t == nil { + t = &CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.ID +} +func (t *CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetName() string { + if t == nil { + t = &CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Name +} +func (t *CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Rank +} +func (t *CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.UserID +} + type CompleteAnime_Relations_Edges_Node_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -1788,6 +1929,73 @@ func (t *AnimeCollection_MediaListCollection_Lists_Entries_CompletedAt) GetDay() return t.Day } +type AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags{} + } + return t.Category +} +func (t *AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags{} + } + return t.Description +} +func (t *AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags) GetID() int { + if t == nil { + t = &AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags{} + } + return t.ID +} +func (t *AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags) GetName() string { + if t == nil { + t = &AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags{} + } + return t.Name +} +func (t *AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags{} + } + return t.Rank +} +func (t *AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags{} + } + return t.UserID +} + type AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -2283,6 +2491,73 @@ func (t *AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_Co return t.Episode } +type AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Category +} +func (t *AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Description +} +func (t *AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetID() int { + if t == nil { + t = &AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.ID +} +func (t *AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetName() string { + if t == nil { + t = &AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Name +} +func (t *AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Rank +} +func (t *AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.UserID +} + type AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -2593,6 +2868,73 @@ func (t *AnimeCollectionWithRelations_MediaListCollection) GetLists() []*AnimeCo return t.Lists } +type BaseAnimeByMalId_Media_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *BaseAnimeByMalId_Media_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &BaseAnimeByMalId_Media_BaseAnime_Tags{} + } + return t.Category +} +func (t *BaseAnimeByMalId_Media_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &BaseAnimeByMalId_Media_BaseAnime_Tags{} + } + return t.Description +} +func (t *BaseAnimeByMalId_Media_BaseAnime_Tags) GetID() int { + if t == nil { + t = &BaseAnimeByMalId_Media_BaseAnime_Tags{} + } + return t.ID +} +func (t *BaseAnimeByMalId_Media_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &BaseAnimeByMalId_Media_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *BaseAnimeByMalId_Media_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &BaseAnimeByMalId_Media_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *BaseAnimeByMalId_Media_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &BaseAnimeByMalId_Media_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *BaseAnimeByMalId_Media_BaseAnime_Tags) GetName() string { + if t == nil { + t = &BaseAnimeByMalId_Media_BaseAnime_Tags{} + } + return t.Name +} +func (t *BaseAnimeByMalId_Media_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &BaseAnimeByMalId_Media_BaseAnime_Tags{} + } + return t.Rank +} +func (t *BaseAnimeByMalId_Media_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &BaseAnimeByMalId_Media_BaseAnime_Tags{} + } + return t.UserID +} + type BaseAnimeByMalId_Media_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -2757,6 +3099,73 @@ func (t *BaseAnimeByMalId_Media_BaseAnime_NextAiringEpisode) GetEpisode() int { return t.Episode } +type BaseAnimeById_Media_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *BaseAnimeById_Media_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &BaseAnimeById_Media_BaseAnime_Tags{} + } + return t.Category +} +func (t *BaseAnimeById_Media_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &BaseAnimeById_Media_BaseAnime_Tags{} + } + return t.Description +} +func (t *BaseAnimeById_Media_BaseAnime_Tags) GetID() int { + if t == nil { + t = &BaseAnimeById_Media_BaseAnime_Tags{} + } + return t.ID +} +func (t *BaseAnimeById_Media_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &BaseAnimeById_Media_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *BaseAnimeById_Media_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &BaseAnimeById_Media_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *BaseAnimeById_Media_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &BaseAnimeById_Media_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *BaseAnimeById_Media_BaseAnime_Tags) GetName() string { + if t == nil { + t = &BaseAnimeById_Media_BaseAnime_Tags{} + } + return t.Name +} +func (t *BaseAnimeById_Media_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &BaseAnimeById_Media_BaseAnime_Tags{} + } + return t.Rank +} +func (t *BaseAnimeById_Media_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &BaseAnimeById_Media_BaseAnime_Tags{} + } + return t.UserID +} + type BaseAnimeById_Media_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -2932,6 +3341,73 @@ func (t *SearchBaseAnimeByIds_Page_PageInfo) GetHasNextPage() *bool { return t.HasNextPage } +type SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags{} + } + return t.Category +} +func (t *SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags{} + } + return t.Description +} +func (t *SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags) GetID() int { + if t == nil { + t = &SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags{} + } + return t.ID +} +func (t *SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags) GetName() string { + if t == nil { + t = &SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags{} + } + return t.Name +} +func (t *SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags{} + } + return t.Rank +} +func (t *SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags{} + } + return t.UserID +} + type SearchBaseAnimeByIds_Page_Media_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -3278,6 +3754,73 @@ func (t *CompleteAnimeById_Media_CompleteAnime_NextAiringEpisode) GetEpisode() i return t.Episode } +type CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Category +} +func (t *CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Description +} +func (t *CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetID() int { + if t == nil { + t = &CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.ID +} +func (t *CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetName() string { + if t == nil { + t = &CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Name +} +func (t *CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Rank +} +func (t *CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.UserID +} + type CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -3471,6 +4014,73 @@ func (t *CompleteAnimeById_Media_CompleteAnime_Relations) GetEdges() []*Complete return t.Edges } +type AnimeDetailsById_Media_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *AnimeDetailsById_Media_Tags) GetCategory() *string { + if t == nil { + t = &AnimeDetailsById_Media_Tags{} + } + return t.Category +} +func (t *AnimeDetailsById_Media_Tags) GetDescription() *string { + if t == nil { + t = &AnimeDetailsById_Media_Tags{} + } + return t.Description +} +func (t *AnimeDetailsById_Media_Tags) GetID() int { + if t == nil { + t = &AnimeDetailsById_Media_Tags{} + } + return t.ID +} +func (t *AnimeDetailsById_Media_Tags) GetIsAdult() *bool { + if t == nil { + t = &AnimeDetailsById_Media_Tags{} + } + return t.IsAdult +} +func (t *AnimeDetailsById_Media_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &AnimeDetailsById_Media_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *AnimeDetailsById_Media_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &AnimeDetailsById_Media_Tags{} + } + return t.IsMediaSpoiler +} +func (t *AnimeDetailsById_Media_Tags) GetName() string { + if t == nil { + t = &AnimeDetailsById_Media_Tags{} + } + return t.Name +} +func (t *AnimeDetailsById_Media_Tags) GetRank() *int { + if t == nil { + t = &AnimeDetailsById_Media_Tags{} + } + return t.Rank +} +func (t *AnimeDetailsById_Media_Tags) GetUserID() *int { + if t == nil { + t = &AnimeDetailsById_Media_Tags{} + } + return t.UserID +} + type AnimeDetailsById_Media_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -4053,6 +4663,73 @@ func (t *AnimeDetailsById_Media_Recommendations) GetEdges() []*AnimeDetailsById_ return t.Edges } +type AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Category +} +func (t *AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Description +} +func (t *AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags) GetID() int { + if t == nil { + t = &AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.ID +} +func (t *AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags) GetName() string { + if t == nil { + t = &AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Name +} +func (t *AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.Rank +} +func (t *AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags{} + } + return t.UserID +} + type AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -4251,6 +4928,7 @@ type AnimeDetailsById_Media struct { ID int "json:\"id\" graphql:\"id\"" Duration *int "json:\"duration,omitempty\" graphql:\"duration\"" Genres []*string "json:\"genres,omitempty\" graphql:\"genres\"" + Tags []*AnimeDetailsById_Media_Tags "json:\"tags,omitempty\" graphql:\"tags\"" AverageScore *int "json:\"averageScore,omitempty\" graphql:\"averageScore\"" Popularity *int "json:\"popularity,omitempty\" graphql:\"popularity\"" MeanScore *int "json:\"meanScore,omitempty\" graphql:\"meanScore\"" @@ -4290,6 +4968,12 @@ func (t *AnimeDetailsById_Media) GetGenres() []*string { } return t.Genres } +func (t *AnimeDetailsById_Media) GetTags() []*AnimeDetailsById_Media_Tags { + if t == nil { + t = &AnimeDetailsById_Media{} + } + return t.Tags +} func (t *AnimeDetailsById_Media) GetAverageScore() *int { if t == nil { t = &AnimeDetailsById_Media{} @@ -4408,6 +5092,73 @@ func (t *ListAnime_Page_PageInfo) GetLastPage() *int { return t.LastPage } +type ListAnime_Page_Media_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *ListAnime_Page_Media_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &ListAnime_Page_Media_BaseAnime_Tags{} + } + return t.Category +} +func (t *ListAnime_Page_Media_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &ListAnime_Page_Media_BaseAnime_Tags{} + } + return t.Description +} +func (t *ListAnime_Page_Media_BaseAnime_Tags) GetID() int { + if t == nil { + t = &ListAnime_Page_Media_BaseAnime_Tags{} + } + return t.ID +} +func (t *ListAnime_Page_Media_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &ListAnime_Page_Media_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *ListAnime_Page_Media_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &ListAnime_Page_Media_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *ListAnime_Page_Media_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &ListAnime_Page_Media_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *ListAnime_Page_Media_BaseAnime_Tags) GetName() string { + if t == nil { + t = &ListAnime_Page_Media_BaseAnime_Tags{} + } + return t.Name +} +func (t *ListAnime_Page_Media_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &ListAnime_Page_Media_BaseAnime_Tags{} + } + return t.Rank +} +func (t *ListAnime_Page_Media_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &ListAnime_Page_Media_BaseAnime_Tags{} + } + return t.UserID +} + type ListAnime_Page_Media_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -4629,6 +5380,73 @@ func (t *ListRecentAnime_Page_PageInfo) GetLastPage() *int { return t.LastPage } +type ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags{} + } + return t.Category +} +func (t *ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags{} + } + return t.Description +} +func (t *ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags) GetID() int { + if t == nil { + t = &ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags{} + } + return t.ID +} +func (t *ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags) GetName() string { + if t == nil { + t = &ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags{} + } + return t.Name +} +func (t *ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags{} + } + return t.Rank +} +func (t *ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags{} + } + return t.UserID +} + type ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -6979,6 +7797,73 @@ func (t *ViewerStats_Viewer) GetStatistics() *ViewerStats_Viewer_Statistics { return t.Statistics } +type StudioDetails_Studio_Media_Nodes_BaseAnime_Tags struct { + Category *string "json:\"category,omitempty\" graphql:\"category\"" + Description *string "json:\"description,omitempty\" graphql:\"description\"" + ID int "json:\"id\" graphql:\"id\"" + IsAdult *bool "json:\"isAdult,omitempty\" graphql:\"isAdult\"" + IsGeneralSpoiler *bool "json:\"isGeneralSpoiler,omitempty\" graphql:\"isGeneralSpoiler\"" + IsMediaSpoiler *bool "json:\"isMediaSpoiler,omitempty\" graphql:\"isMediaSpoiler\"" + Name string "json:\"name\" graphql:\"name\"" + Rank *int "json:\"rank,omitempty\" graphql:\"rank\"" + UserID *int "json:\"userId,omitempty\" graphql:\"userId\"" +} + +func (t *StudioDetails_Studio_Media_Nodes_BaseAnime_Tags) GetCategory() *string { + if t == nil { + t = &StudioDetails_Studio_Media_Nodes_BaseAnime_Tags{} + } + return t.Category +} +func (t *StudioDetails_Studio_Media_Nodes_BaseAnime_Tags) GetDescription() *string { + if t == nil { + t = &StudioDetails_Studio_Media_Nodes_BaseAnime_Tags{} + } + return t.Description +} +func (t *StudioDetails_Studio_Media_Nodes_BaseAnime_Tags) GetID() int { + if t == nil { + t = &StudioDetails_Studio_Media_Nodes_BaseAnime_Tags{} + } + return t.ID +} +func (t *StudioDetails_Studio_Media_Nodes_BaseAnime_Tags) GetIsAdult() *bool { + if t == nil { + t = &StudioDetails_Studio_Media_Nodes_BaseAnime_Tags{} + } + return t.IsAdult +} +func (t *StudioDetails_Studio_Media_Nodes_BaseAnime_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &StudioDetails_Studio_Media_Nodes_BaseAnime_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *StudioDetails_Studio_Media_Nodes_BaseAnime_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &StudioDetails_Studio_Media_Nodes_BaseAnime_Tags{} + } + return t.IsMediaSpoiler +} +func (t *StudioDetails_Studio_Media_Nodes_BaseAnime_Tags) GetName() string { + if t == nil { + t = &StudioDetails_Studio_Media_Nodes_BaseAnime_Tags{} + } + return t.Name +} +func (t *StudioDetails_Studio_Media_Nodes_BaseAnime_Tags) GetRank() *int { + if t == nil { + t = &StudioDetails_Studio_Media_Nodes_BaseAnime_Tags{} + } + return t.Rank +} +func (t *StudioDetails_Studio_Media_Nodes_BaseAnime_Tags) GetUserID() *int { + if t == nil { + t = &StudioDetails_Studio_Media_Nodes_BaseAnime_Tags{} + } + return t.UserID +} + type StudioDetails_Studio_Media_Nodes_BaseAnime_Trailer struct { ID *string "json:\"id,omitempty\" graphql:\"id\"" Site *string "json:\"site,omitempty\" graphql:\"site\"" @@ -7597,6 +8482,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -7757,6 +8653,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -7832,6 +8739,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -7907,6 +8825,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -7987,6 +8916,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -8130,6 +9070,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -8189,6 +9140,17 @@ const AnimeDetailsByIDDocument = `query AnimeDetailsById ($id: Int) { id duration genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } averageScore popularity meanScore @@ -8334,6 +9296,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -8418,6 +9391,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -8518,6 +9502,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -9429,6 +10424,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id diff --git a/internal/api/anilist/queries/anime.graphql b/internal/api/anilist/queries/anime.graphql index 4746fc437..721a2232f 100644 --- a/internal/api/anilist/queries/anime.graphql +++ b/internal/api/anilist/queries/anime.graphql @@ -98,6 +98,17 @@ query AnimeDetailsById ($id: Int) { id duration genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } averageScore popularity meanScore @@ -283,6 +294,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id diff --git a/internal/platforms/anilist_platform/anilist_platform.go b/internal/platforms/anilist_platform/anilist_platform.go index 511e7f7a5..4f68ba20b 100644 --- a/internal/platforms/anilist_platform/anilist_platform.go +++ b/internal/platforms/anilist_platform/anilist_platform.go @@ -240,6 +240,9 @@ func (ap *AnilistPlatform) GetAnimeDetails(ctx context.Context, mediaID int) (*a } media := ret.GetMedia() + for _, value := range media.GetTags() { + ap.logger.Debug().Msg("Tag name: " + value.GetName()) + } return ap.helper.TriggerGetAnimeDetailsEvent(media) } From cceeba6d88959d6dbd38504847dfae4dad1a43eb Mon Sep 17 00:00:00 2001 From: csylwip Date: Sat, 7 Feb 2026 14:48:59 +0200 Subject: [PATCH 09/14] Working tags --- codegen/generated/handlers.json | 9 + codegen/generated/public_structs.json | 1627 +++++++-- internal/api/anilist/client.go | 6 +- internal/api/anilist/client_gen.go | 9 +- internal/api/anilist/client_mock.go | 4 +- internal/api/anilist/list.go | 8 + internal/api/anilist/queries/anime.graphql | 2 + .../extension_repo/goja_plugin_types/app.d.ts | 75 +- internal/handlers/anilist.go | 3 + internal/handlers/anime_entries.go | 1 + .../platforms/shared_platform/cachelayer.go | 4 +- internal/plugin/anilist.go | 4 +- .../src/api/generated/endpoint.types.ts | 8 +- seanime-web/src/api/generated/endpoints.ts | 10 +- seanime-web/src/api/generated/types.ts | 48 +- .../plugin/generated/plugin-events.ts | 232 +- .../_components/advanced-search-options.tsx | 17 +- .../search/_lib/advanced-search-constants.ts | 2933 +++++++++++++++++ .../search/_lib/advanced-search.atoms.ts | 4 +- .../search/_lib/handle-advanced-search.ts | 2 + seanime-web/src/app/(main)/search/page.tsx | 4 +- 21 files changed, 4604 insertions(+), 406 deletions(-) diff --git a/codegen/generated/handlers.json b/codegen/generated/handlers.json index 0f59df0ac..88e3c4f57 100644 --- a/codegen/generated/handlers.json +++ b/codegen/generated/handlers.json @@ -381,6 +381,15 @@ "required": false, "descriptions": [] }, + { + "name": "Tags", + "jsonName": "tags", + "goType": "[]anilist.BaseAnime_Tags", + "usedStructType": "anilist.BaseAnime_Tags", + "typescriptType": "Array\u003cAL_BaseAnime_Tags\u003e", + "required": false, + "descriptions": [] + }, { "name": "AverageScoreGreater", "jsonName": "averageScore_greater", diff --git a/codegen/generated/public_structs.json b/codegen/generated/public_structs.json index 0658b614e..ec121f89e 100644 --- a/codegen/generated/public_structs.json +++ b/codegen/generated/public_structs.json @@ -231,6 +231,17 @@ "public": true, "comments": [] }, + { + "name": "Tags", + "jsonName": "tags", + "goType": "[]BaseAnime_Tags", + "typescriptType": "Array\u003cAL_BaseAnime_Tags\u003e", + "usedTypescriptType": "AL_BaseAnime_Tags", + "usedStructName": "anilist.BaseAnime_Tags", + "required": false, + "public": true, + "comments": [] + }, { "name": "Duration", "jsonName": "duration", @@ -1367,50 +1378,13 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "BaseAnime_Trailer", - "formattedName": "AL_BaseAnime_Trailer", + "name": "BaseAnime_Tags", + "formattedName": "AL_BaseAnime_Tags", "package": "anilist", "fields": [ { - "name": "ID", - "jsonName": "id", - "goType": "string", - "typescriptType": "string", - "required": false, - "public": true, - "comments": [] - }, - { - "name": "Site", - "jsonName": "site", - "goType": "string", - "typescriptType": "string", - "required": false, - "public": true, - "comments": [] - }, - { - "name": "Thumbnail", - "jsonName": "thumbnail", - "goType": "string", - "typescriptType": "string", - "required": false, - "public": true, - "comments": [] - } - ], - "comments": [] - }, - { - "filepath": "../internal/api/anilist/client_gen.go", - "filename": "client_gen.go", - "name": "BaseAnime_Title", - "formattedName": "AL_BaseAnime_Title", - "package": "anilist", - "fields": [ - { - "name": "UserPreferred", - "jsonName": "userPreferred", + "name": "Category", + "jsonName": "category", "goType": "string", "typescriptType": "string", "required": false, @@ -1418,8 +1392,8 @@ "comments": [] }, { - "name": "Romaji", - "jsonName": "romaji", + "name": "Description", + "jsonName": "description", "goType": "string", "typescriptType": "string", "required": false, @@ -1427,128 +1401,53 @@ "comments": [] }, { - "name": "English", - "jsonName": "english", - "goType": "string", - "typescriptType": "string", - "required": false, + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, "public": true, "comments": [] }, { - "name": "Native", - "jsonName": "native", - "goType": "string", - "typescriptType": "string", - "required": false, - "public": true, - "comments": [] - } - ], - "comments": [] - }, - { - "filepath": "../internal/api/anilist/client_gen.go", - "filename": "client_gen.go", - "name": "BaseAnime_CoverImage", - "formattedName": "AL_BaseAnime_CoverImage", - "package": "anilist", - "fields": [ - { - "name": "ExtraLarge", - "jsonName": "extraLarge", - "goType": "string", - "typescriptType": "string", + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", "required": false, "public": true, "comments": [] }, { - "name": "Large", - "jsonName": "large", - "goType": "string", - "typescriptType": "string", + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", "required": false, "public": true, "comments": [] }, { - "name": "Medium", - "jsonName": "medium", - "goType": "string", - "typescriptType": "string", + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", "required": false, "public": true, "comments": [] }, { - "name": "Color", - "jsonName": "color", + "name": "Name", + "jsonName": "name", "goType": "string", "typescriptType": "string", - "required": false, - "public": true, - "comments": [] - } - ], - "comments": [] - }, - { - "filepath": "../internal/api/anilist/client_gen.go", - "filename": "client_gen.go", - "name": "BaseAnime_StartDate", - "formattedName": "AL_BaseAnime_StartDate", - "package": "anilist", - "fields": [ - { - "name": "Year", - "jsonName": "year", - "goType": "int", - "typescriptType": "number", - "required": false, - "public": true, - "comments": [] - }, - { - "name": "Month", - "jsonName": "month", - "goType": "int", - "typescriptType": "number", - "required": false, - "public": true, - "comments": [] - }, - { - "name": "Day", - "jsonName": "day", - "goType": "int", - "typescriptType": "number", - "required": false, - "public": true, - "comments": [] - } - ], - "comments": [] - }, - { - "filepath": "../internal/api/anilist/client_gen.go", - "filename": "client_gen.go", - "name": "BaseAnime_EndDate", - "formattedName": "AL_BaseAnime_EndDate", - "package": "anilist", - "fields": [ - { - "name": "Year", - "jsonName": "year", - "goType": "int", - "typescriptType": "number", - "required": false, + "required": true, "public": true, "comments": [] }, { - "name": "Month", - "jsonName": "month", + "name": "Rank", + "jsonName": "rank", "goType": "int", "typescriptType": "number", "required": false, @@ -1556,8 +1455,8 @@ "comments": [] }, { - "name": "Day", - "jsonName": "day", + "name": "UserID", + "jsonName": "userId", "goType": "int", "typescriptType": "number", "required": false, @@ -1570,45 +1469,8 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "BaseAnime_NextAiringEpisode", - "formattedName": "AL_BaseAnime_NextAiringEpisode", - "package": "anilist", - "fields": [ - { - "name": "AiringAt", - "jsonName": "airingAt", - "goType": "int", - "typescriptType": "number", - "required": true, - "public": true, - "comments": [] - }, - { - "name": "TimeUntilAiring", - "jsonName": "timeUntilAiring", - "goType": "int", - "typescriptType": "number", - "required": true, - "public": true, - "comments": [] - }, - { - "name": "Episode", - "jsonName": "episode", - "goType": "int", - "typescriptType": "number", - "required": true, - "public": true, - "comments": [] - } - ], - "comments": [] - }, - { - "filepath": "../internal/api/anilist/client_gen.go", - "filename": "client_gen.go", - "name": "CompleteAnime_Trailer", - "formattedName": "AL_CompleteAnime_Trailer", + "name": "BaseAnime_Trailer", + "formattedName": "AL_BaseAnime_Trailer", "package": "anilist", "fields": [ { @@ -1644,8 +1506,8 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "CompleteAnime_Title", - "formattedName": "AL_CompleteAnime_Title", + "name": "BaseAnime_Title", + "formattedName": "AL_BaseAnime_Title", "package": "anilist", "fields": [ { @@ -1690,8 +1552,8 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "CompleteAnime_CoverImage", - "formattedName": "AL_CompleteAnime_CoverImage", + "name": "BaseAnime_CoverImage", + "formattedName": "AL_BaseAnime_CoverImage", "package": "anilist", "fields": [ { @@ -1736,8 +1598,8 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "CompleteAnime_StartDate", - "formattedName": "AL_CompleteAnime_StartDate", + "name": "BaseAnime_StartDate", + "formattedName": "AL_BaseAnime_StartDate", "package": "anilist", "fields": [ { @@ -1773,8 +1635,8 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "CompleteAnime_EndDate", - "formattedName": "AL_CompleteAnime_EndDate", + "name": "BaseAnime_EndDate", + "formattedName": "AL_BaseAnime_EndDate", "package": "anilist", "fields": [ { @@ -1810,8 +1672,8 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "CompleteAnime_NextAiringEpisode", - "formattedName": "AL_CompleteAnime_NextAiringEpisode", + "name": "BaseAnime_NextAiringEpisode", + "formattedName": "AL_BaseAnime_NextAiringEpisode", "package": "anilist", "fields": [ { @@ -1847,8 +1709,8 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_Trailer", - "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_Trailer", + "name": "CompleteAnime_Trailer", + "formattedName": "AL_CompleteAnime_Trailer", "package": "anilist", "fields": [ { @@ -1884,8 +1746,8 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_Title", - "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_Title", + "name": "CompleteAnime_Title", + "formattedName": "AL_CompleteAnime_Title", "package": "anilist", "fields": [ { @@ -1930,8 +1792,8 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_CoverImage", - "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_CoverImage", + "name": "CompleteAnime_CoverImage", + "formattedName": "AL_CompleteAnime_CoverImage", "package": "anilist", "fields": [ { @@ -1976,8 +1838,8 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_StartDate", - "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_StartDate", + "name": "CompleteAnime_StartDate", + "formattedName": "AL_CompleteAnime_StartDate", "package": "anilist", "fields": [ { @@ -2013,8 +1875,339 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_EndDate", - "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_EndDate", + "name": "CompleteAnime_EndDate", + "formattedName": "AL_CompleteAnime_EndDate", + "package": "anilist", + "fields": [ + { + "name": "Year", + "jsonName": "year", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Month", + "jsonName": "month", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Day", + "jsonName": "day", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "CompleteAnime_NextAiringEpisode", + "formattedName": "AL_CompleteAnime_NextAiringEpisode", + "package": "anilist", + "fields": [ + { + "name": "AiringAt", + "jsonName": "airingAt", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "TimeUntilAiring", + "jsonName": "timeUntilAiring", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Episode", + "jsonName": "episode", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + } + ], + "comments": [] + }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_Tags", + "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_Trailer", + "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_Trailer", + "package": "anilist", + "fields": [ + { + "name": "ID", + "jsonName": "id", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Site", + "jsonName": "site", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Thumbnail", + "jsonName": "thumbnail", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_Title", + "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_Title", + "package": "anilist", + "fields": [ + { + "name": "UserPreferred", + "jsonName": "userPreferred", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Romaji", + "jsonName": "romaji", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "English", + "jsonName": "english", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Native", + "jsonName": "native", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_CoverImage", + "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_CoverImage", + "package": "anilist", + "fields": [ + { + "name": "ExtraLarge", + "jsonName": "extraLarge", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Large", + "jsonName": "large", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Medium", + "jsonName": "medium", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Color", + "jsonName": "color", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_StartDate", + "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_StartDate", + "package": "anilist", + "fields": [ + { + "name": "Year", + "jsonName": "year", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Month", + "jsonName": "month", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Day", + "jsonName": "day", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "CompleteAnime_Relations_Edges_Node_BaseAnime_EndDate", + "formattedName": "AL_CompleteAnime_Relations_Edges_Node_BaseAnime_EndDate", "package": "anilist", "fields": [ { @@ -2623,6 +2816,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags", + "formattedName": "AL_AnimeCollection_MediaListCollection_Lists_Entries_Media_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -3356,6 +3640,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags", + "formattedName": "AL_AnimeCollectionWithRelations_MediaListCollection_Lists_Entries_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -3828,6 +4203,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "BaseAnimeByMalId_Media_BaseAnime_Tags", + "formattedName": "AL_BaseAnimeByMalId_Media_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -4068,6 +4534,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "BaseAnimeById_Media_BaseAnime_Tags", + "formattedName": "AL_BaseAnimeById_Media_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -4327,6 +4884,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags", + "formattedName": "AL_SearchBaseAnimeByIds_Page_Media_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -4839,6 +5487,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags", + "formattedName": "AL_CompleteAnimeById_Media_CompleteAnime_Relations_Edges_Node_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -5132,6 +5871,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "AnimeDetailsById_Media_Tags", + "formattedName": "AL_AnimeDetailsById_Media_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -6034,6 +6864,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags", + "formattedName": "AL_AnimeDetailsById_Media_Relations_Edges_Node_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -6370,6 +7291,17 @@ "public": true, "comments": [] }, + { + "name": "Tags", + "jsonName": "tags", + "goType": "[]AnimeDetailsById_Media_Tags", + "typescriptType": "Array\u003cAL_AnimeDetailsById_Media_Tags\u003e", + "usedTypescriptType": "AL_AnimeDetailsById_Media_Tags", + "usedStructName": "anilist.AnimeDetailsById_Media_Tags", + "required": false, + "public": true, + "comments": [] + }, { "name": "AverageScore", "jsonName": "averageScore", @@ -6563,6 +7495,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "ListAnime_Page_Media_BaseAnime_Tags", + "formattedName": "AL_ListAnime_Page_Media_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -6890,6 +7913,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags", + "formattedName": "AL_ListRecentAnime_Page_AiringSchedules_Media_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -10514,6 +11628,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "StudioDetails_Studio_Media_Nodes_BaseAnime_Tags", + "formattedName": "AL_StudioDetails_Studio_Media_Nodes_BaseAnime_Tags", + "package": "anilist", + "fields": [ + { + "name": "Category", + "jsonName": "category", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Description", + "jsonName": "description", + "goType": "string", + "typescriptType": "string", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "ID", + "jsonName": "id", + "goType": "int", + "typescriptType": "number", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "IsAdult", + "jsonName": "isAdult", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsGeneralSpoiler", + "jsonName": "isGeneralSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "IsMediaSpoiler", + "jsonName": "isMediaSpoiler", + "goType": "bool", + "typescriptType": "boolean", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "Name", + "jsonName": "name", + "goType": "string", + "typescriptType": "string", + "required": true, + "public": true, + "comments": [] + }, + { + "name": "Rank", + "jsonName": "rank", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + }, + { + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", @@ -26685,7 +27890,7 @@ "comments": [] }, { - "filepath": "../internal/continuity/history.go", + "filepath": "..\\internal\\continuity\\history.go", "filename": "history.go", "name": "WatchHistory", "formattedName": "Continuity_WatchHistory", @@ -29484,7 +30689,7 @@ "comments": [] }, { - "filepath": "../internal/database/models/models.go", + "filepath": "..\\internal\\database\\models\\models.go", "filename": "models.go", "name": "LibraryPaths", "formattedName": "Models_LibraryPaths", @@ -29600,7 +30805,7 @@ "comments": [] }, { - "filepath": "../internal/database/models/models.go", + "filepath": "..\\internal\\database\\models\\models.go", "filename": "models.go", "name": "IntSlice", "formattedName": "Models_IntSlice", @@ -31742,7 +32947,7 @@ ] }, { - "filepath": "../internal/database/models/models.go", + "filepath": "..\\internal\\database\\models\\models.go", "filename": "models.go", "name": "StringSlice", "formattedName": "Models_StringSlice", @@ -54286,7 +55491,7 @@ ] }, { - "filepath": "../internal/local/database_models.go", + "filepath": "..\\internal\\local\\database_models.go", "filename": "database_models.go", "name": "StringMap", "formattedName": "Local_StringMap", @@ -54300,7 +55505,7 @@ "comments": null }, { - "filepath": "../internal/local/database_models.go", + "filepath": "..\\internal\\local\\database_models.go", "filename": "database_models.go", "name": "LocalMangaChapterContainers", "formattedName": "Local_LocalMangaChapterContainers", @@ -55772,7 +56977,7 @@ "comments": [] }, { - "filepath": "../internal/manga/download.go", + "filepath": "..\\internal\\manga\\download.go", "filename": "download.go", "name": "MediaMap", "formattedName": "Manga_MediaMap", @@ -55787,7 +56992,7 @@ "comments": null }, { - "filepath": "../internal/manga/download.go", + "filepath": "..\\internal\\manga\\download.go", "filename": "download.go", "name": "ProviderDownloadMap", "formattedName": "Manga_ProviderDownloadMap", @@ -56215,7 +57420,7 @@ "comments": [] }, { - "filepath": "../internal/manga/downloader/chapter_downloader.go", + "filepath": "..\\internal\\manga\\downloader\\chapter_downloader.go", "filename": "chapter_downloader.go", "name": "Registry", "formattedName": "ChapterDownloader_Registry", @@ -66471,7 +67676,7 @@ "comments": [] }, { - "filepath": "../internal/nakama/share.go", + "filepath": "..\\internal\\nakama\\share.go", "filename": "share.go", "name": "NakamaCustomSourceMap", "formattedName": "Nakama_NakamaCustomSourceMap", diff --git a/internal/api/anilist/client.go b/internal/api/anilist/client.go index 3d6d17350..bda4454b5 100644 --- a/internal/api/anilist/client.go +++ b/internal/api/anilist/client.go @@ -34,7 +34,7 @@ type AnilistClient interface { SearchBaseAnimeByIds(ctx context.Context, ids []*int, page *int, perPage *int, status []*MediaStatus, inCollection *bool, sort []*MediaSort, season *MediaSeason, year *int, genre *string, format *MediaFormat, interceptors ...clientv2.RequestInterceptor) (*SearchBaseAnimeByIds, error) CompleteAnimeByID(ctx context.Context, id *int, interceptors ...clientv2.RequestInterceptor) (*CompleteAnimeByID, error) AnimeDetailsByID(ctx context.Context, id *int, interceptors ...clientv2.RequestInterceptor) (*AnimeDetailsByID, error) - ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, averageScoreGreater *int, season *MediaSeason, seasonYear *int, format *MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListAnime, error) + ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, tags []*string, averageScoreGreater *int, season *MediaSeason, seasonYear *int, format *MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListAnime, error) ListRecentAnime(ctx context.Context, page *int, perPage *int, airingAtGreater *int, airingAtLesser *int, notYetAired *bool, interceptors ...clientv2.RequestInterceptor) (*ListRecentAnime, error) UpdateMediaListEntry(ctx context.Context, mediaID *int, status *MediaListStatus, scoreRaw *int, progress *int, startedAt *FuzzyDateInput, completedAt *FuzzyDateInput, interceptors ...clientv2.RequestInterceptor) (*UpdateMediaListEntry, error) UpdateMediaListEntryProgress(ctx context.Context, mediaID *int, progress *int, status *MediaListStatus, interceptors ...clientv2.RequestInterceptor) (*UpdateMediaListEntryProgress, error) @@ -207,9 +207,9 @@ func (ac *AnilistClientImpl) CompleteAnimeByID(ctx context.Context, id *int, int return ac.Client.CompleteAnimeByID(ctx, id, interceptors...) } -func (ac *AnilistClientImpl) ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, averageScoreGreater *int, season *MediaSeason, seasonYear *int, format *MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListAnime, error) { +func (ac *AnilistClientImpl) ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, tags []*string, averageScoreGreater *int, season *MediaSeason, seasonYear *int, format *MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListAnime, error) { ac.logger.Debug().Msg("anilist: Fetching media list") - return ac.Client.ListAnime(ctx, page, search, perPage, sort, status, genres, averageScoreGreater, season, seasonYear, format, isAdult, interceptors...) + return ac.Client.ListAnime(ctx, page, search, perPage, sort, status, genres, tags, averageScoreGreater, season, seasonYear, format, isAdult, interceptors...) } func (ac *AnilistClientImpl) ListRecentAnime(ctx context.Context, page *int, perPage *int, airingAtGreater *int, airingAtLesser *int, notYetAired *bool, interceptors ...clientv2.RequestInterceptor) (*ListRecentAnime, error) { diff --git a/internal/api/anilist/client_gen.go b/internal/api/anilist/client_gen.go index aaae5a706..2ade705ad 100644 --- a/internal/api/anilist/client_gen.go +++ b/internal/api/anilist/client_gen.go @@ -17,7 +17,7 @@ type GithubGraphQLClient interface { SearchBaseAnimeByIds(ctx context.Context, ids []*int, page *int, perPage *int, status []*MediaStatus, inCollection *bool, sort []*MediaSort, season *MediaSeason, year *int, genre *string, format *MediaFormat, interceptors ...clientv2.RequestInterceptor) (*SearchBaseAnimeByIds, error) CompleteAnimeByID(ctx context.Context, id *int, interceptors ...clientv2.RequestInterceptor) (*CompleteAnimeByID, error) AnimeDetailsByID(ctx context.Context, id *int, interceptors ...clientv2.RequestInterceptor) (*AnimeDetailsByID, error) - ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, averageScoreGreater *int, season *MediaSeason, seasonYear *int, format *MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListAnime, error) + ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, tags []*string, averageScoreGreater *int, season *MediaSeason, seasonYear *int, format *MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListAnime, error) ListRecentAnime(ctx context.Context, page *int, perPage *int, airingAtGreater *int, airingAtLesser *int, notYetAired *bool, interceptors ...clientv2.RequestInterceptor) (*ListRecentAnime, error) AnimeAiringSchedule(ctx context.Context, ids []*int, season *MediaSeason, seasonYear *int, previousSeason *MediaSeason, previousSeasonYear *int, nextSeason *MediaSeason, nextSeasonYear *int, interceptors ...clientv2.RequestInterceptor) (*AnimeAiringSchedule, error) AnimeAiringScheduleRaw(ctx context.Context, ids []*int, interceptors ...clientv2.RequestInterceptor) (*AnimeAiringScheduleRaw, error) @@ -9360,7 +9360,7 @@ func (c *Client) AnimeDetailsByID(ctx context.Context, id *int, interceptors ... return &res, nil } -const ListAnimeDocument = `query ListAnime ($page: Int, $search: String, $perPage: Int, $sort: [MediaSort], $status: [MediaStatus], $genres: [String], $averageScore_greater: Int, $season: MediaSeason, $seasonYear: Int, $format: MediaFormat, $isAdult: Boolean) { +const ListAnimeDocument = `query ListAnime ($page: Int, $search: String, $perPage: Int, $sort: [MediaSort], $status: [MediaStatus], $genres: [String], $tags: [String], $averageScore_greater: Int, $season: MediaSeason, $seasonYear: Int, $format: MediaFormat, $isAdult: Boolean) { Page(page: $page, perPage: $perPage) { pageInfo { hasNextPage @@ -9369,7 +9369,7 @@ const ListAnimeDocument = `query ListAnime ($page: Int, $search: String, $perPag currentPage lastPage } - media(type: ANIME, search: $search, sort: $sort, status_in: $status, isAdult: $isAdult, format: $format, genre_in: $genres, averageScore_greater: $averageScore_greater, season: $season, seasonYear: $seasonYear, format_not: MUSIC) { + media(type: ANIME, search: $search, sort: $sort, status_in: $status, isAdult: $isAdult, format: $format, genre_in: $genres, tag_in: $tags, averageScore_greater: $averageScore_greater, season: $season, seasonYear: $seasonYear, format_not: MUSIC) { ... baseAnime } } @@ -9438,7 +9438,7 @@ fragment baseAnime on Media { } ` -func (c *Client) ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, averageScoreGreater *int, season *MediaSeason, seasonYear *int, format *MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListAnime, error) { +func (c *Client) ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, tags []*string, averageScoreGreater *int, season *MediaSeason, seasonYear *int, format *MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListAnime, error) { vars := map[string]any{ "page": page, "search": search, @@ -9446,6 +9446,7 @@ func (c *Client) ListAnime(ctx context.Context, page *int, search *string, perPa "sort": sort, "status": status, "genres": genres, + "tags": tags, "averageScore_greater": averageScoreGreater, "season": season, "seasonYear": seasonYear, diff --git a/internal/api/anilist/client_mock.go b/internal/api/anilist/client_mock.go index 53015d2e0..2249abb2b 100644 --- a/internal/api/anilist/client_mock.go +++ b/internal/api/anilist/client_mock.go @@ -511,9 +511,9 @@ func (ac *MockAnilistClientImpl) CompleteAnimeByID(ctx context.Context, id *int, return ac.realAnilistClient.CompleteAnimeByID(ctx, id, interceptors...) } -func (ac *MockAnilistClientImpl) ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, averageScoreGreater *int, season *MediaSeason, seasonYear *int, format *MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListAnime, error) { +func (ac *MockAnilistClientImpl) ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, tags []*string, averageScoreGreater *int, season *MediaSeason, seasonYear *int, format *MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListAnime, error) { ac.logger.Debug().Msg("anilist: Fetching media list") - return ac.realAnilistClient.ListAnime(ctx, page, search, perPage, sort, status, genres, averageScoreGreater, season, seasonYear, format, isAdult, interceptors...) + return ac.realAnilistClient.ListAnime(ctx, page, search, perPage, sort, status, genres, tags, averageScoreGreater, season, seasonYear, format, isAdult, interceptors...) } func (ac *MockAnilistClientImpl) ListRecentAnime(ctx context.Context, page *int, perPage *int, airingAtGreater *int, airingAtLesser *int, notYetAired *bool, interceptors ...clientv2.RequestInterceptor) (*ListRecentAnime, error) { diff --git a/internal/api/anilist/list.go b/internal/api/anilist/list.go index c8c70cf33..190009fd3 100644 --- a/internal/api/anilist/list.go +++ b/internal/api/anilist/list.go @@ -139,6 +139,7 @@ func ListAnimeM( Sort []*MediaSort, Status []*MediaStatus, Genres []*string, + Tags []*string, AverageScoreGreater *int, Season *MediaSeason, SeasonYear *int, @@ -168,6 +169,9 @@ func ListAnimeM( if Genres != nil { variables["genres"] = Genres } + if Tags != nil { + variables["tags"] = Tags + } if AverageScoreGreater != nil { variables["averageScore_greater"] = *AverageScoreGreater } @@ -361,6 +365,7 @@ func ListAnimeCacheKey( Sort []*MediaSort, Status []*MediaStatus, Genres []*string, + Tags []*string, AverageScoreGreater *int, Season *MediaSeason, SeasonYear *int, @@ -388,6 +393,9 @@ func ListAnimeCacheKey( if Genres != nil { key += fmt.Sprintf("_%v", Genres) } + if Tags != nil { + key += fmt.Sprintf("_%v", Tags) + } if AverageScoreGreater != nil { key += fmt.Sprintf("_%d", *AverageScoreGreater) } diff --git a/internal/api/anilist/queries/anime.graphql b/internal/api/anilist/queries/anime.graphql index 721a2232f..381e2ec8a 100644 --- a/internal/api/anilist/queries/anime.graphql +++ b/internal/api/anilist/queries/anime.graphql @@ -224,6 +224,7 @@ query ListAnime( $sort: [MediaSort] $status: [MediaStatus] $genres: [String] + $tags: [String] $averageScore_greater: Int $season: MediaSeason $seasonYear: Int @@ -246,6 +247,7 @@ query ListAnime( isAdult: $isAdult format: $format genre_in: $genres + tag_in: $tags averageScore_greater: $averageScore_greater season: $season seasonYear: $seasonYear diff --git a/internal/extension_repo/goja_plugin_types/app.d.ts b/internal/extension_repo/goja_plugin_types/app.d.ts index a1202b699..ad92be017 100644 --- a/internal/extension_repo/goja_plugin_types/app.d.ts +++ b/internal/extension_repo/goja_plugin_types/app.d.ts @@ -553,8 +553,7 @@ declare namespace $app { * @file internal/continuity/hook_events.go * @description * WatchHistoryItemRequestedEvent is triggered when a watch history item is requested. - * Prevent default to skip getting the watch history item from the file cache, in this case the event should have a valid WatchHistoryItem object - * or set it to nil to indicate that the watch history item was not found. + * Prevent default to skip getting the watch history item from the file cache, in this case the event should have a valid WatchHistoryItem object or set it to nil to indicate that the watch history item was not found. */ function onWatchHistoryItemRequested(cb: (event: WatchHistoryItemRequestedEvent) => void): void; @@ -701,10 +700,10 @@ declare namespace $app { * @event DiscordPresenceAnimeActivityRequestedEvent * @file internal/discordrpc/presence/hook_events.go * @description - * DiscordPresenceAnimeActivityRequestedEvent is triggered when anime activity is requested, after the [animeActivity] is processed, and right - * before the activity is sent to queue. There is no guarantee as to when or if the activity will be successfully sent to discord. Note that - * this event is triggered every 6 seconds or so, avoid heavy processing or perform it only when the activity is changed. Prevent default to - * stop the activity from being sent to discord. + * DiscordPresenceAnimeActivityRequestedEvent is triggered when anime activity is requested, after the [animeActivity] is processed, and right before the activity is sent to queue. + * There is no guarantee as to when or if the activity will be successfully sent to discord. + * Note that this event is triggered every 6 seconds or so, avoid heavy processing or perform it only when the activity is changed. + * Prevent default to stop the activity from being sent to discord. */ function onDiscordPresenceAnimeActivityRequested(cb: (event: DiscordPresenceAnimeActivityRequestedEvent) => void): void; @@ -742,10 +741,10 @@ declare namespace $app { * @event DiscordPresenceMangaActivityRequestedEvent * @file internal/discordrpc/presence/hook_events.go * @description - * DiscordPresenceMangaActivityRequestedEvent is triggered when manga activity is requested, after the [mangaActivity] is processed, and right - * before the activity is sent to queue. There is no guarantee as to when or if the activity will be successfully sent to discord. Note that - * this event is triggered every 6 seconds or so, avoid heavy processing or perform it only when the activity is changed. Prevent default to - * stop the activity from being sent to discord. + * DiscordPresenceMangaActivityRequestedEvent is triggered when manga activity is requested, after the [mangaActivity] is processed, and right before the activity is sent to queue. + * There is no guarantee as to when or if the activity will be successfully sent to discord. + * Note that this event is triggered every 6 seconds or so, avoid heavy processing or perform it only when the activity is changed. + * Prevent default to stop the activity from being sent to discord. */ function onDiscordPresenceMangaActivityRequested(cb: (event: DiscordPresenceMangaActivityRequestedEvent) => void): void; @@ -819,8 +818,9 @@ declare namespace $app { * @event HydrateOnlinestreamFillerDataRequestedEvent * @file internal/library/fillermanager/hook_events.go * @description - * HydrateOnlinestreamFillerDataRequestedEvent is triggered when the filler manager requests to hydrate the filler data for online streaming - * episodes. This is used by the online streaming episode list. Prevent default to skip the default behavior and return your own data. + * HydrateOnlinestreamFillerDataRequestedEvent is triggered when the filler manager requests to hydrate the filler data for online streaming episodes. + * This is used by the online streaming episode list. + * Prevent default to skip the default behavior and return your own data. */ function onHydrateOnlinestreamFillerDataRequested(cb: (event: HydrateOnlinestreamFillerDataRequestedEvent) => void): void; @@ -1131,9 +1131,9 @@ declare namespace $app { * @file internal/api/metadata/hook_events.go * @description * AnimeEpisodeMetadataEvent is triggered when anime episode metadata is available and is about to be returned. - * In the current implementation, episode metadata is requested for display purposes. It is used to get a more complete metadata object since the - * original AnimeMetadata object is not complete. This event is triggered after [AnimeEpisodeMetadataRequestedEvent]. If the modified episode - * metadata is nil, an empty EpisodeMetadata object will be returned. + * In the current implementation, episode metadata is requested for display purposes. It is used to get a more complete metadata object since the original AnimeMetadata object is not complete. + * This event is triggered after [AnimeEpisodeMetadataRequestedEvent]. + * If the modified episode metadata is nil, an empty EpisodeMetadata object will be returned. */ function onAnimeEpisodeMetadata(cb: (event: AnimeEpisodeMetadataEvent) => void): void; @@ -1500,8 +1500,8 @@ declare namespace $app { * PlaybackLocalFileDetailsRequestedEvent is triggered when the local files details for a specific path are requested. * This event is triggered right after the media player loads an episode. * The playback manager uses the local files details to track the progress, propose next episodes, etc. - * In the current implementation, the details are fetched by selecting the local file from the database and making requests to retrieve the media - * and anime list entry. Prevent default to skip the default fetching and override the details. + * In the current implementation, the details are fetched by selecting the local file from the database and making requests to retrieve the media and anime list entry. + * Prevent default to skip the default fetching and override the details. */ function onPlaybackLocalFileDetailsRequested(cb: (event: PlaybackLocalFileDetailsRequestedEvent) => void): void; @@ -1523,8 +1523,7 @@ declare namespace $app { * @description * PlaybackStreamDetailsRequestedEvent is triggered when the stream details are requested. * Prevent default to skip the default fetching and override the details. - * In the current implementation, the details are fetched by selecting the anime from the anime collection. If nothing is found, the stream is - * still tracked. + * In the current implementation, the details are fetched by selecting the anime from the anime collection. If nothing is found, the stream is still tracked. */ function onPlaybackStreamDetailsRequested(cb: (event: PlaybackStreamDetailsRequestedEvent) => void): void; @@ -1923,6 +1922,7 @@ declare namespace $app { id: number; duration?: number; genres?: Array; + tags?: Array; averageScore?: number; popularity?: number; meanScore?: number; @@ -2127,6 +2127,21 @@ declare namespace $app { id: number; } + /** + * - Filepath: internal/api/anilist/client_gen.go + */ + interface AL_AnimeDetailsById_Media_Tags { + category?: string; + description?: string; + id: number; + isAdult?: boolean; + isGeneralSpoiler?: boolean; + isMediaSpoiler?: boolean; + name: string; + rank?: number; + userId?: number; + } + /** * - Filepath: internal/api/anilist/client_gen.go */ @@ -2161,6 +2176,7 @@ declare namespace $app { meanScore?: number; description?: string; genres?: Array; + tags?: Array; duration?: number; trailer?: AL_BaseAnime_Trailer; title?: AL_BaseAnime_Title; @@ -2207,6 +2223,21 @@ declare namespace $app { day?: number; } + /** + * - Filepath: internal/api/anilist/client_gen.go + */ + interface AL_BaseAnime_Tags { + category?: string; + description?: string; + id: number; + isAdult?: boolean; + isGeneralSpoiler?: boolean; + isMediaSpoiler?: boolean; + name: string; + rank?: number; + userId?: number; + } + /** * - Filepath: internal/api/anilist/client_gen.go */ @@ -3521,7 +3552,7 @@ declare namespace $app { } /** - * - Filepath: internal/continuity/history.go + * - Filepath: ..\internal\continuity\history.go */ export type Continuity_WatchHistory = Record; @@ -3703,12 +3734,12 @@ declare namespace $app { } /** - * - Filepath: internal/manga/download.go + * - Filepath: ..\internal\manga\download.go */ export type Manga_MediaMap = Record; /** - * - Filepath: internal/manga/download.go + * - Filepath: ..\internal\manga\download.go */ export type Manga_ProviderDownloadMap = Record>; diff --git a/internal/handlers/anilist.go b/internal/handlers/anilist.go index 8acadd555..ca5c2ab54 100644 --- a/internal/handlers/anilist.go +++ b/internal/handlers/anilist.go @@ -275,6 +275,7 @@ func (h *Handler) HandleAnilistListAnime(c echo.Context) error { Sort []*anilist.MediaSort `json:"sort,omitempty"` Status []*anilist.MediaStatus `json:"status,omitempty"` Genres []*string `json:"genres,omitempty"` + Tags []*string `json:"tags,omitempty"` AverageScoreGreater *int `json:"averageScore_greater,omitempty"` Season *anilist.MediaSeason `json:"season,omitempty"` SeasonYear *int `json:"seasonYear,omitempty"` @@ -305,6 +306,7 @@ func (h *Handler) HandleAnilistListAnime(c echo.Context) error { p.Sort, p.Status, p.Genres, + p.Tags, p.AverageScoreGreater, p.Season, p.SeasonYear, @@ -326,6 +328,7 @@ func (h *Handler) HandleAnilistListAnime(c echo.Context) error { p.Sort, p.Status, p.Genres, + p.Tags, p.AverageScoreGreater, p.Season, p.SeasonYear, diff --git a/internal/handlers/anime_entries.go b/internal/handlers/anime_entries.go index 28e36cad5..b0f1cd32e 100644 --- a/internal/handlers/anime_entries.go +++ b/internal/handlers/anime_entries.go @@ -326,6 +326,7 @@ func (h *Handler) HandleFetchAnimeEntrySuggestions(c echo.Context) error { nil, nil, nil, + nil, h.App.Logger, h.App.GetUserAnilistToken(), ) diff --git a/internal/platforms/shared_platform/cachelayer.go b/internal/platforms/shared_platform/cachelayer.go index a36f2c351..f13f837d8 100644 --- a/internal/platforms/shared_platform/cachelayer.go +++ b/internal/platforms/shared_platform/cachelayer.go @@ -885,10 +885,10 @@ func (c *CacheLayer) AnimeDetailsByID(ctx context.Context, id *int, interceptors return result, err } -func (c *CacheLayer) ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*anilist.MediaSort, status []*anilist.MediaStatus, genres []*string, averageScoreGreater *int, season *anilist.MediaSeason, seasonYear *int, format *anilist.MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*anilist.ListAnime, error) { +func (c *CacheLayer) ListAnime(ctx context.Context, page *int, search *string, perPage *int, sort []*anilist.MediaSort, status []*anilist.MediaStatus, genres []*string, tags []*string, averageScoreGreater *int, season *anilist.MediaSeason, seasonYear *int, format *anilist.MediaFormat, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*anilist.ListAnime, error) { cacheKey := c.generateCacheKey(page, search, perPage, sort, status, genres, averageScoreGreater, season, seasonYear, format, isAdult) return networkFirstGetWithBoundedCache(c, ListAnimeBucket, cacheKey, func() (*anilist.ListAnime, error) { - return c.anilistClientRef.Get().ListAnime(ctx, page, search, perPage, sort, status, genres, averageScoreGreater, season, seasonYear, format, isAdult, interceptors...) + return c.anilistClientRef.Get().ListAnime(ctx, page, search, perPage, sort, status, genres, tags, averageScoreGreater, season, seasonYear, format, isAdult, interceptors...) }) } diff --git a/internal/plugin/anilist.go b/internal/plugin/anilist.go index eaf1ef021..72bf1f64c 100644 --- a/internal/plugin/anilist.go +++ b/internal/plugin/anilist.go @@ -79,8 +79,8 @@ func (a *AppContextImpl) BindAnilist(vm *goja.Runtime, logger *zerolog.Logger, e _ = anilistObj.Set("getStudioDetails", func(studioID int) (*anilist.StudioDetails, error) { return anilistPlatformRef.Get().GetStudioDetails(context.Background(), studioID) }) - _ = anilistObj.Set("listAnime", func(page *int, search *string, perPage *int, sort []*anilist.MediaSort, status []*anilist.MediaStatus, genres []*string, averageScoreGreater *int, season *anilist.MediaSeason, seasonYear *int, format *anilist.MediaFormat, isAdult *bool) (*anilist.ListAnime, error) { - return anilistPlatformRef.Get().GetAnilistClient().ListAnime(context.Background(), page, search, perPage, sort, status, genres, averageScoreGreater, season, seasonYear, format, isAdult) + _ = anilistObj.Set("listAnime", func(page *int, search *string, perPage *int, sort []*anilist.MediaSort, status []*anilist.MediaStatus, genres []*string, tags []*string, averageScoreGreater *int, season *anilist.MediaSeason, seasonYear *int, format *anilist.MediaFormat, isAdult *bool) (*anilist.ListAnime, error) { + return anilistPlatformRef.Get().GetAnilistClient().ListAnime(context.Background(), page, search, perPage, sort, status, genres, tags, averageScoreGreater, season, seasonYear, format, isAdult) }) _ = anilistObj.Set("listManga", func(page *int, search *string, perPage *int, sort []*anilist.MediaSort, status []*anilist.MediaStatus, genres []*string, averageScoreGreater *int, startDateGreater *string, startDateLesser *string, format *anilist.MediaFormat, countryOfOrigin *string, isAdult *bool) (*anilist.ListManga, error) { return anilistPlatformRef.Get().GetAnilistClient().ListManga(context.Background(), page, search, perPage, sort, status, genres, averageScoreGreater, startDateGreater, startDateLesser, format, countryOfOrigin, isAdult) diff --git a/seanime-web/src/api/generated/endpoint.types.ts b/seanime-web/src/api/generated/endpoint.types.ts index 09e11a77f..1144fe790 100644 --- a/seanime-web/src/api/generated/endpoint.types.ts +++ b/seanime-web/src/api/generated/endpoint.types.ts @@ -3,6 +3,7 @@ import type { AL_AiringSort, AL_BaseAnime, + AL_BaseAnime_Tags, AL_FuzzyDateInput, AL_MediaFormat, AL_MediaListStatus, @@ -15,9 +16,9 @@ import type { Anime_PlaylistEpisode, ChapterDownloader_DownloadID, Continuity_UpdateWatchHistoryItemOptions, - Debrid_TorrentItem, DebridClient_CancelStreamOptions, DebridClient_StreamPlaybackType, + Debrid_TorrentItem, HibikeTorrent_AnimeTorrent, HibikeTorrent_BatchEpisodeFiles, LibraryExplorer_SuperUpdateFileOptions, @@ -119,6 +120,7 @@ export type AnilistListAnime_Variables = { sort?: Array status?: Array genres?: Array + tags?: Array averageScore_greater?: number season?: AL_MediaSeason seasonYear?: number @@ -1961,7 +1963,7 @@ export type TorrentClientAddMagnetFromRule_Variables = { export type SearchTorrent_Variables = { /** * "smart" or "simple" - * + * * "smart" or "simple" */ type?: string @@ -2034,7 +2036,7 @@ export type TorrentstreamStartStream_Variables = { batchEpisodeFiles?: HibikeTorrent_BatchEpisodeFiles /** * Preload is true if the stream should only be prepared. - * + * * Preload is true if the stream should only be prepared. */ preload?: boolean diff --git a/seanime-web/src/api/generated/endpoints.ts b/seanime-web/src/api/generated/endpoints.ts index bb93dd1cf..dd1c48787 100644 --- a/seanime-web/src/api/generated/endpoints.ts +++ b/seanime-web/src/api/generated/endpoints.ts @@ -1,9 +1,9 @@ // This code was generated by codegen/main.go. DO NOT EDIT. export type ApiEndpoints = Record> export const API_ENDPOINTS = { @@ -1639,8 +1639,8 @@ export const API_ENDPOINTS = { * Route returns the episode list for the given media and provider. * It returns the episode list for the given media and provider. * The episodes are cached using a file cache. - * The episode list is just a list of episodes with no video sources, it's what the client uses to display the episodes and subsequently - * fetch the sources. The episode list might be nil or empty if nothing could be found, but the media will always be returned. + * The episode list is just a list of episodes with no video sources, it's what the client uses to display the episodes and subsequently fetch the sources. + * The episode list might be nil or empty if nothing could be found, but the media will always be returned. */ GetOnlineStreamEpisodeList: { key: "ONLINESTREAM-get-online-stream-episode-list", diff --git a/seanime-web/src/api/generated/types.ts b/seanime-web/src/api/generated/types.ts index 173691d03..f41408bfc 100644 --- a/seanime-web/src/api/generated/types.ts +++ b/seanime-web/src/api/generated/types.ts @@ -102,6 +102,7 @@ export type AL_AnimeDetailsById_Media = { id: number duration?: number genres?: Array + tags?: Array averageScore?: number popularity?: number meanScore?: number @@ -348,6 +349,23 @@ export type AL_AnimeDetailsById_Media_Studios_Nodes = { id: number } +/** + * - Filepath: internal/api/anilist/client_gen.go + * - Filename: client_gen.go + * - Package: anilist + */ +export type AL_AnimeDetailsById_Media_Tags = { + category?: string + description?: string + id: number + isAdult?: boolean + isGeneralSpoiler?: boolean + isMediaSpoiler?: boolean + name: string + rank?: number + userId?: number +} + /** * - Filepath: internal/api/anilist/client_gen.go * - Filename: client_gen.go @@ -407,6 +425,7 @@ export type AL_BaseAnime = { meanScore?: number description?: string genres?: Array + tags?: Array duration?: number trailer?: AL_BaseAnime_Trailer title?: AL_BaseAnime_Title @@ -461,6 +480,23 @@ export type AL_BaseAnime_StartDate = { day?: number } +/** + * - Filepath: internal/api/anilist/client_gen.go + * - Filename: client_gen.go + * - Package: anilist + */ +export type AL_BaseAnime_Tags = { + category?: string + description?: string + id: number + isAdult?: boolean + isGeneralSpoiler?: boolean + isMediaSpoiler?: boolean + name: string + rank?: number + userId?: number +} + /** * - Filepath: internal/api/anilist/client_gen.go * - Filename: client_gen.go @@ -1931,7 +1967,7 @@ export type Continuity_UpdateWatchHistoryItemOptions = { } /** - * - Filepath: internal/continuity/history.go + * - Filepath: ..\internal\continuity\history.go * - Filename: history.go * - Package: continuity */ @@ -3327,7 +3363,7 @@ export type Manga_PageDimension = { } /** - * - Filepath: internal/manga/download.go + * - Filepath: ..\internal\manga\download.go * - Filename: download.go * - Package: manga */ @@ -3785,14 +3821,14 @@ export type Models_HomeItem = { } /** - * - Filepath: internal/database/models/models.go + * - Filepath: ..\internal\database\models\models.go * - Filename: models.go * - Package: models */ export type Models_IntSlice = Array /** - * - Filepath: internal/database/models/models.go + * - Filepath: ..\internal\database\models\models.go * - Filename: models.go * - Package: models */ @@ -3978,7 +4014,7 @@ export type Models_SilencedMediaEntry = { } /** - * - Filepath: internal/database/models/models.go + * - Filepath: ..\internal\database\models\models.go * - Filename: models.go * - Package: models */ @@ -4140,7 +4176,7 @@ export type Nakama_NakamaAnimeLibrary = { } /** - * - Filepath: internal/nakama/share.go + * - Filepath: ..\internal\nakama\share.go * - Filename: share.go * - Package: nakama */ diff --git a/seanime-web/src/app/(main)/_features/plugin/generated/plugin-events.ts b/seanime-web/src/app/(main)/_features/plugin/generated/plugin-events.ts index b2b9e00a2..7ea527668 100644 --- a/seanime-web/src/app/(main)/_features/plugin/generated/plugin-events.ts +++ b/seanime-web/src/app/(main)/_features/plugin/generated/plugin-events.ts @@ -1,6 +1,6 @@ // This file is auto-generated. Do not edit. -import { useWebsocketPluginMessageListener, useWebsocketSender } from "@/app/(main)/_hooks/handle-websockets" -import { useCallback } from "react" + import { useWebsocketPluginMessageListener, useWebsocketSender } from "@/app/(main)/_hooks/handle-websockets" + import { useCallback } from "react" export enum PluginClientEvents { RenderTray = "tray:render", @@ -88,7 +88,8 @@ export enum PluginServerEvents { // Client to server ///////////////////////////////////////////////////////////////////////////////////// -export type Plugin_Client_RenderTrayEventPayload = {} +export type Plugin_Client_RenderTrayEventPayload = { +} export function usePluginSendRenderTrayEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -102,7 +103,8 @@ export function usePluginSendRenderTrayEvent() { } } -export type Plugin_Client_ListTrayIconsEventPayload = {} +export type Plugin_Client_ListTrayIconsEventPayload = { +} export function usePluginSendListTrayIconsEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -116,7 +118,8 @@ export function usePluginSendListTrayIconsEvent() { } } -export type Plugin_Client_TrayOpenedEventPayload = {} +export type Plugin_Client_TrayOpenedEventPayload = { +} export function usePluginSendTrayOpenedEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -130,7 +133,8 @@ export function usePluginSendTrayOpenedEvent() { } } -export type Plugin_Client_TrayClosedEventPayload = {} +export type Plugin_Client_TrayClosedEventPayload = { +} export function usePluginSendTrayClosedEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -144,7 +148,8 @@ export function usePluginSendTrayClosedEvent() { } } -export type Plugin_Client_TrayClickedEventPayload = {} +export type Plugin_Client_TrayClickedEventPayload = { +} export function usePluginSendTrayClickedEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -158,7 +163,8 @@ export function usePluginSendTrayClickedEvent() { } } -export type Plugin_Client_WebviewSidebarMountedEventPayload = {} +export type Plugin_Client_WebviewSidebarMountedEventPayload = { +} export function usePluginSendWebviewSidebarMountedEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -238,7 +244,8 @@ export function usePluginSendWebviewPostMessageEvent() { } } -export type Plugin_Client_ListCommandPalettesEventPayload = {} +export type Plugin_Client_ListCommandPalettesEventPayload = { +} export function usePluginSendListCommandPalettesEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -252,7 +259,8 @@ export function usePluginSendListCommandPalettesEvent() { } } -export type Plugin_Client_CommandPaletteOpenedEventPayload = {} +export type Plugin_Client_CommandPaletteOpenedEventPayload = { +} export function usePluginSendCommandPaletteOpenedEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -266,7 +274,8 @@ export function usePluginSendCommandPaletteOpenedEvent() { } } -export type Plugin_Client_CommandPaletteClosedEventPayload = {} +export type Plugin_Client_CommandPaletteClosedEventPayload = { +} export function usePluginSendCommandPaletteClosedEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -280,7 +289,8 @@ export function usePluginSendCommandPaletteClosedEvent() { } } -export type Plugin_Client_RenderCommandPaletteEventPayload = {} +export type Plugin_Client_RenderCommandPaletteEventPayload = { +} export function usePluginSendRenderCommandPaletteEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -326,14 +336,13 @@ export function usePluginSendCommandPaletteItemSelectedEvent() { } } -export type Plugin_Client_ActionRenderAnimePageButtonsEventPayload = {} +export type Plugin_Client_ActionRenderAnimePageButtonsEventPayload = { +} export function usePluginSendActionRenderAnimePageButtonsEvent() { const { sendPluginMessage } = useWebsocketSender() - const sendActionRenderAnimePageButtonsEvent = useCallback((payload: Plugin_Client_ActionRenderAnimePageButtonsEventPayload, - extensionID?: string, - ) => { + const sendActionRenderAnimePageButtonsEvent = useCallback((payload: Plugin_Client_ActionRenderAnimePageButtonsEventPayload, extensionID?: string) => { sendPluginMessage(PluginClientEvents.ActionRenderAnimePageButtons, payload, extensionID) }, []) @@ -342,14 +351,13 @@ export function usePluginSendActionRenderAnimePageButtonsEvent() { } } -export type Plugin_Client_ActionRenderAnimePageDropdownItemsEventPayload = {} +export type Plugin_Client_ActionRenderAnimePageDropdownItemsEventPayload = { +} export function usePluginSendActionRenderAnimePageDropdownItemsEvent() { const { sendPluginMessage } = useWebsocketSender() - const sendActionRenderAnimePageDropdownItemsEvent = useCallback((payload: Plugin_Client_ActionRenderAnimePageDropdownItemsEventPayload, - extensionID?: string, - ) => { + const sendActionRenderAnimePageDropdownItemsEvent = useCallback((payload: Plugin_Client_ActionRenderAnimePageDropdownItemsEventPayload, extensionID?: string) => { sendPluginMessage(PluginClientEvents.ActionRenderAnimePageDropdownItems, payload, extensionID) }, []) @@ -358,14 +366,13 @@ export function usePluginSendActionRenderAnimePageDropdownItemsEvent() { } } -export type Plugin_Client_ActionRenderMangaPageButtonsEventPayload = {} +export type Plugin_Client_ActionRenderMangaPageButtonsEventPayload = { +} export function usePluginSendActionRenderMangaPageButtonsEvent() { const { sendPluginMessage } = useWebsocketSender() - const sendActionRenderMangaPageButtonsEvent = useCallback((payload: Plugin_Client_ActionRenderMangaPageButtonsEventPayload, - extensionID?: string, - ) => { + const sendActionRenderMangaPageButtonsEvent = useCallback((payload: Plugin_Client_ActionRenderMangaPageButtonsEventPayload, extensionID?: string) => { sendPluginMessage(PluginClientEvents.ActionRenderMangaPageButtons, payload, extensionID) }, []) @@ -374,14 +381,13 @@ export function usePluginSendActionRenderMangaPageButtonsEvent() { } } -export type Plugin_Client_ActionRenderMediaCardContextMenuItemsEventPayload = {} +export type Plugin_Client_ActionRenderMediaCardContextMenuItemsEventPayload = { +} export function usePluginSendActionRenderMediaCardContextMenuItemsEvent() { const { sendPluginMessage } = useWebsocketSender() - const sendActionRenderMediaCardContextMenuItemsEvent = useCallback((payload: Plugin_Client_ActionRenderMediaCardContextMenuItemsEventPayload, - extensionID?: string, - ) => { + const sendActionRenderMediaCardContextMenuItemsEvent = useCallback((payload: Plugin_Client_ActionRenderMediaCardContextMenuItemsEventPayload, extensionID?: string) => { sendPluginMessage(PluginClientEvents.ActionRenderMediaCardContextMenuItems, payload, extensionID) }, []) @@ -390,14 +396,13 @@ export function usePluginSendActionRenderMediaCardContextMenuItemsEvent() { } } -export type Plugin_Client_ActionRenderAnimeLibraryDropdownItemsEventPayload = {} +export type Plugin_Client_ActionRenderAnimeLibraryDropdownItemsEventPayload = { +} export function usePluginSendActionRenderAnimeLibraryDropdownItemsEvent() { const { sendPluginMessage } = useWebsocketSender() - const sendActionRenderAnimeLibraryDropdownItemsEvent = useCallback((payload: Plugin_Client_ActionRenderAnimeLibraryDropdownItemsEventPayload, - extensionID?: string, - ) => { + const sendActionRenderAnimeLibraryDropdownItemsEvent = useCallback((payload: Plugin_Client_ActionRenderAnimeLibraryDropdownItemsEventPayload, extensionID?: string) => { sendPluginMessage(PluginClientEvents.ActionRenderAnimeLibraryDropdownItems, payload, extensionID) }, []) @@ -406,14 +411,13 @@ export function usePluginSendActionRenderAnimeLibraryDropdownItemsEvent() { } } -export type Plugin_Client_ActionRenderEpisodeCardContextMenuItemsEventPayload = {} +export type Plugin_Client_ActionRenderEpisodeCardContextMenuItemsEventPayload = { +} export function usePluginSendActionRenderEpisodeCardContextMenuItemsEvent() { const { sendPluginMessage } = useWebsocketSender() - const sendActionRenderEpisodeCardContextMenuItemsEvent = useCallback((payload: Plugin_Client_ActionRenderEpisodeCardContextMenuItemsEventPayload, - extensionID?: string, - ) => { + const sendActionRenderEpisodeCardContextMenuItemsEvent = useCallback((payload: Plugin_Client_ActionRenderEpisodeCardContextMenuItemsEventPayload, extensionID?: string) => { sendPluginMessage(PluginClientEvents.ActionRenderEpisodeCardContextMenuItems, payload, extensionID) }, []) @@ -422,14 +426,13 @@ export function usePluginSendActionRenderEpisodeCardContextMenuItemsEvent() { } } -export type Plugin_Client_ActionRenderEpisodeGridItemMenuItemsEventPayload = {} +export type Plugin_Client_ActionRenderEpisodeGridItemMenuItemsEventPayload = { +} export function usePluginSendActionRenderEpisodeGridItemMenuItemsEvent() { const { sendPluginMessage } = useWebsocketSender() - const sendActionRenderEpisodeGridItemMenuItemsEvent = useCallback((payload: Plugin_Client_ActionRenderEpisodeGridItemMenuItemsEventPayload, - extensionID?: string, - ) => { + const sendActionRenderEpisodeGridItemMenuItemsEvent = useCallback((payload: Plugin_Client_ActionRenderEpisodeGridItemMenuItemsEventPayload, extensionID?: string) => { sendPluginMessage(PluginClientEvents.ActionRenderEpisodeGridItemMenuItems, payload, extensionID) }, []) @@ -644,7 +647,8 @@ export function usePluginSendDOMEventTriggeredEvent() { } } -export type Plugin_Client_DOMReadyEventPayload = {} +export type Plugin_Client_DOMReadyEventPayload = { +} export function usePluginSendDOMReadyEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -658,7 +662,8 @@ export function usePluginSendDOMReadyEvent() { } } -export type Plugin_Client_DOMMainTabReadyEventPayload = {} +export type Plugin_Client_DOMMainTabReadyEventPayload = { +} export function usePluginSendDOMMainTabReadyEvent() { const { sendPluginMessage } = useWebsocketSender() @@ -697,9 +702,7 @@ export type Plugin_Server_TrayUpdatedEventPayload = { components: any } -export function usePluginListenTrayUpdatedEvent(cb: (payload: Plugin_Server_TrayUpdatedEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenTrayUpdatedEvent(cb: (payload: Plugin_Server_TrayUpdatedEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.TrayUpdated, @@ -733,9 +736,7 @@ export type Plugin_Server_TrayBadgeUpdatedEventPayload = { badgeIntent: string } -export function usePluginListenTrayBadgeUpdatedEvent(cb: (payload: Plugin_Server_TrayBadgeUpdatedEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenTrayBadgeUpdatedEvent(cb: (payload: Plugin_Server_TrayBadgeUpdatedEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.TrayBadgeUpdated, @@ -772,9 +773,7 @@ export type Plugin_Server_WebviewUpdatedEventPayload = { components: any } -export function usePluginListenWebviewUpdatedEvent(cb: (payload: Plugin_Server_WebviewUpdatedEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenWebviewUpdatedEvent(cb: (payload: Plugin_Server_WebviewUpdatedEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.WebviewUpdated, @@ -789,9 +788,7 @@ export type Plugin_Server_WebviewIframeEventPayload = { options: any } -export function usePluginListenWebviewIframeEvent(cb: (payload: Plugin_Server_WebviewIframeEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenWebviewIframeEvent(cb: (payload: Plugin_Server_WebviewIframeEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.WebviewIframe, @@ -804,9 +801,7 @@ export type Plugin_Server_WebviewSidebarEventPayload = { icon: string } -export function usePluginListenWebviewSidebarEvent(cb: (payload: Plugin_Server_WebviewSidebarEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenWebviewSidebarEvent(cb: (payload: Plugin_Server_WebviewSidebarEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.WebviewSidebar, @@ -821,9 +816,7 @@ export type Plugin_Server_WebviewSyncStateEventPayload = { token: string } -export function usePluginListenWebviewSyncStateEvent(cb: (payload: Plugin_Server_WebviewSyncStateEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenWebviewSyncStateEvent(cb: (payload: Plugin_Server_WebviewSyncStateEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.WebviewSyncState, @@ -835,9 +828,7 @@ export type Plugin_Server_WebviewCloseEventPayload = { webviewId: string } -export function usePluginListenWebviewCloseEvent(cb: (payload: Plugin_Server_WebviewCloseEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenWebviewCloseEvent(cb: (payload: Plugin_Server_WebviewCloseEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.WebviewClose, @@ -850,9 +841,7 @@ export type Plugin_Server_CommandPaletteInfoEventPayload = { keyboardShortcut: string } -export function usePluginListenCommandPaletteInfoEvent(cb: (payload: Plugin_Server_CommandPaletteInfoEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenCommandPaletteInfoEvent(cb: (payload: Plugin_Server_CommandPaletteInfoEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.CommandPaletteInfo, @@ -865,9 +854,7 @@ export type Plugin_Server_CommandPaletteUpdatedEventPayload = { items: any } -export function usePluginListenCommandPaletteUpdatedEvent(cb: (payload: Plugin_Server_CommandPaletteUpdatedEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenCommandPaletteUpdatedEvent(cb: (payload: Plugin_Server_CommandPaletteUpdatedEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.CommandPaletteUpdated, @@ -875,11 +862,10 @@ export function usePluginListenCommandPaletteUpdatedEvent(cb: (payload: Plugin_S }) } -export type Plugin_Server_CommandPaletteOpenEventPayload = {} +export type Plugin_Server_CommandPaletteOpenEventPayload = { +} -export function usePluginListenCommandPaletteOpenEvent(cb: (payload: Plugin_Server_CommandPaletteOpenEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenCommandPaletteOpenEvent(cb: (payload: Plugin_Server_CommandPaletteOpenEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.CommandPaletteOpen, @@ -887,11 +873,10 @@ export function usePluginListenCommandPaletteOpenEvent(cb: (payload: Plugin_Serv }) } -export type Plugin_Server_CommandPaletteCloseEventPayload = {} +export type Plugin_Server_CommandPaletteCloseEventPayload = { +} -export function usePluginListenCommandPaletteCloseEvent(cb: (payload: Plugin_Server_CommandPaletteCloseEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenCommandPaletteCloseEvent(cb: (payload: Plugin_Server_CommandPaletteCloseEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.CommandPaletteClose, @@ -899,11 +884,10 @@ export function usePluginListenCommandPaletteCloseEvent(cb: (payload: Plugin_Ser }) } -export type Plugin_Server_CommandPaletteGetInputEventPayload = {} +export type Plugin_Server_CommandPaletteGetInputEventPayload = { +} -export function usePluginListenCommandPaletteGetInputEvent(cb: (payload: Plugin_Server_CommandPaletteGetInputEventPayload, - extensionId: string, -) => void, extensionID: string) { +export function usePluginListenCommandPaletteGetInputEvent(cb: (payload: Plugin_Server_CommandPaletteGetInputEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.CommandPaletteGetInput, @@ -915,9 +899,7 @@ export type Plugin_Server_CommandPaletteSetInputEventPayload = { value: string } -export function usePluginListenCommandPaletteSetInputEvent(cb: (payload: Plugin_Server_CommandPaletteSetInputEventPayload, - extensionId: string, -) => void, extensionID: string) { +export function usePluginListenCommandPaletteSetInputEvent(cb: (payload: Plugin_Server_CommandPaletteSetInputEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.CommandPaletteSetInput, @@ -929,9 +911,7 @@ export type Plugin_Server_ActionRenderAnimePageButtonsEventPayload = { buttons: any } -export function usePluginListenActionRenderAnimePageButtonsEvent(cb: (payload: Plugin_Server_ActionRenderAnimePageButtonsEventPayload, - extensionId: string, -) => void, extensionID: string) { +export function usePluginListenActionRenderAnimePageButtonsEvent(cb: (payload: Plugin_Server_ActionRenderAnimePageButtonsEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.ActionRenderAnimePageButtons, @@ -943,9 +923,7 @@ export type Plugin_Server_ActionRenderAnimePageDropdownItemsEventPayload = { items: any } -export function usePluginListenActionRenderAnimePageDropdownItemsEvent(cb: (payload: Plugin_Server_ActionRenderAnimePageDropdownItemsEventPayload, - extensionId: string, -) => void, extensionID: string) { +export function usePluginListenActionRenderAnimePageDropdownItemsEvent(cb: (payload: Plugin_Server_ActionRenderAnimePageDropdownItemsEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.ActionRenderAnimePageDropdownItems, @@ -957,9 +935,7 @@ export type Plugin_Server_ActionRenderMangaPageButtonsEventPayload = { buttons: any } -export function usePluginListenActionRenderMangaPageButtonsEvent(cb: (payload: Plugin_Server_ActionRenderMangaPageButtonsEventPayload, - extensionId: string, -) => void, extensionID: string) { +export function usePluginListenActionRenderMangaPageButtonsEvent(cb: (payload: Plugin_Server_ActionRenderMangaPageButtonsEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.ActionRenderMangaPageButtons, @@ -971,9 +947,7 @@ export type Plugin_Server_ActionRenderMediaCardContextMenuItemsEventPayload = { items: any } -export function usePluginListenActionRenderMediaCardContextMenuItemsEvent(cb: (payload: Plugin_Server_ActionRenderMediaCardContextMenuItemsEventPayload, - extensionId: string, -) => void, extensionID: string) { +export function usePluginListenActionRenderMediaCardContextMenuItemsEvent(cb: (payload: Plugin_Server_ActionRenderMediaCardContextMenuItemsEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.ActionRenderMediaCardContextMenuItems, @@ -985,9 +959,7 @@ export type Plugin_Server_ActionRenderEpisodeCardContextMenuItemsEventPayload = items: any } -export function usePluginListenActionRenderEpisodeCardContextMenuItemsEvent(cb: (payload: Plugin_Server_ActionRenderEpisodeCardContextMenuItemsEventPayload, - extensionId: string, -) => void, extensionID: string) { +export function usePluginListenActionRenderEpisodeCardContextMenuItemsEvent(cb: (payload: Plugin_Server_ActionRenderEpisodeCardContextMenuItemsEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.ActionRenderEpisodeCardContextMenuItems, @@ -999,9 +971,7 @@ export type Plugin_Server_ActionRenderEpisodeGridItemMenuItemsEventPayload = { items: any } -export function usePluginListenActionRenderEpisodeGridItemMenuItemsEvent(cb: (payload: Plugin_Server_ActionRenderEpisodeGridItemMenuItemsEventPayload, - extensionId: string, -) => void, extensionID: string) { +export function usePluginListenActionRenderEpisodeGridItemMenuItemsEvent(cb: (payload: Plugin_Server_ActionRenderEpisodeGridItemMenuItemsEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.ActionRenderEpisodeGridItemMenuItems, @@ -1013,9 +983,7 @@ export type Plugin_Server_ActionRenderAnimeLibraryDropdownItemsEventPayload = { items: any } -export function usePluginListenActionRenderAnimeLibraryDropdownItemsEvent(cb: (payload: Plugin_Server_ActionRenderAnimeLibraryDropdownItemsEventPayload, - extensionId: string, -) => void, extensionID: string) { +export function usePluginListenActionRenderAnimeLibraryDropdownItemsEvent(cb: (payload: Plugin_Server_ActionRenderAnimeLibraryDropdownItemsEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.ActionRenderAnimeLibraryDropdownItems, @@ -1041,9 +1009,7 @@ export type Plugin_Server_FormSetValuesEventPayload = { data: Record } -export function usePluginListenFormSetValuesEvent(cb: (payload: Plugin_Server_FormSetValuesEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenFormSetValuesEvent(cb: (payload: Plugin_Server_FormSetValuesEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.FormSetValues, @@ -1056,9 +1022,7 @@ export type Plugin_Server_FieldRefSetValueEventPayload = { value: any } -export function usePluginListenFieldRefSetValueEvent(cb: (payload: Plugin_Server_FieldRefSetValueEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenFieldRefSetValueEvent(cb: (payload: Plugin_Server_FieldRefSetValueEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.FieldRefSetValue, @@ -1070,9 +1034,7 @@ export type Plugin_Server_FatalErrorEventPayload = { error: string } -export function usePluginListenFatalErrorEvent(cb: (payload: Plugin_Server_FatalErrorEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenFatalErrorEvent(cb: (payload: Plugin_Server_FatalErrorEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.FatalError, @@ -1084,9 +1046,7 @@ export type Plugin_Server_ScreenNavigateToEventPayload = { path: string } -export function usePluginListenScreenNavigateToEvent(cb: (payload: Plugin_Server_ScreenNavigateToEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenScreenNavigateToEvent(cb: (payload: Plugin_Server_ScreenNavigateToEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.ScreenNavigateTo, @@ -1094,11 +1054,10 @@ export function usePluginListenScreenNavigateToEvent(cb: (payload: Plugin_Server }) } -export type Plugin_Server_ScreenReloadEventPayload = {} +export type Plugin_Server_ScreenReloadEventPayload = { +} -export function usePluginListenScreenReloadEvent(cb: (payload: Plugin_Server_ScreenReloadEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenScreenReloadEvent(cb: (payload: Plugin_Server_ScreenReloadEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.ScreenReload, @@ -1106,11 +1065,10 @@ export function usePluginListenScreenReloadEvent(cb: (payload: Plugin_Server_Scr }) } -export type Plugin_Server_ScreenGetCurrentEventPayload = {} +export type Plugin_Server_ScreenGetCurrentEventPayload = { +} -export function usePluginListenScreenGetCurrentEvent(cb: (payload: Plugin_Server_ScreenGetCurrentEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenScreenGetCurrentEvent(cb: (payload: Plugin_Server_ScreenGetCurrentEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.ScreenGetCurrent, @@ -1142,9 +1100,7 @@ export type Plugin_Server_DOMQueryOneEventPayload = { identifyChildren: boolean } -export function usePluginListenDOMQueryOneEvent(cb: (payload: Plugin_Server_DOMQueryOneEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenDOMQueryOneEvent(cb: (payload: Plugin_Server_DOMQueryOneEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.DOMQueryOne, @@ -1160,9 +1116,7 @@ export type Plugin_Server_DOMObserveEventPayload = { identifyChildren: boolean } -export function usePluginListenDOMObserveEvent(cb: (payload: Plugin_Server_DOMObserveEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenDOMObserveEvent(cb: (payload: Plugin_Server_DOMObserveEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.DOMObserve, @@ -1174,9 +1128,7 @@ export type Plugin_Server_DOMStopObserveEventPayload = { observerId: string } -export function usePluginListenDOMStopObserveEvent(cb: (payload: Plugin_Server_DOMStopObserveEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenDOMStopObserveEvent(cb: (payload: Plugin_Server_DOMStopObserveEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.DOMStopObserve, @@ -1204,9 +1156,7 @@ export type Plugin_Server_DOMManipulateEventPayload = { requestId: string } -export function usePluginListenDOMManipulateEvent(cb: (payload: Plugin_Server_DOMManipulateEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenDOMManipulateEvent(cb: (payload: Plugin_Server_DOMManipulateEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.DOMManipulate, @@ -1223,9 +1173,7 @@ export type Plugin_Server_DOMObserveInViewEventPayload = { margin: string } -export function usePluginListenDOMObserveInViewEvent(cb: (payload: Plugin_Server_DOMObserveInViewEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenDOMObserveInViewEvent(cb: (payload: Plugin_Server_DOMObserveInViewEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.DOMObserveInView, @@ -1235,9 +1183,7 @@ export function usePluginListenDOMObserveInViewEvent(cb: (payload: Plugin_Server export type Plugin_Server_DOMGetViewportSizeEventPayload = {} -export function usePluginListenDOMGetViewportSizeEvent(cb: (payload: Plugin_Server_DOMGetViewportSizeEventPayload, extensionId: string) => void, - extensionID: string, -) { +export function usePluginListenDOMGetViewportSizeEvent(cb: (payload: Plugin_Server_DOMGetViewportSizeEventPayload, extensionId: string) => void, extensionID: string) { return useWebsocketPluginMessageListener({ extensionId: extensionID, type: PluginServerEvents.DOMGetViewportSize, diff --git a/seanime-web/src/app/(main)/search/_components/advanced-search-options.tsx b/seanime-web/src/app/(main)/search/_components/advanced-search-options.tsx index fcd38fe7a..32e37965f 100644 --- a/seanime-web/src/app/(main)/search/_components/advanced-search-options.tsx +++ b/seanime-web/src/app/(main)/search/_components/advanced-search-options.tsx @@ -9,6 +9,7 @@ import { ADVANCED_SEARCH_SORTING_MANGA, ADVANCED_SEARCH_STATUS, ADVANCED_SEARCH_TYPE, + ADVANCED_SEARCH_MEDIA_TAGS } from "@/app/(main)/search/_lib/advanced-search-constants" import { __advancedSearch_paramsAtom } from "@/app/(main)/search/_lib/advanced-search.atoms" import { AppLayoutStack } from "@/components/ui/app-layout" @@ -43,7 +44,8 @@ export function AdvancedSearchOptions() { (params.genre === null || !params.genre.length) && (params.status === null || !params.status.length) && params.format === null && params.season === null && params.year === null && params.isAdult === false && params.minScore === null && - (params.countryOfOrigin === null || params.type === "anime")) + (params.countryOfOrigin === null || params.type === "anime")) && + (params.tags === null || !params.tags.length) }, [params]) return ( @@ -90,6 +92,18 @@ export function AdvancedSearchOptions() { })} fieldLabelClass="hidden" /> + ({ value: tag.name, label: tag.name, textValue: tag.name }))} + value={params.tags ? params.tags : []} + onValueChange={v => setParams(draft => { + draft.tags = v + return + })} + fieldLabelClass="hidden" + /> {params.type === "anime" && } diff --git a/seanime-web/src/lib/helpers/filtering.ts b/seanime-web/src/lib/helpers/filtering.ts index aed46edba..f3ce86573 100644 --- a/seanime-web/src/lib/helpers/filtering.ts +++ b/seanime-web/src/lib/helpers/filtering.ts @@ -107,6 +107,7 @@ export type CollectionType = "anime" | "manga" export type CollectionParams = { sorting: CollectionSorting genre: string[] | null + tags: string[] | null status: AL_MediaStatus | null format: AL_MediaFormat | null season: AL_MediaSeason | null @@ -122,6 +123,7 @@ export type CollectionParams = { export const DEFAULT_COLLECTION_PARAMS: CollectionParams<"anime"> = { sorting: "SCORE_DESC", genre: null, + tags: null, status: null, format: null, season: null, @@ -133,6 +135,7 @@ export const DEFAULT_COLLECTION_PARAMS: CollectionParams<"anime"> = { export const DEFAULT_ANIME_COLLECTION_PARAMS: CollectionParams<"anime"> = { sorting: "SCORE_DESC", genre: null, + tags: null, status: null, format: null, season: null, @@ -144,6 +147,7 @@ export const DEFAULT_ANIME_COLLECTION_PARAMS: CollectionParams<"anime"> = { export const DEFAULT_MANGA_COLLECTION_PARAMS: CollectionParams<"manga"> = { sorting: "SCORE_DESC", genre: null, + tags: null, status: null, format: null, season: null, @@ -214,6 +218,13 @@ export function filterListEntries { + const tags = n.media?.tags?.map(t => t.name) ?? [] + return params.tags?.every(tag => tags.includes(tag)) + }) + } + // Initial sort by name arr = sortBy(arr, n => n?.media?.title?.userPreferred).reverse()