diff --git a/codegen/generated/handlers.json b/codegen/generated/handlers.json index 0f59df0ac..8d29f02d1 100644 --- a/codegen/generated/handlers.json +++ b/codegen/generated/handlers.json @@ -381,6 +381,15 @@ "required": false, "descriptions": [] }, + { + "name": "Tags", + "jsonName": "tags", + "goType": "[]string", + "usedStructType": "", + "typescriptType": "Array\u003cstring\u003e", + "required": false, + "descriptions": [] + }, { "name": "AverageScoreGreater", "jsonName": "averageScore_greater", @@ -5901,6 +5910,15 @@ "required": false, "descriptions": [] }, + { + "name": "Tags", + "jsonName": "tags", + "goType": "[]string", + "usedStructType": "", + "typescriptType": "Array\u003cstring\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..5c7f5bb14 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", @@ -863,6 +874,17 @@ "public": true, "comments": [] }, + { + "name": "Tags", + "jsonName": "tags", + "goType": "[]BaseManga_Tags", + "typescriptType": "Array\u003cAL_BaseManga_Tags\u003e", + "usedTypescriptType": "AL_BaseManga_Tags", + "usedStructName": "anilist.BaseManga_Tags", + "required": false, + "public": true, + "comments": [] + }, { "name": "Title", "jsonName": "title", @@ -1367,50 +1389,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 +1403,8 @@ "comments": [] }, { - "name": "Romaji", - "jsonName": "romaji", + "name": "Description", + "jsonName": "description", "goType": "string", "typescriptType": "string", "required": false, @@ -1427,128 +1412,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 +1466,8 @@ "comments": [] }, { - "name": "Day", - "jsonName": "day", + "name": "UserID", + "jsonName": "userId", "goType": "int", "typescriptType": "number", "required": false, @@ -1570,45 +1480,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 +1517,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 +1563,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 +1609,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 +1646,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 +1683,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 +1720,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 +1757,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 +1803,339 @@ { "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": [ + { + "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_StartDate", + "formattedName": "AL_CompleteAnime_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_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": [ { @@ -2270,17 +2474,75 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "AnimeSchedule_Previous", - "formattedName": "AL_AnimeSchedule_Previous", + "name": "AnimeSchedule_Previous", + "formattedName": "AL_AnimeSchedule_Previous", + "package": "anilist", + "fields": [ + { + "name": "Nodes", + "jsonName": "nodes", + "goType": "[]AnimeSchedule_Previous_Nodes", + "typescriptType": "Array\u003cAL_AnimeSchedule_Previous_Nodes\u003e", + "usedTypescriptType": "AL_AnimeSchedule_Previous_Nodes", + "usedStructName": "anilist.AnimeSchedule_Previous_Nodes", + "required": false, + "public": true, + "comments": [] + } + ], + "comments": [] + }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "AnimeSchedule_Upcoming_Nodes", + "formattedName": "AL_AnimeSchedule_Upcoming_Nodes", + "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": "AnimeSchedule_Upcoming", + "formattedName": "AL_AnimeSchedule_Upcoming", "package": "anilist", "fields": [ { "name": "Nodes", "jsonName": "nodes", - "goType": "[]AnimeSchedule_Previous_Nodes", - "typescriptType": "Array\u003cAL_AnimeSchedule_Previous_Nodes\u003e", - "usedTypescriptType": "AL_AnimeSchedule_Previous_Nodes", - "usedStructName": "anilist.AnimeSchedule_Previous_Nodes", + "goType": "[]AnimeSchedule_Upcoming_Nodes", + "typescriptType": "Array\u003cAL_AnimeSchedule_Upcoming_Nodes\u003e", + "usedTypescriptType": "AL_AnimeSchedule_Upcoming_Nodes", + "usedStructName": "anilist.AnimeSchedule_Upcoming_Nodes", "required": false, "public": true, "comments": [] @@ -2291,13 +2553,31 @@ { "filepath": "../internal/api/anilist/client_gen.go", "filename": "client_gen.go", - "name": "AnimeSchedule_Upcoming_Nodes", - "formattedName": "AL_AnimeSchedule_Upcoming_Nodes", + "name": "BaseManga_Tags", + "formattedName": "AL_BaseManga_Tags", "package": "anilist", "fields": [ { - "name": "AiringAt", - "jsonName": "airingAt", + "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, @@ -2305,40 +2585,55 @@ "comments": [] }, { - "name": "TimeUntilAiring", - "jsonName": "timeUntilAiring", - "goType": "int", - "typescriptType": "number", + "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": "Episode", - "jsonName": "episode", + "name": "Rank", + "jsonName": "rank", "goType": "int", "typescriptType": "number", - "required": true, + "required": false, "public": true, "comments": [] - } - ], - "comments": [] - }, - { - "filepath": "../internal/api/anilist/client_gen.go", - "filename": "client_gen.go", - "name": "AnimeSchedule_Upcoming", - "formattedName": "AL_AnimeSchedule_Upcoming", - "package": "anilist", - "fields": [ + }, { - "name": "Nodes", - "jsonName": "nodes", - "goType": "[]AnimeSchedule_Upcoming_Nodes", - "typescriptType": "Array\u003cAL_AnimeSchedule_Upcoming_Nodes\u003e", - "usedTypescriptType": "AL_AnimeSchedule_Upcoming_Nodes", - "usedStructName": "anilist.AnimeSchedule_Upcoming_Nodes", + "name": "UserID", + "jsonName": "userId", + "goType": "int", + "typescriptType": "number", "required": false, "public": true, "comments": [] @@ -2623,6 +2918,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 +3742,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 +4305,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 +4636,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 +4986,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 +5589,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 +5973,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 +6966,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 +7393,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 +7597,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 +8015,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", @@ -8191,6 +9407,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_Tags", + "formattedName": "AL_MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_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", @@ -8555,6 +9862,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "SearchBaseManga_Page_Media_BaseManga_Tags", + "formattedName": "AL_SearchBaseManga_Page_Media_BaseManga_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", @@ -8753,6 +10151,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "BaseMangaById_Media_BaseManga_Tags", + "formattedName": "AL_BaseMangaById_Media_BaseManga_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", @@ -8919,6 +10408,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "MangaDetailsById_Media_Tags", + "formattedName": "AL_MangaDetailsById_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", @@ -9588,6 +11168,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "MangaDetailsById_Media_Relations_Edges_Node_BaseManga_Tags", + "formattedName": "AL_MangaDetailsById_Media_Relations_Edges_Node_BaseManga_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", @@ -9850,6 +11521,17 @@ "public": true, "comments": [] }, + { + "name": "Tags", + "jsonName": "tags", + "goType": "[]MangaDetailsById_Media_Tags", + "typescriptType": "Array\u003cAL_MangaDetailsById_Media_Tags\u003e", + "usedTypescriptType": "AL_MangaDetailsById_Media_Tags", + "usedStructName": "anilist.MangaDetailsById_Media_Tags", + "required": false, + "public": true, + "comments": [] + }, { "name": "Rankings", "jsonName": "rankings", @@ -9952,6 +11634,97 @@ ], "comments": [] }, + { + "filepath": "../internal/api/anilist/client_gen.go", + "filename": "client_gen.go", + "name": "ListManga_Page_Media_BaseManga_Tags", + "formattedName": "AL_ListManga_Page_Media_BaseManga_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 +12287,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 +28549,7 @@ "comments": [] }, { - "filepath": "../internal/continuity/history.go", + "filepath": "..\\internal\\continuity\\history.go", "filename": "history.go", "name": "WatchHistory", "formattedName": "Continuity_WatchHistory", @@ -29484,7 +31348,7 @@ "comments": [] }, { - "filepath": "../internal/database/models/models.go", + "filepath": "..\\internal\\database\\models\\models.go", "filename": "models.go", "name": "LibraryPaths", "formattedName": "Models_LibraryPaths", @@ -29600,7 +31464,7 @@ "comments": [] }, { - "filepath": "../internal/database/models/models.go", + "filepath": "..\\internal\\database\\models\\models.go", "filename": "models.go", "name": "IntSlice", "formattedName": "Models_IntSlice", @@ -31742,7 +33606,7 @@ ] }, { - "filepath": "../internal/database/models/models.go", + "filepath": "..\\internal\\database\\models\\models.go", "filename": "models.go", "name": "StringSlice", "formattedName": "Models_StringSlice", @@ -54286,7 +56150,7 @@ ] }, { - "filepath": "../internal/local/database_models.go", + "filepath": "..\\internal\\local\\database_models.go", "filename": "database_models.go", "name": "StringMap", "formattedName": "Local_StringMap", @@ -54300,7 +56164,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 +57636,7 @@ "comments": [] }, { - "filepath": "../internal/manga/download.go", + "filepath": "..\\internal\\manga\\download.go", "filename": "download.go", "name": "MediaMap", "formattedName": "Manga_MediaMap", @@ -55787,7 +57651,7 @@ "comments": null }, { - "filepath": "../internal/manga/download.go", + "filepath": "..\\internal\\manga\\download.go", "filename": "download.go", "name": "ProviderDownloadMap", "formattedName": "Manga_ProviderDownloadMap", @@ -56215,7 +58079,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 +68335,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..19dfcb4fc 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) @@ -44,7 +44,7 @@ type AnilistClient interface { SearchBaseManga(ctx context.Context, page *int, perPage *int, sort []*MediaSort, search *string, status []*MediaStatus, interceptors ...clientv2.RequestInterceptor) (*SearchBaseManga, error) BaseMangaByID(ctx context.Context, id *int, interceptors ...clientv2.RequestInterceptor) (*BaseMangaByID, error) MangaDetailsByID(ctx context.Context, id *int, interceptors ...clientv2.RequestInterceptor) (*MangaDetailsByID, error) - ListManga(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, averageScoreGreater *int, startDateGreater *string, startDateLesser *string, format *MediaFormat, countryOfOrigin *string, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListManga, error) + ListManga(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, tags []*string, averageScoreGreater *int, startDateGreater *string, startDateLesser *string, format *MediaFormat, countryOfOrigin *string, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListManga, error) ViewerStats(ctx context.Context, interceptors ...clientv2.RequestInterceptor) (*ViewerStats, error) StudioDetails(ctx context.Context, id *int, interceptors ...clientv2.RequestInterceptor) (*StudioDetails, error) GetViewer(ctx context.Context, interceptors ...clientv2.RequestInterceptor) (*GetViewer, 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) { @@ -232,9 +232,9 @@ func (ac *AnilistClientImpl) MangaDetailsByID(ctx context.Context, id *int, inte return ac.Client.MangaDetailsByID(ctx, id, interceptors...) } -func (ac *AnilistClientImpl) ListManga(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, averageScoreGreater *int, startDateGreater *string, startDateLesser *string, format *MediaFormat, countryOfOrigin *string, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListManga, error) { +func (ac *AnilistClientImpl) ListManga(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, tags []*string, averageScoreGreater *int, startDateGreater *string, startDateLesser *string, format *MediaFormat, countryOfOrigin *string, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListManga, error) { ac.logger.Debug().Msg("anilist: Fetching manga list") - return ac.Client.ListManga(ctx, page, search, perPage, sort, status, genres, averageScoreGreater, startDateGreater, startDateLesser, format, countryOfOrigin, isAdult, interceptors...) + return ac.Client.ListManga(ctx, page, search, perPage, sort, status, genres, tags, averageScoreGreater, startDateGreater, startDateLesser, format, countryOfOrigin, isAdult, interceptors...) } func (ac *AnilistClientImpl) StudioDetails(ctx context.Context, id *int, interceptors ...clientv2.RequestInterceptor) (*StudioDetails, error) { diff --git a/internal/api/anilist/client_gen.go b/internal/api/anilist/client_gen.go index 123335e8d..13c3469a6 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) @@ -29,7 +29,7 @@ type GithubGraphQLClient interface { SearchBaseManga(ctx context.Context, page *int, perPage *int, sort []*MediaSort, search *string, status []*MediaStatus, interceptors ...clientv2.RequestInterceptor) (*SearchBaseManga, error) BaseMangaByID(ctx context.Context, id *int, interceptors ...clientv2.RequestInterceptor) (*BaseMangaByID, error) MangaDetailsByID(ctx context.Context, id *int, interceptors ...clientv2.RequestInterceptor) (*MangaDetailsByID, error) - ListManga(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, averageScoreGreater *int, startDateGreater *string, startDateLesser *string, format *MediaFormat, countryOfOrigin *string, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListManga, error) + ListManga(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, tags []*string, averageScoreGreater *int, startDateGreater *string, startDateLesser *string, format *MediaFormat, countryOfOrigin *string, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListManga, error) ViewerStats(ctx context.Context, interceptors ...clientv2.RequestInterceptor) (*ViewerStats, error) StudioDetails(ctx context.Context, id *int, interceptors ...clientv2.RequestInterceptor) (*StudioDetails, error) GetViewer(ctx context.Context, interceptors ...clientv2.RequestInterceptor) (*GetViewer, error) @@ -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{} @@ -496,6 +503,7 @@ type BaseManga struct { MeanScore *int "json:\"meanScore,omitempty\" graphql:\"meanScore\"" Description *string "json:\"description,omitempty\" graphql:\"description\"" Genres []*string "json:\"genres,omitempty\" graphql:\"genres\"" + Tags []*BaseManga_Tags "json:\"tags,omitempty\" graphql:\"tags\"" Title *BaseManga_Title "json:\"title,omitempty\" graphql:\"title\"" CoverImage *BaseManga_CoverImage "json:\"coverImage,omitempty\" graphql:\"coverImage\"" StartDate *BaseManga_StartDate "json:\"startDate,omitempty\" graphql:\"startDate\"" @@ -598,6 +606,12 @@ func (t *BaseManga) GetGenres() []*string { } return t.Genres } +func (t *BaseManga) GetTags() []*BaseManga_Tags { + if t == nil { + t = &BaseManga{} + } + return t.Tags +} func (t *BaseManga) GetTitle() *BaseManga_Title { if t == nil { t = &BaseManga{} @@ -945,6 +959,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 +1354,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\"" @@ -1599,6 +1747,73 @@ func (t *AnimeSchedule_Upcoming) GetNodes() []*AnimeSchedule_Upcoming_Nodes { return t.Nodes } +type BaseManga_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 *BaseManga_Tags) GetCategory() *string { + if t == nil { + t = &BaseManga_Tags{} + } + return t.Category +} +func (t *BaseManga_Tags) GetDescription() *string { + if t == nil { + t = &BaseManga_Tags{} + } + return t.Description +} +func (t *BaseManga_Tags) GetID() int { + if t == nil { + t = &BaseManga_Tags{} + } + return t.ID +} +func (t *BaseManga_Tags) GetIsAdult() *bool { + if t == nil { + t = &BaseManga_Tags{} + } + return t.IsAdult +} +func (t *BaseManga_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &BaseManga_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *BaseManga_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &BaseManga_Tags{} + } + return t.IsMediaSpoiler +} +func (t *BaseManga_Tags) GetName() string { + if t == nil { + t = &BaseManga_Tags{} + } + return t.Name +} +func (t *BaseManga_Tags) GetRank() *int { + if t == nil { + t = &BaseManga_Tags{} + } + return t.Rank +} +func (t *BaseManga_Tags) GetUserID() *int { + if t == nil { + t = &BaseManga_Tags{} + } + return t.UserID +} + type BaseManga_Title struct { UserPreferred *string "json:\"userPreferred,omitempty\" graphql:\"userPreferred\"" Romaji *string "json:\"romaji,omitempty\" graphql:\"romaji\"" @@ -1788,6 +2003,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 +2565,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 +2942,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 +3173,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,9 +3415,76 @@ func (t *SearchBaseAnimeByIds_Page_PageInfo) GetHasNextPage() *bool { return t.HasNextPage } -type SearchBaseAnimeByIds_Page_Media_BaseAnime_Trailer struct { - ID *string "json:\"id,omitempty\" graphql:\"id\"" - Site *string "json:\"site,omitempty\" graphql:\"site\"" +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\"" Thumbnail *string "json:\"thumbnail,omitempty\" graphql:\"thumbnail\"" } @@ -3278,6 +3828,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 +4088,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 +4737,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 +5002,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 +5042,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 +5166,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 +5454,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\"" @@ -5442,6 +6334,73 @@ func (t *MangaCollection_MediaListCollection_Lists_Entries_CompletedAt) GetDay() return t.Day } +type MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_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 *MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_Tags) GetCategory() *string { + if t == nil { + t = &MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_Tags{} + } + return t.Category +} +func (t *MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_Tags) GetDescription() *string { + if t == nil { + t = &MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_Tags{} + } + return t.Description +} +func (t *MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_Tags) GetID() int { + if t == nil { + t = &MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_Tags{} + } + return t.ID +} +func (t *MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_Tags) GetIsAdult() *bool { + if t == nil { + t = &MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_Tags{} + } + return t.IsAdult +} +func (t *MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_Tags{} + } + return t.IsMediaSpoiler +} +func (t *MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_Tags) GetName() string { + if t == nil { + t = &MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_Tags{} + } + return t.Name +} +func (t *MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_Tags) GetRank() *int { + if t == nil { + t = &MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_Tags{} + } + return t.Rank +} +func (t *MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_Tags) GetUserID() *int { + if t == nil { + t = &MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_Tags{} + } + return t.UserID +} + type MangaCollection_MediaListCollection_Lists_Entries_Media_BaseManga_Title struct { UserPreferred *string "json:\"userPreferred,omitempty\" graphql:\"userPreferred\"" Romaji *string "json:\"romaji,omitempty\" graphql:\"romaji\"" @@ -5676,12 +6635,79 @@ func (t *MangaCollection_MediaListCollection) GetLists() []*MangaCollection_Medi type SearchBaseManga_Page_PageInfo struct { HasNextPage *bool "json:\"hasNextPage,omitempty\" graphql:\"hasNextPage\"" } - -func (t *SearchBaseManga_Page_PageInfo) GetHasNextPage() *bool { + +func (t *SearchBaseManga_Page_PageInfo) GetHasNextPage() *bool { + if t == nil { + t = &SearchBaseManga_Page_PageInfo{} + } + return t.HasNextPage +} + +type SearchBaseManga_Page_Media_BaseManga_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 *SearchBaseManga_Page_Media_BaseManga_Tags) GetCategory() *string { + if t == nil { + t = &SearchBaseManga_Page_Media_BaseManga_Tags{} + } + return t.Category +} +func (t *SearchBaseManga_Page_Media_BaseManga_Tags) GetDescription() *string { + if t == nil { + t = &SearchBaseManga_Page_Media_BaseManga_Tags{} + } + return t.Description +} +func (t *SearchBaseManga_Page_Media_BaseManga_Tags) GetID() int { + if t == nil { + t = &SearchBaseManga_Page_Media_BaseManga_Tags{} + } + return t.ID +} +func (t *SearchBaseManga_Page_Media_BaseManga_Tags) GetIsAdult() *bool { + if t == nil { + t = &SearchBaseManga_Page_Media_BaseManga_Tags{} + } + return t.IsAdult +} +func (t *SearchBaseManga_Page_Media_BaseManga_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &SearchBaseManga_Page_Media_BaseManga_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *SearchBaseManga_Page_Media_BaseManga_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &SearchBaseManga_Page_Media_BaseManga_Tags{} + } + return t.IsMediaSpoiler +} +func (t *SearchBaseManga_Page_Media_BaseManga_Tags) GetName() string { + if t == nil { + t = &SearchBaseManga_Page_Media_BaseManga_Tags{} + } + return t.Name +} +func (t *SearchBaseManga_Page_Media_BaseManga_Tags) GetRank() *int { if t == nil { - t = &SearchBaseManga_Page_PageInfo{} + t = &SearchBaseManga_Page_Media_BaseManga_Tags{} } - return t.HasNextPage + return t.Rank +} +func (t *SearchBaseManga_Page_Media_BaseManga_Tags) GetUserID() *int { + if t == nil { + t = &SearchBaseManga_Page_Media_BaseManga_Tags{} + } + return t.UserID } type SearchBaseManga_Page_Media_BaseManga_Title struct { @@ -5816,6 +6842,73 @@ func (t *SearchBaseManga_Page) GetMedia() []*BaseManga { return t.Media } +type BaseMangaById_Media_BaseManga_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 *BaseMangaById_Media_BaseManga_Tags) GetCategory() *string { + if t == nil { + t = &BaseMangaById_Media_BaseManga_Tags{} + } + return t.Category +} +func (t *BaseMangaById_Media_BaseManga_Tags) GetDescription() *string { + if t == nil { + t = &BaseMangaById_Media_BaseManga_Tags{} + } + return t.Description +} +func (t *BaseMangaById_Media_BaseManga_Tags) GetID() int { + if t == nil { + t = &BaseMangaById_Media_BaseManga_Tags{} + } + return t.ID +} +func (t *BaseMangaById_Media_BaseManga_Tags) GetIsAdult() *bool { + if t == nil { + t = &BaseMangaById_Media_BaseManga_Tags{} + } + return t.IsAdult +} +func (t *BaseMangaById_Media_BaseManga_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &BaseMangaById_Media_BaseManga_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *BaseMangaById_Media_BaseManga_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &BaseMangaById_Media_BaseManga_Tags{} + } + return t.IsMediaSpoiler +} +func (t *BaseMangaById_Media_BaseManga_Tags) GetName() string { + if t == nil { + t = &BaseMangaById_Media_BaseManga_Tags{} + } + return t.Name +} +func (t *BaseMangaById_Media_BaseManga_Tags) GetRank() *int { + if t == nil { + t = &BaseMangaById_Media_BaseManga_Tags{} + } + return t.Rank +} +func (t *BaseMangaById_Media_BaseManga_Tags) GetUserID() *int { + if t == nil { + t = &BaseMangaById_Media_BaseManga_Tags{} + } + return t.UserID +} + type BaseMangaById_Media_BaseManga_Title struct { UserPreferred *string "json:\"userPreferred,omitempty\" graphql:\"userPreferred\"" Romaji *string "json:\"romaji,omitempty\" graphql:\"romaji\"" @@ -5930,6 +7023,73 @@ func (t *BaseMangaById_Media_BaseManga_EndDate) GetDay() *int { return t.Day } +type MangaDetailsById_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 *MangaDetailsById_Media_Tags) GetCategory() *string { + if t == nil { + t = &MangaDetailsById_Media_Tags{} + } + return t.Category +} +func (t *MangaDetailsById_Media_Tags) GetDescription() *string { + if t == nil { + t = &MangaDetailsById_Media_Tags{} + } + return t.Description +} +func (t *MangaDetailsById_Media_Tags) GetID() int { + if t == nil { + t = &MangaDetailsById_Media_Tags{} + } + return t.ID +} +func (t *MangaDetailsById_Media_Tags) GetIsAdult() *bool { + if t == nil { + t = &MangaDetailsById_Media_Tags{} + } + return t.IsAdult +} +func (t *MangaDetailsById_Media_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &MangaDetailsById_Media_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *MangaDetailsById_Media_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &MangaDetailsById_Media_Tags{} + } + return t.IsMediaSpoiler +} +func (t *MangaDetailsById_Media_Tags) GetName() string { + if t == nil { + t = &MangaDetailsById_Media_Tags{} + } + return t.Name +} +func (t *MangaDetailsById_Media_Tags) GetRank() *int { + if t == nil { + t = &MangaDetailsById_Media_Tags{} + } + return t.Rank +} +func (t *MangaDetailsById_Media_Tags) GetUserID() *int { + if t == nil { + t = &MangaDetailsById_Media_Tags{} + } + return t.UserID +} + type MangaDetailsById_Media_Rankings struct { Context string "json:\"context\" graphql:\"context\"" Type MediaRankType "json:\"type\" graphql:\"type\"" @@ -6371,6 +7531,73 @@ func (t *MangaDetailsById_Media_Recommendations) GetEdges() []*MangaDetailsById_ return t.Edges } +type MangaDetailsById_Media_Relations_Edges_Node_BaseManga_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 *MangaDetailsById_Media_Relations_Edges_Node_BaseManga_Tags) GetCategory() *string { + if t == nil { + t = &MangaDetailsById_Media_Relations_Edges_Node_BaseManga_Tags{} + } + return t.Category +} +func (t *MangaDetailsById_Media_Relations_Edges_Node_BaseManga_Tags) GetDescription() *string { + if t == nil { + t = &MangaDetailsById_Media_Relations_Edges_Node_BaseManga_Tags{} + } + return t.Description +} +func (t *MangaDetailsById_Media_Relations_Edges_Node_BaseManga_Tags) GetID() int { + if t == nil { + t = &MangaDetailsById_Media_Relations_Edges_Node_BaseManga_Tags{} + } + return t.ID +} +func (t *MangaDetailsById_Media_Relations_Edges_Node_BaseManga_Tags) GetIsAdult() *bool { + if t == nil { + t = &MangaDetailsById_Media_Relations_Edges_Node_BaseManga_Tags{} + } + return t.IsAdult +} +func (t *MangaDetailsById_Media_Relations_Edges_Node_BaseManga_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &MangaDetailsById_Media_Relations_Edges_Node_BaseManga_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *MangaDetailsById_Media_Relations_Edges_Node_BaseManga_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &MangaDetailsById_Media_Relations_Edges_Node_BaseManga_Tags{} + } + return t.IsMediaSpoiler +} +func (t *MangaDetailsById_Media_Relations_Edges_Node_BaseManga_Tags) GetName() string { + if t == nil { + t = &MangaDetailsById_Media_Relations_Edges_Node_BaseManga_Tags{} + } + return t.Name +} +func (t *MangaDetailsById_Media_Relations_Edges_Node_BaseManga_Tags) GetRank() *int { + if t == nil { + t = &MangaDetailsById_Media_Relations_Edges_Node_BaseManga_Tags{} + } + return t.Rank +} +func (t *MangaDetailsById_Media_Relations_Edges_Node_BaseManga_Tags) GetUserID() *int { + if t == nil { + t = &MangaDetailsById_Media_Relations_Edges_Node_BaseManga_Tags{} + } + return t.UserID +} + type MangaDetailsById_Media_Relations_Edges_Node_BaseManga_Title struct { UserPreferred *string "json:\"userPreferred,omitempty\" graphql:\"userPreferred\"" Romaji *string "json:\"romaji,omitempty\" graphql:\"romaji\"" @@ -6519,6 +7746,7 @@ type MangaDetailsById_Media struct { ID int "json:\"id\" graphql:\"id\"" Duration *int "json:\"duration,omitempty\" graphql:\"duration\"" Genres []*string "json:\"genres,omitempty\" graphql:\"genres\"" + Tags []*MangaDetailsById_Media_Tags "json:\"tags,omitempty\" graphql:\"tags\"" Rankings []*MangaDetailsById_Media_Rankings "json:\"rankings,omitempty\" graphql:\"rankings\"" Characters *MangaDetailsById_Media_Characters "json:\"characters,omitempty\" graphql:\"characters\"" Recommendations *MangaDetailsById_Media_Recommendations "json:\"recommendations,omitempty\" graphql:\"recommendations\"" @@ -6549,6 +7777,12 @@ func (t *MangaDetailsById_Media) GetGenres() []*string { } return t.Genres } +func (t *MangaDetailsById_Media) GetTags() []*MangaDetailsById_Media_Tags { + if t == nil { + t = &MangaDetailsById_Media{} + } + return t.Tags +} func (t *MangaDetailsById_Media) GetRankings() []*MangaDetailsById_Media_Rankings { if t == nil { t = &MangaDetailsById_Media{} @@ -6613,6 +7847,73 @@ func (t *ListManga_Page_PageInfo) GetLastPage() *int { return t.LastPage } +type ListManga_Page_Media_BaseManga_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 *ListManga_Page_Media_BaseManga_Tags) GetCategory() *string { + if t == nil { + t = &ListManga_Page_Media_BaseManga_Tags{} + } + return t.Category +} +func (t *ListManga_Page_Media_BaseManga_Tags) GetDescription() *string { + if t == nil { + t = &ListManga_Page_Media_BaseManga_Tags{} + } + return t.Description +} +func (t *ListManga_Page_Media_BaseManga_Tags) GetID() int { + if t == nil { + t = &ListManga_Page_Media_BaseManga_Tags{} + } + return t.ID +} +func (t *ListManga_Page_Media_BaseManga_Tags) GetIsAdult() *bool { + if t == nil { + t = &ListManga_Page_Media_BaseManga_Tags{} + } + return t.IsAdult +} +func (t *ListManga_Page_Media_BaseManga_Tags) GetIsGeneralSpoiler() *bool { + if t == nil { + t = &ListManga_Page_Media_BaseManga_Tags{} + } + return t.IsGeneralSpoiler +} +func (t *ListManga_Page_Media_BaseManga_Tags) GetIsMediaSpoiler() *bool { + if t == nil { + t = &ListManga_Page_Media_BaseManga_Tags{} + } + return t.IsMediaSpoiler +} +func (t *ListManga_Page_Media_BaseManga_Tags) GetName() string { + if t == nil { + t = &ListManga_Page_Media_BaseManga_Tags{} + } + return t.Name +} +func (t *ListManga_Page_Media_BaseManga_Tags) GetRank() *int { + if t == nil { + t = &ListManga_Page_Media_BaseManga_Tags{} + } + return t.Rank +} +func (t *ListManga_Page_Media_BaseManga_Tags) GetUserID() *int { + if t == nil { + t = &ListManga_Page_Media_BaseManga_Tags{} + } + return t.UserID +} + type ListManga_Page_Media_BaseManga_Title struct { UserPreferred *string "json:\"userPreferred,omitempty\" graphql:\"userPreferred\"" Romaji *string "json:\"romaji,omitempty\" graphql:\"romaji\"" @@ -6979,6 +8280,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 +8965,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -7757,6 +9136,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -7832,6 +9222,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -7907,6 +9308,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -7987,6 +9399,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -8130,6 +9553,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -8189,6 +9623,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 +9779,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -8387,7 +9843,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 @@ -8396,7 +9852,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 } } @@ -8418,6 +9874,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -8454,7 +9921,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, @@ -8462,6 +9929,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, @@ -8518,6 +9986,17 @@ fragment baseAnime on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } duration trailer { id @@ -8841,6 +10320,17 @@ fragment baseManga on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } title { userPreferred romaji @@ -8910,6 +10400,17 @@ fragment baseManga on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } title { userPreferred romaji @@ -8978,6 +10479,17 @@ fragment baseManga on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } title { userPreferred romaji @@ -9026,6 +10538,17 @@ const MangaDetailsByIDDocument = `query MangaDetailsById ($id: Int) { id duration genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } rankings { context type @@ -9138,6 +10661,17 @@ fragment baseManga on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } title { userPreferred romaji @@ -9180,7 +10714,7 @@ func (c *Client) MangaDetailsByID(ctx context.Context, id *int, interceptors ... return &res, nil } -const ListMangaDocument = `query ListManga ($page: Int, $search: String, $perPage: Int, $sort: [MediaSort], $status: [MediaStatus], $genres: [String], $averageScore_greater: Int, $startDate_greater: FuzzyDateInt, $startDate_lesser: FuzzyDateInt, $format: MediaFormat, $countryOfOrigin: CountryCode, $isAdult: Boolean) { +const ListMangaDocument = `query ListManga ($page: Int, $search: String, $perPage: Int, $sort: [MediaSort], $status: [MediaStatus], $genres: [String], $tags: [String], $averageScore_greater: Int, $startDate_greater: FuzzyDateInt, $startDate_lesser: FuzzyDateInt, $format: MediaFormat, $countryOfOrigin: CountryCode, $isAdult: Boolean) { Page(page: $page, perPage: $perPage) { pageInfo { hasNextPage @@ -9189,7 +10723,7 @@ const ListMangaDocument = `query ListManga ($page: Int, $search: String, $perPag currentPage lastPage } - media(type: MANGA, isAdult: $isAdult, countryOfOrigin: $countryOfOrigin, search: $search, sort: $sort, status_in: $status, format: $format, genre_in: $genres, averageScore_greater: $averageScore_greater, startDate_greater: $startDate_greater, startDate_lesser: $startDate_lesser, format_not: NOVEL) { + media(type: MANGA, isAdult: $isAdult, countryOfOrigin: $countryOfOrigin, search: $search, sort: $sort, status_in: $status, format: $format, genre_in: $genres, tag_in: $tags, averageScore_greater: $averageScore_greater, startDate_greater: $startDate_greater, startDate_lesser: $startDate_lesser, format_not: NOVEL) { ... baseManga } } @@ -9211,6 +10745,17 @@ fragment baseManga on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } title { userPreferred romaji @@ -9236,7 +10781,7 @@ fragment baseManga on Media { } ` -func (c *Client) ListManga(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, averageScoreGreater *int, startDateGreater *string, startDateLesser *string, format *MediaFormat, countryOfOrigin *string, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListManga, error) { +func (c *Client) ListManga(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, tags []*string, averageScoreGreater *int, startDateGreater *string, startDateLesser *string, format *MediaFormat, countryOfOrigin *string, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListManga, error) { vars := map[string]any{ "page": page, "search": search, @@ -9244,6 +10789,7 @@ func (c *Client) ListManga(ctx context.Context, page *int, search *string, perPa "sort": sort, "status": status, "genres": genres, + "tags": tags, "averageScore_greater": averageScoreGreater, "startDate_greater": startDateGreater, "startDate_lesser": startDateLesser, @@ -9429,6 +10975,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/client_mock.go b/internal/api/anilist/client_mock.go index 53015d2e0..16d5219f6 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) { @@ -546,9 +546,9 @@ func (ac *MockAnilistClientImpl) MangaDetailsByID(ctx context.Context, id *int, return ac.realAnilistClient.MangaDetailsByID(ctx, id, interceptors...) } -func (ac *MockAnilistClientImpl) ListManga(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, averageScoreGreater *int, startDateGreater *string, startDateLesser *string, format *MediaFormat, countryOfOrigin *string, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListManga, error) { +func (ac *MockAnilistClientImpl) ListManga(ctx context.Context, page *int, search *string, perPage *int, sort []*MediaSort, status []*MediaStatus, genres []*string, tags []*string, averageScoreGreater *int, startDateGreater *string, startDateLesser *string, format *MediaFormat, countryOfOrigin *string, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*ListManga, error) { ac.logger.Debug().Msg("anilist: Fetching manga list") - return ac.realAnilistClient.ListManga(ctx, page, search, perPage, sort, status, genres, averageScoreGreater, startDateGreater, startDateLesser, format, countryOfOrigin, isAdult, interceptors...) + return ac.realAnilistClient.ListManga(ctx, page, search, perPage, sort, status, genres, tags, averageScoreGreater, startDateGreater, startDateLesser, format, countryOfOrigin, isAdult, interceptors...) } func (ac *MockAnilistClientImpl) StudioDetails(ctx context.Context, id *int, interceptors ...clientv2.RequestInterceptor) (*StudioDetails, error) { diff --git a/internal/api/anilist/client_test.go b/internal/api/anilist/client_test.go index 6c94be4b6..c26b21587 100644 --- a/internal/api/anilist/client_test.go +++ b/internal/api/anilist/client_test.go @@ -172,6 +172,7 @@ func TestListAnime(t *testing.T) { Sort []*MediaSort Status []*MediaStatus Genres []*string + Tags []*string AverageScoreGreater *int Season *MediaSeason SeasonYear *int @@ -187,6 +188,7 @@ func TestListAnime(t *testing.T) { Sort: []*MediaSort{lo.ToPtr(MediaSortTrendingDesc)}, Status: nil, Genres: nil, + Tags: nil, AverageScoreGreater: nil, Season: nil, SeasonYear: nil, @@ -208,6 +210,7 @@ func TestListAnime(t *testing.T) { tt.Sort, tt.Status, tt.Genres, + tt.Tags, tt.AverageScoreGreater, tt.Season, tt.SeasonYear, @@ -226,6 +229,7 @@ func TestListAnime(t *testing.T) { tt.Sort, tt.Status, tt.Genres, + tt.Tags, tt.AverageScoreGreater, tt.Season, tt.SeasonYear, diff --git a/internal/api/anilist/list.go b/internal/api/anilist/list.go index c8c70cf33..96fda4e04 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 } @@ -219,6 +223,7 @@ func ListMangaM( Sort []*MediaSort, Status []*MediaStatus, Genres []*string, + Tags []*string, AverageScoreGreater *int, Year *int, Format *MediaFormat, @@ -247,6 +252,9 @@ func ListMangaM( if Genres != nil { variables["genres"] = Genres } + if Tags != nil { + variables["tags"] = Tags + } if AverageScoreGreater != nil { variables["averageScore_greater"] = *AverageScoreGreater * 10 } @@ -361,6 +369,7 @@ func ListAnimeCacheKey( Sort []*MediaSort, Status []*MediaStatus, Genres []*string, + Tags []*string, AverageScoreGreater *int, Season *MediaSeason, SeasonYear *int, @@ -388,6 +397,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) } @@ -416,6 +428,7 @@ func ListMangaCacheKey( Sort []*MediaSort, Status []*MediaStatus, Genres []*string, + Tags []*string, AverageScoreGreater *int, Season *MediaSeason, SeasonYear *int, @@ -443,6 +456,9 @@ func ListMangaCacheKey( 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 4746fc437..381e2ec8a 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 @@ -213,6 +224,7 @@ query ListAnime( $sort: [MediaSort] $status: [MediaStatus] $genres: [String] + $tags: [String] $averageScore_greater: Int $season: MediaSeason $seasonYear: Int @@ -235,6 +247,7 @@ query ListAnime( isAdult: $isAdult format: $format genre_in: $genres + tag_in: $tags averageScore_greater: $averageScore_greater season: $season seasonYear: $seasonYear @@ -283,6 +296,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/manga.graphql b/internal/api/anilist/queries/manga.graphql index 818800394..6fffda19b 100644 --- a/internal/api/anilist/queries/manga.graphql +++ b/internal/api/anilist/queries/manga.graphql @@ -55,6 +55,17 @@ query MangaDetailsById ($id: Int) { id duration genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } rankings { context type @@ -137,6 +148,7 @@ query ListManga( $sort: [MediaSort] $status: [MediaStatus] $genres: [String] + $tags: [String] $averageScore_greater: Int $startDate_greater: FuzzyDateInt $startDate_lesser: FuzzyDateInt @@ -152,7 +164,7 @@ query ListManga( currentPage lastPage }, - media(type: MANGA, isAdult: $isAdult, countryOfOrigin: $countryOfOrigin, search: $search, sort: $sort, status_in: $status, format: $format, genre_in: $genres, averageScore_greater: $averageScore_greater, startDate_greater: $startDate_greater, startDate_lesser: $startDate_lesser, format_not: NOVEL){ + media(type: MANGA, isAdult: $isAdult, countryOfOrigin: $countryOfOrigin, search: $search, sort: $sort, status_in: $status, format: $format, genre_in: $genres, tag_in: $tags, averageScore_greater: $averageScore_greater, startDate_greater: $startDate_greater, startDate_lesser: $startDate_lesser, format_not: NOVEL){ ...baseManga } } @@ -175,6 +187,17 @@ fragment baseManga on Media { meanScore description genres + tags { + category + description + id + isAdult + isGeneralSpoiler + isMediaSpoiler + name + rank + userId + } title { userPreferred romaji diff --git a/internal/extension_repo/goja_plugin_types/app.d.ts b/internal/extension_repo/goja_plugin_types/app.d.ts index a1202b699..dcbfa2bac 100644 --- a/internal/extension_repo/goja_plugin_types/app.d.ts +++ b/internal/extension_repo/goja_plugin_types/app.d.ts @@ -229,13 +229,13 @@ declare namespace $app { function onUpcomingEpisodesRequested(cb: (event: UpcomingEpisodesRequestedEvent) => void): void; interface UpcomingEpisodesRequestedEvent { - animeCollection?: AL_AnimeCollection; - localFiles?: Array; - upcomingEpisodes?: Anime_UpcomingEpisodes; - next(): void; preventDefault(): void; + + animeCollection?: AL_AnimeCollection; + localFiles?: Array; + upcomingEpisodes?: Anime_UpcomingEpisodes; } /** @@ -247,9 +247,9 @@ declare namespace $app { function onUpcomingEpisodes(cb: (event: UpcomingEpisodesEvent) => void): void; interface UpcomingEpisodesEvent { - upcomingEpisodes?: Anime_UpcomingEpisodes; - next(): void; + + upcomingEpisodes?: Anime_UpcomingEpisodes; } /** @@ -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 */ @@ -2286,6 +2317,7 @@ declare namespace $app { meanScore?: number; description?: string; genres?: Array; + tags?: Array; title?: AL_BaseManga_Title; coverImage?: AL_BaseManga_CoverImage; startDate?: AL_BaseManga_StartDate; @@ -2320,6 +2352,21 @@ declare namespace $app { day?: number; } + /** + * - Filepath: internal/api/anilist/client_gen.go + */ + interface AL_BaseManga_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 */ @@ -2604,6 +2651,7 @@ declare namespace $app { id: number; duration?: number; genres?: Array; + tags?: Array; rankings?: Array; characters?: AL_MangaDetailsById_Media_Characters; recommendations?: AL_MangaDetailsById_Media_Recommendations; @@ -2739,6 +2787,21 @@ declare namespace $app { node?: AL_BaseManga; } + /** + * - Filepath: internal/api/anilist/client_gen.go + */ + interface AL_MangaDetailsById_Media_Tags { + category?: string; + description?: string; + id: number; + isAdult?: boolean; + isGeneralSpoiler?: boolean; + isMediaSpoiler?: boolean; + name: string; + rank?: number; + userId?: number; + } + /** * - Filepath: internal/api/anilist/models_gen.go * @description @@ -3521,7 +3584,7 @@ declare namespace $app { } /** - * - Filepath: internal/continuity/history.go + * - Filepath: ..\internal\continuity\history.go */ export type Continuity_WatchHistory = Record; @@ -3703,12 +3766,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/handlers/manga.go b/internal/handlers/manga.go index c2f28ed9c..555dd8a00 100644 --- a/internal/handlers/manga.go +++ b/internal/handlers/manga.go @@ -351,6 +351,7 @@ func (h *Handler) HandleAnilistListManga(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"` Year *int `json:"year,omitempty"` CountryOfOrigin *string `json:"countryOfOrigin,omitempty"` @@ -380,6 +381,7 @@ func (h *Handler) HandleAnilistListManga(c echo.Context) error { p.Sort, p.Status, p.Genres, + p.Tags, p.AverageScoreGreater, nil, p.Year, @@ -401,6 +403,7 @@ func (h *Handler) HandleAnilistListManga(c echo.Context) error { p.Sort, p.Status, p.Genres, + p.Tags, p.AverageScoreGreater, p.Year, p.Format, diff --git a/internal/platforms/shared_platform/cachelayer.go b/internal/platforms/shared_platform/cachelayer.go index a36f2c351..12fc48c90 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...) }) } @@ -1043,10 +1043,10 @@ func (c *CacheLayer) MangaDetailsByID(ctx context.Context, id *int, interceptors return result, err } -func (c *CacheLayer) ListManga(ctx context.Context, 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, interceptors ...clientv2.RequestInterceptor) (*anilist.ListManga, error) { - cacheKey := c.generateCacheKey(page, search, perPage, sort, status, genres, averageScoreGreater, startDateGreater, startDateLesser, format, countryOfOrigin, isAdult) +func (c *CacheLayer) ListManga(ctx context.Context, page *int, search *string, perPage *int, sort []*anilist.MediaSort, status []*anilist.MediaStatus, genres []*string, tags []*string, averageScoreGreater *int, startDateGreater *string, startDateLesser *string, format *anilist.MediaFormat, countryOfOrigin *string, isAdult *bool, interceptors ...clientv2.RequestInterceptor) (*anilist.ListManga, error) { + cacheKey := c.generateCacheKey(page, search, perPage, sort, status, genres, tags, averageScoreGreater, startDateGreater, startDateLesser, format, countryOfOrigin, isAdult) return networkFirstGetWithBoundedCache(c, ListMangaBucket, cacheKey, func() (*anilist.ListManga, error) { - return c.anilistClientRef.Get().ListManga(ctx, page, search, perPage, sort, status, genres, averageScoreGreater, startDateGreater, startDateLesser, format, countryOfOrigin, isAdult, interceptors...) + return c.anilistClientRef.Get().ListManga(ctx, page, search, perPage, sort, status, genres, tags, averageScoreGreater, startDateGreater, startDateLesser, format, countryOfOrigin, isAdult, interceptors...) }) } diff --git a/internal/plugin/anilist.go b/internal/plugin/anilist.go index eaf1ef021..106516b86 100644 --- a/internal/plugin/anilist.go +++ b/internal/plugin/anilist.go @@ -79,11 +79,11 @@ 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) + _ = anilistObj.Set("listManga", func(page *int, search *string, perPage *int, sort []*anilist.MediaSort, status []*anilist.MediaStatus, genres []*string, tags []*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, tags, averageScoreGreater, startDateGreater, startDateLesser, format, countryOfOrigin, isAdult) }) _ = anilistObj.Set("listRecentAnime", func(page *int, perPage *int, airingAtGreater *int, airingAtLesser *int, notYetAired *bool) (*anilist.ListRecentAnime, error) { return anilistPlatformRef.Get().GetAnilistClient().ListRecentAnime(context.Background(), page, perPage, airingAtGreater, airingAtLesser, notYetAired) diff --git a/seanime-web/src/api/generated/endpoint.types.ts b/seanime-web/src/api/generated/endpoint.types.ts index 09e11a77f..bcb3ebb80 100644 --- a/seanime-web/src/api/generated/endpoint.types.ts +++ b/seanime-web/src/api/generated/endpoint.types.ts @@ -15,9 +15,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 +119,7 @@ export type AnilistListAnime_Variables = { sort?: Array status?: Array genres?: Array + tags?: Array averageScore_greater?: number season?: AL_MediaSeason seasonYear?: number @@ -1224,6 +1225,7 @@ export type AnilistListManga_Variables = { sort?: Array status?: Array genres?: Array + tags?: Array averageScore_greater?: number year?: number countryOfOrigin?: string @@ -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..f371f70fc 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 @@ -554,6 +590,7 @@ export type AL_BaseManga = { meanScore?: number description?: string genres?: Array + tags?: Array title?: AL_BaseManga_Title coverImage?: AL_BaseManga_CoverImage startDate?: AL_BaseManga_StartDate @@ -594,6 +631,23 @@ export type AL_BaseManga_StartDate = { day?: number } +/** + * - Filepath: internal/api/anilist/client_gen.go + * - Filename: client_gen.go + * - Package: anilist + */ +export type AL_BaseManga_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 @@ -851,6 +905,7 @@ export type AL_MangaDetailsById_Media = { id: number duration?: number genres?: Array + tags?: Array rankings?: Array characters?: AL_MangaDetailsById_Media_Characters recommendations?: AL_MangaDetailsById_Media_Recommendations @@ -1012,6 +1067,23 @@ export type AL_MangaDetailsById_Media_Relations_Edges = { node?: AL_BaseManga } +/** + * - Filepath: internal/api/anilist/client_gen.go + * - Filename: client_gen.go + * - Package: anilist + */ +export type AL_MangaDetailsById_Media_Tags = { + category?: string + description?: string + id: number + isAdult?: boolean + isGeneralSpoiler?: boolean + isMediaSpoiler?: boolean + name: string + rank?: number + userId?: number +} + /** * - Filepath: internal/api/anilist/manga.go * - Filename: manga.go @@ -1931,7 +2003,7 @@ export type Continuity_UpdateWatchHistoryItemOptions = { } /** - * - Filepath: internal/continuity/history.go + * - Filepath: ..\internal\continuity\history.go * - Filename: history.go * - Package: continuity */ @@ -3327,7 +3399,7 @@ export type Manga_PageDimension = { } /** - * - Filepath: internal/manga/download.go + * - Filepath: ..\internal\manga\download.go * - Filename: download.go * - Package: manga */ @@ -3785,14 +3857,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 +4050,7 @@ export type Models_SilencedMediaEntry = { } /** - * - Filepath: internal/database/models/models.go + * - Filepath: ..\internal\database\models\models.go * - Filename: models.go * - Package: models */ @@ -4140,7 +4212,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)/lists/_containers/anilist-collection-lists.tsx b/seanime-web/src/app/(main)/lists/_containers/anilist-collection-lists.tsx index ecf5585d6..396aaff3d 100644 --- a/seanime-web/src/app/(main)/lists/_containers/anilist-collection-lists.tsx +++ b/seanime-web/src/app/(main)/lists/_containers/anilist-collection-lists.tsx @@ -14,6 +14,7 @@ import { ADVANCED_SEARCH_MEDIA_GENRES, ADVANCED_SEARCH_SEASONS, ADVANCED_SEARCH_STATUS, + ADVANCED_SEARCH_MEDIA_TAGS } from "@/app/(main)/search/_lib/advanced-search-constants" import { PageWrapper } from "@/components/shared/page-wrapper" import { AppLayoutStack } from "@/components/ui/app-layout" @@ -37,7 +38,7 @@ import { FiSearch } from "react-icons/fi" import { LuCalendar, LuLeaf } from "react-icons/lu" import { MdPersonalVideo } from "react-icons/md" import { RiSignalTowerLine } from "react-icons/ri" -import { TbSwords } from "react-icons/tb" +import { TbSwords, TbTagsFilled} from "react-icons/tb" const selectedIndexAtom = atom("-") const watchListSearchInputAtom = atom("") @@ -217,7 +218,7 @@ export function SearchOptions({ const [input, setInput] = useAtom(watchListSearchInputAtom) const highlightTrash = React.useMemo(() => { - return !(!input.length && params.sorting === "SCORE_DESC" && (params.genre === null || !params.genre.length) && params.status === null && params.format === null && params.season === null && params.year === null && params.isAdult === false) + return !(!input.length && params.sorting === "SCORE_DESC" && (params.tags === null || !params.tags.length) && (params.genre === null || !params.genre.length) && params.status === null && params.format === null && params.season === null && params.year === null && params.isAdult === false) }, [params, input]) return ( @@ -249,6 +250,7 @@ export function SearchOptions({ ...prev, sorting: "SCORE_DESC", genre: null, + tags: null, status: null, format: null, season: null, @@ -264,7 +266,7 @@ export function SearchOptions({
@@ -283,6 +285,26 @@ export function SearchOptions({ })} fieldLabelClass="hidden" /> + } + emptyMessage="No options found" + label="Tags" placeholder="All tags" className="w-full" + options={ADVANCED_SEARCH_MEDIA_TAGS + .filter(tag => { + if(params.isAdult && serverStatus?.settings?.anilist?.enableAdultContent) { + return true + } + return tag.isAdult === false + }) + .map(tag => ({ value: tag.name, label: tag.name, textValue: tag.name }))} + value={params.tags ? params.tags : []} + onValueChange={v => setParams(draft => { + draft.tags = v + return + })} + fieldLabelClass="hidden" + /> } label="Format" placeholder="All formats" className="w-full" @@ -192,6 +214,7 @@ export function AdvancedSearchOptions() { sorting: null, status: null, genre: null, + tags: null, format: null, season: null, year: null, diff --git a/seanime-web/src/app/(main)/search/_lib/advanced-search-constants.ts b/seanime-web/src/app/(main)/search/_lib/advanced-search-constants.ts index 230d15db8..cb55f2a45 100644 --- a/seanime-web/src/app/(main)/search/_lib/advanced-search-constants.ts +++ b/seanime-web/src/app/(main)/search/_lib/advanced-search-constants.ts @@ -78,3 +78,2936 @@ export const ADVANCED_SEARCH_TYPE = [ { value: "anime", label: "Anime" }, { value: "manga", label: "Manga" }, ] + +// Query used to get all tags: +// query Query { +// MediaTagCollection { +// id, +// name, +// description, +// category, +// isAdult +// } +// } + +export const ADVANCED_SEARCH_MEDIA_TAGS = [ + { + "id": 206, + "name": "4-koma", + "description": "A manga in the 'yonkoma' format, which consists of four equal-sized panels arranged in a vertical strip.", + "category": "Technical", + "isAdult": false + }, + { + "id": 710, + "name": "Achromatic", + "description": "Contains animation that is primarily done in black and white.", + "category": "Technical", + "isAdult": false + }, + { + "id": 156, + "name": "Achronological Order", + "description": "Chapters or episodes do not occur in chronological order.", + "category": "Setting-Time", + "isAdult": false + }, + { + "id": 1612, + "name": "Acrobatics", + "description": "The art of jumping, tumbling, and balancing. Often paired with trapeze, trampolining, tightropes, or general gymnastics.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 548, + "name": "Acting", + "description": "Centers around actors or the acting industry.", + "category": "Theme-Arts", + "isAdult": false + }, + { + "id": 1052, + "name": "Adoption", + "description": "Features a character who has been adopted by someone who is neither of their biological parents.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 505, + "name": "Advertisement", + "description": "Produced in order to promote the products of a certain company.", + "category": "Technical", + "isAdult": false + }, + { + "id": 147, + "name": "Afterlife", + "description": "Partly or completely set in the afterlife.", + "category": "Setting-Universe", + "isAdult": false + }, + { + "id": 138, + "name": "Age Gap", + "description": "Prominently features romantic relations between people with a significant age difference.", + "category": "Theme-Romance", + "isAdult": false + }, + { + "id": 488, + "name": "Age Regression", + "description": "Prominently features a character who was returned to a younger state.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 334, + "name": "Agender", + "description": "Prominently features agender characters.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 909, + "name": "Agriculture", + "description": "Prominently features agriculture practices.", + "category": "Theme-Slice of Life", + "isAdult": false + }, + { + "id": 279, + "name": "Ahegao", + "description": "Features a character making an exaggerated orgasm face.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 167, + "name": "Airsoft", + "description": "Centers around the sport of airsoft.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 1291, + "name": "Alchemy", + "description": "Features character(s) who practice alchemy.", + "category": "Theme-Fantasy", + "isAdult": false + }, + { + "id": 191, + "name": "Aliens", + "description": "Prominently features extraterrestrial lifeforms.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 146, + "name": "Alternate Universe", + "description": "Features multiple alternate universes in the same series.", + "category": "Setting-Universe", + "isAdult": false + }, + { + "id": 314, + "name": "American Football", + "description": "Centers around the sport of American football.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 240, + "name": "Amnesia", + "description": "Prominently features a character(s) with memory loss.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 652, + "name": "Amputation", + "description": "Features amputation or amputees.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 490, + "name": "Anachronism", + "description": "Prominently features elements that are out of place in the historical period the work takes place in, particularly modern elements in a historical setting.", + "category": "Setting-Time", + "isAdult": false + }, + { + "id": 185, + "name": "Anal Sex", + "description": "Features sexual penetration of the anal cavity.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 1598, + "name": "Ancient China", + "description": "Setting in ancient china, does not apply to fantasy settings.", + "category": "Setting-Time", + "isAdult": false + }, + { + "id": 1068, + "name": "Angels", + "description": "Prominently features spiritual beings usually represented with wings and halos and believed to be attendants of God.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 433, + "name": "Animals", + "description": "Prominently features animal characters in a leading role.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 471, + "name": "Anthology", + "description": "A collection of separate works collated into a single release.", + "category": "Technical", + "isAdult": false + }, + { + "id": 1304, + "name": "Anthropomorphism", + "description": "Contains non-human character(s) that have attributes or characteristics of a human being.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 104, + "name": "Anti-Hero", + "description": "Features a protagonist who lacks conventional heroic attributes and may be considered a borderline villain.", + "category": "Cast-Main Cast", + "isAdult": false + }, + { + "id": 251, + "name": "Archery", + "description": "Centers around the sport of archery, or prominently features the use of archery in combat.", + "category": "Theme-Action", + "isAdult": false + }, + { + "id": 629, + "name": "Armpits", + "description": "Features the sexual depiction or stimulation of a character's armpits.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 1681, + "name": "Aromantic", + "description": "Features a character who experiences little to no romantic attraction.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1578, + "name": "Arranged Marriage", + "description": "Features two characters made to marry each other, usually by their family.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 517, + "name": "Artificial Intelligence", + "description": "Intelligent non-organic machines that work and react similarly to humans.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 622, + "name": "Asexual", + "description": "Features a character who isn't sexually attracted to people of any sex or gender.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 315, + "name": "Ashikoki", + "description": "Footjob; features stimulation of genitalia by feet.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 651, + "name": "Asphyxiation", + "description": "Features breath play.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 322, + "name": "Assassins", + "description": "Centers around characters who murder people as a profession.", + "category": "Theme-Other-Organisations", + "isAdult": false + }, + { + "id": 623, + "name": "Astronomy", + "description": "Relating or centered around the study of celestial objects and phenomena, space, or the universe.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 264, + "name": "Athletics", + "description": "Centers around sporting events that involve competitive running, jumping, throwing, or walking.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 364, + "name": "Augmented Reality", + "description": "Prominently features events with augmented reality as the main setting.", + "category": "Setting-Universe", + "isAdult": false + }, + { + "id": 519, + "name": "Autobiographical", + "description": "Real stories and anecdotes written by the author about their own life.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 355, + "name": "Aviation", + "description": "Regarding the flying or operation of aircraft.", + "category": "Theme-Other-Vehicle", + "isAdult": false + }, + { + "id": 235, + "name": "Badminton", + "description": "Centers around the sport of badminton.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 1867, + "name": "Ballet", + "description": "Prominently features the dance art of ballet. Both traditional and contemporary styles.", + "category": "Theme-Arts", + "isAdult": false + }, + { + "id": 110, + "name": "Band", + "description": "Main cast is a group of musicians.", + "category": "Theme-Arts-Music", + "isAdult": false + }, + { + "id": 161, + "name": "Bar", + "description": "Partly or completely set in a bar.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 149, + "name": "Baseball", + "description": "Centers around the sport of baseball.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 192, + "name": "Basketball", + "description": "Centers around the sport of basketball.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 101, + "name": "Battle Royale", + "description": "Centers around a fierce group competition, often violent and with only one winner.", + "category": "Theme-Action", + "isAdult": false + }, + { + "id": 239, + "name": "Biographical", + "description": "Based on true stories of real persons living or dead, written by another.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 294, + "name": "Bisexual", + "description": "Features a character who is romantically or sexually attracted to people of more than one sex or gender.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 309, + "name": "Blackmail", + "description": "Features a character blackmailing another.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 1492, + "name": "Board Game", + "description": "Centers around characters playing board games.", + "category": "Theme-Game", + "isAdult": false + }, + { + "id": 1489, + "name": "Boarding School", + "description": "Features characters attending a boarding school.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 639, + "name": "Body Horror", + "description": "Features characters who undergo horrific transformations or disfigurement, often to their own detriment.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 1779, + "name": "Body Image", + "description": "Features themes of self-esteem concerning perceived defects or flaws in appearance, such as body weight or disfigurement, and may discuss topics such as eating disorders, fatphobia, and body dysmorphia.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 154, + "name": "Body Swapping", + "description": "Centers around individuals swapping bodies with one another.", + "category": "Theme-Fantasy", + "isAdult": false + }, + { + "id": 246, + "name": "Bondage", + "description": "Features BDSM, with or without the use of accessories.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 126, + "name": "Boobjob", + "description": "Features the stimulation of male genitalia by breasts.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 1632, + "name": "Bowling", + "description": "Centers around the sport of Bowling.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 169, + "name": "Boxing", + "description": "Centers around the sport of boxing.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 75, + "name": "Boys' Love", + "description": "Prominently features romance between two males, not inherently sexual.", + "category": "Theme-Romance", + "isAdult": false + }, + { + "id": 171, + "name": "Bullying", + "description": "Prominently features the use of force for intimidation, often in a school setting.", + "category": "Theme-Drama", + "isAdult": false + }, + { + "id": 812, + "name": "Butler", + "description": "Prominently features a character who is a butler.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 204, + "name": "Calligraphy", + "description": "Centers around the art of calligraphy.", + "category": "Theme-Arts", + "isAdult": false + }, + { + "id": 1724, + "name": "Camping", + "description": "Features the recreational activity of camping, either in a tent, vehicle, or simply sleeping outdoors.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 870, + "name": "Cannibalism", + "description": "Prominently features the act of consuming another member of the same species as food.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 178, + "name": "Card Battle", + "description": "Centers around individuals competing in card games.", + "category": "Theme-Game-Card & Board Game", + "isAdult": false + }, + { + "id": 10, + "name": "Cars", + "description": "Centers around the use of automotive vehicles.", + "category": "Theme-Other-Vehicle", + "isAdult": false + }, + { + "id": 632, + "name": "Centaur", + "description": "Prominently features a character with a human upper body and the lower body of a horse.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1573, + "name": "Cervix Penetration", + "description": "A sexual act in which the cervix is visibly penetrated.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 90, + "name": "CGI", + "description": "Prominently features scenes created with computer-generated imagery.", + "category": "Technical", + "isAdult": false + }, + { + "id": 1709, + "name": "Cheating", + "description": "Features a character with a partner shown being intimate with someone else consensually.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 646, + "name": "Cheerleading", + "description": "Centers around the activity of cheerleading.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 324, + "name": "Chibi", + "description": "Features \"super deformed\" character designs with smaller, rounder proportions and a cute look.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 774, + "name": "Chimera", + "description": "Features a beast made by combining animals, usually with humans.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 267, + "name": "Chuunibyou", + "description": "Prominently features a character with \"Middle School 2nd Year Syndrome\", who either acts like a know-it-all adult or falsely believes they have special powers.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 476, + "name": "Circus", + "description": "Prominently features a circus.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 1403, + "name": "Class Struggle", + "description": "Contains conflict born between the different social classes. Generally between an dominant elite and a suffering oppressed group.", + "category": "Theme-Drama", + "isAdult": false + }, + { + "id": 227, + "name": "Classic Literature", + "description": "Discusses or adapts a work of classic world literature.", + "category": "Theme-Arts", + "isAdult": false + }, + { + "id": 1673, + "name": "Classical Music", + "description": "Centers on the musical style of classical, not to be applied to anime that use classical in its soundtrack.", + "category": "Theme-Arts-Music", + "isAdult": false + }, + { + "id": 1342, + "name": "Clone", + "description": "Prominently features a character who is an artificial exact copy of another organism.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1537, + "name": "Coastal", + "description": "Story prominently takes place near the beach or around a coastal area/town. Setting is near the ocean.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 1753, + "name": "Cohabitation", + "description": "Features two or more people who live in the same household and develop a romantic or sexual relationship.", + "category": "Theme-Romance", + "isAdult": false + }, + { + "id": 404, + "name": "College", + "description": "Partly or completely set in a college or university.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 102, + "name": "Coming of Age", + "description": "Centers around a character's transition from childhood to adulthood.", + "category": "Theme-Drama", + "isAdult": false + }, + { + "id": 456, + "name": "Conspiracy", + "description": "Contains one or more factions controlling or attempting to control the world from the shadows.", + "category": "Theme-Drama", + "isAdult": false + }, + { + "id": 636, + "name": "Cosmic Horror", + "description": "A type of horror that emphasizes human insignificance in the grand scope of cosmic reality; fearing the unknown and being powerless to fight it.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 328, + "name": "Cosplay", + "description": "Features dressing up as a different character or profession.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1648, + "name": "Cowboys", + "description": "Features Western or Western-inspired cowboys.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1771, + "name": "Creature Taming", + "description": "Features the taming of animals, monsters, or other creatures.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 648, + "name": "Crime", + "description": "Centers around unlawful activities punishable by the state or other authority.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 1589, + "name": "Criminal Organization", + "description": "Prominently features a group of people who commit crimes for illicit or violent purposes.", + "category": "Theme-Other-Organisations", + "isAdult": false + }, + { + "id": 186, + "name": "Crossdressing", + "description": "Prominently features a character dressing up as the opposite sex.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 158, + "name": "Crossover", + "description": "Centers around the placement of two or more otherwise discrete fictional characters, settings, or universes into the context of a single story.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 586, + "name": "Cult", + "description": "Features a social group with unorthodox religious, spiritual, or philosophical beliefs and practices.", + "category": "Theme-Other-Organisations", + "isAdult": false + }, + { + "id": 326, + "name": "Cultivation", + "description": "Features characters using training, often martial arts-related, and other special methods to cultivate qi (a component of traditional Chinese philosophy, described as \"life force\") and gain strength or immortality.", + "category": "Theme-Fantasy", + "isAdult": false + }, + { + "id": 1273, + "name": "Cumflation", + "description": "The stomach area expands outward like a balloon due to being filled specifically with semen.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 135, + "name": "Cunnilingus", + "description": "Features oral sex performed on female genitalia.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 1689, + "name": "Curses", + "description": "Features a character, object or area that has been cursed, usually by a malevolent supernatural force.", + "category": "Theme-Fantasy", + "isAdult": false + }, + { + "id": 1063, + "name": "Cute Boys Doing Cute Things", + "description": "Centers around male characters doing cute activities, usually with little to no emphasis on drama and conflict.", + "category": "Theme-Slice of Life", + "isAdult": false + }, + { + "id": 92, + "name": "Cute Girls Doing Cute Things", + "description": "Centers around female characters doing cute activities, usually with little to no emphasis on drama and conflict.\n", + "category": "Theme-Slice of Life", + "isAdult": false + }, + { + "id": 108, + "name": "Cyberpunk", + "description": "Set in a future of advanced technological and scientific achievements that have resulted in social disorder.", + "category": "Theme-Sci-Fi", + "isAdult": false + }, + { + "id": 801, + "name": "Cyborg", + "description": "Prominently features a human character whose physiological functions are aided or enhanced by artificial means.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 151, + "name": "Cycling", + "description": "Centers around the sport of cycling.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 209, + "name": "Dancing", + "description": "Centers around the art of dance.", + "category": "Theme-Arts-Music", + "isAdult": false + }, + { + "id": 615, + "name": "Death Game", + "description": "Features characters participating in a game, where failure results in death.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 1234, + "name": "Deepthroat", + "description": "Features oral sex where the majority of the erect male genitalia is inside another person's mouth, usually stimulating some gagging in the back of their throat.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 129, + "name": "Defloration", + "description": "Features a female character who has never had sexual relations (until now).", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 395, + "name": "Delinquents", + "description": "Features characters with a notorious image and attitude, sometimes referred to as \"yankees\".", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 15, + "name": "Demons", + "description": "Prominently features malevolent otherworldly creatures.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 654, + "name": "Denpa", + "description": "Works that feature themes of social dissociation, delusions, and other issues like suicide, bullying, self-isolation, paranoia, and technological necessity in daily lives. Classic iconography: telephone poles, rooftops, and trains.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 1453, + "name": "Desert", + "description": "Prominently features a desert environment.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 694, + "name": "Detective", + "description": "Features a character who investigates and solves crimes.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1038, + "name": "DILF", + "description": "Features sexual intercourse with older men.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 704, + "name": "Dinosaurs", + "description": "Prominently features Dinosaurs, prehistoric reptiles that went extinct millions of years ago.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1219, + "name": "Disability", + "description": "A work that features one or more characters with a physical, mental, cognitive, or developmental condition that impairs, interferes with, or limits the person's ability to engage in certain tasks or actions.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 536, + "name": "Dissociative Identities", + "description": "A case where one or more people share the same body.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1511, + "name": "Double Penetration", + "description": "A sexual act in which the vagina/anus are penetrated by two penises/toys.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 224, + "name": "Dragons", + "description": "Prominently features mythical reptiles which generally have wings and can breathe fire.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 118, + "name": "Drawing", + "description": "Centers around the art of drawing, including manga and doujinshi.", + "category": "Theme-Arts", + "isAdult": false + }, + { + "id": 489, + "name": "Drugs", + "description": "Prominently features the usage of drugs such as opioids, stimulants, hallucinogens etc.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 658, + "name": "Dullahan", + "description": "Prominently features a character who is a Dullahan, a creature from Irish Folklore with a head that can be detached from its main body.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 604, + "name": "Dungeon", + "description": "Prominently features a dungeon environment.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 217, + "name": "Dystopian", + "description": "Partly or completely set in a society characterized by poverty, squalor or oppression.", + "category": "Setting-Time", + "isAdult": false + }, + { + "id": 792, + "name": "E-Sports", + "description": "Prominently features professional video game competitions, tournaments, players, etc.", + "category": "Theme-Game", + "isAdult": false + }, + { + "id": 1667, + "name": "Eco-Horror", + "description": "Utilizes a horrifying depiction of ecology to explore man and its relationship with nature.", + "category": "Theme-Drama", + "isAdult": false + }, + { + "id": 248, + "name": "Economics", + "description": "Centers around the field of economics.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 140, + "name": "Educational", + "description": "Primary aim is to educate the audience.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 1666, + "name": "Elderly Protagonist", + "description": "The protagonist is either over 60 years of age, has an elderly appearance, or, in the case of non-humans, is considered elderly for their species.", + "category": "Cast-Main Cast", + "isAdult": false + }, + { + "id": 598, + "name": "Elf", + "description": "Prominently features a character who is an elf.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 105, + "name": "Ensemble Cast", + "description": "Features a large cast of characters with (almost) equal screen time and importance to the plot.", + "category": "Cast-Main Cast", + "isAdult": false + }, + { + "id": 342, + "name": "Environmental", + "description": "Concern with the state of the natural world and how humans interact with it.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 193, + "name": "Episodic", + "description": "Features story arcs that are loosely tied or lack an overarching plot.", + "category": "Technical", + "isAdult": false + }, + { + "id": 482, + "name": "Ero Guro", + "description": "Japanese literary and artistic movement originating in the 1930's. Works have a focus on grotesque eroticism, sexual corruption, and decadence.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 1722, + "name": "Erotic Piercings", + "description": "Features a type of body modification designed to enhance sexual pleasure and intimacy, and/or decoratively adorns portions of the body considered sexual in nature.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 310, + "name": "Espionage", + "description": "Prominently features characters infiltrating an organization in order to steal sensitive information.", + "category": "Theme-Action", + "isAdult": false + }, + { + "id": 1564, + "name": "Estranged Family", + "description": "At least one family member of the MC intentionally distances themselves or a family distances themselves from a person related to the MC.", + "category": "Cast-Main Cast", + "isAdult": false + }, + { + "id": 901, + "name": "Exhibitionism", + "description": "Features the act of exposing oneself in public for sexual pleasure.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 1719, + "name": "Exorcism", + "description": "Involving religious methods of vanquishing youkai, demons, or other supernatural entities.", + "category": "Theme-Fantasy", + "isAdult": false + }, + { + "id": 130, + "name": "Facial", + "description": "Features sexual ejaculation onto an individual's face.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 1455, + "name": "Fairy", + "description": "Prominently features a character who is a fairy.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 400, + "name": "Fairy Tale", + "description": "This work tells a fairy tale, centers around fairy tales, or is based on a classic fairy tale.", + "category": "Theme-Fantasy", + "isAdult": false + }, + { + "id": 1657, + "name": "Fake Relationship", + "description": "When two characters enter a fake relationship that mutually benefits one or both involved.", + "category": "Theme-Drama", + "isAdult": false + }, + { + "id": 87, + "name": "Family Life", + "description": "Centers around the activities of a family unit.", + "category": "Theme-Slice of Life", + "isAdult": false + }, + { + "id": 410, + "name": "Fashion", + "description": "Centers around the fashion industry.", + "category": "Theme-Arts", + "isAdult": false + }, + { + "id": 631, + "name": "Feet", + "description": "Features the sexual depiction or stimulation of a character's feet.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 134, + "name": "Fellatio", + "description": "Blowjob; features oral sex performed on male genitalia.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 23, + "name": "Female Harem", + "description": "Main cast features the protagonist plus several female characters who are romantically interested in them.", + "category": "Theme-Romance", + "isAdult": false + }, + { + "id": 98, + "name": "Female Protagonist", + "description": "Main character is female.", + "category": "Cast-Main Cast", + "isAdult": false + }, + { + "id": 1456, + "name": "Femboy", + "description": "Features a boy who exhibits characteristics or behaviors considered in many cultures to be typical of girls.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1146, + "name": "Femdom", + "description": "Female Dominance. Features sexual acts with a woman in a dominant position.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 1132, + "name": "Fencing", + "description": "Centers around the sport of fencing.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 1422, + "name": "Filmmaking", + "description": "Centers around the art of filmmaking.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 1807, + "name": "Fingering", + "description": "Features vaginal or anal insertion of fingers.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 613, + "name": "Firefighters", + "description": "Centered around the life and activities of rescuers specialised in firefighting.", + "category": "Theme-Other-Organisations", + "isAdult": false + }, + { + "id": 212, + "name": "Fishing", + "description": "Centers around the sport of fishing.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 1659, + "name": "Fisting", + "description": "A sexual activity that involves inserting one or more hands into the vagina or rectum.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 170, + "name": "Fitness", + "description": "Centers around exercise with the aim of improving physical health.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 242, + "name": "Flash", + "description": "Created using Flash animation techniques.", + "category": "Technical", + "isAdult": false + }, + { + "id": 136, + "name": "Flat Chest", + "description": "Features a female character with smaller-than-average breasts.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 142, + "name": "Food", + "description": "Centers around cooking or food appraisal.", + "category": "Theme-Arts", + "isAdult": false + }, + { + "id": 148, + "name": "Football", + "description": "Centers around the sport of football (known in the USA as \"soccer\").", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 198, + "name": "Foreign", + "description": "Partly or completely set in a country outside the country of origin.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 1277, + "name": "Found Family", + "description": "Features a group of characters with no biological relations that are united in a group providing social support.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 226, + "name": "Fugitive", + "description": "Prominently features a character evading capture by an individual or organization.", + "category": "Theme-Action", + "isAdult": false + }, + { + "id": 89, + "name": "Full CGI", + "description": "Almost entirely created with computer-generated imagery.", + "category": "Technical", + "isAdult": false + }, + { + "id": 207, + "name": "Full Color", + "description": "Manga that were initially published in full color.", + "category": "Technical", + "isAdult": false + }, + { + "id": 188, + "name": "Futanari", + "description": "Features female characters with male genitalia.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 91, + "name": "Gambling", + "description": "Centers around the act of gambling.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 106, + "name": "Gangs", + "description": "Centers around gang organizations.", + "category": "Theme-Other-Organisations", + "isAdult": false + }, + { + "id": 77, + "name": "Gender Bending", + "description": "Prominently features a character who dresses and behaves in a way characteristic of another gender, or has been transformed into a person of another gender.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 220, + "name": "Ghost", + "description": "Prominently features a character who is a ghost.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 443, + "name": "Go", + "description": "Centered around the game of Go.", + "category": "Theme-Game-Card & Board Game", + "isAdult": false + }, + { + "id": 480, + "name": "Goblin", + "description": "A goblin is a monstrous creature from European folklore. They are almost always small and grotesque, mischievous or outright malicious, and greedy. Sometimes with magical abilities.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 253, + "name": "Gods", + "description": "Prominently features a character of divine or religious nature.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 532, + "name": "Golf", + "description": "Centers around the sport of golf.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 94, + "name": "Gore", + "description": "Prominently features graphic bloodshed and violence.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 830, + "name": "Group Sex", + "description": "Features more than two participants engaged in sex simultaneously.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 157, + "name": "Guns", + "description": "Prominently features the use of guns in combat.", + "category": "Theme-Action", + "isAdult": false + }, + { + "id": 356, + "name": "Gyaru", + "description": "Prominently features a female character who has a distinct American-emulated fashion style, such as tanned skin, bleached hair, and excessive makeup. Also known as gal.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1591, + "name": "Hair Pulling", + "description": "A sexual act in which the giver will grab the receivers hair and tug whilst giving pleasure from behind.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 1396, + "name": "Handball", + "description": "Centers around the sport of handball.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 317, + "name": "Handjob", + "description": "Features the stimulation of genitalia by another's hands.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 99, + "name": "Henshin", + "description": "Prominently features character or costume transformations which often grant special abilities.", + "category": "Theme-Fantasy", + "isAdult": false + }, + { + "id": 1045, + "name": "Heterosexual", + "description": "Prominently features a romance between a man and a woman, not inherently sexual.", + "category": "Theme-Romance", + "isAdult": false + }, + { + "id": 282, + "name": "Hikikomori", + "description": "Prominently features a character who withdraws from social life, often seeking extreme isolation.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1615, + "name": "Hip-hop Music", + "description": "Centers on the musical style of hip-hop, not to be applied to anime that use hip-hop in its soundtrack.", + "category": "Theme-Arts-Music", + "isAdult": false + }, + { + "id": 25, + "name": "Historical", + "description": "Partly or completely set during a real period of world history.", + "category": "Setting-Time", + "isAdult": false + }, + { + "id": 1379, + "name": "Homeless", + "description": "Prominently features a character that is homeless.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1525, + "name": "Horticulture", + "description": "The story prominently features plant care and gardening.", + "category": "Theme-Slice of Life", + "isAdult": false + }, + { + "id": 181, + "name": "Human Pet", + "description": "Features characters in a master-slave relationship where one is the \"owner\" and the other is a \"pet.\"", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 1367, + "name": "Hypersexuality", + "description": "Portrays a character with a hypersexuality disorder, compulsive sexual behavior, or sex addiction.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 228, + "name": "Ice Skating", + "description": "Centers around the sport of ice skating.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 115, + "name": "Idol", + "description": "Centers around the life and activities of an idol.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 128, + "name": "Incest", + "description": "Features sexual or romantic relations between characters who are related by blood.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 1788, + "name": "Indigenous Cultures", + "description": "Prominently features real-life indigenous cultures.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 1523, + "name": "Inn", + "description": "Partially or completely set in an Inn or Hotel.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 1102, + "name": "Inseki", + "description": "Features sexual or romantic relations among step, adopted, and other non-blood related family members.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 359, + "name": "Irrumatio", + "description": "Oral rape; features a character thrusting their genitalia or a phallic object into the mouth of another character.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 244, + "name": "Isekai", + "description": "Features characters being transported into an alternate world setting and having to adapt to their new surroundings.", + "category": "Theme-Fantasy", + "isAdult": false + }, + { + "id": 81, + "name": "Iyashikei", + "description": "Primary aim is to heal the audience through serene depictions of characters' daily lives.", + "category": "Theme-Slice of Life", + "isAdult": false + }, + { + "id": 1672, + "name": "Jazz Music", + "description": "Centers on the musical style of jazz, not to be applied to anime that use jazz in its soundtrack.", + "category": "Theme-Arts-Music", + "isAdult": false + }, + { + "id": 27, + "name": "Josei", + "description": "Target demographic is adult females.", + "category": "Demographic", + "isAdult": false + }, + { + "id": 1105, + "name": "Judo", + "description": "Centers around the sport of judo.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 1866, + "name": "Kabuki", + "description": "Prominently features the traditional Japanese theater art of kabuki.", + "category": "Theme-Arts", + "isAdult": false + }, + { + "id": 276, + "name": "Kaiju", + "description": "Prominently features giant monsters.", + "category": "Theme-Fantasy", + "isAdult": false + }, + { + "id": 182, + "name": "Karuta", + "description": "Centers around the game of karuta.", + "category": "Theme-Game-Card & Board Game", + "isAdult": false + }, + { + "id": 254, + "name": "Kemonomimi", + "description": "Prominently features humanoid characters with animal ears.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 28, + "name": "Kids", + "description": "Target demographic is young children.", + "category": "Demographic", + "isAdult": false + }, + { + "id": 1419, + "name": "Kingdom Management", + "description": "Characters in these series take on the responsibility of running a town or kingdom, whether they take control of an existing one, or build their own from the ground up.", + "category": "Theme-Drama", + "isAdult": false + }, + { + "id": 1607, + "name": "Konbini", + "description": "Predominantly features a convenience store.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 779, + "name": "Kuudere", + "description": "Prominently features a character who generally retains a cold, blunt and cynical exterior, but once one gets to know them, they have a very warm and loving interior.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 437, + "name": "Lacrosse", + "description": "A team game played with a ball and lacrosse sticks.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 650, + "name": "Lactation", + "description": "Features breast milk play and production.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 516, + "name": "Language Barrier", + "description": "A barrier to communication between people who are unable to speak a common language.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 137, + "name": "Large Breasts", + "description": "Features a character with larger-than-average breasts.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 483, + "name": "LGBTQ+ Themes", + "description": "Prominently features characters or themes associated with the LGBTQ+ community, such as sexuality or gender identity.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 1789, + "name": "Long Strip", + "description": "Manga originally published in a vertical, long-strip format, designed for viewing on smartphones. Also known as webtoons.", + "category": "Technical", + "isAdult": false + }, + { + "id": 466, + "name": "Lost Civilization", + "description": "Featuring a civilization with few ruins or records that exist in present day knowledge.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 139, + "name": "Love Triangle", + "description": "Centered around romantic feelings between more than two people. Includes all love polygons.", + "category": "Theme-Romance", + "isAdult": false + }, + { + "id": 107, + "name": "Mafia", + "description": "Centered around Italian organised crime syndicates.", + "category": "Theme-Other-Organisations", + "isAdult": false + }, + { + "id": 29, + "name": "Magic", + "description": "Prominently features magical elements or the use of magic.", + "category": "Theme-Fantasy", + "isAdult": false + }, + { + "id": 117, + "name": "Mahjong", + "description": "Centered around the game of mahjong.", + "category": "Theme-Game-Card & Board Game", + "isAdult": false + }, + { + "id": 249, + "name": "Maids", + "description": "Prominently features a character who is a maid.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1140, + "name": "Makeup", + "description": "Centers around the makeup industry.", + "category": "Theme-Arts", + "isAdult": false + }, + { + "id": 123, + "name": "Male Harem", + "description": "Main cast features the protagonist plus several male characters who are romantically interested in them.", + "category": "Theme-Romance", + "isAdult": false + }, + { + "id": 1450, + "name": "Male Pregnancy", + "description": "Features pregnant male characters in a sexual context.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 82, + "name": "Male Protagonist", + "description": "Main character is male.", + "category": "Cast-Main Cast", + "isAdult": false + }, + { + "id": 1835, + "name": "Manzai", + "description": "Prominently features an act of traditional Japanese comedy that involves two performers.", + "category": "Theme-Arts", + "isAdult": false + }, + { + "id": 1433, + "name": "Marriage", + "description": "Centers around marriage between two or more characters.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 30, + "name": "Martial Arts", + "description": "Centers around the use of traditional hand-to-hand combat.", + "category": "Theme-Action", + "isAdult": false + }, + { + "id": 999, + "name": "Masochism", + "description": "Prominently features characters who get sexual pleasure from being hurt or controlled by others.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 131, + "name": "Masturbation", + "description": "Features erotic stimulation of one's own genitalia or other erogenous regions.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 1624, + "name": "Matchmaking", + "description": "Prominently features either a matchmaker or events with the intent of matchmaking with eventual marriage in sight.", + "category": "Theme-Romance", + "isAdult": false + }, + { + "id": 1653, + "name": "Mating Press", + "description": "Features the sex position in which two partners face each other, with one of them thrusting downwards and the other's legs tucked up towards their head.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 1526, + "name": "Matriarchy", + "description": "Prominently features a country that is ruled by a Queen or a society that is dominated by female inheritance.", + "category": "Setting", + "isAdult": false + }, + { + "id": 659, + "name": "Medicine", + "description": "Centered around the activities of people working in the field of medicine.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 1752, + "name": "Medieval", + "description": "Partially or completely set in the Middle Ages or a Middle Ages-inspired setting. Commonly features elements such as European castles and knights.", + "category": "Setting-Time", + "isAdult": false + }, + { + "id": 365, + "name": "Memory Manipulation", + "description": "Prominently features a character(s) who has had their memories altered.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 558, + "name": "Mermaid", + "description": "A mythological creature with the body of a human and the tail of a fish.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 144, + "name": "Meta", + "description": "Features fourth wall-breaking references to itself or genre tropes.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 1675, + "name": "Metal Music", + "description": "Centers on the musical style of metal, not to be applied to anime that use metal in its soundtrack.", + "category": "Theme-Arts-Music", + "isAdult": false + }, + { + "id": 187, + "name": "MILF", + "description": "Features sexual intercourse with older women.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 34, + "name": "Military", + "description": "Centered around the life and activities of military personnel.", + "category": "Theme-Other-Organisations", + "isAdult": false + }, + { + "id": 1361, + "name": "Mixed Gender Harem", + "description": "Main cast features the protagonist plus several people, regardless of gender, who are romantically interested in them.", + "category": "Theme-Romance", + "isAdult": false + }, + { + "id": 1742, + "name": "Mixed Media", + "description": "Features a combination of different media and animation techniques. Often seen with puppetry, textiles, live action footage, stop motion, and more. This does not include works with normal usage of CGI in their production.", + "category": "Technical", + "isAdult": false + }, + { + "id": 1848, + "name": "Modeling", + "description": "Features a line of work with the purpose of displaying and advertising products such as makeup, clothing, and jewelry. Also includes posing artistically for figure drawing, painting, sculpting, and photography.", + "category": "Theme-Arts", + "isAdult": false + }, + { + "id": 1090, + "name": "Monster Boy", + "description": "Prominently features a male character who is a part-monster.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 259, + "name": "Monster Girl", + "description": "Prominently features a female character who is part-monster.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 176, + "name": "Mopeds", + "description": "Prominently features mopeds.", + "category": "Theme-Other-Vehicle", + "isAdult": false + }, + { + "id": 173, + "name": "Motorcycles", + "description": "Prominently features the use of motorcycles.", + "category": "Theme-Other-Vehicle", + "isAdult": false + }, + { + "id": 1544, + "name": "Mountaineering", + "description": "Prominently features characters discussing or hiking mountains.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 265, + "name": "Musical Theater", + "description": "Features a performance that combines songs, spoken dialogue, acting, and dance.", + "category": "Theme-Arts-Music", + "isAdult": false + }, + { + "id": 208, + "name": "Mythology", + "description": "Prominently features mythological elements, especially those from religious or cultural tradition.", + "category": "Theme-Fantasy", + "isAdult": false + }, + { + "id": 125, + "name": "Nakadashi", + "description": "Creampie; features sexual ejaculation inside of a character.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 1501, + "name": "Natural Disaster", + "description": "It focuses on catastrophic events of natural origin, such as earthquakes, tsunamis, volcanic eruptions, and severe storms. These works often present situations of extreme danger in which the characters struggle to survive and overcome the adversity.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 1243, + "name": "Necromancy", + "description": "When the dead are summoned as spirits, skeletons, or the undead, usually for the purpose of gaining information or to be used as a weapon.", + "category": "Theme-Fantasy", + "isAdult": false + }, + { + "id": 113, + "name": "Nekomimi", + "description": "Humanoid characters with cat-like features such as cat ears and a tail.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 124, + "name": "Netorare", + "description": "Netorare is what happens when the protagonist gets their partner stolen from them by someone else. It is a sexual fetish designed to cause sexual jealousy by way of having the partner indulge in sexual activity with someone other than the protagonist.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 280, + "name": "Netorase", + "description": "Features characters in a romantic relationship who agree to be sexually intimate with others.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 316, + "name": "Netori", + "description": "Features the protagonist stealing the partner of someone else. The opposite of netorare.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 255, + "name": "Ninja", + "description": "Prominently features Japanese warriors traditionally trained in espionage, sabotage and assasination.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 341, + "name": "No Dialogue", + "description": "This work contains no dialogue.", + "category": "Technical", + "isAdult": false + }, + { + "id": 327, + "name": "Noir", + "description": "Stylized as a cynical crime drama with low-key visuals.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 1337, + "name": "Non-fiction", + "description": "A work that provides information regarding a real world topic and does not focus on an imaginary narrative.", + "category": "Technical", + "isAdult": false + }, + { + "id": 100, + "name": "Nudity", + "description": "Features a character wearing no clothing or exposing intimate body parts.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 614, + "name": "Nun", + "description": "Prominently features a character who is a nun.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1571, + "name": "Office", + "description": "Features people who work in a business office.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 653, + "name": "Office Lady", + "description": "Prominently features a female office worker or OL.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 593, + "name": "Oiran", + "description": "Prominently features a courtesan character of the Japanese Edo Period.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 780, + "name": "Ojou-sama", + "description": "Features a wealthy, high-class, oftentimes stuck up and demanding female character.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 533, + "name": "Omegaverse", + "description": "Alternative universe that prominently features dynamics modeled after wolves in which there are alphas, betas, and omegas and heat cycles as well as impregnation, regardless of gender.", + "category": "Setting-Universe", + "isAdult": true + }, + { + "id": 1382, + "name": "Orphan", + "description": "Prominently features a character that is an orphan.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 97, + "name": "Otaku Culture", + "description": "Centers around the culture of a fanatical fan-base.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 262, + "name": "Outdoor Activities", + "description": "Centers around hiking, camping or other outdoor activities.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 1903, + "name": "Oyakodon", + "description": "Features a character who has sexual relations with both the mother and her daughter.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 874, + "name": "Pandemic", + "description": "Prominently features a disease prevalent over a whole country or the world.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 1645, + "name": "Parenthood", + "description": "Centers around the experience of raising a child.", + "category": "Theme-Slice of Life", + "isAdult": false + }, + { + "id": 949, + "name": "Parkour", + "description": "Centers around the sport of parkour.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 39, + "name": "Parody", + "description": "Features deliberate exaggeration of popular tropes or a particular genre to comedic effect.", + "category": "Theme-Comedy", + "isAdult": false + }, + { + "id": 1515, + "name": "Pet Play", + "description": "Treating a participant as though they were a pet animal. Often involves a collar and possibly BDSM.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 391, + "name": "Philosophy", + "description": "Relating or devoted to the study of the fundamental nature of knowledge, reality, and existence.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 195, + "name": "Photography", + "description": "Centers around the use of cameras to capture photos.", + "category": "Theme-Arts", + "isAdult": false + }, + { + "id": 201, + "name": "Pirates", + "description": "Prominently features sea-faring adventurers branded as criminals by the law.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 183, + "name": "Poker", + "description": "Centers around the game of poker or its variations.", + "category": "Theme-Game-Card & Board Game", + "isAdult": false + }, + { + "id": 40, + "name": "Police", + "description": "Centers around the life and activities of law enforcement officers.", + "category": "Theme-Other-Organisations", + "isAdult": false + }, + { + "id": 103, + "name": "Politics", + "description": "Centers around politics, politicians, or government activities.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 1459, + "name": "Polyamorous", + "description": "Features a character who is in a consenting relationship with multiple people at one time.", + "category": "Theme-Romance", + "isAdult": false + }, + { + "id": 93, + "name": "Post-Apocalyptic", + "description": "Partly or completely set in a world or civilization after a global disaster.", + "category": "Setting-Universe", + "isAdult": false + }, + { + "id": 215, + "name": "POV", + "description": "Point of View; features scenes shown from the perspective of the series protagonist.", + "category": "Technical", + "isAdult": false + }, + { + "id": 397, + "name": "Pregnancy", + "description": "Features pregnant female characters or discusses the topic of pregnancy.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 109, + "name": "Primarily Adult Cast", + "description": "Main cast is mostly composed of characters above a high school age.", + "category": "Cast-Main Cast", + "isAdult": false + }, + { + "id": 1601, + "name": "Primarily Animal Cast", + "description": "Main cast is mostly composed animal or animal-like characters.", + "category": "Cast-Main Cast", + "isAdult": false + }, + { + "id": 446, + "name": "Primarily Child Cast", + "description": "Main cast is mostly composed of characters below a high school age.", + "category": "Cast-Main Cast", + "isAdult": false + }, + { + "id": 86, + "name": "Primarily Female Cast", + "description": "Main cast is mostly composed of female characters.", + "category": "Cast-Main Cast", + "isAdult": false + }, + { + "id": 88, + "name": "Primarily Male Cast", + "description": "Main cast is mostly composed of male characters.", + "category": "Cast-Main Cast", + "isAdult": false + }, + { + "id": 1228, + "name": "Primarily Teen Cast", + "description": "Main cast is mostly composed of teen characters.", + "category": "Cast-Main Cast", + "isAdult": false + }, + { + "id": 1427, + "name": "Prison", + "description": "Partly or completely set in a prison.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 190, + "name": "Prostitution", + "description": "Features characters who are paid for sexual favors.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 1490, + "name": "Proxy Battle", + "description": "A proxy battle is a battle where humans use creatures/robots to do the fighting for them, either by commanding those creatures/robots or by simply evolving them/changing them into battle mode.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 1670, + "name": "Psychosexual", + "description": "Work that involves the psychological aspects of sexual impulses.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 127, + "name": "Public Sex", + "description": "Features sexual acts performed in public settings.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 325, + "name": "Puppetry", + "description": "Animation style involving the manipulation of puppets to act out scenes.", + "category": "Technical", + "isAdult": false + }, + { + "id": 481, + "name": "Rakugo", + "description": "Rakugo is the traditional Japanese performance art of comic storytelling.", + "category": "Theme-Arts", + "isAdult": false + }, + { + "id": 155, + "name": "Rape", + "description": "Features non-consensual sexual penetration.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 160, + "name": "Real Robot", + "description": "Prominently features mechanical designs loosely influenced by real-world robotics.", + "category": "Theme-Sci-Fi-Mecha", + "isAdult": false + }, + { + "id": 311, + "name": "Rehabilitation", + "description": "Prominently features the recovery of a character who became incapable of social life or work.", + "category": "Theme-Drama", + "isAdult": false + }, + { + "id": 243, + "name": "Reincarnation", + "description": "Features a character being born again after death, typically as another person or in another world.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 1091, + "name": "Religion", + "description": "Centers on the belief that humanity is related to supernatural, transcendental, and spiritual elements.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 1745, + "name": "Rescue", + "description": "Centers around operations that carry out urgent treatment of injuries, remove people from danger, or save lives. This includes series that are about search-and-rescue teams, trauma surgeons, firefighters, and more.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 1647, + "name": "Restaurant", + "description": "Features a business that prepares and serves food and drinks to customers. Also encompasses cafes and bistros.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 252, + "name": "Revenge", + "description": "Prominently features a character who aims to exact punishment in a resentful or vindictive manner.", + "category": "Theme-Drama", + "isAdult": false + }, + { + "id": 1907, + "name": "Reverse Isekai", + "description": "Features a character from a fantasy world who is transported into a modern day setting.", + "category": "Theme-Fantasy", + "isAdult": false + }, + { + "id": 845, + "name": "Rimjob", + "description": "Features oral sex performed on the anus.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 175, + "name": "Robots", + "description": "Prominently features humanoid machines.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1674, + "name": "Rock Music", + "description": "Centers on the musical style of rock, not to be applied to anime that use rock in its soundtrack.", + "category": "Theme-Arts-Music", + "isAdult": false + }, + { + "id": 683, + "name": "Rotoscoping", + "description": "Animation technique that animators use to trace over motion picture footage, frame by frame, to produce realistic action.", + "category": "Technical", + "isAdult": false + }, + { + "id": 1327, + "name": "Royal Affairs", + "description": "Features nobility, alliances, arranged marriage, succession disputes, religious orders and other elements of royal politics.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 221, + "name": "Rugby", + "description": "Centers around the sport of rugby.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 250, + "name": "Rural", + "description": "Partly or completely set in the countryside.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 723, + "name": "Sadism", + "description": "Prominently features characters deriving pleasure, especially sexual gratification, from inflicting pain, suffering, or humiliation on others.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 291, + "name": "Samurai", + "description": "Prominently features warriors of medieval Japanese nobility bound by a code of honor.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 80, + "name": "Satire", + "description": "Prominently features the use of comedy or ridicule to expose and criticise social phenomena.", + "category": "Theme-Comedy", + "isAdult": false + }, + { + "id": 387, + "name": "Scat", + "description": "Lots of feces.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 46, + "name": "School", + "description": "Partly or completely set in a primary or secondary educational institution.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 84, + "name": "School Club", + "description": "Partly or completely set in a school club scene.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 1039, + "name": "Scissoring", + "description": "A form of sexual activity between women in which the genitals are stimulated by being rubbed against one another.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 811, + "name": "Scuba Diving", + "description": "Prominently features characters diving with the aid of special breathing equipment.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 50, + "name": "Seinen", + "description": "Target demographic is adult males.", + "category": "Demographic", + "isAdult": false + }, + { + "id": 133, + "name": "Sex Toys", + "description": "Features objects that are designed to stimulate sexual pleasure.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 772, + "name": "Shapeshifting", + "description": "Features character(s) who changes one's appearance or form.", + "category": "Theme-Fantasy", + "isAdult": false + }, + { + "id": 1732, + "name": "Shimaidon", + "description": "Features a character who has sexual relations with two sisters.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 305, + "name": "Ships", + "description": "Prominently features the use of sea-based transportation vessels.", + "category": "Theme-Other-Vehicle", + "isAdult": false + }, + { + "id": 121, + "name": "Shogi", + "description": "Centers around the game of shogi.", + "category": "Theme-Game-Card & Board Game", + "isAdult": false + }, + { + "id": 53, + "name": "Shoujo", + "description": "Target demographic is teenage and young adult females.", + "category": "Demographic", + "isAdult": false + }, + { + "id": 56, + "name": "Shounen", + "description": "Target demographic is teenage and young adult males.", + "category": "Demographic", + "isAdult": false + }, + { + "id": 468, + "name": "Shrine Maiden", + "description": "Prominently features a character who is a shrine maiden.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 809, + "name": "Skateboarding", + "description": "Centers around or prominently features skateboarding as a sport.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 499, + "name": "Skeleton", + "description": "Prominently features skeleton(s) as a character.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 83, + "name": "Slapstick", + "description": "Prominently features comedy based on deliberately clumsy actions or embarrassing events.", + "category": "Theme-Comedy", + "isAdult": false + }, + { + "id": 247, + "name": "Slavery", + "description": "Prominently features slaves, slavery, or slave trade.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 1616, + "name": "Snowscape", + "description": "Prominently or partially set in a snowy environment.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 386, + "name": "Software Development", + "description": "Centers around characters developing or programming a piece of technology, software, gaming, etc.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 63, + "name": "Space", + "description": "Partly or completely set in outer space.", + "category": "Setting-Universe", + "isAdult": false + }, + { + "id": 162, + "name": "Space Opera", + "description": "Centers around space warfare, advanced technology, chivalric romance and adventure.", + "category": "Theme-Sci-Fi", + "isAdult": false + }, + { + "id": 1292, + "name": "Spearplay", + "description": "Prominently features the use of spears in combat.", + "category": "Theme-Action", + "isAdult": false + }, + { + "id": 1235, + "name": "Squirting", + "description": "Female ejaculation; features the expulsion of liquid from the female genitalia.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 95, + "name": "Steampunk", + "description": "Prominently features technology and designs inspired by 19th-century industrial steam-powered machinery.", + "category": "Theme-Fantasy", + "isAdult": false + }, + { + "id": 323, + "name": "Stop Motion", + "description": "Animation style characterized by physical objects being moved incrementally between frames to create the illusion of movement.", + "category": "Technical", + "isAdult": false + }, + { + "id": 665, + "name": "Succubus", + "description": "Prominently features a character who is a succubus, a creature in medieval folklore that typically uses their sexual prowess to trap and seduce people to feed off them.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1046, + "name": "Suicide", + "description": "The act or an instance of taking or attempting to take one's own life voluntarily and intentionally.", + "category": "Theme-Drama", + "isAdult": false + }, + { + "id": 360, + "name": "Sumata", + "description": "Pussyjob; features the stimulation of male genitalia by the thighs and labia majora of a female character.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 1080, + "name": "Sumo", + "description": "Centers around the sport of sumo.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 66, + "name": "Super Power", + "description": "Prominently features characters with special abilities that allow them to do what would normally be physically or logically impossible.", + "category": "Theme-Fantasy", + "isAdult": false + }, + { + "id": 159, + "name": "Super Robot", + "description": "Prominently features large robots often piloted by hot-blooded protagonists.", + "category": "Theme-Sci-Fi-Mecha", + "isAdult": false + }, + { + "id": 172, + "name": "Superhero", + "description": "Prominently features super-powered humans who aim to serve the greater good.", + "category": "Theme-Fantasy", + "isAdult": false + }, + { + "id": 678, + "name": "Surfing", + "description": "Centers around surfing as a sport.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 281, + "name": "Surreal Comedy", + "description": "Prominently features comedic moments that defy casual reasoning, resulting in illogical events.", + "category": "Theme-Comedy", + "isAdult": false + }, + { + "id": 143, + "name": "Survival", + "description": "Centers around the struggle to live in spite of extreme obstacles.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 1902, + "name": "Swapping ", + "description": "Features consensual partner swapping between couples during sexual activities.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 630, + "name": "Sweat", + "description": "Lots of sweat.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 150, + "name": "Swimming", + "description": "Centers around the sport of swimming.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 43, + "name": "Swordplay", + "description": "Prominently features the use of swords in combat.", + "category": "Theme-Action", + "isAdult": false + }, + { + "id": 120, + "name": "Table Tennis", + "description": "Centers around the sport of table tennis (also known as \"ping pong\").", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 174, + "name": "Tanks", + "description": "Prominently features the use of tanks or other armoured vehicles.", + "category": "Theme-Other-Vehicle", + "isAdult": false + }, + { + "id": 335, + "name": "Tanned Skin", + "description": "Prominently features characters with tanned skin.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 165, + "name": "Teacher", + "description": "Protagonist is an educator, usually in a school setting.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 649, + "name": "Teens' Love", + "description": "Sexually explicit love-story between individuals of the opposite sex, specifically targeting females of teens and young adult age.", + "category": "Theme-Romance", + "isAdult": false + }, + { + "id": 194, + "name": "Tennis", + "description": "Centers around the sport of tennis.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 189, + "name": "Tentacles", + "description": "Features the long appendages most commonly associated with octopuses or squid, often sexually penetrating a character.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 285, + "name": "Terrorism", + "description": "Centers around the activities of a terrorist or terrorist organization.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 132, + "name": "Threesome", + "description": "Features sexual acts between three people.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 1596, + "name": "Time Loop", + "description": "A character is stuck in a repetitive cycle that they are attempting to break out of. This is distinct from a manipulating time of their own choice.", + "category": "Theme-Sci-Fi", + "isAdult": false + }, + { + "id": 96, + "name": "Time Manipulation", + "description": "Prominently features time-traveling or other time-warping phenomena.", + "category": "Theme-Sci-Fi", + "isAdult": false + }, + { + "id": 153, + "name": "Time Skip", + "description": "Features a gap in time used to advance the story.", + "category": "Setting-Time", + "isAdult": false + }, + { + "id": 513, + "name": "Tokusatsu", + "description": "Prominently features elements that resemble special effects in Japanese live-action shows", + "category": "Theme-Sci-Fi", + "isAdult": false + }, + { + "id": 931, + "name": "Tomboy", + "description": "Features a girl who exhibits characteristics or behaviors considered in many cultures to be typical of boys.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1121, + "name": "Torture", + "description": "The act of deliberately inflicting severe pain or suffering upon another individual or oneself as a punishment or with a specific purpose.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 85, + "name": "Tragedy", + "description": "Centers around tragic events and unhappy endings.", + "category": "Theme-Drama", + "isAdult": false + }, + { + "id": 122, + "name": "Trains", + "description": "Prominently features trains.", + "category": "Theme-Other-Vehicle", + "isAdult": false + }, + { + "id": 1165, + "name": "Transgender", + "description": "Features a character whose gender identity differs from the sex they were assigned at birth.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1310, + "name": "Travel", + "description": "Centers around character(s) moving between places a significant distance apart.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 214, + "name": "Triads", + "description": "Centered around Chinese organised crime syndicates.", + "category": "Theme-Other-Organisations", + "isAdult": false + }, + { + "id": 164, + "name": "Tsundere", + "description": "Prominently features a character who acts cold and hostile in order to mask warmer emotions.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 494, + "name": "Twins", + "description": "Prominently features two or more siblings that were born at one birth.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1539, + "name": "Unrequited Love", + "description": "One or more characters are experiencing an unrequited love that may or may not be reciprocated.", + "category": "Theme-Romance", + "isAdult": false + }, + { + "id": 595, + "name": "Urban", + "description": "Partly or completely set in a city.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 321, + "name": "Urban Fantasy", + "description": "Set in a world similar to the real world, but with the existence of magic or other supernatural elements.", + "category": "Setting-Universe", + "isAdult": false + }, + { + "id": 74, + "name": "Vampire", + "description": "Prominently features a character who is a vampire.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1790, + "name": "Vertical Video", + "description": "Animated works originally created in a vertical aspect ratio (such as 9:16), intended for viewing on smartphones.", + "category": "Technical", + "isAdult": false + }, + { + "id": 1574, + "name": "Veterinarian", + "description": "Prominently features a veterinarian or one of the main characters is a veterinarian.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 308, + "name": "Video Games", + "description": "Centers around characters playing video games.", + "category": "Theme-Game", + "isAdult": false + }, + { + "id": 618, + "name": "Vikings", + "description": "Prominently features Scandinavian seafaring pirates and warriors.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 857, + "name": "Villainess", + "description": "Centers around or prominently features a villainous noble lady.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 380, + "name": "Virginity", + "description": "Features a male character who has never had sexual relations (until now).", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 112, + "name": "Virtual World", + "description": "Partly or completely set in the world inside a video game.", + "category": "Setting-Universe", + "isAdult": false + }, + { + "id": 1690, + "name": "Vocal Synth", + "description": "Features one or more singers or characters that are products of a synthesize singing program. Popular examples are Vocaloids, UTAUloids, and CeVIOs.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 116, + "name": "Volleyball", + "description": "Centers around the sport of volleyball.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 624, + "name": "Vore", + "description": "Features a character being swallowed or swallowing another creature whole.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 318, + "name": "Voyeur", + "description": "Features a character who enjoys seeing the sex acts or sex organs of others.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 1047, + "name": "VTuber", + "description": "Prominently features a character who is either an actual or fictive VTuber.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 111, + "name": "War", + "description": "Partly or completely set during wartime.", + "category": "Theme-Other", + "isAdult": false + }, + { + "id": 180, + "name": "Watersports", + "description": "Features sexual situations involving urine.", + "category": "Sexual Content", + "isAdult": true + }, + { + "id": 534, + "name": "Werewolf", + "description": "Prominently features a character who is a werewolf.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1760, + "name": "Wilderness", + "description": "Predominantly features a location with little to no human activity, such as a deserted island, a jungle, or a snowy mountain range.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 179, + "name": "Witch", + "description": "Prominently features a character who is a witch.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 145, + "name": "Work", + "description": "Centers around the activities of a certain occupation.", + "category": "Setting-Scene", + "isAdult": false + }, + { + "id": 231, + "name": "Wrestling", + "description": "Centers around the sport of wrestling.", + "category": "Theme-Game-Sport", + "isAdult": false + }, + { + "id": 394, + "name": "Writing", + "description": "Centers around the profession of writing books or novels.", + "category": "Theme-Arts", + "isAdult": false + }, + { + "id": 303, + "name": "Wuxia", + "description": "Chinese fiction concerning the adventures of martial artists in Ancient China.", + "category": "Theme-Fantasy", + "isAdult": false + }, + { + "id": 199, + "name": "Yakuza", + "description": "Centered around Japanese organised crime syndicates.", + "category": "Theme-Other-Organisations", + "isAdult": false + }, + { + "id": 163, + "name": "Yandere", + "description": "Prominently features a character who is obsessively in love with another, to the point of acting deranged or violent.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 233, + "name": "Youkai", + "description": "Prominently features supernatural creatures from Japanese folklore.", + "category": "Theme-Fantasy", + "isAdult": false + }, + { + "id": 76, + "name": "Yuri", + "description": "Prominently features romance between two females, not inherently sexual. Also known as Girls' Love.", + "category": "Theme-Romance", + "isAdult": false + }, + { + "id": 152, + "name": "Zombie", + "description": "Prominently features reanimated corpses which often prey on live humans and turn them into zombies.", + "category": "Cast-Traits", + "isAdult": false + }, + { + "id": 1446, + "name": "Zoophilia", + "description": "Features a character who has a sexual attraction for non-human animals.", + "category": "Sexual Content", + "isAdult": true + } +] \ No newline at end of file diff --git a/seanime-web/src/app/(main)/search/_lib/advanced-search.atoms.ts b/seanime-web/src/app/(main)/search/_lib/advanced-search.atoms.ts index e733dc60c..dcb67f8ae 100644 --- a/seanime-web/src/app/(main)/search/_lib/advanced-search.atoms.ts +++ b/seanime-web/src/app/(main)/search/_lib/advanced-search.atoms.ts @@ -1,4 +1,4 @@ -import { AL_MediaFormat, AL_MediaSeason, AL_MediaSort, AL_MediaStatus } from "@/api/generated/types" +import { AL_MediaFormat, AL_MediaSeason, AL_MediaSort, AL_MediaStatus, AL_BaseAnime_Tags } from "@/api/generated/types" import { atomWithImmer } from "jotai-immer" type Params = { @@ -6,6 +6,7 @@ type Params = { title: string | null sorting: AL_MediaSort[] | null genre: string[] | null + tags: string[] | null status: AL_MediaStatus[] | null format: AL_MediaFormat | null season: AL_MediaSeason | null @@ -22,6 +23,7 @@ export const __advancedSearch_paramsAtom = atomWithImmer({ sorting: null, status: null, genre: null, + tags: null, format: null, season: null, year: null, diff --git a/seanime-web/src/app/(main)/search/_lib/handle-advanced-search.ts b/seanime-web/src/app/(main)/search/_lib/handle-advanced-search.ts index 33cf5c145..be31a86c2 100644 --- a/seanime-web/src/app/(main)/search/_lib/handle-advanced-search.ts +++ b/seanime-web/src/app/(main)/search/_lib/handle-advanced-search.ts @@ -22,6 +22,7 @@ export function useAnilistAdvancedSearch() { format: __advancedSearch_getValue(params.format)?.toUpperCase(), search: (params.title === null || params.title === "") ? undefined : params.title, genres: __advancedSearch_getValue(params.genre), + tags: __advancedSearch_getValue(params.tags), season: __advancedSearch_getValue(params.season), seasonYear: __advancedSearch_getValue(params.year), averageScore_greater: __advancedSearch_getValue(params.minScore) !== undefined @@ -61,6 +62,7 @@ export function useAnilistAdvancedSearch() { perPage: 48, search: (params.title === null || params.title === "") ? undefined : params.title, genres: __advancedSearch_getValue(params.genre), + tags: __advancedSearch_getValue(params.tags), year: __advancedSearch_getValue(params.year), format: __advancedSearch_getValue(params.format)?.toUpperCase(), averageScore_greater: __advancedSearch_getValue(params.minScore) !== undefined diff --git a/seanime-web/src/app/(main)/search/page.tsx b/seanime-web/src/app/(main)/search/page.tsx index ec1e03b2b..38cb65571 100644 --- a/seanime-web/src/app/(main)/search/page.tsx +++ b/seanime-web/src/app/(main)/search/page.tsx @@ -27,6 +27,7 @@ export default function Page() { const seasonUrlParam = urlParams.get("season") const yearUrlParam = urlParams.get("year") const typeUrlParam = urlParams.get("type") + const tagsUrlParam = urlParams.get("tags") const setParams = useSetAtom(__advancedSearch_paramsAtom) @@ -34,13 +35,14 @@ export default function Page() { useMount(() => { - if (sortingUrlParam || genreUrlParam || statusUrlParam || formatUrlParam || seasonUrlParam || yearUrlParam || typeUrlParam) { + if (sortingUrlParam || genreUrlParam || statusUrlParam || formatUrlParam || seasonUrlParam || yearUrlParam || typeUrlParam || tagsUrlParam) { setParams({ active: true, title: null, sorting: sortingUrlParam ? [sortingUrlParam as AL_MediaSort] : null, status: statusUrlParam ? [statusUrlParam as AL_MediaStatus] : null, genre: genreUrlParam ? [genreUrlParam] : null, + tags: tagsUrlParam ? [tagsUrlParam] : null, format: (formatUrlParam as AL_MediaFormat) === "MANGA" ? null : (formatUrlParam as AL_MediaFormat), season: (seasonUrlParam as AL_MediaSeason) || null, year: yearUrlParam || null, 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()