fix: Fixed search page hitting the API too often resulting in rate limiting (#221)

This commit is contained in:
Mani
2024-07-29 03:50:54 +02:00
committed by GitHub
parent f85e21b8c9
commit d5ccb7d08c
11 changed files with 129 additions and 119 deletions
+57 -69
View File
@@ -36,8 +36,8 @@
"next-mdx-remote": "^4.3.0",
"p-limit": "^3.1.0",
"picocolors": "^1.0.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-query": "^3.29.0",
"rehype-pretty-code": "^0.9.4",
"rehype-slug": "^5.1.0",
@@ -47,8 +47,8 @@
"styled-components": "^5.3.3",
"swr": "^2.2.4",
"unist-util-visit": "^4.1.2",
"use-local-storage-state": "^18.3.0",
"use-session-storage-state": "^18.1.1"
"use-local-storage-state": "^19.3.1",
"use-session-storage-state": "^19.0.0"
},
"devDependencies": {
"@graphql-codegen/cli": "^5.0.2",
@@ -4448,11 +4448,6 @@
"hoist-non-react-statics": "^3.3.0"
}
},
"node_modules/@types/js-cookie": {
"version": "2.2.7",
"resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz",
"integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA=="
},
"node_modules/@types/js-yaml": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz",
@@ -4910,17 +4905,16 @@
}
},
"node_modules/ahooks": {
"version": "3.7.6",
"resolved": "https://registry.npmjs.org/ahooks/-/ahooks-3.7.6.tgz",
"integrity": "sha512-p+2j4H/BI9vqXR0fZI7S/q6fUPxPklQnHqvU7zAVBljMFNSFeYRWB2iHHbjpXGOwUTOBYCh2OuvIHyJYj6Lpag==",
"version": "3.8.0",
"resolved": "https://registry.npmjs.org/ahooks/-/ahooks-3.8.0.tgz",
"integrity": "sha512-M01m+mxLRNNeJ/PCT3Fom26UyreTj6oMqJBetUrJnK4VNI5j6eMA543Xxo53OBXn6XibA2FXKcCCgrT6YCTtKQ==",
"dependencies": {
"@babel/runtime": "^7.21.0",
"@types/js-cookie": "^2.x.x",
"ahooks-v3-count": "^1.0.0",
"dayjs": "^1.9.1",
"intersection-observer": "^0.12.0",
"js-cookie": "^2.x.x",
"lodash": "^4.17.21",
"react-fast-compare": "^3.2.2",
"resize-observer-polyfill": "^1.5.1",
"screenfull": "^5.0.0",
"tslib": "^2.4.1"
@@ -4932,11 +4926,6 @@
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/ahooks-v3-count": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/ahooks-v3-count/-/ahooks-v3-count-1.0.0.tgz",
"integrity": "sha512-V7uUvAwnimu6eh/PED4mCDjE7tokeZQLKlxg9lCTMPhN+NjsSbtdacByVlR1oluXQzD3MOw55wylDmQo4+S9ZQ=="
},
"node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -11285,9 +11274,9 @@
]
},
"node_modules/react": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
"integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
"version": "18.3.1",
"resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
"integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
"dependencies": {
"loose-envify": "^1.1.0"
},
@@ -11296,17 +11285,22 @@
}
},
"node_modules/react-dom": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
"integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
"version": "18.3.1",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
"integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
"dependencies": {
"loose-envify": "^1.1.0",
"scheduler": "^0.23.0"
"scheduler": "^0.23.2"
},
"peerDependencies": {
"react": "^18.2.0"
"react": "^18.3.1"
}
},
"node_modules/react-fast-compare": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
"integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="
},
"node_modules/react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
@@ -11825,9 +11819,9 @@
"integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ=="
},
"node_modules/scheduler": {
"version": "0.23.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
"integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
"version": "0.23.2",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
"integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
"dependencies": {
"loose-envify": "^1.1.0"
}
@@ -12983,11 +12977,11 @@
}
},
"node_modules/use-local-storage-state": {
"version": "18.3.0",
"resolved": "https://registry.npmjs.org/use-local-storage-state/-/use-local-storage-state-18.3.0.tgz",
"integrity": "sha512-SWInjtfTuptkw1S7ZmVxcXLpcNUlUIG3mvZahnXPWbltF4Kz/mOhnQ8cac681UxDHOEFqKdivxHMmeScMTeKZg==",
"version": "19.3.1",
"resolved": "https://registry.npmjs.org/use-local-storage-state/-/use-local-storage-state-19.3.1.tgz",
"integrity": "sha512-y3Z1dODXvZXZB4qtLDNN8iuXbsYD6TAxz61K58GWB9/yKwrNG9ynI0GzCTHi/Je1rMiyOwMimz0oyFsZn+Kj7Q==",
"engines": {
"node": ">=12"
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/astoilkov"
@@ -12998,11 +12992,11 @@
}
},
"node_modules/use-session-storage-state": {
"version": "18.1.1",
"resolved": "https://registry.npmjs.org/use-session-storage-state/-/use-session-storage-state-18.1.1.tgz",
"integrity": "sha512-smeznwdz+7ClDng/9eDLt4Dh8Af8jRR1BqW0Ps6E998S/GZ8INoL73Qf0vb6UbvAAIs60FGstnyLmGz2AKEeWQ==",
"version": "19.0.0",
"resolved": "https://registry.npmjs.org/use-session-storage-state/-/use-session-storage-state-19.0.0.tgz",
"integrity": "sha512-u6kyD7lgAm0xSwLerXcrbaNLWqeYsXYPuB97XZftBPAqPo5gVAMvAeFsRLwxblpCQDxFkjKsz/apTM5OlkbKFg==",
"engines": {
"node": ">=12"
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/astoilkov"
@@ -16646,11 +16640,6 @@
"hoist-non-react-statics": "^3.3.0"
}
},
"@types/js-cookie": {
"version": "2.2.7",
"resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz",
"integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA=="
},
"@types/js-yaml": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz",
@@ -16984,27 +16973,21 @@
}
},
"ahooks": {
"version": "3.7.6",
"resolved": "https://registry.npmjs.org/ahooks/-/ahooks-3.7.6.tgz",
"integrity": "sha512-p+2j4H/BI9vqXR0fZI7S/q6fUPxPklQnHqvU7zAVBljMFNSFeYRWB2iHHbjpXGOwUTOBYCh2OuvIHyJYj6Lpag==",
"version": "3.8.0",
"resolved": "https://registry.npmjs.org/ahooks/-/ahooks-3.8.0.tgz",
"integrity": "sha512-M01m+mxLRNNeJ/PCT3Fom26UyreTj6oMqJBetUrJnK4VNI5j6eMA543Xxo53OBXn6XibA2FXKcCCgrT6YCTtKQ==",
"requires": {
"@babel/runtime": "^7.21.0",
"@types/js-cookie": "^2.x.x",
"ahooks-v3-count": "^1.0.0",
"dayjs": "^1.9.1",
"intersection-observer": "^0.12.0",
"js-cookie": "^2.x.x",
"lodash": "^4.17.21",
"react-fast-compare": "^3.2.2",
"resize-observer-polyfill": "^1.5.1",
"screenfull": "^5.0.0",
"tslib": "^2.4.1"
}
},
"ahooks-v3-count": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/ahooks-v3-count/-/ahooks-v3-count-1.0.0.tgz",
"integrity": "sha512-V7uUvAwnimu6eh/PED4mCDjE7tokeZQLKlxg9lCTMPhN+NjsSbtdacByVlR1oluXQzD3MOw55wylDmQo4+S9ZQ=="
},
"ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -21484,22 +21467,27 @@
"dev": true
},
"react": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
"integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
"version": "18.3.1",
"resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
"integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
"requires": {
"loose-envify": "^1.1.0"
}
},
"react-dom": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
"integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
"version": "18.3.1",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
"integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
"requires": {
"loose-envify": "^1.1.0",
"scheduler": "^0.23.0"
"scheduler": "^0.23.2"
}
},
"react-fast-compare": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
"integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="
},
"react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
@@ -21845,9 +21833,9 @@
}
},
"scheduler": {
"version": "0.23.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
"integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
"version": "0.23.2",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
"integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
"requires": {
"loose-envify": "^1.1.0"
}
@@ -22668,15 +22656,15 @@
"requires": {}
},
"use-local-storage-state": {
"version": "18.3.0",
"resolved": "https://registry.npmjs.org/use-local-storage-state/-/use-local-storage-state-18.3.0.tgz",
"integrity": "sha512-SWInjtfTuptkw1S7ZmVxcXLpcNUlUIG3mvZahnXPWbltF4Kz/mOhnQ8cac681UxDHOEFqKdivxHMmeScMTeKZg==",
"version": "19.3.1",
"resolved": "https://registry.npmjs.org/use-local-storage-state/-/use-local-storage-state-19.3.1.tgz",
"integrity": "sha512-y3Z1dODXvZXZB4qtLDNN8iuXbsYD6TAxz61K58GWB9/yKwrNG9ynI0GzCTHi/Je1rMiyOwMimz0oyFsZn+Kj7Q==",
"requires": {}
},
"use-session-storage-state": {
"version": "18.1.1",
"resolved": "https://registry.npmjs.org/use-session-storage-state/-/use-session-storage-state-18.1.1.tgz",
"integrity": "sha512-smeznwdz+7ClDng/9eDLt4Dh8Af8jRR1BqW0Ps6E998S/GZ8INoL73Qf0vb6UbvAAIs60FGstnyLmGz2AKEeWQ==",
"version": "19.0.0",
"resolved": "https://registry.npmjs.org/use-session-storage-state/-/use-session-storage-state-19.0.0.tgz",
"integrity": "sha512-u6kyD7lgAm0xSwLerXcrbaNLWqeYsXYPuB97XZftBPAqPo5gVAMvAeFsRLwxblpCQDxFkjKsz/apTM5OlkbKFg==",
"requires": {}
},
"use-sidecar": {
+4 -4
View File
@@ -44,8 +44,8 @@
"next-mdx-remote": "^4.3.0",
"p-limit": "^3.1.0",
"picocolors": "^1.0.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-query": "^3.29.0",
"rehype-pretty-code": "^0.9.4",
"rehype-slug": "^5.1.0",
@@ -55,8 +55,8 @@
"styled-components": "^5.3.3",
"swr": "^2.2.4",
"unist-util-visit": "^4.1.2",
"use-local-storage-state": "^18.3.0",
"use-session-storage-state": "^18.1.1"
"use-local-storage-state": "^19.3.1",
"use-session-storage-state": "^19.0.0"
},
"devDependencies": {
"@graphql-codegen/cli": "^5.0.2",
+3 -1
View File
@@ -37,7 +37,9 @@ export function ErrorCard({ error }: ErrorCardProps) {
</Text>
</Row>
<pre>
<StyledErrorMessage>{JSON.stringify(error, null, 2)}</StyledErrorMessage>
<StyledErrorMessage>
{error instanceof Error ? error.message : JSON.stringify(error, null, 2)}
</StyledErrorMessage>
</pre>
</StyledCard>
);
+9 -7
View File
@@ -1,4 +1,4 @@
import { useState } from "react";
import { useEffect, useState } from "react";
import gql from "graphql-tag";
@@ -32,16 +32,18 @@ export function SearchAnime({ searchQuery }: SearchAnimeProps) {
});
const [prevSearchQuery, setPrevSearchQuery] = useState(searchQuery);
if (!searchQuery && filter.sortBy === null) {
updateFilter("sortBy", initialFilter.sortBy);
return null;
}
useEffect(() => {
if (!searchQuery && filter.sortBy === null) {
updateFilter("sortBy", initialFilter.sortBy);
}
if (searchQuery !== prevSearchQuery) {
// Check if user is switching from non-searching to searching
if (searchQuery && !prevSearchQuery) {
if (searchQuery !== prevSearchQuery && searchQuery && !prevSearchQuery) {
updateFilter("sortBy", null);
}
});
if (searchQuery !== prevSearchQuery) {
setPrevSearchQuery(searchQuery);
return null;
}
+9 -7
View File
@@ -1,4 +1,4 @@
import { useState } from "react";
import { useEffect, useState } from "react";
import gql from "graphql-tag";
@@ -26,16 +26,18 @@ export function SearchArtist({ searchQuery }: SearchArtistProps) {
});
const [prevSearchQuery, setPrevSearchQuery] = useState(searchQuery);
if (!searchQuery && filter.sortBy === null) {
updateFilter("sortBy", initialFilter.sortBy);
return null;
}
useEffect(() => {
if (!searchQuery && filter.sortBy === null) {
updateFilter("sortBy", initialFilter.sortBy);
}
if (searchQuery !== prevSearchQuery) {
// Check if user is switching from non-searching to searching
if (searchQuery && !prevSearchQuery) {
if (searchQuery !== prevSearchQuery && searchQuery && !prevSearchQuery) {
updateFilter("sortBy", null);
}
});
if (searchQuery !== prevSearchQuery) {
setPrevSearchQuery(searchQuery);
return null;
}
+9 -7
View File
@@ -1,4 +1,4 @@
import { useState } from "react";
import { useEffect, useState } from "react";
import gql from "graphql-tag";
@@ -24,16 +24,18 @@ export function SearchPlaylist({ searchQuery }: SearchPlaylistProps) {
});
const [prevSearchQuery, setPrevSearchQuery] = useState(searchQuery);
if (!searchQuery && filter.sortBy === null) {
updateFilter("sortBy", initialFilter.sortBy);
return null;
}
useEffect(() => {
if (!searchQuery && filter.sortBy === null) {
updateFilter("sortBy", initialFilter.sortBy);
}
if (searchQuery !== prevSearchQuery) {
// Check if user is switching from non-searching to searching
if (searchQuery && !prevSearchQuery) {
if (searchQuery !== prevSearchQuery && searchQuery && !prevSearchQuery) {
updateFilter("sortBy", null);
}
});
if (searchQuery !== prevSearchQuery) {
setPrevSearchQuery(searchQuery);
return null;
}
+9 -7
View File
@@ -1,4 +1,4 @@
import { useState } from "react";
import { useEffect, useState } from "react";
import gql from "graphql-tag";
@@ -26,16 +26,18 @@ export function SearchSeries({ searchQuery }: SearchSeriesProps) {
});
const [prevSearchQuery, setPrevSearchQuery] = useState(searchQuery);
if (!searchQuery && filter.sortBy === null) {
updateFilter("sortBy", initialFilter.sortBy);
return null;
}
useEffect(() => {
if (!searchQuery && filter.sortBy === null) {
updateFilter("sortBy", initialFilter.sortBy);
}
if (searchQuery !== prevSearchQuery) {
// Check if user is switching from non-searching to searching
if (searchQuery && !prevSearchQuery) {
if (searchQuery !== prevSearchQuery && searchQuery && !prevSearchQuery) {
updateFilter("sortBy", null);
}
});
if (searchQuery !== prevSearchQuery) {
setPrevSearchQuery(searchQuery);
return null;
}
+9 -7
View File
@@ -1,4 +1,4 @@
import { useState } from "react";
import { useEffect, useState } from "react";
import gql from "graphql-tag";
@@ -27,16 +27,18 @@ export function SearchStudio({ searchQuery }: SearchStudioProps) {
});
const [prevSearchQuery, setPrevSearchQuery] = useState(searchQuery);
if (!searchQuery && filter.sortBy === null) {
updateFilter("sortBy", initialFilter.sortBy);
return null;
}
useEffect(() => {
if (!searchQuery && filter.sortBy === null) {
updateFilter("sortBy", initialFilter.sortBy);
}
if (searchQuery !== prevSearchQuery) {
// Check if user is switching from non-searching to searching
if (searchQuery && !prevSearchQuery) {
if (searchQuery !== prevSearchQuery && searchQuery && !prevSearchQuery) {
updateFilter("sortBy", null);
}
});
if (searchQuery !== prevSearchQuery) {
setPrevSearchQuery(searchQuery);
return null;
}
+9 -7
View File
@@ -1,4 +1,4 @@
import { useState } from "react";
import { useEffect, useState } from "react";
import gql from "graphql-tag";
@@ -28,16 +28,18 @@ export function SearchTheme({ searchQuery }: SearchThemeProps) {
});
const [prevSearchQuery, setPrevSearchQuery] = useState(searchQuery);
if (!searchQuery && filter.sortBy === null) {
updateFilter("sortBy", initialFilter.sortBy);
return null;
}
useEffect(() => {
if (!searchQuery && filter.sortBy === null) {
updateFilter("sortBy", initialFilter.sortBy);
}
if (searchQuery !== prevSearchQuery) {
// Check if user is switching from non-searching to searching
if (searchQuery && !prevSearchQuery) {
if (searchQuery !== prevSearchQuery && searchQuery && !prevSearchQuery) {
updateFilter("sortBy", null);
}
});
if (searchQuery !== prevSearchQuery) {
setPrevSearchQuery(searchQuery);
return null;
}
+7 -2
View File
@@ -1,3 +1,5 @@
import { useCallback } from "react";
import useSessionStorageState from "use-session-storage-state";
export default function useFilterStorage<T>(
@@ -12,7 +14,10 @@ export default function useFilterStorage<T>(
return {
filter,
updateFilter: (key, value) => setFilter({ ...filter, [key]: value }),
bindUpdateFilter: (key) => (value) => setFilter({ ...filter, [key]: value }),
updateFilter: useCallback((key, value) => setFilter((filter) => ({ ...filter, [key]: value })), [setFilter]),
bindUpdateFilter: useCallback(
(key) => (value) => setFilter((filter) => ({ ...filter, [key]: value })),
[setFilter],
),
};
}
+4 -1
View File
@@ -111,7 +111,10 @@ export const searchResolvers: Resolvers = {
const searchParams = getSearchParams(args, true);
// TODO: Hardcoded includes and fields should be generate dynamically by API resolver instead
searchParams.append("include[anime]", "animethemes.animethemeentries.videos,animethemes.song,images");
searchParams.append(
"include[anime]",
"animethemes.animethemeentries.videos,animethemes.group,animethemes.song,images",
);
searchParams.append("include[animetheme]", "animethemeentries.videos,anime.images,song.artists,group");
searchParams.append("include[artist]", "images,songs");
searchParams.append("include[playlist]", "user");