From 8b93d6f42fe68cb3c3cbd4ec0d94f39705cb1276 Mon Sep 17 00:00:00 2001 From: juluo <142558307+JuLuogo@users.noreply.github.com> Date: Wed, 8 Oct 2025 14:48:45 +0800 Subject: [PATCH] Initial commit --- .env.sample | 5 + .gitignore | 111 + .npmrc | 1 + .prettierrc.cjs | 12 + .vscode/settings.json | 5 + .vscode/vue.code-snippets | 19 + CHANGELOG.md | 445 + CNAME | 1 + DEV_NOTES/followUser.http | 11 + DEV_NOTES/notification.http | 43 + DEV_NOTES/searchSuggestion.http | 9874 +++++++++++++++++ LICENSE | 201 + README.md | 66 + api/http.ts | 43 + api/image.ts | 82 + api/random.ts | 50 + api/user.ts | 137 + api/utils.ts | 186 + index.html | 45 + package.json | 68 + pnpm-lock.yaml | 5185 +++++++++ public/favicon.ico | Bin 0 -> 4286 bytes public/images/spinner.svg | 295 + public/robots.txt | 10 + renovate.json | 64 + script/getStampList.js | 24 + src/App.vue | 63 + src/assets/LogoH.png | Bin 0 -> 6876 bytes src/assets/LogoV.png | Bin 0 -> 7018 bytes src/assets/logo.png | Bin 0 -> 6849 bytes src/assets/pixiv-rabbit.svg | 1 + src/assets/placeholder.svg | 31 + src/auto-imports.d.ts | 347 + src/components.d.ts | 46 + src/components/ArtTag.vue | 18 + src/components/ArtworksList/ArtworkCard.vue | 268 + .../ArtworksList/ArtworkLargeCard.vue | 204 + .../ArtworksList/ArtworkLargeList.vue | 86 + src/components/ArtworksList/ArtworkList.vue | 66 + .../ArtworksList/ArtworksByUser.vue | 107 + src/components/AuthorCard.vue | 89 + src/components/Card.vue | 18 + src/components/Comment/Comment.vue | 80 + src/components/Comment/CommentSubmit.vue | 82 + src/components/Comment/CommentsArea.vue | 92 + src/components/Comment/stampList.json | 40 + src/components/ErrorPage.vue | 127 + src/components/ExternalLink.vue | 18 + src/components/FollowUserCard.vue | 101 + src/components/Gallery.vue | 102 + src/components/LazyLoad.vue | 56 + src/components/NProgress.vue | 32 + src/components/NaiveuiProvider.vue | 33 + src/components/Placeholder.vue | 44 + src/components/SearchBox.vue | 78 + src/components/ShowMore.vue | 42 + src/components/SideNav/ListLink.vue | 44 + src/components/SideNav/SideNav.vue | 177 + src/components/SiteFooter.vue | 101 + src/components/SiteHeader.vue | 275 + src/components/SiteNoticeBanner.vue | 49 + src/components/UgoiraViewer.vue | 319 + src/components/userData.ts | 81 + src/composables/states.ts | 44 + src/config.ts | 23 + src/env.d.ts | 7 + src/locales/zh-Hans.json | 3 + src/main.ts | 14 + src/plugins/i18n.ts | 30 + src/plugins/index.ts | 26 + src/plugins/router.ts | 116 + src/styles/animate.sass | 39 + src/styles/elements.sass | 141 + src/styles/formats.sass | 70 + src/styles/index.sass | 49 + src/styles/variables.sass | 25 + src/types/Artworks.ts | 210 + src/types/Comment.ts | 18 + src/types/Users.ts | 119 + src/types/index.ts | 3 + src/utils/UgoiraPlayer.ts | 610 + src/utils/ZipDownloader.ts | 1002 ++ src/utils/ajax.ts | 41 + src/utils/artworkActions.ts | 35 + src/utils/index.ts | 34 + src/utils/setTitle.ts | 8 + src/utils/userActions.ts | 28 + src/view/404.vue | 14 + src/view/_debug/zip.vue | 203 + src/view/about.vue | 83 + src/view/artworks.vue | 462 + src/view/discovery.vue | 212 + src/view/following-latest.vue | 58 + src/view/following.vue | 168 + src/view/index.vue | 228 + src/view/login.vue | 158 + src/view/notifications/2024-04-26.vue | 39 + src/view/ranking.vue | 99 + src/view/search.vue | 131 + src/view/siteCache.ts | 10 + src/view/users.vue | 518 + test/illustRecommend.json | 1799 +++ test/userBookmarks.json | 321 + tsconfig.app.json | 25 + tsconfig.json | 11 + tsconfig.node.json | 15 + vercel.json | 19 + vite.config.ts | 50 + 108 files changed, 27618 insertions(+) create mode 100644 .env.sample create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 .prettierrc.cjs create mode 100644 .vscode/settings.json create mode 100644 .vscode/vue.code-snippets create mode 100644 CHANGELOG.md create mode 100644 CNAME create mode 100644 DEV_NOTES/followUser.http create mode 100644 DEV_NOTES/notification.http create mode 100644 DEV_NOTES/searchSuggestion.http create mode 100644 LICENSE create mode 100644 README.md create mode 100644 api/http.ts create mode 100644 api/image.ts create mode 100644 api/random.ts create mode 100644 api/user.ts create mode 100644 api/utils.ts create mode 100644 index.html create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 public/favicon.ico create mode 100644 public/images/spinner.svg create mode 100644 public/robots.txt create mode 100644 renovate.json create mode 100644 script/getStampList.js create mode 100644 src/App.vue create mode 100644 src/assets/LogoH.png create mode 100644 src/assets/LogoV.png create mode 100644 src/assets/logo.png create mode 100644 src/assets/pixiv-rabbit.svg create mode 100644 src/assets/placeholder.svg create mode 100644 src/auto-imports.d.ts create mode 100644 src/components.d.ts create mode 100644 src/components/ArtTag.vue create mode 100644 src/components/ArtworksList/ArtworkCard.vue create mode 100644 src/components/ArtworksList/ArtworkLargeCard.vue create mode 100644 src/components/ArtworksList/ArtworkLargeList.vue create mode 100644 src/components/ArtworksList/ArtworkList.vue create mode 100644 src/components/ArtworksList/ArtworksByUser.vue create mode 100644 src/components/AuthorCard.vue create mode 100644 src/components/Card.vue create mode 100644 src/components/Comment/Comment.vue create mode 100644 src/components/Comment/CommentSubmit.vue create mode 100644 src/components/Comment/CommentsArea.vue create mode 100644 src/components/Comment/stampList.json create mode 100644 src/components/ErrorPage.vue create mode 100644 src/components/ExternalLink.vue create mode 100644 src/components/FollowUserCard.vue create mode 100644 src/components/Gallery.vue create mode 100644 src/components/LazyLoad.vue create mode 100644 src/components/NProgress.vue create mode 100644 src/components/NaiveuiProvider.vue create mode 100644 src/components/Placeholder.vue create mode 100644 src/components/SearchBox.vue create mode 100644 src/components/ShowMore.vue create mode 100644 src/components/SideNav/ListLink.vue create mode 100644 src/components/SideNav/SideNav.vue create mode 100644 src/components/SiteFooter.vue create mode 100644 src/components/SiteHeader.vue create mode 100644 src/components/SiteNoticeBanner.vue create mode 100644 src/components/UgoiraViewer.vue create mode 100644 src/components/userData.ts create mode 100644 src/composables/states.ts create mode 100644 src/config.ts create mode 100644 src/env.d.ts create mode 100644 src/locales/zh-Hans.json create mode 100644 src/main.ts create mode 100644 src/plugins/i18n.ts create mode 100644 src/plugins/index.ts create mode 100644 src/plugins/router.ts create mode 100644 src/styles/animate.sass create mode 100644 src/styles/elements.sass create mode 100644 src/styles/formats.sass create mode 100644 src/styles/index.sass create mode 100644 src/styles/variables.sass create mode 100644 src/types/Artworks.ts create mode 100644 src/types/Comment.ts create mode 100644 src/types/Users.ts create mode 100644 src/types/index.ts create mode 100644 src/utils/UgoiraPlayer.ts create mode 100644 src/utils/ZipDownloader.ts create mode 100644 src/utils/ajax.ts create mode 100644 src/utils/artworkActions.ts create mode 100644 src/utils/index.ts create mode 100644 src/utils/setTitle.ts create mode 100644 src/utils/userActions.ts create mode 100644 src/view/404.vue create mode 100644 src/view/_debug/zip.vue create mode 100644 src/view/about.vue create mode 100644 src/view/artworks.vue create mode 100644 src/view/discovery.vue create mode 100644 src/view/following-latest.vue create mode 100644 src/view/following.vue create mode 100644 src/view/index.vue create mode 100644 src/view/login.vue create mode 100644 src/view/notifications/2024-04-26.vue create mode 100644 src/view/ranking.vue create mode 100644 src/view/search.vue create mode 100644 src/view/siteCache.ts create mode 100644 src/view/users.vue create mode 100644 test/illustRecommend.json create mode 100644 test/userBookmarks.json create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vercel.json create mode 100644 vite.config.ts diff --git a/.env.sample b/.env.sample new file mode 100644 index 0000000..a51af8a --- /dev/null +++ b/.env.sample @@ -0,0 +1,5 @@ +VITE_ADSENSE_PUB_ID = +VITE_GOOGLE_ANALYTICS_ID = +VITE_GOOGLE_SEARCH_CONSOLE_VERIFICATION = +VITE_PXIMG_BASEURL_I = /-/ +VITE_PXIMG_BASEURL_S = /~/ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ab3bd2e --- /dev/null +++ b/.gitignore @@ -0,0 +1,111 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +.vercel + +dev-test +*.dev.* +.vercel +.vs diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..9a0c951 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +registry = https://registry.npmmirror.com diff --git a/.prettierrc.cjs b/.prettierrc.cjs new file mode 100644 index 0000000..df2b2e9 --- /dev/null +++ b/.prettierrc.cjs @@ -0,0 +1,12 @@ +module.exports = { + trailingComma: 'es5', + tabWidth: 2, + semi: false, + singleQuote: true, + arrowParens: 'always', + quoteProps: 'as-needed', + plugins: [require.resolve('@prettier/plugin-pug')], + pugAttributeSeparator: 'as-needed', + pugSortAttributes: 'asc', + vueIndentScriptAndStyle: false, +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..4e71344 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "i18n-ally.localesPaths": [ + "src/locales" + ] +} \ No newline at end of file diff --git a/.vscode/vue.code-snippets b/.vscode/vue.code-snippets new file mode 100644 index 0000000..abd1049 --- /dev/null +++ b/.vscode/vue.code-snippets @@ -0,0 +1,19 @@ +{ + "Init vue components": { + "scope": "vue", + "prefix": "vue", + "body": [ + "", + "$0", + "", + "", + "", + "", + "" + ], + "description": "Init vue components" + } +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..d828bc1 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,445 @@ +## [2.2.1](https://github.com/GratisNow/PixivNow/compare/2.2.0...2.2.1) (2021-07-11) + + + + +# [2.2.0](https://github.com/GratisNow/PixivNow/compare/2.1.1...2.2.0) (2021-07-11) + + +### chore + +* bump version (bump version: 2.2.0)([92a203d](https://github.com/GratisNow/PixivNow/commit/92a203d6affe0c0605c5b947551b3075b9c6bd82)) + + +### fix + +* ranking(api/view)([c86d783](https://github.com/GratisNow/PixivNow/commit/c86d783e2581a172d54309ea5bf96d6ca83cb227)) +* typo([32ff15b](https://github.com/GratisNow/PixivNow/commit/32ff15b911f9b39eef2b26bd3b1954c000560502)) +* typo (#7)([155b04c](https://github.com/GratisNow/PixivNow/commit/155b04c642eb222bba8a1e8f4ef2d2eec93ed2ce)), closes [#7](https://bugs.jquery.com/ticket/7) + + +### update + +* update ranking([d5bbc2d](https://github.com/GratisNow/PixivNow/commit/d5bbc2dd8c55d33f6f9d6c597705ef81ac26a489)) +* view.about([12a72a3](https://github.com/GratisNow/PixivNow/commit/12a72a33f875fc320911eafd36c0b8ae8825f3c8)) + + + + +## [2.1.1](https://github.com/GratisNow/PixivNow/compare/2.0.8...2.1.1) (2021-07-08) + + +### chore + +* bump version (bump 2.1.0)([c4708f5](https://github.com/GratisNow/PixivNow/commit/c4708f589b53d3cd4fcd8d7871636e663e705f19)) +* bump version (bump version: 2.1.1)([5da008c](https://github.com/GratisNow/PixivNow/commit/5da008c03af479c9305abb2b9d5b5d1cfc6f77f6)) + + +### update + +* +ranking, +userLogin (#3)([27fdc6f](https://github.com/GratisNow/PixivNow/commit/27fdc6fa84a3a66e147a63ced2c90ced95f47dae)), closes [#3](https://bugs.jquery.com/ticket/3) +* +view.login, +restrict tag (#4)([affde4b](https://github.com/GratisNow/PixivNow/commit/affde4b76bcf6d83d10b2e7eb90943bfe662900e)), closes [#4](https://bugs.jquery.com/ticket/4) + + + + +## [2.0.8](https://github.com/GratisNow/PixivNow/compare/2.0.7...2.0.8) (2021-06-25) + + +### chore + +* bump version (bump version: 2.0.8)([a8c4cb8](https://github.com/GratisNow/PixivNow/commit/a8c4cb8f1a18b0ed02fd8fb7587da3b33cc67804)) +* rename org([1863ac1](https://github.com/GratisNow/PixivNow/commit/1863ac10e32a2128997786e3cf779919348fbedb)) + + + + +## [2.0.7](https://github.com/GratisNow/PixivNow/compare/2.0.6...2.0.7) (2021-06-22) + + +### chore + +* minor fix (bump version: 2.0.7)([b06cd96](https://github.com/GratisNow/PixivNow/commit/b06cd96ecffb198178687f8922b0453f00d03eb5)) + + + + +## [2.0.6](https://github.com/GratisNow/PixivNow/compare/2.0.4...2.0.6) (2021-06-22) + + +### chore + +* + redirects, + declare *.vue, - workflow (bump version: 2.0.6)([9f6dd20](https://github.com/GratisNow/PixivNow/commit/9f6dd20a59ea9e78a0ea7754a1fc7065af286e2c)) +* disable workflow([a42ec86](https://github.com/GratisNow/PixivNow/commit/a42ec86026b64c929886d1b826b45856469e1bd1)) +* enable workflow([45a5ef0](https://github.com/GratisNow/PixivNow/commit/45a5ef03a95afbff0015c731a16d66e3dda98cbe)) +* minor fix([0a1f31d](https://github.com/GratisNow/PixivNow/commit/0a1f31d6a5e55f89f458a828ff731a3fbd5b0809)) +* minor fix([34f2b6f](https://github.com/GratisNow/PixivNow/commit/34f2b6fec2690c1b89229de80e7903469001392b)) +* test auto deploy([7961719](https://github.com/GratisNow/PixivNow/commit/79617195c137076e3636209d0a0c5c30746586f5)) +* update github links (#2)([bf60468](https://github.com/GratisNow/PixivNow/commit/bf60468dfb085d17fcd42ed988ae244a6a6c2d2a)), closes [#2](https://bugs.jquery.com/ticket/2) + + + + +## [2.0.4](https://github.com/GratisNow/PixivNow/compare/2.0.3...2.0.4) (2021-06-21) + + +### chore + +* minor fix (bump version: 2.0.4)([5c1074d](https://github.com/GratisNow/PixivNow/commit/5c1074d9caea2b05ba4fac6b172234d1269e995f)) + + + + +## [2.0.3](https://github.com/GratisNow/PixivNow/compare/2.0.2...2.0.3) (2021-06-15) + + +### chore + +* bump version (bump version: 2.0.3)([1ed5303](https://github.com/GratisNow/PixivNow/commit/1ed53031383bf9b6c28e1cbeecd4ab9ea6c7ee99)) + + + + +## [2.0.2](https://github.com/GratisNow/PixivNow/compare/2.0.1...2.0.2) (2021-06-15) + + +### chore + +* bump version (bump version: 2.0.2)([4a63cb0](https://github.com/GratisNow/PixivNow/commit/4a63cb03ae4607cf6de1d17e833db263356005d4)) + + +### feat + +* + fontawesome, + image progress([7357714](https://github.com/GratisNow/PixivNow/commit/735771468c56f077d3f327d6207c7e760842e247)) +* + icons([25e591c](https://github.com/GratisNow/PixivNow/commit/25e591c603f424a2aa2d7df750cf45315a92d995)) + + + + +## [2.0.1](https://github.com/GratisNow/PixivNow/compare/2.0.0...2.0.1) (2021-06-13) + + +### feat + +* + NProgress (bump version: 2.0.1)([04df6fd](https://github.com/GratisNow/PixivNow/commit/04df6fde97e13ba46e081bbd02417185b45c6899)) + + + + +# [2.0.0](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.17...2.0.0) (2021-06-13) + + +### update + +* release 2.0 (bump version: 2.0.0)([7e92fb7](https://github.com/GratisNow/PixivNow/commit/7e92fb7794ede97e7fe5968c7892358d7af8019d)) + + + + +# [2.0.0-alpha.17](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.16...2.0.0-alpha.17) (2021-06-13) + + +### update + +* header (bump version: 2.0.0-alpha.17)([69a0d59](https://github.com/GratisNow/PixivNow/commit/69a0d590c0efbb4e59452439f1222c2515485be7)) + + + + +# [2.0.0-alpha.16](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.15...2.0.0-alpha.16) (2021-06-13) + + +### hotfix + +* user.background is undefined (bump version: 2.0.0-alpha.16)([382baa5](https://github.com/GratisNow/PixivNow/commit/382baa505724d447d3e8f089840a940846d40517)) + + + + +# [2.0.0-alpha.15](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.14...2.0.0-alpha.15) (2021-06-13) + + +### update + +* users (bump version: 2.0.0-alpha.15)([13dbdbe](https://github.com/GratisNow/PixivNow/commit/13dbdbe8aec840d61ae79c6db4528efc8dc6dfb7)) + + + + +# [2.0.0-alpha.14](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.13...2.0.0-alpha.14) (2021-06-13) + + +### chore + +* bump version (bump version: 2.0.0-alpha.14)([608f79c](https://github.com/GratisNow/PixivNow/commit/608f79c82cc0341152a3a06587b812c676a3ba7c)) + + + + +# [2.0.0-alpha.13](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.12...2.0.0-alpha.13) (2021-06-13) + + +### hotfix + +* styles, api (bump version: 2.0.0-alpha.13)([03257fc](https://github.com/GratisNow/PixivNow/commit/03257fc4b0cc4f52b982992156a955edbfd0123e)) + + + + +# [2.0.0-alpha.12](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.11...2.0.0-alpha.12) (2021-06-13) + + +### hotfix + +* link style, imgProxy (bump version: 2.0.0-alpha.12)([5f286c2](https://github.com/GratisNow/PixivNow/commit/5f286c29ca10f623f6cd9372636a5eb7c6bd315c)) + + + + +# [2.0.0-alpha.11](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.10...2.0.0-alpha.11) (2021-06-13) + + +### chore + +* minor fix (bump version: 2.0.0-alpha.11)([572a373](https://github.com/GratisNow/PixivNow/commit/572a37392c3c19d71a676d3bef0f16d40a4365d1)) + + + + +# [2.0.0-alpha.10](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.9...2.0.0-alpha.10) (2021-06-13) + + +### fix + +* artwork.index styles (bump version: 2.0.0-alpha.10)([62b6c05](https://github.com/GratisNow/PixivNow/commit/62b6c05fae34a014678827ac14cc1c9a2c380aa9)) + + + + +# [2.0.0-alpha.9](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.8...2.0.0-alpha.9) (2021-06-13) + + +### chore + +* bump version (bump version: 2.0.0-alpha.9)([3b1f57e](https://github.com/GratisNow/PixivNow/commit/3b1f57ead4c783d4dc32d6cf14b7444ffb2b14aa)) + + + + +# [2.0.0-alpha.8](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.7...2.0.0-alpha.8) (2021-06-13) + + +### update + +* update styles, + seaech pagenator (bump version: 2.0.0-alpha.8)([4773dfa](https://github.com/GratisNow/PixivNow/commit/4773dfac136831daab28201ed68e06bc7a00a755)) + + + + +# [2.0.0-alpha.7](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.6...2.0.0-alpha.7) (2021-06-12) + + +### chore + +* update package.json([09f09b9](https://github.com/GratisNow/PixivNow/commit/09f09b9853e9d6dd67b41936bd765fc68a864355)) + + +### feat + +* + search, update gallery, using sass & pug (bump version: 2.0.0-alpha.7)([1386064](https://github.com/GratisNow/PixivNow/commit/13860647a417dcc00990cdd4d04d5038c8d549f5)) + + + + +# [2.0.0-alpha.6](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.5...2.0.0-alpha.6) (2021-06-10) + + +### chore + +* split modules (bump version: 2.0.0-alpha.6)([d8e6ae6](https://github.com/GratisNow/PixivNow/commit/d8e6ae61be49e0571cf70f9a025a693798463e2f)) + + + + +# [2.0.0-alpha.5](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.4...2.0.0-alpha.5) (2021-06-10) + + +### chore + +* update styles (bump version: 2.0.0-alpha.5)([9db7b11](https://github.com/GratisNow/PixivNow/commit/9db7b118592d1235e246db0e4acec6eaad729664)) + + + + +# [2.0.0-alpha.4](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.3...2.0.0-alpha.4) (2021-06-10) + + +### chore + +* bump version (bump version: 2.0.0-alpha.4)([4a87c2e](https://github.com/GratisNow/PixivNow/commit/4a87c2e65834cf5c59b99cffc8460185ab3a2a27)) + + + + +# [2.0.0-alpha.3](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.2...2.0.0-alpha.3) (2021-06-09) + + +### chore + +* minor fix (bump version: 2.0.0-alpha.3)([3e5aa50](https://github.com/GratisNow/PixivNow/commit/3e5aa501e7daaca3851427d7d8a150bc484908cf)) + + + + +# [2.0.0-alpha.2](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.1...2.0.0-alpha.2) (2021-06-09) + + +### chore + +* minor fix (bump version: 2.0.0-alpha.2)([96bd745](https://github.com/GratisNow/PixivNow/commit/96bd745f37f5cc1a1b42cac4830199f2ca91728f)) + + + + +# [2.0.0-alpha.1](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.0...2.0.0-alpha.1) (2021-06-09) + + +### chore + +* bump version (bump version: 2.0.0-alpha.1)([5dff17a](https://github.com/GratisNow/PixivNow/commit/5dff17ad9fc49587139c9b7e19904735462f87a1)) + + + + +# [2.0.0-alpha.0](https://github.com/GratisNow/PixivNow/compare/1.1.4...2.0.0-alpha.0) (2021-06-09) + + + + +## [1.1.4](https://github.com/GratisNow/PixivNow/compare/1.1.3...1.1.4) (2021-06-09) + + +### chore + +* bump version (bump version: 1.1.4)([7337437](https://github.com/GratisNow/PixivNow/commit/73374374d5552e212eb0125048ce8ce047f75b7e)) +* update README([0782b81](https://github.com/GratisNow/PixivNow/commit/0782b81a02d5ceea1abd330832708864691caba4)) + + +### fix + +* Access-Control-Allow-Origin([12b3163](https://github.com/GratisNow/PixivNow/commit/12b3163abb0eba54274eccc63bb15b92007286a4)) + + + + +## [1.1.3](https://github.com/GratisNow/PixivNow/compare/1.1.2...1.1.3) (2021-06-06) + + +### chore + +* bump version (bump version: 1.1.3)([87d9878](https://github.com/GratisNow/PixivNow/commit/87d98783a96e4452e0266e3fd7f125800b7a9efc)) + + + + +## [1.1.2](https://github.com/GratisNow/PixivNow/compare/1.1.1...1.1.2) (2021-06-06) + + +### chore + +* bump version (bump version: 1.1.2)([43b543f](https://github.com/GratisNow/PixivNow/commit/43b543f1f2d9ee2cda0524cec721204f2c6085c5)) + + + + +## [1.1.1](https://github.com/GratisNow/PixivNow/compare/1.1.0...1.1.1) (2021-06-06) + + +### chore + +* bump version (bump version: 1.1.1)([3cdf2a4](https://github.com/GratisNow/PixivNow/commit/3cdf2a4bd4f59c719dafded838005012b992d979)) + + + + +# [1.1.0](https://github.com/GratisNow/PixivNow/compare/1.0.6...1.1.0) (2021-06-06) + + +### chore + +* rewrite (bump version: 1.1.0)([8d10a09](https://github.com/GratisNow/PixivNow/commit/8d10a09190acc7fb51a873b2822badbd35a09fb8)) + + + + +## [1.0.6](https://github.com/GratisNow/PixivNow/compare/1.0.5...1.0.6) (2021-06-06) + + +### chore + +* minor fix (bump version: 1.0.6)([52953fe](https://github.com/GratisNow/PixivNow/commit/52953fe96e1e321390a10eaed87ec20f44c40bf6)) + + + + +## [1.0.5](https://github.com/GratisNow/PixivNow/compare/1.0.4...1.0.5) (2021-06-06) + + +### chore + +* bump version (bump version: 1.0.5)([c214151](https://github.com/GratisNow/PixivNow/commit/c214151cd369ee0549baea6f60d067873e253305)) +* minor fix([477b64b](https://github.com/GratisNow/PixivNow/commit/477b64bcf2a0f93d148b3e1d898ae34eba7e0b0d)) + + + + +## [1.0.4](https://github.com/GratisNow/PixivNow/compare/1.0.3...1.0.4) (2021-06-05) + + +### chore + +* update README (bump version: 1.0.4)([3257778](https://github.com/GratisNow/PixivNow/commit/3257778cf82cb0c8e6f66d5b207ef41a952b9b97)) + + + + +## [1.0.3](https://github.com/GratisNow/PixivNow/compare/1.0.2...1.0.3) (2021-06-05) + + +### update + +* + ajax, + user (bump version: 1.0.3)([e04d2b5](https://github.com/GratisNow/PixivNow/commit/e04d2b5294f7ba1c7ab138aea80adbf72c34fdb3)) + + + + +## [1.0.2](https://github.com/GratisNow/PixivNow/compare/1.0.1...1.0.2) (2021-06-05) + + +### update + +* + byUID, + byTagName (bump version: 1.0.2)([5c20b42](https://github.com/GratisNow/PixivNow/commit/5c20b4270b89d2b4c7ce896b5fec260536c8d88a)) + + + + +## [1.0.1](https://github.com/GratisNow/PixivNow/compare/b81baf2bf5d89b0f7f6d0cc0119761a00a5f0c0b...1.0.1) (2021-06-05) + + +### chore + +* bump version (bump version: 1.0.1)([fcc7704](https://github.com/GratisNow/PixivNow/commit/fcc7704f11c555b6ceeb27edb30bb0155c5d017f)) +* commit([b81baf2](https://github.com/GratisNow/PixivNow/commit/b81baf2bf5d89b0f7f6d0cc0119761a00a5f0c0b)) +* imgProxy([be1d495](https://github.com/GratisNow/PixivNow/commit/be1d495b7b6f4c63c66f942d9ab5e5794e58f534)) +* minor fix([2bfc8ca](https://github.com/GratisNow/PixivNow/commit/2bfc8ca5133d46c8ff9cafffb8081c79eb93056d)) +* minor fix([9179bbf](https://github.com/GratisNow/PixivNow/commit/9179bbf7ff7032b2d87479198bd900eacb1bb682)) +* minor fix([68e3b4a](https://github.com/GratisNow/PixivNow/commit/68e3b4ace98f67c4ef640e84787f7dad6b447fcc)) +* minor fix([6bd5ef9](https://github.com/GratisNow/PixivNow/commit/6bd5ef9025144b3fe4aae4542276d621582553f5)) +* minor fix([04ba185](https://github.com/GratisNow/PixivNow/commit/04ba185c0151e8b49e6aac826ec1d8315cdddad0)) +* minor fix([a0e5bed](https://github.com/GratisNow/PixivNow/commit/a0e5bed8aba97fe98045063c942efbafb649c827)) +* minor fix([3b100cc](https://github.com/GratisNow/PixivNow/commit/3b100cc8d54cad0c20de2929af17baad396088b4)) +* test proxy([7144d94](https://github.com/GratisNow/PixivNow/commit/7144d941260cb993db7437fc96b8868670d61cc8)) + + + + diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..97f9555 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +pixiv.js.org diff --git a/DEV_NOTES/followUser.http b/DEV_NOTES/followUser.http new file mode 100644 index 0000000..c2732a7 --- /dev/null +++ b/DEV_NOTES/followUser.http @@ -0,0 +1,11 @@ +POST https://www.pixiv.net/bookmark_add.php +content-type: application/x-www-form-urlencoded + +{ + "mode": "add", + "type": "user", + "user_id": "15552366", + "tag": "", + "restrict": "0", + "format": "json" +} \ No newline at end of file diff --git a/DEV_NOTES/notification.http b/DEV_NOTES/notification.http new file mode 100644 index 0000000..f2c11af --- /dev/null +++ b/DEV_NOTES/notification.http @@ -0,0 +1,43 @@ +GET https://www.pixiv.net/ajax/notification + +[HTTP/1.1 200 OK] +application/json +{ + "error": false, + "message": "", + "body": { + "items": [ + { + "id": 698556583, + "type": "bookmarked", + "unread": true, + "notifiedAt": "2021-07-17T12:22:25+09:00", + "linkUrl": "/bookmark_detail.php?illust_id=86468782", + "iconUrl": "https://i.pximg.net/c/128x128/img-master/img/2020/12/23/05/25/48/86468782_p0_square1200.jpg", + "targetBlank": false, + "isProfileIcon": false, + "content": "2以上的用户把你的作品加入收藏了: \"[草图] 原创角色 Kunika\"" + } + ], + "remaining_unread_count": 0, + "imageResponseCount": 0, + "quotationCount": 0, + "isNotAuthorized": false, + "filter": { + "reactions": [ + "bookmarked", + "nice", + "commented", + "tagged", + "content_response", + "favorited", + "group_content_reference", + "group_like", + "group_comment", + "received_stacc_message", + "series_watchlist_watched" + ] + } + } +} + diff --git a/DEV_NOTES/searchSuggestion.http b/DEV_NOTES/searchSuggestion.http new file mode 100644 index 0000000..1e3093b --- /dev/null +++ b/DEV_NOTES/searchSuggestion.http @@ -0,0 +1,9874 @@ +GET https://www.pixiv.net/ajax/search/suggestion?mode=all + +[HTTP/1.1 200 OK] +application/json +{ + "error": false, + "body": { + "popularTags": { + "illust": [ + { + "tag": "fanart", + "ids": [ + 87387148, + 89843345, + 87162139 + ] + }, + { + "tag": "Fate/GrandOrder", + "ids": [ + 57808612, + 59665299, + 82432085 + ] + }, + { + "tag": "FGO", + "ids": [ + 57808612, + 61169484, + 68126965 + ] + }, + { + "tag": "GenshinImpact", + "ids": [ + 80567870, + 86425919, + 86464433 + ] + }, + { + "tag": "girl", + "ids": [ + 75748320, + 83199735, + 87162139 + ] + }, + { + "tag": "illustration", + "ids": [ + 63150612, + 67329067, + 68670776 + ] + }, + { + "tag": "MiraculousLadybug", + "ids": [ + 57746661, + 76208126, + 53366642 + ] + }, + { + "tag": "moon", + "ids": [ + 76220766, + 74955694, + 74723171 + ] + }, + { + "tag": "MOTHER", + "ids": [ + 41686664, + 56436164, + 11765689 + ] + }, + { + "tag": "NEWGAME!", + "ids": [ + 58122126, + 64433132, + 57681432 + ] + }, + { + "tag": "NieR", + "ids": [ + 61784598, + 61599251, + 62039907 + ] + }, + { + "tag": "NIJISANJI_EN", + "ids": [ + 90390199 + ] + }, + { + "tag": "original", + "ids": [ + 69463109, + 33414104, + 69139520 + ] + }, + { + "tag": "PetraArt", + "ids": [ + 91411248 + ] + }, + { + "tag": "petragurin", + "ids": [ + 91411248 + ] + }, + { + "tag": "pregnant", + "ids": [ + 89338355, + 83468525, + 83295372 + ] + }, + { + "tag": "roselia", + "ids": [ + 70833260 + ] + }, + { + "tag": "scifi", + "ids": [ + 78311723, + 53034161, + 77079433 + ] + }, + { + "tag": "SK∞", + "ids": [ + 87944694, + 87615344, + 87840158 + ] + }, + { + "tag": "sona", + "ids": [ + 72655663 + ] + }, + { + "tag": "sword", + "ids": [ + 85617306, + 78679716, + 41086111 + ] + }, + { + "tag": "tits", + "ids": [ + 83432825, + 70823889, + 73213860 + ] + }, + { + "tag": "Touhou_Project", + "ids": [ + 56551573, + 84222181, + 90521833 + ] + }, + { + "tag": "Traditionalart", + "ids": [ + 73483984 + ] + }, + { + "tag": "transformers", + "ids": [ + 26064013, + 50067770, + 45571240 + ] + }, + { + "tag": "transfur", + "ids": [ + 57936213, + 81973222, + 53601510 + ] + }, + { + "tag": "VTuber", + "ids": [ + 73518990, + 83603397, + 83442129 + ] + }, + { + "tag": "ww2", + "ids": [ + 73593539 + ] + }, + { + "tag": "あつ森", + "ids": [ + 82266993, + 81593683, + 82753312 + ] + }, + { + "tag": "おっぱい", + "ids": [ + 67407348, + 68126965, + 60865838 + ] + }, + { + "tag": "ころん", + "ids": [ + 71431430, + 67271336, + 77385145 + ] + }, + { + "tag": "しゅがーはぁと", + "ids": [ + 87045706 + ] + }, + { + "tag": "にじさんじ", + "ids": [ + 85779247, + 79024638, + 84419825 + ] + }, + { + "tag": "アナログ", + "ids": [ + 70582093, + 77491275, + 13754871 + ] + }, + { + "tag": "イラスト", + "ids": [ + 80431317, + 57877623, + 74650454 + ] + }, + { + "tag": "ウマ娘", + "ids": [ + 89657320, + 90263277, + 89694199 + ] + }, + { + "tag": "ウマ娘プリティーダービー", + "ids": [ + 89197783, + 89682656, + 88742579 + ] + }, + { + "tag": "オリキャラ", + "ids": [ + 62800098, + 61444625, + 65894188 + ] + }, + { + "tag": "バーチャルYouTuber", + "ids": [ + 73518990, + 84116049, + 85423310 + ] + }, + { + "tag": "ホロライブ", + "ids": [ + 73518990, + 70352399, + 82618568 + ] + }, + { + "tag": "ポケモン", + "ids": [ + 41805526, + 17104931, + 14231474 + ] + }, + { + "tag": "刀剣乱舞", + "ids": [ + 57800451, + 50379267, + 48559220 + ] + }, + { + "tag": "創作", + "ids": [ + 67260707, + 74481708, + 74478908 + ] + }, + { + "tag": "原神", + "ids": [ + 84602943, + 85085701, + 85633671 + ] + }, + { + "tag": "女の子", + "ids": [ + 63120410, + 54618347, + 62406788 + ] + }, + { + "tag": "少女", + "ids": [ + 63304069, + 69297688, + 59612057 + ] + }, + { + "tag": "東方Project", + "ids": [ + 57534432, + 17184292, + 62512328 + ] + }, + { + "tag": "水着", + "ids": [ + 67507815, + 82432085, + 65913057 + ] + }, + { + "tag": "男の子", + "ids": [ + 39316587, + 79372430, + 73838405 + ] + }, + { + "tag": "神宮寺寂雷", + "ids": [ + 72032423, + 72987019, + 70480279 + ] + }, + { + "tag": "背景素材", + "ids": [ + 76419627, + 39379535, + 60800103 + ] + }, + { + "tag": "鬼白", + "ids": [ + 43436652, + 51846917, + 48286222 + ] + }, + { + "tag": "던파", + "ids": [ + 77844238, + 81890250, + 67979905 + ] + } + ], + "novel": [ + { + "tag": "夢術廻戦", + "ids": [ + "85625860" + ] + }, + { + "tag": "東京【腐】リベンジャーズ", + "ids": [ + "90985115" + ] + }, + { + "tag": "腐術廻戦", + "ids": [ + "85850572" + ] + }, + { + "tag": "夢小説", + "ids": [ + "85951712" + ] + }, + { + "tag": "五悠", + "ids": [ + "85547905" + ] + }, + { + "tag": "ウマ娘プリティーダービー", + "ids": [ + "89197783" + ] + }, + { + "tag": "ウマ娘", + "ids": [ + "89657320" + ] + }, + { + "tag": "佐野万次郎", + "ids": [ + "89844674" + ] + }, + { + "tag": "クロスオーバー", + "ids": [ + "63457814" + ] + }, + { + "tag": "夏油傑", + "ids": [ + "86655276" + ] + }, + { + "tag": "五条悟", + "ids": [ + "85842343" + ] + }, + { + "tag": "女体化", + "ids": [ + "81798260" + ] + }, + { + "tag": "腐向け", + "ids": [ + "71152750" + ] + }, + { + "tag": "マイキー", + "ids": [ + "90602994" + ] + }, + { + "tag": "twst夢", + "ids": [ + "82082820" + ] + }, + { + "tag": "本好きの下剋上", + "ids": [ + "78709507" + ] + }, + { + "tag": "東京卍リベンジャーズ", + "ids": [ + "89322687" + ] + }, + { + "tag": "オリ主", + "ids": [ + "66204889" + ] + }, + { + "tag": "女主人公", + "ids": [ + "80630584" + ] + }, + { + "tag": "続きを全裸待機", + "ids": [ + "83242494" + ] + }, + { + "tag": "女監督生", + "ids": [ + "81850096" + ] + }, + { + "tag": "現パロ", + "ids": [ + "72727118" + ] + }, + { + "tag": "やはり俺の青春ラブコメはまちがっている。", + "ids": [ + "49831005" + ] + }, + { + "tag": "魔道祖師", + "ids": [ + "79167696" + ] + }, + { + "tag": "比企谷八幡", + "ids": [ + "80873983" + ] + }, + { + "tag": "場地圭介", + "ids": [ + "90828399" + ] + }, + { + "tag": "東京リベンジャーズ", + "ids": [ + "89602868" + ] + }, + { + "tag": "虎杖悠仁", + "ids": [ + "87630784" + ] + }, + { + "tag": "待ってました!", + "ids": [ + "36022374" + ] + }, + { + "tag": "呪術廻戦", + "ids": [ + "78510327" + ] + }, + { + "tag": "五伏", + "ids": [ + "79379089" + ] + }, + { + "tag": "二次創作", + "ids": [ + "79363893" + ] + }, + { + "tag": "ヤンデレ", + "ids": [ + "77673634" + ] + }, + { + "tag": "クトゥルフ神話TRPG", + "ids": [ + "58393816" + ] + }, + { + "tag": "CoCシナリオ", + "ids": [ + "60520282" + ] + }, + { + "tag": "ハリポタ", + "ids": [ + "16658773" + ] + }, + { + "tag": "オリキャラ", + "ids": [ + "62800098" + ] + }, + { + "tag": "キャラ崩壊", + "ids": [ + "31220217" + ] + }, + { + "tag": "松野千冬", + "ids": [ + "85184256" + ] + }, + { + "tag": "煉獄杏寿郎", + "ids": [ + "79429809" + ] + } + ] + }, + "recommendTags": { + "illust": [ + { + "tag": "Klee", + "ids": [ + "85596117" + ] + }, + { + "tag": "loli", + "ids": [ + "83519895" + ] + }, + { + "tag": "七七(原神)", + "ids": [ + "85653642" + ] + }, + { + "tag": "けもみみ", + "ids": [ + "91339695" + ] + }, + { + "tag": "GenshinImpact", + "ids": [ + "86419304" + ] + }, + { + "tag": "qiqi", + "ids": [ + "86907465" + ] + }, + { + "tag": "クレー(原神)", + "ids": [ + "85349943" + ] + }, + { + "tag": "百合", + "ids": [ + "89519018" + ] + }, + { + "tag": "空(原神)", + "ids": [ + "91187479" + ] + }, + { + "tag": "女の子", + "ids": [ + "86465064" + ] + }, + { + "tag": "可愛い", + "ids": [ + "90885211" + ] + }, + { + "tag": "迪奥娜", + "ids": [ + "90690399" + ] + }, + { + "tag": "七七", + "ids": [ + "90370584" + ] + }, + { + "tag": "ロリ", + "ids": [ + "86086558" + ] + }, + { + "tag": "ケモミミ", + "ids": [ + "89694803" + ] + }, + { + "tag": "R-18", + "ids": [ + "71553807" + ] + }, + { + "tag": "猫耳", + "ids": [ + "89900124" + ] + }, + { + "tag": "ディオナ(原神)", + "ids": [ + "90630791" + ] + }, + { + "tag": "原神", + "ids": [ + "84818149" + ] + }, + { + "tag": "萝莉", + "ids": [ + "89708888" + ] + }, + { + "tag": "女孩子", + "ids": [ + "85540784" + ] + }, + { + "tag": "ジョジョ立ち", + "ids": [ + "84378134" + ] + }, + { + "tag": "甘雨(原神)", + "ids": [ + "91024154" + ] + }, + { + "tag": "パイモン(原神)", + "ids": [ + "85261529" + ] + } + ] + }, + "recommendByTags": { + "illust": [ + { + "tag": "七七(原神)", + "ids": [ + "91303962", + "85010295", + "85047720", + "85109931", + "87173315", + "85377856", + "85294099", + "85026747" + ], + "details": { + "85010295": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "85026747": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "85047720": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "85109931": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "85294099": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "85377856": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "87173315": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91303962": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + } + } + }, + { + "tag": "甘雨(原神)", + "ids": [ + "91314025", + "91196524", + "91326691", + "90533611", + "91314136", + "91054709", + "91289344", + "90493204" + ], + "details": { + "90493204": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "90533611": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91054709": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91196524": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91289344": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91314025": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91314136": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91326691": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + } + } + }, + { + "tag": "原神", + "ids": [ + "91290724", + "91384160", + "84553956", + "91403730", + "87236094", + "91428641", + "85667426", + "91336876" + ], + "details": { + "84553956": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "85667426": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "87236094": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91290724": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91336876": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91384160": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91403730": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91428641": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + } + } + } + ] + }, + "myFavoriteTags": [ ], + "tagTranslation": { + "Fate/GrandOrder": { + "en": "Fate/Grand Order", + "ko": "", + "zh": "命运-冠位指定", + "zh_tw": "Fate/Grand Order", + "romaji": "" + }, + "FGO": { + "en": "Fate/Grand Order", + "ko": "페그오", + "zh": "", + "zh_tw": "", + "romaji": "" + }, + "girl": { + "en": "", + "ko": "", + "zh": "", + "zh_tw": "女孩", + "romaji": "" + }, + "illustration": { + "en": "", + "ko": "", + "zh": "", + "zh_tw": "插畫", + "romaji": "" + }, + "NieR": { + "en": "", + "ko": "", + "zh": "尼尔", + "zh_tw": "", + "romaji": "" + }, + "original": { + "en": "", + "ko": "", + "zh": "", + "zh_tw": "原創", + "romaji": "" + }, + "SK∞": { + "en": "", + "ko": "SK∞ 에스케이 에이트", + "zh": "", + "zh_tw": "", + "romaji": "esuke-eito" + }, + "VTuber": { + "en": "virtual YouTuber", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "" + }, + "あつ森": { + "en": "Animal Crossing: New Horizons", + "ko": "모동숲", + "zh": "动森", + "zh_tw": "動森", + "romaji": "atsumori" + }, + "おっぱい": { + "en": "breasts", + "ko": "가슴", + "zh": "欧派", + "zh_tw": "歐派", + "romaji": "oppai" + }, + "ころん": { + "en": "Colon", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "koronn" + }, + "しゅがーはぁと": { + "romaji": "shuga-haxato" + }, + "にじさんじ": { + "en": "Nijisanji", + "ko": "", + "zh": "彩虹社", + "zh_tw": "", + "romaji": "nijisannji" + }, + "アナログ": { + "en": "traditional", + "ko": "아날로그", + "zh": "手绘", + "zh_tw": "手繪", + "romaji": "anarogu" + }, + "イラスト": { + "en": "illustration", + "ko": "일러스트", + "zh": "插画", + "zh_tw": "插畫", + "romaji": "irasuto" + }, + "ウマ娘": { + "en": "horse girl", + "ko": "", + "zh": "马娘", + "zh_tw": "馬娘", + "romaji": "umamusume" + }, + "ウマ娘プリティーダービー": { + "en": "Uma Musume Pretty Derby", + "ko": "", + "zh": "赛马娘Pretty Derby", + "zh_tw": "賽馬娘Pretty Derby", + "romaji": "umamusumepurithi-da-bi-" + }, + "オリキャラ": { + "en": "original character", + "ko": "오리캐", + "zh": "原创角色", + "zh_tw": "原創角色", + "romaji": "orikyara" + }, + "バーチャルYouTuber": { + "en": "Virtual Youtuber", + "ko": "버추얼 유튜버", + "zh": "虚拟YouTuber", + "zh_tw": "虛擬YouTuber", + "romaji": "ba-charuyu-chu-ba-" + }, + "ホロライブ": { + "en": "Hololive", + "ko": "", + "zh": "Hololive", + "zh_tw": "", + "romaji": "hororaibu" + }, + "ポケモン": { + "en": "Pokémon", + "ko": "포켓몬", + "zh": "精灵宝可梦", + "zh_tw": "精靈寶可夢", + "romaji": "pokemonn" + }, + "刀剣乱舞": { + "en": "Touken Ranbu", + "ko": "도검난무", + "zh": "刀剑乱舞", + "zh_tw": "刀劍亂舞", + "romaji": "toukennrannbu" + }, + "創作": { + "en": "creation", + "ko": "창작", + "zh": "原创", + "zh_tw": "原創", + "romaji": "sousaku" + }, + "原神": { + "en": "Genshin Impact", + "ko": "원신", + "zh": "", + "zh_tw": "", + "romaji": "gennshinn" + }, + "女の子": { + "en": "girl", + "ko": "여자애", + "zh": "女孩子", + "zh_tw": "女孩子", + "romaji": "onnnanoko" + }, + "少女": { + "en": "young girl", + "ko": "소녀", + "zh": "", + "zh_tw": "", + "romaji": "shoujo" + }, + "東方Project": { + "romaji": "touhoupurojekuto" + }, + "水着": { + "en": "swimsuit", + "ko": "수영복", + "zh": "泳装", + "zh_tw": "泳裝", + "romaji": "mizugi" + }, + "男の子": { + "en": "boy", + "ko": "남자애", + "zh": "男孩子", + "zh_tw": "男孩子", + "romaji": "otokonoko" + }, + "神宮寺寂雷": { + "en": "Jakurai Jinguji", + "ko": "", + "zh": "神宫寺寂雷", + "zh_tw": "", + "romaji": "jinnguujijakurai" + }, + "背景素材": { + "en": "background material", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "haikeisozai" + }, + "鬼白": { + "en": "Hozuki x Hakutaku", + "ko": "귀백", + "zh": "鬼灯×白泽", + "zh_tw": "鬼燈×白澤", + "romaji": "onishiromatahahoohaku" + }, + "던파": { + "romaji": "donnpa" + }, + "夢術廻戦": { + "en": "", + "ko": "주술회전 창작", + "zh": "", + "zh_tw": "", + "romaji": "mujutsukaisenn" + }, + "東京【腐】リベンジャーズ": { + "en": "Tokyo Revengers yaoi", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "toukyouribennja-zufumuke" + }, + "腐術廻戦": { + "en": "Jujutsu Kaisen yaoi", + "ko": "주술회전 (BL)", + "zh": "咒术回战【腐】", + "zh_tw": "咒術迴戰(腐)", + "romaji": "fujutsukaisenn" + }, + "夢小説": { + "en": "dream novel", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "yumeshousetsu" + }, + "五悠": { + "en": "Gojo/Yuji", + "ko": "고죠유우", + "zh": "五条悟×虎杖悠仁", + "zh_tw": "", + "romaji": "goyuu" + }, + "佐野万次郎": { + "en": "Manjiro Sano", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "sanomannjirou" + }, + "クロスオーバー": { + "en": "crossover", + "ko": "", + "zh": "跨界作品", + "zh_tw": "跨界作品", + "romaji": "kurosuo-ba-" + }, + "夏油傑": { + "en": "Suguru Geto", + "ko": "", + "zh": "夏油杰", + "zh_tw": "", + "romaji": "getousuguru" + }, + "五条悟": { + "en": "Satoru Gojo", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "gojousatoru" + }, + "女体化": { + "en": "transforming into a woman", + "ko": "여체화", + "zh": "娘化", + "zh_tw": "女體化", + "romaji": "nyotaika" + }, + "腐向け": { + "en": "yaoi", + "ko": "부녀자향", + "zh": "腐向", + "zh_tw": "腐向", + "romaji": "fumuke" + }, + "マイキー": { + "en": "mikey", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "maiki-" + }, + "twst夢": { + "en": "Twisted-Wonderland fanfiction", + "ko": "트위스티드 원더랜드", + "zh": "", + "zh_tw": "", + "romaji": "tsuisuteyume" + }, + "本好きの下剋上": { + "en": "Ascendance of a Bookworm", + "ko": "", + "zh": "小书痴的下克上", + "zh_tw": "", + "romaji": "honnzukinogekokujou" + }, + "東京卍リベンジャーズ": { + "en": "Tokyo Revengers", + "ko": "", + "zh": "东京卍复仇者", + "zh_tw": "東京卍復仇者", + "romaji": "toukyouribennja-zu" + }, + "オリ主": { + "romaji": "orishuorinushi" + }, + "女主人公": { + "en": "female protagonist", + "ko": "", + "zh": "女主角", + "zh_tw": "女主人翁", + "romaji": "onnnashujinnkou" + }, + "続きを全裸待機": { + "en": "waiting for the sequel full naked", + "ko": "", + "zh": "全裸等待后续", + "zh_tw": "後續全裸待機", + "romaji": "tsudukiwozennrataiki" + }, + "女監督生": { + "en": "Female Prefect", + "ko": "", + "zh": "女监督生", + "zh_tw": "", + "romaji": "onnnakanntokusei" + }, + "現パロ": { + "en": "Modern AU", + "ko": "", + "zh": "现代改编", + "zh_tw": "現代paro", + "romaji": "gennparo" + }, + "やはり俺の青春ラブコメはまちがっている。": { + "en": "My Youth Romantic Comedy Is Wrong, As I Expected", + "ko": "역시 내 청춘코미디는 잘못됐다", + "zh": "果然我的青春恋爱喜剧搞错了。", + "zh_tw": "果然我的青春戀愛喜劇搞錯了。", + "romaji": "yahariorenoseishunnrabukomehamachigatteiru" + }, + "魔道祖師": { + "en": "MoDaoZuShi", + "ko": "", + "zh": "魔道祖师", + "zh_tw": "", + "romaji": "madousoshi" + }, + "比企谷八幡": { + "en": "Hachiman Hikigaya", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "hikigayahachimann" + }, + "場地圭介": { + "romaji": "bajikeisuke" + }, + "東京リベンジャーズ": { + "en": "Tokyo Revengers", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "toukyouribennja-zu" + }, + "虎杖悠仁": { + "en": "Yuji Itadori", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "itadoriyuuji" + }, + "待ってました!": { + "en": "", + "ko": "", + "zh": "", + "zh_tw": "等好久了!", + "romaji": "mattemashita" + }, + "呪術廻戦": { + "en": "Jujutsu Kaisen", + "ko": "주술회전", + "zh": "", + "zh_tw": "咒術迴戰", + "romaji": "jujutsukaisenn" + }, + "五伏": { + "en": "Gojo/Fushiguro", + "ko": "고죠후시", + "zh": "", + "zh_tw": "", + "romaji": "gofushi" + }, + "二次創作": { + "en": "fan work", + "ko": "2차 창작", + "zh": "二次创作", + "zh_tw": "", + "romaji": "nijisousaku" + }, + "ヤンデレ": { + "en": "yandere", + "ko": "얀데레", + "zh": "病娇", + "zh_tw": "病嬌", + "romaji": "yanndere" + }, + "クトゥルフ神話TRPG": { + "en": "Call of Cthulhu", + "ko": "", + "zh": "", + "zh_tw": "克蘇魯神話TRPG", + "romaji": "kutoxurufushinnwathi-a-rupi-ji-" + }, + "CoCシナリオ": { + "en": "", + "ko": "CoC시나리오", + "zh": "", + "zh_tw": "", + "romaji": "kutoxurufushinnwashinario" + }, + "ハリポタ": { + "en": "harry potter", + "ko": "해리 포터", + "zh": "哈利波特", + "zh_tw": "", + "romaji": "hari-potta-shiri-zu" + }, + "キャラ崩壊": { + "en": "out of character", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "kyarahoukai" + }, + "松野千冬": { + "romaji": "matsunochifuyu" + }, + "煉獄杏寿郎": { + "en": "Kyojuro Rengoku", + "ko": "", + "zh": "炼狱杏寿郎", + "zh_tw": "煉獄杏壽郎", + "romaji": "renngokukyoujurou" + }, + "loli": { + "en": "", + "ko": "", + "zh": "萝莉", + "zh_tw": "", + "romaji": "" + }, + "七七(原神)": { + "en": "Qiqi (Genshin Impact)", + "ko": "치치(원신)", + "zh": "", + "zh_tw": "", + "romaji": "nana" + }, + "けもみみ": { + "en": "animal ears", + "ko": "동물귀", + "zh": "兽耳", + "zh_tw": "獸耳", + "romaji": "kemomimi" + }, + "クレー(原神)": { + "en": "Klee (Genshin Impact)", + "ko": "클레(원신)", + "zh": "可莉(原神)", + "zh_tw": "", + "romaji": "kure-" + }, + "百合": { + "en": "yuri", + "ko": "백합", + "zh": "", + "zh_tw": "", + "romaji": "yuri" + }, + "空(原神)": { + "en": "Aether (Genshin Impact)", + "ko": "남행자(원신)", + "zh": "", + "zh_tw": "", + "romaji": "sora" + }, + "可愛い": { + "en": "kawaii", + "ko": "귀여워", + "zh": "可爱", + "zh_tw": "", + "romaji": "kawaii" + }, + "迪奥娜": { + "en": "Diona", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "" + }, + "七七": { + "en": "Qiqi", + "ko": "치치", + "zh": "", + "zh_tw": "", + "romaji": "nana" + }, + "ロリ": { + "en": "loli", + "ko": "로리", + "zh": "萝莉", + "zh_tw": "蘿莉", + "romaji": "rori" + }, + "ケモミミ": { + "en": "animal ears", + "ko": "동물귀", + "zh": "兽耳", + "zh_tw": "獸耳", + "romaji": "kemomimi" + }, + "猫耳": { + "en": "cat ears", + "ko": "고양이귀", + "zh": "", + "zh_tw": "貓耳", + "romaji": "nekomimi" + }, + "ディオナ(原神)": { + "en": "Diona (Genshin Impact)", + "ko": "디오나(원신)", + "zh": "迪奥娜(原神)", + "zh_tw": "", + "romaji": "dexiona" + }, + "萝莉": { + "en": "loli", + "ko": "로리", + "zh": "", + "zh_tw": "蘿莉", + "romaji": "rori" + }, + "女孩子": { + "en": "girl", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "-" + }, + "ジョジョ立ち": { + "en": "jojo stand", + "ko": "", + "zh": "JoJo立", + "zh_tw": "", + "romaji": "jojodachi" + }, + "甘雨(原神)": { + "en": "Ganyu (Genshin Impact)", + "ko": "감우(원신)", + "zh": "", + "zh_tw": "", + "romaji": "kannu" + }, + "パイモン(原神)": { + "en": "Paimon (Genshin Impact)", + "ko": "페이몬(원신)", + "zh": "派蒙(原神)", + "zh_tw": "", + "romaji": "paimonn" + } + }, + "thumbnails": [ + { + "id": "87387148", + "title": "FATUI", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/01/29/21/59/00/87387148_p0_custom1200.jpg", + "description": "", + "tags": [ + "GenshinImpact", + "タルタリヤ", + "原神", + "childe", + "tartaglia", + "fatui", + "fanart", + "game", + "男", + "ファデュイ" + ], + "userId": "13072125", + "userName": "Sakon04", + "width": 2205, + "height": 1240, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#GenshinImpact FATUI - Sakon04的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-01-29T21:59:00+09:00", + "updateDate": "2021-01-29T21:59:00+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/12/16/00/27/28/8726991_aded4cb36017c75358144e7c902d6ead_50.jpg" + }, + { + "id": "89843345", + "title": "Eula - 原神", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/05/15/03/31/53/89843345_p0_custom1200.jpg", + "description": "", + "tags": [ + "原神", + "eula", + "エウルア", + "girl", + "fanart", + "夏", + "足", + "ビーチ", + "GenshinImpact", + "水着" + ], + "userId": "19114171", + "userName": "Sciamano240", + "width": 1225, + "height": 1320, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 Eula - 原神 - Sciamano240的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-15T03:31:53+09:00", + "updateDate": "2021-05-15T03:31:53+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/03/23/11/52/40/18166130_25ded65943474188e64bffd1b423a5a2_50.jpg" + }, + { + "id": "87162139", + "title": "Mikasa", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/01/19/19/57/27/87162139_p0_square1200.jpg", + "description": "", + "tags": [ + "fanart", + "sexy", + "girl", + "thai", + "attackontitan", + "mikasa", + "進撃の巨人", + "Tight", + "尻" + ], + "userId": "17073719", + "userName": "Moi'dukdum", + "width": 1240, + "height": 1754, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#fanart Mikasa - Moi'dukdum的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-01-19T19:57:27+09:00", + "updateDate": "2021-01-19T19:57:27+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/06/23/03/20/48/20920050_111ecaa029872c76859691740ff0152b_50.jpg" + }, + { + "id": "57808612", + "title": "邪ンヌ・オルタ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/07/09/00/10/10/57808612_p0_square1200.jpg", + "description": "", + "tags": [ + "Fate/GrandOrder", + "ジャンヌ・オルタ", + "FGO", + "魅惑のふともも", + "鬱くしい", + "これはいいふともも", + "骸骨", + "アヴェンジャー(Fate)", + "女の子", + "Fate/GO200000users入り" + ], + "userId": "73152", + "userName": "光崎", + "width": 1355, + "height": 800, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#Fate/GrandOrder 邪ンヌ・オルタ - 光崎的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-07-09T00:10:10+09:00", + "updateDate": "2016-07-09T00:10:10+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/04/24/17/50/20/20585046_e7a841f4f99a0703b8fe28552df0cfad_50.jpg" + }, + { + "id": "59665299", + "title": "FGO沖田総司", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/10/28/00/12/16/59665299_p0_square1200.jpg", + "description": "", + "tags": [ + "Fate/GrandOrder", + "FGO", + "沖田総司", + "沖田総司(Fate)", + "菊一文字則宗", + "桜セイバー", + "Fate", + "Fate/GO100000users入り", + "版権", + "女の子" + ], + "userId": "73152", + "userName": "光崎", + "width": 1355, + "height": 800, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#Fate/GrandOrder FGO沖田総司 - 光崎的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-10-28T00:12:16+09:00", + "updateDate": "2016-10-28T00:12:16+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/04/24/17/50/20/20585046_e7a841f4f99a0703b8fe28552df0cfad_50.jpg" + }, + { + "id": "82432085", + "title": "水着アナスタシアちゃん", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/06/20/00/00/11/82432085_p0_square1200.jpg", + "description": "", + "tags": [ + "Fate/GrandOrder", + "FGO", + "アナスタシア(Fate)", + "水着", + "パレオ", + "アナスタシア・ニコラエヴナ・ロマノヴァ(Fate)", + "シースルー", + "麦わら帽子", + "Fate/GO100000users入り", + "白ビキニ" + ], + "userId": "73152", + "userName": "光崎", + "width": 750, + "height": 1179, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#Fate/GrandOrder 水着アナスタシアちゃん - 光崎的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-06-20T00:00:11+09:00", + "updateDate": "2020-06-20T00:00:11+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/04/24/17/50/20/20585046_e7a841f4f99a0703b8fe28552df0cfad_50.jpg" + }, + { + "id": "61169484", + "title": "新年快樂!", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/01/29/11/55/50/61169484_p0_square1200.jpg", + "description": "", + "tags": [ + "FGO", + "fate", + "年賀状", + "アルトリア・ペンドラゴン", + "セイバー(Fate/staynight)", + "Wセイバー", + "Fate/GO100000users入り", + "ネロ・クラウディウス(Fate)", + "春節", + "Fate/EXTRA作品ではありません" + ], + "userId": "529590", + "userName": "STAR影法師", + "width": 700, + "height": 959, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#FGO 新年快樂! - STAR影法師的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-01-29T11:55:50+09:00", + "updateDate": "2017-01-29T11:55:50+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2011/10/22/02/16/52/3751939_e70c1a9f4733d551a2ebc31deb68008f_50.jpg" + }, + { + "id": "68126965", + "title": "武蔵ちゃん", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/04/08/00/10/38/68126965_p0_square1200.jpg", + "description": "", + "tags": [ + "Fate/GrandOrder", + "FGO", + "宮本武蔵(Fate)", + "ジーンズ", + "モッズコート", + "魅惑の谷間", + "おっぱい", + "Fate/GO100000users入り", + "巨乳", + "女の子" + ], + "userId": "162475", + "userName": "煎茶", + "width": 721, + "height": 1021, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#Fate/GrandOrder 武蔵ちゃん - 煎茶的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-04-08T00:10:38+09:00", + "updateDate": "2018-04-08T00:10:38+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/01/21/01/17/56/16882907_c0aca74285bf3d8432387229dce02383_50.jpg" + }, + { + "id": "80567870", + "title": "Lumine", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2020/04/05/00/00/10/80567870_p0_custom1200.jpg", + "description": "", + "tags": [ + "原神", + "百合の花", + "荧", + "Lumine", + "原神project", + "GenshinImpact", + "旅行者", + "蛍(原神)", + "原神50000users入り", + "原神10000users入り" + ], + "userId": "15657814", + "userName": "Lunacle", + "width": 1325, + "height": 765, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 Lumine - Lunacle的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-04-05T00:00:10+09:00", + "updateDate": "2020-04-05T00:00:10+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/02/19/18/21/25/12170140_91433554c3d8f06f3d579ff276489ff9_50.jpg" + }, + { + "id": "86425919", + "title": "水着甘雨", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2020/12/21/19/35/14/86425919_p0_custom1200.jpg", + "description": "", + "tags": [ + "原神", + "甘雨", + "水着", + "女の子", + "GenshinImpact", + "甘雨(原神)", + "おっぱい", + "剥ぎ取りたいブラ", + "剥ぎ取りたいビキニ(パンツ)", + "原神50000users入り" + ], + "userId": "5302293", + "userName": "雲こ猫", + "width": 1910, + "height": 2703, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 水着甘雨 - 雲こ猫的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-12-21T00:00:09+09:00", + "updateDate": "2020-12-21T19:35:14+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/12/19/19/08/22/19853469_65cc5442b06b94f94d2371f45bda33fc_50.png" + }, + { + "id": "86464433", + "title": "cheeky", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/12/22/23/57/16/86464433_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "胡桃", + "胡桃(原神)", + "GenshinImpact", + "マニキュア", + "原神50000users入り" + ], + "userId": "4028484", + "userName": "pellas", + "width": 1848, + "height": 2888, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 cheeky - pellas的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-12-22T23:57:16+09:00", + "updateDate": "2020-12-22T23:57:16+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/07/10/22/47/32/21015272_77dd1a81b932bb019689de5bc50053d9_50.png" + }, + { + "id": "75748320", + "title": "竈門禰豆子/Kamado Nezuko", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/07/16/01/16/52/75748320_p0_square1200.jpg", + "description": "", + "tags": [ + "girl", + "少女", + "鬼滅の刃", + "竈門禰豆子", + "鬼滅の刃10000users入り", + "胸チラ", + "鬼滅の刃50000users入り", + "仰臥", + "善逸ホイホイ", + "色気の刃" + ], + "userId": "38847253", + "userName": "Xeonomi", + "width": 2000, + "height": 3020, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#girl 竈門禰豆子/Kamado Nezuko - Xeonomi的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-07-16T01:16:52+09:00", + "updateDate": "2019-07-16T01:16:52+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/10/12/12/42/58/16402675_465e68dcc5756d22c925f1a72390aaef_50.jpg" + }, + { + "id": "83199735", + "title": "临光", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/07/25/01/08/14/83199735_p0_square1200.jpg", + "description": "", + "tags": [ + "明日方舟", + "Arknights", + "临光", + "布洛卡", + "泳装", + "贾维", + "うなじ", + "girl", + "おっぱい", + "ニアール(アークナイツ)" + ], + "userId": "7263576", + "userName": "♠Sea", + "width": 1800, + "height": 2698, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#明日方舟 临光 - ♠Sea的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-07-25T01:08:14+09:00", + "updateDate": "2020-07-25T01:08:14+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2013/06/16/13/45/37/6380279_d9718071432fd61ff3e7e5c9a1d83614_50.jpg" + }, + { + "id": "63150612", + "title": "Catwalk", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/05/31/01/39/28/63150612_p0_square1200.jpg", + "description": "", + "tags": [ + "illustration", + "concept", + "sketch", + "painting", + "art", + "Original", + "girl", + "cat", + "city", + "blue" + ], + "userId": "3143520", + "userName": "snatti", + "width": 1200, + "height": 800, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#illustration Catwalk - snatti的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-05-31T01:39:28+09:00", + "updateDate": "2017-05-31T01:39:28+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2013/10/24/14/59/07/6974808_32cfae5c5558599ade59663e6b1452e6_50.jpg" + }, + { + "id": "67329067", + "title": "霧の湖", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/02/18/00/00/34/67329067_p0_square1200.jpg", + "description": "", + "tags": [ + "古明地こいし", + "東方", + "幻想郷の風景", + "紅魔館", + "東方Project", + "ふつくしい", + "東方Project10000users入り", + "イラスト", + "fanart", + "illustration" + ], + "userId": "4790", + "userName": "ぢせ", + "width": 1200, + "height": 800, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#古明地こいし 霧の湖 - ぢせ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-02-18T00:00:34+09:00", + "updateDate": "2018-02-18T00:00:34+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/10/15/21/33/58/13346842_913debc5c54b23bab635cde7e963e25c_50.png" + }, + { + "id": "68670776", + "title": "地上", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/05/10/00/00/13/68670776_p0_square1200.jpg", + "description": "", + "tags": [ + "東方", + "古明地こいし", + "空", + "風船", + "雲", + "東方Project", + "東方Project10000users入り", + "イラスト", + "fanart", + "illustration" + ], + "userId": "4790", + "userName": "ぢせ", + "width": 1600, + "height": 681, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#東方 地上 - ぢせ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-05-10T00:00:13+09:00", + "updateDate": "2018-05-10T00:00:13+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/10/15/21/33/58/13346842_913debc5c54b23bab635cde7e963e25c_50.png" + }, + { + "id": "57746661", + "title": "レディバグはまりました", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/07/05/01/11/52/57746661_p0_square1200.jpg", + "description": "", + "tags": [ + "MiraculousLadybug", + "レディバグ", + "MiraculousLadybug5000users入り", + "ミラキュラスレディバグ&シャノワール" + ], + "userId": "68845", + "userName": "こんぐ", + "width": 776, + "height": 629, + "pageCount": 17, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#MiraculousLadybug レディバグはまりました - こんぐ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-07-05T01:11:52+09:00", + "updateDate": "2016-07-05T01:11:52+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2010/07/30/13/04/10/2027455_cc98fa5a7e25b6a222c186b9b847f661_50.jpg" + }, + { + "id": "76208126", + "title": "Miraculous Ladybug.2", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/08/12/00/44/48/76208126_p0_square1200.jpg", + "description": "", + "tags": [ + "MiraculousLadybug", + "アドマリ", + "ノワバグ", + "MiraculousLadybug1000users入り", + "ミラキュラスレディバグ&シャノワール" + ], + "userId": "10838026", + "userName": "mg", + "width": 680, + "height": 522, + "pageCount": 21, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#MiraculousLadybug Miraculous Ladybug.2 - mg的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-08-12T00:44:48+09:00", + "updateDate": "2019-08-12T00:44:48+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://s.pximg.net/common/images/no_profile_s.png" + }, + { + "id": "53366642", + "title": "my lady", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2015/11/03/18/50/59/53366642_p0_square1200.jpg", + "description": "", + "tags": [ + "Ladybug", + "レディーバグ", + "MiraculousLadybug", + "MiraculousLadybug1000users入り", + "タイツがかっこよく見える不思議" + ], + "userId": "3085863", + "userName": "天然風", + "width": 1000, + "height": 885, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#Ladybug my lady - 天然風的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2015-11-03T18:50:59+09:00", + "updateDate": "2015-11-03T18:50:59+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/08/25/17/32/00/11405511_9c81d659c2f9cbf5bd8c1f2c41d2b573_50.jpg" + }, + { + "id": "76220766", + "title": "Moonlight", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/08/12/20/48/31/76220766_p0_square1200.jpg", + "description": "", + "tags": [ + "SUMMER", + "sky", + "Melancholy", + "Cloud", + "Evening", + "sunset", + "moon", + "stars", + "背景", + "風景" + ], + "userId": "29871659", + "userName": "istomin_denis", + "width": 816, + "height": 900, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#SUMMER Moonlight - istomin_denis的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-08-12T20:48:31+09:00", + "updateDate": "2019-08-12T20:48:31+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/07/09/23/57/21/14466131_715330667fca28f68bf380486130fa02_50.jpg" + }, + { + "id": "74955694", + "title": "暑い 落書き", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/05/29/05/43/22/74955694_p0_square1200.jpg", + "description": "", + "tags": [ + "セーラームーン", + "ちびうさ", + "美少女戦士セーラームーン", + "sailor", + "moon", + "ブラック・レディ", + "BlackLady", + "ブラックレディ", + "セーラームーン1000users入り" + ], + "userId": "7369463", + "userName": "NEWZニューズ", + "width": 1000, + "height": 1500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#セーラームーン 暑い 落書き - NEWZニューズ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-05-29T05:43:22+09:00", + "updateDate": "2019-05-29T05:43:22+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/01/07/19/10/21/10349639_4989e89cdf36532f5a48493c766ac7f4_50.png" + }, + { + "id": "74723171", + "title": "Sailor moon", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/05/14/13/36/29/74723171_p0_square1200.jpg", + "description": "", + "tags": [ + "sailor", + "moon", + "sailormoon", + "美少女戦士セーラームーン", + "月野うさぎ", + "セーラームーン1000users入り" + ], + "userId": "20283127", + "userName": "hoobamon", + "width": 999, + "height": 1500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#sailor Sailor moon - hoobamon的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-05-14T13:36:29+09:00", + "updateDate": "2019-05-14T13:36:29+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/10/08/11/26/22/11593066_b1cff2986627ccec1a78236292230337_50.jpg" + }, + { + "id": "41686664", + "title": "母ログ", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2014/02/17/00/06/28/41686664_p0_square1200.jpg", + "description": "", + "tags": [ + "MOTHER", + "MOTHER2", + "MOTHER3", + "MOTHER3000users入り" + ], + "userId": "1246592", + "userName": "磯部", + "width": 718, + "height": 687, + "pageCount": 18, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#MOTHER 母ログ - 磯部的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2014-02-17T00:06:28+09:00", + "updateDate": "2014-02-17T00:06:28+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/05/05/15/02/38/7826596_c8bc1d8055915d51c6b6c6d309479e4a_50.jpg" + }, + { + "id": "56436164", + "title": "MOTHER", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/04/20/00/02/52/56436164_p0_square1200.jpg", + "description": "", + "tags": [ + "MOTHER", + "MOTHER2", + "MOTHER3", + "集合絵", + "MOTHER1000users入り", + "愛を感じる", + "MOTHERシリーズ" + ], + "userId": "794658", + "userName": "ラリアット", + "width": 1200, + "height": 1788, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#MOTHER MOTHER - ラリアット的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-04-20T00:02:52+09:00", + "updateDate": "2016-04-20T00:02:52+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2011/12/14/01/31/13/3948367_a73a4537e3c689be244716d57352e2d8_50.png" + }, + { + "id": "11765689", + "title": "強くならなきゃ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2010/07/09/02/40/47/11765689_p0_square1200.jpg", + "description": "", + "tags": [ + "リュカ", + "背景", + "MOTHER", + "MOTHER3", + "お絵描き掲示板", + "ドット絵", + "お絵描き掲示板の本気", + "(´;ω;`)", + "MOTHER1000users入り" + ], + "userId": "1553813", + "userName": "夏道", + "width": 500, + "height": 500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#リュカ 強くならなきゃ - 夏道的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2010-07-09T02:40:47+09:00", + "updateDate": "2010-07-09T02:40:47+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2010/07/11/20/47/57/1951068_374b5c668f8924193821810c610d7f3f_50.png" + }, + { + "id": "58122126", + "title": "今日は一日おやすみぞい!", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/07/28/09/00/00/58122126_p0_square1200.jpg", + "description": "", + "tags": [ + "NEWGAME!", + "涼風青葉", + "ファミコン", + "戦士の休息", + "NEWGAME!10000users入り", + "パジャマ", + "イーグルジャンプ", + "コントローラー" + ], + "userId": "3145937", + "userName": "goribote", + "width": 700, + "height": 750, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#NEWGAME! 今日は一日おやすみぞい! - goribote的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-07-28T09:00:00+09:00", + "updateDate": "2016-07-28T09:00:00+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/04/29/18/51/15/20612203_699482ee7e73a291dc9da97a9a4397d6_50.png" + }, + { + "id": "64433132", + "title": "NEWGAME!!のひふみん", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/08/15/20/16/32/64433132_p0_square1200.jpg", + "description": "", + "tags": [ + "NEWGAME!!", + "滝本ひふみ", + "NEWGAME!", + "ポニーテール", + "上目遣い", + "NEWGAME!5000users入り" + ], + "userId": "5852420", + "userName": "妄想", + "width": 3035, + "height": 2149, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#NEWGAME!! NEWGAME!!のひふみん - 妄想的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-08-15T20:16:32+09:00", + "updateDate": "2017-08-15T20:16:32+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/07/04/13/46/09/18931171_902f60459063bcd49d4adfd81d4fa3b9_50.jpg" + }, + { + "id": "57681432", + "title": "ひふみん!ひふみん!", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/07/01/19/23/59/57681432_p0_square1200.jpg", + "description": "", + "tags": [ + "NEWGAME!", + "涼風青葉", + "滝本ひふみ", + "青ひふ", + "NEWGAME!5000users入り" + ], + "userId": "27691", + "userName": "結城辰也", + "width": 1280, + "height": 720, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#NEWGAME! ひふみん!ひふみん! - 結城辰也的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-07-01T19:23:59+09:00", + "updateDate": "2016-07-01T19:23:59+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/02/10/06/33/01/10509654_53f715342b56f00451b79169200c892e_50.jpg" + }, + { + "id": "61784598", + "title": "朽ち果てた世界で", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/03/07/00/06/44/61784598_p0_square1200.jpg", + "description": "", + "tags": [ + "NieR:Automata", + "NieR", + "ニーアオートマタ", + "ニーア", + "2B", + "9S", + "ヨルハ九号S型", + "ヨルハ二号B型", + "NieR10000users入り" + ], + "userId": "1249098", + "userName": "サイトー@FANBOX開設!", + "width": 4784, + "height": 3508, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#NieR:Automata 朽ち果てた世界で - サイトー@FANBOX開設!的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-03-07T00:06:44+09:00", + "updateDate": "2017-03-07T00:06:44+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/04/21/00/34/41/9262731_c59b2d62d8f4693ac246403ff6b4e1ed_50.png" + }, + { + "id": "61599251", + "title": "ふたりなら", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/02/23/16/54/53/61599251_p0_square1200.jpg", + "description": "", + "tags": [ + "ニーア", + "NieR", + "NieR:Automata", + "ニーアオートマタ", + "9S", + "ヨルハ九号S型", + "ヨルハ二号B型", + "2B", + "2B9S", + "NieR10000users入り" + ], + "userId": "2119953", + "userName": "風李たゆ", + "width": 2400, + "height": 1600, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ニーア ふたりなら - 風李たゆ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-02-23T16:54:53+09:00", + "updateDate": "2017-02-23T16:54:53+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/10/09/16/36/20/9975377_6ceb780f31ab86bca5886a827c951275_50.png" + }, + { + "id": "62039907", + "title": "ヨルハ二号B型", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/03/22/14/37/14/62039907_p0_square1200.jpg", + "description": "", + "tags": [ + "NieR:Automata", + "ニーアオートマタ", + "NieR", + "ヨルハ二号B型", + "2B", + "女の子", + "艶ぼくろ", + "唇", + "魅惑の谷間", + "NieR10000users入り" + ], + "userId": "23509413", + "userName": "GATORIX", + "width": 800, + "height": 742, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#NieR:Automata ヨルハ二号B型 - GATORIX的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-03-22T14:37:14+09:00", + "updateDate": "2017-03-22T14:37:14+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/03/17/12/44/01/12279748_d420b1447387f77179190e18df6baa63_50.jpg" + }, + { + "id": "90390199", + "title": "Finana", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/06/07/14/16/51/90390199_p0_square1200.jpg", + "description": "", + "tags": [ + "VTuber", + "バーチャルYouTuber", + "にじさんじ", + "FinanaRyugu", + "NIJISANJI_EN", + "LazuLight", + "バーチャルYouTuber5000users入り", + "目がハート" + ], + "userId": "16105069", + "userName": "pumpkinspice", + "width": 2121, + "height": 3000, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#VTuber Finana - pumpkinspice的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-07T14:16:51+09:00", + "updateDate": "2021-06-07T14:16:51+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/08/02/08/33/10/14571013_74e1cdb0d17f64b538924a54648fe90f_50.jpg" + }, + { + "id": "69463109", + "title": "Life's Journey", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/06/30/02/12/46/69463109_p0_square1200.jpg", + "description": "", + "tags": [ + "オリジナル", + "女の子", + "original", + "鉄道駅", + "線路", + "白いドレス", + "白髪", + "植物", + "オリジナル10000users入り", + "廃墟" + ], + "userId": "3137712", + "userName": "Yuu", + "width": 2000, + "height": 1139, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#オリジナル Life's Journey - Yuu的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-06-30T02:12:46+09:00", + "updateDate": "2018-06-30T02:12:46+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/01/24/05/04/05/7350366_aeafa41f311a5b915d83d68e97e131f2_50.jpg" + }, + { + "id": "33414104", + "title": "アンダーグラウンド", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2013/02/08/15/21/25/33414104_p0_square1200.jpg", + "description": "", + "tags": [ + "カラー", + "original", + "落書き", + "ハッカー", + "サイバーパンク", + "バイオリン", + "オリジナル", + "ヘッドフォン", + "オリジナル10000users入り", + "ハイカットスニーカー" + ], + "userId": "3137712", + "userName": "Yuu", + "width": 1000, + "height": 1333, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#カラー アンダーグラウンド - Yuu的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2013-02-08T15:21:25+09:00", + "updateDate": "2013-02-08T15:21:25+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/01/24/05/04/05/7350366_aeafa41f311a5b915d83d68e97e131f2_50.jpg" + }, + { + "id": "69139520", + "title": "Still Waiting", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/06/09/03/30/36/69139520_p0_square1200.jpg", + "description": "", + "tags": [ + "女の子", + "original", + "東京", + "背景", + "都市", + "風景", + "魚眼", + "オリジナル10000users入り", + "素晴らしすぎる", + "夜景" + ], + "userId": "3137712", + "userName": "Yuu", + "width": 1500, + "height": 1000, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#女の子 Still Waiting - Yuu的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-06-09T03:30:36+09:00", + "updateDate": "2018-06-09T03:30:36+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/01/24/05/04/05/7350366_aeafa41f311a5b915d83d68e97e131f2_50.jpg" + }, + { + "id": "91411248", + "title": "kawaii", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/22/10/39/45/91411248_p0_square1200.jpg", + "description": "", + "tags": [ + "女の子", + "PetraArt", + "petragurin", + "NIJISANJI_EN", + "にじさんじ", + "Petra", + "Vtuber", + "バーチャルYouTuber", + "ペトラ・グリン" + ], + "userId": "32627210", + "userName": "キケン⚠️", + "width": 1191, + "height": 1684, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#女の子 kawaii - キケン⚠️的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-22T10:39:45+09:00", + "updateDate": "2021-07-22T10:39:45+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/08/13/20/42/31/19173359_92cf372e5256c65100558611aae295c1_50.jpg" + }, + { + "id": "89338355", + "title": "Violet at the Beach", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/04/23/19/19/37/89338355_p0_custom1200.jpg", + "description": "", + "tags": [ + "3D", + "DAZStudio", + "3DCG", + "bikini", + "micro_bikini", + "Beach", + "Incredibles", + "violet", + "pregnant", + "Violet_Parr" + ], + "userId": "66263727", + "userName": "13Amps", + "width": 1080, + "height": 1920, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#3D Violet at the Beach - 13Amps的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-04-23T19:19:37+09:00", + "updateDate": "2021-04-23T19:19:37+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/03/11/22/50/30/20340516_0b41ce78da86fa7875387b7f5c771cba_50.jpg" + }, + { + "id": "83468525", + "title": "【終】Helltaker、私的結婚子育てルート編Part3", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/08/05/21/54/24/83468525_p0_square1200.jpg", + "description": "", + "tags": [ + "Helltaker", + "pregnant", + "ボテ腹", + "妊娠", + "親子妄想", + "ハーレム", + "Beelzebub", + "Zdrada", + "Cerberus", + "授乳" + ], + "userId": "36855466", + "userName": "リリT", + "width": 700, + "height": 700, + "pageCount": 11, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#Helltaker 【終】Helltaker、私的結婚子育てルート編Part3 - リリT的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-08-05T21:54:24+09:00", + "updateDate": "2020-08-05T21:54:24+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/12/28/11/25/50/15182836_bd70ac1e76b0e68f35050c93696c7245_50.jpg" + }, + { + "id": "83295372", + "title": "Helltaker、私的結婚子育てルート編part2", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/08/03/18/30/12/83295372_p0_square1200.jpg", + "description": "", + "tags": [ + "pregnant", + "Helltaker", + "妊娠", + "ボテ腹", + "Lucifer", + "Judgement", + "azazel", + "malina", + "親子妄想", + "育児" + ], + "userId": "36855466", + "userName": "リリT", + "width": 700, + "height": 700, + "pageCount": 9, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#pregnant Helltaker、私的結婚子育てルート編part2 - リリT的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-07-29T01:18:37+09:00", + "updateDate": "2020-08-03T18:30:12+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/12/28/11/25/50/15182836_bd70ac1e76b0e68f35050c93696c7245_50.jpg" + }, + { + "id": "70833260", + "title": "白いR(ローズ)", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/09/23/20/36/42/70833260_p0_square1200.jpg", + "description": "", + "tags": [ + "湊友希那", + "BanG_Dream!", + "バンドリ", + "roselia", + "ロゼリア", + "バンドリ500users入り", + "バンドリ1000users入り" + ], + "userId": "3027037", + "userName": "瓶紫", + "width": 667, + "height": 1000, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#湊友希那 白いR(ローズ) - 瓶紫的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-09-23T20:36:42+09:00", + "updateDate": "2018-09-23T20:36:42+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/01/19/04/14/26/20029658_7028bacd56b3e9949f77e15fdfffdeab_50.jpg" + }, + { + "id": "78311723", + "title": "OC Tess - Stay hydrated 2", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/12/15/21/07/27/78311723_p0_square1200.jpg", + "description": "", + "tags": [ + "oc", + "scifi", + "spy", + "tess", + "ビキニ", + "夏", + "後ろの存在感", + "足を浸す", + "オリジナル10000users入り", + "白ビキニ" + ], + "userId": "12969170", + "userName": "ライコ", + "width": 850, + "height": 1200, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#oc OC Tess - Stay hydrated 2 - ライコ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-12-15T21:07:27+09:00", + "updateDate": "2019-12-15T21:07:27+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/02/28/11/15/31/12207625_a6dc65155a5e7a51a7ed5df19f9bae63_50.png" + }, + { + "id": "53034161", + "title": "Church FFVII", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2015/10/14/18/24/43/53034161_p0_square1200.jpg", + "description": "", + "tags": [ + "FFVII", + "FinalFantasyVII", + "CloudStrife", + "TifaLockhart", + "2d", + "fantasy", + "scifi", + "クラウド・ストライフ", + "ティファ・ロックハート", + "ファイナルファンタジ" + ], + "userId": "13537252", + "userName": "SayaArt", + "width": 2100, + "height": 1093, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#FFVII Church FFVII - SayaArt的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2015-10-14T18:24:43+09:00", + "updateDate": "2015-10-14T18:24:43+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/05/06/18/46/31/20655480_de2cf7281fc772cc3ed313e1009e8c0b_50.jpg" + }, + { + "id": "77079433", + "title": "OC Tess - That's how mafia works", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/10/02/23/18/50/77079433_p0_square1200.jpg", + "description": "", + "tags": [ + "oc", + "tess", + "scifi", + "Spy", + "イブニングドレス", + "Tess_Turner", + "アクション" + ], + "userId": "12969170", + "userName": "ライコ", + "width": 960, + "height": 1200, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#oc OC Tess - That's how mafia works - ライコ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-10-02T23:18:50+09:00", + "updateDate": "2019-10-02T23:18:50+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/02/28/11/15/31/12207625_a6dc65155a5e7a51a7ed5df19f9bae63_50.png" + }, + { + "id": "87944694", + "title": "ラン暦まとめ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/02/21/20/13/05/87944694_p0_square1200.jpg", + "description": "", + "tags": [ + "sk∞", + "エスケーエイト", + "ラン暦", + "エ腐ケーエイト5000users入り", + "SK∞" + ], + "userId": "59050197", + "userName": "🐟", + "width": 1629, + "height": 1139, + "pageCount": 12, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#sk∞ ラン暦まとめ - 🐟的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-02-21T20:13:05+09:00", + "updateDate": "2021-02-21T20:13:05+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://s.pximg.net/common/images/no_profile_s.png" + }, + { + "id": "87615344", + "title": "ランガ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/02/08/09/47/36/87615344_p0_square1200.jpg", + "description": "", + "tags": [ + "エスケーエイト", + "SK∞", + "馳河ランガ", + "愛抱夢", + "SK∞1000users入り", + "SK∞3000users入り" + ], + "userId": "49693", + "userName": "JaneMere", + "width": 880, + "height": 1245, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#エスケーエイト ランガ - JaneMere的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-02-08T06:35:25+09:00", + "updateDate": "2021-02-08T09:47:36+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2011/09/19/20/41/20/3633096_1eaf96ca4072d4c0b1f81a6b3371614a_50.jpg" + }, + { + "id": "87840158", + "title": "skate board", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/02/17/14/31/43/87840158_p0_custom1200.jpg", + "description": "", + "tags": [ + "sk", + "エスケーエイト", + "SK8", + "SK∞", + "SK∞1000users入り", + "馳河ランガ", + "喜屋武暦" + ], + "userId": "12342223", + "userName": "Lococo:p", + "width": 900, + "height": 1379, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#sk skate board - Lococo:p的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-02-17T08:40:36+09:00", + "updateDate": "2021-02-17T14:31:43+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/02/01/17/47/13/17840863_cfad4ab6109bb01f59ed8a8ce530a5f7_50.jpg" + }, + { + "id": "72655663", + "title": "KDA Sona X DJ ahri", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 4, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/01/14/11/57/06/72655663_p0_square1200.jpg", + "description": "", + "tags": [ + "League_of_Legends", + "ahri", + "sona", + "尻神様", + "英雄联盟", + "Sona", + "Ahri", + "ハイレグスーツ", + "LOL10000users入り", + "けしからん乳" + ], + "userId": "3384404", + "userName": "sakimichan", + "width": 1000, + "height": 707, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#League_of_Legends KDA Sona X DJ ahri - sakimichan的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-01-14T11:57:06+09:00", + "updateDate": "2019-01-14T11:57:06+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/04/10/20/01/05/14077934_df136ab55825bc335ee2c3b32879fbae_50.jpg" + }, + { + "id": "85617306", + "title": "Arknights - Surtr", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/12/06/01/58/85617306_p0_square1200.jpg", + "description": "", + "tags": [ + "女の子", + "solo", + "Arknights", + "アークナイツ", + "Surtr", + "sword", + "スルト(アークナイツ)", + "アークナイツ1000users入り" + ], + "userId": "9690454", + "userName": "Pinlin", + "width": 1368, + "height": 1779, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#女の子 Arknights - Surtr - Pinlin的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-12T06:01:58+09:00", + "updateDate": "2020-11-12T06:01:58+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/03/26/21/51/49/18187458_1d8c31845077ee0284542baa4deb609d_50.png" + }, + { + "id": "78679716", + "title": "能代", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/01/03/09/31/28/78679716_p0_square1200.jpg", + "description": "", + "tags": [ + "アズールレーン", + "能代(アズールレーン)", + "黒タイツ", + "アズールレーン1000users入り", + "黒セーラー", + "sword", + "おへそ" + ], + "userId": "923205", + "userName": "Ka11_CA", + "width": 1309, + "height": 1576, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#アズールレーン 能代 - Ka11_CA的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-01-03T09:31:28+09:00", + "updateDate": "2020-01-03T09:31:28+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/03/12/05/41/11/20342070_68d5c18f1f3c85149dabe8512eb322f0_50.png" + }, + { + "id": "41086111", + "title": "master artoria 重制", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2014/01/21/00/22/34/41086111_p0_square1200.jpg", + "description": "", + "tags": [ + "saber", + "fate/zero", + "fatezero", + "fate", + "king", + "剑", + "聖杯", + "sword", + "セイバー", + "アルトリア・ペンドラゴン" + ], + "userId": "4278669", + "userName": "AIOVIA", + "width": 2100, + "height": 1440, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#saber master artoria 重制 - AIOVIA的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2014-01-21T00:22:34+09:00", + "updateDate": "2014-01-21T00:22:34+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/01/07/11/50/40/8815279_660a343fb3587ec430618d0d0ce2b941_50.jpg" + }, + { + "id": "83432825", + "title": "❤ Maron x Kurilin x N18 ❤", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/08/04/01/01/43/83432825_p0_square1200.jpg", + "description": "", + "tags": [ + "hentai", + "manga", + "tits", + "anime", + "dragonball", + "ドラゴンボール", + "oppai", + "おっぱい", + "18号", + "人造人間18号" + ], + "userId": "16220317", + "userName": "山本同人", + "width": 1283, + "height": 720, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#hentai ❤ Maron x Kurilin x N18 ❤ - 山本同人的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-08-04T01:01:43+09:00", + "updateDate": "2020-08-04T01:01:43+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/04/16/03/45/07/20540227_260df86a29841c0115d986a722323d35_50.jpg" + }, + { + "id": "70823889", + "title": "Elf girl エルフ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/09/23/04/25/07/70823889_p0_square1200.jpg", + "description": "", + "tags": [ + "おっぱい", + "巨乳", + "胸の谷間", + "挟まれたい谷間", + "爆乳", + "エルフ", + "boobs", + "breasts", + "tits", + "超次元ゲイム" + ], + "userId": "15037284", + "userName": "Kainkout", + "width": 868, + "height": 1220, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#おっぱい Elf girl エルフ - Kainkout的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-09-23T04:25:07+09:00", + "updateDate": "2018-09-23T04:25:07+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/04/14/03/57/23/18327182_b263676753b4f22ee2a32fd21ea61757_50.png" + }, + { + "id": "73213860", + "title": "Boulder Booty Pt.1 comic", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/02/16/13/40/37/73213860_p0_square1200.jpg", + "description": "", + "tags": [ + "toph", + "avatar", + "ass", + "big", + "tits", + "curvy", + "まんこ" + ], + "userId": "14726154", + "userName": "Modaw", + "width": 866, + "height": 806, + "pageCount": 9, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#toph Boulder Booty Pt.1 comic - Modaw的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-02-16T13:40:37+09:00", + "updateDate": "2019-02-16T13:40:37+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/08/19/02/04/29/16162970_de6477639e101045dc7994b840a0fd1a_50.png" + }, + { + "id": "56551573", + "title": "罪過の轟鳴", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/04/27/00/17/14/56551573_p0_square1200.jpg", + "description": "", + "tags": [ + "東方", + "鍵山雛", + "東方Project", + "東方風神録", + "Touhou", + "东方", + "厄をため込む程度の能力", + "東方Project250users入り", + "Touhou_Project", + "ハイセンス" + ], + "userId": "236979", + "userName": "七支刀しう", + "width": 800, + "height": 600, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#東方 罪過の轟鳴 - 七支刀しう的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-04-27T00:17:14+09:00", + "updateDate": "2016-04-27T00:17:14+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/01/17/21/27/54/15272213_f82ce518fb888fcc24e94b475dd1f18c_50.jpg" + }, + { + "id": "84222181", + "title": "お茶会", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/09/09/17/51/03/84222181_p0_square1200.jpg", + "description": "", + "tags": [ + "東方LostWordイラコン", + "東方Project", + "東方", + "touhou", + "Touhou_Project", + "八雲紫", + "茨木華扇", + "摩多羅隠岐奈", + "西行寺幽々子", + "ゆかぱい" + ], + "userId": "24929537", + "userName": "信仰", + "width": 6544, + "height": 3472, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#東方LostWordイラコン お茶会 - 信仰的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-09-07T20:28:26+09:00", + "updateDate": "2020-09-09T17:51:03+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/11/18/22/59/58/19690181_5e40f2ac69f95802985edd9ef4d0eb4f_50.jpg" + }, + { + "id": "90521833", + "title": "Broken", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/06/13/13/09/50/90521833_p0_square1200.jpg", + "description": "", + "tags": [ + "Touhou_Project", + "東方Project100users入り", + "西行寺幽々子", + "もっと評価されるべき" + ], + "userId": "18905574", + "userName": "Xumi", + "width": 3789, + "height": 2131, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#Touhou_Project Broken - Xumi的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-13T13:09:50+09:00", + "updateDate": "2021-06-13T13:09:50+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/01/10/03/48/23/16830342_f44fe0e501e17ef32b154b241b54fb05_50.jpg" + }, + { + "id": "73483984", + "title": "Bloodborne - A Song of Crows", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/03/03/10/32/58/73483984_p0_square1200.jpg", + "description": "", + "tags": [ + "ComicCover", + "ClipStudio", + "Traditionalart", + "CoverArt", + "Comicbookart", + "Comics", + "Soulsborne", + "ブラッドボーン", + "Bloodborne" + ], + "userId": "17785359", + "userName": "jeffstokely", + "width": 3155, + "height": 4807, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ComicCover Bloodborne - A Song of Crows - jeffstokely的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-03-03T10:32:58+09:00", + "updateDate": "2019-03-03T10:32:58+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/02/27/15/55/56/15457497_4352e6046ddc625e3e618602a04015a7_50.jpg" + }, + { + "id": "26064013", + "title": "Transformers prime fanart", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2012/03/25/11/04/59/26064013_p0_square1200.jpg", + "description": "", + "tags": [ + "transformers", + "prime", + "optimus", + "megatron", + "soundwave", + "ratchet", + "オプティマス", + "トランスフォーマー", + "メガトロン", + "トランスフォーマー500user入り" + ], + "userId": "3491516", + "userName": "ユラ(Kim yura )", + "width": 730, + "height": 1027, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#transformers Transformers prime fanart - ユラ(Kim yura )的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2012-03-25T11:04:59+09:00", + "updateDate": "2012-03-25T11:04:59+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/12/17/00/09/31/16714837_810f877e9b39e0155000bd0ca279c129_50.png" + }, + { + "id": "50067770", + "title": "トランスフォーマー ログ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2015/04/28/08/28/49/50067770_p0_square1200.jpg", + "description": "", + "tags": [ + "オプティマスプライム", + "ノックアウト", + "ウルトラマグナス", + "スタースクリーム", + "ホイルジャック", + "トランスフォーマー", + "transformers", + "メカ", + "トランスフォーマー500user入り", + "トランスフォーマー1000users入り" + ], + "userId": "3491516", + "userName": "ユラ(Kim yura )", + "width": 650, + "height": 876, + "pageCount": 14, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#オプティマスプライム トランスフォーマー ログ - ユラ(Kim yura )的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2015-04-28T08:28:49+09:00", + "updateDate": "2015-04-28T08:28:49+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/12/17/00/09/31/16714837_810f877e9b39e0155000bd0ca279c129_50.png" + }, + { + "id": "45571240", + "title": "Transformers Prime scientists", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2014/08/25/00/30/43/45571240_p0_square1200.jpg", + "description": "", + "tags": [ + "トランスフォーマー", + "プライム", + "transformers", + "ノックアウト", + "ショックウェーブ", + "ラチェット", + "トランスフォーマー500user入り", + "科学者", + "トランスフォーマープライム", + "トランスフォーマー1000users入り" + ], + "userId": "3491516", + "userName": "ユラ(Kim yura )", + "width": 800, + "height": 1600, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#トランスフォーマー Transformers Prime scientists - ユラ(Kim yura )的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2014-08-25T00:30:43+09:00", + "updateDate": "2014-08-25T00:30:43+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/12/17/00/09/31/16714837_810f877e9b39e0155000bd0ca279c129_50.png" + }, + { + "id": "57936213", + "title": "神様と男の子", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/07/16/21/21/33/57936213_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "人間×人外", + "オリジナル", + "続編希望", + "transfur", + "オリジナル10000users入り", + "衝撃のラスト" + ], + "userId": "18718654", + "userName": "四六がま野", + "width": 800, + "height": 1131, + "pageCount": 18, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#人間×人外 神様と男の子 - 四六がま野的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-07-16T21:21:33+09:00", + "updateDate": "2016-07-16T21:21:33+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/06/18/21/28/06/11082269_298a4059b38e1b64a39cd8857d0c034d_50.png" + }, + { + "id": "81973222", + "title": "山月記のクソ雑魚メンタルメスガキTF李徴の女体化", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/05/30/23/35/39/81973222_p0_square1200.jpg", + "description": "", + "tags": [ + "山月記", + "メスガキ", + "transfur", + "国語の教科書", + "擬獣化", + "女体化", + "教科書オールスターズ", + "だいたいあってる", + "属性の交通渋滞", + "李徴" + ], + "userId": "7499778", + "userName": "DiZ", + "width": 2332, + "height": 2924, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#山月記 山月記のクソ雑魚メンタルメスガキTF李徴の女体化 - DiZ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-05-30T23:35:39+09:00", + "updateDate": "2020-05-30T23:35:39+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/01/13/04/37/36/19994816_9af9107dfd594e24fada419d2cafecd9_50.jpg" + }, + { + "id": "53601510", + "title": "Level ケモナー", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2015/11/17/16/48/57/53601510_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "佐天涙子", + "とある科学の超電磁砲", + "ケモノ", + "メスケモ", + "続編希望", + "transfur", + "18禁版希望", + "続編期待", + "とある1000users入り" + ], + "userId": "5773248", + "userName": "川上真樹", + "width": 1559, + "height": 2196, + "pageCount": 14, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#佐天涙子 Level ケモナー - 川上真樹的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2015-11-17T16:48:57+09:00", + "updateDate": "2015-11-17T16:48:57+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/11/04/13/15/15/8586058_1ee0b06f1e31520d420097d039e687c5_50.jpg" + }, + { + "id": "73518990", + "title": "白上フブキ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/03/05/03/09/55/73518990_p0_square1200.jpg", + "description": "", + "tags": [ + "VTuber", + "バーチャルYouTuber", + "白上フブキ", + "寝起き", + "腋", + "咥え髪留め", + "狐耳", + "おへそ", + "バーチャルYouTuber100000users入り", + "ホロライブ" + ], + "userId": "19880053", + "userName": "れいなま", + "width": 913, + "height": 1500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#VTuber 白上フブキ - れいなま的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-03-05T03:09:55+09:00", + "updateDate": "2019-03-05T03:09:55+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://s.pximg.net/common/images/no_profile_s.png" + }, + { + "id": "83603397", + "title": "雪花ラミィ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/08/11/17/02/07/83603397_p0_square1200.jpg", + "description": "", + "tags": [ + "ホロライブ", + "雪花ラミィ", + "VTuber", + "バーチャルYouTuber", + "マニキュア", + "ウィンク", + "圧倒的胸囲", + "本家", + "バーチャルYouTuber50000users入り" + ], + "userId": "4754550", + "userName": "リン☆ユウ@新刊通販委託中", + "width": 1489, + "height": 1326, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ホロライブ 雪花ラミィ - リン☆ユウ@新刊通販委託中的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-08-11T17:02:07+09:00", + "updateDate": "2020-08-11T17:02:07+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/10/06/12/04/30/9964580_13765b1f2f2796a014f43072b7316d3f_50.png" + }, + { + "id": "83442129", + "title": "【創作】新人Vと新人に感情ぐちゃぐちゃにされるVTuber", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/08/04/17/00/01/83442129_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "オリジナル", + "限界化", + "続きを正座待機", + "VTuber", + "職質などとんでもない", + "すし", + "反応が限界オタクのそれ", + "オリジナル50000users入り", + "…好き…" + ], + "userId": "22479045", + "userName": "ミキマキ", + "width": 607, + "height": 894, + "pageCount": 7, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#オリジナル 【創作】新人Vと新人に感情ぐちゃぐちゃにされるVTuber - ミキマキ的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-08-04T17:00:01+09:00", + "updateDate": "2020-08-04T17:00:01+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/04/11/14/06/05/15636342_add07575cc3a5b8a70fbd7b66ce31e17_50.jpg" + }, + { + "id": "73593539", + "title": "Panzer Commander", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/03/09/21/03/18/73593539_p0_square1200.jpg", + "description": "", + "tags": [ + "制服", + "女の子", + "ドイツ", + "落書き", + "ww2", + "国防軍", + "戦乙女", + "オリジナル1000users入り" + ], + "userId": "8194684", + "userName": "Tuziki兔子或是熊?!", + "width": 1132, + "height": 1436, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#制服 Panzer Commander - Tuziki兔子或是熊?!的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-03-09T21:03:18+09:00", + "updateDate": "2019-03-09T21:03:18+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/09/14/23/22/38/19359853_ab4e92dc7c8e144ab6a0de7c072b9c03_50.jpg" + }, + { + "id": "82266993", + "title": "どうぶつの森", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/06/12/17/45/55/82266993_p0_square1200.jpg", + "description": "", + "tags": [ + "どうぶつの森", + "水彩画", + "兄妹", + "双子", + "あつ森", + "なにこれ素敵", + "なにこれあったかい", + "兄妹愛", + "どうぶつの森10000users入り", + "なにこれ微笑ましい" + ], + "userId": "11980572", + "userName": "ハヌル", + "width": 1800, + "height": 2450, + "pageCount": 4, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#どうぶつの森 どうぶつの森 - ハヌル的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-06-12T17:45:55+09:00", + "updateDate": "2020-06-12T17:45:55+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/07/12/14/48/55/14476391_2eaa83fc1356493491cb9bfb16a8aa1b_50.png" + }, + { + "id": "81593683", + "title": "ちゃちゃまる無人島0円生活", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/05/16/01/50/31/81593683_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "あつまれどうぶつの森", + "あつ森", + "ちゃちゃまる" + ], + "userId": "2684343", + "userName": "茜りう@LINEスタンプ販売中", + "width": 2823, + "height": 3686, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#あつまれどうぶつの森 ちゃちゃまる無人島0円生活 - 茜りう@LINEスタンプ販売中的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-05-16T01:50:31+09:00", + "updateDate": "2020-05-16T01:50:31+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/04/29/09/33/32/18437102_375b05f292258036ea004fae26b1741d_50.jpg" + }, + { + "id": "82753312", + "title": "離島ガチャ", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/07/04/22/34/06/82753312_p0_square1200.jpg", + "description": "", + "tags": [ + "あつ森", + "どうぶつの森", + "ジャック", + "ジャック(どうぶつの森)", + "何これ素敵", + "どうぶつの森5000users入り" + ], + "userId": "54779330", + "userName": "muty", + "width": 900, + "height": 1200, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#あつ森 離島ガチャ - muty的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-07-04T22:34:06+09:00", + "updateDate": "2020-07-04T22:34:06+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/10/13/23/21/19/19507253_a2e5e619860f928b4ad36bbdf5ea9592_50.jpg" + }, + { + "id": "67407348", + "title": "dnf", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/03/18/18/29/18/67407348_p0_square1200.jpg", + "description": "", + "tags": [ + "dnf", + "던파", + "w.gunner", + "여거너", + "地下城与勇士", + "魅惑の谷間", + "アラド戦記", + "おっぱい", + "極上の女体", + "アラド戦記400000users入り" + ], + "userId": "18380615", + "userName": "monaim", + "width": 1500, + "height": 1539, + "pageCount": 4, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#dnf dnf - monaim的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-02-22T21:00:23+09:00", + "updateDate": "2018-03-18T18:29:18+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/04/05/01/17/47/12372343_109f075bfce6c2c08a3490f8002c472f_50.png" + }, + { + "id": "60865838", + "title": "ジャンヌ・ダルク", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/01/10/00/08/06/60865838_p0_square1200.jpg", + "description": "", + "tags": [ + "Fate/GrandOrder", + "ジャンヌ・ダルク", + "Fate/Apocrypha", + "版権", + "ジャンヌ・ダルク(Fate)", + "聖女", + "Fate/GO100000users入り", + "Fate/Apocrypha100000users入り", + "おっぱい", + "着衣巨乳" + ], + "userId": "64561", + "userName": "有坂", + "width": 984, + "height": 1403, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#Fate/GrandOrder ジャンヌ・ダルク - 有坂的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-01-10T00:08:06+09:00", + "updateDate": "2017-01-10T00:08:06+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/04/09/01/08/17/20502579_f6c2186e0985d1506ee39bc6e7290993_50.jpg" + }, + { + "id": "71431430", + "title": "すとぷりTwitter落書き詰め", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/10/31/11/45/17/71431430_p0_square1200.jpg", + "description": "", + "tags": [ + "歌い手", + "ころん", + "さとみ", + "すとぷり", + "やっぱころちゃんの可愛さを知るべき!", + "さとちゃんがバカみたいに可愛ええよ!" + ], + "userId": "9742249", + "userName": "壷漬け", + "width": 1000, + "height": 1000, + "pageCount": 8, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#歌い手 すとぷりTwitter落書き詰め - 壷漬け的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-10-31T11:45:17+09:00", + "updateDate": "2018-10-31T11:45:17+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/06/22/22/53/45/15921856_105472de1df9185cdc8427dedf50894c_50.jpg" + }, + { + "id": "67271336", + "title": "ハッピーバレンタイン!", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/02/14/18/12/14/67271336_p0_square1200.jpg", + "description": "", + "tags": [ + "莉犬", + "ころん", + "歌い手", + "すとぷり", + "歌い手1000users入り", + "やっぱころちゃんの可愛さを知るべき!", + "もう…莉犬君が可愛いって言わせんなばかぁ!" + ], + "userId": "7841181", + "userName": "しずく茶", + "width": 1024, + "height": 722, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#莉犬 ハッピーバレンタイン! - しずく茶的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-02-14T18:12:14+09:00", + "updateDate": "2018-02-14T18:12:14+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/08/16/20/46/31/14644166_2029535e0e668611456c328f286a2b6a_50.jpg" + }, + { + "id": "77385145", + "title": "すとぷりlog4", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/10/20/12/30/34/77385145_p0_square1200.jpg", + "description": "", + "tags": [ + "すとぷり", + "ころん", + "さとみ", + "ななもり。", + "るぅと", + "ジェル", + "莉犬" + ], + "userId": "10860103", + "userName": "来茶", + "width": 1206, + "height": 892, + "pageCount": 33, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#すとぷり すとぷりlog4 - 来茶的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-10-20T12:30:34+09:00", + "updateDate": "2019-10-20T12:30:34+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/05/27/20/50/37/20774358_2422228e00c9f2808c5e1ed8e1b30754_50.jpg" + }, + { + "id": "87045706", + "title": "19歳の夢見りあむと、26歳の佐藤心", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/01/14/18/20/14/87045706_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "デレステ", + "アイドルマスターシンデレラガールズ", + "夢見りあむ", + "佐藤心", + "しゅがーはぁと", + "しゅがりあ", + "泣けるモバマス", + "アイマス5000users入り" + ], + "userId": "20154152", + "userName": "夏目げんり👑げりっちゃん", + "width": 2516, + "height": 4096, + "pageCount": 5, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#デレステ 19歳の夢見りあむと、26歳の佐藤心 - 夏目げんり👑げりっちゃん的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-01-14T18:20:14+09:00", + "updateDate": "2021-01-14T18:20:14+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/01/15/23/01/12/20009204_c2c43abbb35d8dafb0d62bd326caaf20_50.jpg" + }, + { + "id": "85779247", + "title": "PINK", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/20/06/20/28/85779247_p0_square1200.jpg", + "description": "", + "tags": [ + "にじさんじ", + "笹木咲", + "魔界ノりりむ", + "椎名唯華", + "バーチャルYouTuber", + "ピンク", + "バーチャルYouTuber50000users入り" + ], + "userId": "1193008", + "userName": "望月けい", + "width": 2459, + "height": 1788, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#にじさんじ PINK - 望月けい的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-20T06:20:28+09:00", + "updateDate": "2020-11-20T06:20:28+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/05/18/21/31/16/9381806_44583aff765acd5db042696bfd279371_50.jpg" + }, + { + "id": "79024638", + "title": "妄メントA", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/01/21/22/00/12/79024638_p0_square1200.jpg", + "description": "", + "tags": [ + "にじさんじ", + "にじさんじ妄想トーナメント戦", + "葛葉", + "なにこれかっこいい", + "バーチャルYouTuber10000users入り", + "剣持刀也", + "バーチャルYouTuber30000users入り", + "なにこれすごい" + ], + "userId": "3605360", + "userName": "名智ゆいち", + "width": 1530, + "height": 2360, + "pageCount": 4, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#にじさんじ 妄メントA - 名智ゆいち的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-01-21T22:00:12+09:00", + "updateDate": "2020-01-21T22:00:12+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/08/11/21/11/12/16127978_f9d037ce4dc07502c4443b6eb4694d37_50.jpg" + }, + { + "id": "84419825", + "title": "京と秋のにじさんじ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/09/17/00/20/10/84419825_p0_square1200.jpg", + "description": "", + "tags": [ + "にじさんじ", + "加賀美ハヤト", + "ジョー・力一", + "剣持刀也", + "叶/葉加瀬冬雪/夜見れな/舞元啓介", + "バーチャルYouTuber10000users入り" + ], + "userId": "1193008", + "userName": "望月けい", + "width": 1736, + "height": 2201, + "pageCount": 8, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#にじさんじ 京と秋のにじさんじ - 望月けい的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-09-17T00:20:10+09:00", + "updateDate": "2020-09-17T00:20:10+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/05/18/21/31/16/9381806_44583aff765acd5db042696bfd279371_50.jpg" + }, + { + "id": "70582093", + "title": "りゅうこ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/09/07/18/00/38/70582093_p0_square1200.jpg", + "description": "", + "tags": [ + "キルラキル", + "纏流子", + "流子", + "鮮血", + "アナログ", + "らくがき", + "なにこれすごい", + "鮮血(キルラキル)", + "キルラキル10000users入り" + ], + "userId": "3869665", + "userName": "河CY", + "width": 815, + "height": 1024, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#キルラキル りゅうこ - 河CY的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-09-07T18:00:38+09:00", + "updateDate": "2018-09-07T18:00:38+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/05/31/14/38/50/11002845_8506eb1a3648f39fdf399e749988688b_50.jpg" + }, + { + "id": "77491275", + "title": "赤子炭治郎と上弦の話", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/10/26/22/25/15/77491275_p0_square1200.jpg", + "description": "", + "tags": [ + "アナログ", + "腐滅の刃", + "上弦×炭", + "スクロールバーが仕事しない", + "腐滅の刃30000users入り" + ], + "userId": "4851699", + "userName": "miyazawa", + "width": 575, + "height": 1024, + "pageCount": 11, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#アナログ 赤子炭治郎と上弦の話 - miyazawa的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-10-26T22:25:15+09:00", + "updateDate": "2019-10-26T22:25:15+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/06/12/12/55/28/18810667_6cda7403ba80f2092a06fdf3f50623d8_50.jpg" + }, + { + "id": "13754871", + "title": "秋の水彩テクスチャ集", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2010/10/09/00/55/29/13754871_p0_square1200.jpg", + "description": "", + "tags": [ + "商用利用可", + "キセツチャ", + "テクスチャ", + "使ってもいいのよ", + "フリー素材", + "アナログ", + "フリー素材1000users入り", + "透明水彩", + "フリー素材5000users入り", + "フリー素材10000users入り" + ], + "userId": "59219", + "userName": "夏香子", + "width": 1200, + "height": 800, + "pageCount": 30, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#商用利用可 秋の水彩テクスチャ集 - 夏香子的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2010-10-09T00:55:29+09:00", + "updateDate": "2010-10-09T00:55:29+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/05/30/22/36/16/7930504_65465580cf6e504db243dec801b8aefa_50.png" + }, + { + "id": "80431317", + "title": "ツイステ保育園", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/03/29/18/49/12/80431317_p0_square1200.jpg", + "description": "", + "tags": [ + "イラスト", + "ツイステッドワンダーランド", + "フロイド", + "ジェイド", + "ツイステ", + "ディア・クロウリー", + "幼児化", + "フロイド・リーチ", + "ジェイド・リーチ" + ], + "userId": "30857749", + "userName": "ぐら ぺぴ子", + "width": 768, + "height": 1024, + "pageCount": 4, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#イラスト ツイステ保育園 - ぐら ぺぴ子的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-03-29T18:49:12+09:00", + "updateDate": "2020-03-29T18:49:12+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/04/11/00/51/02/20513177_deec0cef61b47c0b51696cf2a173dcff_50.jpg" + }, + { + "id": "57877623", + "title": "星つかみ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/07/07/17/38/35/57877623_p0_square1200.jpg", + "description": "", + "tags": [ + "背景", + "風景", + "オリジナル", + "廃墟", + "天の川", + "C90", + "オリジナル50000users入り", + "風景50000users入り", + "イラスト" + ], + "userId": "648285", + "userName": "mocha@「背景作画」改訂版", + "width": 636, + "height": 1908, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#背景 星つかみ - mocha@「背景作画」改訂版的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-07-13T00:08:41+09:00", + "updateDate": "2019-07-07T17:38:35+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/11/28/18/38/41/11807428_38b7d5ff662fd4b00c25ed608332a0e9_50.jpg" + }, + { + "id": "74650454", + "title": "星は港に満ちる", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/05/10/00/34/42/74650454_p0_square1200.jpg", + "description": "", + "tags": [ + "背景", + "風景", + "オリジナル", + "天の川", + "星空", + "水鏡", + "ふつくしい", + "オリジナル50000users入り", + "風景50000users入り", + "イラスト" + ], + "userId": "648285", + "userName": "mocha@「背景作画」改訂版", + "width": 992, + "height": 1398, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#背景 星は港に満ちる - mocha@「背景作画」改訂版的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-05-10T00:34:42+09:00", + "updateDate": "2019-05-10T00:34:42+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/11/28/18/38/41/11807428_38b7d5ff662fd4b00c25ed608332a0e9_50.jpg" + }, + { + "id": "89657320", + "title": "ライスシャワー", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/05/07/00/05/04/89657320_p0_custom1200.jpg", + "description": "", + "tags": [ + "ライスシャワー(ウマ娘)", + "ウマ娘プリティーダービー", + "ウマ娘", + "鳥籠", + "薔薇", + "青薔薇", + "祝福の名", + "ウマ娘プリティーダービー30000users入り", + "守護らねば" + ], + "userId": "341433", + "userName": "Nardack", + "width": 1080, + "height": 1920, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ライスシャワー(ウマ娘) ライスシャワー - Nardack的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-07T00:04:25+09:00", + "updateDate": "2021-05-07T00:05:04+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/04/07/00/08/27/20490701_3049d470ede5ccbe35c35b1f904c02e9_50.jpg" + }, + { + "id": "90263277", + "title": ".", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/06/02/02/48/48/90263277_p0_square1200.jpg", + "description": "", + "tags": [ + "ウマ娘", + "サイレンススズカ", + "サイレンススズカ(ウマ娘)", + "ウマ娘プリティーダービー", + "ウマ娘プリティーダービー10000users入り" + ], + "userId": "6558698", + "userName": "siki", + "width": 2500, + "height": 3584, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ウマ娘 . - siki的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-02T02:48:48+09:00", + "updateDate": "2021-06-02T02:48:48+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/03/15/03/32/07/20359533_74b079be00fb724ad35b54f43281547e_50.jpg" + }, + { + "id": "89694199", + "title": "ウマ娘まとめ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/05/08/18/36/04/89694199_p0_square1200.jpg", + "description": "", + "tags": [ + "ウマ娘プリティーダービー", + "ウマ娘", + "サトノダイヤモンド(ウマ娘)", + "キタサンブラック(ウマ娘)", + "サイレンススズカ(ウマ娘)", + "ミホノブルボン(ウマ娘)", + "スーパークリーク(ウマ娘)", + "メジロマックイーン(ウマ娘)", + "ウマ娘プリティーダービー10000users入り" + ], + "userId": "8129277", + "userName": "Sak", + "width": 7067, + "height": 5584, + "pageCount": 6, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ウマ娘プリティーダービー ウマ娘まとめ - Sak的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-08T18:36:04+09:00", + "updateDate": "2021-05-08T18:36:04+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/10/29/16/01/09/19584193_a04c8fff7691481790e49876dfdb6d82_50.png" + }, + { + "id": "89197783", + "title": "ダイワスカーレット", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/04/17/03/59/07/89197783_p0_square1200.jpg", + "description": "", + "tags": [ + "ダイワスカーレット", + "ダイワスカーレット(ウマ娘)", + "極上の乳", + "ウマ娘プリティーダービー", + "スク水", + "プール", + "横乳", + "水着ウマ娘", + "ウマ娘プリティーダービー10000users入り" + ], + "userId": "4338012", + "userName": "hews", + "width": 1079, + "height": 1737, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ダイワスカーレット ダイワスカーレット - hews的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-04-17T03:59:07+09:00", + "updateDate": "2021-04-17T03:59:07+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/11/15/08/09/24/19670750_c735c3c5dfd1299a26faf92b7a81064e_50.jpg" + }, + { + "id": "89682656", + "title": "最近描いたウマ娘まとめ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/05/08/04/06/06/89682656_p0_square1200.jpg", + "description": "", + "tags": [ + "ウマ娘", + "ウマ娘プリティーダービー", + "ライスシャワー(ウマ娘)", + "メジロマックイーン(ウマ娘)", + "ゴールドシップ(ウマ娘)", + "ハルウララ(ウマ娘)", + "スペシャルウィーク(ウマ娘)", + "ツインターボ(ウマ娘)", + "トウカイテイオー(ウマ娘)", + "ウマ娘プリティーダービー30000users入り" + ], + "userId": "29942", + "userName": "日下氏", + "width": 1500, + "height": 1179, + "pageCount": 15, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ウマ娘 最近描いたウマ娘まとめ - 日下氏的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-08T04:06:06+09:00", + "updateDate": "2021-05-08T04:06:06+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/07/19/06/28/06/21062839_2d3f239a9ac892d848a3ed1b3760041b_50.png" + }, + { + "id": "88742579", + "title": "ゴルシ意味わからん…でも好き…", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/04/12/09/25/13/88742579_p0_custom1200.jpg", + "description": "", + "tags": [ + "ウマ娘", + "ウマ娘プリティーダービー", + "ゴルシ", + "ゴールドシップ(ウマ娘)", + "ゴールドシップ", + "だいたいあってる", + "120億円事件", + "まぁゴルシだし", + "ウマ娘プリティーダービー30000users入り", + "黙れば美人、喋ると奇人、走る姿は不沈艦" + ], + "userId": "7092420", + "userName": "あんの", + "width": 992, + "height": 2159, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ウマ娘 ゴルシ意味わからん…でも好き… - あんの的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-03-27T20:47:22+09:00", + "updateDate": "2021-04-12T09:25:13+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/05/02/16/05/49/18460195_633168591c4c2be9cb3f0637c052887e_50.jpg" + }, + { + "id": "62800098", + "title": "Θ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/05/08/00/22/23/62800098_p0_square1200.jpg", + "description": "", + "tags": [ + "女の子", + "オリジナル", + "白髪", + "オリキャラ", + "創作", + "本", + "モノクル", + "オリジナル10000users入り", + "色白" + ], + "userId": "1831843", + "userName": "尾上廉", + "width": 1853, + "height": 3038, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#女の子 Θ - 尾上廉的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-05-08T00:22:23+09:00", + "updateDate": "2017-05-08T00:22:23+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/05/15/00/08/34/20701142_7b7afb7037477ec86cf1da84d9a7d46b_50.jpg" + }, + { + "id": "61444625", + "title": "【オリキャラねつ造注意】おそ娘ちゃん、おそ松に会いに行く", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/02/14/06/46/02/61444625_p0_square1200.jpg", + "description": "", + "tags": [ + "おそカラ", + "パパ松", + "パパカラ", + "BL松", + "不覚にも泣いてしまった", + "オリキャラ", + "BL松10000users入り" + ], + "userId": "1862466", + "userName": "しら", + "width": 705, + "height": 1000, + "pageCount": 41, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#おそカラ 【オリキャラねつ造注意】おそ娘ちゃん、おそ松に会いに行く - しら的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-02-14T06:46:02+09:00", + "updateDate": "2017-02-14T06:46:02+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/01/16/00/39/29/12013715_d0b758f49f65fefc514213479eaf2f7b_50.png" + }, + { + "id": "65894188", + "title": "おまカプ", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/11/15/08/27/36/65894188_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "オリキャラ設定メモ", + "オリキャラ", + "創作", + "平和", + "控えめに言って最高", + "あなたが神か", + "おまカプ", + "オリジナル10000users入り", + "最高かよ" + ], + "userId": "2937627", + "userName": "タロウ・マドロミ", + "width": 1000, + "height": 1412, + "pageCount": 5, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#オリキャラ設定メモ おまカプ - タロウ・マドロミ的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-11-14T21:00:01+09:00", + "updateDate": "2017-11-15T08:27:36+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/12/18/18/59/14/13577161_2aa7cd40c588b2ccf6a02cf60b2a9fc4_50.png" + }, + { + "id": "84116049", + "title": "雪花ラミィ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/09/03/00/00/06/84116049_p0_square1200.jpg", + "description": "", + "tags": [ + "雪花ラミィ", + "hololive", + "ホロライブ", + "バーチャルYouTuber", + "ふともも", + "Vtuber", + "ミュシャ風", + "バーチャルYouTuber50000users入り", + "本家" + ], + "userId": "4754550", + "userName": "リン☆ユウ@新刊通販委託中", + "width": 1018, + "height": 1903, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#雪花ラミィ 雪花ラミィ - リン☆ユウ@新刊通販委託中的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-09-03T00:00:06+09:00", + "updateDate": "2020-09-03T00:00:06+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/10/06/12/04/30/9964580_13765b1f2f2796a014f43072b7316d3f_50.png" + }, + { + "id": "85423310", + "title": "にじさんじまとめ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/03/00/04/16/85423310_p0_square1200.jpg", + "description": "", + "tags": [ + "にじさんじ", + "バーチャルYouTuber", + "月ノ美兎/周央サンゴ/竜胆尊/魔界ノりりむ/鈴原るる", + "みつあみ", + "シスタークレア", + "バーチャルYouTuber50000users入り", + "シスター・クレア" + ], + "userId": "10495320", + "userName": "かやはら", + "width": 860, + "height": 1000, + "pageCount": 6, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#にじさんじ にじさんじまとめ - かやはら的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-03T00:04:16+09:00", + "updateDate": "2020-11-03T00:04:16+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/01/12/07/24/25/11996565_05d32d8788bda5d9b98f328f0d462a83_50.png" + }, + { + "id": "70352399", + "title": "log4", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/08/24/00/00/15/70352399_p0_square1200.jpg", + "description": "", + "tags": [ + "オリジナル", + "VTuber", + "バーチャルYouTuber", + "ホロライブ", + "白上フブキ", + "狐耳", + "オリジナル50000users入り", + "バーチャルYouTuber50000users入り", + "hololive" + ], + "userId": "8189060", + "userName": "凪白みと", + "width": 896, + "height": 1487, + "pageCount": 23, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#オリジナル log4 - 凪白みと的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-08-24T00:00:15+09:00", + "updateDate": "2018-08-24T00:00:15+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/04/20/14/52/16/12442990_d1f845924e29f9f7f3e6376650783404_50.png" + }, + { + "id": "82618568", + "title": "兎田ぺこら +", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2020/06/28/16/37/26/82618568_p0_custom1200.jpg", + "description": "", + "tags": [ + "バーチャルYouTuber", + "ホロライブ", + "兎田ぺこら", + "宝鐘マリン", + "潤羽るしあ", + "夏色まつり", + "百鬼あやめ", + "水着", + "バーチャルYouTuber50000users入り", + "腋" + ], + "userId": "176825", + "userName": "Seicoh", + "width": 2048, + "height": 3280, + "pageCount": 10, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#バーチャルYouTuber 兎田ぺこら + - Seicoh的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-06-28T16:37:26+09:00", + "updateDate": "2020-06-28T16:37:26+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/04/25/14/26/25/18409164_fbf5207baf4d06802026bca7a5fcba31_50.png" + }, + { + "id": "41805526", + "title": "とうちゃん", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2014/02/22/23/03/59/41805526_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "ポケモン", + "リザードン", + "なにこれあったかい", + "涙腺崩壊", + "なにこれ素敵", + "目からハイドロカノン", + "ヒトカゲ", + "ポケモン100000users入り", + "衝撃のラスト" + ], + "userId": "1119595", + "userName": "真吉", + "width": 500, + "height": 800, + "pageCount": 11, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ポケモン とうちゃん - 真吉的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2014-02-22T23:03:59+09:00", + "updateDate": "2014-02-22T23:03:59+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2009/08/11/14/20/43/994304_33953b9e90d87e8915b4b6003f789df3_50.jpg" + }, + { + "id": "17104931", + "title": "ポケモン15thアアアアアアアアアアアアアアアアアアアアアアアア", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2011/03/04/00/19/38/17104931_p0_square1200.jpg", + "description": "", + "tags": [ + "ポケモン15周年", + "色違い", + "ポケモン", + "クリック推奨", + "愛しか感じない", + "目からハイドロカノン", + "愛がなければ描けない", + "版権", + "ポケモン100000users入り", + "ポケモンだいすきクラブ" + ], + "userId": "497532", + "userName": "ココロコ", + "width": 2027, + "height": 2011, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ポケモン15周年 ポケモン15thアアアアアアアアアアアアアアアアアアアアアアアア - ココロコ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2011-03-04T00:19:38+09:00", + "updateDate": "2011-03-04T00:19:38+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/11/02/02/22/07/8576035_b6e687980724b79aabc96854e61fedff_50.png" + }, + { + "id": "14231474", + "title": "男女主人公まとめ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2010/10/31/04/02/38/14231474_p0_square1200.jpg", + "description": "", + "tags": [ + "ポケモン", + "なにこれかわいい", + "いろいろと達観してしまったユウキ", + "なにこれ素敵", + "男前なブルーさん", + "お姫様が抱っこ", + "歪みないレッド", + "ポケモン50000users入り", + "ユウキ(トレーナー)" + ], + "userId": "1201348", + "userName": "m@オレサマヨウスケマルカジリ", + "width": 5000, + "height": 800, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ポケモン 男女主人公まとめ - m@オレサマヨウスケマルカジリ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2010-10-31T04:02:38+09:00", + "updateDate": "2010-10-31T04:02:38+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2011/06/04/21/56/44/3209897_3a40547df0e2a2c7972a46514555cabd_50.jpg" + }, + { + "id": "57800451", + "title": "山姥切国広と歌仙兼定", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/07/08/15/30/53/57800451_p0_square1200.jpg", + "description": "", + "tags": [ + "刀剣乱舞", + "山姥切国広", + "歌仙兼定", + "なにこれ素敵", + "100点でも足りない", + "目から冷却材", + "なにこれ雅", + "刀剣乱舞100000users入り", + "貴方が神か" + ], + "userId": "8269746", + "userName": "こまどりもどき", + "width": 508, + "height": 700, + "pageCount": 58, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#刀剣乱舞 山姥切国広と歌仙兼定 - こまどりもどき的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-07-08T15:30:53+09:00", + "updateDate": "2016-07-08T15:30:53+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2013/09/06/20/27/38/6779858_5c5846f61b4d33b80b611988f3bc3b0f_50.png" + }, + { + "id": "50379267", + "title": "ツイログ", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2015/05/15/02/23/13/50379267_p0_square1200.jpg", + "description": "", + "tags": [ + "刀剣乱舞", + "岩融", + "へし切長谷部", + "歌仙兼定", + "弁慶", + "目から冷却材", + "女子力", + "10点じゃ足りない", + "刀剣乱舞100000users入り", + "ちょっと中尊寺拝んでくる泣" + ], + "userId": "13779971", + "userName": "Z豚", + "width": 700, + "height": 933, + "pageCount": 10, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#刀剣乱舞 ツイログ - Z豚的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2015-05-15T02:17:38+09:00", + "updateDate": "2015-05-15T02:23:13+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/03/01/19/28/59/9037674_23c9eba0cdf3b5787716929e34499321_50.png" + }, + { + "id": "48559220", + "title": "【クロスオーバー】しょたじじと日本が描きたかっただけの", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2015/02/04/22/59/39/48559220_p0_square1200.jpg", + "description": "", + "tags": [ + "クロスオーバー", + "ヘタリア", + "刀剣乱舞", + "刀剣ヘタ", + "刀剣乱舞10000users入り" + ], + "userId": "1324853", + "userName": "甘酒", + "width": 717, + "height": 1004, + "pageCount": 7, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#クロスオーバー 【クロスオーバー】しょたじじと日本が描きたかっただけの - 甘酒的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2015-02-04T22:59:39+09:00", + "updateDate": "2015-02-04T22:59:39+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/10/03/14/08/21/19452774_96a9d66e4365306bf0ede2f5219fd6ce_50.png" + }, + { + "id": "67260707", + "title": "エジプト魔女の逆襲譚 【魔女集会】", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/02/14/00/49/39/67260707_p0_square1200.jpg", + "description": "", + "tags": [ + "魔女集会で会いましょう", + "創作", + "オリジナル", + "魔女", + "エジプト", + "漫画", + "優しい世界", + "100点でも足りない", + "魔女集会200000users入り", + "おばぁちゃまとお呼び" + ], + "userId": "20822524", + "userName": "森下真", + "width": 1240, + "height": 1754, + "pageCount": 4, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#魔女集会で会いましょう エジプト魔女の逆襲譚 【魔女集会】 - 森下真的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-02-14T00:49:39+09:00", + "updateDate": "2018-02-14T00:49:39+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/10/28/15/26/57/11676440_9ae175195d5967387f6409ad620a33f1_50.jpg" + }, + { + "id": "74481708", + "title": "「それじゃあな、 元気でな!」", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/05/01/01/20/43/74481708_p0_square1200.jpg", + "description": "", + "tags": [ + "オリジナル", + "創作", + "元号", + "平成", + "令和", + "全員終号", + "ありがとう平成", + "オリジナル100000users入り", + "あぁぁ我らが平成ーーッ!!", + "新しい時代の幕開け" + ], + "userId": "20822524", + "userName": "森下真", + "width": 2048, + "height": 1450, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#オリジナル 「それじゃあな、 元気でな!」 - 森下真的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-05-01T01:20:43+09:00", + "updateDate": "2019-05-01T01:20:43+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/10/28/15/26/57/11676440_9ae175195d5967387f6409ad620a33f1_50.jpg" + }, + { + "id": "74478908", + "title": "メバル", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/05/01/00/01/00/74478908_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "創作", + "伝説の始まり", + "なにこれかっこいい", + "オリジナル50000users入り", + "オリジナル100000users入り", + "ドMホイホイ" + ], + "userId": "23975745", + "userName": "一", + "width": 2894, + "height": 4093, + "pageCount": 32, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#創作 メバル - 一的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-05-01T00:01:00+09:00", + "updateDate": "2019-05-01T00:01:00+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://s.pximg.net/common/images/no_profile_s.png" + }, + { + "id": "84602943", + "title": "刻晴", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/09/25/19/25/49/84602943_p0_square1200.jpg", + "description": "", + "tags": [ + "刻晴", + "女の子", + "黒タイツ", + "原神", + "ソックス足裏", + "美脚", + "足チョコ", + "足指", + "原神100000users入り" + ], + "userId": "21505771", + "userName": "乌橄榄菜", + "width": 2480, + "height": 3600, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#刻晴 刻晴 - 乌橄榄菜的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-09-25T19:25:49+09:00", + "updateDate": "2020-09-25T19:25:49+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/02/21/18/34/40/17964437_c67677aff44fd21bd08ff9829a2923b8_50.jpg" + }, + { + "id": "85085701", + "title": "刻晴", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/10/18/13/00/00/85085701_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "女の子", + "I字バランス", + "刻晴", + "タイツ", + "黒スト", + "尻神様", + "腋", + "原神10000users入り", + "原神50000users入り" + ], + "userId": "4023292", + "userName": "苏翼丶", + "width": 2894, + "height": 4093, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 刻晴 - 苏翼丶的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-18T13:00:00+09:00", + "updateDate": "2020-10-18T13:00:00+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/11/13/23/44/44/19663797_a123bd2921301b98148b46f11d055d17_50.jpg" + }, + { + "id": "85633671", + "title": "原神头像", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/13/01/32/47/85633671_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "刻晴", + "フィッシュル(原神)", + "クレー(原神)", + "可莉", + "七七", + "lumine", + "刻晴(原神)", + "原神50000users入り", + "バーバラ/ジン・グンヒルド/ウェンティ/空/蛍" + ], + "userId": "6657532", + "userName": "QuAn_", + "width": 700, + "height": 700, + "pageCount": 9, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 原神头像 - QuAn_的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-13T01:32:47+09:00", + "updateDate": "2020-11-13T01:32:47+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/02/06/23/42/39/17873112_8ab94db64257ce869d75e525eab9fb39_50.jpg" + }, + { + "id": "63120410", + "title": "ぎゅっとしている紗霧ちゃんをぎゅっとしたい", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/05/29/00/37/30/63120410_p0_square1200.jpg", + "description": "", + "tags": [ + "エロマンガ先生", + "和泉紗霧", + "ぬいぐるみ", + "魅惑のふともも", + "横臥", + "恥じらい", + "プリケツ", + "女の子", + "エロマンガ先生400000users入り" + ], + "userId": "21076169", + "userName": "秋タケ", + "width": 707, + "height": 1000, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#エロマンガ先生 ぎゅっとしている紗霧ちゃんをぎゅっとしたい - 秋タケ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-05-29T00:37:30+09:00", + "updateDate": "2017-05-29T00:37:30+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/04/20/14/10/56/12442839_e74beebe662a733d7a06cf66c5928d4a_50.jpg" + }, + { + "id": "54618347", + "title": "黒タイツ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/01/09/11/50/00/54618347_p0_square1200.jpg", + "description": "", + "tags": [ + "女の子", + "女子高生", + "黒髪ロング", + "黒タイツ", + "美脚", + "裾上げタイツ脱ぎ", + "オリジナル", + "JK", + "制服", + "オリジナル200000users入り" + ], + "userId": "409226", + "userName": "KRSK", + "width": 944, + "height": 1280, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#女の子 黒タイツ - KRSK的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-01-09T11:50:00+09:00", + "updateDate": "2016-01-09T11:50:00+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2013/04/05/17/39/54/6068280_2d621c6f7278a350b2fc61337ed23fdc_50.png" + }, + { + "id": "62406788", + "title": "アリスの青い庭", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/04/15/00/04/16/62406788_p0_square1200.jpg", + "description": "", + "tags": [ + "オリジナル", + "青", + "女の子", + "プラチナブロンド", + "青薔薇", + "窓辺", + "銀髪碧眼", + "リボン", + "オリジナル200000users入り" + ], + "userId": "27517", + "userName": "藤原", + "width": 859, + "height": 1215, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#オリジナル アリスの青い庭 - 藤原的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-04-15T00:04:16+09:00", + "updateDate": "2017-04-15T00:04:16+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2008/03/31/01/13/19/95581_886b0c6eadefd9d6df6a6776a015920d_50.jpg" + }, + { + "id": "63304069", + "title": "☆", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/06/10/00/35/38/63304069_p0_square1200.jpg", + "description": "", + "tags": [ + "少女", + "女の子", + "オリジナル", + "おさげ", + "白ワンピ", + "清涼感", + "麦わら帽子", + "サマードレス", + "オリジナル50000users入り" + ], + "userId": "15866498", + "userName": "NARU", + "width": 682, + "height": 1000, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#少女 ☆ - NARU的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-06-10T00:35:38+09:00", + "updateDate": "2017-06-10T00:35:38+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/05/17/14/42/14/14239879_47747fd9a4e74906648c7ea9a31ec688_50.png" + }, + { + "id": "69297688", + "title": "✧︎ * ... * ✧", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/06/22/04/09/54/69297688_p0_square1200.jpg", + "description": "", + "tags": [ + "女の子", + "オリジナル", + "少女", + "金髪ロング", + "金髪碧眼", + "ロリィタファッション", + "白ワンピ", + "オリジナル50000users入り", + "リボン", + "マニキュア" + ], + "userId": "4780571", + "userName": "Snow is", + "width": 1000, + "height": 1400, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#女の子 ✧︎ * ... * ✧ - Snow is的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-06-19T00:00:09+09:00", + "updateDate": "2018-06-22T04:09:54+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/05/01/01/38/05/20619822_1bfbaaf067e40872f12b4bbf104adb31_50.jpg" + }, + { + "id": "59612057", + "title": "Avalon", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/10/24/00/01/09/59612057_p0_square1200.jpg", + "description": "", + "tags": [ + "fate", + "セイバー", + "Fate/GrandOrder", + "少女", + "Fate/GO10000users入り", + "FGOイラコン2", + "アルトリア・ペンドラゴン", + "Fate50000users入り", + "Fate/GO50000users入り", + "全て遠き理想郷" + ], + "userId": "9580845", + "userName": "Magicians", + "width": 749, + "height": 977, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#fate Avalon - Magicians的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-10-24T00:01:09+09:00", + "updateDate": "2016-10-24T00:01:09+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/01/07/03/35/51/19959419_838d93bb19e82dc3c2abbe4c9c7174d4_50.png" + }, + { + "id": "57534432", + "title": "「魂音泉」碎華変「三次創作」", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/06/22/18/39/44/57534432_p0_square1200.jpg", + "description": "", + "tags": [ + "東方", + "魂音泉", + "三次創作", + "Touhou", + "东方Project", + "Touhou_Project", + "東方三次創作", + "東方Project", + "東方Project50000users入り", + "ハイセンス" + ], + "userId": "74184", + "userName": "零@通販始めた", + "width": 1000, + "height": 740, + "pageCount": 42, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#東方 「魂音泉」碎華変「三次創作」 - 零@通販始めた的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-06-22T18:39:44+09:00", + "updateDate": "2016-06-22T18:39:44+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/04/27/10/00/38/12474975_a0a699ea19f387df0f98bc5a9b7d26d3_50.png" + }, + { + "id": "17184292", + "title": "幽愁楼閣", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2011/03/07/00/37/33/17184292_p0_square1200.jpg", + "description": "", + "tags": [ + "富士見の娘", + "扇", + "桜", + "魂魄妖夢", + "西行寺幽々子", + "東方", + "溢れるカリスマ", + "なにこれきれい", + "東方Project", + "東方Project50000users入り" + ], + "userId": "27517", + "userName": "藤原", + "width": 1818, + "height": 1999, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#富士見の娘 幽愁楼閣 - 藤原的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2011-03-07T00:37:33+09:00", + "updateDate": "2011-03-07T00:37:33+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2008/03/31/01/13/19/95581_886b0c6eadefd9d6df6a6776a015920d_50.jpg" + }, + { + "id": "62512328", + "title": "PAPER MOON", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/04/22/00/15/32/62512328_p0_square1200.jpg", + "description": "", + "tags": [ + "東方Project", + "犬走椛", + "射命丸文" + ], + "userId": "11246082", + "userName": "Miv4t", + "width": 896, + "height": 1300, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#東方Project PAPER MOON - Miv4t的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-04-22T00:07:10+09:00", + "updateDate": "2017-04-22T00:15:32+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/04/18/00/26/23/9248135_a9df8403bea4528461489ffd9219fbd7_50.jpg" + }, + { + "id": "67507815", + "title": "blue", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/02/28/21/23/33/67507815_p0_square1200.jpg", + "description": "", + "tags": [ + "MOE2018", + "オリジナル", + "水着", + "海", + "魅惑の谷間", + "水着パーカー", + "極上の女体", + "女の子", + "オリジナル100000users入り", + "巨乳" + ], + "userId": "867590", + "userName": "米白粕", + "width": 1400, + "height": 1980, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#MOE2018 blue - 米白粕的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-02-28T21:23:33+09:00", + "updateDate": "2018-02-28T21:23:33+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/08/31/16/14/31/19283130_9a5b6797568d2f7b5e93d2294f42bdd2_50.jpg" + }, + { + "id": "65913057", + "title": "水着オルタ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/11/18/18/47/51/65913057_p0_square1200.jpg", + "description": "", + "tags": [ + "Fate/GrandOrder", + "セイバーオルタ", + "アルトリア・ペンドラゴン", + "FGO", + "水着", + "アルトリア・オルタ(水着)", + "メイドビキニ", + "ニーソックス", + "Fate/GO100000users入り", + "勝てる気がしない" + ], + "userId": "18403608", + "userName": "マシマサキ", + "width": 2500, + "height": 1500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#Fate/GrandOrder 水着オルタ - マシマサキ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-11-16T07:00:01+09:00", + "updateDate": "2017-11-18T18:47:51+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/05/31/10/07/33/11002376_a5ed35bafb27e4a9c55279149e71d6de_50.png" + }, + { + "id": "39316587", + "title": "ひとりぼっちを切って", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2013/10/25/00/12/02/39316587_p0_square1200.jpg", + "description": "", + "tags": [ + "創作", + "ハイセンス", + "鬱くしい", + "部屋", + "男の子", + "ショタ", + "ぬいぐるみ", + "オリジナル50000users入り", + "オリジナル" + ], + "userId": "97298", + "userName": "祐壱", + "width": 845, + "height": 1200, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#創作 ひとりぼっちを切って - 祐壱的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2013-10-25T00:12:02+09:00", + "updateDate": "2013-10-25T00:12:02+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/08/04/17/08/44/14582054_460f8bf6f48cfd928de83375434b2905_50.png" + }, + { + "id": "79372430", + "title": "view of their back", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/02/09/13/12/24/79372430_p0_square1200.jpg", + "description": "", + "tags": [ + "落書き", + "同人", + "女の子", + "男の子", + "鬼滅の刃", + "甘露寺蜜璃", + "胡蝶しのぶ", + "うなじ", + "時透無一郎", + "鬼滅の刃50000users入り" + ], + "userId": "5133163", + "userName": "DEER", + "width": 1080, + "height": 1080, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#落書き view of their back - DEER的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-02-09T13:12:24+09:00", + "updateDate": "2020-02-09T13:12:24+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/01/14/00/23/31/13689984_0f655438a809b747d90cd29730a48b5b_50.jpg" + }, + { + "id": "73838405", + "title": "JO☾ER", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/03/24/00/00/04/73838405_p0_square1200.jpg", + "description": "", + "tags": [ + "オリジナル", + "少年", + "トランプ", + "男の子", + "帽子屋", + "ジョーカー", + "ガスマスク", + "杖", + "オリジナル30000users入り" + ], + "userId": "24218478", + "userName": "₩ANKE", + "width": 1069, + "height": 1500, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#オリジナル JO☾ER - ₩ANKE的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-03-24T00:00:04+09:00", + "updateDate": "2019-03-24T00:00:04+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/10/22/04/04/45/16445257_404ce224320f5dac49b6715fafd3824d_50.jpg" + }, + { + "id": "72032423", + "title": "なかよしTDDが解散するまんが+ハマ後日談(追加)", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/12/16/03/42/37/72032423_p0_square1200.jpg", + "description": "", + "tags": [ + "ヒプノシスマイク", + "碧棺左馬刻", + "飴村乱数", + "神宮寺寂雷", + "山田一郎", + "TDD", + "どうしてこうならなかった", + "最高", + "ヒプマイ50000users入り" + ], + "userId": "16758020", + "userName": "トビッコ", + "width": 600, + "height": 800, + "pageCount": 8, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ヒプノシスマイク なかよしTDDが解散するまんが+ハマ後日談(追加) - トビッコ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-12-09T10:16:37+09:00", + "updateDate": "2018-12-16T03:42:37+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/02/19/04/54/35/15416900_9dd01ea008916ff232a90cf987007504_50.jpg" + }, + { + "id": "72987019", + "title": "【ヒプマイ】TDDでおひるね", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/02/03/18/55/25/72987019_p0_square1200.jpg", + "description": "", + "tags": [ + "ヒプノシスマイク", + "ヒプマイ", + "TDD", + "飴村乱数", + "山田一郎", + "神宮寺寂雷", + "碧棺左馬刻", + "なにこれかわいい", + "ヒプマイ30000users入り", + "天使しかいない" + ], + "userId": "275404", + "userName": "コノサキ", + "width": 600, + "height": 900, + "pageCount": 4, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ヒプノシスマイク 【ヒプマイ】TDDでおひるね - コノサキ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-02-03T18:55:25+09:00", + "updateDate": "2019-02-03T18:55:25+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/10/14/16/17/26/19510358_2a4c7cb09b10f72e11ab2cf936e8b5dc_50.jpg" + }, + { + "id": "70480279", + "title": "【麻天狼&ひふど】漫画まとめログ①", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/09/01/00/12/46/70480279_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "ヒプノシスマイク", + "ヒ腐マイ", + "ひふど", + "麻天狼", + "伊弉冉一二三", + "観音坂独歩", + "神宮寺寂雷", + "ヒ腐マイ10000users入り" + ], + "userId": "32453963", + "userName": "ゼッカ@7/25さロ【D26】", + "width": 637, + "height": 900, + "pageCount": 11, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ヒプノシスマイク 【麻天狼&ひふど】漫画まとめログ① - ゼッカ@7/25さロ【D26】的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-09-01T00:12:46+09:00", + "updateDate": "2018-09-01T00:12:46+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/04/19/01/35/02/15664253_9e80ad6a010a7b6daa3335de13620f78_50.png" + }, + { + "id": "76419627", + "title": "無料背景素材", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/08/23/21/40/43/76419627_p0_square1200.jpg", + "description": "", + "tags": [ + "背景", + "背景素材", + "フリー素材", + "和風", + "和室", + "ここに行きたい", + "フリー素材5000users入り", + "春夏秋冬", + "これがフリー…だと…⁉", + "作者は我々から金をとるべき" + ], + "userId": "300907", + "userName": "たかし", + "width": 1920, + "height": 1440, + "pageCount": 11, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#背景 無料背景素材 - たかし的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-08-23T21:40:43+09:00", + "updateDate": "2019-08-23T21:40:43+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/09/24/08/36/02/16321405_a2ac8521a4653d4f57690b1e8cdac7b2_50.jpg" + }, + { + "id": "39379535", + "title": "【Apophysis】宇宙01-星空編-【フリー素材】", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2013/10/27/22/01/13/39379535_p0_square1200.jpg", + "description": "", + "tags": [ + "フリー素材", + "背景素材", + "加工自由", + "テクスチャ", + "Apophysis", + "宇宙", + "星空", + "ふつくしい", + "フリー素材5000users入り" + ], + "userId": "5998574", + "userName": "瀝青炭@休眠中", + "width": 1000, + "height": 750, + "pageCount": 21, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#フリー素材 【Apophysis】宇宙01-星空編-【フリー素材】 - 瀝青炭@休眠中的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2013-10-27T22:01:13+09:00", + "updateDate": "2013-10-27T22:01:13+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/05/03/14/49/45/10882037_e2f35f604eee88991ee828d8f0e2ee77_50.jpg" + }, + { + "id": "60800103", + "title": "FGO召喚素材", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/01/06/19/05/31/60800103_p0_square1200.jpg", + "description": "", + "tags": [ + "FGO", + "フリー素材", + "背景素材", + "Fate/GrandOrder" + ], + "userId": "17591386", + "userName": "白扉", + "width": 2668, + "height": 1500, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#FGO FGO召喚素材 - 白扉的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-01-06T19:05:31+09:00", + "updateDate": "2017-01-06T19:05:31+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/03/20/12/30/51/10689734_c5d055723799f570530fb52876093a6b_50.jpg" + }, + { + "id": "43436652", + "title": "詰め【腐】", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2014/05/11/12/11/55/43436652_p0_square1200.jpg", + "description": "", + "tags": [ + "鬼白", + "丁白丁", + "腐向け", + "これはいい鬼白", + "愛を感じる", + "鬼灯の冷徹", + "鬼灯の腐向け10000users入り", + "ショタ鬼灯様の「モフモフ!」の破壊力", + "あざと神獣マジあざとい" + ], + "userId": "2249236", + "userName": "hagi", + "width": 900, + "height": 667, + "pageCount": 21, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#鬼白 詰め【腐】 - hagi的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2014-05-11T12:11:55+09:00", + "updateDate": "2014-05-11T12:11:55+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/01/19/16/08/19/7329261_96a29a8b0bb18013963daee5e3b3775d_50.jpg" + }, + { + "id": "51846917", + "title": "【鬼白】まんが④", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2015/08/08/11/06/33/51846917_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "鬼白", + "鬼灯の腐向け", + "鬼灯様テライケメン", + "甘酸っぱすぎていっそ泣けてくる", + "鬼灯の腐向け10000users入り", + "④ばーーん!!", + "これはいい鬼白" + ], + "userId": "12322313", + "userName": "うゆ", + "width": 600, + "height": 800, + "pageCount": 56, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#鬼白 【鬼白】まんが④ - うゆ的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2015-08-08T11:06:33+09:00", + "updateDate": "2015-08-08T11:06:33+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/09/16/00/42/45/8403076_2e8106c1203847b00a8b6ec9be3c58ec_50.jpg" + }, + { + "id": "48286222", + "title": "【鬼白】まんが③", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2015/01/21/00/37/38/48286222_p0_square1200.jpg", + "description": "", + "tags": [ + "鬼白", + "鬼灯の腐向け", + "漫画", + "ここは天国か...", + "そいや!!", + "オカン閻魔様", + "鬼灯の腐向け10000users入り" + ], + "userId": "12322313", + "userName": "うゆ", + "width": 600, + "height": 800, + "pageCount": 21, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#鬼白 【鬼白】まんが③ - うゆ的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2015-01-21T00:37:38+09:00", + "updateDate": "2015-01-21T00:37:38+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/09/16/00/42/45/8403076_2e8106c1203847b00a8b6ec9be3c58ec_50.jpg" + }, + { + "id": "77844238", + "title": "DNF", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2019/11/16/19/33/04/77844238_p0_custom1200.jpg", + "description": "", + "tags": [ + "던전앤파이터", + "DNF", + "美少女", + "rain", + "던파", + "아니스" + ], + "userId": "28181378", + "userName": "POHO / @_P0H0_", + "width": 983, + "height": 1878, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#던전앤파이터 DNF - POHO / @_P0H0_的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-11-16T19:33:04+09:00", + "updateDate": "2019-11-16T19:33:04+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/10/20/00/34/23/13360904_c9561b04e72370f518ccd8972a03c14c_50.jpg" + }, + { + "id": "81890250", + "title": "DNF commission", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/05/27/14/00/45/81890250_p0_square1200.jpg", + "description": "", + "tags": [ + "던파", + "commission", + "여귀검사", + "DNF", + "ハイヒール", + "R-18" + ], + "userId": "8879338", + "userName": "Lohel", + "width": 1857, + "height": 1543, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#던파 DNF commission - Lohel的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-05-27T14:00:45+09:00", + "updateDate": "2020-05-27T14:00:45+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/10/27/00/06/47/16465314_9ae821a514cd6645d80ce66d42a9a75f_50.png" + }, + { + "id": "67979905", + "title": "2018", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/03/31/06/59/14/67979905_p0_square1200.jpg", + "description": "", + "tags": [ + "dnf", + "던파", + "w.gunner", + "여거너", + "地下城与勇士", + "アラド戦記", + "おっぱい", + "女神", + "アラド戦記10000users入り" + ], + "userId": "18380615", + "userName": "monaim", + "width": 1117, + "height": 1293, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#dnf 2018 - monaim的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-03-30T02:16:41+09:00", + "updateDate": "2018-03-31T06:59:14+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/04/05/01/17/47/12372343_109f075bfce6c2c08a3490f8002c472f_50.png" + }, + { + "id": "85625860", + "title": "呪詰め4", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/12/19/58/36/85625860_p0_square1200.jpg", + "description": "", + "tags": [ + "夢術廻戦", + "夢術廻戦10000users入り" + ], + "userId": "696172", + "userName": "もらす", + "width": 2087, + "height": 1585, + "pageCount": 161, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#夢術廻戦 呪詰め4 - もらす的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-12T19:58:36+09:00", + "updateDate": "2020-11-12T19:58:36+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/01/21/20/03/41/8871170_a49419ec900738eb3ad2daa6ed9838cb_50.jpg" + }, + { + "id": "90985115", + "title": "武右LOG 1", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/03/20/16/31/90985115_p0_square1200.jpg", + "description": "", + "tags": [ + "マイ武", + "ふゆタケ", + "タケミチ受け", + "東京【腐】リベンジャーズ", + "たけみち受け", + "東京【腐】リベンジャーズ10000users入り", + "なにこれ幸せ" + ], + "userId": "2292595", + "userName": "矢代", + "width": 650, + "height": 919, + "pageCount": 20, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#マイ武 武右LOG 1 - 矢代的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-03T20:16:31+09:00", + "updateDate": "2021-07-03T20:16:31+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/07/12/13/28/54/21024925_058c7c9830c6561e8dff9ea3cfe85dd1_50.jpg" + }, + { + "id": "85850572", + "title": "五悠ログ1", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/23/10/34/52/85850572_p0_square1200.jpg", + "description": "", + "tags": [ + "腐術廻戦", + "五悠", + "腐術廻戦50000users入り", + "これはいい五悠", + "腐向け", + "おひさまの匂い…" + ], + "userId": "22731624", + "userName": "茶白", + "width": 800, + "height": 800, + "pageCount": 36, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#腐術廻戦 五悠ログ1 - 茶白的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-23T10:34:52+09:00", + "updateDate": "2020-11-23T10:34:52+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/11/14/17/16/11/19666992_5ebe6be9c92a692f7b81c6507e3b2604_50.jpg" + }, + { + "id": "85951712", + "title": "夢小説本|呪術廻戦 夏油・五条・伏黒四角関係|A6体裁サンプル", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/28/10/09/13/85951712_p0_square1200.jpg", + "description": "", + "tags": [ + "夢本", + "夢小説", + "夢ノ箱庭", + "夢術廻戦", + "妖言", + "超妖言", + "ユメミ2nd", + "夢術廻戦1000users入り" + ], + "userId": "15570616", + "userName": "桐原🍋夢箱欠席", + "width": 1000, + "height": 1421, + "pageCount": 13, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#夢本 夢小説本|呪術廻戦 夏油・五条・伏黒四角関係|A6体裁サンプル - 桐原🍋夢箱欠席的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-28T10:09:13+09:00", + "updateDate": "2020-11-28T10:09:13+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/08/06/02/18/35/14589935_0e9b6fc8473c895b5af6735af2549fe6_50.jpg" + }, + { + "id": "85547905", + "title": "無題", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/08/21/39/03/85547905_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "五悠", + "腐術廻戦", + "これはいい五悠", + "腐術廻戦50000users入り", + "腐向け" + ], + "userId": "61088628", + "userName": "須田", + "width": 3679, + "height": 5154, + "pageCount": 6, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#五悠 無題 - 須田的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-08T21:39:03+09:00", + "updateDate": "2020-11-08T21:39:03+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/11/05/19/14/33/19620820_517388ca0256c1433591013baca5f64d_50.jpg" + }, + { + "id": "89844674", + "title": "マイキ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/05/15/06/12/25/89844674_p0_square1200.jpg", + "description": "", + "tags": [ + "イラスト", + "絵", + "fanart", + "anime", + "東京リベンジャーズ", + "佐野万次郎", + "マイキ", + "male", + "マイキー" + ], + "userId": "54871092", + "userName": "Lan", + "width": 3812, + "height": 2583, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#イラスト マイキ - Lan的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-15T06:12:25+09:00", + "updateDate": "2021-05-15T06:12:25+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/03/22/09/51/06/20399454_b3df6e3d0293f463b6dfcf346c7d4a52_50.jpg" + }, + { + "id": "63457814", + "title": "【コナン×YOI】氷上の愛讃歌(ラブアンドライフ)", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/06/19/01/08/28/63457814_p0_square1200.jpg", + "description": "", + "tags": [ + "ユーリ!!!onICE", + "名探偵コナン", + "クロスオーバー", + "なにこれすごい", + "野生の公式", + "スゴ過ぎる!!!", + "混合50000users入り", + "天才か", + "本格的に劇場版化を求む....!!!", + "クロスオーバー界きってのクオリティ…‼︎!" + ], + "userId": "635762", + "userName": "アケ", + "width": 700, + "height": 784, + "pageCount": 34, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ユーリ!!!onICE 【コナン×YOI】氷上の愛讃歌(ラブアンドライフ) - アケ的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-06-19T01:08:28+09:00", + "updateDate": "2017-06-19T01:08:28+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2013/02/05/16/28/30/5784146_cb9ed92939ba4b5ac051ad74cd105645_50.jpg" + }, + { + "id": "86655276", + "title": "ログ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/12/30/21/26/35/86655276_p0_square1200.jpg", + "description": "", + "tags": [ + "呪術廻戦", + "五条悟", + "夏油傑", + "これはいい最強同期", + "呪術廻戦30000users入り", + "五+夏" + ], + "userId": "18059582", + "userName": "hk", + "width": 1960, + "height": 2850, + "pageCount": 19, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#呪術廻戦 ログ - hk的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-12-30T21:26:35+09:00", + "updateDate": "2020-12-30T21:26:35+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://s.pximg.net/common/images/no_profile_s.png" + }, + { + "id": "85842343", + "title": "五条悟", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/23/00/00/08/85842343_p0_square1200.jpg", + "description": "", + "tags": [ + "呪術廻戦", + "五条悟", + "テライケメン", + "キャプションに激しく同意", + "呪術廻戦50000users入り" + ], + "userId": "1731804", + "userName": "わるつ", + "width": 1113, + "height": 1418, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#呪術廻戦 五条悟 - わるつ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-23T00:00:08+09:00", + "updateDate": "2020-11-23T00:00:08+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/11/21/06/43/40/13479828_74cecd092b1e9a851e5ccb06abf8ee4a_50.png" + }, + { + "id": "81798260", + "title": "【WEB再録】男女反転廻戦", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2020/05/23/22/37/52/81798260_p0_custom1200.jpg", + "description": "", + "tags": [ + "腐術廻戦", + "女体化", + "男体化", + "性転換", + "笑撃のラスト", + "腐術廻戦50000users入り", + "ちょもちょも可愛い", + "続きを待機!!", + "植物トリオ" + ], + "userId": "6703987", + "userName": "永流", + "width": 2622, + "height": 3720, + "pageCount": 22, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#腐術廻戦 【WEB再録】男女反転廻戦 - 永流的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-05-23T22:37:52+09:00", + "updateDate": "2020-05-23T22:37:52+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/08/24/21/34/59/13100641_312c2271cc2af53e7e77700b496470c5_50.png" + }, + { + "id": "71152750", + "title": "BFLOG", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/10/13/01/09/40/71152750_p0_square1200.jpg", + "description": "", + "tags": [ + "BANANAFISH", + "A英", + "腐向け", + "あなたが神か", + "野生の公式", + "尊い", + "涙腺崩壊", + "BF【腐】50000users入り", + "幸せな世界よどうか" + ], + "userId": "920707", + "userName": "サワ", + "width": 782, + "height": 648, + "pageCount": 29, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#BANANAFISH BFLOG - サワ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-10-13T01:09:40+09:00", + "updateDate": "2018-10-13T01:09:40+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2013/09/15/17/44/06/6817679_23f1fd929f9caa04ebad6e29b11cf415_50.jpg" + }, + { + "id": "90602994", + "title": "東京卍會総長", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/06/17/00/00/03/90602994_p0_square1200.jpg", + "description": "", + "tags": [ + "東京卍リベンジャーズ", + "マイキー", + "なにこれかっこいい", + "東京卍リベンジャーズ5000入り" + ], + "userId": "44869033", + "userName": "はらけんし", + "width": 2580, + "height": 3643, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#東京卍リベンジャーズ 東京卍會総長 - はらけんし的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-17T00:00:03+09:00", + "updateDate": "2021-06-17T00:00:03+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/09/07/19/02/41/19321849_400fbe87362c18a38d35bd19191b2491_50.png" + }, + { + "id": "82082820", + "title": "フロ監・ジェイ監log", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/06/04/16/43/45/82082820_p0_square1200.jpg", + "description": "", + "tags": [ + "twstプラス", + "フロ監", + "ジェイ監", + "twst夢", + "女監督生", + "これはいいフロ監", + "これはいいジェイ監", + "おねむなアズール優しい", + "twst夢100000users入り", + "#『しりとり』とは、、、⁇" + ], + "userId": "54918134", + "userName": "にぱち", + "width": 2150, + "height": 3035, + "pageCount": 21, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#twstプラス フロ監・ジェイ監log - にぱち的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-06-04T16:43:45+09:00", + "updateDate": "2020-06-04T16:43:45+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/07/20/17/26/00/19022245_67a0b8efb3a5af87edc5de56262fe749_50.png" + }, + { + "id": "78709507", + "title": "本好きまとめ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2020/01/04/20/20/55/78709507_p0_custom1200.jpg", + "description": "", + "tags": [ + "本好きの下剋上", + "フェルマイ", + "本好きの下剋上10000users入り", + "シュミミマント" + ], + "userId": "46399856", + "userName": "イノ", + "width": 1254, + "height": 1850, + "pageCount": 29, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#本好きの下剋上 本好きまとめ - イノ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-01-04T20:20:55+09:00", + "updateDate": "2020-01-04T20:20:55+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/12/26/04/31/17/16751537_fb6c9514567c67a52aa6d5a4412cd026_50.jpg" + }, + { + "id": "89322687", + "title": "東卍ログ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/04/22/22/12/35/89322687_p0_square1200.jpg", + "description": "", + "tags": [ + "東京卍リベンジャーズ", + "ドラマイ", + "佐野万次郎", + "東京卍リベンジャーズ10000users入り" + ], + "userId": "4055953", + "userName": "メイメイ", + "width": 3000, + "height": 3000, + "pageCount": 24, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#東京卍リベンジャーズ 東卍ログ - メイメイ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-04-22T22:12:35+09:00", + "updateDate": "2021-04-22T22:12:35+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://s.pximg.net/common/images/no_profile_s.png" + }, + { + "id": "66204889", + "title": "閃華新刊(クロスオーバー)", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/12/08/10/51/35/66204889_p0_square1200.jpg", + "description": "", + "tags": [ + "女審神者", + "跡部景吾", + "閃華の刻18年納", + "どこから聞こえてくるぞ、、『氷帝!氷帝!勝つのは氷帝!』", + "クロスオーバー", + "C93", + "夢漫画", + "混合5000users入り", + "オリ主" + ], + "userId": "4372483", + "userName": "弓削リカコ", + "width": 800, + "height": 800, + "pageCount": 10, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#女審神者 閃華新刊(クロスオーバー) - 弓削リカコ的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-12-08T10:51:35+09:00", + "updateDate": "2017-12-08T10:51:35+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/11/07/18/14/52/14988971_ef54bee78b867bfac2c07dd35e340fad_50.png" + }, + { + "id": "80630584", + "title": "twst夢詰め", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/04/07/20/14/20/80630584_p0_square1200.jpg", + "description": "", + "tags": [ + "twst夢", + "夢漫画", + "女主人公", + "あなた様でしたか", + "twst夢10000users入り", + "フロ監", + "twst夢20000users入り" + ], + "userId": "16457604", + "userName": "菊二", + "width": 900, + "height": 900, + "pageCount": 17, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#twst夢 twst夢詰め - 菊二的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-04-07T20:14:20+09:00", + "updateDate": "2020-04-07T20:14:20+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/01/05/22/49/47/11965775_509f5108cc53c0c61ab953773f80b19a_50.jpg" + }, + { + "id": "83242494", + "title": "転校先の学校が不穏そうな話", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/07/26/19/00/58/83242494_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "オリジナル", + "創作", + "続きを全裸待機", + "愛すべき馬鹿", + "優しい世界", + "伝説の始まり", + "タッパァァァ", + "はなメガネ", + "オリジナル100000users入り" + ], + "userId": "6015205", + "userName": "立葵", + "width": 1247, + "height": 1757, + "pageCount": 20, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#オリジナル 転校先の学校が不穏そうな話 - 立葵的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-07-26T19:00:58+09:00", + "updateDate": "2020-07-26T19:00:58+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/10/28/17/01/34/14953131_1c486fca5e8339531e0818e42484c310_50.jpg" + }, + { + "id": "81850096", + "title": "twstまとめ①", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/05/30/17/15/34/81850096_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "twst夢", + "twstプラス", + "女監督生", + "マレ監", + "友情フォーエバー", + "デュース元ヤンの底力", + "腹筋がオーバーブロット", + "監督生愛され", + "twst夢80000users入り" + ], + "userId": "10312004", + "userName": "うづ菌", + "width": 4497, + "height": 3335, + "pageCount": 22, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#twst夢 twstまとめ① - うづ菌的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-05-25T20:00:13+09:00", + "updateDate": "2020-05-30T17:15:34+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/05/01/16/53/51/18453320_a365dc2caa5409b8bcf6e1f79e84f511_50.jpg" + }, + { + "id": "72727118", + "title": "現代ジブリカップルたちの日常", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/01/19/00/01/14/72727118_p0_square1200.jpg", + "description": "", + "tags": [ + "ジブリ", + "千と千尋の神隠し", + "ハウルの動く城", + "もののけ姫", + "現パロ", + "あなたが神か", + "ジブリ50000users入り", + "ハク千", + "ハウソフィ", + "アシサン" + ], + "userId": "5155946", + "userName": "ダンミル", + "width": 900, + "height": 1273, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ジブリ 現代ジブリカップルたちの日常 - ダンミル的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-01-19T00:01:14+09:00", + "updateDate": "2019-01-19T00:01:14+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/07/03/10/55/30/12797398_1982f9bf699bd2ff2b67855b276bbb8c_50.png" + }, + { + "id": "49831005", + "title": "雪*", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2015/04/14/00/00/53/49831005_p0_square1200.jpg", + "description": "", + "tags": [ + "やはり俺の青春ラブコメはまちがっている。", + "雪ノ下雪乃", + "ふつくしい", + "黒髪", + "横顔", + "マフラー", + "ビニール傘", + "雪", + "冬", + "俺ガイル10000users入り" + ], + "userId": "5572922", + "userName": "GKN", + "width": 1257, + "height": 793, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#やはり俺の青春ラブコメはまちがっている。 雪* - GKN的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2015-04-14T00:00:53+09:00", + "updateDate": "2015-04-14T00:00:53+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/04/05/20/31/17/9196658_65cd47f348f2b2428d7ac86d9e153aad_50.png" + }, + { + "id": "79167696", + "title": "🧡", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/01/29/23/26/38/79167696_p0_square1200.jpg", + "description": "", + "tags": [ + "魔道祖師", + "WangXian", + "魔道祖師1000users入り" + ], + "userId": "3205611", + "userName": "KimPeul/キムプル", + "width": 800, + "height": 1200, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#魔道祖師 🧡 - KimPeul/キムプル的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-01-29T23:26:38+09:00", + "updateDate": "2020-01-29T23:26:38+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/04/27/22/32/16/15696585_72e49a8445a19896d1e3e09f28c3b984_50.png" + }, + { + "id": "80873983", + "title": "大学生八色", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/04/18/14/16/15/80873983_p0_square1200.jpg", + "description": "", + "tags": [ + "ロング化", + "同棲", + "大学生", + "八色", + "一色いろは", + "比企谷八幡", + "俺ガイル", + "やはり俺の青春ラブコメはまちがっている。", + "イチャラブ", + "俺ガイル10000users入り" + ], + "userId": "23496118", + "userName": "ライト", + "width": 5236, + "height": 4685, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ロング化 大学生八色 - ライト的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-04-18T14:16:15+09:00", + "updateDate": "2020-04-18T14:16:15+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/03/05/15/10/38/18047544_aff5474a6785add948e48034b22dad3f_50.jpg" + }, + { + "id": "90828399", + "title": "場地圭介の相方と幼馴染の話", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/06/26/22/24/46/90828399_p0_custom1200.jpg", + "description": "", + "tags": [ + "東京卍リベンジャーズ", + "場地圭介", + "松野千冬", + "マイキー", + "佐野万次郎" + ], + "userId": "10300651", + "userName": "飯田 はと@お仕事募集中", + "width": 1400, + "height": 785, + "pageCount": 5, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#東京卍リベンジャーズ 場地圭介の相方と幼馴染の話 - 飯田 はと@お仕事募集中的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-26T22:24:46+09:00", + "updateDate": "2021-06-26T22:24:46+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/01/10/19/41/22/19979990_2d38fc0821847543547c3577679b32fa_50.jpg" + }, + { + "id": "89602868", + "title": "救。", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/05/04/23/11/11/89602868_p0_square1200.jpg", + "description": "", + "tags": [ + "東京卍リベンジャーズ", + "東京リベンジャーズ", + "東卍FA", + "花垣武道", + "東京卍リベンジャーズ1000users入り", + "なにこれ素敵", + "東京卍リベンジャーズ5000users入り" + ], + "userId": "1608503", + "userName": "空野蒼空", + "width": 485, + "height": 2461, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#東京卍リベンジャーズ 救。 - 空野蒼空的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-04T23:11:11+09:00", + "updateDate": "2021-05-04T23:11:11+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/04/13/16/10/23/20527284_1c996152ab18386d7345aa48c8cd5748_50.jpg" + }, + { + "id": "87630784", + "title": "無下限あればウイルスにも無敵な五条先生", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/02/08/23/23/19/87630784_p0_custom1200.jpg", + "description": "", + "tags": [ + "呪術廻戦", + "五条悟", + "釘崎野薔薇", + "虎杖悠仁", + "伏黒恵", + "なにこれかわいい", + "なにこれ尊い", + "なにこれ癒し", + "呪術廻戦50000users入り" + ], + "userId": "1921530", + "userName": "つくし", + "width": 1100, + "height": 1372, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#呪術廻戦 無下限あればウイルスにも無敵な五条先生 - つくし的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-02-08T23:23:19+09:00", + "updateDate": "2021-02-08T23:23:19+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/09/14/03/47/00/14773236_ef375cd354778c894cc0d8a239aac9c4_50.jpg" + }, + { + "id": "36022374", + "title": "新緑廃工場", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2013/05/30/00/44/18/36022374_p0_square1200.jpg", + "description": "", + "tags": [ + "オリジナル", + "クリック推奨", + "ここに行きたい", + "待ってました!", + "俯瞰", + "メイキング希望", + "立体都市", + "神々しい美しさ", + "オリジナル30000users入り", + "風景10000users入り" + ], + "userId": "107492", + "userName": "たみ。", + "width": 1049, + "height": 1500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#オリジナル 新緑廃工場 - たみ。的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2013-05-30T00:44:18+09:00", + "updateDate": "2013-05-30T00:44:18+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2010/08/20/14/45/29/2106137_1e31e2994890d3d51f3f5952e3be912e_50.png" + }, + { + "id": "78510327", + "title": "野薔薇ちゃんも女の子", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/12/26/23/17/12/78510327_p0_square1200.jpg", + "description": "", + "tags": [ + "呪術廻戦", + "釘崎野薔薇", + "虎杖悠仁", + "伏黒恵", + "お前のまぶたをまつりぬい♡", + "呪術廻戦50000users入り", + "植物トリオ", + "なにこれかわいい", + "なにこれあったかい" + ], + "userId": "10157426", + "userName": "みねお", + "width": 2508, + "height": 3541, + "pageCount": 4, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#呪術廻戦 野薔薇ちゃんも女の子 - みねお的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-12-26T23:17:12+09:00", + "updateDate": "2019-12-26T23:17:12+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/09/26/01/17/43/14821249_e709e832412339346ab88360655d744c_50.jpg" + }, + { + "id": "79379089", + "title": "五伏ログ①", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/02/09/19/23/02/79379089_p0_square1200.jpg", + "description": "", + "tags": [ + "腐術廻戦", + "五伏", + "腐向け", + "腐術廻戦10000users入り" + ], + "userId": "12181917", + "userName": "五臓六腑", + "width": 744, + "height": 1052, + "pageCount": 25, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#腐術廻戦 五伏ログ① - 五臓六腑的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-02-09T19:16:18+09:00", + "updateDate": "2020-02-09T19:23:02+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/12/30/14/41/14/16771071_b7d7a4c30db00906018592d84ad416bd_50.png" + }, + { + "id": "79363893", + "title": "冨岡義勇誕生祭!", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/02/09/00/19/00/79363893_p0_square1200.jpg", + "description": "", + "tags": [ + "鬼滅の刃", + "二次創作", + "漫画", + "冨岡義勇", + "胡蝶しのぶ", + "時透無一郎", + "不死川実弥", + "俺は嫌われてない", + "鬼滅の刃40000users入り", + "冨岡義勇誕生祭" + ], + "userId": "10006345", + "userName": "Aya", + "width": 1240, + "height": 1754, + "pageCount": 4, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#鬼滅の刃 冨岡義勇誕生祭! - Aya的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-02-09T00:19:00+09:00", + "updateDate": "2020-02-09T00:19:00+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/11/08/16/38/23/19636554_11d0158c0517308a0bd3bc2c618eea57_50.jpg" + }, + { + "id": "77673634", + "title": "【創作】山奥の村の双子の話", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/11/06/00/03/08/77673634_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "創作", + "オリジナル", + "イイハナシダナ-", + "おとぎ話(?)", + "殺し愛", + "兄妹愛", + "イイハナシナノカナー?", + "ヤンデレ" + ], + "userId": "1281456", + "userName": "磐秋", + "width": 636, + "height": 900, + "pageCount": 4, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#創作 【創作】山奥の村の双子の話 - 磐秋的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-11-06T00:03:08+09:00", + "updateDate": "2019-11-06T00:03:08+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/12/19/03/10/56/10258103_e4ac1d929c08d78f0ee8b2a5d40fe31f_50.jpg" + }, + { + "id": "58393816", + "title": "実はめっちゃ面白いクトゥルフ神話TRPG", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/08/12/00/01/44/58393816_p0_square1200.jpg", + "description": "", + "tags": [ + "実はめっちゃ面白いクトゥルフ神話TRPG", + "クトゥルフ神話TRPG", + "クトゥルフ神話TRPG5000users入り" + ], + "userId": "1143884", + "userName": "やまかわ", + "width": 1200, + "height": 828, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#実はめっちゃ面白いクトゥルフ神話TRPG 実はめっちゃ面白いクトゥルフ神話TRPG - やまかわ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-08-12T00:01:44+09:00", + "updateDate": "2016-08-12T00:01:44+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/05/27/01/25/26/14280592_a9d5540758b5a7c3bb2e071ba6ca5e0c_50.png" + }, + { + "id": "60520282", + "title": "【CoCシナリオ】まずはダイスを振れ、話はそれからだ(資料画像)", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/12/06/18/32/13/60520282_p0_square1200.jpg", + "description": "", + "tags": [ + "クトゥルフ神話TRPG", + "TRPG用資料", + "CoCシナリオ" + ], + "userId": "20529565", + "userName": "にこいち(nikoichi)", + "width": 2893, + "height": 4092, + "pageCount": 15, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#クトゥルフ神話TRPG 【CoCシナリオ】まずはダイスを振れ、話はそれからだ(資料画像) - にこいち(nikoichi)的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-12-24T11:55:44+09:00", + "updateDate": "2019-12-06T18:32:13+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/10/13/10/44/45/14897316_6cd3133506a7eadda27905f4587fed93_50.png" + }, + { + "id": "16658773", + "title": "437.15と16の間(7巻ネタバレ)", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2011/02/14/01/11/52/16658773_p0_square1200.jpg", + "description": "", + "tags": [ + "ハリーポッター", + "セブリリ", + "スネイプ", + "目からアグアメンティ", + "こんな素敵な話、きっとあった。", + "涙腺崩壊", + "ハリポタ10000users入り", + "ハリポタ", + "セブルス・スネイプ" + ], + "userId": "97152", + "userName": "kdm", + "width": 504, + "height": 700, + "pageCount": 9, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ハリーポッター 437.15と16の間(7巻ネタバレ) - kdm的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2011-02-14T01:11:52+09:00", + "updateDate": "2011-02-14T01:11:52+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2010/09/20/02/18/09/2215331_ca53ee7fabd3651baa0d658a0b4cfeb7_50.jpg" + }, + { + "id": "31220217", + "title": "ハrrrrrロウィンイエアアアアアア", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2012/11/01/23/59/33/31220217_p0_square1200.jpg", + "description": "", + "tags": [ + "黒子のバスケ", + "親戚の多い黄瀬君", + "赤司様まじ赤司様", + "お前らほんと仲良いな", + "青峰終了のお知らせ", + "謎の疾走感", + "キセキの世代", + "アリババーン!!", + "黒バス30000users入り", + "キャラ崩壊" + ], + "userId": "3946863", + "userName": "ユモ", + "width": 1300, + "height": 1017, + "pageCount": 10, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#黒子のバスケ ハrrrrrロウィンイエアアアアアア - ユモ的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2012-11-01T23:59:33+09:00", + "updateDate": "2012-11-01T23:59:33+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://s.pximg.net/common/images/no_profile_s.png" + }, + { + "id": "85184256", + "title": "ウインクしてください!-東卍", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/10/23/13/20/35/85184256_p0_square1200.jpg", + "description": "", + "tags": [ + "東京卍リベンジャーズ", + "東卍", + "三ツ谷隆", + "龍宮寺堅", + "佐野万次郎", + "松野千冬", + "花垣武道", + "林良平", + "ウインク" + ], + "userId": "60540746", + "userName": "ぷらぐ", + "width": 900, + "height": 1390, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#東京卍リベンジャーズ ウインクしてください!-東卍 - ぷらぐ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-23T13:20:35+09:00", + "updateDate": "2020-10-23T13:20:35+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/05/04/01/28/13/20638532_c471619d7aa9e846372eac79e7a6a352_50.jpg" + }, + { + "id": "79429809", + "title": "炎柱と蛇柱", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/02/12/00/43/23/79429809_p0_square1200.jpg", + "description": "", + "tags": [ + "鬼滅の刃", + "伊黒小芭内", + "煉獄杏寿郎", + "涙腺崩壊", + "なにこれ尊い", + "煉獄兄弟", + "目から水の呼吸", + "何これ泣いちゃう", + "かっこいい", + "鬼滅の刃100000users入り" + ], + "userId": "24889541", + "userName": "も な", + "width": 850, + "height": 1515, + "pageCount": 4, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#鬼滅の刃 炎柱と蛇柱 - も な的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-02-12T00:43:23+09:00", + "updateDate": "2020-02-12T00:43:23+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/09/01/18/06/33/14721487_2cdb9ba9f508e2d85a3ae4916caa70dd_50.jpg" + }, + { + "id": "85596117", + "title": "Cocogoat!", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/11/05/25/32/85596117_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "クレー", + "Klee", + "GenshinImpact", + "Qiqi", + "七七", + "ココナッツヒツジ" + ], + "userId": "13387921", + "userName": "Sketchien", + "width": 3071, + "height": 2536, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "11862002032", + "private": false + }, + "alt": "#原神 Cocogoat! - Sketchien的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-11T05:25:32+09:00", + "updateDate": "2020-11-11T05:25:32+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/12/29/08/12/30/19902583_8c1babd26c2490e878c9d1807dff5012_50.png" + }, + { + "id": "83519895", + "title": "[Commission] 壊理/Eri", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/08/08/06/38/02/83519895_p0_square1200.jpg", + "description": "", + "tags": [ + "R-18", + "loli", + "ロリ", + "壊理", + "掴みピロー", + "へそ", + "僕のヒーローアカデミア" + ], + "userId": "16105069", + "userName": "pumpkinspice", + "width": 707, + "height": 1000, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12343402583", + "private": false + }, + "alt": "#loli [Commission] 壊理/Eri - pumpkinspice的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-08-08T06:38:02+09:00", + "updateDate": "2020-08-08T06:38:02+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/08/02/08/33/10/14571013_74e1cdb0d17f64b538924a54648fe90f_50.jpg" + }, + { + "id": "85653642", + "title": "背くらべ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/14/02/46/50/85653642_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "クレー(原神)", + "七七(原神)", + "ディオナ(原神)", + "背伸び", + "GenshinImpact", + "ブーツ", + "原神10000users入り" + ], + "userId": "29942", + "userName": "日下氏", + "width": 1382, + "height": 1500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "10190765784", + "private": false + }, + "alt": "#原神 背くらべ - 日下氏的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-14T02:46:50+09:00", + "updateDate": "2020-11-14T02:46:50+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/07/19/06/28/06/21062839_2d3f239a9ac892d848a3ed1b3760041b_50.png" + }, + { + "id": "91339695", + "title": "nugi", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/18/23/31/17/91339695_p0_square1200.jpg", + "description": "", + "tags": [ + "オリジナル", + "女の子", + "けもみみ", + "部屋", + "獣耳", + "創作", + "おしり" + ], + "userId": "19133926", + "userName": "HOJI", + "width": 1768, + "height": 2500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12352332092", + "private": false + }, + "alt": "#オリジナル nugi - HOJI的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-18T23:31:17+09:00", + "updateDate": "2021-07-18T23:31:17+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/02/11/17/54/39/17902589_cddd85b744eefa4d9debe484dd11bc3d_50.jpg" + }, + { + "id": "86419304", + "title": "スペース鍾離先生", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/12/20/20/04/14/86419304_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "鍾離", + "GenshinImpact", + "スペースキャット", + "宇宙猫", + "原神5000users入り" + ], + "userId": "142323", + "userName": "猫囃子", + "width": 1600, + "height": 904, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12352178089", + "private": false + }, + "alt": "#原神 スペース鍾離先生 - 猫囃子的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-12-20T20:04:14+09:00", + "updateDate": "2020-12-20T20:04:14+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2013/09/10/17/52/56/6797485_7244c01e9197f421df4171e0db5ab92e_50.jpg" + }, + { + "id": "86907465", + "title": "Hu Tao 💀 Qiqi", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/01/08/19/24/58/86907465_p0_custom1200.jpg", + "description": "", + "tags": [ + "GenshinImpact", + "Genshin", + "hutao", + "qiqi", + "原神" + ], + "userId": "18584738", + "userName": "Ninjacat", + "width": 2480, + "height": 1748, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12352269546", + "private": false + }, + "alt": "#GenshinImpact Hu Tao 💀 Qiqi - Ninjacat的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-01-08T19:24:58+09:00", + "updateDate": "2021-01-08T19:24:58+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/01/08/19/10/23/19967648_046402112047691bb87d3fb7ea86ffc0_50.jpg" + }, + { + "id": "85349943", + "title": "森林冰火人", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/10/31/11/55/22/85349943_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "七七(原神)", + "クレー(原神)", + "原神1000users入り" + ], + "userId": "30716447", + "userName": "ginklaga", + "width": 900, + "height": 1282, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "11568152040", + "private": false + }, + "alt": "#原神 森林冰火人 - ginklaga的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-31T11:55:22+09:00", + "updateDate": "2020-10-31T11:55:22+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/10/02/08/29/58/14846443_38890f901917803f5dd96f1f90e31b41_50.jpg" + }, + { + "id": "89519018", + "title": "Naughty Cat", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/05/01/19/51/42/89519018_p0_custom1200.jpg", + "description": "", + "tags": [ + "R-18", + "ロリ", + "genshinimpact", + "ディオナ(原神)", + "ディオナ", + "クレー(原神)", + "可莉", + "百合", + "klee", + "原神" + ], + "userId": "51238383", + "userName": "Luxuriou S", + "width": 2432, + "height": 2394, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": { + "id": "12331278173", + "private": false + }, + "alt": "#ロリ Naughty Cat - Luxuriou S的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-01T19:51:42+09:00", + "updateDate": "2021-05-01T19:51:42+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/06/21/22/45/18/18864399_aed5908e8db5d0cc4ec161329ef77619_50.png" + }, + { + "id": "91187479", + "title": "🌪🌪🌪🌪", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/07/12/03/52/21/91187479_p0_custom1200.jpg", + "description": "", + "tags": [ + "原神", + "空(原神)", + "楓原万葉", + "ウェンティ", + "魈(原神)", + "原神5000users入り" + ], + "userId": "3420822", + "userName": "Csyday", + "width": 1106, + "height": 1350, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12352158866", + "private": false + }, + "alt": "#原神 🌪🌪🌪🌪 - Csyday的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-12T03:52:21+09:00", + "updateDate": "2021-07-12T03:52:21+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/12/16/05/37/13/19837561_b06123df96281c2c1670bbde90af5286_50.jpg" + }, + { + "id": "86465064", + "title": "肉蛋冲鸡", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2020/12/23/00/13/25/86465064_p0_custom1200.jpg", + "description": "", + "tags": [ + "R-18", + "女の子", + "loli", + "原神", + "幼女", + "七七(原神)", + "七七" + ], + "userId": "7270720", + "userName": "提比爷爷", + "width": 2480, + "height": 3508, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "10190813445", + "private": false + }, + "alt": "#女の子 肉蛋冲鸡 - 提比爷爷的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-12-23T00:13:25+09:00", + "updateDate": "2020-12-23T00:13:25+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/12/10/00/50/09/13545222_e4be8a9c803ec0a57c2cd364bc5fd603_50.png" + }, + { + "id": "90885211", + "title": "Diona with bang", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/06/29/04/18/50/90885211_p0_square1200.jpg", + "description": "", + "tags": [ + "女の子", + "可愛い", + "catgirl", + "GenshinImpact", + "原神", + "ケモミミ", + "猫耳", + "ディオナ(原神)" + ], + "userId": "3603730", + "userName": "loentar", + "width": 2048, + "height": 2048, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": { + "id": "12351968641", + "private": false + }, + "alt": "#女の子 Diona with bang - loentar的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-29T04:18:50+09:00", + "updateDate": "2021-06-29T04:18:50+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/08/09/04/36/16/19142331_d4f92b2f1a411c73a6d0e98733b9cc02_50.png" + }, + { + "id": "90690399", + "title": "养猫日常", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/06/20/19/19/13/90690399_p0_square1200.jpg", + "description": "", + "tags": [ + "R-18", + "迪奥娜", + "原神", + "萝莉" + ], + "userId": "21635902", + "userName": "无啼", + "width": 3000, + "height": 3000, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12352029300", + "private": false + }, + "alt": "#迪奥娜 养猫日常 - 无啼的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-20T19:19:13+09:00", + "updateDate": "2021-06-20T19:19:13+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://s.pximg.net/common/images/no_profile_s.png" + }, + { + "id": "90370584", + "title": "七七", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/06/06/19/25/11/90370584_p0_square1200.jpg", + "description": "", + "tags": [ + "R-18", + "原神", + "七七", + "空七", + "揉みしだきたい乳" + ], + "userId": "13535755", + "userName": "偷腥の狄璐卡", + "width": 767, + "height": 1100, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12331384372", + "private": false + }, + "alt": "#原神 七七 - 偷腥の狄璐卡的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-06T19:25:11+09:00", + "updateDate": "2021-06-06T19:25:11+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/06/28/15/44/27/20948691_00468de6095aec3411b6998596a571d8_50.jpg" + }, + { + "id": "86086558", + "title": "クレー | レザー", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/12/04/18/32/13/86086558_p0_square1200.jpg", + "description": "", + "tags": [ + "R-18", + "ロリ", + "クレー(原神)", + "原神", + "少女" + ], + "userId": "40169508", + "userName": "crumbles", + "width": 1300, + "height": 1625, + "pageCount": 5, + "isBookmarkable": true, + "bookmarkData": { + "id": "12331339990", + "private": false + }, + "alt": "#ロリ クレー | レザー - crumbles的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-12-04T18:32:13+09:00", + "updateDate": "2020-12-04T18:32:13+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/11/25/08/06/44/16582607_b2c1907a9a817c770a86515ac3f9cbd6_50.gif" + }, + { + "id": "89694803", + "title": "Diona (just cats chatting)", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/05/08/19/01/23/89694803_p0_square1200.jpg", + "description": "", + "tags": [ + "猫耳", + "女の子", + "原神", + "迪奥娜", + "ディオナ(原神)", + "GenshinImpact", + "猫", + "ケモミミ", + "可愛い" + ], + "userId": "3603730", + "userName": "loentar", + "width": 2048, + "height": 2048, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12352007886", + "private": false + }, + "alt": "#猫耳 Diona (just cats chatting) - loentar的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-08T19:01:23+09:00", + "updateDate": "2021-05-08T19:01:23+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/08/09/04/36/16/19142331_d4f92b2f1a411c73a6d0e98733b9cc02_50.png" + }, + { + "id": "71553807", + "title": "paff女神", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/11/08/01/33/27/71553807_p0_square1200.jpg", + "description": "", + "tags": [ + "R-18", + "paff", + "cytus" + ], + "userId": "13046221", + "userName": "teslamax", + "width": 2732, + "height": 2048, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "5092259170", + "private": false + }, + "alt": "#paff paff女神 - teslamax的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-11-08T01:33:27+09:00", + "updateDate": "2018-11-08T01:33:27+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://s.pximg.net/common/images/no_profile_s.png" + }, + { + "id": "89900124", + "title": "无题", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/05/26/10/20/51/89900124_p0_custom1200.jpg", + "description": "", + "tags": [ + "原神", + "萝莉", + "Genshinimpact", + "七七", + "裸足", + "百合", + "女孩子", + "可莉", + "猫耳", + "ディオナ(原神)" + ], + "userId": "15205988", + "userName": "貢 茶", + "width": 2195, + "height": 3233, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": { + "id": "12292943415", + "private": false + }, + "alt": "#原神 无题 - 貢 茶的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-17T09:01:13+09:00", + "updateDate": "2021-05-26T10:20:51+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/06/01/03/57/51/18746616_dc83e97e1ced85765c290ba14c426418_50.jpg" + }, + { + "id": "90630791", + "title": "twitter落書きまとめ③", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/06/18/10/52/22/90630791_p0_square1200.jpg", + "description": "", + "tags": [ + "R-18", + "パイモン(原神)", + "ディオナ(原神)", + "ルナ(シャドウバース)", + "黒羽アリス", + "スヤリス姫", + "キョウカ(プリコネ)", + "シャドウバース", + "シャドウバース(アニメ)", + "原神" + ], + "userId": "50766103", + "userName": "庵葉こはく", + "width": 1196, + "height": 1664, + "pageCount": 11, + "isBookmarkable": true, + "bookmarkData": { + "id": "12352081601", + "private": false + }, + "alt": "#パイモン(原神) twitter落書きまとめ③ - 庵葉こはく的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-18T10:52:22+09:00", + "updateDate": "2021-06-18T10:52:22+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/03/08/20/40/44/18069569_2a0b920c4d6613c044367174f6018041_50.png" + }, + { + "id": "84818149", + "title": "开瓶器", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/10/05/13/50/38/84818149_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "派蒙", + "表情包" + ], + "userId": "13530129", + "userName": "奔跑的弱鸡", + "width": 2097, + "height": 2178, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12352172100", + "private": false + }, + "alt": "#原神 开瓶器 - 奔跑的弱鸡的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-05T13:50:38+09:00", + "updateDate": "2020-10-05T13:50:38+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/02/13/19/21/37/17915445_a8401c1a1f4ae74635cacebb41122370_50.jpg" + }, + { + "id": "89708888", + "title": "水个进度", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 4, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/05/09/06/02/58/89708888_p0_custom1200.jpg", + "description": "", + "tags": [ + "萝莉", + "迪奥娜", + "七七", + "百合", + "可莉", + "原神" + ], + "userId": "15205988", + "userName": "貢 茶", + "width": 4980, + "height": 2063, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12292977145", + "private": false + }, + "alt": "#萝莉 水个进度 - 貢 茶的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-09T06:02:58+09:00", + "updateDate": "2021-05-09T06:02:58+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/06/01/03/57/51/18746616_dc83e97e1ced85765c290ba14c426418_50.jpg" + }, + { + "id": "85540784", + "title": "七七和可莉", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/08/17/03/33/85540784_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "可莉", + "七七", + "女孩子", + "哈哈", + "同人", + "赤と青" + ], + "userId": "18478848", + "userName": "鱼鹅BABA", + "width": 3508, + "height": 2480, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "10190905925", + "private": false + }, + "alt": "#原神 七七和可莉 - 鱼鹅BABA的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-08T17:03:33+09:00", + "updateDate": "2020-11-08T17:03:33+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/07/24/22/51/34/21094082_aa00db3bdad8fc5caaa883a600cfb5ca_50.png" + }, + { + "id": "84378134", + "title": "原神の奇妙な冒険", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/09/14/23/10/50/84378134_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "Genshin", + "迪卢克", + "琴", + "温迪", + "ジョジョ立ち", + "可莉", + "西風騎士団", + "だいたいあってる" + ], + "userId": "2046536", + "userName": "Grover.Y", + "width": 3292, + "height": 2059, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "10190785843", + "private": false + }, + "alt": "#原神 原神の奇妙な冒険 - Grover.Y的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-09-14T23:10:50+09:00", + "updateDate": "2020-09-14T23:10:50+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/06/09/04/14/10/14335625_52a126f7a4d0b28424aa61595a2fb2f5_50.png" + }, + { + "id": "91024154", + "title": "又()又()", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/07/05/03/32/21/91024154_p0_custom1200.jpg", + "description": "", + "tags": [ + "甘雨(原神)", + "刻晴", + "原神", + "甘雨", + "百合", + "魅惑の谷間", + "濡れ透け", + "着衣巨乳", + "刻甘", + "keqing" + ], + "userId": "15205988", + "userName": "貢 茶", + "width": 3522, + "height": 3084, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": { + "id": "12293006208", + "private": false + }, + "alt": "#甘雨(原神) 又()又() - 貢 茶的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-05T03:08:02+09:00", + "updateDate": "2021-07-05T03:32:21+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/06/01/03/57/51/18746616_dc83e97e1ced85765c290ba14c426418_50.jpg" + }, + { + "id": "85261529", + "title": "パイモンちゃん", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2020/10/26/23/11/48/85261529_p0_custom1200.jpg", + "description": "", + "tags": [ + "原神", + "パイモン(原神)", + "嫁分身", + "原神5000users入り" + ], + "userId": "3822903", + "userName": "しよへえ", + "width": 2074, + "height": 1649, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12360115602", + "private": false + }, + "alt": "#原神 パイモンちゃん - しよへえ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-26T23:11:48+09:00", + "updateDate": "2020-10-26T23:11:48+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/10/26/23/06/41/19571112_5731cf614ab667f20e10c5a1be49399e_50.jpg" + }, + { + "id": "91303962", + "title": "原神七七", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/17/17/34/54/91303962_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "ゾンビ", + "ゾンビ娘", + "七七(原神)", + "ストッキング", + "ロリ", + "岛", + "渡厄真君", + "萝莉" + ], + "userId": "20953205", + "userName": "崩解释", + "width": 6137, + "height": 8000, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 原神七七 - 崩解释的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-17T17:34:54+09:00", + "updateDate": "2021-07-17T17:34:54+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/05/24/23/49/40/12602988_72801e3419db6efa59b072558316c2a3_50.jpg" + }, + { + "id": "85010295", + "title": "七七", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/10/14/19/03/13/85010295_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "七七(原神)", + "ミルク", + "お腹", + "ロリ", + "幼女", + "キョンシー", + "ぺたん座り", + "たくしあげ", + "原神10000users入り" + ], + "userId": "31133701", + "userName": "カンザリン", + "width": 1148, + "height": 1684, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 七七 - カンザリン的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-14T19:03:13+09:00", + "updateDate": "2020-10-14T19:03:13+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/04/18/00/00/20/14108360_b5fe7057125584b6a3ffe7ca7c61f0be_50.png" + }, + { + "id": "85047720", + "title": "七七", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/10/16/19/30/07/85047720_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "七七", + "七七(原神)", + "ナナ(原神)", + "原神10000users入り" + ], + "userId": "3172636", + "userName": "雨傘ゆん", + "width": 1404, + "height": 2240, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 七七 - 雨傘ゆん的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-16T19:30:07+09:00", + "updateDate": "2020-10-16T19:30:07+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/07/06/10/48/11/20990790_6fad49198fd6cdea8e5d50f625b8cc01_50.jpg" + }, + { + "id": "85109931", + "title": "七七ちゃん貯金箱", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/10/19/14/14/37/85109931_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "七七(原神)", + "言い出しっぺの法則" + ], + "userId": "83521", + "userName": "蒔島梓", + "width": 860, + "height": 1200, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 七七ちゃん貯金箱 - 蒔島梓的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-19T14:14:37+09:00", + "updateDate": "2020-10-19T14:14:37+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/01/29/00/10/53/20087560_12d70e6c5fcc5cd64de079af6fc750f1_50.png" + }, + { + "id": "87173315", + "title": "甘雨お姉ちゃん見て!", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/01/20/07/15/26/87173315_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "クレー(原神)", + "七七(原神)", + "甘雨(原神)", + "あっ", + "to_be_continued", + "オイオイオイ", + "このあと滅茶苦茶", + "志村後ろー!", + "原神5000users入り" + ], + "userId": "29942", + "userName": "日下氏", + "width": 1378, + "height": 1500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 甘雨お姉ちゃん見て! - 日下氏的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-01-20T07:15:26+09:00", + "updateDate": "2021-01-20T07:15:26+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/07/19/06/28/06/21062839_2d3f239a9ac892d848a3ed1b3760041b_50.png" + }, + { + "id": "85377856", + "title": "七七", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/01/03/23/47/85377856_p0_square1200.jpg", + "description": "", + "tags": [ + "女の子", + "原神", + "GenshinImpact", + "七七(原神)", + "原神10000users入り" + ], + "userId": "38909135", + "userName": "コポリ", + "width": 3500, + "height": 3232, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#女の子 七七 - コポリ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-01T03:23:47+09:00", + "updateDate": "2020-11-01T03:23:47+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/10/27/19/58/18/19575800_362a0d7098ef214dae70ef7f90389b9d_50.jpg" + }, + { + "id": "85294099", + "title": "七七", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 4, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/10/28/19/38/17/85294099_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "七七(原神)", + "お腹", + "幼女", + "たくしあげ", + "キョンシー", + "白丝", + "ぱんつ", + "七七", + "原神10000users入り" + ], + "userId": "4023292", + "userName": "苏翼丶", + "width": 2434, + "height": 3819, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 七七 - 苏翼丶的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-28T19:38:17+09:00", + "updateDate": "2020-10-28T19:38:17+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/11/13/23/44/44/19663797_a123bd2921301b98148b46f11d055d17_50.jpg" + }, + { + "id": "85026747", + "title": "クレー 七七 I字バランス", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 4, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/10/15/17/11/04/85026747_p0_square1200.jpg", + "description": "", + "tags": [ + "I字バランス", + "七七(原神)", + "クレー(原神)", + "原神", + "ロリ", + "強視", + "白ハイソックス" + ], + "userId": "19562097", + "userName": "J_Violet", + "width": 4904, + "height": 3969, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#I字バランス クレー 七七 I字バランス - J_Violet的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-15T17:11:04+09:00", + "updateDate": "2020-10-15T17:11:04+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/10/15/17/38/30/19515091_256c74ba22ba329316115050469e6dae_50.png" + }, + { + "id": "91314025", + "title": "甘雨", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/07/18/00/06/41/91314025_p0_custom1200.jpg", + "description": "", + "tags": [ + "原神", + "Genshin", + "甘雨", + "甘雨(原神)", + "女の子", + "少女", + "セーラー服" + ], + "userId": "6890797", + "userName": "マッタン", + "width": 1056, + "height": 1715, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 甘雨 - マッタン的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-18T00:06:41+09:00", + "updateDate": "2021-07-18T00:06:41+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/11/11/00/00/41/15000535_1bc5becadf2737418bc482149cc992a4_50.png" + }, + { + "id": "91196524", + "title": "百合", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 4, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/12/18/01/34/91196524_p0_square1200.jpg", + "description": "", + "tags": [ + "黒タイツ", + "甘雨(原神)", + "百合", + "原神", + "黑丝", + "刻晴", + "濡れ透け", + "裸ワイシャツ", + "半脱ぎ", + "ソックス足裏" + ], + "userId": "12778394", + "userName": "MZ也也爱吃泡面", + "width": 3058, + "height": 3822, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#黒タイツ 百合 - MZ也也爱吃泡面的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-12T18:01:34+09:00", + "updateDate": "2021-07-12T18:01:34+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/04/06/21/16/44/18275842_ad35957bf77e1b38c4aa3235e5ec189e_50.jpg" + }, + { + "id": "91326691", + "title": "(✪ω✪)", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/18/15/22/11/91326691_p0_square1200.jpg", + "description": "", + "tags": [ + "甘雨(原神)", + "甘雨", + "原神", + "刻晴", + "水着", + "刻甘" + ], + "userId": "3213809", + "userName": "茶餅", + "width": 2044, + "height": 972, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#甘雨(原神) (✪ω✪) - 茶餅的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-18T15:22:11+09:00", + "updateDate": "2021-07-18T15:22:11+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/06/12/16/13/22/20860579_79b812f71759d274a252f864d8cc35f9_50.jpg" + }, + { + "id": "90533611", + "title": "甘雨 x 刻晴", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 4, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/06/13/23/39/54/90533611_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "甘雨(原神)", + "甘雨", + "刻晴", + "百合", + "キス", + "刻甘" + ], + "userId": "4250280", + "userName": "Daram", + "width": 2500, + "height": 2500, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 甘雨 x 刻晴 - Daram的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-13T21:22:31+09:00", + "updateDate": "2021-06-13T23:39:54+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/07/22/15/37/22/21080648_19281eae84c35bfd216360091a4ac22d_50.png" + }, + { + "id": "91314136", + "title": "甘雨", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/18/00/09/04/91314136_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "감우", + "Ganyu", + "GenshinImapct", + "Genshin", + "少女", + "魅惑のふともも", + "girl", + "甘雨(原神)", + "甘雨" + ], + "userId": "62011283", + "userName": "zonunoll", + "width": 4000, + "height": 5657, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 甘雨 - zonunoll的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-18T00:09:04+09:00", + "updateDate": "2021-07-18T00:09:04+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/05/20/14/33/31/20733474_dd2cc99b80217068ee1623fb47686ece_50.jpg" + }, + { + "id": "91054709", + "title": "甘雨脑袋", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/06/17/54/58/91054709_p0_square1200.jpg", + "description": "", + "tags": [ + "女の子", + "原神", + "甘雨(原神)", + "極上の女体" + ], + "userId": "17519639", + "userName": "蓝白姬♪康康微博可以吗", + "width": 2400, + "height": 2400, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#女の子 甘雨脑袋 - 蓝白姬♪康康微博可以吗的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-06T17:54:58+09:00", + "updateDate": "2021-07-06T17:54:58+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/06/16/00/24/44/18832285_a0db85475e15b3ea6fcc069952d513a9_50.jpg" + }, + { + "id": "91289344", + "title": "甘雨 刻晴", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/17/00/00/04/91289344_p0_square1200.jpg", + "description": "", + "tags": [ + "甘雨(原神)", + "刻晴", + "原神", + "Genshin", + "水着", + "魅惑の谷間", + "海", + "原神1000users入り", + "刻甘", + "乳合わせ" + ], + "userId": "28279345", + "userName": "Sora", + "width": 1982, + "height": 1754, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#甘雨(原神) 甘雨 刻晴 - Sora的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-17T00:00:04+09:00", + "updateDate": "2021-07-17T00:00:04+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/09/01/16/30/47/19288482_bf7d7dee06da726489343149ce2e4888_50.png" + }, + { + "id": "90493204", + "title": "刻甘", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/06/12/09/32/14/90493204_p0_custom1200.jpg", + "description": "", + "tags": [ + "GenshinImpact", + "原神", + "甘雨(原神)", + "刻晴(原神)", + "刻甘", + "百合" + ], + "userId": "58466728", + "userName": "tana", + "width": 2354, + "height": 1741, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#GenshinImpact 刻甘 - tana的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-12T09:32:14+09:00", + "updateDate": "2021-06-12T09:32:14+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/07/16/13/35/08/21046508_bf301173f4c292eaeca02b8109f8733e_50.png" + }, + { + "id": "91290724", + "title": "社会凯瑟琳", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/17/00/40/43/91290724_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "凯瑟琳", + "キャサリン" + ], + "userId": "8673088", + "userName": "菲洛猫", + "width": 2480, + "height": 3508, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 社会凯瑟琳 - 菲洛猫的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-17T00:40:43+09:00", + "updateDate": "2021-07-17T00:40:43+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/01/10/01/27/07/15238950_9cc37e57920e90eba13bf3273ae58eab_50.jpg" + }, + { + "id": "91384160", + "title": "2.0", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/21/00/35/13/91384160_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "원신", + "Genshin_Impact", + "Baal", + "雷電将軍", + "蛍(原神)" + ], + "userId": "3607631", + "userName": "hayaroB", + "width": 1000, + "height": 621, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 2.0 - hayaroB的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-21T00:35:13+09:00", + "updateDate": "2021-07-21T00:35:13+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/09/03/23/05/41/14732314_6365fdd58dbf377ddbff45ca7e5a7b3b_50.jpg" + }, + { + "id": "84553956", + "title": "派蒙 改", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/09/23/01/32/07/84553956_p0_square1200.jpg", + "description": "", + "tags": [ + "派蒙", + "原神", + "パイモン(原神)", + "非常食" + ], + "userId": "9471676", + "userName": "ミュート", + "width": 640, + "height": 640, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#派蒙 派蒙 改 - ミュート的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-09-23T01:32:07+09:00", + "updateDate": "2020-09-23T01:32:07+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/03/14/06/17/27/18106315_2d9e94d073e864044c9c6d5059900de5_50.jpg" + }, + { + "id": "91403730", + "title": "原神", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/22/00/00/16/91403730_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "アルベド", + "クレー", + "パイモン" + ], + "userId": "483730", + "userName": "あるてら", + "width": 1275, + "height": 1800, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 原神 - あるてら的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-22T00:00:16+09:00", + "updateDate": "2021-07-22T00:00:16+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/03/28/23/41/49/20437119_59ce94ccf89b7009d258c2ece756b498_50.png" + }, + { + "id": "87236094", + "title": "わたくしの後に続きなさい", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/01/23/08/46/49/87236094_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "クレー(原神)", + "フィッシュル(原神)", + "なにこれかわいい", + "船場吉兆", + "大地を減らす(爆発痕)", + "ノバキッズ", + "原神10000users入り" + ], + "userId": "29942", + "userName": "日下氏", + "width": 1028, + "height": 1500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 わたくしの後に続きなさい - 日下氏的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-01-23T08:46:49+09:00", + "updateDate": "2021-01-23T08:46:49+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/07/19/06/28/06/21062839_2d3f239a9ac892d848a3ed1b3760041b_50.png" + }, + { + "id": "91428641", + "title": "パイモンちゃん", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/23/16/56/34/91428641_p0_square1200.jpg", + "description": "", + "tags": [ + "幼女", + "可愛い", + "パイモン(原神)", + "原神", + "空(原神)", + "同人", + "非常食", + "握りしめたい、その笑顔" + ], + "userId": "9153585", + "userName": "haku89", + "width": 5016, + "height": 3541, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#幼女 パイモンちゃん - haku89的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-23T01:15:33+09:00", + "updateDate": "2021-07-23T16:56:34+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/06/26/14/26/03/14408330_3de67ff59732d611d71369bddd8ea287_50.jpg" + }, + { + "id": "85667426", + "title": "F", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 4, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/14/20/39/29/85667426_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "フィッシュル(原神)", + "腋", + "原神5000users入り", + "フィッシュル・ヴォン・ルフシュロス・ナフィードット" + ], + "userId": "5151250", + "userName": "litsvn", + "width": 813, + "height": 1214, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 F - litsvn的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-14T20:39:29+09:00", + "updateDate": "2020-11-14T20:39:29+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/11/06/04/28/02/13425181_25615276d25e09f2ee365e4934bcff9b_50.jpg" + }, + { + "id": "91336876", + "title": "Raiden Shogun", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/18/22/06/49/91336876_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "GenshinImpact", + "원신", + "Raiden", + "RaidenShogun", + "巴尔", + "Baal", + "雷電将軍" + ], + "userId": "13482756", + "userName": "MMLYNO", + "width": 1600, + "height": 2263, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 Raiden Shogun - MMLYNO的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-18T22:06:49+09:00", + "updateDate": "2021-07-18T22:06:49+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/10/13/00/45/24/16405892_c58203d67369f3fac263cc72c290949f_50.png" + } + ] + } +} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..1f0dcb8 --- /dev/null +++ b/README.md @@ -0,0 +1,66 @@ +
%C?ZfcwZgwG;^dFJDu?@>Pm zv>uWDDtu<%g`QmWuw=wk&d~*|R7~%j_TQNlU|l6drY=XE+_|^HzT};ucFk@Rbhxu} ziHB)aeRERzd8!W|0iL_zTXJ5*A!^U9f&5;ICT0=&c3(J*HyuA24UAaSv29hD>_V33 zZF_hYFT&Z1p6IU`HTJWq`?k2K=Mf2{P#M5@^ntZQ~gm%?LGYuej)*h;Y& zwPEV4X8HWQxfn*(1UWwX2dtgi``?yrhMtz;V|}9$Hhk-8-bE8zl4?YVwP;d$D!#kk zar045%QM!M)kaZdn-J;vqODbzY(6JRw@q6aj2|LwJ50Sx)*d+5ga1A!(${mgEJTi8 z_$MLqL9NaoL&31}_v}|qAqL=(0a2n}&TH%< z2T@`Qw76lLcOgl#9NuCBAhN^&01L{%fB%ciB7mqH!?Uqp`1+Wb5QX%+Fi~0vECLwz zi(*xRzn<=#_e%l}((&Iab}a{9?U~j)>aec$(Y~6V(vp1`iO1w4C-MC)EKYL&Nkzxs zOSg@bKIUyV+U2g8L;CLY)BCkkS!L?8>f`z nlvQouT$p60;@$~9} zFgM=(4L2=0aA{bR+6zUU0%{|3ovVY64*r&1;fmJd!DPo&i9EbJO)D5d=AHZ559-fe zewWLsB}Cr;S#Ej8UD2}N{Osm*N@L$*VD|Nq3jux_;?8shyBac##wQVnUE3Fj$Wn)D zyNCI2^?m76ZHDiB%1L<2IgHr<&B#!MGf5Acy6^};h5%=%B`Qy42T>PiKL#Jk2YN~U z>s5fN8!GR4xle@M9}~Li2Ijw*Ol>cy3Op;9^7FtRRKV~I8OR_o^MB`4sm3x6BSfb= zz$dseUGqTEx; &2E$JU7j-=;6|KuT4KrLgXYss zs=fBBeN)d7v4*352BJm;qE&~Az^L-P nKm>4AxH#=A+FbI z_i0riKX87PSb1M}b5L|Zc@#!))VO&4XxVGgO@menX8LzXpaYQ~_sm)7Jiy~Fm<*$i zCv|t2c$&kDn $pLu6ERgkf;6o~a0%!*zXpAGsr;gJwb%HHTZ4zd2O@}tpKjbA&n#g6-Slyz zW(#`3W#`>B 4U^yN26IhxdjTRdj%%NN_b45 ziDm6T8MXIO@}iuD2D)ACH+v8Pf=Z7XAQhDVWK*{iUb7bW{5h;&7N04onJpt-67y|1 zY`LAQ6Ql%(;%{Yn! #RP~K>Ss+|aAfJ47Oj-EDq3kNqm#rU zR?{Bt-a{Bt?|8WGO7~r{UmvGZ5c>Q0!MAMUlhI3hc@AljG9PheWNw_cV?^|SRoc8S z@t%KPd;g_wgT`y|-?c%*MJ1Zj`kGyV=(=n%6mifQy_f9yl4rP0OrGSgoDZ&Vp6(6= zlU%f{+*D4|NbMpQ-5=1=;UAwPQ0pZ`FqMSrzTTax4$C _LLNsC4?(`C zLV@>oFvDfux5m3vwTTNs1Qf-OtbuQBmP%~BOI>P^-32taa$Ph#rSLcwR5F4eF=(GL zQ5E#v6f=^UKRw17WoI^&s-yuy8+CAN4p_5w@_sUWWpn-A`=z>?c>lX!?QaNEtj^4Y zBZ$XjZ(H{}ZvX1C6ybSYAAMcC)i)05VK;kheeP;&OI!CkVBa&F2z@H3@YzPZvS(p0 zUDPnmBOZl`15cn*UJE~R^5Z _9rz8bU}{=# zzGv #r$Mv7-89L>z)V(@u0sLAO^c zw1fzz)VFrW(Qb6G$>=B>%&*eJxOjwSZVfZNj;wOE93PWCa}8`_K$We>YTq@qY*Z_m zI;<4DxpbBW>v-bLU(mqo)=sJHFTDeN fF@ zorm5_ %oyy^aI!tf(umz46nCoxq!Cj$Xg2UF0ILT 6w z4UOX#y*eHC%ZCB$zVtAQ7z&xQQY|~f-cPn(LT23K8%=x2#o-rTs`e%ptl$gxe>;r$ zfbB?_2A3;pS5T^Lw^s0>!udD{1>xTDkW1Z#J+l@cv8>6(_0@`=>N+;fJQx b4UPVvFaQuF09 ztR*jkv4Ac5xt?|B)+8{w3i0ipcC2~PlWIp`#wnT~h0956rb>X6f4QyY0wtJq{Cxy! z3ph6zm!Mr9=@(eg88hmrtcweUvZWy;_eA^Dknl&_(E=jU`vs!wzxsY&JW bDw{0dEvSfxZ!dlE{GidTf9OYij#(DT z 3?ha+xlgUT-ALKyTJ*JLuj@v{c!^%);ei7HI>fh$Q;FBAuX3 z9tuhK!osP0_TjoEThF8f@)=xfPj@4VXR?iqpFdzk$dXuWcSUd^cP&urKga@p-IrZ< z$kr(Cyob@3rkR*^`~wypzrEJ;>BY!;RDC_iCB-^$8ngSEMPj90&AFOp%0Wo(&Ar=R z`huPSG5c&iiv5{P%+Iu}aa)$2z=+!zmQNYMd+!=%3}326Z(P24!}C*WV{AxZ&X9Hj zMwB=?L`d@WNLgG@qa> GUzqMz&cm|DRXelVak-L7<6pMm z<#~oKB*~u-_MJ1wJKeLCZbrS^_2%PXlR~6|^eIV7<|`WRU2hG+udIQi7E+LtQqKfR zRn3Q-^sktUGNY)wKHDnbS;mSzf<1DO+>^a@w23=x8;BLGD$tqGvwYoGKfUXNett3Z zs&>0sUB?$^sMaK6+f29xrC5E^>`vm4NWdaa&CIk?x&>qkb%s|L-Ly*8A09r$8M2*^ z>g^*>bH2FX4P+cClsL|t_WEvcr0z$ftlmEkC7Q?uD{MPCoeHCRSopGh4CQLHL;bOe z2vd^YWK&&ujOS~ry@c9mh1H9iSK#7K>eg-4;CcIAWRDc+o8Um(&h#@U%xz-DtQYN= z1P6=KlY8EkC*q06ujMF7Q9Rg?^v!mtb(t(s?T&0rtP;o!a07#Lgvz$z0~LcHqumNF zmm@Ba{UeC8<3dkoaQ$wrQ)#r8hND5QSV~Gm0 48P+7TyJ|e2W F*=9pXYs|RMwNF3~r78WWwln zBwY&DNi%VHqo~8dWkQ$7-*J5`pF3%Gw<2s{jmmwC>!o->+LiMLb;f3X+l75^rjsKV z2Wy2>5=NDY^b}1ee4eYrrF>O|VU`G8Xr800`3A`z#BS5jX1V)7Ck?oJ_}Ech7vXT_ zAD-Tw{q>g2{vG%UGOvq!@DG;{-|cxcR2a^|2$3^Nr$o|&6#jx{G(XpT*Ly!M*u+a8 zC!}chc)+a!Ocg-}DcrD8wuFR(9Y9b7MPZRzliJXRyxu5KlJwwFss4Ch4Vf%uk@F5` z@%gwnu=}QH7R2VM%nN&?>{9Q)NjIlvs0kb9doL<;l0Md(F8gOd>-S8^8Z*zqpk*1O z$mCEEUAK)F2&&A0i37Ed8hN3U@QqR#3fy-m*wRF9#TQ-kAL|u?4x;P)Y7qMi?k#&M zyGGja2dByOL7K;X`&s%D%UHYT(M~M&HAHP-zn+(abmbDamqu=EJQX+U+?%K!7Cu=Z zMNURJeEPL=`?Hef$v)2Q_l2o%9X{mM5{Q6Pk&(x~PR7DRrDW_b1m!^Y>fT)bEMd z50mj^FO=SYHTBSI{&|y31FWM&$^>R{5OClx_T)*)xUWNi#1{i9pPnJ#U#vJcFLEWM zzSJ`s3wHLJf!O)&F3M(|(sC3&&St|Z=W}7}()`o_!BIL+mFn@0HPVqY1s7>zOQm=e zMvGn)hk`iFW^L!f2q>*_URFt#cEdB4)U2yvuTPic1M?0;L+$=>pI3x6%<6h%o2pYb zE=`)VE$T%WT2ACMg%e8{iF?7#yHc(zpC*t&f ufyZN8WPK?(gh}B2f2Q>lyUuNN)ahHhJa7 zskP~ZdXi~ZksEQJ7$oB(IL%(M_4RZ0qWhXOPIaB-+eC^0Z |mwu;Nj~Dy7KinYF_HJyLc4aEqpSIZj)o+!uJDpI_C3vEa7zl-gFhOYkFv zZGtHj`1BrFeklQNpeH`;&Pi6L5zS7)8sOieyoJ)&hds%5-2dDswAESK(;G$nAwEAz z(SW2{3bd`X`t}n)#51z=cblhyezNd)11{&B; 8J2qOmmA8j&Cx43Iu> z98Iz0LXW^SKUIIhrSa Lz-TQ!}QIF_ #^KW 3vq|W~1^6ue9{}w2^e%Wt_Kp?#TB5%KL z(5h*yS{54j7A@4-2lXc =(i0P+f_9pb*~mI&H(0?Fo$v{2)M!+jJn$ym5j1O1-M}JsLBM zXFk-D;wty<4(s!m%AhbESH*?c)#ck@DKAb$D%LWg51;7IgWek)T5}dnPW%}~fz)O9 zsQxJ$_QPUX)$EHfTd#}NQUrA118tJ%zOi1hn(QCd1W}>HWQ&W{$&*67&nihG6mtTj z1U=!1EXoIO45y&BK-heEK#kJpOM1B^MWqqT=HEmyG;CHmK8&XuzcX#6J~S HivH$=~)}pH0hADR? *|A9cJA(eOQ-0gVdM0y%r1r zQCmJCz*dA>_xAC;kd-2_)IK(Y@YOlQmcm^gMpuH2#qWL0Q_)FcoL@PkS~B`=?sbs? zu#&O7H9>r6ZFF&L-VbqL!vyxg&rj=wTn?G^FaxV}k}U116s-^D_Zn9MUzi-yD{lL$ zGAEYy;fv44<^6ajnEZAsi`RXSyZjqApLBJH3$2}olkB`53gUI`^N|Op#mM^MC2e#$ zJbnNq?%dTDPwAMB%|MrcUf@B^HNdNqd1T5@5wgeRP8~NKh5^#(w0aLK&&P+|y^F2B z6py4_n{s>G@lQiDAJ=8qE;DSS3g2es@em?+D!gzRLjvW4;k!x IqMJ%17~xe7ahKr>uoEz()MgRGG(f06pGX za_#!8kbM>Zln_Y0{+k+4m;nY}`zb&W8}29jeYhjpjQ~1+kq5%Y%&d7wCI^H8`=^Yb z$!OV~8ZDr9wG;5P5l|af2H4`g+|*6P9Ru9}sF_uqZ&$p=W(;AH2N-D5He!c6zP~IS zu%OwdRpp?M-}UuVX)=$&F ~9Fihl&5-N0PQ?!90VQWVy{;?rt?Ue0S>mS3Uaj)x? zjk36&BmWkQA^c&NMd2HTaI&N)G^`SAhCMvc5|5$qB`Y@eBTY&JnQwwk&Jx}K77|K( znT@JBLw6JbqP%ln2|Ua*UvqQWc6J9X7XaAMi@6~$02QHFz^f1-Ir>jBV_0p+wq*xs z1+yoF05alWDHH%0V~7_y5Ci@<@Ued_V(d%fF8lgn*uN4Dz?fHpTduKM{eU`42|v&% zzjAN0y9 $ *)l+`9wmJq!Z89C~b3E*0PnhN`0Gi%NNL G=>Gs~A2f{s literal 0 HcmV?d00001 diff --git a/src/assets/LogoV.png b/src/assets/LogoV.png new file mode 100644 index 0000000000000000000000000000000000000000..5e3b6bd17040eaa949fa8cab3a9b00cdb1c097c1 GIT binary patch literal 7018 zcmZ`;Wmr^Qw1#1b!H*hRYKWmzke05Y8%gODkd&0}?m=*90Z9qzP(W%BK@kKI7#O-o zDTzDYdw<;f-244F^`5iW*=w(7z588zC+X{|lMvr0#=*fMfoZ51Vz2M9$44Rp?Ab$o zg98VL90#VNXdHyQ{|a=?{3T>`nj`TW4Hc9lqRc|eBW2MosbSbxpj{%LH+$h>Ajssa zVF1We$>FYzBflnmhp_!2%bWRtBQ%@hkCc>wgHzV5KVe*(H@!#KTg8Rv;Vzr6(3cUP zf~S#E(^6Yf0~lF9L@V-|kp9ogW7td97mXK}DB3p?$x%Gi1Y-iHDU9sXY#;EfbHNJQ zA0uc_S&~=;Uo-~=BrAL;SMbVuvOyQD)|hpa9~hgrI+{%^LXS3l#iq{#%=Fk`kn$F* zHwS6Zt!T{LQ!VW#f^3cTtb9-a(XnY9v;S77sKEt{$@qE$pm3`LHIF^2C=Fm(mpbS( z!P6=Y-ZWz%Zz_(jJPnl2Xid%i3ssaP@M9^k0#zesO;IBZsL+qLqxLEl*P%#Mwx!b? zj8|eTdtHEwi+)Q9B&Yzsa{MZrtl&hh53SKQb61vDRmdwf+7Ns4f01c&jUIcG=r)SE zQ_X}(Ud5emZF*e>+ z?t!nWj{V!eAqtwBpXEwq_M2mZkNVD$AL8yAovegm(k`zt)8TiUMcyyBN+Nz*`At1^ zZk-bMD3Kb^iX9kb4%OyPIe0Uh&Tnv72(DbNVO5TYJLQ{yJZD!=7c27a@1mFRDh@vE z+Cpjx^*NGa?YGr^J>`uaEKP13T1 iopr!BO>V%BXA`8Xb zz#Rv{RgD~gb|XND&p5O|jF2U)+1$JDcc;k{KOk`f5VJXjnWCM>q;9E(B8!H| !-;z9&{sPDhp{TA|QTC_qv );UO(Xi^I;i#bYOe@H$q6TuzZMqXL!}6Ly<2pzdn^sDkponjML(mpe!d*Ai5*9Y zo12@pO5Agg#;(`jvEC96d#Lo0*A#<4htEHW=nFo6Pe{@;^JD4ScT&JbIOXY1Kw6V! z4___NAH|*_Yu|r?x+mCx=)+UP 7KGz z+ZCICjt0)vS=Gw9^{&FtmubztC4Ec6&qP?lj-y&-cZ1M*W^86X(r%-LE(o{&+ba*3 zSLZ7c5%9U;bG=8ub6fYN{5IhN?-tm6f|tRhyYC{)HzTfgs&9t;gHK1t{IC(dFFj+@ zv=vOSCc73(Y2|qP>8!RI;cjXZ?8Idq5iwvVIJ^tb5w=66(u*R0bossdTA`Nqpy%LS zQ4S|>mh4`AtFCc2OM;U8pZ(TbTn%})gc7VjO7T-Ac<}-z&q98;ObUu(du*;1cHvxG zm49m1W)(_J`y|X~pE3)&Rw(Lne^YTyTDmXd=J)(mj-K33hU>crrjPCLTW`*mma-d8 zLJzyD&E2Z<>UX&PB`Q+eZPk^W@@y}T*KTvZ&ICs2txXCI_-Fa&el)uL8G7`4@;P<$ z*`f!7X-l~)sqC@BT|K4D4}%>=M$PB5FfRO#+BmoeOZcy>cG-OR^F=o IsgNnnUYx97sBt^?uIE-)Qp;b{9LAd!xU~AB8iYQ580_2no0YE4gbmyzv)M5 ze|iOZtASg^e(8#d*+@dT23x&(6t>6D{~U>Q0+YJut)E-_eKU9Qam$7)YBQV1Nn=BJ zBWr#$tdoh&6-)2Fb{`#oyq}K`zCRlxiCMyB^_&P*ViY!Thps*)Q}R0<=PHsp>iyD- z`6RO$eNRvrMitpLh|NUC)lBmsY|g@65WydxfZI%>(|WNKb3uvba3-G!{YdY!kgO$u zAXNDQER 6N-z}S9LAMz zHw0)?KK)hCm5bZCmWf7oI(>PDSY=j}I_kyPPb=g9a*JQsd#0wkM$qX)VxVt$g zYZ3c^js1M*83CQ$V@X%X?f0rxc{pq8tBu{eyb&LQ_Zm9Ra8TcPa|DYBx?J%HKZQID z!4DIr^*Mkz96mFKmXax{;o7*691g89c=y@`@$fR1Y=uK}BSGw12)GQEne*+?ggt+~ zeOOoDk}QSJH43p;TaX6lq*k*4yedGbEo7mC @XiDZxrp_Mi&pFK3*lGVv2I7eLG70h-)Gy0}*tWQ{QaX~B z1l#;_eB0Fr2dlG$x2^R>Z(i6~IlQy&U)Xh?wk`5}cajs#ZO8om=X_*hm4obj->)}7 zsfvuGK{G+}!%7p39PTJDd3|MYOQ{2JeTV?FHJ!o#6FZTOa~55Ua(_&vceuK`V%te{ zRIzIu3TW!%RZM>rNnR4T=yqFewb+o47qCy&Q6%IU5_l|sd*R^mcK;N^b3b4EJAMbn zgL2`Pg;`9h8FY-|0G7iUa2;?jFgutPz2J~Bm9-vaf*mxGB=Kc`qgHgj<$cacJT2kZ zLm(exgWBO*a3#PYj8&aExYDlW(?>(u0I`w(BnOB2CD$3LFKGdPlNys@hG~py_*Sl+ zh<9rY0&qO|hhmXZPj-fX;QI8Fg|KLlW_KcY3e=QV=bIZ`1TOk6vM?*@ zg&CA6b4<8c(x?0`K-P@9XxD}J# z`vZS?kUv87L1WgdpMS>$^gyMcqgGe`=GQ_&n56OZovMPX;?jQ@j}k*CP9NOk)2Wxd zr1!ghU;Mt_t=eL7_-{kq{(85RDxi6X_|~Zu|CR+`0u! (8TX9kD;smY(biorZRBUP zrr_$4H{=PTgF8LOeyaC`nkZ27k+(tjmTCfnXPd#KyS^X2!F(}<>49S+HP^JI@$^_0 zJ7L&VS5BbH$!hX?AIT;sq9c)P+JofJ)fK@pnpfzk4Z)-MlVt9S3YP)!1}N?*)-O&} z1OEEDuDwhgE0Ld$xrTKR<#G=2D!O%R(oYd%g>-%9oUhhj)%|Zs)L|}!ud&Ta6{3zc z;S02^ ys2x@ip1ImWad^bVtZoT6VV<3A|Epb#oxmV zGdth{pRQ%bf!|1|i6oBV1S@)FvTSImaETTaf*A$)?+mY3QdShMQK&iU`%y|F3B3@B zF*4s+S*H CzemD3!kLrys#TaoE{{~+G^kTi Q4UXo?+P!7r93q? ziLkE?-7}sbpP&9YB)jziMex7SJ5e6F)3_EIt}_AxfV{Op#r5(JJy73ACwCmoPFV`p zQxr9?z@JxECZ| fV=L=3JrOYa`Hwm;9^>(jhRG_ z)5ZsRIA69|fLj?Ob#+{TDg!{i%u0dW2miO1O;Dznv>dVq*GEZus9Uo{X6mL!1W~RU zDBFKJTdD2Mg*X^~DwX`di&_-1cOux1RI-Ptt%%7@}gOsj}Z_L`X<( z)y1<*PF+^!8vJW`?tqh<7YFAa<=?dcB@ns7V7hW=j+El(x2clc_y3SKX{bI)@(%pr zXSMF0^aFNnh{^z$Y;F&Iz)@GZRhWpQ-9^bD>LX#sL+>&FbjfJTw)Ma+US0$;p;I%p zqZAU9KgGaWj&8MH?8NXv_i0%=CD16g6aFwph#f+cXYR6*MpHp6m<{|IO(B_X0|EN; zpC9C=** 9>@tOvLqiJ-pA3m@x&^ zg{m9UP?mJmrGfoVD_a8y^t?Hj82bi)HP1kkxa85P6!x1?aN9x9M0&QBJnc%F%##PL zFY`CuEY-?S3 v%b!}kV9tRJ39W4jh zI-XPl@fI%V+RAVbqtJn^t}MUGQnCx7C1B`WR3bN}Xr$FQ_QQD99BZYlY6CDk^1)AN z+2o1X9Sf`LCVo-TOllr43Mw^Q*6F6bz1QGa?m3AxXiK=Y6L3UOm;b=Jc zJrPt @Mb&DV^) znf{6Eaq2_o+nfR`PV<7o9$SZTrS}$B`=D>`^w}8n8>hH(dzhf57o8DN!&(1qOP}m% zaBgygslLr=g1%*YU67qTEuN9`rQcf^^rdLvNt#SN8un? YEDU|aVO3GK%K4r4=5P|s5m+ycxaN)AUSKn_8aGdi(i1ib8*@ND?| z;nTC Pey(25!SQYA*z7 zr(M~j=Io?(vW#`dd}U+x3{J;sNY8GnhDBLW?dpNG=yxqx)vGw)$S>Aw!4oy-)0{@@ zF3EEAK=tB6NNBe;)RQk&ca1y7Q#C#qS7>VClv3XM#e#tPXS8pmB}AkbjyK@z7SLNv zB|ct14AsFo%5FgjEy0O<@zHOnRag1tCk7cjqj=s^7S8jM6(Es9LAw)Gb4=_!vPsb9 z?i*-aOeFa6@_;6B1woU03nO0#=V~10#)ZOeU!L)B-9%eP^`Rlw=QDOabgdFYhc|>H ze!AD;(=+7#C4}g2ZRcQEynn$~?-!`jYRe_`yRh9>+;u1EhJaXlir-jMA?+q0cm1@t z0!hzLt3y4D60TQbF!I2gtm@EmGw%b9?8Vp9*&S*;eCySwe{4|=tnC@d1B=9Q)btub zU0YM6UL%XF8{4nMQ+|z$=pAP9&1;Eg|3C$`U<6O(-wg*w#DIPY8EWUNt5sfnkTi)V z?T#klw+ZhxJ`LpK-cVn?5XR|wZ|G>5?y#o4csby)%xoD?Ya@X!Qil6_iWu5sm#Rr+ z$XM6b&FZTteOGi1KIddy*H5t{4>r7CJE<%vv%#MkaXL+UTBaw7A5oSFcIgv<-k=#9 zcv8VXIJ8^ZTrrGWXeWABzFddsiNrxxY4MtidZHu71o@4Tp5ES%iG!Fm{y_M+`fc0& zVGV`C+^HqMFx|L}7jeO5U!;hAn~jk~!*6KpdYY1ES$?H7Oeb!wyBO+}F$Gb*eBUBG zn!_lXM5cW*EghuD#7ZQql^gc({+ERCX#SFSxl;rzC8=9QFgu$C_SIi}GDE32FfNqS zPD Vdf_ zuqCqzE5`38;3JtP-*k=oWmF(+3|Q%{$`L@F*9|_7`o7*{4-@4B%n(7$#?1WPx8BzB z;nr*Cu-JT6^ZUE`@tGPhMsXTz6=0GH_2bl3uogx>_Xu*yBb%NjM`4$|VdM%nnG73* zQc8&IjlEb-QD`K6d}EUDd&1I-Gt#3E|EsPTbG#_11v`#)&@>QL#w!TrLE6<^6_XVt zu)g`nAT}F-f5&TE%~R#y5S#K|O=Ev-5tRH>dE&_?ww)vCTT^|1pgurO$J}2oPhJ(m z2c#(lVp@2uCryBwk%O|iwt*lz6PlECh2YDgH1M&W?!*!hZAGz78fDJ?-k*nkFDAq= z4qL-KBZ8cNF#t%e4+MbUm;rZVBZbbRz{2;fjH k6l literal 0 HcmV?d00001 diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43 GIT binary patch literal 6849 zcmaKRcUV(fvo}bjDT-7nLI_nlK}sT_69H+`qzVWDA|yaU?}j417wLi^B1KB1SLsC& zL0ag7$U(XW5YR7p&Ux?s P$d4lvMt8C^+TcQu4F zQqv!UF!I+kw)c0jhd6+g6oCr9P?7)?!qX1ui*iL{p}sKCAGuJ{{W)0z1pLF|=>h}& zt(2Lr0Z`2ig8<5i%Zk}cO5Fm=LByqGWaS`oqChZdEFmc`0hSb#gg|Aap^{+WKOYcj zHjINK)KDG%&s?Mt4CL(T=?;~U@bU2x_mLKN!#GJuK_CzbNw5SMEJorG!}_5;?R>@1 zSl)jns3WlU7^J%=(hUtfmuUCU&C3%8B5C^f5>W2Cy8jW3#{Od{lF1}|?c61##3dzA zsPlFG;l_FzBK}8>|H_Ru_H#!_7$UH4UKo3lKOA}g1(R&|e@}GINYVzX?q=_WLZCgh z)L|eJMce`D0EIwgRaNETDsr+?vQknSGAi=7H00r`QnI%oQnFxm`G2umXso9l+8*&Q z7WqF|$p49js$mdzo^BXpH#gURy=UO;=IMrYc5?@+sR4y_?d*~0^YP7d+y0{}0)zBM zIKVM(DBvICK#~7N0a+PY6)7;u=dutmNqK3AlsrUU9U`d;msiucB_|8|2kY=(7XA;G zwDA8AR)VCA#JOkxm#6 oHNS^YVuOU;8p$N)2{`;oF|rQ?B~K$%rHDxXs+_G zF5|-uqHZvSzq}L;5Kcy_P+x0${33}Ofb6+TX&=y;;PkEOpz% +_bCw_ {<&~ zeLV|!bP%l1qxywfVr9Z9JI+++EO^x>ZuCK);=$VIG1`kxK8F2M8AdC$iOe3cj 1fo(ce4l-9 z7*zKy3={MixvUk=enQE;ED~7tv%qh&3lR<0m??@w{ILF|e#QOyPkFYK!&Up7xWNtL zOW%1QMC<3o;G9_S1;NkPB6bqbCOjeztEc6TsBM<(q9((JKiH{01+Ud=uw9B@{;(JJ z-DxI2*{pMq`q1RQc;V8@gYAY44Z!%#W~M9pRxI(R?SJ7 sy7em=Z5DbuDlr@*q|25V)($-f}9c#?D%dU^RS<(wz?{P zFFHtCab*!rl(~j@0(Nadvwg8q|4!}L^>d?0al6}Rrv9$0M#^&@zjbfJy_n!%mVHK4 z6pLRIQ^Uq~dnyy$`ay51Us6WaP%&O;@49m&{G3z7xV3dLtt1VTOMYl3UW~Rm{Eq4m zF?Zl_v;?7EFx1_+#WFUXxcK78IV)FO>42@cm@}2I%pVbZqQ}3;p;sDIm&knay03a^ zn$5}Q$G!@fTwD$e(x-~aWP0h+4N Rz$KlnO_H2c< z(XX#lPuW_%H#Q+c&(nRyX1-Ia dKR-%$4FYC0fsCmL9ky3 zKpxyjd^JFR+vg2!=HWf}2Z?@Td`0EG`kU?{8zKrvtsm)|7>pPk9nu@2^z96aU2<#` z2QhvH5w&V;wER?mopu+nqu*n8p~(%Q kwSs&*0eJwa zMXR05`OSFpfyRb! Y_+H@O%Y z0=K^y6B8Gcbl?SA)qMP3Z+=C(?8zL@=74R=EVnE?vY!1BQy2@q*RUgRx4yJ$k}MnL zs!?74QciNb-LcG*&o<9=DSL>1n}ZNd)w1z3-0Pd^4ED1{qd=9|!!N?xnXjM!EuylY z5=!H>&hSofh8V?Jofyd!h`xDI1fYAuV(sZwwN~{$a}MX^=+0TH*SFp$vyxmUv7C*W zv^3Gl0+eTFgBi3FVD;$nhcp)ka*4gSskYIqQ&+M}xP9yLAkWzBI^I%zR^l1e?bW_6 zIn{mo{dD=)9@V?s^fa55jh78rP*Ze<3`tRCN4*mpO$@7a^*2B*7N_|A(Ve2VB|)_o z$=#_=aBkhe(ifX}MLT()@5? OV+~7cXC3r!%{QJxriXo9I%*3q4KT4Xxzyd{ z9;_%=W%q!Vw$Z7F3lUnY+1HZ*lO;4;VR2+i4+D(m#01OYq|L_fbnT;KN<^dkkCwtd zF7n+O7KvAw8c`JUh6LmeIrk4`F3o|AagKSMK3))_5Cv~y2Bb2!Ibg9BO7Vkz?pAYX zoI=B}+$R22&IL`NCYUYjrdhwjnM x_v=-Qcx-jmtN>!Zqf|n1^SWrHy zK|MwJ?Z#^>)rfT5YSY{qjZ&`Fjd;^vv&gF-Yj6$9-Dy$<6zeP4s+78gS2|t%Z309b z0^fp~ue_}i`U9j!<|qF92_3oB09NqgAoehQ`)<)dSfKoJl_A6Ec#*Mx9Cpd-p#$Ez z={AM*r-bQs6*z$!*V A4|QE7bf@-4vb?Q+pPKLkY2{yKsw{&udv_2v8{Dbd zm~8VAv!G~s)`O3|Q6vFUV%8%+?ZSVUa(;fhPNg#vab@J*9XE4#D%)$UU-T5`fwjz! z6&gA^`OGu6aUk{l*h9eB?opVdrHK>Q@U>&JQ_2pR%}TyOXGq_6s56_`U(WoOaAb+K zXQr#6H}>a-GYs9^bG P2Y&hSP5gEtW+GVC4=wy0wQk=~%CSXj=GH6q z-T#s!BV`xZVxm{~jr_ezYRpqqIcXC=Oq`b{lu`Rt(IYr4B91hhVC?yg{ol4WUr3v9 zOAk2LG>CIECZ-WIs0$N}F#eoIUEtZudc7DPYIjzGqDLWk_A4#( LgacooD z2K4IWs@N`Bddm-{%oy}!k0^i6Yh)uJ1S*90>|bm3TOZxcV|ywHUb(+CeX-o1|LTZM zwU>dY3R&U)T(}5#Neh?-CWT~@{6Ke@sI)uSuzoah8COy)w)B)aslJmp`WUcjdia-0 zl2Y}&L~XfA`uYQboAJ1;J{XLhYjH){cObH3FDva+^8ioOQy%Z=xyjGLmWMrzfFoH; zEi3AG`_v+%)&lDJE;iJWJDI@-X9K5O)LD~j*PBe(wu+|%ar~C+LK1+-+lK =t# z+Xc+J7qp~5q=B~rD!x78)?1+KUIbYr^5rcl&tB-cTtj+e%{gpZZ4G~6r15+d|J(ky zjg@@UzMW0k9@S#W(1H{u;Nq(7llJbq;;4t$awM;l&(2s+$l!Ay9^Ge|34CVhr7|BG z?dAR83smef^frq9V(OH+a+ki#q&-7TkWfFM=5bsGbU(8mC;>QTCWL5ydz9s6k@?+V zcjiH`VI=59P-(-DWXZ~5DH>B^_H~;4$)KUhnmGo*G!Tq8^LjfUDO)lASN*=#AY_yS zqW9UX(VOCO&p@kHdUUgsBO0KhXxn1sprK5h8}+>IhX(nSXZKwlNsjk^M|RAaqmCZB zHBol OHYBas@&{PT=R+?d8pZu zUHfyucQ`(umXSW7o?HQ3H21M`ZJal+%*)SH1B1j6rxTlG3hx1IGJN^M7{$j(9V;MZ zRKybgVuxKo#XVM+?*yTy{W+XHaU5Jbt-UG33x{u(N-2wmw;zzPH&4DE103HV@ER86 z|FZEmQb|&1s5#`$4!Cm}&`^{(4V}OP$bk`}v6q6rm;P!H)W|2i^e{7lTk2W@jo_9q z*aw|U7#+g59Fv(5qI`#O-qPj#@_P>PC#I(GSp3DLv7x-dmYK=C7lPF8a)bxb=@)B1 zUZ`EqpXV2dR}B&r`uM}N(TS99ZT0UB%IN|0H%DcVO#T%L_chrgn#m6%x4KE*IMfjX zJ%4veCEqbXZ`H`F_+fELMC@wuy_ch%t*+Z+1I}wN#C+dRrf2X{1C8=yZ_%Pt6wL_~ zZ2NN-hXOT4P4n$QFO7yYHS-4wF1Xfr-meG9Pn;uK51?hfel`d38k{W)F*|gJLT2#T z<~>spMu4(mul-8Q3*pf=N4DcI)zzjqAgbE2eOT7~&f1W3VsdD44Ffe;3mJp-V@8UC z)|qnPc12o~$X-+U@L_lWqv-RtvB~%hLF($%Ew5w>^NR82qC_0F B z)=hP1-OEx?lLi#jnLzH}a;Nvr@JDO-zQWd}#k^an$Kwml;MrD&)sC5b`s0ZkVyPkb zt}-jOq^%_9>YZe7Y}PhW{a)c39G`kg(P4@kxjcYfgB4XOOcmezdUI7j-!gs7oAo2o zx(Ph{G+YZ`a%~kzK!HTAA5NXE-7vOFRr5oqY$rH>WI6SFvWmahFav!CfRMM3%8J&c z*p+%|-fNS_@QrFr(at!JY9jCg9F-%5{nb5Bo~z@Y9m&SHYV`49GAJjA5h~h4(G!Se zZmK{Bo7ivCfvl}@A-ptkFGcWXAzj3xfl{evi-OG(TaCn1FAHxRc{}B|x+Ua1D=I6M z!C^ZIvK6aS_c&(=OQDZfm>O`Nxsw{ta&yiYPA~@e#c%N>>#rq)k6Aru-qD4(D^v)y z*>Rs;YUbD1S8^D(ps6Jbj0K3wJw>L4m)0e(6Pee3Y?gy9i0^bZO?$*sv+xKV?WBlh zAp*;v6w!a8;A7sLB*g-^<$Z4L7|5jXxxP1}hQZ<55f9<^KJ>^mKlWSGaLcO0=$jem zWyZkRwe~u{{tU63DlCaS9$Y4CP4f?+wwa(&1ou)b>72yd rFvm`R j-0`kBJgK@nd(*Eh!(NC{F-@=FnF&Y!q`7){YsLLHf0_B6aHc# z>WIuHTyJwIH{BJ4)2RtEauC7Yq7Cytc|S )4^*t8Va3HR zg=~sN^tp9re@w=GTx$;zOWMjcg-7X3Wk^N$n;&Kf1RgVG2}2L-(0o)54C509C&77i zrjSi{X*WV=%C17((N^6R4Ya*4#6s_L99RtQ>m(%#nQ#wrRC8Y%yxkH;d!MdY+Tw@r zjpSnK`;C-U{ATcgaxoEpP0Gf+tx);buOM lK=01D|J+ROu37qc*rD(w`#O=3*O*w9?biwNoq3WN1`&Wp8TvKj3C z3HR9ssH7a&Vr<6waJrUzdLg!ieYz%U^bmpn%;(V%%ugMk92&?_XX1K@mwnVSE6!&%P%Wdi7_h`CpScvspMx?N zQUR>oadnG17#hNc$pkTp+9 lW+MBKHRZ~7 4XWUryd)4yd zj98$%XmIL4(9OnoeO5Fnyn&fpQ9b0h4e6EHHw*l68j;>(ya`g^S&y2{O8U>1*>4zR zq*WSI_2o$CHQ?x0!wl9bpx|Cm2+kFMR)oMud1%n2=qn5nE&t@Fgr#=Zv2?}wtEz^T z9rrj=?I H*qI5{G@Rn&}^Z{+TW}mQe b9=8b<_a`&Cm#n%n~ zU47MvCBsdXFB1+adOO)03+nczfWa#vwk #r{o{dF)QWya9v2nv43Zp3%Ps}($lA02*_g25t;|T{A5snSY?3A zrRQ~(Ygh_ebltHo1VC bJb*eOAr;4cnlXLvI>*$-#AVsGg6B1r7@;g^L zFlJ_th0vxO7;-opU@WAFe;<}?!2q?RBrFK5U{ *ai@NLKZ^};Ul}beukveh?TQn;$%9=R+DX07m82gP$=}Uo_%&ngV`}Hyv8g{u z3SWzTGV|cwQuFIs7ZDOqO_fGf8Q`8MwL}eUp>q?4eqCmOTcwQuXtQckPy|4F1on8l zP*h>d+cH#XQf|+6c|S{7SF(Lg>bR~l(0uY?O{OEVlaxa5@e%T&xju=o1`=OD#qc16 zSvyH*my(dcp6~VqR;o(#@m44Lug@~_qw+HA=mS#Z^ 4reBy8iV?H~I;{LQWk3aKK8$bLRyt$g?- \ No newline at end of file diff --git a/src/assets/placeholder.svg b/src/assets/placeholder.svg new file mode 100644 index 0000000..a284ef4 --- /dev/null +++ b/src/assets/placeholder.svg @@ -0,0 +1,31 @@ + \ No newline at end of file diff --git a/src/auto-imports.d.ts b/src/auto-imports.d.ts new file mode 100644 index 0000000..2e06bfc --- /dev/null +++ b/src/auto-imports.d.ts @@ -0,0 +1,347 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// noinspection JSUnusedGlobalSymbols +// Generated by unplugin-auto-import +// biome-ignore lint: disable +export {} +declare global { + const EffectScope: typeof import('vue')['EffectScope'] + const IllustType: typeof import('./types/Artworks')['IllustType'] + const UgoiraPlayer: typeof import('./utils/UgoiraPlayer')['UgoiraPlayer'] + const UserPrivacyLevel: typeof import('./types/Users')['UserPrivacyLevel'] + const UserXRestrict: typeof import('./types/Users')['UserXRestrict'] + const ZipDownloader: typeof import('./utils/ZipDownloader')['ZipDownloader'] + const addBookmark: typeof import('./utils/artworkActions')['addBookmark'] + const addUserFollow: typeof import('./utils/userActions')['addUserFollow'] + const ajax: typeof import('./utils/ajax')['ajax'] + const ajaxPostWithFormData: typeof import('./utils/ajax')['ajaxPostWithFormData'] + const asyncComputed: typeof import('@vueuse/core')['asyncComputed'] + const autoResetRef: typeof import('@vueuse/core')['autoResetRef'] + const axios: typeof import('axios')['default'] + const computed: typeof import('vue')['computed'] + const computedAsync: typeof import('@vueuse/core')['computedAsync'] + const computedEager: typeof import('@vueuse/core')['computedEager'] + const computedInject: typeof import('@vueuse/core')['computedInject'] + const computedWithControl: typeof import('@vueuse/core')['computedWithControl'] + const controlledComputed: typeof import('@vueuse/core')['controlledComputed'] + const controlledRef: typeof import('@vueuse/core')['controlledRef'] + const createApp: typeof import('vue')['createApp'] + const createEventHook: typeof import('@vueuse/core')['createEventHook'] + const createGlobalState: typeof import('@vueuse/core')['createGlobalState'] + const createInjectionState: typeof import('@vueuse/core')['createInjectionState'] + const createOptimizedUgoiraPlayer: typeof import('./src/utils/UgoiraPlayerExample')['createOptimizedUgoiraPlayer'] + const createReactiveFn: typeof import('@vueuse/core')['createReactiveFn'] + const createRef: typeof import('@vueuse/core')['createRef'] + const createReusableTemplate: typeof import('@vueuse/core')['createReusableTemplate'] + const createSharedComposable: typeof import('@vueuse/core')['createSharedComposable'] + const createTemplatePromise: typeof import('@vueuse/core')['createTemplatePromise'] + const createUnrefFn: typeof import('@vueuse/core')['createUnrefFn'] + const customRef: typeof import('vue')['customRef'] + const debouncedRef: typeof import('@vueuse/core')['debouncedRef'] + const debouncedWatch: typeof import('@vueuse/core')['debouncedWatch'] + const defaultArtwork: typeof import('./utils/index')['defaultArtwork'] + const defineAsyncComponent: typeof import('vue')['defineAsyncComponent'] + const defineComponent: typeof import('vue')['defineComponent'] + const demonstrateOptimizedPlayer: typeof import('./src/utils/UgoiraPlayerExample')['demonstrateOptimizedPlayer'] + const eagerComputed: typeof import('@vueuse/core')['eagerComputed'] + const effectScope: typeof import('vue')['effectScope'] + const exampleSessionId: typeof import('./components/userData')['exampleSessionId'] + const existsSessionId: typeof import('./components/userData')['existsSessionId'] + const extendRef: typeof import('@vueuse/core')['extendRef'] + const getCurrentInstance: typeof import('vue')['getCurrentInstance'] + const getCurrentScope: typeof import('vue')['getCurrentScope'] + const getCurrentWatcher: typeof import('vue')['getCurrentWatcher'] + const h: typeof import('vue')['h'] + const ignorableWatch: typeof import('@vueuse/core')['ignorableWatch'] + const initUser: typeof import('./components/userData')['initUser'] + const inject: typeof import('vue')['inject'] + const injectLocal: typeof import('@vueuse/core')['injectLocal'] + const isArtwork: typeof import('./utils/artworkActions')['isArtwork'] + const isDefined: typeof import('@vueuse/core')['isDefined'] + const isProxy: typeof import('vue')['isProxy'] + const isReactive: typeof import('vue')['isReactive'] + const isReadonly: typeof import('vue')['isReadonly'] + const isRef: typeof import('vue')['isRef'] + const isShallow: typeof import('vue')['isShallow'] + const login: typeof import('./components/userData')['login'] + const logout: typeof import('./components/userData')['logout'] + const makeDestructurable: typeof import('@vueuse/core')['makeDestructurable'] + const markRaw: typeof import('vue')['markRaw'] + const nextTick: typeof import('vue')['nextTick'] + const onActivated: typeof import('vue')['onActivated'] + const onBeforeMount: typeof import('vue')['onBeforeMount'] + const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave'] + const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate'] + const onBeforeUnmount: typeof import('vue')['onBeforeUnmount'] + const onBeforeUpdate: typeof import('vue')['onBeforeUpdate'] + const onClickOutside: typeof import('@vueuse/core')['onClickOutside'] + const onDeactivated: typeof import('vue')['onDeactivated'] + const onElementRemoval: typeof import('@vueuse/core')['onElementRemoval'] + const onErrorCaptured: typeof import('vue')['onErrorCaptured'] + const onKeyStroke: typeof import('@vueuse/core')['onKeyStroke'] + const onLongPress: typeof import('@vueuse/core')['onLongPress'] + const onMounted: typeof import('vue')['onMounted'] + const onRenderTracked: typeof import('vue')['onRenderTracked'] + const onRenderTriggered: typeof import('vue')['onRenderTriggered'] + const onScopeDispose: typeof import('vue')['onScopeDispose'] + const onServerPrefetch: typeof import('vue')['onServerPrefetch'] + const onStartTyping: typeof import('@vueuse/core')['onStartTyping'] + const onUnmounted: typeof import('vue')['onUnmounted'] + const onUpdated: typeof import('vue')['onUpdated'] + const onWatcherCleanup: typeof import('vue')['onWatcherCleanup'] + const pausableWatch: typeof import('@vueuse/core')['pausableWatch'] + const provide: typeof import('vue')['provide'] + const provideLocal: typeof import('@vueuse/core')['provideLocal'] + const reactify: typeof import('@vueuse/core')['reactify'] + const reactifyObject: typeof import('@vueuse/core')['reactifyObject'] + const reactive: typeof import('vue')['reactive'] + const reactiveComputed: typeof import('@vueuse/core')['reactiveComputed'] + const reactiveOmit: typeof import('@vueuse/core')['reactiveOmit'] + const reactivePick: typeof import('@vueuse/core')['reactivePick'] + const readonly: typeof import('vue')['readonly'] + const ref: typeof import('vue')['ref'] + const refAutoReset: typeof import('@vueuse/core')['refAutoReset'] + const refDebounced: typeof import('@vueuse/core')['refDebounced'] + const refDefault: typeof import('@vueuse/core')['refDefault'] + const refThrottled: typeof import('@vueuse/core')['refThrottled'] + const refWithControl: typeof import('@vueuse/core')['refWithControl'] + const removeBookmark: typeof import('./utils/artworkActions')['removeBookmark'] + const removeUserFollow: typeof import('./utils/userActions')['removeUserFollow'] + const resolveComponent: typeof import('vue')['resolveComponent'] + const resolveRef: typeof import('@vueuse/core')['resolveRef'] + const resolveUnref: typeof import('@vueuse/core')['resolveUnref'] + const setTitle: typeof import('./utils/setTitle')['setTitle'] + const shallowReactive: typeof import('vue')['shallowReactive'] + const shallowReadonly: typeof import('vue')['shallowReadonly'] + const shallowRef: typeof import('vue')['shallowRef'] + const sortArtList: typeof import('./utils/artworkActions')['sortArtList'] + const syncRef: typeof import('@vueuse/core')['syncRef'] + const syncRefs: typeof import('@vueuse/core')['syncRefs'] + const templateRef: typeof import('@vueuse/core')['templateRef'] + const throttledRef: typeof import('@vueuse/core')['throttledRef'] + const throttledWatch: typeof import('@vueuse/core')['throttledWatch'] + const toRaw: typeof import('vue')['toRaw'] + const toReactive: typeof import('@vueuse/core')['toReactive'] + const toRef: typeof import('vue')['toRef'] + const toRefs: typeof import('vue')['toRefs'] + const toValue: typeof import('vue')['toValue'] + const triggerRef: typeof import('vue')['triggerRef'] + const tryOnBeforeMount: typeof import('@vueuse/core')['tryOnBeforeMount'] + const tryOnBeforeUnmount: typeof import('@vueuse/core')['tryOnBeforeUnmount'] + const tryOnMounted: typeof import('@vueuse/core')['tryOnMounted'] + const tryOnScopeDispose: typeof import('@vueuse/core')['tryOnScopeDispose'] + const tryOnUnmounted: typeof import('@vueuse/core')['tryOnUnmounted'] + const unref: typeof import('vue')['unref'] + const unrefElement: typeof import('@vueuse/core')['unrefElement'] + const until: typeof import('@vueuse/core')['until'] + const useActiveElement: typeof import('@vueuse/core')['useActiveElement'] + const useAnimate: typeof import('@vueuse/core')['useAnimate'] + const useArrayDifference: typeof import('@vueuse/core')['useArrayDifference'] + const useArrayEvery: typeof import('@vueuse/core')['useArrayEvery'] + const useArrayFilter: typeof import('@vueuse/core')['useArrayFilter'] + const useArrayFind: typeof import('@vueuse/core')['useArrayFind'] + const useArrayFindIndex: typeof import('@vueuse/core')['useArrayFindIndex'] + const useArrayFindLast: typeof import('@vueuse/core')['useArrayFindLast'] + const useArrayIncludes: typeof import('@vueuse/core')['useArrayIncludes'] + const useArrayJoin: typeof import('@vueuse/core')['useArrayJoin'] + const useArrayMap: typeof import('@vueuse/core')['useArrayMap'] + const useArrayReduce: typeof import('@vueuse/core')['useArrayReduce'] + const useArraySome: typeof import('@vueuse/core')['useArraySome'] + const useArrayUnique: typeof import('@vueuse/core')['useArrayUnique'] + const useAsyncQueue: typeof import('@vueuse/core')['useAsyncQueue'] + const useAsyncState: typeof import('@vueuse/core')['useAsyncState'] + const useAttrs: typeof import('vue')['useAttrs'] + const useBase64: typeof import('@vueuse/core')['useBase64'] + const useBattery: typeof import('@vueuse/core')['useBattery'] + const useBluetooth: typeof import('@vueuse/core')['useBluetooth'] + const useBreakpoints: typeof import('@vueuse/core')['useBreakpoints'] + const useBroadcastChannel: typeof import('@vueuse/core')['useBroadcastChannel'] + const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation'] + const useCached: typeof import('@vueuse/core')['useCached'] + const useClipboard: typeof import('@vueuse/core')['useClipboard'] + const useClipboardItems: typeof import('@vueuse/core')['useClipboardItems'] + const useCloned: typeof import('@vueuse/core')['useCloned'] + const useColorMode: typeof import('@vueuse/core')['useColorMode'] + const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog'] + const useCountdown: typeof import('@vueuse/core')['useCountdown'] + const useCounter: typeof import('@vueuse/core')['useCounter'] + const useCssModule: typeof import('vue')['useCssModule'] + const useCssVar: typeof import('@vueuse/core')['useCssVar'] + const useCssVars: typeof import('vue')['useCssVars'] + const useCurrentElement: typeof import('@vueuse/core')['useCurrentElement'] + const useCycleList: typeof import('@vueuse/core')['useCycleList'] + const useDark: typeof import('@vueuse/core')['useDark'] + const useDateFormat: typeof import('@vueuse/core')['useDateFormat'] + const useDebounce: typeof import('@vueuse/core')['useDebounce'] + const useDebounceFn: typeof import('@vueuse/core')['useDebounceFn'] + const useDebouncedRefHistory: typeof import('@vueuse/core')['useDebouncedRefHistory'] + const useDeviceMotion: typeof import('@vueuse/core')['useDeviceMotion'] + const useDeviceOrientation: typeof import('@vueuse/core')['useDeviceOrientation'] + const useDevicePixelRatio: typeof import('@vueuse/core')['useDevicePixelRatio'] + const useDevicesList: typeof import('@vueuse/core')['useDevicesList'] + const useDisplayMedia: typeof import('@vueuse/core')['useDisplayMedia'] + const useDocumentVisibility: typeof import('@vueuse/core')['useDocumentVisibility'] + const useDraggable: typeof import('@vueuse/core')['useDraggable'] + const useDropZone: typeof import('@vueuse/core')['useDropZone'] + const useElementBounding: typeof import('@vueuse/core')['useElementBounding'] + const useElementByPoint: typeof import('@vueuse/core')['useElementByPoint'] + const useElementHover: typeof import('@vueuse/core')['useElementHover'] + const useElementSize: typeof import('@vueuse/core')['useElementSize'] + const useElementVisibility: typeof import('@vueuse/core')['useElementVisibility'] + const useEventBus: typeof import('@vueuse/core')['useEventBus'] + const useEventListener: typeof import('@vueuse/core')['useEventListener'] + const useEventSource: typeof import('@vueuse/core')['useEventSource'] + const useEyeDropper: typeof import('@vueuse/core')['useEyeDropper'] + const useFavicon: typeof import('@vueuse/core')['useFavicon'] + const useFetch: typeof import('@vueuse/core')['useFetch'] + const useFileDialog: typeof import('@vueuse/core')['useFileDialog'] + const useFileSystemAccess: typeof import('@vueuse/core')['useFileSystemAccess'] + const useFocus: typeof import('@vueuse/core')['useFocus'] + const useFocusWithin: typeof import('@vueuse/core')['useFocusWithin'] + const useFps: typeof import('@vueuse/core')['useFps'] + const useFullscreen: typeof import('@vueuse/core')['useFullscreen'] + const useGamepad: typeof import('@vueuse/core')['useGamepad'] + const useGeolocation: typeof import('@vueuse/core')['useGeolocation'] + const useI18n: typeof import('vue-i18n')['useI18n'] + const useId: typeof import('vue')['useId'] + const useIdle: typeof import('@vueuse/core')['useIdle'] + const useImage: typeof import('@vueuse/core')['useImage'] + const useInfiniteScroll: typeof import('@vueuse/core')['useInfiniteScroll'] + const useIntersectionObserver: typeof import('@vueuse/core')['useIntersectionObserver'] + const useInterval: typeof import('@vueuse/core')['useInterval'] + const useIntervalFn: typeof import('@vueuse/core')['useIntervalFn'] + const useKeyModifier: typeof import('@vueuse/core')['useKeyModifier'] + const useLastChanged: typeof import('@vueuse/core')['useLastChanged'] + const useLink: typeof import('vue-router')['useLink'] + const useLocalStorage: typeof import('@vueuse/core')['useLocalStorage'] + const useMagicKeys: typeof import('@vueuse/core')['useMagicKeys'] + const useManualRefHistory: typeof import('@vueuse/core')['useManualRefHistory'] + const useMediaControls: typeof import('@vueuse/core')['useMediaControls'] + const useMediaQuery: typeof import('@vueuse/core')['useMediaQuery'] + const useMemoize: typeof import('@vueuse/core')['useMemoize'] + const useMemory: typeof import('@vueuse/core')['useMemory'] + const useModel: typeof import('vue')['useModel'] + const useMounted: typeof import('@vueuse/core')['useMounted'] + const useMouse: typeof import('@vueuse/core')['useMouse'] + const useMouseInElement: typeof import('@vueuse/core')['useMouseInElement'] + const useMousePressed: typeof import('@vueuse/core')['useMousePressed'] + const useMutationObserver: typeof import('@vueuse/core')['useMutationObserver'] + const useNavigatorLanguage: typeof import('@vueuse/core')['useNavigatorLanguage'] + const useNetwork: typeof import('@vueuse/core')['useNetwork'] + const useNow: typeof import('@vueuse/core')['useNow'] + const useObjectUrl: typeof import('@vueuse/core')['useObjectUrl'] + const useOffsetPagination: typeof import('@vueuse/core')['useOffsetPagination'] + const useOnline: typeof import('@vueuse/core')['useOnline'] + const usePageLeave: typeof import('@vueuse/core')['usePageLeave'] + const useParallax: typeof import('@vueuse/core')['useParallax'] + const useParentElement: typeof import('@vueuse/core')['useParentElement'] + const usePerformanceObserver: typeof import('@vueuse/core')['usePerformanceObserver'] + const usePermission: typeof import('@vueuse/core')['usePermission'] + const usePointer: typeof import('@vueuse/core')['usePointer'] + const usePointerLock: typeof import('@vueuse/core')['usePointerLock'] + const usePointerSwipe: typeof import('@vueuse/core')['usePointerSwipe'] + const usePreferredColorScheme: typeof import('@vueuse/core')['usePreferredColorScheme'] + const usePreferredContrast: typeof import('@vueuse/core')['usePreferredContrast'] + const usePreferredDark: typeof import('@vueuse/core')['usePreferredDark'] + const usePreferredLanguages: typeof import('@vueuse/core')['usePreferredLanguages'] + const usePreferredReducedMotion: typeof import('@vueuse/core')['usePreferredReducedMotion'] + const usePreferredReducedTransparency: typeof import('@vueuse/core')['usePreferredReducedTransparency'] + const usePrevious: typeof import('@vueuse/core')['usePrevious'] + const useRafFn: typeof import('@vueuse/core')['useRafFn'] + const useRefHistory: typeof import('@vueuse/core')['useRefHistory'] + const useResizeObserver: typeof import('@vueuse/core')['useResizeObserver'] + const useRoute: typeof import('vue-router')['useRoute'] + const useRouter: typeof import('vue-router')['useRouter'] + const useSSRWidth: typeof import('@vueuse/core')['useSSRWidth'] + const useScreenOrientation: typeof import('@vueuse/core')['useScreenOrientation'] + const useScreenSafeArea: typeof import('@vueuse/core')['useScreenSafeArea'] + const useScriptTag: typeof import('@vueuse/core')['useScriptTag'] + const useScroll: typeof import('@vueuse/core')['useScroll'] + const useScrollLock: typeof import('@vueuse/core')['useScrollLock'] + const useSessionStorage: typeof import('@vueuse/core')['useSessionStorage'] + const useShare: typeof import('@vueuse/core')['useShare'] + const useSideNavStore: typeof import('./composables/states')['useSideNavStore'] + const useSlots: typeof import('vue')['useSlots'] + const useSorted: typeof import('@vueuse/core')['useSorted'] + const useSpeechRecognition: typeof import('@vueuse/core')['useSpeechRecognition'] + const useSpeechSynthesis: typeof import('@vueuse/core')['useSpeechSynthesis'] + const useStepper: typeof import('@vueuse/core')['useStepper'] + const useStorage: typeof import('@vueuse/core')['useStorage'] + const useStorageAsync: typeof import('@vueuse/core')['useStorageAsync'] + const useStyleTag: typeof import('@vueuse/core')['useStyleTag'] + const useSupported: typeof import('@vueuse/core')['useSupported'] + const useSwipe: typeof import('@vueuse/core')['useSwipe'] + const useTemplateRef: typeof import('vue')['useTemplateRef'] + const useTemplateRefsList: typeof import('@vueuse/core')['useTemplateRefsList'] + const useTextDirection: typeof import('@vueuse/core')['useTextDirection'] + const useTextSelection: typeof import('@vueuse/core')['useTextSelection'] + const useTextareaAutosize: typeof import('@vueuse/core')['useTextareaAutosize'] + const useThrottle: typeof import('@vueuse/core')['useThrottle'] + const useThrottleFn: typeof import('@vueuse/core')['useThrottleFn'] + const useThrottledRefHistory: typeof import('@vueuse/core')['useThrottledRefHistory'] + const useTimeAgo: typeof import('@vueuse/core')['useTimeAgo'] + const useTimeAgoIntl: typeof import('@vueuse/core')['useTimeAgoIntl'] + const useTimeout: typeof import('@vueuse/core')['useTimeout'] + const useTimeoutFn: typeof import('@vueuse/core')['useTimeoutFn'] + const useTimeoutPoll: typeof import('@vueuse/core')['useTimeoutPoll'] + const useTimestamp: typeof import('@vueuse/core')['useTimestamp'] + const useTitle: typeof import('@vueuse/core')['useTitle'] + const useToNumber: typeof import('@vueuse/core')['useToNumber'] + const useToString: typeof import('@vueuse/core')['useToString'] + const useToggle: typeof import('@vueuse/core')['useToggle'] + const useTransition: typeof import('@vueuse/core')['useTransition'] + const useUrlSearchParams: typeof import('@vueuse/core')['useUrlSearchParams'] + const useUserMedia: typeof import('@vueuse/core')['useUserMedia'] + const useUserStore: typeof import('./composables/states')['useUserStore'] + const useVModel: typeof import('@vueuse/core')['useVModel'] + const useVModels: typeof import('@vueuse/core')['useVModels'] + const useVibrate: typeof import('@vueuse/core')['useVibrate'] + const useVirtualList: typeof import('@vueuse/core')['useVirtualList'] + const useWakeLock: typeof import('@vueuse/core')['useWakeLock'] + const useWebNotification: typeof import('@vueuse/core')['useWebNotification'] + const useWebSocket: typeof import('@vueuse/core')['useWebSocket'] + const useWebWorker: typeof import('@vueuse/core')['useWebWorker'] + const useWebWorkerFn: typeof import('@vueuse/core')['useWebWorkerFn'] + const useWindowFocus: typeof import('@vueuse/core')['useWindowFocus'] + const useWindowScroll: typeof import('@vueuse/core')['useWindowScroll'] + const useWindowSize: typeof import('@vueuse/core')['useWindowSize'] + const validateSessionId: typeof import('./components/userData')['validateSessionId'] + const watch: typeof import('vue')['watch'] + const watchArray: typeof import('@vueuse/core')['watchArray'] + const watchAtMost: typeof import('@vueuse/core')['watchAtMost'] + const watchDebounced: typeof import('@vueuse/core')['watchDebounced'] + const watchDeep: typeof import('@vueuse/core')['watchDeep'] + const watchEffect: typeof import('vue')['watchEffect'] + const watchIgnorable: typeof import('@vueuse/core')['watchIgnorable'] + const watchImmediate: typeof import('@vueuse/core')['watchImmediate'] + const watchOnce: typeof import('@vueuse/core')['watchOnce'] + const watchPausable: typeof import('@vueuse/core')['watchPausable'] + const watchPostEffect: typeof import('vue')['watchPostEffect'] + const watchSyncEffect: typeof import('vue')['watchSyncEffect'] + const watchThrottled: typeof import('@vueuse/core')['watchThrottled'] + const watchTriggerable: typeof import('@vueuse/core')['watchTriggerable'] + const watchWithFilter: typeof import('@vueuse/core')['watchWithFilter'] + const whenever: typeof import('@vueuse/core')['whenever'] +} +// for type re-export +declare global { + // @ts-ignore + export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, ShallowRef, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue' + import('vue') + // @ts-ignore + export type { UgoiraPlayer, UgoiraPlayerOptions, UgoiraFrame, UgoiraMeta } from './utils/UgoiraPlayer' + import('./utils/UgoiraPlayer') + // @ts-ignore + export type { ZipDownloader, FetchLike, ZipDownloaderOptions, ZipEntry, ZipEntryWithData, ZipOverview, DataRange } from './utils/ZipDownloader' + import('./utils/ZipDownloader') + // @ts-ignore + export type { IllustType, ArtworkUrls, ArtworkPageUrls, ArtworkTag, ArtworkGallery, ArtworkInfo, ArtworkInfoOrAd, ArtworkRank, Artwork, IllustType } from './types/Artworks' + import('./types/Artworks') + // @ts-ignore + export type { Comments } from './types/Comment' + import('./types/Comment') + // @ts-ignore + export type { UserXRestrict, UserPrivacyLevel, User, PixivUser, UserListItem, UserXRestrict, UserPrivacyLevel } from './types/Users' + import('./types/Users') +} diff --git a/src/components.d.ts b/src/components.d.ts new file mode 100644 index 0000000..db751ef --- /dev/null +++ b/src/components.d.ts @@ -0,0 +1,46 @@ +/* eslint-disable */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +// biome-ignore lint: disable +export {} + +/* prettier-ignore */ +declare module 'vue' { + export interface GlobalComponents { + ArtTag: typeof import('./components/ArtTag.vue')['default'] + ArtworkCard: typeof import('./components/ArtworksList/ArtworkCard.vue')['default'] + ArtworkLargeCard: typeof import('./components/ArtworksList/ArtworkLargeCard.vue')['default'] + ArtworkLargeList: typeof import('./components/ArtworksList/ArtworkLargeList.vue')['default'] + ArtworkList: typeof import('./components/ArtworksList/ArtworkList.vue')['default'] + ArtworksByUser: typeof import('./components/ArtworksList/ArtworksByUser.vue')['default'] + AuthorCard: typeof import('./components/AuthorCard.vue')['default'] + Card: typeof import('./components/Card.vue')['default'] + Comment: typeof import('./components/Comment/Comment.vue')['default'] + CommentsArea: typeof import('./components/Comment/CommentsArea.vue')['default'] + CommentSubmit: typeof import('./components/Comment/CommentSubmit.vue')['default'] + ErrorPage: typeof import('./components/ErrorPage.vue')['default'] + ExternalLink: typeof import('./components/ExternalLink.vue')['default'] + FollowUserCard: typeof import('./components/FollowUserCard.vue')['default'] + Gallery: typeof import('./components/Gallery.vue')['default'] + LazyLoad: typeof import('./components/LazyLoad.vue')['default'] + ListLink: typeof import('./components/SideNav/ListLink.vue')['default'] + NaiveuiProvider: typeof import('./components/NaiveuiProvider.vue')['default'] + NAlert: typeof import('naive-ui')['NAlert'] + NLi: typeof import('naive-ui')['NLi'] + NProgress: typeof import('./components/NProgress.vue')['default'] + NSpace: typeof import('naive-ui')['NSpace'] + NTag: typeof import('naive-ui')['NTag'] + NUl: typeof import('naive-ui')['NUl'] + Placeholder: typeof import('./components/Placeholder.vue')['default'] + RouterLink: typeof import('vue-router')['RouterLink'] + RouterView: typeof import('vue-router')['RouterView'] + SearchBox: typeof import('./components/SearchBox.vue')['default'] + ShowMore: typeof import('./components/ShowMore.vue')['default'] + SideNav: typeof import('./components/SideNav/SideNav.vue')['default'] + SiteFooter: typeof import('./components/SiteFooter.vue')['default'] + SiteHeader: typeof import('./components/SiteHeader.vue')['default'] + SiteNoticeBanner: typeof import('./components/SiteNoticeBanner.vue')['default'] + UgoiraViewer: typeof import('./components/UgoiraViewer.vue')['default'] + } +} diff --git a/src/components/ArtTag.vue b/src/components/ArtTag.vue new file mode 100644 index 0000000..3747fc4 --- /dev/null +++ b/src/components/ArtTag.vue @@ -0,0 +1,18 @@ + +NTag.artwork-tag( + @click='$router.push({ name: "search", params: { keyword: tag, p: 1 } })' + type='info' +) {{ '#' }}{{ tag }} + + + + + diff --git a/src/components/ArtworksList/ArtworkCard.vue b/src/components/ArtworksList/ArtworkCard.vue new file mode 100644 index 0000000..8ff5deb --- /dev/null +++ b/src/components/ArtworksList/ArtworkCard.vue @@ -0,0 +1,268 @@ + +.artwork-card-container + .artwork-card.placeholder(v-if='loading') + .artwork-image + NSkeleton(block height='180px' width='180px') + .artwork-info + .title: a: NSkeleton(height='1.4em' text width='8em') + .author: a + NSkeleton.avatar(circle height='1.5em' text width='1.5em') + NSkeleton(text width='4em') + .artwork-card(v-else-if='item') + .artwork-image + .side-tags + .restrict.x-restrict(title='R-18' v-if='item.xRestrict') + IFasEye(data-icon) + .restrict.ai-restrict( + :title='`AI生成(${item.aiType})`' + v-if='item.aiType === 2' + ) + IFasRobot(data-icon) + .page-count( + :title='"共 " + item.pageCount + " 张"' + v-if='item.pageCount > 1' + ) + IFasImages(data-icon) + | {{ item.pageCount }} + .bookmark( + :class='{ bookmarked: item.bookmarkData, disabled: loadingBookmark }' + @click='handleBookmark' + ) + IFasHeart(data-icon) + RouterLink(:to='"/artworks/" + item.id') + LazyLoad.img( + :alt='item.alt', + :src='item.url', + :title='item.alt' + lazyload + ) + .hover-title {{ item.title }} + .type-ugoira(v-if='item.illustType === IllustType.UGOIRA'): IPlayCircle + .artwork-info + .title + RouterLink(:to='"/artworks/" + item.id') {{ item.title }} + .author(:title='item.userName') + RouterLink(:to='"/users/" + item.userId') + img.avatar(:src='item.profileImageUrl' lazyload) + | {{ item.userName }} + + + + + diff --git a/src/components/ArtworksList/ArtworkLargeCard.vue b/src/components/ArtworksList/ArtworkLargeCard.vue new file mode 100644 index 0000000..a746e18 --- /dev/null +++ b/src/components/ArtworksList/ArtworkLargeCard.vue @@ -0,0 +1,204 @@ + +.artwork-large-card + .top + RouterLink.plain(:to='"/artworks/" + illust.id') + .thumb + LazyLoad.image( + :alt='illust.title', + :src='illust.url.replace("p0_master", "p0_square")' + ) + .restrict.x-restrict(title='R-18' v-if='illust.xRestrict === 2') + IFasEye(data-icon) + .restrict.ai-restrict(title='AI生成' v-if='illust.aiType === 2') + IFasRobot(data-icon) + .page-count( + :title='"共 " + illust.pageCount + " 张"' + v-if='+illust.pageCount > 1' + ) + IFasImages(data-icon) + | {{ illust.pageCount }} + .ranking( + :class='{ gold: rank === 1, silver: rank === 2, bronze: rank === 3 }' + v-if='rank !== 0' + ) {{ rank }} + .type-ugoira(v-if='illust.illustType === IllustType.UGOIRA'): IPlayCircle + .bottom + h3.title.plain(:title='illust.title') + RouterLink(:to='"/artworks/" + illust.id') {{ illust.title }} + .author(:title='illust.userName') + RouterLink(:to='"/users/" + illust.userId') + img.avatar(:src='illust.profileImageUrl' lazyload) + | {{ illust.userName }} + .tags + ArtTag(:key='_', :tag='item' v-for='(item, _) in illust.tags') + + + + + diff --git a/src/components/ArtworksList/ArtworkLargeList.vue b/src/components/ArtworksList/ArtworkLargeList.vue new file mode 100644 index 0000000..801af75 --- /dev/null +++ b/src/components/ArtworksList/ArtworkLargeList.vue @@ -0,0 +1,86 @@ + +Waterfall.artwork-large-list( + :breakpoints='{ 9999: { rowPerView: 6 }, 1600: { rowPerView: 5 }, 1200: { rowPerView: 4 }, 750: { rowPerView: 3 }, 640: { rowPerView: 2 }, 380: { rowPerView: 1 } }', + :list='artworks' + ref='waterfallRef' +) + template(#default='{ item, index }') + ArtworkLargeCard(:illust='item[0]', :key='index', :rank='item[1]') + + + + + diff --git a/src/components/ArtworksList/ArtworkList.vue b/src/components/ArtworksList/ArtworkList.vue new file mode 100644 index 0000000..c22a7b9 --- /dev/null +++ b/src/components/ArtworksList/ArtworkList.vue @@ -0,0 +1,66 @@ + +Component.artworks-list( + :class='{ inline }', + :is='inline ? NScrollbar : "ul"' + trigger='none' + x-scrollable +) + li(v-for='_ in skeletonNumber' v-if='loading') + ArtworkCard(loading) + li(:key='item.id' v-else v-for='item in artworks') + ArtworkCard(:item='item') + + + + + diff --git a/src/components/ArtworksList/ArtworksByUser.vue b/src/components/ArtworksList/ArtworksByUser.vue new file mode 100644 index 0000000..5652b10 --- /dev/null +++ b/src/components/ArtworksList/ArtworksByUser.vue @@ -0,0 +1,107 @@ + +.artworks-by-user(ref='containerRef') + NFlex(align='center' justify='center') + NPagination( + :item-count='artworkIds.length', + :page-size='pageSize' + v-model:page='curPage' + ) + ArtworkList( + :list='curArtworks', + :loading='!curArtworks.length ? pageSize : false' + ) + NFlex(align='center' justify='center') + NPagination( + :item-count='artworkIds.length', + :page-size='pageSize' + v-model:page='curPage' + ) + + + + + diff --git a/src/components/AuthorCard.vue b/src/components/AuthorCard.vue new file mode 100644 index 0000000..59c0539 --- /dev/null +++ b/src/components/AuthorCard.vue @@ -0,0 +1,89 @@ + +.author-card + .author-inner(v-if='user') + .flex-center + .left + RouterLink(:to='"/users/" + user.userId') + img(:src='user.imageBig' alt='') + .right + .flex + h4.plain + RouterLink(:to='"/users/" + user.userId') {{ user.name }} + NButton( + :loading='loadingUserFollow', + :type='user.isFollowed ? "success" : undefined' + @click='handleUserFollow' + round + secondary + size='small' + v-if='user.userId !== userStore.userId' + ) + template(#icon) + IFasCheck(v-if='user.isFollowed') + IFasPlus(v-else) + | {{ user.isFollowed ? '已关注' : '关注' }} + NEllipsis.description.pre(:line-clamp='3', :tooltip='false') {{ user.comment }} + ArtworkList.tiny(:list='user.illusts' inline) + + .author-placeholder(v-else) + .flex-center + .left: a: NSkeleton(circle height='80px' text width='80px') + .right + h4.plain: NSkeleton(height='1.6em' text width='12em') + NSkeleton(block height='3em' width='100%') + ArtworkList.tiny(:list='[]' inline loading) + + + + + diff --git a/src/components/Card.vue b/src/components/Card.vue new file mode 100644 index 0000000..b09cdac --- /dev/null +++ b/src/components/Card.vue @@ -0,0 +1,18 @@ + +.card + h2(:id='title' v-if='title') {{ title }} + .inner + slot/ + + + + + diff --git a/src/components/Comment/Comment.vue b/src/components/Comment/Comment.vue new file mode 100644 index 0000000..fdd3859 --- /dev/null +++ b/src/components/Comment/Comment.vue @@ -0,0 +1,80 @@ + +li.comment-block + .left + RouterLink.plain(:to='"/users/" + comment.userId') + img.avatar( + :src='comment.img', + :title='comment.userName + " (" + comment.userId + ")"' + ) + .right + h4.user.plain + span.comment-author + | {{ comment.userName }} + .tag(v-if='store.userId === comment.userId') 您 + span.comment-reply(v-if='comment.replyToUserId') ▶ {{ comment.replyToUserName }} + .content(v-html='replaceStamps(comment.comment)' v-if='!comment.stampId') + .content(v-if='comment.stampId') + img.big-stamp( + :src='`/~/common/images/stamp/generated-stamps/${comment.stampId}_s.jpg`' + alt='表情包' + lazyload + ) + .comment-date {{ comment.commentDate }} + + + + + diff --git a/src/components/Comment/CommentSubmit.vue b/src/components/Comment/CommentSubmit.vue new file mode 100644 index 0000000..6556d40 --- /dev/null +++ b/src/components/Comment/CommentSubmit.vue @@ -0,0 +1,82 @@ + +.comment-submit(:data-illust_id='id') + em 发表评论 + .flex.logged-in(v-if='store.isLoggedIn') + .left + .avatar + img(:src='store.userProfileImg') + .right + textarea(:disabled='loading' v-model='comment') + .submit.align-right + button(:disabled='loading' @click='async () => await submit()') 发送 + .flex.not-logged-in(v-if='!store.isLoggedIn') + p + | 您需要 + RouterLink(:to='"/login?back=" + $route.path') 设置 Pixiv 令牌 + | 以发表评论。 + + + + + diff --git a/src/components/Comment/CommentsArea.vue b/src/components/Comment/CommentsArea.vue new file mode 100644 index 0000000..55c34a9 --- /dev/null +++ b/src/components/Comment/CommentsArea.vue @@ -0,0 +1,92 @@ + +.comments-area(ref='commentsArea') + //- CommentSubmit(:id="id" @push-comment="pushComment") + em.stats + | 共{{ count || comments.length || 0 }}条评论 + p(v-if='!comments.length && !loading') 还没有人发表评论呢~ + ul.comments-list(v-if='comments.length') + comment(:comment='item' v-for='item in comments') + .show-more.align-center + NButton( + :loading='loading' + @click='async () => await init(id)' + round + secondary + size='small' + v-if='comments.length && hasNext' + ) + template(#icon) + IFasPlus + | {{ loading ? '正在加载' : '查看更多' }} + .align-center(v-if='!comments.length && loading') + placeholder + + + + + diff --git a/src/components/Comment/stampList.json b/src/components/Comment/stampList.json new file mode 100644 index 0000000..bebe2af --- /dev/null +++ b/src/components/Comment/stampList.json @@ -0,0 +1,40 @@ +{ + "normal": "/~/common/images/emoji/101.png", + "surprise": "/~/common/images/emoji/102.png", + "serious": "/~/common/images/emoji/103.png", + "heaven": "/~/common/images/emoji/104.png", + "happy": "/~/common/images/emoji/105.png", + "excited": "/~/common/images/emoji/106.png", + "sing": "/~/common/images/emoji/107.png", + "cry": "/~/common/images/emoji/108.png", + "normal2": "/~/common/images/emoji/201.png", + "shame2": "/~/common/images/emoji/202.png", + "love2": "/~/common/images/emoji/203.png", + "interesting2": "/~/common/images/emoji/204.png", + "blush2": "/~/common/images/emoji/205.png", + "fire2": "/~/common/images/emoji/206.png", + "angry2": "/~/common/images/emoji/207.png", + "shine2": "/~/common/images/emoji/208.png", + "panic2": "/~/common/images/emoji/209.png", + "normal3": "/~/common/images/emoji/301.png", + "satisfaction3": "/~/common/images/emoji/302.png", + "surprise3": "/~/common/images/emoji/303.png", + "smile3": "/~/common/images/emoji/304.png", + "shock3": "/~/common/images/emoji/305.png", + "gaze3": "/~/common/images/emoji/306.png", + "wink3": "/~/common/images/emoji/307.png", + "happy3": "/~/common/images/emoji/308.png", + "excited3": "/~/common/images/emoji/309.png", + "love3": "/~/common/images/emoji/310.png", + "normal4": "/~/common/images/emoji/401.png", + "surprise4": "/~/common/images/emoji/402.png", + "serious4": "/~/common/images/emoji/403.png", + "love4": "/~/common/images/emoji/404.png", + "shine4": "/~/common/images/emoji/405.png", + "sweat4": "/~/common/images/emoji/406.png", + "shame4": "/~/common/images/emoji/407.png", + "sleep4": "/~/common/images/emoji/408.png", + "heart": "/~/common/images/emoji/501.png", + "teardrop": "/~/common/images/emoji/502.png", + "star": "/~/common/images/emoji/503.png" +} diff --git a/src/components/ErrorPage.vue b/src/components/ErrorPage.vue new file mode 100644 index 0000000..44d1d43 --- /dev/null +++ b/src/components/ErrorPage.vue @@ -0,0 +1,127 @@ + +section.error-page + NResult( + :description='description', + :status='status || "warning"', + :title='title' + ) + template(#footer) + .random(@click='randomMsg') {{ msg }} + .extra: slot + + + + + diff --git a/src/components/ExternalLink.vue b/src/components/ExternalLink.vue new file mode 100644 index 0000000..62919d7 --- /dev/null +++ b/src/components/ExternalLink.vue @@ -0,0 +1,18 @@ + +a(:href='href' rel='nofollow' target='_blank') + slot + IFasExternalLinkAlt.external-icon + + + + + diff --git a/src/components/FollowUserCard.vue b/src/components/FollowUserCard.vue new file mode 100644 index 0000000..069ff25 --- /dev/null +++ b/src/components/FollowUserCard.vue @@ -0,0 +1,101 @@ + +.follow-user-card + .follow-user-inner(v-if='user') + .flex-1.flex.gap-1 + .left + RouterLink(:to='"/users/" + user.userId') + img(:src='user.profileImageUrl' alt='') + .right + .username: h4.plain + RouterLink(:to='"/users/" + user.userId') {{ user.userName }} + .comment: NEllipsis.description.pre(:line-clamp='3', :tooltip='false') {{ user.userComment }} + .action: NButton( + :loading='loadingUserFollow', + :type='user.following ? "success" : undefined' + @click='handleUserFollow' + round + secondary + size='small' + v-if='user.userId !== userStore.userId' + ) + template(#icon) + IFasCheck(v-if='user.following') + IFasPlus(v-else) + | {{ user.following ? '已关注' : '关注' }} + .user-artworks + ArtworkList.tiny(:list='user.illusts' inline) + + .follow-user-inner.placeholder(v-else) + .flex-1.flex.gap-1 + .left: a: NSkeleton(circle height='80px' text width='80px') + .right + h4.plain: NSkeleton(height='1.6em' text width='12em') + NSkeleton(block height='6em' width='100%') + .user-artworks: ArtworkList.tiny(:list='[]', :loading='4' inline) + + + + + diff --git a/src/components/Gallery.vue b/src/components/Gallery.vue new file mode 100644 index 0000000..67fce3f --- /dev/null +++ b/src/components/Gallery.vue @@ -0,0 +1,102 @@ + +.gallery + .center-img(:class='showAll ? "show-all" : "show-single"') + div(:data-pic-index='index' v-for='(item, index) in pages') + a.image-container( + :href='item.urls.original' + target='_blank' + title='点击下载原图' + v-if='picShow === index' + ) + LazyLoad.img( + :height='item.height', + :src='item.urls.regular', + :width='item.width' + lazyload + ) + //- .tips.align-center (这是预览图,点击下载原图) + ul.pagenator(v-if='pages.length > 1') + li(v-for='(item, index) in pages') + a.pointer( + :class='{ "is-active": picShow === index }', + :title='`第${index + 1}张,共${pages.length}张`' + @click='picShow = index' + ) + LazyLoad.pic( + :height='80', + :src='item.urls.thumb_mini', + :width='80' + lazyload + ) + + + + + diff --git a/src/components/LazyLoad.vue b/src/components/LazyLoad.vue new file mode 100644 index 0000000..772fe87 --- /dev/null +++ b/src/components/LazyLoad.vue @@ -0,0 +1,56 @@ + +Component( + :class='{ lazyload: true, isLoading: !loaded && !error, isLoaded: loaded, isError: error }', + :height='height', + :is='loaded ? "img" : "svg"', + :key='src', + :src='src', + :width='width' + ref='imgRef' + role='img' +) + + + + + diff --git a/src/components/NProgress.vue b/src/components/NProgress.vue new file mode 100644 index 0000000..5a9f6be --- /dev/null +++ b/src/components/NProgress.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/src/components/NaiveuiProvider.vue b/src/components/NaiveuiProvider.vue new file mode 100644 index 0000000..5767169 --- /dev/null +++ b/src/components/NaiveuiProvider.vue @@ -0,0 +1,33 @@ + +NConfigProvider( + :locale='zhCN', + :theme-overrides='theme' + preflight-style-disabled +) + NDialogProvider + NMessageProvider + slot + + + + + diff --git a/src/components/Placeholder.vue b/src/components/Placeholder.vue new file mode 100644 index 0000000..6f35f8c --- /dev/null +++ b/src/components/Placeholder.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/src/components/SearchBox.vue b/src/components/SearchBox.vue new file mode 100644 index 0000000..5b0a065 --- /dev/null +++ b/src/components/SearchBox.vue @@ -0,0 +1,78 @@ + +.search-box + input( + @keyup.enter='makeSearch' + placeholder='输入关键词搜索/输入 id:数字 查看作品' + v-model='keyword' + ) + IFasSearch.icon(data-icon) + + + + + diff --git a/src/components/ShowMore.vue b/src/components/ShowMore.vue new file mode 100644 index 0000000..6f35ef2 --- /dev/null +++ b/src/components/ShowMore.vue @@ -0,0 +1,42 @@ + +.show-more(ref='elRef') + a(@click='method') + | {{ text }} + | + IFasPlus(v-if='!loading') + IFasSpinner.spin(v-else) + + + + + diff --git a/src/components/SideNav/ListLink.vue b/src/components/SideNav/ListLink.vue new file mode 100644 index 0000000..db30cd4 --- /dev/null +++ b/src/components/SideNav/ListLink.vue @@ -0,0 +1,44 @@ + +mixin content + slot + IFasListUl.svg--ListLink + | {{ text }} + +li + RouterLink.plain(:to='link' v-if='link') + +content + a.plain(:href='externalLink' target='_blank' v-else-if='externalLink') + +content + a.plain.not-allowed(v-else) + +content + + + + + diff --git a/src/components/SideNav/SideNav.vue b/src/components/SideNav/SideNav.vue new file mode 100644 index 0000000..291acd3 --- /dev/null +++ b/src/components/SideNav/SideNav.vue @@ -0,0 +1,177 @@ + +aside.global-side-nav(:class='{ hidden: !sideNavStore.isOpened }') + .backdrop(@click='closeSideNav') + .inner + .group + .search-area + SearchBox + + .list + .group + .title 导航 + ul + ListLink(link='/' text='首页') + IFasHome.link-icon + ListLink(link='/discovery' text='探索发现') + IFasImage.link-icon + ListLink(link='/ranking' text='排行榜') + IFasCrown.link-icon + + .group + .title 用户 + ul + ListLink( + :text='userStore.isLoggedIn ? "查看令牌" : "设置令牌"' + link='/login' + ) + IFasFingerprint.link-icon + ListLink( + :link='userStore.isLoggedIn ? `/users/${userStore.userId}` : `/login?back=${$route.fullPath}`' + text='我的页面' + ) + IFasUser.link-icon + ListLink( + :link='userStore.isLoggedIn ? `/users/${userStore.userId}/following` : `/login?back=${$route.fullPath}`' + text='我的关注' + ) + IFasUser.link-icon + ListLink(link='/following/latest' text='关注用户的作品') + IFasUser.link-icon + + .group + .title PixivNow + ul + ListLink(externalLink='https://www.pixiv.net/' text='Pixiv.net') + IFasExternalLinkAlt.link-icon + ListLink(link='/about' text='关于我们') + IFasHeart.link-icon + + + + + diff --git a/src/components/SiteFooter.vue b/src/components/SiteFooter.vue new file mode 100644 index 0000000..3aba1eb --- /dev/null +++ b/src/components/SiteFooter.vue @@ -0,0 +1,101 @@ + +footer.global-footer + .top.flex.container + section.flex-1 + h4 探索更多 + ul + li + ExternalLink(href='/api/random?format=image') 随机图片 + li + RouterLink(to='/ranking') 今日排行 + li + RouterLink(to='/about') 关于本站 + section.flex-1 + h4 关注我们 + ul + li + | 网站作者: + | pixivperoe + li + | 原项目团队: + RouterLink.plain(to='/users/32338232') Dragon Fish + | 、 + RouterLink.plain(to='/users/15552366') MysticNebula70 + //- section.flex-1 + //- h4 社交媒体 + //- p Placeholder + section.flex-1 + h4 友情链接 + div 快来 GitHub issues 交换友链吧~ + //- ul + //- li 链接 + + .bottom.align-center + p.copyright + | Copyright © {{ yearStr }} + | + a(:href='GITHUB_URL' target='_blank') {{ PROJECT_NAME }} + | + em v{{ version }} + .dev-only(style='font-style: italic') + | This is test site → + a(:href='"https://pixiv.js.org" + $route.path' target='_blank') Go to Prod. + + + + diff --git a/src/components/SiteHeader.vue b/src/components/SiteHeader.vue new file mode 100644 index 0000000..2ef5a36 --- /dev/null +++ b/src/components/SiteHeader.vue @@ -0,0 +1,275 @@ + +header.global-navbar(:class='{ "not-at-top": notAtTop, hidden }') + .flex + a.side-nav-toggle.plain(@click='toggleSideNav') + IFasBars(data-icon) + + .logo-area + RouterLink.plain(to='/') + img.site-logo(:src='LogoH') + + .flex.search-area(v-if='$route.name !== "search"') + .search-full.align-right.flex-1 + SearchBox + .search-icon.align-right.flex-1 + a.pointer.plain(@click='openSideNav') + IFasSearch + | 搜索 + .flex.search-area(v-else) + + #global-nav__user-area.user-area + .user-link + a.dropdown-btn.plain.pointer( + :class='{ "show-user": showUserDropdown }' + @click.stop='showUserDropdown = !showUserDropdown' + ) + img.avatar( + :src='userStore.isLoggedIn ? userStore.userProfileImg : "/~/common/images/no_profile.png"', + :title='userStore.isLoggedIn ? userStore.userId + " (" + userStore.userPixivId + ")" : "未登入"' + ) + + Transition( + enter-active-class='fade-in-up' + leave-active-class='fade-out-down' + mode='out-in' + name='fade' + ) + .dropdown-content(v-show='showUserDropdown') + ul + //- notLogIn + li(v-if='!userStore.isLoggedIn') + .nav-user-card + .top + .banner-bg + img.avatar(:src='"/~/common/images/no_profile.png"') + .details + a.user-name 游客 + .uid 绑定令牌,同步您的 Pixiv 信息! + + //- isLogedIn + li(v-if='userStore.isLoggedIn') + .nav-user-card + .top + .banner-bg + RouterLink.plain.name(:to='"/users/" + userStore.userId') + img.avatar(:src='userStore.userProfileImgBig') + .details + RouterLink.plain.user-name( + :to='"/users/" + userStore.userId' + ) {{ userStore.userName }} + .uid @{{ userStore.userPixivId }} + + li(v-if='userStore.isLoggedIn') + RouterLink.plain( + :to='{ name: "users", params: { id: userStore.userId }, query: { tab: "public_bookmarks" } }' + ) 公开收藏 + li(v-if='userStore.isLoggedIn') + RouterLink.plain( + :to='{ name: "users", params: { id: userStore.userId }, query: { tab: "hidden_bookmarks" } }' + ) 私密收藏 + li(v-if='userStore.isLoggedIn') + RouterLink.plain( + :to='{ name: "following", params: { id: userStore.userId } }' + ) 我的关注 + li(v-if='$route.path !== "/login"') + RouterLink.plain(:to='"/login?back=" + $route.path') {{ userStore.isLoggedIn ? '查看令牌' : '用户登入' }} + li(v-if='userStore.isLoggedIn') + a.plain(@click='logoutUser') 用户登出 + + + + + diff --git a/src/components/SiteNoticeBanner.vue b/src/components/SiteNoticeBanner.vue new file mode 100644 index 0000000..602198b --- /dev/null +++ b/src/components/SiteNoticeBanner.vue @@ -0,0 +1,49 @@ + +Transition(name='fade') + #sitenotice-banner(v-if='isShow') + NAlert( + @close='handleClose' + closable + style='font-size: 1.5rem' + title='全站公告' + type='warning' + ) + NUl + NLi: RouterLink(to='/notifications/2024-04-26') 关于 PixivNow 由橘络搭建请问传播) + + + + + diff --git a/src/components/UgoiraViewer.vue b/src/components/UgoiraViewer.vue new file mode 100644 index 0000000..accb271 --- /dev/null +++ b/src/components/UgoiraViewer.vue @@ -0,0 +1,319 @@ + +#ugoira-viewer + canvas.media( + :height='illust?.height', + :width='illust.width' + ref='canvasRef' + v-if='firstLoaded' + ) + LazyLoad.media( + :height='illust.height', + :src='illust.urls.regular', + :style='{ cursor: isLoading ? "wait" : "pointer" }', + :width='illust.width' + @click='handleInit(false)' + loading='lazy' + v-else + ) + NProgress( + :height='6', + :percentage='+downloadProgress.toFixed(2)', + :processing='isLoading', + :style='{ left: 0, right: 0, position: "absolute", ...(isLoading ? { top: "calc(100% + 4px)", opacity: "1", transitionDuration: "0.25s" } : { top: "calc(100% - 4px)", opacity: "0", transitionDelay: "3s", transitionDuration: "0.5s" }) }' + show-value + status='default' + transition='all ease-in-out' + type='line' + ) + NFloatButton( + :bottom='20', + :menu-trigger='"hover"', + :right='20', + :style='{ cursor: isLoading ? "wait" : "pointer", opacity: 0.75 }' + shape='circle' + ) + //- button + template(v-if='!firstLoaded') + NSpin(size='small' v-if='isLoading') + NIcon(v-else): IPlay + template(v-else) + NIcon: IDownload + //- menu + template(#menu v-if='!firstLoaded') + NFloatButton(@click='handleInit(true)' title='加载原画' v-if='!isLoading') + IconPhotoSpark + NFloatButton(@click='handleInit(false)' title='加载普通画质') + NSpin(size='small' v-if='isLoading') + IconPhotoScan(v-else) + template(#menu v-if='firstLoaded') + NFloatButton(@click='handleJumpToCover' title='查看封面'): IconPhotoDown + NFloatButton(@click='handleDownloadGif' title='下载GIF') + NSpin(size='small' v-if='isLoadingGif || isLoading') + template(v-else): IconGif + NFloatButton(@click='handleDownloadMp4' title='下载MP4') + NSpin(size='small' v-if='isLoadingMp4 || isLoading') + template(v-else): IconMovie + NFloatButton(@click='handleInit(true)' title='加载原画' v-if='!isHQLoaded') + NSpin(size='small' v-if='isLoading') + template(v-else): IconPhotoSpark + + .badge {{ firstLoaded ? (isHQLoaded ? 'HQ' : 'NQ') : 'Cover' }} + + + + + diff --git a/src/components/userData.ts b/src/components/userData.ts new file mode 100644 index 0000000..840c133 --- /dev/null +++ b/src/components/userData.ts @@ -0,0 +1,81 @@ +import { PixivUser } from '@/types' +import Cookies from 'js-cookie' + +export function existsSessionId(): boolean { + const sessionId = Cookies.get('PHPSESSID') + if (sessionId) { + return true + } else { + Cookies.remove('CSRFTOKEN') + return false + } +} + +export async function initUser(): Promise { + try { + const { data } = await axios.get<{ userData: PixivUser; token: string }>( + `/api/user`, + { + headers: { + 'Cache-Control': 'no-store', + }, + } + ) + if (data.token) { + console.log('session ID认证成功', data) + Cookies.set('CSRFTOKEN', data.token, { secure: true, sameSite: 'Strict' }) + const res = data.userData + return res + } else { + Cookies.remove('CSRFTOKEN') + return Promise.reject('无效的session ID') + } + } catch (err) { + Cookies.remove('CSRFTOKEN') + return Promise.reject(err) + } +} + +export function login(token: string): Promise { + if (!validateSessionId(token)) { + console.error('访问令牌格式错误') + return Promise.reject('访问令牌格式错误') + } + Cookies.set('PHPSESSID', token, { + expires: 180, + path: '/', + secure: true, + sameSite: 'Strict', + }) + return initUser() +} + +export function logout(): void { + const token = Cookies.get('PHPSESSID') + if (token && confirm(`您要移除您的令牌吗?\n${token}`)) { + Cookies.remove('PHPSESSID') + Cookies.remove('CSRFTOKEN') + } +} + +export function validateSessionId(token: string): boolean { + return /^\d{2,10}_[0-9A-Za-z]{32}$/.test(token) +} + +export function exampleSessionId(): string { + const uid = new Uint32Array(1) + window.crypto.getRandomValues(uid) + const secret = (() => { + const strSet = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' + const final = [] + const indexes = new Uint8Array(32) + window.crypto.getRandomValues(indexes) + for (const i of indexes) { + const charIndex = Math.floor((i * strSet.length) / 256) + final.push(strSet[charIndex]) + } + return final.join('') + })() + return `${uid[0]}_${secret}` +} diff --git a/src/composables/states.ts b/src/composables/states.ts new file mode 100644 index 0000000..74e9bb4 --- /dev/null +++ b/src/composables/states.ts @@ -0,0 +1,44 @@ +import { defineStore } from 'pinia' +import { PixivUser } from '@/types' + +export const useSideNavStore = defineStore('sidenav', () => { + const openState = ref(false) + const isOpened = computed(() => openState.value) + function toggle() { + openState.value = !openState.value + } + function open() { + openState.value = true + } + function close() { + openState.value = false + } + return { openState, isOpened, toggle, open, close } +}) + +export const useUserStore = defineStore('user', () => { + const user = ref (null) + const isLoggedIn = computed(() => !!user.value) + const userId = computed(() => user.value?.id) + const userName = computed(() => user.value?.name) + const userPixivId = computed(() => user.value?.pixivId) + const userProfileImg = computed(() => user.value?.profileImg) + const userProfileImgBig = computed(() => user.value?.profileImgBig) + function login(data: PixivUser) { + user.value = data + } + function logout() { + user.value = null + } + return { + user, + isLoggedIn, + userId, + userName, + userPixivId, + userProfileImg, + userProfileImgBig, + login, + logout, + } +}) diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..4a7a186 --- /dev/null +++ b/src/config.ts @@ -0,0 +1,23 @@ +// Env +import { version } from '../package.json' +export { version } + +export const SITE_ENV = + import.meta.env.MODE === 'development' || + version.includes('-') || + location.hostname === 'pixiv-next.vercel.app' + ? 'development' + : 'production' + +// Copyright links +// Do not modify please +export const GITHUB_OWNER = 'FreeNowOrg' +export const GITHUB_REPO = 'PixivNow' +export const GITHUB_URL = `https://github.com/${GITHUB_OWNER}/${GITHUB_REPO}` + +// Site name +export const PROJECT_NAME = 'PixivNow' +export const PROJECT_TAGLINE = 'Enjoy Pixiv Now (pixiv.js.org)' + +// Image proxy cache seconds +export const IMAGE_CACHE_SECONDS = 12 * 60 * 60 * 1000 diff --git a/src/env.d.ts b/src/env.d.ts new file mode 100644 index 0000000..f86d5a0 --- /dev/null +++ b/src/env.d.ts @@ -0,0 +1,7 @@ +/// + +// declare module '*.vue' { +// import { ComponentOptions } from 'vue' +// const componentOptions: ComponentOptions +// export default componentOptions +// } diff --git a/src/locales/zh-Hans.json b/src/locales/zh-Hans.json new file mode 100644 index 0000000..0aa6155 --- /dev/null +++ b/src/locales/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "ArtworkCard.pageCount": "共{0}张" +} diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..3cc4358 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,14 @@ +import { createApp } from 'vue' +import { SITE_ENV } from '@/config' +import { registerPlugins } from '@/plugins' +import App from './App.vue' +import '@/styles/index.sass' + +// Create App +const app = createApp(App) + +registerPlugins(app) + +// Mount +app.mount('#app') +document.body?.setAttribute('data-env', SITE_ENV) diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts new file mode 100644 index 0000000..55e63af --- /dev/null +++ b/src/plugins/i18n.ts @@ -0,0 +1,30 @@ +import { createI18n, I18n } from 'vue-i18n' + +export const SUPPORTED_LOCALES = ['zh-Hans'] + +export function setupI18n(options = { locale: 'zh-Hans' }) { + const i18n = createI18n({ ...options, legacy: false }) + setI18nLanguage(i18n, options.locale) + return i18n +} + +export function setI18nLanguage( + i18n: I18n , + locale: string +) { + i18n.global.locale.value = locale + document.querySelector('html')?.setAttribute('lang', locale) +} + +export async function loadLocaleMessages( + i18n: I18n , + locale: string +) { + const messages = await import( + /* webpackChunkName: "locale-[request]" */ `@/locales/${locale}.json` + ) + i18n.global.setLocaleMessage(locale, messages.default) + setI18nLanguage(i18n, locale) + + return nextTick() +} diff --git a/src/plugins/index.ts b/src/plugins/index.ts new file mode 100644 index 0000000..1001a1e --- /dev/null +++ b/src/plugins/index.ts @@ -0,0 +1,26 @@ +import { router } from './router' +import { loadLocaleMessages, setupI18n } from './i18n' +import { createPinia } from 'pinia' +import { createGtag } from 'vue-gtag' +import type { App } from 'vue' + +export async function registerPlugins(app: App ) { + const i18n = setupI18n() + const initialLocale = 'zh-Hans' + app.use(i18n) + app.use(router) + app.use(createPinia()) + + if (import.meta.env.VITE_GOOGLE_ANALYTICS_ID) { + app.use( + createGtag({ + tagId: import.meta.env.VITE_GOOGLE_ANALYTICS_ID, + pageTracker: { + router, + }, + }) + ) + } + + await loadLocaleMessages(i18n, initialLocale) +} diff --git a/src/plugins/router.ts b/src/plugins/router.ts new file mode 100644 index 0000000..b4f05ef --- /dev/null +++ b/src/plugins/router.ts @@ -0,0 +1,116 @@ +import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router' +import { createDiscreteApi } from 'naive-ui' +const { message } = createDiscreteApi(['message']) + +const routes: RouteRecordRaw[] = [ + { + path: '/', + name: 'home', + component: () => import('@/view/index.vue'), + }, + { + path: '/artworks/:id', + alias: ['/illust/:id', '/i/:id'], + name: 'artworks', + component: () => import('@/view/artworks.vue'), + }, + { + path: '/following/latest', + alias: ['/bookmark_new_illust'], + name: 'following-latest', + component: () => import('@/view/following-latest.vue'), + }, + { + path: '/users/:id', + name: 'users', + alias: ['/u/:id'], + component: () => import('@/view/users.vue'), + }, + { + path: '/users/:id/following', + name: 'following', + component: () => import('@/view/following.vue'), + }, + { + path: '/search/:keyword', + name: 'search-index-redirect', + redirect: (to) => `/search/${to.params.keyword}/1`, + }, + { + path: '/search/:keyword/:p', + name: 'search', + component: () => import('@/view/search.vue'), + }, + { + path: '/discovery', + name: 'discovery', + component: () => import('@/view/discovery.vue'), + }, + { + path: '/ranking', + name: 'ranking', + component: () => import('@/view/ranking.vue'), + }, + { + path: '/login', + name: 'user-login', + component: () => import('@/view/login.vue'), + }, + { + path: '/about', + name: 'about-us', + component: () => import('@/view/about.vue'), + }, + { + path: '/notifications/2024-04-26', + name: 'notification-2024-04-26', + component: () => import('@/view/notifications/2024-04-26.vue'), + }, + { + path: '/:pathMatch(.*)*', + name: 'not-found', + component: () => import('@/view/404.vue'), + }, +] + +if (import.meta.env.DEV) { + routes.push({ + path: '/_debug', + name: 'debug', + children: [ + { + path: 'zip', + name: 'debug-zip', + component: () => import('@/view/_debug/zip.vue'), + }, + ], + }) +} + +export const router = createRouter({ + history: createWebHistory(), + routes, + scrollBehavior(to, from, savedPosition) { + if (savedPosition) { + return savedPosition + } else { + return { + top: 0, + behavior: 'smooth', + } + } + }, +}) + +router.afterEach(({ name }) => { + document.body.setAttribute('data-route', name as string) + // Fix route when modal opened + document.body.style.overflow = 'visible' +}) + +router.onError((error, to, from) => { + console.log(error, to, from) + message.error(error) +}) + +export default router diff --git a/src/styles/animate.sass b/src/styles/animate.sass new file mode 100644 index 0000000..6749b10 --- /dev/null +++ b/src/styles/animate.sass @@ -0,0 +1,39 @@ +@use "sass:color" + +.fade-in-up + animation: fadeInUp 0.24s ease + +.fade-out-down + animation: fadeOutDown 0.4s ease + +svg.spin + animation: spin 2s linear infinite + +@keyframes fadeInUp + 0% + opacity: 0 + transform: translate3d(0, 1rem, 0) + + to + opacity: 1 + transform: translateZ(0) + +@keyframes fadeOutDown + 0% + opacity: 1 + + to + opacity: 0 + transform: translate3d(0, 1rem, 0) + +@keyframes imgProgress + from + background-color: color.adjust(#e8e8e8, $lightness: 4%) + to + background-color: #e8e8e8 + +@keyframes spin + from + transform: rotate(0deg) + to + transform: rotate(360deg) diff --git a/src/styles/elements.sass b/src/styles/elements.sass new file mode 100644 index 0000000..946f856 --- /dev/null +++ b/src/styles/elements.sass @@ -0,0 +1,141 @@ +// Headers +@mixin header-shared($font-size, $shadow-color) + font-size: $font-size + text-shadow: 1px 1px 0 var(--theme-text-shadow-color), -1px -1px 0 var(--theme-text-shadow-color) + box-shadow: 0 0.1em 0 $shadow-color + +article + h1 + font-size: 1.8rem + + h2, h3, h4, h5, h6 + font-weight: 700 + padding: 0.2rem + color: var(--theme-text-color) + position: relative + &::before + content: "" + display: block + position: absolute + top: 50% + left: 0 + transform: translateY(-50%) + border-radius: 1em + &.plain::before + display: none + // 用于辅助目录进行定位,让锚点不会被顶部导航遮住 + [id] + padding-top: 60px + margin-top: -60px + + h2:not(.plain) + font-size: 1.5em + margin: 1rem 0 + padding-left: 1rem + &::before + width: 0.25em + height: 70% + background-color: var(--theme-accent-color) + + h3:not(.plain) + font-size: 1.3rem + margin: 0.5em 0 + padding-left: 0.8rem + &::before + width: 0.2em + height: 60% + background-color: rgba(var(--theme-accent-color--rgb), 0.75) + h4:not(.plain) + font-size: 1.2rem + margin: 0.5em 0 + padding-left: 0.6rem + &::before + width: 0.15em + height: 50% + background-color: rgba(var(--theme-accent-color--rgb), 0.6) + h5:not(.plain) + font-size: 1.125rem + margin: 0.5em 0 + padding-left: 0.4rem + &::before + width: 0.1em + height: 40% + background-color: rgba(var(--theme-accent-color--rgb), 0.5) + h6:not(.plain) + font-size: 1.125rem + margin: 0.5em 0 + +// Links +a + --color: var(--theme-link-color) + color: var(--color) + text-decoration: none + position: relative + display: inline-block + + &.plain + display: unset + + &:not(.plain)::after + content: '' + display: block + position: absolute + width: 100% + height: 0.1em + bottom: -0.1em + left: 0 + background-color: var(--color) + visibility: hidden + transform: scaleX(0) + transition: all 0.4s ease-in-out + + &:not(.plain):hover::after, + &.router-link-active::after, + &.tab-active::after, + &.is-active::after + visibility: visible + transform: scaleX(1) + + &.button + padding: 0.2rem 0.4rem + background-color: var(--theme-tag-color) + transition: all .4s ease + cursor: pointer + + &:hover + background-color: rgba(var(--theme-link-color--rgb), 1) + color: var(--theme-accent-link-color) + +// Code +pre + overflow: auto + background: #efefef + padding: 4px + +code + background-color: #efefef + display: inline + border-radius: 2px + padding: .1rem .2rem + color: #e02080 + word-break: break-word + +// Responsive +.responsive, +.body-inner + @media (min-width: 1280px) + margin-left: auto + margin-right: auto + width: 1200px + @media (max-width: 1280px) + margin-left: 1rem + margin-right: 1rem + +svg.svg--inline + display: inline-block + vertical-align: -0.125em + overflow: visible + +.n-modal + width: 600px + max-width: 86vw diff --git a/src/styles/formats.sass b/src/styles/formats.sass new file mode 100644 index 0000000..b4dc563 --- /dev/null +++ b/src/styles/formats.sass @@ -0,0 +1,70 @@ +.align-center + text-align: center + +.align-left + text-align: left + +.align-right + text-align: right + +.position-center + text-align: left + position: relative + left: 50% + transform: translateX(-50%) + +.flex-center + display: flex + align-items: center + +.pre, +.poem + white-space: pre-wrap + +.flex + display: flex + +.flex-1 + flex: 1 + +.flex-list + .list-item + display: flex + gap: 0.5rem + + &:not(:first-of-type) + margin-top: 4px + + > div + flex: 1 + + .key + font-weight: 600 + box-shadow: 2px 0 #dedede + +.pointer + cursor: pointer + +// Loading +.loading-cover + position: relative + &::before,&::after + content: "" + width: 100% + height: 100% + display: block + position: absolute + &::before + background-image: url(/images/spinner.svg) + background-size: 75px + background-repeat: no-repeat + background-position: center + top: 50% + left: 50% + transform: translateX(-50%) translateY(-50%) + z-index: 6 + &::after + top: 0 + left: 0 + background-color: rgba(255,255,255,0.25) + z-index: 5 diff --git a/src/styles/index.sass b/src/styles/index.sass new file mode 100644 index 0000000..a8722b3 --- /dev/null +++ b/src/styles/index.sass @@ -0,0 +1,49 @@ +@use 'animate' +@use 'elements' +@use 'formats' +@use 'variables' + +html, +body + margin: 0 + padding: 0 + position: relative + +* + box-sizing: border-box + +#app + font-family: Avenir, Helvetica, Arial, sans-serif + -webkit-font-smoothing: antialiased + -moz-osx-font-smoothing: grayscale + color: var(--theme-text-color) + display: flex + flex-direction: column + min-height: 100vh + +// Env specific +[data-env="production"] + .dev-only, .dev-test + display: none !important +[data-env="development"] + .prod-only + display: none !important + +.container + margin-left: 10% + margin-right: 10% + +.narrow-only + display: none + +.isAdContainer + display: none !important + +@media screen and (max-width: 800px) + .container + margin-left: 2rem + margin-right: 2rem + .narrow-only + display: inherit + .wide-only + display: none diff --git a/src/styles/variables.sass b/src/styles/variables.sass new file mode 100644 index 0000000..38f18ee --- /dev/null +++ b/src/styles/variables.sass @@ -0,0 +1,25 @@ +@use 'sass:color' + +$accent-color: rgb(73, 147, 255) + +:root + font-size: 16px + --theme-accent-color: #{$accent-color} + --theme-accent-color--rgb: 73, 147, 255 + --theme-accent-color-darken: #{color.scale($accent-color, $lightness: -12%)} + --theme-accent-link-color: rgb(255, 255, 255) + --theme-secondary-color: rgb(224, 32, 128) + --theme-secondary-color--rgb: 224, 32, 128 + --theme-text-color: rgb(44, 62, 80) + --theme-link-color: rgb(63, 81, 181) + --theme-link-color--rgb: 63, 81, 181 + --theme-background-color: rgb(255, 255, 255) + --theme-text-shadow-color: rgb(255, 255, 255) + --theme-box-shadow-color: rgb(204, 204, 204) + --theme-box-shadow-color-hover: rgb(170, 170, 170) + --theme-border-color: rgb(136, 136, 136) + --theme-box-shadow: 0 0 4px var(--theme-box-shadow-color) + --theme-box-shadow-hover: 0 0 8px var(--theme-box-shadow-color-hover) + --theme-tag-color: rgb(214, 228, 255) + --theme-danger-color: rgb(255, 85, 85) + --theme-bookmark-color: rgb(255, 105, 180) diff --git a/src/types/Artworks.ts b/src/types/Artworks.ts new file mode 100644 index 0000000..1894c5f --- /dev/null +++ b/src/types/Artworks.ts @@ -0,0 +1,210 @@ +export interface ArtworkUrls { + mini: string + thumb: string + small: string + regular: string + original: string +} + +export interface ArtworkPageUrls { + original: string + small: string + regular: string + thumb_mini: string +} + +export interface ArtworkTag { + tag: string + locked: boolean + deletable: boolean + userId: `${number}` + translation?: { + en?: string + } + userName: string +} + +export interface ArtworkGallery { + urls: ArtworkPageUrls + width: number + height: number +} + +interface ArtworkCommon { + id: `${number}` + title: string + description: string + createDate: string + updateDate: string + illustType: IllustType + restrict: 0 + xRestrict: 0 | 1 | 2 + sl: number + userId: `${number}` + userName: string + alt: string + width: number + height: number + pageCount: number + isBookmarkable: boolean + bookmarkData: { + id: `${number}` + private: boolean + } | null + titleCaptionTranslation: { + workTitle: string | null + workCaption: string | null + } + isUnlisted: boolean + aiType: number +} + +export interface ArtworkInfo extends ArtworkCommon { + url: string + tags: string[] + profileImageUrl: string + type: 'illust' | 'novel' +} + +export type ArtworkInfoOrAd = + | ArtworkInfo + | { + isAdContainer: true + } + +export enum IllustType { + ILLUST = 0, + MANGA = 1, + UGOIRA = 2, +} + +export interface ArtworkRank { + title: string + date: string + tags: string[] + url: string + illust_type: IllustType + illust_book_style: '0' + illust_page_count: `${number}` + user_name: string + profile_img: string + illust_content_type: { + sexual: 0 | 1 | 2 + lo: boolean + grotesque: boolean + violent: boolean + homosexual: boolean + drug: boolean + thoughts: boolean + antisocial: boolean + religional: boolean + original: boolean + furry: boolean + bl: boolean + yuri: boolean + } + illust_series: + | { + illustSeriesId: `${number}` + illustSeriesUserId: `${number}` + illustSeriesTitle: string + illustSeriesCaption: string + illustSeriesContentCount: `${number}` + illustSeriesCreateDatetime: string + illustSeriesContentIllustId: `${number}` + illustSeriesContentOrder: `${number}` + pageUrl: string + } + | false + illust_id: number + width: number + height: number + user_id: number + rank: number + yes_rank: number + rating_count: number + view_count: number + illust_upload_timestamp: number + attr: string +} + +export interface Artwork extends ArtworkCommon { + illustId: `${number}` + illustTitle: string + illustComment: string + urls: ArtworkUrls + tags: { + authorId: `${number}` + isLocked: boolean + tags: ArtworkTag[] + writable: boolean + } + storableTags: string[] + userAccount: string + userIllusts: Record<`${number}`, ArtworkInfo | null> + likeData: boolean + bookmarkCount: number + likeCount: number + commentCount: number + responseCount: number + viewCount: number + isHowto: boolean + isOriginal: boolean + imageResponseOutData: any[] + imageResponseData: any[] + imageResponseCount: number + pollData: any + seriesNavData: any + descriptionBoothId: any + descriptionYoutubeId: any + comicPromotion: any + fanboxPromotion: any + contestBanners: any[] + contestData: any + profileImageUrl: string + zoneConfig?: any + extraData?: { + meta: { + title: string + description: string + canonical: string + alternateLanguages: { + ja: string + en: string + } + descriptionHeader: string + ogp: { + description: string + image: string + title: string + type: string + } + twitter: { + description: string + image: string + title: string + card: string + } + } + } + noLoginData?: { + breadcrumbs: { + successor: any[] + current: { + zh?: string + } + } + zengoIdWorks: ArtworkInfo[] + zengoWorkData: { + nextWork: { + id: `${number}` + title: string + } + prevWork: { + id: `${number}` + title: string + } + } + } + pages: ArtworkGallery[] +} diff --git a/src/types/Comment.ts b/src/types/Comment.ts new file mode 100644 index 0000000..26bce46 --- /dev/null +++ b/src/types/Comment.ts @@ -0,0 +1,18 @@ +export interface Comments { + userId: `${number}` + userName: string + isDeletedUser: boolean + img: string + id: `${number}` + comment: string + stampId: number | null + stampLink: null + commentDate: string + commentRootId: string | null + commentParentId: string | null + commentUserId: `${number}` + replyToUserId: string | null + replyToUserName: string | null + editable: boolean + hasReplies: boolean +} diff --git a/src/types/Users.ts b/src/types/Users.ts new file mode 100644 index 0000000..ca42b95 --- /dev/null +++ b/src/types/Users.ts @@ -0,0 +1,119 @@ +import { Artwork, ArtworkInfo } from './Artworks' + +export enum UserXRestrict { + SAFE, + R18, + R18G, +} +export enum UserPrivacyLevel { + PUBLIC_FOR_ALL, + PUBLIC_FOR_FRIENDS, + PRIVATE, +} + +export interface User { + userId: `${number}` + name: string + image: string + imageBig: string + premium: boolean + isFollowed: boolean + isMypixiv: boolean + isBlocking: boolean + background: { + url: string | null + color: string | null + repeat: string | null + isPrivate: boolean + } | null + sketchLiveId: {} | null + partial: number + acceptRequest: boolean + sketchLives: any[] + following: number + followedBack: boolean + comment: string + commentHtml: string + webpage: string | null + social: { + twitter?: { + url: string + } + facebook?: { + url: string + } + instagram?: { + url: string + } + [key: string]: any + } + region: { + name: string + privacyLevel: UserPrivacyLevel + } | null + birthDay: { + name: string + privacyLevel: UserPrivacyLevel + } | null + gender: { + name: string + privacyLevel: UserPrivacyLevel + } | null + job: { + name: string + privacyLevel: UserPrivacyLevel + } | null + workspace: { + userWorkspacePc?: string + userWorkspaceMonitor?: string + userWorkspaceTool?: string + userWorkspaceScanner?: string + userWorkspaceTablet?: string + userWorkspaceMouse?: string + userWorkspacePrinter?: string + userWorkspaceDesktop?: string + userWorkspaceMusic?: string + userWorkspaceDesk?: string + userWorkspaceChair?: string + userWorkspaceComment?: string + wsUrl?: string + wsBigUrl?: string + } + official: boolean + group: null + illusts: ArtworkInfo[] + manga: ArtworkInfo[] + novels: ArtworkInfo[] +} + +export interface PixivUser { + id: `${number}` + pixivId: string + name: string + profileImg: string + profileImgBig: string + premium: boolean + xRestrict: UserXRestrict + adult: boolean + illustCreator: boolean + novelCreator: boolean + hideAiWorks: boolean + readingStatusEnabled: boolean + illustMaskRules: any[] + location: string + isSensitiveViewable: boolean +} + +export interface UserListItem { + userId: `${number}` + userName: string + profileImageUrl: string + userComment: string + following: boolean + followed: boolean + isBlocking: boolean + isMypixiv: boolean + illusts: ArtworkInfo[] + novels: any[] + acceptRequest: boolean +} diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..e319f70 --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,3 @@ +export * from './Artworks' +export * from './Comment' +export * from './Users' diff --git a/src/utils/UgoiraPlayer.ts b/src/utils/UgoiraPlayer.ts new file mode 100644 index 0000000..5dcde12 --- /dev/null +++ b/src/utils/UgoiraPlayer.ts @@ -0,0 +1,610 @@ +import { Artwork } from '@/types' +import gifWorkerUrl from 'gif.js/dist/gif.worker.js?url' +import { ZipDownloader, ZipDownloaderOptions } from './ZipDownloader' + +/** + * Public options + */ +export interface UgoiraPlayerOptions { + onDownloadProgress?: ( + progress: number, + frameIndex: number, + totalFrames: number + ) => void + onDownloadComplete?: () => void + onDownloadError?: (error: Error) => void + zipDownloaderOptions?: ZipDownloaderOptions + requestTimeoutMs?: number + preferImageBitmap?: boolean + playbackRate?: number + progressiveRender?: boolean +} + +export interface UgoiraFrame { + file: string + delay: number +} +export interface UgoiraMeta { + frames: UgoiraFrame[] + mime_type: string + originalSrc: string + src: string +} + +/** Internal structures */ +interface CachedVisual { + /** kept for backward-compat paths (gif/mp4) */ + img?: HTMLImageElement + /** preferred for runtime drawing */ + bitmap?: ImageBitmap + /** object URL for cleanup */ + url: string + /** raw bytes for re-encode */ + buf: Uint8Array +} + +/** Player state */ +const enum PlayerState { + Idle, + Downloading, + Ready, + Playing, + Paused, + Destroyed, +} + +/** + * UgoiraPlayer + * @author dragon-fish + * @license MIT + */ +export class UgoiraPlayer { + // ====== private fields ====== + private _canvas?: HTMLCanvasElement + private _illust!: Artwork + private _meta?: UgoiraMeta + + private state: PlayerState = PlayerState.Idle + private isPlaying = false + + private curFrame = 0 + private lastFrameTime = 0 + private nextFrameDue = 0 + + private cached: Map = new Map() + private objectURLs: Set = new Set() + private files: Record = {} + + private zipDownloader?: ZipDownloader + private aborter?: AbortController + + private downloadProgress = 0 + private isDownloading = false + private isDownloadComplete = false + private downloadStartTime = 0 + private frameDownloadTimes: number[] = [] + private frameReady: boolean[] = [] + + private lastRenderedFrameIndex = -1 + private renderTimer: number | undefined + + // New: runtime settings + private _playbackRate = 1 + private _preferImageBitmap = true + private _progressiveRender = true + + constructor( + illust: Artwork, + public options: UgoiraPlayerOptions = {} + ) { + this._preferImageBitmap = options.preferImageBitmap ?? true + this._playbackRate = options.playbackRate ?? 1 + this._progressiveRender = options.progressiveRender ?? true + this.reset(illust) + } + + // ====== lifecycle ====== + reset(illust: Artwork) { + this.destroy() + this._canvas = undefined + this._illust = illust + + this.downloadProgress = 0 + this.isDownloading = false + this.isDownloadComplete = false + this.downloadStartTime = 0 + this.frameDownloadTimes = [] + this.frameReady = [] + this.lastRenderedFrameIndex = -1 + this.curFrame = 0 + this.lastFrameTime = 0 + this.nextFrameDue = 0 + + if (this.renderTimer) { + clearTimeout(this.renderTimer) + this.renderTimer = undefined + } + + this.state = PlayerState.Idle + } + + setupCanvas(canvas: HTMLCanvasElement) { + this._canvas = canvas + this._canvas.width = this.initWidth + this._canvas.height = this.initHeight + } + + // ====== getters (public API preserved) ====== + get isReady() { + return !!this._meta && Object.keys(this.files).length > 0 + } + get canExport() { + return this.isDownloadComplete && this.isReady + } + get downloadProgressPercent() { + return this.downloadProgress + } + get downloadStats() { + if (!this.isDownloadComplete && this.frameDownloadTimes.length === 0) { + return null + } + const totalTime = performance.now() - this.downloadStartTime + const avgFrameTime = + this.frameDownloadTimes.length > 0 + ? this.frameDownloadTimes.reduce((a, b) => a + b, 0) / + this.frameDownloadTimes.length + : 0 + + return { + totalDownloadTime: totalTime, + averageFrameTime: avgFrameTime, + totalFrames: this.frameDownloadTimes.length, + isComplete: this.isDownloadComplete, + progress: this.downloadProgress, + } + } + get isUgoira() { + return this._illust.illustType === 2 + } + get canvas() { + return this._canvas + } + get illust() { + return this._illust + } + get meta() { + return this._meta + } + get totalFrames() { + return this._meta?.frames.length ?? 0 + } + get now() { + return performance.now() + } + get initWidth() { + return this._illust.width + } + get initHeight() { + return this._illust.height + } + get mimeType() { + return this._meta?.mime_type ?? '' + } + /** New: playbackRate getter/setter */ + get playbackRate() { + return this._playbackRate + } + set playbackRate(v: number) { + this._playbackRate = Math.max(0.1, v || 1) + } + + // ====== network / assets ====== + async fetchMeta() { + this._meta = await fetch( + new URL(`/ajax/illust/${this._illust.id}/ugoira_meta`, location.href) + .href, + { + cache: 'default', + } + ).then((res) => res.json()) + return this + } + + async fetchFrames(originalQuality = false) { + if (!this._meta) { + await this.fetchMeta() + } + if (!this._meta) { + throw new Error('Failed to fetch meta') + } + return this.streamingFetchAndDrawFrames(originalQuality) + } + + /** + * Optimized streaming download + */ + private async streamingFetchAndDrawFrames(originalQuality = false) { + if (this.isDownloading) { + throw new Error('Download already in progress') + } + + this.isDownloading = true + this.state = PlayerState.Downloading + this.downloadStartTime = performance.now() + this.downloadProgress = 0 + this.frameDownloadTimes = [] + + // Abort any previous network work + this.aborter?.abort() + this.aborter = new AbortController() + + try { + const zipUrl = new URL( + this._meta![originalQuality ? 'originalSrc' : 'src'], + location.href + ).href + + if (!this.zipDownloader) { + this.zipDownloader = new ZipDownloader('') + } + this.zipDownloader.setUrl(zipUrl).setOptions({ + chunkSize: 256 * 1024, + maxConcurrentRequests: 3, + tryDecompress: true, + timeoutMs: this.options.requestTimeoutMs ?? 10000, + retries: 2, + ...this.options.zipDownloaderOptions, + }) + + const { frames } = this._meta! + const totalFrames = frames.length + let processedFrames = 0 + + this.frameReady = new Array(totalFrames).fill(false) + this.lastRenderedFrameIndex = -1 + + const result = await this.zipDownloader.streamingDownload({ + signal: this.aborter.signal, + onFileComplete: (entryWithData, info) => { + if (this.state === PlayerState.Destroyed) return + + const frameIndex = frames.findIndex( + (f) => f.file === entryWithData.fileName + ) + if (frameIndex === -1) { + console.warn( + `[UgoiraPlayer] Unknown frame: ${entryWithData.fileName}` + ) + return + } + + const frame = frames[frameIndex] + + // Store bytes & prepare visual cache lazily + this.files[frame.file] = entryWithData.data + this.frameDownloadTimes[frameIndex] = info.downloadTime + processedFrames++ + + // update progress + this.downloadProgress = (processedFrames / totalFrames) * 100 + this.options.onDownloadProgress?.( + this.downloadProgress, + frameIndex, + totalFrames + ) + + // flag ready and optionally schedule render + this.frameReady[frameIndex] = true + if (this._progressiveRender) this.scheduleNextFrame() + }, + }) + + console.info('[UgoiraPlayer] download complete', result) + + // completed + this.isDownloadComplete = true + this.isDownloading = false + this.state = PlayerState.Ready + + this.options.onDownloadComplete?.() + + return this + } catch (error) { + this.isDownloading = false + this.state = PlayerState.Idle + this.options.onDownloadError?.(error as Error) + throw error + } + } + + /** + * Sequential scheduler: render frames 0..N in order as soon as each is ready. + * If a gap is encountered, pause until the missing frame arrives. + */ + private scheduleNextFrame() { + if (!this._canvas || !this._meta) return + if (this.renderTimer) return + + const { frames } = this._meta + const nextIndex = this.lastRenderedFrameIndex + 1 + if (!this.frameReady[nextIndex]) return + + const renderSequential = async () => { + while (true) { + const idx = this.lastRenderedFrameIndex + 1 + if (idx >= frames.length) { + this.renderTimer = undefined + return + } + if (!this.frameReady[idx]) { + this.renderTimer = undefined + return + } + const frame = frames[idx] + await this.renderFrameToCanvas(idx, frame) + this.lastRenderedFrameIndex = idx + + await new Promise ((resolve) => { + this.renderTimer = window.setTimeout( + () => { + this.renderTimer = undefined + resolve() + }, + Math.max(0, frame.delay / this._playbackRate) + ) + }) + } + } + + renderSequential().catch((e) => { + console.error('[UgoiraPlayer] sequential render error:', e) + this.renderTimer = undefined + }) + } + + /** Render a single frame to the canvas */ + private async renderFrameToCanvas(frameIndex: number, frame: UgoiraFrame) { + if (!this._canvas) return + const ctx = this._canvas.getContext('2d') + if (!ctx) return + + try { + const visual = await this.getVisual(frame.file) + const source = visual.bitmap ?? visual.img! + // drawImage supports both HTMLImageElement and ImageBitmap + ctx.drawImage(source as any, 0, 0, this.initWidth, this.initHeight) + // console.debug(`[UgoiraPlayer] rendered frame ${frameIndex+1}`) + } catch (error) { + console.error( + `[UgoiraPlayer] frame ${frameIndex + 1} render failed:`, + error + ) + } + } + + // ====== caching primitives ====== + private async getVisual(fileName: string): Promise { + const hit = this.cached.get(fileName) + if (hit) { + // Ensure image element fully loaded if present + if (hit.img && !(hit.img.complete && hit.img.naturalWidth > 0)) { + await new Promise ((resolve, reject) => { + hit.img!.onload = () => resolve() + hit.img!.onerror = () => reject(new Error('image load error')) + }) + } + return hit + } + + const buf = this.files[fileName] + if (!buf) throw new Error(`File ${fileName} not found`) + + const blob = new Blob([new Uint8Array(buf)], { type: this.mimeType }) + const url = URL.createObjectURL(blob) + this.objectURLs.add(url) + + const visual: CachedVisual = { url, buf, img: undefined, bitmap: undefined } + + // Prefer ImageBitmap for runtime rendering; keep HTMLImageElement for encoders + if (this._preferImageBitmap && 'createImageBitmap' in window) { + try { + visual.bitmap = await createImageBitmap(blob) + } catch { + // Fallback to HTMLImageElement + } + } + + if (!visual.bitmap) { + const img = new Image() + img.src = url + await new Promise ((resolve, reject) => { + img.onload = () => resolve() + img.onerror = () => reject(new Error('image load error')) + }) + visual.img = img + } + + this.cached.set(fileName, visual) + return visual + } + + /** Back-compat helper returning HTMLImageElement (may synthesize from cache) */ + private getImage(fileName: string): HTMLImageElement { + const cached = this.cached.get(fileName) + if (cached?.img) return cached.img + + const buf = this.files[fileName] + if (!buf) throw new Error(`File ${fileName} not found`) + + const blob = new Blob([new Uint8Array(buf)], { type: this.mimeType }) + const url = URL.createObjectURL(blob) + this.objectURLs.add(url) + + const img = new Image() + img.src = url + + this.cached.set(fileName, { url, buf, img, bitmap: undefined }) + return img + } + + /** Back-compat async image getter */ + private async getImageAsync(fileName: string): Promise { + const v = await this.getVisual(fileName) + if (v.img) return v.img + // need to synthesize from existing blob URL for encoders + const img = new Image() + img.src = v.url + await new Promise
((resolve, reject) => { + img.onload = () => resolve() + img.onerror = () => reject(new Error('image load error')) + }) + v.img = img + return img + } + + getRealFrameSize() { + if (!this.isReady) { + throw new Error('Ugoira assets not ready, please fetch first') + } + const firstFrame = this.getImage(this.meta!.frames[0].file) + return { width: firstFrame.width, height: firstFrame.height } + } + + // ====== classic playback loop (preserved) ====== + private drawFrame() { + if (!this.canvas || !this._meta || !this.isPlaying) return + + const ctx = this.canvas.getContext('2d')! + const frame = this._meta.frames[this.curFrame] + const delay = Math.max(0, frame.delay / this._playbackRate) + + const now = this.now + if (this.nextFrameDue === 0) this.nextFrameDue = now + delay + + if (now >= this.nextFrameDue) { + this.lastFrameTime = now + this.curFrame = (this.curFrame + 1) % this.totalFrames + this.nextFrameDue = now + delay + } + + // Render current frame + const img = this.getImage(frame.file) + ctx.drawImage(img, 0, 0, this.initWidth, this.initHeight) + + requestAnimationFrame(() => this.drawFrame()) + } + + // ====== controls ====== + play() { + this.isPlaying = true + this.lastFrameTime = this.now + this.nextFrameDue = 0 + this.state = PlayerState.Playing + this.drawFrame() + } + + pause() { + this.isPlaying = false + if (this.state !== PlayerState.Destroyed) this.state = PlayerState.Paused + } + + /** Cancel any in-flight downloads */ + cancelDownload() { + this.aborter?.abort() + } + + destroy() { + this.pause() + + if (this.renderTimer) { + clearTimeout(this.renderTimer) + this.renderTimer = undefined + } + + this.cancelDownload() + + // Revoke URLs & clear caches + this.objectURLs.forEach((url) => URL.revokeObjectURL(url)) + this.objectURLs.clear() + + this.cached.clear() + this.files = {} + + this._meta = undefined + this.zipDownloader = undefined + this.isDownloading = false + this.isDownloadComplete = false + this.downloadProgress = 0 + this.downloadStartTime = 0 + this.frameDownloadTimes = [] + this.frameReady = [] + this.lastRenderedFrameIndex = -1 + + this.state = PlayerState.Destroyed + } + + // ====== encoders ====== + private async genGifEncoder() { + const { width, height } = this.getRealFrameSize() + const GifJs = (await import('gif.js')).default + return new GifJs({ + debug: import.meta.env.DEV, + workers: 5, + workerScript: gifWorkerUrl, + width, + height, + }) + } + + async renderGif(): Promise { + if (!this.canExport) { + throw new Error( + 'Cannot export: download not complete or assets not ready' + ) + } + + const encoder = await this.genGifEncoder() + const frames = this._meta!.frames + + // Prepare HTMLImageElements for gif.js + const imageList = await Promise.all( + frames.map((f) => this.getImageAsync(f.file)) + ) + + return new Promise ((resolve, reject) => { + try { + imageList.forEach((img, idx) => { + encoder.addFrame(img, { delay: Math.max(0, frames[idx].delay) }) + }) + encoder.on('finished', (blob: Blob) => { + // Best-effort worker cleanup (gif.js specific) + // @ts-ignore + encoder.freeWorkers?.forEach?.((w: Worker) => w?.terminate?.()) + resolve(blob) + }) + encoder.on('abort', () => reject(new Error('GIF encoding aborted'))) + encoder.render() + } catch (e) { + reject(e as Error) + } + }) + } + + async renderMp4() { + if (!this.canExport) { + throw new Error( + 'Cannot export: download not complete or assets not ready' + ) + } + + const { width, height } = this.getRealFrameSize() + const frames = this._meta!.frames.map((i) => ({ + data: this.getImage(i.file).src!, + duration: Math.max(0, i.delay), + })) + + const { encode } = await import('modern-mp4') + const buf = await encode({ frames, width, height, audio: false }) + return new Blob([buf], { type: 'video/mp4' }) + } +} diff --git a/src/utils/ZipDownloader.ts b/src/utils/ZipDownloader.ts new file mode 100644 index 0000000..ce6f3db --- /dev/null +++ b/src/utils/ZipDownloader.ts @@ -0,0 +1,1002 @@ +/** + * ZipDownloader - 支持分片下载和缓存的 ZIP 文件下载器 + * + * 使用示例: + * + * // 使用默认配置(128KB 分片,32KB 初始尾部抓取) + * const downloader = new ZipDownloader('https://example.com/file.zip') + * + * // 自定义分片大小和尾部抓取策略 + * const downloader = new ZipDownloader('https://example.com/file.zip', { + * chunkSize: 256 * 1024, // 256KB 分片 + * initialTailSize: 16 * 1024, // 16KB 初始尾部抓取 + * maxTailSize: 128 * 1024, // 128KB 最大尾部抓取 + * timeoutMs: 10000, // 10秒超时 + * retries: 3, // 重试3次 + * lruBytes: 32 * 1024 * 1024, // 32MB 缓存 + * parallelProbe: 4, // 4个并发探测 + * maxConcurrentRequests: 6, // 最大6个并发请求 + * tryDecompress: true // 尝试解压 + * }) + * + * // 获取文件列表 + * const overview = await downloader.getCentralDirectory() + * + * // 下载单个文件 + * const result = await downloader.downloadByIndex(0) + * const fileData = result.bytes + * + * // 流式下载模式(从头开始下载整个zip,每完成一个文件就回调) + * const result = await downloader.streamingDownload({ + * onFileComplete: (entryWithData, info) => { + * console.log(`文件完成: ${entryWithData.fileName}`) + * console.log(`MIME类型: ${info.mimeType}`) + * console.log(`数据大小: ${entryWithData.data.length} 字节`) + * // 处理文件数据 entryWithData.data + * }, + * onProgress: (downloaded, total) => { + * console.log(`下载进度: ${(downloaded / total * 100).toFixed(2)}%`) + * } + * }) + */ +/* + * ZipDownloader (refactored) — a smaller, composable ZIP range-downloader + * + * Goals of this refactor: + * - Keep the public API backwards-compatible with your original class. + * - Split responsibilities into focused helpers to shrink cognitive size. + * - Make network, caching, parsing, and streaming parts swappable/testable. + * - Trim incidental complexity; add a `debug` flag instead of console noise. + * - Keep zero-dependency runtime (browser/Workers/Node via injected fetch). + * + * Public API preserved: + * - constructor(url, options?) + * - setOptions(partial) + * - getSize(signal?) + * - getCentralDirectory(signal?) + * - downloadByIndex(index, signal?) + * - downloadByPath(path, signal?) + * - getDataRanges(signal?) + * - streamingDownload({ onFileComplete?, onProgress?, chunkSize?, signal? }) + * - cleanup() + * - setUrl(url) + */ + +// --------------------------- Types --------------------------- +export type FetchLike = ( + input: RequestInfo | URL, + init?: RequestInit +) => Promise + +export interface ZipDownloaderOptions { + fetch?: FetchLike + timeoutMs?: number + retries?: number + lruBytes?: number + parallelProbe?: number + maxConcurrentRequests?: number + tryDecompress?: boolean + chunkSize?: number + initialTailSize?: number + maxTailSize?: number + debug?: boolean +} + +export interface ZipEntry { + index: number + fileName: string + compressedSize: number + uncompressedSize: number + crc32: number + compressionMethod: number // 0=store, 8=deflate + generalPurposeBitFlag: number + localHeaderOffset: number + centralHeaderOffset: number + requiresZip64: boolean + mimeType?: string +} + +export interface ZipEntryWithData extends ZipEntry { + data: Uint8Array +} + +export interface ZipOverview { + url: string + contentLength: number + centralDirectoryOffset: number + centralDirectorySize: number + entryCount: number + entries: ZipEntry[] +} + +export interface DataRange { + index: number + fileName: string + dataStart: number + dataLength: number +} + +// ----------------------- Small utilities ----------------------- +const TEXT_DECODER = new TextDecoder() + +const SIG = { + EOCD: 0x06054b50, + ZIP64_EOCD_LOCATOR: 0x07064b50, + ZIP64_EOCD: 0x06064b50, + CD_FILE_HEADER: 0x02014b50, + LOCAL_FILE_HEADER: 0x04034b50, +} as const + +type Mutable = { -readonly [K in keyof T]: T[K] } + +class ConcurrencyLimiter { + private running = 0 + private q: Array<() => void> = [] + constructor(private max: number) {} + async acquire(): Promise { + if (this.running < this.max) { + this.running++ + return + } + return new Promise((res) => this.q.push(res)) + } + release() { + this.running-- + if (this.q.length) { + this.running++ + this.q.shift()!() + } + } + async run (fn: () => Promise ): Promise { + await this.acquire() + try { + return await fn() + } finally { + this.release() + } + } +} + +class ByteLRU { + private map = new Map () + private total = 0 + constructor(private maxBytes: number) {} + get(k: string) { + const v = this.map.get(k) + if (!v) return + this.map.delete(k) + this.map.set(k, v) + return v + } + set(k: string, v: Uint8Array) { + if (v.byteLength > this.maxBytes) return + const old = this.map.get(k) + if (old) { + this.total -= old.byteLength + this.map.delete(k) + } + this.map.set(k, v) + this.total += v.byteLength + while (this.total > this.maxBytes && this.map.size) { + const [oldK, oldV] = this.map.entries().next().value as [ + string, + Uint8Array, + ] + this.map.delete(oldK) + this.total -= oldV.byteLength + } + } + resize(n: number) { + this.maxBytes = n + while (this.total > this.maxBytes && this.map.size) { + const [k, v] = this.map.entries().next().value! + this.map.delete(k) + this.total -= v.byteLength + } + } +} + +const sleep = (ms: number) => new Promise((res) => setTimeout(res, ms)) + +async function withRetries ( + fn: () => Promise , + retries: number, + baseDelay = 200 +): Promise { + let n = 0 + for (;;) { + try { + return await fn() + } catch (e) { + if (n++ >= retries) throw e + await sleep(baseDelay * 2 ** (n - 1) * (1 + Math.random() * 0.2)) + } + } +} + +function withTimeout (p: Promise , ms?: number): Promise { + if (!ms || ms <= 0) return p + return new Promise ((resolve, reject) => { + const t = setTimeout(() => reject(new Error(`Timeout ${ms}ms`)), ms) + p.then( + (v) => { + clearTimeout(t) + resolve(v) + }, + (e) => { + clearTimeout(t) + reject(e) + } + ) + }) +} + +function findSignatureFromEnd(buf: Uint8Array, signature: number): number { + const dv = new DataView(buf.buffer, buf.byteOffset, buf.byteLength) + for (let i = buf.byteLength - 4; i >= 0; i--) + if (dv.getUint32(i, true) === signature) return i + return -1 +} + +function readAscii(dv: DataView, offset: number, length: number): string { + return TEXT_DECODER.decode( + new Uint8Array(dv.buffer, dv.byteOffset + offset, length) + ) +} + +// -------------------- MIME detection (lean) -------------------- +const MIME_TYPES: Record = { + png: 'image/png', + jpg: 'image/jpeg', + jpeg: 'image/jpeg', + gif: 'image/gif', + webp: 'image/webp', + bmp: 'image/bmp', + svg: 'image/svg+xml', + ico: 'image/x-icon', + tiff: 'image/tiff', + tif: 'image/tiff', + mp4: 'video/mp4', + webm: 'video/webm', + avi: 'video/x-msvideo', + mov: 'video/quicktime', + wmv: 'video/x-ms-wmv', + flv: 'video/x-flv', + mkv: 'video/x-matroska', + mp3: 'audio/mpeg', + wav: 'audio/wav', + ogg: 'audio/ogg', + aac: 'audio/aac', + flac: 'audio/flac', + m4a: 'audio/mp4', + pdf: 'application/pdf', + doc: 'application/msword', + docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + xls: 'application/vnd.ms-excel', + xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + ppt: 'application/vnd.ms-powerpoint', + pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + txt: 'text/plain', + html: 'text/html', + htm: 'text/html', + css: 'text/css', + js: 'application/javascript', + json: 'application/json', + xml: 'application/xml', + csv: 'text/csv', + zip: 'application/zip', + rar: 'application/vnd.rar', + '7z': 'application/x-7z-compressed', + tar: 'application/x-tar', + gz: 'application/gzip', + exe: 'application/x-msdownload', + dmg: 'application/x-apple-diskimage', + iso: 'application/x-iso9660-image', +} + +function getMimeTypeFromExtension(name: string): string { + const ext = name.split('.').pop()?.toLowerCase() + return ext + ? MIME_TYPES[ext] || 'application/octet-stream' + : 'application/octet-stream' +} + +function getMimeFromMagic(u8: Uint8Array): string { + if (u8.length < 4) return 'application/octet-stream' + const h = Array.from(u8.slice(0, 16)) + .map((b) => b.toString(16).padStart(2, '0')) + .join('') + if (h.startsWith('89504e470d0a1a0a')) return 'image/png' + if (h.startsWith('ffd8ff')) return 'image/jpeg' + if (h.startsWith('47494638')) return 'image/gif' + if (h.startsWith('25504446')) return 'application/pdf' + if ( + h.startsWith('504b0304') || + h.startsWith('504b0506') || + h.startsWith('504b0708') + ) + return 'application/zip' + // webp/wav quick checks + if (h.startsWith('52494646') && u8.length >= 12) { + const tag = String.fromCharCode(...u8.slice(8, 12)) + if (tag === 'WEBP') return 'image/webp' + if (tag === 'WAVE') return 'audio/wav' + } + // mp4 ftyp + if (u8.length >= 8) { + const size = new DataView(u8.buffer, u8.byteOffset, 4).getUint32(0, false) + if (size >= 8 && u8.length >= size) { + const type = new TextDecoder().decode(u8.slice(4, 8)) + if (type === 'ftyp') return 'video/mp4' + } + } + return 'application/octet-stream' +} + +function getMimeType(fileName: string, data?: Uint8Array): string { + if (data && data.length) { + const m = getMimeFromMagic(data) + if (m !== 'application/octet-stream') return m + } + return getMimeTypeFromExtension(fileName) +} + +// -------------------- Decompression helper -------------------- +async function maybeDecompress( + method: number, + data: Uint8Array, + tryDecompress: boolean +): Promise<{ bytes: Uint8Array; isDecompressed: boolean; method: number }> { + if (!tryDecompress) return { bytes: data, isDecompressed: false, method } + if (method === 0) return { bytes: data, isDecompressed: true, method } + const DS: any = (globalThis as any).DecompressionStream + if (method === 8 && typeof DS === 'function') { + const ds = new DS('deflate-raw') + const res = new Response( + new Blob([data as Uint8Array ]).stream().pipeThrough(ds) + ) + const ab = await res.arrayBuffer() + return { bytes: new Uint8Array(ab), isDecompressed: true, method } + } + return { bytes: data, isDecompressed: false, method } +} + +// -------------------- Networking layer -------------------- +class RangeRequestManager { + private inflight = new Map >() + constructor( + private url: string, + private fetcher: FetchLike, + private timeoutMs: number, + private retries: number, + private limiter: ConcurrencyLimiter, + private cache: ByteLRU + ) {} + + setUrl(url: string) { + this.url = url + this.inflight.clear() + } + setTimeout(ms: number) { + this.timeoutMs = ms + } + setRetries(n: number) { + this.retries = n + } + setLimiter(l: ConcurrencyLimiter) { + this.limiter = l + } + setCache(c: ByteLRU) { + this.cache = c + } + + async headSize(signal?: AbortSignal): Promise { + const doHead = async () => { + const res = await withTimeout( + this.fetcher(this.url, { method: 'HEAD', signal }), + this.timeoutMs + ) + if (!res.ok) throw new Error(`HEAD ${res.status}`) + const len = res.headers.get('content-length') + if (!len) throw new Error('Missing content-length') + const n = Number(len) + if (!Number.isFinite(n) || n < 0) + throw new Error(`Bad content-length: ${len}`) + return n + } + const doRange = async () => { + const res = await withTimeout( + this.fetcher(this.url, { headers: { Range: 'bytes=0-0' }, signal }), + this.timeoutMs + ) + const cr = res.headers.get('content-range') + if (!cr) throw new Error('Missing content-range') + const m = cr.match(/\/(\d+)$/) + if (!m) throw new Error(`Bad content-range: ${cr}`) + return Number(m[1]) + } + return withRetries(async () => { + try { + return await doHead() + } catch { + return await doRange() + } + }, this.retries) + } + + async range( + start: number, + end: number, + signal?: AbortSignal + ): Promise { + const cacheKey = `r:${start}-${end}` + const hit = this.cache.get(cacheKey) + if (hit) return hit + + const inflightKey = `f:${start}-${end}` + if (!this.inflight.has(inflightKey)) { + this.inflight.set( + inflightKey, + this.limiter + .run(async () => { + const res = await withRetries(async () => { + const r = await withTimeout( + this.fetcher(this.url, { + headers: { Range: `bytes=${start}-${end}` }, + signal, + }), + this.timeoutMs + ) + if (!(r.status === 206 || r.status === 200)) + throw new Error(`HTTP ${r.status} for ${start}-${end}`) + return r + }, this.retries) + const u8 = new Uint8Array(await res.arrayBuffer()) + this.cache.set(cacheKey, u8) + return u8 + }) + .catch((err) => { + this.inflight.delete(inflightKey) + throw err + }) + ) + } + return this.inflight.get(inflightKey)! + } +} + +// ------------------------ ZIP parsing ------------------------ +class ZipParser { + constructor( + private rangeHelper: RangeRequestManager, + private opts: Required< + Pick< + ZipDownloaderOptions, + 'initialTailSize' | 'maxTailSize' | 'chunkSize' + > + > & { tryDecompress: boolean } + ) {} + + async overview(signal?: AbortSignal, url?: string): Promise { + const contentLength = await this.rangeHelper.headSize(signal) + + // progressive tail fetch + let tailSize = Math.min(this.opts.initialTailSize, contentLength) + let tailStart = contentLength - tailSize + let tail = await this.rangeHelper.range( + tailStart, + contentLength - 1, + signal + ) + let eocdPos = findSignatureFromEnd(tail, SIG.EOCD) + + while (eocdPos === -1 && tailSize < contentLength) { + const newTailSize = Math.min( + tailSize + this.opts.initialTailSize, + this.opts.maxTailSize, + contentLength + ) + if (newTailSize === tailSize) break + tailSize = newTailSize + tailStart = contentLength - tailSize + tail = await this.rangeHelper.range(tailStart, contentLength - 1, signal) + eocdPos = findSignatureFromEnd(tail, SIG.EOCD) + } + if (eocdPos === -1) throw new Error('EOCD not found') + + const tailDV = new DataView(tail.buffer, tail.byteOffset, tail.byteLength) + let cdCount = tailDV.getUint16(eocdPos + 10, true) + let cdSize = tailDV.getUint32(eocdPos + 12, true) + let cdOffset = tailDV.getUint32(eocdPos + 16, true) + + const needsZip64 = + cdCount === 0xffff || cdSize === 0xffffffff || cdOffset === 0xffffffff + if (needsZip64) { + const locPos = findSignatureFromEnd(tail, SIG.ZIP64_EOCD_LOCATOR) + if (locPos === -1) throw new Error('ZIP64 locator missing') + const z64Off = Number(tailDV.getBigUint64(locPos + 8, true)) + const z64Hdr = await this.rangeHelper.range( + z64Off, + z64Off + 160 - 1, + signal + ) + const dv = new DataView( + z64Hdr.buffer, + z64Hdr.byteOffset, + z64Hdr.byteLength + ) + if (dv.getUint32(0, true) !== SIG.ZIP64_EOCD) + throw new Error('ZIP64 EOCD signature mismatch') + cdCount = Number(dv.getBigUint64(32, true)) + cdSize = Number(dv.getBigUint64(40, true)) + cdOffset = Number(dv.getBigUint64(48, true)) + } + + const cdBuf = await this.rangeHelper.range( + cdOffset, + cdOffset + cdSize - 1, + signal + ) + const cdDV = new DataView(cdBuf.buffer, cdBuf.byteOffset, cdBuf.byteLength) + + const entries: ZipEntry[] = [] + for (let p = 0, i = 0; p < cdBuf.byteLength && i < cdCount; i++) { + if (cdDV.getUint32(p, true) !== SIG.CD_FILE_HEADER) break + const flags = cdDV.getUint16(p + 8, true) + const method = cdDV.getUint16(p + 10, true) + const crc32 = cdDV.getUint32(p + 16, true) + const comp32 = cdDV.getUint32(p + 20, true) + const uncomp32 = cdDV.getUint32(p + 24, true) + const fnLen = cdDV.getUint16(p + 28, true) + const extraLen = cdDV.getUint16(p + 30, true) + const cmtLen = cdDV.getUint16(p + 32, true) + const lho32 = cdDV.getUint32(p + 42, true) + const name = readAscii(cdDV, p + 46, fnLen) + + let compressedSize = comp32 + let uncompressedSize = uncomp32 + let localHeaderOffset = lho32 + let requiresZip64 = false + + const extraStart = p + 46 + fnLen + const extra = new DataView( + cdBuf.buffer, + cdBuf.byteOffset + extraStart, + extraLen + ) + for (let ep = 0; ep + 4 <= extraLen; ) { + const id = extra.getUint16(ep, true) + const size = extra.getUint16(ep + 2, true) + const s = ep + 4 + if (id === 0x0001) { + // ZIP64 + requiresZip64 = true + let z = s + if (uncompressedSize === 0xffffffff && z + 8 <= s + size) { + uncompressedSize = Number(extra.getBigUint64(z, true)) + z += 8 + } + if (compressedSize === 0xffffffff && z + 8 <= s + size) { + compressedSize = Number(extra.getBigUint64(z, true)) + z += 8 + } + if (localHeaderOffset === 0xffffffff && z + 8 <= s + size) { + localHeaderOffset = Number(extra.getBigUint64(z, true)) + z += 8 + } + } + ep += 4 + size + } + + entries.push({ + index: i, + fileName: name, + compressedSize, + uncompressedSize, + crc32, + compressionMethod: method, + generalPurposeBitFlag: flags, + localHeaderOffset, + centralHeaderOffset: cdOffset + p, + requiresZip64, + mimeType: getMimeTypeFromExtension(name), + }) + + p = extraStart + extraLen + cmtLen + } + + return { + url: url ?? '', + contentLength, + centralDirectoryOffset: cdOffset, + centralDirectorySize: cdSize, + entryCount: entries.length, + entries, + } + } + + async probeLocalHeader( + entry: ZipEntry, + signal?: AbortSignal + ): Promise { + const probe = await this.rangeHelper.range( + entry.localHeaderOffset, + entry.localHeaderOffset + 30 + this.opts.chunkSize - 1, + signal + ) + const dv = new DataView(probe.buffer, probe.byteOffset, probe.byteLength) + if (dv.getUint32(0, true) !== SIG.LOCAL_FILE_HEADER) + throw new Error( + `Local header signature mismatch at ${entry.localHeaderOffset}` + ) + const fnLen = dv.getUint16(26, true) + const extraLen = dv.getUint16(28, true) + const dataStart = entry.localHeaderOffset + 30 + fnLen + extraLen + return { + index: entry.index, + fileName: entry.fileName, + dataStart, + dataLength: entry.compressedSize, + } + } +} + +// ---------------------- Public class ---------------------- +export class ZipDownloader { + private opts: Required + private cache: ByteLRU + private limiter: ConcurrencyLimiter + private rangeHelper: RangeRequestManager + private parser: ZipParser + + private inflight = new Map >() + private overview?: ZipOverview + private dataRanges?: DataRange[] + private pathToIndex = new Map () + + constructor( + private url: string, + options: ZipDownloaderOptions = {} + ) { + this.opts = { + fetch: options.fetch ?? fetch.bind(globalThis), + timeoutMs: options.timeoutMs ?? 15000, + retries: options.retries ?? 2, + lruBytes: options.lruBytes ?? 16 * 1024 * 1024, + parallelProbe: options.parallelProbe ?? 4, + maxConcurrentRequests: options.maxConcurrentRequests ?? 6, + tryDecompress: options.tryDecompress ?? true, + chunkSize: options.chunkSize ?? 128 * 1024, + initialTailSize: options.initialTailSize ?? 16 * 1024, + maxTailSize: options.maxTailSize ?? 128 * 1024, + debug: options.debug ?? false, + } + this.cache = new ByteLRU(this.opts.lruBytes) + this.limiter = new ConcurrencyLimiter(this.opts.maxConcurrentRequests) + this.rangeHelper = new RangeRequestManager( + this.url, + this.opts.fetch, + this.opts.timeoutMs, + this.opts.retries, + this.limiter, + this.cache + ) + this.parser = new ZipParser(this.rangeHelper, { + initialTailSize: this.opts.initialTailSize, + maxTailSize: this.opts.maxTailSize, + chunkSize: this.opts.chunkSize, + tryDecompress: this.opts.tryDecompress, + }) + } + + setOptions(partial: ZipDownloaderOptions): this { + const next: Mutable > = { + ...this.opts, + ...partial, + fetch: partial.fetch ?? this.opts.fetch, + } + const changedConcurrency = + next.maxConcurrentRequests !== this.opts.maxConcurrentRequests + const changedLRU = next.lruBytes !== this.opts.lruBytes + + this.opts = next + + if (changedLRU) { + this.cache.resize(this.opts.lruBytes) + } + if (changedConcurrency) { + this.limiter = new ConcurrencyLimiter(this.opts.maxConcurrentRequests) + this.rangeHelper.setLimiter(this.limiter) + } + + this.rangeHelper.setTimeout(this.opts.timeoutMs) + this.rangeHelper.setRetries(this.opts.retries) + this.parser = new ZipParser(this.rangeHelper, { + initialTailSize: this.opts.initialTailSize, + maxTailSize: this.opts.maxTailSize, + chunkSize: this.opts.chunkSize, + tryDecompress: this.opts.tryDecompress, + }) + return this + } + + async getSize(signal?: AbortSignal): Promise { + const k = 'size' + if (!this.inflight.has(k)) + this.inflight.set( + k, + this.rangeHelper.headSize(signal).catch((e) => { + this.inflight.delete(k) + throw e + }) + ) + return this.inflight.get(k)! + } + + async getCentralDirectory(signal?: AbortSignal): Promise { + if (this.overview) return this.overview + const k = 'overview' + if (!this.inflight.has(k)) { + this.inflight.set( + k, + this.parser + .overview(signal, this.url) + .then((ov) => { + this.overview = { ...ov, url: this.url } + ov.entries.forEach((e) => this.pathToIndex.set(e.fileName, e.index)) + return this.overview! + }) + .catch((e) => { + this.inflight.delete(k) + throw e + }) + ) + } + return this.inflight.get(k)! + } + + async downloadByIndex(index: number, signal?: AbortSignal) { + const ov = await this.getCentralDirectory(signal) + if (index < 0 || index >= ov.entryCount) + throw new Error(`index out of range: ${index}`) + const e = ov.entries[index] + const ranges = await this._ensureDataRanges(signal) + const r = ranges[index] + const key = `entry:${index}:${r.dataStart}-${r.dataLength}` + + if (!this.inflight.has(key)) { + this.inflight.set( + key, + (async () => { + const body = await this.rangeHelper.range( + r.dataStart, + r.dataStart + r.dataLength - 1, + signal + ) + const { bytes, isDecompressed, method } = await maybeDecompress( + e.compressionMethod, + body, + this.opts.tryDecompress + ) + const mimeTypeFromExtension = getMimeTypeFromExtension(e.fileName) + const mimeType = getMimeType(e.fileName, bytes) + return { + fileName: e.fileName, + index: e.index, + bytes, + isDecompressed, + method, + compressedSize: e.compressedSize, + uncompressedSize: e.uncompressedSize, + mimeType, + mimeTypeFromExtension, + } + })().catch((err) => { + this.inflight.delete(key) + throw err + }) + ) + } + return this.inflight.get(key)! + } + + async downloadByPath(path: string, signal?: AbortSignal) { + const ov = await this.getCentralDirectory(signal) + const idx = + this.pathToIndex.get(path) ?? + ov.entries.find((e) => e.fileName === path)?.index + if (idx == null) throw new Error(`file not found in zip: ${path}`) + return this.downloadByIndex(idx, signal) + } + + private async _ensureDataRanges(signal?: AbortSignal): Promise { + if (this.dataRanges) return this.dataRanges + const k = 'ranges' + if (!this.inflight.has(k)) { + this.inflight.set( + k, + (async () => { + const ov = await this.getCentralDirectory(signal) + const out: DataRange[] = new Array(ov.entryCount) + const limit = Math.min( + this.opts.parallelProbe, + this.opts.maxConcurrentRequests + ) + const sem = new ConcurrencyLimiter(limit) + const batchSize = Math.min(limit, 8) + const indices = ov.entries.map((e) => e.index) + for (let i = 0; i < indices.length; i += batchSize) { + const batch = indices.slice(i, i + batchSize) + await Promise.all( + batch.map((idx) => + sem.run(async () => { + out[idx] = await this.parser.probeLocalHeader( + ov.entries[idx], + signal + ) + }) + ) + ) + } + for (let j = 0; j < out.length; j++) + if (!out[j]) { + const e = ov.entries[j] + out[j] = { + index: e.index, + fileName: e.fileName, + dataStart: e.localHeaderOffset + 30, + dataLength: e.compressedSize, + } + } + this.dataRanges = out + return out + })().catch((e) => { + this.inflight.delete(k) + throw e + }) + ) + } + return this.inflight.get(k)! + } + + cleanup() { + this.inflight.clear() + this.cache = new ByteLRU(this.opts.lruBytes) + this.limiter = new ConcurrencyLimiter(this.opts.maxConcurrentRequests) + this.rangeHelper.setCache(this.cache) + this.rangeHelper.setLimiter(this.limiter) + this.overview = undefined + this.dataRanges = undefined + this.pathToIndex.clear() + return this + } + + setUrl(url: string) { + if (this.url !== url) { + this.url = url + this.rangeHelper.setUrl(url) + this.cleanup() + } + return this + } + + async getDataRanges(signal?: AbortSignal) { + return this._ensureDataRanges(signal) + } + + async streamingDownload(params: { + onFileComplete?: ( + entry: ZipEntryWithData, + info: { + downloadTime: number + method: number + isDecompressed: boolean + mimeType: string + physicalIndex: number + } + ) => void + onProgress?: (downloaded: number, total: number) => void + chunkSize?: number + signal?: AbortSignal + }): Promise<{ + totalFiles: number + completedFiles: number + entries: ZipEntryWithData[] + }> { + const { + onFileComplete, + onProgress, + chunkSize = this.opts.chunkSize, + signal, + } = params + const t0 = performance.now() + const ov = await this.getCentralDirectory(signal) + + const sorted = ov.entries + .filter((e) => e.compressedSize > 0) + .sort((a, b) => a.localHeaderOffset - b.localHeaderOffset) + if (sorted.length === 0) + return { totalFiles: 0, completedFiles: 0, entries: [] } + + const chunks: { start: number; end: number; data: Uint8Array }[] = [] + const extractRange = (start: number, length: number) => { + const out = new Uint8Array(length) + let written = 0, + cursor = start + for (const c of chunks) { + if (c.end < cursor) continue + if (c.start > start + length - 1) break + const s = Math.max(c.start, cursor) + const e = Math.min(c.end, start + length - 1) + const off = s - c.start + const len = e - s + 1 + out.set(c.data.subarray(off, off + len), written) + written += len + cursor += len + if (written >= length) break + } + return out + } + + const parseLocalHeader = (data: Uint8Array, offset: number) => { + const dv = new DataView(data.buffer, data.byteOffset + offset) + if (dv.getUint32(0, true) !== SIG.LOCAL_FILE_HEADER) return null + const fn = dv.getUint16(26, true), + ex = dv.getUint16(28, true) + return { headerSize: 30 + fn + ex } + } + + let downloaded = 0 + const complete: ZipEntryWithData[] = [] + const done = new Set () + + while (downloaded < ov.contentLength) { + if (signal?.aborted) throw new Error('Aborted') + const start = downloaded + const end = Math.min(start + chunkSize - 1, ov.contentLength - 1) + const buf = await this.rangeHelper.range(start, end, signal) + chunks.push({ start, end, data: buf }) + downloaded = end + 1 + onProgress?.(downloaded, ov.contentLength) + + for (const entry of sorted) { + if (done.has(entry.index)) continue + const localHeaderMin = entry.localHeaderOffset + 30 + if (downloaded < localHeaderMin) continue + const headerData = extractRange( + entry.localHeaderOffset, + Math.min(30 + 1024, downloaded - entry.localHeaderOffset) + ) + const header = parseLocalHeader(headerData, 0) + if (!header) continue + const dataStart = entry.localHeaderOffset + header.headerSize + const dataEnd = dataStart + entry.compressedSize + if (downloaded < dataEnd) continue + + const comp = extractRange(dataStart, entry.compressedSize) + const { bytes, isDecompressed, method } = await maybeDecompress( + entry.compressionMethod, + comp, + this.opts.tryDecompress + ) + const mimeType = getMimeType(entry.fileName, bytes) + const item: ZipEntryWithData = { ...entry, data: bytes } + onFileComplete?.(item, { + downloadTime: performance.now() - t0, + method, + isDecompressed, + mimeType, + physicalIndex: entry.index, + }) + done.add(entry.index) + complete.push(item) + } + } + + return { + totalFiles: sorted.length, + completedFiles: complete.length, + entries: complete, + } + } +} diff --git a/src/utils/ajax.ts b/src/utils/ajax.ts new file mode 100644 index 0000000..12ba3ac --- /dev/null +++ b/src/utils/ajax.ts @@ -0,0 +1,41 @@ +import { AxiosRequestConfig } from 'axios' +import nprogress from 'nprogress' + +export const ajax = axios.create({ + timeout: 15 * 1000, + headers: { + 'Content-Type': 'application/json', + }, +}) +ajax.interceptors.request.use((config) => { + nprogress.start() + return config +}) +ajax.interceptors.response.use( + (res) => { + nprogress.done() + return res + }, + (err) => { + nprogress.done() + return Promise.reject(err) + } +) + +export const ajaxPostWithFormData = ( + url: string, + data: + | string + | string[][] + | Record + | URLSearchParams + | undefined, + config?: AxiosRequestConfig +) => + ajax.post(url, new URLSearchParams(data).toString(), { + ...config, + headers: { + ...config?.headers, + 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', + }, + }) diff --git a/src/utils/artworkActions.ts b/src/utils/artworkActions.ts new file mode 100644 index 0000000..f0bdcf1 --- /dev/null +++ b/src/utils/artworkActions.ts @@ -0,0 +1,35 @@ +import { ajax, ajaxPostWithFormData } from '@/utils/ajax' +import { ArtworkInfo, ArtworkInfoOrAd } from '@/types' + +export function sortArtList ( + obj: Record +): T[] { + return Object.values(obj).sort((a, b) => +b.id - +a.id) +} + +export function isArtwork(item: ArtworkInfoOrAd): item is ArtworkInfo { + return Object.keys(item).includes('id') +} + +export async function addBookmark( + illust_id: number | `${number}` +): Promise { + return ( + await ajax.post('/ajax/illusts/bookmarks/add', { + illust_id, + restrict: 0, + comment: '', + tags: [], + }) + ).data +} + +export async function removeBookmark( + bookmark_id: number | `${number}` +): Promise { + return ( + await ajaxPostWithFormData('/ajax/illusts/bookmarks/delete', { + bookmark_id: '' + bookmark_id, + }) + ).data +} diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..f1db360 --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,34 @@ +import { ArtworkInfo } from '@/types' + +export * from './artworkActions' +export * from './userActions' + +export const defaultArtwork: ArtworkInfo = { + id: '0', + title: '', + description: '', + createDate: '', + updateDate: '', + illustType: 0, + restrict: 0, + xRestrict: 0, + sl: 0, + userId: '0', + userName: '', + alt: '', + width: 0, + height: 0, + pageCount: 0, + isBookmarkable: false, + bookmarkData: null, + titleCaptionTranslation: { + workTitle: null, + workCaption: null, + }, + isUnlisted: false, + url: '', + tags: [], + profileImageUrl: '', + type: 'illust', + aiType: 1, +} diff --git a/src/utils/setTitle.ts b/src/utils/setTitle.ts new file mode 100644 index 0000000..4e9f1f1 --- /dev/null +++ b/src/utils/setTitle.ts @@ -0,0 +1,8 @@ +import { PROJECT_NAME, PROJECT_TAGLINE } from '@/config' + +export function setTitle(...args: (string | number | null | undefined)[]) { + return (document.title = [ + ...args.filter((i) => i !== null && typeof i !== 'undefined'), + `${PROJECT_NAME} - ${PROJECT_TAGLINE}`, + ].join(' | ')) +} diff --git a/src/utils/userActions.ts b/src/utils/userActions.ts new file mode 100644 index 0000000..e3cc58a --- /dev/null +++ b/src/utils/userActions.ts @@ -0,0 +1,28 @@ +import { ajaxPostWithFormData } from '@/utils/ajax' + +export async function addUserFollow( + user_id: number | `${number}` +): Promise { + return ( + await ajaxPostWithFormData(`/bookmark_add.php`, { + mode: 'add', + type: 'user', + user_id: '' + user_id, + tag: '', + restrict: '0', + format: 'json', + }) + ).data +} + +export async function removeUserFollow( + user_id: number | `${number}` +): Promise { + return ( + await ajaxPostWithFormData(`/rpc_group_setting.php`, { + mode: 'del', + type: 'bookuser', + id: '' + user_id, + }) + ).data +} diff --git a/src/view/404.vue b/src/view/404.vue new file mode 100644 index 0000000..0f05116 --- /dev/null +++ b/src/view/404.vue @@ -0,0 +1,14 @@ + +#error-view + ErrorPage( + description='啊咧?啊咧咧——?!页面跑丢了!!!' + status='404' + title='404 Not Found' + ) + RouterLink(to='/'): NButton(type='primary') Take me home + + + diff --git a/src/view/_debug/zip.vue b/src/view/_debug/zip.vue new file mode 100644 index 0000000..77e2d4f --- /dev/null +++ b/src/view/_debug/zip.vue @@ -0,0 +1,203 @@ + +section.responsive + NH1 ZipDownloader + + NFlex(direction='column') + NInputGroup + NInput(v-model:value='urlInput') + NButton(@click='getCentralDirectory' type='primary') Fetch Information + NInputGroup + NInputNumber( + :max='10 * 1024 * 1024', + :min='1024', + :step='1024' + v-model:value='chunkSize' + ) + template(#prefix) Chunk Size: + template(#suffix) B + + NUl + NLi + strong Current URL: + span {{ currentUrl }} + NLi + strong ZIP File Size: + span {{ formatFileSize(data?.contentLength || 0) }} + NLi + strong Central Directory Size: + span {{ formatFileSize(data?.centralDirectorySize || 0) }} + NLi + strong Download Chunk Size: + span {{ formatFileSize(chunkSize) }} + + NDataTable(:columns='columns', :data='entries || []', :scroll-x='1200') + + details + pre {{ data }} + + + + + diff --git a/src/view/about.vue b/src/view/about.vue new file mode 100644 index 0000000..5bd40b8 --- /dev/null +++ b/src/view/about.vue @@ -0,0 +1,83 @@ + +mixin repoLink + ExternalLink(:href='GITHUB_URL' target='_blank') {{ GITHUB_OWNER }}/{{ GITHUB_REPO }} + +#about-view.body-inner + h1#top 关于我们 + section.intro + Card(title='简介') + p PixivNow - Now, everyone can enjoy Pixiv! + p 现在,每个人都能享受 Pixiv! + p 也许能给你带来不一样体验的奇妙网站。让你更专注于欣赏插画本身,而不会被神秘因素干扰。 + + Card(title='使用方法') + h3 访客 + p 正常用,有手就行( + h3 开发者 + p 懒得写 API 文档…… + p 绝大多数地方用的都是 Pixiv Web 版的 ajax API。具体你可以看看源码,如果你真的很好奇,可以用 issues 问问我,我随缘回答。 + + Card(title='开销') + p 我们曾经是没有任何经济开销的,直到2023年10月。 + p 原作者的服务被爬爆了,账号也被 Vercel 暂时封禁。他不得不动用钞能力临时维持住了服务。Vercel 的资费是 $20/月,这相当于原作者每个月得少吃三顿肯德鸡疯狂星期四!这实在是太残忍了! + p 之后也许会在站内放一些谷歌自动广告之类的。纵然杯水车薪,不过能回点血是一点吧。 + p 我们正在积极寻找更便宜的解决方案,不过目前来说进度不太乐观就是了。 我是不是应该在这里放个收款码,说不定会有富哥包养我+ + Card(title='访问令牌') + h3 这是什么 + p “访问令牌”指的是您在 Pixiv 源站登录账号后键名为PHPSESSID的 cookie。 + h3 隐私政策 + p 我们不会收集或转让您的个人信息或 cookie。 + h3 有什么用 + p 如果您选择提供您的访问令牌,就能使用一些高级功能。包括但不限于: + ul + li 能看到更感兴趣的相关推荐 + li 能够访问自己的收藏夹(暂时无法编辑) + li 能够访问 NSFW 内容(设定为允许时) + li 能够使用高级搜索(订阅过 Pixiv 会员时) + p 部分高级功能的效果取决于您在 Pixiv 源站的设定,您可以在这里 查看。 + + Card(title='鸣谢') + p: em 以下排名不分先后 + h3 组织 + ul + li GitHub 提供了源码托管和版本管控服务 + liVercel提供了页面托管和 serverless 计算服务(但是现在白嫖的额度用完了) + li JS.ORG 提供了域名服务 + h3 Pixiv.cat + p + | 我们使用 + a(href='https://pixiv.cat/' target='_blank') Pixiv.cat + | 提供的图片服务。 + h3 个人 + p + | 感谢为 + | + +repoLink + | + | 贡献内容的全部编辑者! + + Card(title='免责声明') + h3 色图相关 + p 我们本身不提供 NSFW 资源(例如 R-18 插画),任意访问此类资源的行为均是由用户在源站的参数设置中设定的。对于可能出现的 NSFW 资源我们均有做出明显的警告标记,我们不鼓励访问或传播此类资源。 + h3 用户言论 + p “用户言论”指的是 Pixiv 源站用户通过自我介绍、插画简介、评论区等功能发布的言论。这部分属于发表者自身的行为,我们无法有效控制。我们不会发布也不鼓励传播不当言论。如果您在浏览过程中发现了不当内容,我们非常鼓励您前往源站进行举报。 + h3 版权声明 + p 请求得到的全部数据以及媒体资源,版权归 Pixiv 或其原作者所有。 + p PixivNow 程序通过 Apache-2.0 协议授权。 + p 仅供交流与学习。 + + Card(title='加入我们') + p + | 我们是开源项目,欢迎给我们点星星或者提交 PR 以及 issue: + +repoLink + + + diff --git a/src/view/artworks.vue b/src/view/artworks.vue new file mode 100644 index 0000000..5e09d67 --- /dev/null +++ b/src/view/artworks.vue @@ -0,0 +1,462 @@ + +#artwork-view + //- Loading + section.placeholder(v-if='loading') + .gallery + NSkeleton( + :sharp='false' + block + height='50vh' + style='margin: 0 auto; width: 500px; max-width: 80vw' + ) + .body-inner + .artwork-info + h1.loading(style='padding: 0.5rem 0'): NSkeleton( + height='2rem' + style='margin-top: 1em' + width='20rem' + ) + Card(title='') + p.description: NSkeleton(:repeat='4' text) + p.stats: span(v-for='_ in 4') + NSkeleton(circle height='1em' text width='1em') + NSkeleton(style='margin-left: 0.5em' text width='4em') + p.create-date: NSkeleton(text width='12em') + p.canonical-link: NSkeleton(height='1.5rem' width='8rem') + h2: NSkeleton(height='2rem' width='8rem') + Card(title='') + AuthorCard + h2: NSkeleton(height='2rem' width='8rem') + NSkeleton(:sharp='false' height='8rem' width='100%') + + //- Done + section.illust-container(v-if='!error && illust') + #top-area + .align-center(:style='{ marginBottom: "1rem" }' v-if='isUgoira') + UgoiraViewer(:illust='illust') + Gallery(:pages='pages' v-else) + + .body-inner + #meta-area + h1(:class='illust.xRestrict ? "danger" : ""') {{ illust.illustTitle }} + Card(title='') + .artwork-info + p.description.pre(v-html='illust.description') + p.description.no-desc( + :style='{ color: "#aaa" }' + v-if='!illust.description' + ) (作者未填写简介) + + p.stats + span.like-count(title='点赞') + IFasThumbsUp(data-icon) + | {{ illust.likeCount }} + + //- 收藏 + span.bookmark-count( + :class='{ bookmarked: illust.bookmarkData }', + :title='!store.isLoggedIn ? "收藏" : illust.bookmarkData ? "取消收藏" : "添加收藏"' + @click='illust?.bookmarkData ? handleRemoveBookmark() : handleAddBookmark()' + ) + IFasHeart(data-icon) + | {{ illust.bookmarkCount }} + + span.view-count(title='浏览') + IFasEye(data-icon) + | {{ illust.viewCount }} + span.count + IFasImages(data-icon) + | {{ pages.length }}张 + + p.create-date {{ new Date(illust.createDate).toLocaleString() }} + + .artwork-tags + span.original-tag(v-if='illust.isOriginal') + IFasLaughWink(data-icon) + | 原创 + span.restrict-tag.x-restrict( + title='R-18' + v-if='illust?.xRestrict' + ) R-18 + span.restrict-tag.ai-restrict( + :title='`AI生成 (${illust.aiType})`' + v-if='illust?.aiType === 2' + ) AI生成 + ArtTag( + :key='_', + :tag='item.tag' + v-for='(item, _) in illust.tags.tags' + ) + + .canonical-link + NButton( + :href='illust?.extraData?.meta?.canonical || "#"' + icon-placement='right' + rel='noopener noreferrer' + size='small' + tag='a' + target='_blank' + ) + template(#icon) + IFasArrowRight + | 前往 Pixiv 查看 + + aside.author-area(ref='authorRef') + Card(title='作者') + AuthorCard(:user='user') + + Card.comments(title='评论') + CommentsArea( + :count='illust.commentCount', + :id='illust.id || illust.illustId' + ) + + //- 相关推荐 + .recommend-works.body-inner(ref='recommendRef') + h2 相关推荐 + ArtworkList(:list='recommend', :loading='!recommend.length') + ShowMore( + :loading='recommendLoading', + :method='handleMoreRecommend', + :text='recommendLoading ? "加载中" : "加载更多"' + v-if='recommend.length && recommendNextIds.length' + ) + + //- Error + section.error(v-if='error') + ErrorPage(:description='error' title='出大问题') + + + + + diff --git a/src/view/discovery.vue b/src/view/discovery.vue new file mode 100644 index 0000000..d225b0e --- /dev/null +++ b/src/view/discovery.vue @@ -0,0 +1,212 @@ + +#discovery-view + //- Error + section(v-if='error') + .body-inner + h1 探索发现加载失败 + ErrorPage(:description='error' title='出大问题') + + //- Loading + section(v-if='loadingDiscovery && !discoveryList.length') + .body-inner + h1 探索发现加载中…… + .loading + Placeholder + + //- Result + section(v-if='!error') + .body-inner + h1 探索发现 + .align-center + NButton( + :loading='loadingDiscovery' + @click='refreshDiscovery' + round + secondary + size='large' + style='margin-bottom: 2rem' + ) + template(#default) {{ loadingDiscovery ? '加载中' : '换一批' }} + template(#icon): NIcon: IFasRandom + + NSpin(:show='loadingDiscovery && discoveryList.length') + ArtworkLargeList(:artwork-list='discoveryList' v-if='discoveryList.length') + + //- 无限滚动加载更多 + ShowMore( + :loading='loadingMore', + :method='loadMoreDiscovery', + :text='loadingMore ? "加载中..." : "加载更多"' + v-if='hasMore && discoveryList.length && !error' + ) + + .no-more(v-if='!loadingDiscovery && !loadingMore && !discoveryList.length && !error') + NCard(style='padding: 15vh 0'): NEmpty(description='暂无内容,请稍后再试') + + .no-more(v-if='!hasMore && discoveryList.length && !loadingMore') + NCard(style='padding: 2rem 0'): NEmpty(description='没有更多内容了') + + + + + \ No newline at end of file diff --git a/src/view/following-latest.vue b/src/view/following-latest.vue new file mode 100644 index 0000000..bb72d2c --- /dev/null +++ b/src/view/following-latest.vue @@ -0,0 +1,58 @@ + +#following-latest-view.body-inner + h1 已关注用户的作品 + ArtworkList(:list='illusts', :loading='isLoading && !illusts.length') + ShowMore( + :loading='isLoading', + :method='fetchList', + :text='isLoading ? "加载中" : "加载更多"' + v-if='hasNextPage && illusts.length' + ) + + + diff --git a/src/view/following.vue b/src/view/following.vue new file mode 100644 index 0000000..4452844 --- /dev/null +++ b/src/view/following.vue @@ -0,0 +1,168 @@ + +#about-view.body-inner + h1 + .flex.gap-1 + NButton( + @click='$router.push({ name: "users", params: { id: targetUserId } })' + circle + secondary + ) + template(#icon) + IChevronLeft + .first-heading {{ title }} + + NTabs( + :bar-width='32' + justify-content='space-evenly' + type='line' + v-model:value='tab' + ) + NTabPane(display-directive='show:lazy' name='public' tab='公开关注') + .user-list + Card( + title='' + v-for='_ in 8' + v-if='publicList.length === 0 && isLoadingPublic' + ) + FollowUserCard + Card(:key='user.userId' title='' v-for='user in publicList') + FollowUserCard(:user='user') + ShowMore( + :loading='isLoadingPublic', + :method='() => fetchList(false)', + :text='isLoadingPublic ? "加载中..." : "加载更多"' + v-if='hasMorePublic' + ) + NTabPane( + :disabled='!isSelfPage' + display-directive='show:lazy' + name='hidden' + tab='私密关注' + ) + .user-list + Card( + title='' + v-for='_ in 8' + v-if='hiddenList.length === 0 && isLoadingHidden' + ) + FollowUserCard + Card(:key='user.userId' title='' v-for='user in hiddenList') + FollowUserCard(:user='user') + ShowMore( + :loading='isLoadingHidden', + :method='() => fetchList(true)', + :text='isLoadingHidden ? "加载中..." : "加载更多"' + v-if='hasMoreHidden' + ) + + + + + diff --git a/src/view/index.vue b/src/view/index.vue new file mode 100644 index 0000000..feed422 --- /dev/null +++ b/src/view/index.vue @@ -0,0 +1,228 @@ + +#home-view + .top-slider.align-center( + :style='{ "background-image": `url(${randomBg.urls?.regular || randomBg.url || ""})` }' + ) + section.search-area.flex-1 + SearchBox.big.search + + .site-logo + img(:src='LogoH') + .description Now, everyone can enjoy Pixiv + + .bg-info + a.pointer(@click='async () => await setRandomBgNoCache()' title='换一个~') + IFasRandom + a.pointer( + @click='isShowBgInfo = true' + style='margin-left: 0.5em' + title='关于背景' + v-if='randomBg.id' + ) + IFasInfoCircle + + NModal( + :title='`背景图片:${randomBg.alt}`' + closable + preset='card' + v-model:show='isShowBgInfo' + ) + .bg-info-modal + .align-center + RouterLink.thumb(:to='"/artworks/" + randomBg.id') + img(:src='randomBg.urls?.regular || randomBg.url' lazyload) + .desc + .author + RouterLink(:to='"/users/" + randomBg.userId') {{ randomBg.userName }} + | 的作品 (ID: {{ randomBg.id }}) + NSpace(justify='center' size='small' style='margin-top: 1rem') + NTag( + :key='tag' + @click='$router.push({ name: "search", params: { keyword: tag, p: 1 } })' + style='cursor: pointer' + v-for='tag in randomBg.tags' + ) {{ tag }} + + .body-inner + section.discover + NH2 探索发现 + .align-center + NButton( + :loading='loadingDiscovery' + @click='discoveryList.length ? (async () => await setDiscoveryNoCache())() : void 0' + round + secondary + size='small' + ) + template(#default) {{ loadingDiscovery ? '加载中' : '换一批' }} + template(#icon): NIcon: IFasRandom + ArtworkList(:list='discoveryList', :loading='loadingDiscovery') + + + + + diff --git a/src/view/login.vue b/src/view/login.vue new file mode 100644 index 0000000..ad35d95 --- /dev/null +++ b/src/view/login.vue @@ -0,0 +1,158 @@ + +NForm#login-form.not-logged-in(v-if='!userStore.isLoggedIn') + RouterLink.button( + :to='$route.query.back.toString()' + v-if='$route.query.back' + ) + IFasAngleLeft + | 取消 + h1.title 设置 Pixiv 令牌 + NFormItem( + :feedback='sessionIdInput && !validateSessionId(sessionIdInput) ? "哎呀,这个格式看上去不太对……" : error ? error : "这个格式看上去没问题,点击保存试试"', + :validation-status='(sessionIdInput && !validateSessionId(sessionIdInput)) || error ? "error" : "success"' + label='PHPSESSID' + required + ) + NInput( + :class='validateSessionId(sessionIdInput) ? "valid" : "invalid"' + v-model:value='sessionIdInput' + ) + #submit + NButton( + :disabled='!!error || loading || !validateSessionId(sessionIdInput)' + @click='async () => await submit()' + block + type='primary' + ) {{ loading ? '登录中……' : '保存令牌' }} + .tips + h2 如何获取 Pixiv 令牌? + p 访问 www.pixiv.net 源站并登录,打开浏览器控制台(f12),点击“存储(storage)”一栏,在 cookie 列表里找到“键(key)”为PHPSESSID的一栏,将它的“值(value)”复制后填写到这里。 + p + | 它应该形如: + code(@click='exampleSessionId' title='此处的令牌为随机生成,仅供演示使用') {{ example }} + | 。 + h2 PixivNow 会窃取我的个人信息吗? + p 我们不会存储或转让您的个人信息以及 cookie。 + p 不过我们建议妥善保存您的 cookie。您在此处保存的信息若被他人获取有被盗号的风险。 + +#login-form.logged-in(v-if='userStore.isLoggedIn') + RouterLink.button( + :to='$route.query.back.toString()' + v-if='$route.query.back' + ) + IFasAngleLeft + | 返回 + h1 查看 Pixiv 令牌 + NInput.token(:value='Cookies.get("PHPSESSID")' readonly) + #submit + NButton(@click='remove' type='error') 移除令牌 + + + + + diff --git a/src/view/notifications/2024-04-26.vue b/src/view/notifications/2024-04-26.vue new file mode 100644 index 0000000..a09478b --- /dev/null +++ b/src/view/notifications/2024-04-26.vue @@ -0,0 +1,39 @@ + +#notification-view.body-inner + h1.align-center 关于网站新建立的通知(2024年4月26日) + Card + p 各位,早上好中午好晚上好: + p 欢迎来到我们新建立的 PixivNow 网站!本站由 pixivperoe 创建和维护,致力于为大家提供更好的 Pixiv 浏览体验。 + p 请注意:本网站内容仅供个人学习和研究使用,严禁传播。我们尊重原创作者的版权,请大家合理使用本站服务。 + p 如果您在使用过程中遇到任何问题,欢迎通过下方联系方式与我们取得联系。 + p 感谢您对我们网站的支持和理解! + + div(style='text-align: right') + strong pixivperoe + br + time 2024年4月26日 + + Card(title='赞助我们') + .align-center + iframe( + frameborder='0' + height='200' + scrolling='no' + src='https://afdian.com/leaflet?slug=peroe' + width='640' + ) + + Card(title='联系我们') + ul + li QQ群:858701548 + + + + + diff --git a/src/view/ranking.vue b/src/view/ranking.vue new file mode 100644 index 0000000..1754c4d --- /dev/null +++ b/src/view/ranking.vue @@ -0,0 +1,99 @@ + +#ranking-view + //- Error + section(v-if='error') + .body-inner + h1 排行榜加载失败 + ErrorPage(:description='error' title='出大问题') + + //- Loading + section(v-if='loading') + .body-inner + h1 排行榜加载中…… + .loading + Placeholder + + //- Result + section(v-if='list') + .body-inner + h1 {{ list.date.toLocaleDateString('zh', { dateStyle: 'long' }) }}排行榜 + ArtworkLargeList(:rank-list='list.contents') + + + + + diff --git a/src/view/search.vue b/src/view/search.vue new file mode 100644 index 0000000..e27b831 --- /dev/null +++ b/src/view/search.vue @@ -0,0 +1,131 @@ + +#search-view + .body-inner + SearchBox.big + + //- Error + section(v-if='error && !loading') + ErrorPage(:description='error' title='出大问题') + + //- Result + section(v-if='!error') + + //- Loading + .loading-area(v-if='loading && !resultList.length') + ArtworkList(:list='[]', :loading='16') + + .no-more(v-if='!loading && !resultList.length') + NCard(style='padding: 15vh 0'): NEmpty(description='没有了,一滴都没有了……') + + NSpin.result-area(:show='loading' v-if='resultList.length') + .pagenator + NPagination(v-model:page='page' :item-count='total' :page-size='resultList.length') + ArtworkLargeList(:artwork-list='resultList') + .pagenator + NPagination(v-model:page='page' :item-count='total' :page-size='resultList.length') + + + + + diff --git a/src/view/siteCache.ts b/src/view/siteCache.ts new file mode 100644 index 0000000..af7fdae --- /dev/null +++ b/src/view/siteCache.ts @@ -0,0 +1,10 @@ +const _siteCacheData = new Map() +export function setCache(key: string | number, val: any) { + console.log('setCache', key, val) + _siteCacheData.set(key, val) +} +export function getCache(key: string | number) { + const val = _siteCacheData.get(key) + console.log('getCache', key, val) + return val +} diff --git a/src/view/users.vue b/src/view/users.vue new file mode 100644 index 0000000..69f082a --- /dev/null +++ b/src/view/users.vue @@ -0,0 +1,518 @@ + +#user-view + //- Loading + section.loading(v-if='loadingUser') + .bg-area.no-background + .bg-container(style='background-color: #efefef') + .user-info + .info-area + .avatar-area + NSkeleton(circle height='6rem' width='6rem') + .username-header.flex + h1.username: NSkeleton(text width='8em') + .desc(v-for='_ in 5') + NSkeleton(circle height='1em' text width='1em') + NSkeleton( + :width='`${Math.max(4, 12 * Math.random())}em`' + style='margin-left: 0.5em' + text + ) + #user-artworks.body-inner + ArtworkList(:list='[]', :loading='20') + + //- Error + section.error(v-else-if='error') + ErrorPage(:description='error' title='出大问题') + + //- :) + section.user(v-else-if='user') + .user-info + .bg-area(:class='{ "no-background": !user?.background }') + .bg-container( + :style='{ backgroundImage: user?.background?.url ? `url("${user.background.url}")` : undefined }' + ) + span(v-if='!user?.background') 用户未设置封面~ + .info-area + .avatar-area + a.plain.pointer(@click='showUserMore = true') + img(:src='user.imageBig') + .username-header.flex + h1.username {{ user.name }} + .flex-1 + .user-folow(v-if='!isSelfUserPage') + NButton( + :loading='loadingUserFollow', + :type='user.isFollowed ? "success" : undefined' + @click='handleUserFollow' + round + size='small' + ) + template(#icon) + IFasCheck(v-if='user.isFollowed') + IFasPlus(v-else) + | {{ user.isFollowed ? '已关注' : '关注' }} + .user-folow(v-else) + NButton(round size='small' type='info') + | 我真棒 + .following + RouterLink(:to='{ name: "following", params: { id: user.userId } }') 关注了 {{ user.following }} 人 + .gender(v-if='user.gender?.name') + IFasVenusMars(data-icon) + | {{ user.gender.name }} + .birthday(v-if='user.birthDay?.name') + IFasBirthdayCake(data-icon) + | {{ user.birthDay?.name }} + .region(v-if='user.region?.name') + IFasMapMarkerAlt(data-icon) + | {{ user.region?.name }} + .webpage(v-if='user.webpage') + IFasHome(data-icon) + a(:href='user.webpage' rel='noopener noreferrer' target='_blank') {{ user.webpage }} + .flex + .comment.flex-1 {{ user.comment }} + .user-more + a(@click='userMore' href='javascript:;') 查看更多 + + NModal(closable preset='card' title='用户资料' v-model:show='showUserMore') + .info-modal + .top + h3 + a.avatar(:href='user.imageBig' target='_blank' title='查看头像') + img(:src='user.imageBig') + .premium-icon(title='该用户订阅了高级会员' v-if='user.premium') + IFasParking(data-icon) + .title {{ user.name }} + .bottom + section.user-comment + h4 个人简介 + .comment.pre {{ user.comment || '-' }} + section.user-workspace(v-if='user.workspace') + hr + h4 工作环境 + NImage( + :preview-src='user.workspace.wsBigUrl', + :src='user.workspace.wsUrl' + lazy + v-if='user.workspace.wsUrl' + ) + NTable + tbody + tr(v-for='(val, key) in user.workspace') + th {{ workspaceNameMap[key] || key }} + td {{ val }} + section.dev-only + hr + h4 Debug Info + details + pre(style='overflow: auto; background: #efefef; padding: 4px') {{ JSON.stringify(user, null, 2) }} + + #user-artworks + NTabs( + :bar-width='32' + justify-content='space-evenly' + type='line' + v-model:value='tab' + ) + NTabPane(display-directive='show:lazy' :name='UserTabs.illusts' tab='插画') + NEmpty( + description='用户没有插画作品 (。•́︿•̀。)' + v-if='user.illusts && !user.illusts.length' + ) + .user-illust.body-inner(v-else) + ArtworksByUser(:user-id='user.userId' work-category='illust') + NTabPane(display-directive='show:lazy' :name='UserTabs.mangas' tab='漫画') + NEmpty(description='用户没有漫画作品 (*/ω\*)' v-if='!user.manga?.length') + .user-manga.body-inner(v-else) + ArtworksByUser(:user-id='user.userId' work-category='manga') + NTabPane(:name='UserTabs.public_bookmarks' tab='公开收藏') + ArtworkList( + :list='[]', + :loading='8' + v-if='!publicBookmarks?.length && loadingPublicBookmarks' + ) + NEmpty( + :description='isSelfUserPage ? `收藏夹是空的 Σ(⊙▽⊙"a` : `${user.name}没有公开的收藏 ${"(❁´◡`❁)"}`' + v-else-if='!publicBookmarks?.length' + ) + .user-bookmarks.body-inner(v-else) + ArtworkList(:list='publicBookmarks') + .more-btn.align-center( + v-if='publicBookmarks.length && hasMorePublicBookmarks' + ) + ShowMore( + :loading='loadingPublicBookmarks', + :method='() => getBookmarks(false)', + :text='loadingPublicBookmarks ? "正在加载" : "加载更多"' + ) + NTabPane(:name='UserTabs.hidden_bookmarks' tab='秘密收藏' v-if='isSelfUserPage') + ArtworkList( + :list='[]', + :loading='8' + v-if='!hiddenBookmarks?.length && loadingHiddenBookmarks' + ) + NEmpty( + description='没有隐藏的小秘密 இ௰இ' + v-else-if='!hiddenBookmarks?.length' + ) + .user-bookmarks.body-inner(v-else) + ArtworkList(:list='hiddenBookmarks') + .more-btn.align-center( + v-if='hiddenBookmarks.length && hasMoreHiddenBookmarks' + ) + ShowMore( + :loading='loadingHiddenBookmarks', + :method='() => getBookmarks(true)', + :text='loadingHiddenBookmarks ? "正在加载" : "加载更多"' + ) + + + + + diff --git a/test/illustRecommend.json b/test/illustRecommend.json new file mode 100644 index 0000000..7ee12cb --- /dev/null +++ b/test/illustRecommend.json @@ -0,0 +1,1799 @@ +{ + "illusts": [ + { + "isAdContainer": true + }, + { + "id": "90222722", + "title": "Sada Mita!", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "/-/c/360x360_70/custom-thumb/img/2021/05/31/13/43/49/90222722_p0_custom1200.jpg", + "description": "", + "tags": [ + "ロリ", + "原神", + "genshinimpact", + "七七", + "qiqi", + "七七(原神)", + "足裏", + "女の子", + "空七", + "原神1000users入り" + ], + "userId": "51238383", + "userName": "Luxuriou S", + "width": 2480, + "height": 2200, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ロリ Sada Mita! - Luxuriou S的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-31T13:43:49+09:00", + "updateDate": "2021-05-31T13:43:49+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2020/06/21/22/45/18/18864399_aed5908e8db5d0cc4ec161329ef77619_50.png", + "type": "illust" + }, + { + "id": "91111312", + "title": "ニャー桃", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "/-/c/360x360_70/custom-thumb/img/2021/07/09/01/49/51/91111312_p0_custom1200.jpg", + "description": "", + "tags": [ + "原神", + "GenshinImpact", + "Genshin", + "胡桃", + "ニャー", + "猫娘", + "猫耳" + ], + "userId": "8584175", + "userName": "meow", + "width": 1861, + "height": 2632, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 ニャー桃 - meow的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-09T01:49:51+09:00", + "updateDate": "2021-07-09T01:49:51+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2021/05/28/20/25/29/20779289_88536011afc2bb6320dabe42cf5799f5_50.png", + "type": "illust" + }, + { + "id": "89864101", + "title": "小小米游姬", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "/-/c/360x360_70/img-master/img/2021/05/15/23/48/35/89864101_p0_square1200.jpg", + "description": "", + "tags": [ + "同人", + "萝莉", + "ロリ" + ], + "userId": "26892987", + "userName": "咸鱼翻身前", + "width": 2480, + "height": 3508, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#同人 小小米游姬 - 咸鱼翻身前的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-15T23:48:35+09:00", + "updateDate": "2021-05-15T23:48:35+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2020/05/18/23/57/02/18648985_19f98b37cc31ed02c3bcc526db9dd0cd_50.jpg", + "type": "illust" + }, + { + "id": "85142203", + "title": "クレーちゃん", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "/-/c/360x360_70/img-master/img/2020/10/21/02/46/01/85142203_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "クレー", + "R-18" + ], + "userId": "44168658", + "userName": "島でドンパチするメイ", + "width": 626, + "height": 884, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 クレーちゃん - 島でドンパチするメイ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-21T02:46:01+09:00", + "updateDate": "2020-10-21T02:46:01+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2020/10/10/13/41/14/19488028_ddde5a960b7ac5fbced14d127e95c8dc_50.jpg", + "type": "illust" + }, + { + "id": "88108178", + "title": "Hu Tao", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "/-/c/360x360_70/img-master/img/2021/02/28/13/07/35/88108178_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "胡桃", + "女の子", + "호두", + "hutao", + "Genshinimpact", + "胡桃(原神)", + "원신", + "めぐみん", + "megumin" + ], + "userId": "51238383", + "userName": "Luxuriou S", + "width": 741, + "height": 536, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 Hu Tao - Luxuriou S的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-02-28T13:07:35+09:00", + "updateDate": "2021-02-28T13:07:35+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2020/06/21/22/45/18/18864399_aed5908e8db5d0cc4ec161329ef77619_50.png", + "type": "illust" + } + ], + "nextIds": [ + "82981851", + "91001811", + "88188740", + "90402540", + "90021234", + "85562211", + "80811450", + "87926480", + "89700388", + "89933927", + "87608108", + "85619181", + "88509529", + "89471128", + "88344739", + "88619528", + "90882894", + "69908580", + "90044315", + "89468233", + "88431341", + "89438214", + "89691599", + "89604516", + "85696833", + "88462787", + "86049937", + "89729068", + "86174898", + "90670443", + "89698146", + "88774011", + "90495846", + "89439640", + "85599270", + "85539133", + "89253041", + "90405138", + "87964863", + "89419176", + "87436008", + "90486350", + "89402572", + "88337935", + "84683631", + "90465998", + "90391398", + "90183841", + "90376356", + "85151730", + "89458738", + "90498724", + "89765412", + "90217294", + "86112716", + "85074438", + "89780027", + "85130128", + "89503621", + "89466318", + "88373034", + "89873780", + "84821914", + "89195370", + "89361322", + "89129455", + "89540900", + "89428926", + "88645784", + "89672080", + "89270362", + "87821825", + "89887325", + "89741655", + "86162769", + "89758295", + "89750477", + "84905571", + "89196238", + "89584212", + "84906603", + "89749357", + "87167442", + "89715511", + "87350945", + "89386879", + "89340592", + "88211722", + "89419983", + "89583903", + "90023613", + "86825708", + "89220489", + "89276542", + "90159808", + "89279132", + "89656495", + "85556449", + "89580092", + "89802512", + "88284030", + "89634751", + "89776356", + "87698055", + "89389661", + "89372167", + "90151062", + "85226123", + "85217467", + "86262593", + "89929855", + "87012463", + "85852592", + "89368989", + "85979718", + "85211432", + "90069358", + "89397725", + "87159813", + "88213175", + "88648317", + "86181738", + "85885378", + "86022368", + "88293439", + "84949988", + "85193172", + "91094336" + ], + "details": { + "69908580": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.03448275849223137, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "80811450": { + "methods": [ + "illust_by_illust_table_manga_recommendation_original", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "82981851": { + "methods": [ + "illust_by_illust_table_manga_recommendation_original" + ], + "score": 0.04961258918046951, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "84683631": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.01149425283074379, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "84821914": { + "methods": [ + "similar_illust" + ], + "score": 827.875244140625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "84905571": { + "methods": [ + "similar_illust" + ], + "score": 880.9090576171875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "84906603": { + "methods": [ + "similar_illust" + ], + "score": 887.1856689453125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "84949988": { + "methods": [ + "similar_illust" + ], + "score": 969.4739990234375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85074438": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c" + ], + "score": 0.218547061085701, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85130128": { + "methods": [ + "similar_illust" + ], + "score": 788.7730102539062, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85142203": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.3333333432674408, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85151730": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.008474576286971569, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85193172": { + "methods": [ + "similar_illust" + ], + "score": 971.5712280273438, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85211432": { + "methods": [ + "similar_illust" + ], + "score": 902.3040771484375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85217467": { + "methods": [ + "similar_illust" + ], + "score": 822.1856689453125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85226123": { + "methods": [ + "similar_illust" + ], + "score": 809.277587890625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85539133": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.014084506779909134, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85556449": { + "methods": [ + "similar_illust" + ], + "score": 967.9400634765625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85562211": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.07692307978868484, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85599270": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.01587301678955555, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85619181": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.05000000074505806, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85696833": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c" + ], + "score": 0.21501126885414124, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85852592": { + "methods": [ + "similar_illust" + ], + "score": 866.1652221679688, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85885378": { + "methods": [ + "similar_illust" + ], + "score": 949.583984375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85979718": { + "methods": [ + "similar_illust" + ], + "score": 884.6273193359375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "86022368": { + "methods": [ + "similar_illust" + ], + "score": 966.340087890625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "86049937": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.021739130839705467, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "86112716": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c" + ], + "score": 0.22969795763492584, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "86162769": { + "methods": [ + "similar_illust" + ], + "score": 869.3804321289062, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "86174898": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.020408162847161293, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "86181738": { + "methods": [ + "similar_illust" + ], + "score": 941.8705444335938, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "86262593": { + "methods": [ + "similar_illust" + ], + "score": 837.628173828125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "86825708": { + "methods": [ + "similar_illust" + ], + "score": 955.2465209960938, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "87012463": { + "methods": [ + "similar_illust" + ], + "score": 855.48681640625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "87159813": { + "methods": [ + "similar_illust" + ], + "score": 924.9519653320312, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "87167442": { + "methods": [ + "similar_illust" + ], + "score": 890.41650390625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "87350945": { + "methods": [ + "similar_illust" + ], + "score": 894.514892578125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "87436008": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.012048192322254181, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "87608108": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.05882352963089943, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "87698055": { + "methods": [ + "similar_illust" + ], + "score": 786.9461669921875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "87821825": { + "methods": [ + "similar_illust" + ], + "score": 865.9222412109375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "87926480": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.0714285746216774, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "87964863": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88108178": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.20000000298023224, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88188740": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.125, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88211722": { + "methods": [ + "similar_illust" + ], + "score": 926.828125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88213175": { + "methods": [ + "similar_illust" + ], + "score": 926.828125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88284030": { + "methods": [ + "similar_illust" + ], + "score": 751.4913330078125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88293439": { + "methods": [ + "similar_illust" + ], + "score": 967.3370361328125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88337935": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.011627906933426857, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88344739": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.03999999910593033, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88373034": { + "methods": [ + "similar_illust" + ], + "score": 827.1292724609375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88431341": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.029411764815449715, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88462787": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.02380952425301075, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88509529": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88619528": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88645784": { + "methods": [ + "similar_illust" + ], + "score": 862.1170043945312, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88648317": { + "methods": [ + "similar_illust" + ], + "score": 926.828125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88774011": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.017241379246115685, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89129455": { + "methods": [ + "similar_illust" + ], + "score": 859.9510498046875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89195370": { + "methods": [ + "similar_illust" + ], + "score": 852.62109375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89196238": { + "methods": [ + "similar_illust" + ], + "score": 921.5467529296875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89220489": { + "methods": [ + "similar_illust" + ], + "score": 978.796142578125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89253041": { + "methods": [ + "similar_illust" + ], + "score": 931.2987060546875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89270362": { + "methods": [ + "similar_illust" + ], + "score": 893.451904296875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89276542": { + "methods": [ + "similar_illust" + ], + "score": 775.8428955078125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89279132": { + "methods": [ + "similar_illust" + ], + "score": 787.9986572265625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89340592": { + "methods": [ + "similar_illust" + ], + "score": 947.899658203125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89361322": { + "methods": [ + "similar_illust" + ], + "score": 860.4429321289062, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89368989": { + "methods": [ + "similar_illust" + ], + "score": 882.6597290039062, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89372167": { + "methods": [ + "similar_illust" + ], + "score": 978.0029907226562, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89386879": { + "methods": [ + "similar_illust" + ], + "score": 934.7672119140625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89389661": { + "methods": [ + "similar_illust" + ], + "score": 976.97705078125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89397725": { + "methods": [ + "similar_illust" + ], + "score": 914.841796875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89402572": { + "methods": [ + "similar_illust" + ], + "score": 974.0825805664062, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89419176": { + "methods": [ + "similar_illust" + ], + "score": 969.0189819335938, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89419983": { + "methods": [ + "similar_illust" + ], + "score": 960.3139038085938, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89428926": { + "methods": [ + "similar_illust" + ], + "score": 883.1651611328125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89438214": { + "methods": [ + "illust_by_illust_table_incremental_mf_go" + ], + "score": 0.5187750458717346, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89439640": { + "methods": [ + "similar_illust" + ], + "score": 923.7874145507812, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89458738": { + "methods": [ + "illust_by_illust_table_incremental_mf_go" + ], + "score": 0.6225411891937256, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89466318": { + "methods": [ + "similar_illust" + ], + "score": 841.0235595703125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89468233": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.03030303120613098, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89471128": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.043478261679410934, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89503621": { + "methods": [ + "similar_illust" + ], + "score": 820.26416015625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89540900": { + "methods": [ + "similar_illust" + ], + "score": 879.1253662109375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89580092": { + "methods": [ + "similar_illust" + ], + "score": 885.7822265625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89583903": { + "methods": [ + "similar_illust" + ], + "score": 960.5686645507812, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89584212": { + "methods": [ + "similar_illust" + ], + "score": 922.0889282226562, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89604516": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89634751": { + "methods": [ + "similar_illust" + ], + "score": 974.02490234375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89656495": { + "methods": [ + "similar_illust" + ], + "score": 0, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89672080": { + "methods": [ + "similar_illust" + ], + "score": 888.6375732421875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89691599": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89698146": { + "methods": [ + "similar_illust" + ], + "score": 849.0047607421875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89700388": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.06666667014360428, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89715511": { + "methods": [ + "similar_illust" + ], + "score": 930.5669555664062, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89729068": { + "methods": [ + "similar_illust" + ], + "score": 795.6148681640625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89741655": { + "methods": [ + "similar_illust" + ], + "score": 901.8181762695312, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89749357": { + "methods": [ + "similar_illust" + ], + "score": 927.851318359375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89750477": { + "methods": [ + "similar_illust" + ], + "score": 909.9531860351562, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89758295": { + "methods": [ + "similar_illust" + ], + "score": 903.92333984375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89765412": { + "methods": [ + "illust_by_illust_table_incremental_mf_go" + ], + "score": 0.5574560761451721, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89776356": { + "methods": [ + "similar_illust" + ], + "score": 976.7224731445312, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89780027": { + "methods": [ + "similar_illust" + ], + "score": 796.0253295898438, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89802512": { + "methods": [ + "similar_illust" + ], + "score": 961.6516723632812, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89864101": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.5, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89873780": { + "methods": [ + "similar_illust" + ], + "score": 842.2225341796875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89887325": { + "methods": [ + "similar_illust" + ], + "score": 896.7012329101562, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89929855": { + "methods": [ + "similar_illust" + ], + "score": 839.8473510742188, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89933927": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c", + "illust_by_illust_table_incremental_mf_go", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90021234": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90023613": { + "methods": [ + "similar_illust" + ], + "score": 952.7861938476562, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90044315": { + "methods": [ + "illust_by_illust_table_incremental_mf_go" + ], + "score": 0.5731908082962036, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90069358": { + "methods": [ + "similar_illust" + ], + "score": 910.192626953125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90151062": { + "methods": [ + "similar_illust" + ], + "score": 803.6258544921875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90159808": { + "methods": [ + "similar_illust" + ], + "score": 964.2593383789062, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90183841": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.009999999776482582, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90217294": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c" + ], + "score": 0.25171229243278503, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90222722": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c", + "illust_by_illust_table_incremental_mf_go", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90376356": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.009009009227156639, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90391398": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c", + "illust_by_illust_table_incremental_mf_go", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90402540": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90405138": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.013888888992369175, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90465998": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.011363636702299118, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90486350": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.011904762126505375, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90495846": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.01666666753590107, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90498724": { + "methods": [ + "illust_by_illust_table_incremental_mf_go" + ], + "score": 0.5890136957168579, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90670443": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.01886792480945587, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90882894": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.0357142873108387, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "91001811": { + "methods": [ + "similar_illust_fresh" + ], + "score": 874.2181396484375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "91094336": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.008620689623057842, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "91111312": { + "methods": [ + "similar_illust_fresh" + ], + "score": 857.9734497070312, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + } + } +} \ No newline at end of file diff --git a/test/userBookmarks.json b/test/userBookmarks.json new file mode 100644 index 0000000..5bddcad --- /dev/null +++ b/test/userBookmarks.json @@ -0,0 +1,321 @@ +{ + "works": [ + { + "id": "85596117", + "title": "Cocogoat!", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "/-/c/250x250_80_a2/img-master/img/2020/11/11/05/25/32/85596117_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "クレー", + "Klee", + "GenshinImpact", + "Qiqi", + "七七", + "ココナッツヒツジ" + ], + "userId": "13387921", + "userName": "Sketchien", + "width": 3071, + "height": 2536, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "11862002032", + "private": false + }, + "alt": "#原神 Cocogoat! - Sketchien的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-11T05:25:32+09:00", + "updateDate": "2020-11-11T05:25:32+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2020/12/29/08/12/30/19902583_8c1babd26c2490e878c9d1807dff5012_50.png" + }, + { + "id": "85349943", + "title": "森林冰火人", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "/-/c/250x250_80_a2/img-master/img/2020/10/31/11/55/22/85349943_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "七七(原神)", + "クレー(原神)", + "原神1000users入り" + ], + "userId": "30716447", + "userName": "ginklaga", + "width": 900, + "height": 1282, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "11568152040", + "private": false + }, + "alt": "#原神 森林冰火人 - ginklaga的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-31T11:55:22+09:00", + "updateDate": "2020-10-31T11:55:22+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2018/10/02/08/29/58/14846443_38890f901917803f5dd96f1f90e31b41_50.jpg" + }, + { + "id": "85540784", + "title": "七七和可莉", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "/-/c/250x250_80_a2/img-master/img/2020/11/08/17/03/33/85540784_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "可莉", + "七七", + "女孩子", + "哈哈", + "同人", + "赤と青" + ], + "userId": "18478848", + "userName": "鱼鹅BABA", + "width": 3508, + "height": 2480, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "10190905925", + "private": false + }, + "alt": "#原神 七七和可莉 - 鱼鹅BABA的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-08T17:03:33+09:00", + "updateDate": "2020-11-08T17:03:33+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2021/02/01/11/52/17/20109114_05696c9cb2dc2de939049915ff704e9a_50.jpg" + }, + { + "id": "86465064", + "title": "肉蛋冲鸡", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "/-/c/250x250_80_a2/custom-thumb/img/2020/12/23/00/13/25/86465064_p0_custom1200.jpg", + "description": "", + "tags": [ + "R-18", + "女の子", + "loli", + "原神", + "幼女", + "七七(原神)", + "七七" + ], + "userId": "7270720", + "userName": "提比爷爷", + "width": 2480, + "height": 3508, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "10190813445", + "private": false + }, + "alt": "#女の子 肉蛋冲鸡 - 提比爷爷的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-12-23T00:13:25+09:00", + "updateDate": "2020-12-23T00:13:25+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2017/12/10/00/50/09/13545222_e4be8a9c803ec0a57c2cd364bc5fd603_50.png" + }, + { + "id": "84378134", + "title": "原神の奇妙な冒険", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "/-/c/250x250_80_a2/img-master/img/2020/09/14/23/10/50/84378134_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "Genshin", + "迪卢克", + "琴", + "温迪", + "ジョジョ立ち", + "可莉", + "西風騎士団", + "だいたいあってる" + ], + "userId": "2046536", + "userName": "Grover.Y", + "width": 3292, + "height": 2059, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "10190785843", + "private": false + }, + "alt": "#原神 原神の奇妙な冒険 - Grover.Y的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-09-14T23:10:50+09:00", + "updateDate": "2020-09-14T23:10:50+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2018/06/09/04/14/10/14335625_52a126f7a4d0b28424aa61595a2fb2f5_50.png" + }, + { + "id": "85653642", + "title": "背くらべ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "/-/c/250x250_80_a2/img-master/img/2020/11/14/02/46/50/85653642_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "クレー(原神)", + "七七(原神)", + "ディオナ(原神)", + "背伸び", + "GenshinImpact", + "ブーツ", + "原神10000users入り" + ], + "userId": "29942", + "userName": "日下氏", + "width": 1382, + "height": 1500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "10190765784", + "private": false + }, + "alt": "#原神 背くらべ - 日下氏的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-14T02:46:50+09:00", + "updateDate": "2020-11-14T02:46:50+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2020/07/03/01/17/53/18924189_3cb75518e84612ae48bf43bfd9ec152d_50.png" + }, + { + "id": "71553807", + "title": "paff女神", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "/-/c/250x250_80_a2/img-master/img/2018/11/08/01/33/27/71553807_p0_square1200.jpg", + "description": "", + "tags": [ + "R-18", + "paff", + "cytus" + ], + "userId": "13046221", + "userName": "teslamax", + "width": 2732, + "height": 2048, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "5092259170", + "private": false + }, + "alt": "#paff paff女神 - teslamax的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-11-08T01:33:27+09:00", + "updateDate": "2018-11-08T01:33:27+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/~/common/images/no_profile_s.png" + } + ], + "total": 7, + "zoneConfig": { + "header": { + "url": "https://pixon.ads-pixiv.net/show?zone_id=header&format=js&s=1&up=1&a=20&ng=g&l=zh&uri=%2Fajax%2Fuser%2F_PARAM_%2Fillusts%2Fbookmarks&is_spa=1&K=467de35c853a8&ab_test_digits_first=75&uab=69&yuid=FjJkCJU&suid=Pgsctoaq1znlyhhh8&num=60ea5d9f936" + }, + "footer": { + "url": "https://pixon.ads-pixiv.net/show?zone_id=footer&format=js&s=1&up=1&a=20&ng=g&l=zh&uri=%2Fajax%2Fuser%2F_PARAM_%2Fillusts%2Fbookmarks&is_spa=1&K=467de35c853a8&ab_test_digits_first=75&uab=69&yuid=FjJkCJU&suid=Pgsctoaq2344lal1d&num=60ea5d9f657" + }, + "logo": { + "url": "https://pixon.ads-pixiv.net/show?zone_id=logo_side&format=js&s=1&up=1&a=20&ng=g&l=zh&uri=%2Fajax%2Fuser%2F_PARAM_%2Fillusts%2Fbookmarks&is_spa=1&K=467de35c853a8&ab_test_digits_first=75&uab=69&yuid=FjJkCJU&suid=Pgsctoaq24z4nikpv&num=60ea5d9f320" + }, + "500x500": { + "url": "https://pixon.ads-pixiv.net/show?zone_id=bigbanner&format=js&s=1&up=1&a=20&ng=g&l=zh&uri=%2Fajax%2Fuser%2F_PARAM_%2Fillusts%2Fbookmarks&is_spa=1&K=467de35c853a8&ab_test_digits_first=75&uab=69&yuid=FjJkCJU&suid=Pgsctoaq26tu57oyq&num=60ea5d9f378" + } + }, + "extraData": { + "meta": { + "title": "机智的小鱼君的收藏 - pixiv", + "description": "pixiv", + "canonical": "https://www.pixiv.net/users/32338232", + "ogp": { + "description": "Chinese college student.\r\nLove in web develop and Japanese ACGN culture.\r\nI sometimes drawing manga especially LOLI (LOL).", + "image": "/-/c/200x200/user-profile/img/2021/06/14/07/02/52/20871141_0084bf736ca61f648eda83aa522659d7_170.png", + "title": "机智的小鱼君的收藏", + "type": "article" + }, + "twitter": { + "description": "Chinese college student.\r\nLove in web develop and Japanese ACGN culture.\r\nI sometimes drawing manga especially LOLI (LOL).", + "image": "/-/c/200x200/user-profile/img/2021/06/14/07/02/52/20871141_0084bf736ca61f648eda83aa522659d7_170.png", + "title": "机智的小鱼君的收藏", + "card": "summary" + }, + "alternateLanguages": { + "ja": "https://www.pixiv.net/users/32338232", + "en": "https://www.pixiv.net/en/users/32338232" + }, + "descriptionHeader": "" + } + }, + "bookmarkTags": { + "5092259170": [], + "10190765784": [], + "10190785843": [], + "10190813445": [], + "10190905925": [], + "11568152040": [], + "11862002032": [] + } +} \ No newline at end of file diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..35e472c --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,25 @@ +{ + "include": ["src"], + "compilerOptions": { + "baseUrl": ".", + "target": "esnext", + "module": "esnext", + "moduleResolution": "bundler", + "strict": true, + "skipLibCheck": true, + "jsx": "preserve", + "sourceMap": true, + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "isolatedModules": true, + "importHelpers": true, + "paths": { + "@/*": ["src/*"] + }, + "types": ["unplugin-icons/types/vue"] + }, + "vueCompilerOptions": { + "plugins": ["@vue/language-plugin-pug"] + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..ea9d0cd --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..de603d5 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,15 @@ +{ + "include": ["api", "script", "*.config.*"], + "compilerOptions": { + "moduleResolution": "nodenext", + "module": "nodenext", + "types": ["node"], + "lib": ["ESNext"], + "strict": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "isolatedModules": true, + "importHelpers": true + } +} diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..b975f2c --- /dev/null +++ b/vercel.json @@ -0,0 +1,19 @@ +{ + "devCommand": "vite --port $PORT", + "framework": "vue", + "rewrites": [ + { + "source": "/:__PREFIX(~|-)/:__PATH(.+)", + "destination": "/api/image" + }, + { + "source": "/:__PREFIX(ajax|rpc|.+\\.php)/:__PATH*", + "destination": "/api/http" + }, + { + "source": "/api/illust/random", + "destination": "/api/random" + } + ], + "headers": [] +} \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..30e3952 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,50 @@ +import { fileURLToPath } from 'node:url' +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import AutoImport from 'unplugin-auto-import/vite' +import Icons from 'unplugin-icons/vite' +import IconResolver from 'unplugin-icons/resolver' +import Components from 'unplugin-vue-components/vite' +import { NaiveUiResolver } from 'unplugin-vue-components/resolvers' + +const PROD = process.env.NODE_ENV === 'production' + +export default defineConfig({ + plugins: [ + vue(), + AutoImport({ + dts: 'src/auto-imports.d.ts', + imports: [ + 'vue', + 'vue-router', + 'vue-i18n', + '@vueuse/core', + { axios: [['default', 'axios']] }, + ], + resolvers: [ + IconResolver({ + alias: { + fas: 'fa-solid', + }, + }), + ], + dirs: ['src/components/**', 'src/composables', 'src/utils', 'src/types'], + }), + Components({ dts: 'src/components.d.ts', resolvers: [NaiveUiResolver()] }), + Icons({ + scale: 1, + defaultClass: 'svg--inline', + }), + ], + build: {}, + esbuild: { + drop: PROD ? ['console'] : [], + }, + server: { host: true }, + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + }, + extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue', '.json'], + }, +})