From f4686544c4f47611d57acad96ba1a37b2d6412a9 Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Wed, 17 Feb 2021 19:50:15 -0500 Subject: [PATCH 01/28] Update js build dependencies --- frontEndSrc/package.json | 6 +- frontEndSrc/yarn.lock | 610 ++++++++++++++++++++------------------- 2 files changed, 317 insertions(+), 299 deletions(-) diff --git a/frontEndSrc/package.json b/frontEndSrc/package.json index aeec91f1..fcf8be53 100644 --- a/frontEndSrc/package.json +++ b/frontEndSrc/package.json @@ -9,11 +9,11 @@ "watch": "concurrently \"npm:watch:css\" \"npm:watch:js\" --kill-others" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "^0.25.2", + "@ampproject/rollup-plugin-closure-compiler": "^0.26.0", "concurrently": "^5.1.0", "cssnano": "^4.1.10", - "postcss": "^7.0.27", - "postcss-import": "^12.0.1", + "postcss": "^8.2.6", + "postcss-import": "^14.0.0", "postcss-preset-env": "^6.7.0", "rollup": "^2.4.0", "watch": "^1.0.2" diff --git a/frontEndSrc/yarn.lock b/frontEndSrc/yarn.lock index dd203485..2f55f177 100644 --- a/frontEndSrc/yarn.lock +++ b/frontEndSrc/yarn.lock @@ -10,18 +10,18 @@ "@jridgewell/resolve-uri" "1.0.0" sourcemap-codec "1.4.8" -"@ampproject/rollup-plugin-closure-compiler@^0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@ampproject/rollup-plugin-closure-compiler/-/rollup-plugin-closure-compiler-0.25.2.tgz#4d1704c73b22df45b34b021aeb1a049ab804abf6" - integrity sha512-ohOa/2JRQ4vVVbTO48XS2F4WZyL+sWEfjMFDPfdZTz57+EqVjf8RoWLfqfdkHtCGGpGvoHQZUWciHhep2aXkmQ== +"@ampproject/rollup-plugin-closure-compiler@^0.26.0": + version "0.26.0" + resolved "https://registry.yarnpkg.com/@ampproject/rollup-plugin-closure-compiler/-/rollup-plugin-closure-compiler-0.26.0.tgz#69f8265e5fdbf3e26905eaaedc60cb5982bd6be0" + integrity sha512-wuHzGE6BDhDR0L7nUPlpQDPGiGnMw+b0B+cDPG0S5TatOmFNQva8KSNdBHan3L9RbvNyYXOXicuCrZtSoBfrBg== dependencies: "@ampproject/remapping" "0.2.0" - acorn "7.1.1" + acorn "7.2.0" acorn-walk "7.1.1" estree-walker "2.0.1" - google-closure-compiler "20200406.0.0" + google-closure-compiler "20200517.0.0" magic-string "0.25.7" - uuid "7.0.3" + uuid "8.1.0" "@csstools/convert-colors@^1.4.0": version "1.4.0" @@ -34,19 +34,19 @@ integrity sha512-9oLAnygRMi8Q5QkYEU4XWK04B+nuoXoxjRvRxgjuChkLZFBja0YPSgdZ7dZtwhncLBcQe/I/E+fLuk5qxcYVJA== "@types/q@^1.5.1": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" - integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" + integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== acorn-walk@7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== -acorn@7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" - integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== +acorn@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.2.0.tgz#17ea7e40d7c8640ff54a694c889c26f31704effe" + integrity sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ== alphanum-sort@^1.0.0: version "1.0.2" @@ -73,17 +73,17 @@ argparse@^1.0.7: sprintf-js "~1.0.2" autoprefixer@^9.6.1: - version "9.7.6" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.6.tgz#63ac5bbc0ce7934e6997207d5bb00d68fa8293a4" - integrity sha512-F7cYpbN7uVVhACZTeeIeealwdGM6wMtfWARVLTy5xmKtgVdBNJvbDRoCK3YO1orcs7gv/KwYlb3iXwu9Ug9BkQ== + version "9.8.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" + integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== dependencies: - browserslist "^4.11.1" - caniuse-lite "^1.0.30001039" - chalk "^2.4.2" + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + colorette "^1.2.1" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.27" - postcss-value-parser "^4.0.3" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" balanced-match@^1.0.0: version "1.0.0" @@ -95,15 +95,24 @@ boolbase@^1.0.0, boolbase@~1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= -browserslist@^4.0.0, browserslist@^4.11.1, browserslist@^4.6.4: - version "4.12.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d" - integrity sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg== +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.6.4: + version "4.16.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" + integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== dependencies: - caniuse-lite "^1.0.30001043" - electron-to-chromium "^1.3.413" - node-releases "^1.1.53" - pkg-up "^2.0.0" + caniuse-lite "^1.0.30001181" + colorette "^1.2.1" + electron-to-chromium "^1.3.649" + escalade "^3.1.1" + node-releases "^1.1.70" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" caller-callsite@^2.0.0: version "2.0.0" @@ -139,10 +148,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001039, caniuse-lite@^1.0.30001043: - version "1.0.30001046" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001046.tgz#7a06d3e8fd8aa7f4d21c9a2e313f35f2d06b013e" - integrity sha512-CsGjBRYWG6FvgbyGy+hBbaezpwiqIOLkxQPY4A4Ea49g1eNsnQuESB+n4QM0BKii1j80MyJ26Ir5ywTQkbRE4g== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001181: + version "1.0.30001187" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001187.tgz#5706942631f83baa5a0218b7dfa6ced29f845438" + integrity sha512-w7/EP1JRZ9552CyrThUnay2RkZ1DXxKe/Q2swTC4+LElLh9RRYrL1Z+27LlakB8kzY0fSmHw9mc7XYDUKAKWMA== chalk@2.x, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" @@ -212,26 +221,31 @@ color-name@^1.0.0: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.5.2: - version "1.5.3" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" - integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== +color-string@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.4.tgz#dd51cd25cfee953d138fe4002372cc3d0e504cb6" + integrity sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" color@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" - integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e" + integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ== dependencies: color-convert "^1.9.1" - color-string "^1.5.2" + color-string "^1.5.4" + +colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== concurrently@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-5.1.0.tgz#05523986ba7aaf4b58a49ddd658fab88fa783132" - integrity sha512-9ViZMu3OOCID3rBgU31mjBftro2chOop0G2u1olq1OuwRBVRw/GxHTg80TVJBUTJfoswMmEUeuOg1g1yu1X2dA== + version "5.3.0" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-5.3.0.tgz#7500de6410d043c912b2da27de3202cb489b1e7b" + integrity sha512-8MhqOB6PWlBfA2vJ8a0bSFKATOdWlHiQlk11IfmQBPaHVP8oP2gsh2MObE6UR3hqDHqvaIvLTyceNW6obVuFHQ== dependencies: chalk "^2.4.2" date-fns "^2.0.1" @@ -316,18 +330,18 @@ css-tree@1.0.0-alpha.37: mdn-data "2.0.4" source-map "^0.6.1" -css-tree@1.0.0-alpha.39: - version "1.0.0-alpha.39" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" - integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== +css-tree@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz#9ae393b5dafd7dae8a622475caec78d3d8fbd7b5" + integrity sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ== dependencies: - mdn-data "2.0.6" + mdn-data "2.0.14" source-map "^0.6.1" css-what@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1" - integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw== + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== cssdb@^4.4.0: version "4.4.0" @@ -413,23 +427,23 @@ cssnano@^4.1.10: postcss "^7.0.0" csso@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" - integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== dependencies: - css-tree "1.0.0-alpha.39" + css-tree "^1.1.2" date-fns@^2.0.1: - version "2.12.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.12.0.tgz#01754c8a2f3368fc1119cf4625c3dad8c1845ee6" - integrity sha512-qJgn99xxKnFgB1qL4jpxU7Q2t0LOn1p8KMIveef3UZD7kqjT3tpFNNdXJelEHhE+rUgffriXriw/sOSU+cS1Hw== + version "2.17.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.17.0.tgz#afa55daea539239db0a64e236ce716ef3d681ba1" + integrity sha512-ZEhqxUtEZeGgg9eHNSOAJ8O9xqSgiJdrL0lzSSfMF54x6KXWJiOH/xntSJ9YomJPrYH/p08t6gWjGWq1SDJlSA== decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -define-properties@^1.1.2, define-properties@^1.1.3: +define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== @@ -450,9 +464,9 @@ domelementtype@1: integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domelementtype@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" - integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" + integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== domutils@^1.7.0: version "1.7.0" @@ -463,16 +477,16 @@ domutils@^1.7.0: domelementtype "1" dot-prop@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" - integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: is-obj "^2.0.0" -electron-to-chromium@^1.3.413: - version "1.3.415" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.415.tgz#e50241c1e2553e46cfe956c9d95f9ab3fc9a9134" - integrity sha512-GbtYqKffx3sU8G0HxwXuJFfs58Q7+iwLa5rBwaULwET6jWW8IAQSrVnu7vEfiUIcMVfbYyFg7cw3zdm+EbBJmw== +electron-to-chromium@^1.3.649: + version "1.3.667" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.667.tgz#18ca4f243ec163c3e354e506ba22ef46d31d925e" + integrity sha512-Ot1pPtAVb5nd7jeVF651zmfLFilRVFomlDzwXmdlWe5jyzOGa6mVsQ06XnAurT7wWfg5VEIY+LopbAdD/bpo5w== emoji-regex@^7.0.1: version "7.0.3" @@ -480,9 +494,9 @@ emoji-regex@^7.0.1: integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" - integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== error-ex@^1.3.1: version "1.3.2" @@ -491,22 +505,42 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: - version "1.17.5" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" - integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== +es-abstract@^1.17.2: + version "1.17.7" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" + integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" + is-callable "^1.2.2" + is-regex "^1.1.1" + object-inspect "^1.8.0" object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-abstract@^1.18.0-next.1: + version "1.18.0-next.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz#088101a55f0541f595e7e057199e27ddc8f3a5c2" + integrity sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-negative-zero "^2.0.1" + is-regex "^1.1.1" + object-inspect "^1.9.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.3" + string.prototype.trimstart "^1.0.3" es-to-primitive@^1.2.1: version "1.2.1" @@ -517,6 +551,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -539,13 +578,6 @@ exec-sh@^0.2.0: dependencies: merge "^1.2.0" -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -558,10 +590,10 @@ flatten@^1.0.2: resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== -fsevents@~2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== +fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" @@ -573,53 +605,62 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -google-closure-compiler-java@^20200406.0.0: - version "20200406.0.0" - resolved "https://registry.yarnpkg.com/google-closure-compiler-java/-/google-closure-compiler-java-20200406.0.0.tgz#89c640b89a91e9a693ab8119e3839d3e79b158ab" - integrity sha512-07WM/06CgQ0T2ZtSitfl+jmpeXW+c+spZgEgekJxEauzZztruYSkkBAHK8bZQ0N0+ZGfIUyQFNhLu//vxb5EJg== +get-intrinsic@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" -google-closure-compiler-js@^20200406.0.0: - version "20200406.0.0" - resolved "https://registry.yarnpkg.com/google-closure-compiler-js/-/google-closure-compiler-js-20200406.0.0.tgz#e73f498b1ab56a0580c0f945463252f7562f6f98" - integrity sha512-4qsr9VwjpSfoGt84bRAwDAcUlyYodZ9iywVMQwWzCu+SziCNXLFhUWkfLqTXbOYRSwO94UadwERSBdoPZY/GrA== +google-closure-compiler-java@^20200517.0.0: + version "20200517.0.0" + resolved "https://registry.yarnpkg.com/google-closure-compiler-java/-/google-closure-compiler-java-20200517.0.0.tgz#778370c22273c9085f4cf959ce063f8f112c02ac" + integrity sha512-JVZBiyyXwcYi6Yc3lO6dF2hMLJA4OzPm4/mgsem/tF1vk2HsWTnL3GTaBsPB2ENVZp0hoqsd4KgpPiG9ssNWxw== -google-closure-compiler-linux@^20200406.0.0: - version "20200406.0.0" - resolved "https://registry.yarnpkg.com/google-closure-compiler-linux/-/google-closure-compiler-linux-20200406.0.0.tgz#af2d5e6041a8a8ac4a5f0ec5015d328e18b66121" - integrity sha512-5NiU/jAjeMVJ7xm1KBDttE863lF7ItEqxg5Z1Vg/QMabTZz6Rr5S0Qy4hP+wjMfBnmqcL10BjXKJP5/m+doSbA== +google-closure-compiler-js@^20200517.0.0: + version "20200517.0.0" + resolved "https://registry.yarnpkg.com/google-closure-compiler-js/-/google-closure-compiler-js-20200517.0.0.tgz#9cb0861f764073d1c4d3b7453b74073ccb1ecfb1" + integrity sha512-dz6dOUHx5nhdIqMRXacAYS8aJfLvw4IKxGg28Hq/zeeDPHlX3P3iBK20NgFDfT8zdushThymtMqChSy7C5eyfA== -google-closure-compiler-osx@^20200406.0.0: - version "20200406.0.0" - resolved "https://registry.yarnpkg.com/google-closure-compiler-osx/-/google-closure-compiler-osx-20200406.0.0.tgz#bcab837e654dd74828030eafb95acadc49d974c6" - integrity sha512-XSF1l7GANVHnp2w8AGhhGDL3gw+XV3RaJvA7GsOJUmplPHguwlNvcLMEnSit7AEDa0JYdaQ50dfATwIKm6k8BQ== +google-closure-compiler-linux@^20200517.0.0: + version "20200517.0.0" + resolved "https://registry.yarnpkg.com/google-closure-compiler-linux/-/google-closure-compiler-linux-20200517.0.0.tgz#2b9ecb634130060174aff5c52329a694ea4be68b" + integrity sha512-S5xPh6TtP+ESzZrmQLcDDqtZAsCVTbdI4VS98wQlN6IMZTd94nAnOCg9mrxQNAgop2t4sdsv/KuH0BGPUWEZ+w== -google-closure-compiler-windows@^20200406.0.0: - version "20200406.0.0" - resolved "https://registry.yarnpkg.com/google-closure-compiler-windows/-/google-closure-compiler-windows-20200406.0.0.tgz#ddb785df271026dd3a97da37710771480b6d2341" - integrity sha512-F7mSN06PrjWYrD9cTkCcNwJXyoYmcwAMrJGgFvmm04Nb7TDQRK6yVqXwrEkncGMuiymD+B1vsoCzUJ/GlQVf0Q== +google-closure-compiler-osx@^20200517.0.0: + version "20200517.0.0" + resolved "https://registry.yarnpkg.com/google-closure-compiler-osx/-/google-closure-compiler-osx-20200517.0.0.tgz#9394e9a2fd97e3729fc3bd2abcffff6aab2cfcaa" + integrity sha512-FWIcsKqLllLjdOBZd7azijVaObydgRd0obVNi63eUfC5MX6T4qxKumGCyor2UCNY6by2ESz+PlGqCFzFhZ6b2g== -google-closure-compiler@20200406.0.0: - version "20200406.0.0" - resolved "https://registry.yarnpkg.com/google-closure-compiler/-/google-closure-compiler-20200406.0.0.tgz#ae77582160fb286e161249f7e1c3806396beb251" - integrity sha512-CBfXKVeZASKrgWRDJoYKxbZ546Pphld1SP6mN/KXVW4LbtV1wvXauM9wq1X/Y0Cez4Qh8MlU8VHCtLtNZfq17A== +google-closure-compiler-windows@^20200517.0.0: + version "20200517.0.0" + resolved "https://registry.yarnpkg.com/google-closure-compiler-windows/-/google-closure-compiler-windows-20200517.0.0.tgz#c5cdde438c29458666a83358567b12072924ed6c" + integrity sha512-UXhjRGwS8deTkRla/riyVq3psscgMuw78lepEPtq5NgbumgJzY2+IQP9q+4MVOfJW58Rv0JUWKAFOnBBSZWcAQ== + +google-closure-compiler@20200517.0.0: + version "20200517.0.0" + resolved "https://registry.yarnpkg.com/google-closure-compiler/-/google-closure-compiler-20200517.0.0.tgz#6c47f99fc1be59bd4f9e23c5a8f2e66d64b54143" + integrity sha512-80W9zBS9Ajk1T5InWCfsoPohDmo5T1AAyw1rHh5+dgb/jPgwC65KhY+oJozTncf+/7tyQHJXozTARwhSlBUcMg== dependencies: chalk "2.x" - google-closure-compiler-java "^20200406.0.0" - google-closure-compiler-js "^20200406.0.0" + google-closure-compiler-java "^20200517.0.0" + google-closure-compiler-js "^20200517.0.0" minimist "1.x" vinyl "2.x" vinyl-sourcemaps-apply "^0.2.0" optionalDependencies: - google-closure-compiler-linux "^20200406.0.0" - google-closure-compiler-osx "^20200406.0.0" - google-closure-compiler-windows "^20200406.0.0" + google-closure-compiler-linux "^20200517.0.0" + google-closure-compiler-osx "^20200517.0.0" + google-closure-compiler-windows "^20200517.0.0" has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= -has-symbols@^1.0.0, has-symbols@^1.0.1: +has-symbols@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== @@ -689,10 +730,10 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== -is-callable@^1.1.4, is-callable@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" - integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== +is-callable@^1.1.4, is-callable@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== is-color-stop@^1.0.0: version "1.1.0" @@ -706,6 +747,13 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" +is-core-module@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + dependencies: + has "^1.0.3" + is-date-object@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" @@ -721,17 +769,23 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + is-obj@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-regex@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== +is-regex@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" + integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== dependencies: - has "^1.0.3" + call-bind "^1.0.2" + has-symbols "^1.0.1" is-resolvable@^1.0.0: version "1.1.0" @@ -758,9 +812,9 @@ isarray@~1.0.0: integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -770,14 +824,6 @@ json-parse-better-errors@^1.0.1: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -817,9 +863,9 @@ lodash.uniq@^4.5.0: integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= lodash@^4.17.15: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== magic-string@0.25.7: version "0.25.7" @@ -828,16 +874,16 @@ magic-string@0.25.7: dependencies: sourcemap-codec "^1.4.4" +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + mdn-data@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== -mdn-data@2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" - integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== - merge@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" @@ -855,10 +901,15 @@ mkdirp@~0.5.1: dependencies: minimist "^1.2.5" -node-releases@^1.1.53: - version "1.1.53" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.53.tgz#2d821bfa499ed7c5dffc5e2f28c88e78a08ee3f4" - integrity sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ== +nanoid@^3.1.20: + version "3.1.20" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== + +node-releases@^1.1.70: + version "1.1.70" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.70.tgz#66e0ed0273aa65666d7fe78febe7634875426a08" + integrity sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw== normalize-package-data@^2.3.2: version "2.5.0" @@ -892,51 +943,45 @@ num2fraction@^1.2.2: resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= -object-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== +object-inspect@^1.8.0, object-inspect@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== +object.assign@^4.1.1, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" object.getownpropertydescriptors@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + version "2.1.1" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz#0dfda8d108074d9c563e80490c883b6661091544" + integrity sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.18.0-next.1" object.values@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" + integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.18.0-next.1" has "^1.0.3" -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - p-limit@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -944,13 +989,6 @@ p-limit@^2.0.0: dependencies: p-try "^2.0.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -958,11 +996,6 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -996,13 +1029,6 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= -pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" - integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= - dependencies: - find-up "^2.1.0" - postcss-attribute-case-insensitive@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" @@ -1012,9 +1038,9 @@ postcss-attribute-case-insensitive@^4.0.1: postcss-selector-parser "^6.0.2" postcss-calc@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.2.tgz#504efcd008ca0273120568b0792b16cdcde8aac1" - integrity sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ== + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" + integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== dependencies: postcss "^7.0.27" postcss-selector-parser "^6.0.2" @@ -1171,9 +1197,9 @@ postcss-focus-within@^3.0.0: postcss "^7.0.2" postcss-font-variant@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc" - integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg== + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" + integrity sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== dependencies: postcss "^7.0.2" @@ -1192,13 +1218,12 @@ postcss-image-set-function@^3.0.1: postcss "^7.0.2" postcss-values-parser "^2.0.0" -postcss-import@^12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.1.tgz#cf8c7ab0b5ccab5649024536e565f841928b7153" - integrity sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw== +postcss-import@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.0.0.tgz#3ed1dadac5a16650bde3f4cdea6633b9c3c78296" + integrity sha512-gFDDzXhqr9ELmnLHgCC3TbGfA6Dm/YMb/UN8/f7Uuq4fL7VTk2vOIj6hwINEwbokEmp123bLD7a5m+E+KIetRg== dependencies: - postcss "^7.0.1" - postcss-value-parser "^3.2.3" + postcss-value-parser "^4.0.0" read-cache "^1.0.0" resolve "^1.1.7" @@ -1501,9 +1526,9 @@ postcss-selector-matches@^4.0.0: postcss "^7.0.2" postcss-selector-not@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0" - integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ== + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz#263016eef1cf219e0ade9a913780fc1f48204cbf" + integrity sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ== dependencies: balanced-match "^1.0.0" postcss "^7.0.2" @@ -1527,13 +1552,14 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: uniq "^1.0.1" postcss-selector-parser@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" - integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" + integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== dependencies: cssesc "^3.0.0" indexes-of "^1.0.1" uniq "^1.0.1" + util-deprecate "^1.0.2" postcss-svgo@^4.0.2: version "4.0.2" @@ -1554,15 +1580,15 @@ postcss-unique-selectors@^4.0.1: postcss "^7.0.0" uniqs "^2.0.0" -postcss-value-parser@^3.0.0, postcss-value-parser@^3.2.3: +postcss-value-parser@^3.0.0: version "3.3.1" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss-value-parser@^4.0.2, postcss-value-parser@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" - integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: version "2.0.1" @@ -1573,15 +1599,24 @@ postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: indexes-of "^1.0.1" uniq "^1.0.1" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.27" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" - integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" + integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== dependencies: chalk "^2.4.2" source-map "^0.6.1" supports-color "^6.1.0" +postcss@^8.2.6: + version "8.2.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.6.tgz#5d69a974543b45f87e464bc4c3e392a97d6be9fe" + integrity sha512-xpB8qYxgPuly166AGlpRjUdEYtmOWx2iCwGmrv4vqZL9YPVviDVPZPRXxnXr6xPZOdxQ9lp3ZBFCRgWJ7LE3Sg== + dependencies: + colorette "^1.2.1" + nanoid "^3.1.20" + source-map "^0.6.1" + process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -1627,9 +1662,9 @@ remove-trailing-separator@^1.0.1: integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= replace-ext@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" - integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= + version "1.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a" + integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw== require-directory@^2.1.1: version "2.1.1" @@ -1647,10 +1682,11 @@ resolve-from@^3.0.0: integrity sha1-six699nWiBvItuZTM17rywoYh0g= resolve@^1.1.7, resolve@^1.10.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== dependencies: + is-core-module "^2.2.0" path-parse "^1.0.6" rgb-regex@^1.0.1: @@ -1664,16 +1700,16 @@ rgba-regex@^1.0.0: integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= rollup@^2.4.0: - version "2.7.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.7.2.tgz#0f8ee6216d33e83c0750116312c2c92b94cc7f72" - integrity sha512-SdtTZVMMVSPe7SNv4exUyPXARe5v/p3TeeG3LRA5WabLPJt4Usi3wVrvVlyAUTG40JJmqS6zbIHt2vWTss2prw== + version "2.39.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.39.0.tgz#be4f98c9e421793a8fec82c854fb567c35e22ab6" + integrity sha512-+WR3bttcq7zE+BntH09UxaW3bQo3vItuYeLsyk4dL2tuwbeSKJuvwiawyhEnvRdRgrII0Uzk00FpctHO/zB1kw== optionalDependencies: - fsevents "~2.1.2" + fsevents "~2.3.1" rxjs@^6.5.2: - version "6.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" - integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== + version "6.6.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" + integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== dependencies: tslib "^1.9.0" @@ -1725,9 +1761,9 @@ spawn-command@^0.0.2-1: integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" @@ -1738,17 +1774,17 @@ spdx-exceptions@^2.1.0: integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + version "3.0.7" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" + integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== sprintf-js@~1.0.2: version "1.0.3" @@ -1769,39 +1805,21 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string.prototype.trimend@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== +string.prototype.trimend@^1.0.1, string.prototype.trimend@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" + integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.5" -string.prototype.trimleft@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" - integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== +string.prototype.trimstart@^1.0.1, string.prototype.trimstart@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" + integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimstart "^1.0.0" - -string.prototype.trimright@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" - integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimend "^1.0.0" - -string.prototype.trimstart@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" string_decoder@~1.1.1: version "1.1.1" @@ -1870,9 +1888,9 @@ tree-kill@^1.2.2: integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== tslib@^1.9.0: - version "1.11.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" - integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== uniq@^1.0.1: version "1.0.1" @@ -1889,7 +1907,7 @@ unquote@~1.1.1: resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= -util-deprecate@~1.0.1: +util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -1904,10 +1922,10 @@ util.promisify@~1.0.0: has-symbols "^1.0.1" object.getownpropertydescriptors "^2.1.0" -uuid@7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" - integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== +uuid@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.1.0.tgz#6f1536eb43249f473abc6bd58ff983da1ca30d8d" + integrity sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg== validate-npm-package-license@^3.0.1: version "3.0.4" @@ -1930,9 +1948,9 @@ vinyl-sourcemaps-apply@^0.2.0: source-map "^0.5.1" vinyl@2.x: - version "2.2.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" - integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== + version "2.2.1" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.1.tgz#23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974" + integrity sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw== dependencies: clone "^2.1.1" clone-buffer "^1.0.0" @@ -1964,9 +1982,9 @@ wrap-ansi@^5.1.0: strip-ansi "^5.0.0" y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + version "4.0.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" + integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== yargs-parser@^13.1.2: version "13.1.2" From c24124a6ca711fcf2644da8b7c86a17d573e2341 Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Wed, 17 Feb 2021 20:02:51 -0500 Subject: [PATCH 02/28] Use str_contains over strpos --- app/views/main-menu.php | 6 +++--- src/AnimeClient/API/APIRequestBuilder.php | 8 ++++---- src/AnimeClient/Controller.php | 7 +------ src/AnimeClient/Controller/Anime.php | 2 +- src/AnimeClient/Controller/Manga.php | 2 +- src/AnimeClient/Helper/Picture.php | 4 ++-- 6 files changed, 12 insertions(+), 17 deletions(-) diff --git a/app/views/main-menu.php b/app/views/main-menu.php index c6b45276..42d40d66 100644 --- a/app/views/main-menu.php +++ b/app/views/main-menu.php @@ -5,13 +5,13 @@ namespace Aviat\AnimeClient; $whose = $config->get('whose_list') . "'s "; $lastSegment = $urlGenerator->lastSegment(); $extraSegment = $lastSegment === 'list' ? '/list' : ''; -$hasAnime = stripos($GLOBALS['_SERVER']['REQUEST_URI'], 'anime') !== FALSE; -$hasManga = stripos($GLOBALS['_SERVER']['REQUEST_URI'], 'manga') !== FALSE; +$hasAnime = str_contains($GLOBALS['_SERVER']['REQUEST_URI'], 'anime'); +$hasManga = str_contains($GLOBALS['_SERVER']['REQUEST_URI'], 'manga'); ?> - `); - }); - - return results.join(''); + `; + }).join(''); } export function renderMangaSearchResults (data) { - const results = []; - - data.forEach(item => { + return data.map(item => { const titles = item.titles.join('
'); - - results.push(` + return ` - `); - }); - - return results.join(''); + `; + }).join(''); } \ No newline at end of file diff --git a/public/css/auto.min.css b/public/css/auto.min.css index af1e63c3..d6fb9d73 100644 --- a/public/css/auto.min.css +++ b/public/css/auto.min.css @@ -1 +1 @@ -:root{--default-font-list:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;--monospace-font-list:"Anonymous Pro","Fira Code",Menlo,Monaco,Consolas,"Courier New",monospace;--serif-font-list:Georgia,Times,"Times New Roman",serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;box-sizing:border-box;cursor:default;font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);line-height:1.4;overflow-y:scroll;-moz-text-size-adjust:100%;text-size-adjust:100%;scroll-behavior:smooth}audio:not([controls]){display:none}details{display:block}input[type=search]{-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}main{margin:0 auto;padding:0 1.6rem 1.6rem}main,pre,summary{display:block}pre{background:#efefef;color:#444;font-family:Anonymous Pro,Fira Code,Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--monospace-font-list);font-size:1.4em;font-size:1.4rem;margin:1.6rem 0;overflow:auto;padding:1.6rem;word-break:break-all;word-wrap:break-word}progress{display:inline-block}small{color:#777;font-size:75%}big{font-size:125%}template{display:none}textarea{border:.1rem solid #ccc;border-radius:0;display:block;margin-bottom:.8rem;overflow:auto;padding:.8rem;resize:vertical;vertical-align:middle}[hidden]{display:none}[unselectable]{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}*,:after,:before{box-sizing:inherit}*{font-size:inherit;line-height:inherit;margin:0;padding:0}:after,:before{text-decoration:inherit;vertical-align:inherit}a{-webkit-transition:.25s ease;color:#1271db;text-decoration:none;transition:.25s ease}audio,canvas,iframe,img,svg,video{vertical-align:middle}input,textarea{border:.1rem solid #ccc;color:inherit;font-family:inherit;font-style:inherit;font-weight:inherit;min-height:1.4em}code,kbd,pre,samp{font-family:Anonymous Pro,Fira Code,Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--monospace-font-list)}table{border-collapse:collapse;border-spacing:0;margin-bottom:1.6rem}::-moz-selection{background-color:#b3d4fc;text-shadow:none}::selection{background-color:#b3d4fc;text-shadow:none}button::-moz-focus-inner{border:0}body{color:#444;font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);font-size:1.6rem;font-style:normal;font-weight:400;padding:0}p{margin:0 0 1.6rem}h1,h2,h3,h4,h5,h6{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);margin:2rem 0 1.6rem}h1{border-bottom:.1rem solid rgba(0,0,0,.2);font-size:3.6em;font-size:3.6rem}h1,h2{font-style:normal;font-weight:500}h2{font-size:3em;font-size:3rem}h3{font-size:2.4em;font-size:2.4rem;font-style:normal;font-weight:500;margin:1.6rem 0 .4rem}h4{font-size:1.8em;font-size:1.8rem}h4,h5{font-style:normal;font-weight:600;margin:1.6rem 0 .4rem}h5{font-size:1.6em;font-size:1.6rem}h6{color:#777;font-size:1.4em;font-style:normal;font-weight:600;margin:1.6rem 0 .4rem}code,h6{font-size:1.4rem}code{background:#efefef;color:#444;font-family:Anonymous Pro,Fira Code,Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--monospace-font-list);word-break:break-all;word-wrap:break-word}a:focus,a:hover{text-decoration:none}dl{margin-bottom:1.6rem}dd{margin-left:4rem}ol,ul{margin-bottom:.8rem;padding-left:2rem}blockquote{border-left:.2rem solid #1271db;font-style:italic;margin:1.6rem 0;padding-left:1.6rem}blockquote,figcaption{font-family:Georgia,Times,Times New Roman,serif;font-family:var(--serif-font-list)}html{font-size:62.5%}article,aside,details,footer,header,main,section,summary{display:block;height:auto;margin:0 auto;width:100%}footer{clear:both;display:inline-block;float:left;max-width:100%;padding:1rem 0;text-align:center}footer,hr{border-top:.1rem solid rgba(0,0,0,.2)}hr{display:block;margin-bottom:1.6rem;width:100%}img{height:auto;vertical-align:baseline}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{border:.1rem solid #ccc;border-radius:0;display:inline-block;padding:.8rem;vertical-align:middle}input:not([type]){-webkit-appearance:none;background-clip:padding-box;background-color:#fff;border:.1rem solid #ccc;border-radius:0;color:#444;display:inline-block;padding:.8rem;text-align:left}input[type=color]{padding:.8rem 1.6rem}input:not([type]):focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,textarea:focus{border-color:#b3d4fc}input[type=checkbox],input[type=radio]{vertical-align:middle}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:.1rem thin solid #444}input:not([type])[disabled],input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled],textarea[disabled]{background-color:#efefef;color:#777;cursor:not-allowed}input[readonly],textarea[readonly]{background-color:#efefef;border-color:#ccc;color:#777}input:focus:invalid,textarea:focus:invalid{border-color:#e9322d;color:#b94a48}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#ff4136}select[multiple]{height:auto}label{line-height:2}fieldset{border:0;margin:0;padding:.8rem 0}legend{border-bottom:.1rem solid #ccc;color:#444;display:block;margin-bottom:.8rem;padding:.8rem 0;width:100%}button,input[type=submit]{-moz-user-select:none;-ms-user-select:none;-webkit-transition:.25s ease;-webkit-user-drag:none;-webkit-user-select:none;border:.2rem solid #444;border-radius:0;color:#444;cursor:pointer;display:inline-block;margin-bottom:.8rem;margin-right:.4rem;padding:.8rem 1.6rem;text-align:center;text-decoration:none;text-transform:uppercase;transition:.25s ease;user-select:none;vertical-align:baseline}button a,input[type=submit] a{color:#444}button::-moz-focus-inner,input[type=submit]::-moz-focus-inner{padding:0}button:hover,input[type=submit]:hover{background:#444;border-color:#444;color:#fff}button:hover a,input[type=submit]:hover a{color:#fff}button:active,input[type=submit]:active{background:#6a6a6a;border-color:#6a6a6a;color:#fff}button:active a,input[type=submit]:active a{color:#fff}button:disabled,input[type=submit]:disabled{box-shadow:none;cursor:not-allowed;opacity:.4}nav ul{list-style:none;margin:0;padding:0;text-align:center}nav ul li{display:inline}nav a{-webkit-transition:.25s ease;border-bottom:.2rem solid transparent;color:#444;padding:.8rem 1.6rem;text-decoration:none;transition:.25s ease}nav a:hover,nav li.selected a{border-color:rgba(0,0,0,.2)}nav a:active{border-color:rgba(0,0,0,.56)}caption{padding:.8rem 0}thead th{background:#efefef;color:#444}tr{background:#fff;margin-bottom:.8rem}td,th{border:.1rem solid #ccc;padding:.8rem 1.6rem;text-align:center;vertical-align:inherit}tfoot tr{background:none}tfoot td{color:#efefef;font-size:.8rem;font-style:italic;padding:1.6rem .4rem}@media screen{[hidden~=screen]{display:inherit}[hidden~=screen]:not(:active):not(:focus):not(:target){clip:rect(0)!important;position:absolute!important}}@media screen and max-width 40rem{article,aside,section{clear:both;display:block;max-width:100%}img{margin-right:1.6rem}}:root{--blue-link:#1271db;--link-shadow:1px 1px 1px #000;--white-link-shadow:1px 1px 1px #fff;--shadow:2px 2px 2px #000;--title-overlay:rgba(0,0,0,0.45);--title-overlay-fallback:#000;--text-color:#fff;--normal-padding:0.25em 0.125em;--link-hover-color:#7d12db;--edit-link-hover-color:#db7d12;--edit-link-color:#12db18;--radius:5px}.media[hidden],[hidden=hidden],template{display:none}body{margin:.5em}button{background:#fff;background:linear-gradient(#ddd,#eee,#fff,#eee,#ddd);border-radius:.5em;margin:0;text-transform:none}button,button:hover{border-color:#555;color:#555}button:hover{background:#bbb;background:linear-gradient(#cfcfcf,#dfdfdf,#efefef,#dfdfdf,#cfcfcf)}button:active{background:#ddd;background:linear-gradient(#ddd,#ddd)}.media:hover button{background:linear-gradient(#bbb,#ccc,#ddd,#ccc,#bbb)}.media:hover button:hover{background:linear-gradient(#afafaf,#bfbfbf,#cfcfcf,#bfbfbf,#afafaf)}table{box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin:0 auto}td{padding:1rem}thead td,thead th{padding:.5rem}input[type=number]{min-width:0;width:4.5em}input[type=checkbox],input[type=radio]{min-width:auto;vertical-align:inherit}input,textarea{min-width:30em;min-width:30rem}tbody>tr:nth-child(odd){background:#ddd}a:active,a:hover{color:#7d12db;color:var(--link-hover-color)}iframe{display:block;margin:0 auto;border:0}.bracketed{color:#12db18;color:var(--edit-link-color)}#main-nav a,.bracketed{text-shadow:1px 1px 1px #000;text-shadow:var(--link-shadow)}.bracketed:before{content:"[\00a0"}.bracketed:after{content:"\00a0]"}.bracketed:active,.bracketed:hover{color:#db7d12;color:var(--edit-link-hover-color)}.grow-1{flex-grow:1}.flex-wrap{flex-wrap:wrap}.flex-no-wrap{flex-wrap:nowrap}.flex-align-start{align-content:flex-start}.flex-align-end{align-items:flex-end}.flex-align-space-around{align-content:space-around}.flex-justify-start{justify-content:flex-start}.flex-justify-space-around{justify-content:space-around}.flex-center{justify-content:center}.flex-self-center{align-self:center}.flex-space-evenly{justify-content:space-evenly}.flex{display:inline-block;display:flex}.small-font{font-size:1.6rem}.justify{text-align:justify}.align-center{text-align:center!important}.align-left{text-align:left!important}.align-right{text-align:right!important}.valign-top{vertical-align:top}.no-border{border:none}.media-wrap{text-align:center;margin:0 auto;position:relative}.media-wrap-flex{display:inline-block;display:flex;flex-wrap:wrap;align-content:space-evenly;justify-content:space-between;position:relative}td .media-wrap-flex{justify-content:center}.danger{background-color:#ff4136;border-color:#924949;color:#924949}.danger:active,.danger:hover{background-color:#924949;border-color:#ff4136;color:#ff4136}td.danger,td.danger:active,td.danger:hover{background-color:transparent;color:#924949}.user-btn{background:transparent;border-color:#12db18;border-color:var(--edit-link-color);color:#12db18;color:var(--edit-link-color);text-shadow:1px 1px 1px #000;text-shadow:var(--link-shadow);padding:0 .5rem}.user-btn:active,.user-btn:hover{background:transparent;border-color:#db7d12;border-color:var(--edit-link-hover-color);color:#db7d12;color:var(--edit-link-hover-color)}.user-btn:active{background:#db7d12;background:var(--edit-link-hover-color);color:#fff}.full-width{width:100%}.full-height{max-height:none}.toph{margin-top:0}#main-nav{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);margin:2rem 0 1.6rem;border-bottom:.1rem solid rgba(0,0,0,.2);font-size:3.6em;font-size:3.6rem;font-style:normal;font-weight:500}.sorting,.sorting-asc,.sorting-desc{vertical-align:text-bottom}.sorting:before{content:" ↕\00a0"}.sorting-asc:before{content:" ↑\00a0"}.sorting-desc:before{content:" ↓\00a0"}.form thead th,.form thead tr{background:inherit;border:0}.form tr>td:nth-child(odd){text-align:right;min-width:25px;max-width:30%}.form tr>td:nth-child(2n){text-align:left}.invisible tbody>tr:nth-child(odd){background:inherit}.borderless,.borderless td,.borderless th,.borderless tr,.invisible td,.invisible th,.invisible tr{box-shadow:none;border:0}.message,.static-message{position:relative;margin:.5em auto;padding:.5em;width:95%}.message .close{width:1em;height:1em;position:absolute;right:.5em;top:.5em;text-align:center;vertical-align:middle;line-height:1em}.message:hover .close:after{content:"☒"}.message:hover{cursor:pointer}.message .icon{left:.5em;top:.5em;margin-right:1em}.message.error,.static-message.error{border:1px solid #924949;background:#f3e6e6}.message.error .icon:after{content:"✘"}.message.success,.static-message.success{border:1px solid #1f8454;background:#70dda9}.message.success .icon:after{content:"✔"}.message.info,.static-message.info{border:1px solid #bfbe3a;background:#ffc}.message.info .icon:after{content:"⚠"}.character,.media,.small-character{position:relative;vertical-align:top;display:inline-block;text-align:center;width:220px;height:312px;margin:.25em .125em;margin:var(--normal-padding);z-index:0;background:rgba(0,0,0,.15)}.details picture.cover,picture.cover{display:inline;display:initial;width:100%}.character>img,.media>img,.small-character>img{width:100%}.media .edit-buttons>button{margin:.5em auto}.media-metadata>div,.medium-metadata>div,.name,.row{text-shadow:2px 2px 2px #000;text-shadow:var(--shadow);color:#fff;color:var(--text-color);padding:.25em .125em;padding:var(--normal-padding);text-align:right;z-index:2}.age-rating,.media-type{text-align:left}.media>.media-metadata{position:absolute;bottom:0;right:0}.media>.medium-metadata{position:absolute;bottom:0;left:0}.media>.name{position:absolute;top:0}.media>.name a{display:inline-block;transition:none}.media .name a:before{content:"";display:block;height:312px;left:0;position:absolute;top:0;width:220px;z-index:-1}.media-list .media:hover .name a:before{background:rgba(0,0,0,.75)}.media>.name span.canonical{font-weight:700}.media>.name small{font-weight:400}.media:hover .name{background:rgba(0,0,0,.75)}.media-list .media>.name a:hover,.media-list .media>.name a:hover small{color:#1271db;color:var(--blue-link)}.media:hover>.edit-buttons[hidden],.media:hover>button[hidden]{transition:.25s ease;display:block}.media:hover{transition:.25s ease}.character>.name a,.character>.name a small,.media>.name a,.media>.name a small,.small-character>.name a,.small-character>.name a small{background:none;color:#fff;text-shadow:2px 2px 2px #000;text-shadow:var(--shadow)}.anime .name,.manga .name{background:#000;background:var(--title-overlay-fallback);background:rgba(0,0,0,.45);background:var(--title-overlay);text-align:center;width:100%;padding:.5em .25em}.anime .age-rating,.anime .airing-status,.anime .completion,.anime .delete,.anime .edit,.anime .media-type,.anime .user-rating{background:none;text-align:center}.anime .table,.manga .table{position:absolute;bottom:0;left:0;width:100%}.anime .row,.manga .row{width:100%;display:inline-block;display:flex;align-content:space-around;justify-content:space-around;text-align:center;padding:0 inherit}.anime .row>span,.manga .row>span{text-align:left;z-index:2}.anime .row>div,.manga .row>div{font-size:.8em;display:inline-block;display:flex-item;align-self:center;text-align:center;vertical-align:middle;z-index:2}.anime .media>button.plus-one{border-color:hsla(0,0%,100%,.65);position:absolute;top:138px;top:calc(50% - 21.2px);left:44px;left:calc(50% - 57.8px);z-index:50}.manga .row{padding:1px}.manga .media{height:310px;margin:.25em}.manga .media>.edit-buttons{position:absolute;top:86px;top:calc(50% - 21.2px);left:43.5px;left:calc(50% - 57.8px);z-index:40}.manga .media>.edit-buttons button{border-color:hsla(0,0%,100%,.65)}.media.search>.name{background-color:#555;background-color:rgba(0,0,0,.35);background-size:cover;background-size:contain;background-repeat:no-repeat}.media.search>.row{z-index:6}.big-check,.mal-check{display:none}.big-check:checked+label{transition:.25s ease;background:rgba(0,0,0,.75)}.big-check:checked+label:after{content:"✓";font-size:15em;font-size:15rem;text-align:center;color:#adff2f;position:absolute;top:147px;left:0;width:100%;z-index:5}#series-list article.media{position:relative}#series-list .name,#series-list .name label{position:absolute;display:block;top:0;left:0;height:100%;width:100%;vertical-align:middle;line-height:1.25em}#series-list .name small{color:#fff}.details{margin:1.5rem auto 0;padding:1rem;font-size:inherit}.fixed{max-width:115em;max-width:115rem;margin:0 auto}.details .cover{display:block}.details .flex>*{margin:1rem}.details .media-details td{padding:0 1.5rem}.details p{text-align:justify}.details .media-details td:nth-child(odd){width:1%;white-space:nowrap;text-align:right}.details .media-details td:nth-child(2n){text-align:left}.details a h1,.details a h2{margin-top:0}.character,.person,.small-character{width:225px;height:350px;vertical-align:middle;white-space:nowrap;position:relative}.person{width:225px;height:338px}.small-person{width:200px;height:300px}.character a{height:350px}.character:hover .name,.small-character:hover .name{background:rgba(0,0,0,.8)}.small-character a{display:inline-block;width:100%;height:100%}.character .name,.small-character .name{position:absolute;bottom:0;left:0;z-index:10}.character img,.character picture,.person img,.person picture,.small-character img,.small-character picture{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:5;max-height:350px;max-width:225px}.person img,.person picture{max-height:338px}.small-person img,.small-person picture{max-height:300px;max-width:200px}.min-table{min-width:0;margin-left:0}.max-table{min-width:100%;margin:0}aside.info{max-width:33%}.fixed aside{max-width:390px}aside img,aside picture{display:block;margin:0 auto}.small-character{width:160px;height:250px}.small-character img,.small-character picture{max-height:250px;max-width:160px}.user-page .media-wrap{text-align:left}.media a{display:inline-block;width:100%;height:100%}.streaming-logo{width:50px;height:50px;vertical-align:middle}.small-streaming-logo{width:25px;height:25px;vertical-align:middle}.cover-streaming-link{display:none}.media:hover .cover-streaming-link{display:block}.cover-streaming-link .streaming-logo{width:20px;height:20px;-webkit-filter:drop-shadow(0 -1px 4px #fff);filter:drop-shadow(0 -1px 4px #fff)}.history-img{width:110px;height:156px}.settings.form .content article{margin:1em;display:inline-block;width:auto}.responsive-iframe{margin-top:1em;overflow:hidden;padding-bottom:56.25%;position:relative;height:0}.responsive-iframe iframe{left:0;top:0;height:100%;width:100%;position:absolute}.cssload-loader{position:relative;left:calc(50% - 31px);width:62px;height:62px;border-radius:50%;perspective:780px}.cssload-inner{position:absolute;width:100%;height:100%;box-sizing:border-box;border-radius:50%}.cssload-inner.cssload-one{left:0;top:0;-webkit-animation:cssload-rotate-one 1.15s linear infinite;animation:cssload-rotate-one 1.15s linear infinite;border-bottom:3px solid #000}.cssload-inner.cssload-two{right:0;top:0;-webkit-animation:cssload-rotate-two 1.15s linear infinite;animation:cssload-rotate-two 1.15s linear infinite;border-right:3px solid #000}.cssload-inner.cssload-three{right:0;bottom:0;-webkit-animation:cssload-rotate-three 1.15s linear infinite;animation:cssload-rotate-three 1.15s linear infinite;border-top:3px solid #000}@-webkit-keyframes cssload-rotate-one{0%{transform:rotateX(35deg) rotateY(-45deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(-45deg) rotate(1turn)}}@keyframes cssload-rotate-one{0%{transform:rotateX(35deg) rotateY(-45deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(-45deg) rotate(1turn)}}@-webkit-keyframes cssload-rotate-two{0%{transform:rotateX(50deg) rotateY(10deg) rotate(0deg)}to{transform:rotateX(50deg) rotateY(10deg) rotate(1turn)}}@keyframes cssload-rotate-two{0%{transform:rotateX(50deg) rotateY(10deg) rotate(0deg)}to{transform:rotateX(50deg) rotateY(10deg) rotate(1turn)}}@-webkit-keyframes cssload-rotate-three{0%{transform:rotateX(35deg) rotateY(55deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(55deg) rotate(1turn)}}@keyframes cssload-rotate-three{0%{transform:rotateX(35deg) rotateY(55deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(55deg) rotate(1turn)}}#loading-shadow{background:rgba(0,0,0,.8);z-index:500}#loading-shadow,#loading-shadow .loading-wrapper{position:fixed;top:0;left:0;width:100%;height:100%}#loading-shadow .loading-wrapper{z-index:501;display:flex;align-items:center;justify-content:center}#loading-shadow .loading-content{position:relative;color:#fff}.loading-content .cssload-inner.cssload-one,.loading-content .cssload-inner.cssload-three,.loading-content .cssload-inner.cssload-two{border-color:#fff}.tabs{display:inline-block;display:flex;flex-wrap:wrap;background:#efefef;box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin-top:1.5em}.tabs>label{border:1px solid #e5e5e5;width:100%;padding:20px 30px;background:#e5e5e5;cursor:pointer;font-weight:700;font-size:18px;color:#7f7f7f;transition:background .1s,color .1s}.tabs>label:hover{background:#d8d8d8}.tabs>label:active{background:#ccc}.tabs>[type=radio]:focus+label{box-shadow:inset 0 0 0 3px #2aa1c0;z-index:1}.tabs>[type=radio]{position:absolute;opacity:0}.tabs>[type=radio]:checked+label{border-bottom:1px solid #fff;background:#fff;color:#000}.tabs>[type=radio]:checked+label+.content{display:block}.single-tab,.tabs .content,.tabs>[type=radio]:checked+label+.content{border:1px solid #e5e5e5;border-top:0;padding:15px;background:#fff;width:100%;margin:0 auto;overflow:auto}.single-tab,.tabs .content{display:none;max-height:950px}.single-tab{display:block;border:1px solid #e5e5e5;box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin-top:1.5em}.single-tab.full-height,.tabs .content.full-height{max-height:none}@media (min-width:800px){.tabs>label{width:auto}.tabs .content{order:99}}.vertical-tabs{border:1px solid #e5e5e5;box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin:0 auto;position:relative;width:100%}.vertical-tabs input[type=radio]{position:absolute;opacity:0}.vertical-tabs .tab{align-items:center;display:inline-block;display:flex;flex-wrap:nowrap}.vertical-tabs .tab label{align-items:center;background:#e5e5e5;border:1px solid #e5e5e5;color:#7f7f7f;cursor:pointer;font-size:18px;font-weight:700;padding:0 20px;width:28%}.vertical-tabs .tab label:hover{background:#d8d8d8}.vertical-tabs .tab label:active{background:#ccc}.vertical-tabs .tab .content{display:none;border:1px solid #e5e5e5;border-left:0;border-right:0;max-height:950px;overflow:auto}.vertical-tabs .tab .content.full-height{max-height:none}.vertical-tabs [type=radio]:checked+label{border:0;background:#fff;color:#000;width:38%}.vertical-tabs [type=radio]:focus+label{box-shadow:inset 0 0 0 3px #2aa1c0;z-index:1}.vertical-tabs [type=radio]:checked~.content{display:block}@media screen and (max-width:1100px){.flex{flex-wrap:wrap}.fixed aside.info,.fixed aside.info+article,aside.info,aside.info+article{max-width:none;width:100%}}@media screen and (max-width:800px){*{max-width:none}table{box-shadow:none}.details .flex>*,body{margin:0}table,table.align-center,table .align-right,table td,table th{border:0;margin-left:auto;margin-right:auto;text-align:left;width:100%}table td{display:inline-block}table.media-details,table tbody{width:100%}table.media-details td{display:block;text-align:left!important;width:100%}table thead{display:none}.details .media-details td:nth-child(odd){font-weight:700;width:100%}table.streaming-links tr td:not(:first-child){display:none}}@media screen and (max-width:40em){nav a{line-height:4em;line-height:4rem}img,picture{width:100%}main{padding:0 .5rem .5rem}.media{margin:2px 0}.details{padding:.5rem}.tabs>[type=radio]:checked+label{background:#fff}.vertical-tabs .tab{flex-wrap:wrap}.tabs .content,.tabs>[type=radio]:checked+label+.content,.vertical-tabs .tab .content{display:block;border:0;max-height:none}.tabs>[type=radio]:checked+label,.tabs>label,.tabs>label:active,.tabs>label:hover,.vertical-tabs .tab label,.vertical-tabs .tab label:active,.vertical-tabs .tab label:hover,.vertical-tabs [type=radio]:checked+label,.vertical-tabs [type=radio]:focus+label{background:#fff;border:0;width:100%;cursor:default;color:#000}} @media (prefers-color-scheme: dark) { a{color:#1978e2;text-shadow:var(--link-shadow)}a:hover{color:#9e34fd}body,legend,nav ul li a{background:#333;color:#eee}nav a:hover,nav li.selected a{border-color:#fff}header button{background:transparent}table{box-shadow:none}td,th{border-color:#111}thead td,thead th{background:#333;color:#eee}tbody>tr:nth-child(2n){background:#555;color:#eee}tbody>tr:nth-child(odd){background:#333}footer,hr,legend{border-color:#ddd}small{color:#fff}input,input[type],select,textarea{border-color:#bbb;color:#bbb;background:#333;padding:.8em}button{background:#444;background:linear-gradient(#666,#555,#444,#555,#666);border-radius:.5em;margin:0;text-transform:none}button,button:hover{border-color:#ddd;color:#ddd}button:hover{background:#222;background:linear-gradient(#444,#333,#222,#333,#444)}button:active{background:#333;background:linear-gradient(#333,#333)}.media:hover button{background:linear-gradient(#666,#555,#444,#555,#666)}.media:hover button:hover{background:linear-gradient(#444,#555,#666,#555,#444)}.message,.static-message{text-shadow:var(--white-link-shadow)}.message.success,.static-message.success{background:#1f8454;border-color:#70dda9}.message.error,.static-message.error{border-color:#f3e6e6;background:#924949}.message.info,.static-message.info{border-color:#ffc;background:#bfbe3a}.invisible tbody>tr:nth-child(2n),.invisible tbody>tr:nth-child(odd),.invisible td,.invisible th,.invisible tr{background:transparent}#main-nav{border-bottom:.1rem solid #ddd}.tabs,.vertical-tabs{background:#333}.tabs>label,.vertical-tabs .tab label{background:#222;border:0;color:#eee}.vertical-tabs .tab label{width:100%}.tabs>label:hover,.vertical-tabs .tab>label:hover{background:#888}.tabs>label:active,.vertical-tabs .tab>label:active{background:#999}.single-tab,.tabs>[type=radio]:checked+label,.tabs>[type=radio]:checked+label+.content,.vertical-tabs [type=radio]:checked+label,.vertical-tabs [type=radio]:checked~.content{border:0;background:#666;color:#eee}.vertical-tabs{background:#222;border:1px solid #444}.vertical-tabs .tab{background:#666;border-bottom:1px solid #444}.streaming-logo{-webkit-filter:drop-shadow(0 0 2px #fff);filter:drop-shadow(0 0 2px #fff)} } \ No newline at end of file +:root{--default-font-list:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;--monospace-font-list:"Anonymous Pro","Fira Code",Menlo,Monaco,Consolas,"Courier New",monospace;--serif-font-list:Georgia,Times,"Times New Roman",serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;box-sizing:border-box;cursor:default;font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);line-height:1.4;overflow-y:scroll;-moz-text-size-adjust:100%;text-size-adjust:100%;scroll-behavior:smooth}audio:not([controls]){display:none}details{display:block}input[type=search]{-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}main{margin:0 auto;padding:0 1.6rem 1.6rem}main,pre,summary{display:block}pre{background:#efefef;color:#444;font-family:Anonymous Pro,Fira Code,Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--monospace-font-list);font-size:1.4em;font-size:1.4rem;margin:1.6rem 0;overflow:auto;padding:1.6rem;word-break:break-all;word-wrap:break-word}progress{display:inline-block}small{color:#777;font-size:75%}big{font-size:125%}template{display:none}textarea{border:.1rem solid #ccc;border-radius:0;display:block;margin-bottom:.8rem;overflow:auto;padding:.8rem;resize:vertical;vertical-align:middle}[hidden]{display:none}[unselectable]{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}*,:after,:before{box-sizing:inherit}*{font-size:inherit;line-height:inherit;margin:0;padding:0}:after,:before{text-decoration:inherit;vertical-align:inherit}a{-webkit-transition:.25s ease;color:#1271db;text-decoration:none;transition:.25s ease}audio,canvas,iframe,img,svg,video{vertical-align:middle}input,textarea{border:.1rem solid #ccc;color:inherit;font-family:inherit;font-style:inherit;font-weight:inherit;min-height:1.4em}code,kbd,pre,samp{font-family:Anonymous Pro,Fira Code,Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--monospace-font-list)}table{border-collapse:collapse;border-spacing:0;margin-bottom:1.6rem}::-moz-selection{background-color:#b3d4fc;text-shadow:none}::selection{background-color:#b3d4fc;text-shadow:none}button::-moz-focus-inner{border:0}body{color:#444;font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);font-size:1.6rem;font-style:normal;font-weight:400;padding:0}p{margin:0 0 1.6rem}h1,h2,h3,h4,h5,h6{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);margin:2rem 0 1.6rem}h1{border-bottom:.1rem solid rgba(0,0,0,.2);font-size:3.6em;font-size:3.6rem}h1,h2{font-style:normal;font-weight:500}h2{font-size:3em;font-size:3rem}h3{font-size:2.4em;font-size:2.4rem;font-style:normal;font-weight:500;margin:1.6rem 0 .4rem}h4{font-size:1.8em;font-size:1.8rem}h4,h5{font-style:normal;font-weight:600;margin:1.6rem 0 .4rem}h5{font-size:1.6em;font-size:1.6rem}h6{color:#777;font-size:1.4em;font-style:normal;font-weight:600;margin:1.6rem 0 .4rem}code,h6{font-size:1.4rem}code{background:#efefef;color:#444;font-family:Anonymous Pro,Fira Code,Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--monospace-font-list);word-break:break-all;word-wrap:break-word}a:focus,a:hover{text-decoration:none}dl{margin-bottom:1.6rem}dd{margin-left:4rem}ol,ul{margin-bottom:.8rem;padding-left:2rem}blockquote{border-left:.2rem solid #1271db;font-style:italic;margin:1.6rem 0;padding-left:1.6rem}blockquote,figcaption{font-family:Georgia,Times,Times New Roman,serif;font-family:var(--serif-font-list)}html{font-size:62.5%}article,aside,details,footer,header,main,section,summary{display:block;height:auto;margin:0 auto;width:100%}footer{clear:both;display:inline-block;float:left;max-width:100%;padding:1rem 0;text-align:center}footer,hr{border-top:.1rem solid rgba(0,0,0,.2)}hr{display:block;margin-bottom:1.6rem;width:100%}img{height:auto;vertical-align:baseline}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{border:.1rem solid #ccc;border-radius:0;display:inline-block;padding:.8rem;vertical-align:middle}input:not([type]){-webkit-appearance:none;background-clip:padding-box;background-color:#fff;border:.1rem solid #ccc;border-radius:0;color:#444;display:inline-block;padding:.8rem;text-align:left}input[type=color]{padding:.8rem 1.6rem}input:not([type]):focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,textarea:focus{border-color:#b3d4fc}input[type=checkbox],input[type=radio]{vertical-align:middle}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:.1rem thin solid #444}input:not([type])[disabled],input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled],textarea[disabled]{background-color:#efefef;color:#777;cursor:not-allowed}input[readonly],textarea[readonly]{background-color:#efefef;border-color:#ccc;color:#777}input:focus:invalid,textarea:focus:invalid{border-color:#e9322d;color:#b94a48}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#ff4136}select[multiple]{height:auto}label{line-height:2}fieldset{border:0;margin:0;padding:.8rem 0}legend{border-bottom:.1rem solid #ccc;color:#444;display:block;margin-bottom:.8rem;padding:.8rem 0;width:100%}button,input[type=submit]{-moz-user-select:none;-ms-user-select:none;-webkit-transition:.25s ease;-webkit-user-drag:none;-webkit-user-select:none;border:.2rem solid #444;border-radius:0;color:#444;cursor:pointer;display:inline-block;margin-bottom:.8rem;margin-right:.4rem;padding:.8rem 1.6rem;text-align:center;text-decoration:none;text-transform:uppercase;transition:.25s ease;user-select:none;vertical-align:baseline}button a,input[type=submit] a{color:#444}button::-moz-focus-inner,input[type=submit]::-moz-focus-inner{padding:0}button:hover,input[type=submit]:hover{background:#444;border-color:#444;color:#fff}button:hover a,input[type=submit]:hover a{color:#fff}button:active,input[type=submit]:active{background:#6a6a6a;border-color:#6a6a6a;color:#fff}button:active a,input[type=submit]:active a{color:#fff}button:disabled,input[type=submit]:disabled{box-shadow:none;cursor:not-allowed;opacity:.4}nav ul{list-style:none;margin:0;padding:0;text-align:center}nav ul li{display:inline}nav a{-webkit-transition:.25s ease;border-bottom:.2rem solid transparent;color:#444;padding:.8rem 1.6rem;text-decoration:none;transition:.25s ease}nav a:hover,nav li.selected a{border-color:rgba(0,0,0,.2)}nav a:active{border-color:rgba(0,0,0,.56)}caption{padding:.8rem 0}thead th{background:#efefef;color:#444}tr{background:#fff;margin-bottom:.8rem}td,th{border:.1rem solid #ccc;padding:.8rem 1.6rem;text-align:center;vertical-align:inherit}tfoot tr{background:none}tfoot td{color:#efefef;font-size:.8rem;font-style:italic;padding:1.6rem .4rem}@media screen{[hidden~=screen]{display:inherit}[hidden~=screen]:not(:active):not(:focus):not(:target){clip:rect(0)!important;position:absolute!important}}@media screen and max-width 40rem{article,aside,section{clear:both;display:block;max-width:100%}img{margin-right:1.6rem}}:root{--blue-link:#1271db;--link-shadow:1px 1px 1px #000;--white-link-shadow:1px 1px 1px #fff;--shadow:2px 2px 2px #000;--title-overlay:rgba(0,0,0,0.45);--title-overlay-fallback:#000;--text-color:#fff;--normal-padding:0.25em 0.125em;--link-hover-color:#7d12db;--edit-link-hover-color:#db7d12;--edit-link-color:#12db18;--radius:5px}.media[hidden],[hidden=hidden],template{display:none}body{margin:.5em}button{background:#fff;background:linear-gradient(#ddd,#eee,#fff,#eee,#ddd);border-radius:.5em;margin:0;text-transform:none}button,button:hover{border-color:#555;color:#555}button:hover{background:#bbb;background:linear-gradient(#cfcfcf,#dfdfdf,#efefef,#dfdfdf,#cfcfcf)}button:active{background:#ddd;background:linear-gradient(#ddd,#ddd)}.media:hover button{background:linear-gradient(#bbb,#ccc,#ddd,#ccc,#bbb)}.media:hover button:hover{background:linear-gradient(#afafaf,#bfbfbf,#cfcfcf,#bfbfbf,#afafaf)}table{box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin:0 auto}td{padding:1rem}thead td,thead th{padding:.5rem}input[type=number]{min-width:0;width:4.5em}input[type=checkbox],input[type=radio]{min-width:auto;vertical-align:inherit}input,textarea{min-width:30em;min-width:30rem}tbody>tr:nth-child(odd){background:#ddd}a:active,a:hover{color:#7d12db;color:var(--link-hover-color)}iframe{display:block;margin:0 auto;border:0}.bracketed{color:#12db18;color:var(--edit-link-color)}#main-nav a,.bracketed{text-shadow:1px 1px 1px #000;text-shadow:var(--link-shadow)}.bracketed:before{content:"[\00a0"}.bracketed:after{content:"\00a0]"}.bracketed:active,.bracketed:hover{color:#db7d12;color:var(--edit-link-hover-color)}.grow-1{flex-grow:1}.flex-wrap{flex-wrap:wrap}.flex-no-wrap{flex-wrap:nowrap}.flex-align-start{align-content:flex-start}.flex-align-end{align-items:flex-end}.flex-align-space-around{align-content:space-around}.flex-justify-start{justify-content:flex-start}.flex-justify-space-around{justify-content:space-around}.flex-center{justify-content:center}.flex-self-center{align-self:center}.flex-space-evenly{justify-content:space-evenly}.flex{display:inline-block;display:flex}.small-font{font-size:1.6rem}.justify{text-align:justify}.align-center{text-align:center!important}.align-left{text-align:left!important}.align-right{text-align:right!important}.valign-top{vertical-align:top}.no-border{border:none}.media-wrap{text-align:center;margin:0 auto;position:relative}.media-wrap-flex{display:inline-block;display:flex;flex-wrap:wrap;align-content:space-evenly;justify-content:space-between;position:relative}td .media-wrap-flex{justify-content:center}.danger{background-color:#ff4136;border-color:#924949;color:#924949}.danger:active,.danger:hover{background-color:#924949;border-color:#ff4136;color:#ff4136}td.danger,td.danger:active,td.danger:hover{background-color:transparent;color:#924949}.user-btn{background:transparent;border-color:#12db18;border-color:var(--edit-link-color);color:#12db18;color:var(--edit-link-color);text-shadow:1px 1px 1px #000;text-shadow:var(--link-shadow);padding:0 .5rem}.user-btn:active,.user-btn:hover{background:transparent;border-color:#db7d12;border-color:var(--edit-link-hover-color);color:#db7d12;color:var(--edit-link-hover-color)}.user-btn:active{background:#db7d12;background:var(--edit-link-hover-color);color:#fff}.full-width{width:100%}.full-height{max-height:none}.toph{margin-top:0}#main-nav{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);margin:2rem 0 1.6rem;border-bottom:.1rem solid rgba(0,0,0,.2);font-size:3.6em;font-size:3.6rem;font-style:normal;font-weight:500}.sorting,.sorting-asc,.sorting-desc{vertical-align:text-bottom}.sorting:before{content:" ↕\00a0"}.sorting-asc:before{content:" ↑\00a0"}.sorting-desc:before{content:" ↓\00a0"}.form thead th,.form thead tr{background:inherit;border:0}.form tr>td:nth-child(odd){text-align:right;min-width:25px;max-width:30%}.form tr>td:nth-child(2n){text-align:left}.invisible tbody>tr:nth-child(odd){background:inherit}.borderless,.borderless td,.borderless th,.borderless tr,.invisible td,.invisible th,.invisible tr{box-shadow:none;border:0}.message,.static-message{position:relative;margin:.5em auto;padding:.5em;width:95%}.message .close{width:1em;height:1em;position:absolute;right:.5em;top:.5em;text-align:center;vertical-align:middle;line-height:1em}.message:hover .close:after{content:"☒"}.message:hover{cursor:pointer}.message .icon{left:.5em;top:.5em;margin-right:1em}.message.error,.static-message.error{border:1px solid #924949;background:#f3e6e6}.message.error .icon:after{content:"✘"}.message.success,.static-message.success{border:1px solid #1f8454;background:#70dda9}.message.success .icon:after{content:"✔"}.message.info,.static-message.info{border:1px solid #bfbe3a;background:#ffc}.message.info .icon:after{content:"⚠"}.character,.media,.small-character{position:relative;vertical-align:top;display:inline-block;text-align:center;width:220px;height:312px;margin:.25em .125em;margin:var(--normal-padding);z-index:0;background:rgba(0,0,0,.15)}.details picture.cover,picture.cover{display:inline;display:initial;width:100%}.character>img,.media>img,.small-character>img{width:100%}.media .edit-buttons>button{margin:.5em auto}.media-metadata>div,.medium-metadata>div,.name,.row{text-shadow:2px 2px 2px #000;text-shadow:var(--shadow);color:#fff;color:var(--text-color);padding:.25em .125em;padding:var(--normal-padding);text-align:right;z-index:2}.age-rating,.media-type{text-align:left}.media>.media-metadata{position:absolute;bottom:0;right:0}.media>.medium-metadata{position:absolute;bottom:0;left:0}.media>.name{position:absolute;top:0}.media>.name a{display:inline-block;transition:none}.media .name a:before{content:"";display:block;height:312px;left:0;position:absolute;top:0;width:220px;z-index:-1}.media-list .media:hover .name a:before{background:rgba(0,0,0,.75)}.media>.name span.canonical{font-weight:700}.media>.name small{font-weight:400}.media:hover .name{background:rgba(0,0,0,.75)}.media-list .media>.name a:hover,.media-list .media>.name a:hover small{color:#1271db;color:var(--blue-link)}.media:hover>.edit-buttons[hidden],.media:hover>button[hidden]{transition:.25s ease;display:block}.media:hover{transition:.25s ease}.character>.name a,.character>.name a small,.media>.name a,.media>.name a small,.small-character>.name a,.small-character>.name a small{background:none;color:#fff;text-shadow:2px 2px 2px #000;text-shadow:var(--shadow)}.anime .name,.manga .name{background:#000;background:var(--title-overlay-fallback);background:rgba(0,0,0,.45);background:var(--title-overlay);text-align:center;width:100%;padding:.5em .25em}.anime .age-rating,.anime .airing-status,.anime .completion,.anime .delete,.anime .edit,.anime .media-type,.anime .user-rating{background:none;text-align:center}.anime .table,.manga .table{position:absolute;bottom:0;left:0;width:100%}.anime .row,.manga .row{width:100%;display:inline-block;display:flex;align-content:space-around;justify-content:space-around;text-align:center;padding:0 inherit}.anime .row>span,.manga .row>span{text-align:left;z-index:2}.anime .row>div,.manga .row>div{font-size:.8em;display:inline-block;display:flex-item;align-self:center;text-align:center;vertical-align:middle;z-index:2}.anime .media>button.plus-one{border-color:hsla(0,0%,100%,.65);position:absolute;top:138px;top:calc(50% - 21.2px);left:44px;left:calc(50% - 57.8px);z-index:50}.manga .row{padding:1px}.manga .media{height:310px;margin:.25em}.manga .media>.edit-buttons{position:absolute;top:86px;top:calc(50% - 21.2px);left:43.5px;left:calc(50% - 57.8px);z-index:40}.manga .media>.edit-buttons button{border-color:hsla(0,0%,100%,.65)}.media.search>.name{background-color:#555;background-color:rgba(0,0,0,.35);background-size:cover;background-size:contain;background-repeat:no-repeat}.media.search>.row{z-index:6}.big-check,.mal-check{display:none}.big-check:checked+label{transition:.25s ease;background:rgba(0,0,0,.75)}.big-check:checked+label:after{content:"✓";font-size:15em;font-size:15rem;text-align:center;color:#adff2f;position:absolute;top:147px;left:0;width:100%;z-index:5}#series-list article.media{position:relative}#series-list .name,#series-list .name label{position:absolute;display:block;top:0;left:0;height:100%;width:100%;vertical-align:middle;line-height:1.25em}#series-list .name small{color:#fff}.details{margin:1.5rem auto 0;padding:1rem;font-size:inherit}.fixed{max-width:115em;max-width:115rem;margin:0 auto}.details .cover{display:block}.details .flex>*{margin:1rem}.details .media-details td{padding:0 1.5rem}.details p{text-align:justify}.details .media-details td:nth-child(odd){width:1%;white-space:nowrap;text-align:right}.details .media-details td:nth-child(2n){text-align:left}.details a h1,.details a h2{margin-top:0}.character,.person,.small-character{width:225px;height:350px;vertical-align:middle;white-space:nowrap;position:relative}.person{width:225px;height:338px}.small-person{width:200px;height:300px}.character a{height:350px}.character:hover .name,.small-character:hover .name{background:rgba(0,0,0,.8)}.small-character a{display:inline-block;width:100%;height:100%}.character .name,.small-character .name{position:absolute;bottom:0;left:0;z-index:10}.character img,.character picture,.person img,.person picture,.small-character img,.small-character picture{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:5;max-height:350px;max-width:225px}.person img,.person picture{max-height:338px}.small-person img,.small-person picture{max-height:300px;max-width:200px}.min-table{min-width:0;margin-left:0}.max-table{min-width:100%;margin:0}aside.info{max-width:33%}.fixed aside{max-width:390px}aside img,aside picture{display:block;margin:0 auto}.small-character{width:160px;height:250px}.small-character img,.small-character picture{max-height:250px;max-width:160px}.user-page .media-wrap{text-align:left}.media a{display:inline-block;width:100%;height:100%}.streaming-logo{width:50px;height:50px;vertical-align:middle}.small-streaming-logo{width:25px;height:25px;vertical-align:middle}.cover-streaming-link{display:none}.media:hover .cover-streaming-link{display:block}.cover-streaming-link .streaming-logo{width:20px;height:20px;filter:drop-shadow(0 -1px 4px #fff)}.history-img{width:110px;height:156px}.settings.form .content article{margin:1em;display:inline-block;width:auto}.responsive-iframe{margin-top:1em;overflow:hidden;padding-bottom:56.25%;position:relative;height:0}.responsive-iframe iframe{left:0;top:0;height:100%;width:100%;position:absolute}.cssload-loader{position:relative;left:calc(50% - 31px);width:62px;height:62px;border-radius:50%;perspective:780px}.cssload-inner{position:absolute;width:100%;height:100%;box-sizing:border-box;border-radius:50%}.cssload-inner.cssload-one{left:0;top:0;-webkit-animation:cssload-rotate-one 1.15s linear infinite;animation:cssload-rotate-one 1.15s linear infinite;border-bottom:3px solid #000}.cssload-inner.cssload-two{right:0;top:0;-webkit-animation:cssload-rotate-two 1.15s linear infinite;animation:cssload-rotate-two 1.15s linear infinite;border-right:3px solid #000}.cssload-inner.cssload-three{right:0;bottom:0;-webkit-animation:cssload-rotate-three 1.15s linear infinite;animation:cssload-rotate-three 1.15s linear infinite;border-top:3px solid #000}@-webkit-keyframes cssload-rotate-one{0%{transform:rotateX(35deg) rotateY(-45deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(-45deg) rotate(1turn)}}@keyframes cssload-rotate-one{0%{transform:rotateX(35deg) rotateY(-45deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(-45deg) rotate(1turn)}}@-webkit-keyframes cssload-rotate-two{0%{transform:rotateX(50deg) rotateY(10deg) rotate(0deg)}to{transform:rotateX(50deg) rotateY(10deg) rotate(1turn)}}@keyframes cssload-rotate-two{0%{transform:rotateX(50deg) rotateY(10deg) rotate(0deg)}to{transform:rotateX(50deg) rotateY(10deg) rotate(1turn)}}@-webkit-keyframes cssload-rotate-three{0%{transform:rotateX(35deg) rotateY(55deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(55deg) rotate(1turn)}}@keyframes cssload-rotate-three{0%{transform:rotateX(35deg) rotateY(55deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(55deg) rotate(1turn)}}#loading-shadow{background:rgba(0,0,0,.8);z-index:500}#loading-shadow,#loading-shadow .loading-wrapper{position:fixed;top:0;left:0;width:100%;height:100%}#loading-shadow .loading-wrapper{z-index:501;display:flex;align-items:center;justify-content:center}#loading-shadow .loading-content{position:relative;color:#fff}.loading-content .cssload-inner.cssload-one,.loading-content .cssload-inner.cssload-three,.loading-content .cssload-inner.cssload-two{border-color:#fff}.tabs{display:inline-block;display:flex;flex-wrap:wrap;background:#efefef;box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin-top:1.5em}.tabs>label{border:1px solid #e5e5e5;width:100%;padding:20px 30px;background:#e5e5e5;cursor:pointer;font-weight:700;font-size:18px;color:#7f7f7f;transition:background .1s,color .1s}.tabs>label:hover{background:#d8d8d8}.tabs>label:active{background:#ccc}.tabs>[type=radio]:focus+label{box-shadow:inset 0 0 0 3px #2aa1c0;z-index:1}.tabs>[type=radio]{position:absolute;opacity:0}.tabs>[type=radio]:checked+label{border-bottom:1px solid #fff;background:#fff;color:#000}.tabs>[type=radio]:checked+label+.content{display:block}.single-tab,.tabs .content,.tabs>[type=radio]:checked+label+.content{border:1px solid #e5e5e5;border-top:0;padding:15px;background:#fff;width:100%;margin:0 auto;overflow:auto}.single-tab,.tabs .content{display:none;max-height:950px}.single-tab{display:block;border:1px solid #e5e5e5;box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin-top:1.5em}.single-tab.full-height,.tabs .content.full-height{max-height:none}@media (min-width:800px){.tabs>label{width:auto}.tabs .content{order:99}}.vertical-tabs{border:1px solid #e5e5e5;box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin:0 auto;position:relative;width:100%}.vertical-tabs input[type=radio]{position:absolute;opacity:0}.vertical-tabs .tab{align-items:center;display:inline-block;display:flex;flex-wrap:nowrap}.vertical-tabs .tab label{align-items:center;background:#e5e5e5;border:1px solid #e5e5e5;color:#7f7f7f;cursor:pointer;font-size:18px;font-weight:700;padding:0 20px;width:28%}.vertical-tabs .tab label:hover{background:#d8d8d8}.vertical-tabs .tab label:active{background:#ccc}.vertical-tabs .tab .content{display:none;border:1px solid #e5e5e5;border-left:0;border-right:0;max-height:950px;overflow:auto}.vertical-tabs .tab .content.full-height{max-height:none}.vertical-tabs [type=radio]:checked+label{border:0;background:#fff;color:#000;width:38%}.vertical-tabs [type=radio]:focus+label{box-shadow:inset 0 0 0 3px #2aa1c0;z-index:1}.vertical-tabs [type=radio]:checked~.content{display:block}@media screen and (max-width:1100px){.flex{flex-wrap:wrap}.fixed aside.info,.fixed aside.info+article,aside.info,aside.info+article{max-width:none;width:100%}}@media screen and (max-width:800px){*{max-width:none}table{box-shadow:none}.details .flex>*,body{margin:0}table,table.align-center,table .align-right,table td,table th{border:0;margin-left:auto;margin-right:auto;text-align:left;width:100%}table td{display:inline-block}table.media-details,table tbody{width:100%}table.media-details td{display:block;text-align:left!important;width:100%}table thead{display:none}.details .media-details td:nth-child(odd){font-weight:700;width:100%}table.streaming-links tr td:not(:first-child){display:none}}@media screen and (max-width:40em){nav a{line-height:4em;line-height:4rem}img,picture{width:100%}main{padding:0 .5rem .5rem}.media{margin:2px 0}.details{padding:.5rem}.tabs>[type=radio]:checked+label{background:#fff}.vertical-tabs .tab{flex-wrap:wrap}.tabs .content,.tabs>[type=radio]:checked+label+.content,.vertical-tabs .tab .content{display:block;border:0;max-height:none}.tabs>[type=radio]:checked+label,.tabs>label,.tabs>label:active,.tabs>label:hover,.vertical-tabs .tab label,.vertical-tabs .tab label:active,.vertical-tabs .tab label:hover,.vertical-tabs [type=radio]:checked+label,.vertical-tabs [type=radio]:focus+label{background:#fff;border:0;width:100%;cursor:default;color:#000}} @media (prefers-color-scheme: dark) { a{color:#1978e2;text-shadow:var(--link-shadow)}a:hover{color:#9e34fd}body,legend,nav ul li a{background:#333;color:#eee}nav a:hover,nav li.selected a{border-color:#fff}header button{background:transparent}table{box-shadow:none}td,th{border-color:#111}thead td,thead th{background:#333;color:#eee}tbody>tr:nth-child(2n){background:#555;color:#eee}tbody>tr:nth-child(odd){background:#333}footer,hr,legend{border-color:#ddd}small{color:#fff}input,input[type],select,textarea{border-color:#bbb;color:#bbb;background:#333;padding:.8em}button{background:#444;background:linear-gradient(#666,#555,#444,#555,#666);border-radius:.5em;margin:0;text-transform:none}button,button:hover{border-color:#ddd;color:#ddd}button:hover{background:#222;background:linear-gradient(#444,#333,#222,#333,#444)}button:active{background:#333;background:linear-gradient(#333,#333)}.media:hover button{background:linear-gradient(#666,#555,#444,#555,#666)}.media:hover button:hover{background:linear-gradient(#444,#555,#666,#555,#444)}.message,.static-message{text-shadow:var(--white-link-shadow)}.message.success,.static-message.success{background:#1f8454;border-color:#70dda9}.message.error,.static-message.error{border-color:#f3e6e6;background:#924949}.message.info,.static-message.info{border-color:#ffc;background:#bfbe3a}.invisible tbody>tr:nth-child(2n),.invisible tbody>tr:nth-child(odd),.invisible td,.invisible th,.invisible tr{background:transparent}#main-nav{border-bottom:.1rem solid #ddd}.tabs,.vertical-tabs{background:#333}.tabs>label,.vertical-tabs .tab label{background:#222;border:0;color:#eee}.vertical-tabs .tab label{width:100%}.tabs>label:hover,.vertical-tabs .tab>label:hover{background:#888}.tabs>label:active,.vertical-tabs .tab>label:active{background:#999}.single-tab,.tabs>[type=radio]:checked+label,.tabs>[type=radio]:checked+label+.content,.vertical-tabs [type=radio]:checked+label,.vertical-tabs [type=radio]:checked~.content{border:0;background:#666;color:#eee}.vertical-tabs{background:#222;border:1px solid #444}.vertical-tabs .tab{background:#666;border-bottom:1px solid #444}.streaming-logo{filter:drop-shadow(0 0 2px #fff)} } \ No newline at end of file diff --git a/public/css/dark.min.css b/public/css/dark.min.css index 9c38ae7a..41b1f035 100644 --- a/public/css/dark.min.css +++ b/public/css/dark.min.css @@ -1 +1 @@ -:root{--default-font-list:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;--monospace-font-list:"Anonymous Pro","Fira Code",Menlo,Monaco,Consolas,"Courier New",monospace;--serif-font-list:Georgia,Times,"Times New Roman",serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;box-sizing:border-box;cursor:default;font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);line-height:1.4;overflow-y:scroll;-moz-text-size-adjust:100%;text-size-adjust:100%;scroll-behavior:smooth}audio:not([controls]){display:none}details{display:block}input[type=search]{-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}main{margin:0 auto;padding:0 1.6rem 1.6rem}main,pre,summary{display:block}pre{background:#efefef;color:#444;font-family:Anonymous Pro,Fira Code,Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--monospace-font-list);font-size:1.4em;font-size:1.4rem;margin:1.6rem 0;overflow:auto;padding:1.6rem;word-break:break-all;word-wrap:break-word}progress{display:inline-block}small{color:#777;font-size:75%}big{font-size:125%}template{display:none}textarea{border:.1rem solid #ccc;border-radius:0;display:block;margin-bottom:.8rem;overflow:auto;padding:.8rem;resize:vertical;vertical-align:middle}[hidden]{display:none}[unselectable]{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}*,:after,:before{box-sizing:inherit}*{font-size:inherit;line-height:inherit;margin:0;padding:0}:after,:before{text-decoration:inherit;vertical-align:inherit}a{-webkit-transition:.25s ease;color:#1271db;text-decoration:none;transition:.25s ease}audio,canvas,iframe,img,svg,video{vertical-align:middle}input,textarea{border:.1rem solid #ccc;color:inherit;font-family:inherit;font-style:inherit;font-weight:inherit;min-height:1.4em}code,kbd,pre,samp{font-family:Anonymous Pro,Fira Code,Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--monospace-font-list)}table{border-collapse:collapse;border-spacing:0;margin-bottom:1.6rem}::-moz-selection{background-color:#b3d4fc;text-shadow:none}::selection{background-color:#b3d4fc;text-shadow:none}button::-moz-focus-inner{border:0}body{color:#444;font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);font-size:1.6rem;font-style:normal;font-weight:400;padding:0}p{margin:0 0 1.6rem}h1,h2,h3,h4,h5,h6{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);margin:2rem 0 1.6rem}h1{border-bottom:.1rem solid rgba(0,0,0,.2);font-size:3.6em;font-size:3.6rem}h1,h2{font-style:normal;font-weight:500}h2{font-size:3em;font-size:3rem}h3{font-size:2.4em;font-size:2.4rem;font-style:normal;font-weight:500;margin:1.6rem 0 .4rem}h4{font-size:1.8em;font-size:1.8rem}h4,h5{font-style:normal;font-weight:600;margin:1.6rem 0 .4rem}h5{font-size:1.6em;font-size:1.6rem}h6{color:#777;font-size:1.4em;font-style:normal;font-weight:600;margin:1.6rem 0 .4rem}code,h6{font-size:1.4rem}code{background:#efefef;color:#444;font-family:Anonymous Pro,Fira Code,Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--monospace-font-list);word-break:break-all;word-wrap:break-word}a:focus,a:hover{text-decoration:none}dl{margin-bottom:1.6rem}dd{margin-left:4rem}ol,ul{margin-bottom:.8rem;padding-left:2rem}blockquote{border-left:.2rem solid #1271db;font-style:italic;margin:1.6rem 0;padding-left:1.6rem}blockquote,figcaption{font-family:Georgia,Times,Times New Roman,serif;font-family:var(--serif-font-list)}html{font-size:62.5%}article,aside,details,footer,header,main,section,summary{display:block;height:auto;margin:0 auto;width:100%}footer{clear:both;display:inline-block;float:left;max-width:100%;padding:1rem 0;text-align:center}footer,hr{border-top:.1rem solid rgba(0,0,0,.2)}hr{display:block;margin-bottom:1.6rem;width:100%}img{height:auto;vertical-align:baseline}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{border:.1rem solid #ccc;border-radius:0;display:inline-block;padding:.8rem;vertical-align:middle}input:not([type]){-webkit-appearance:none;background-clip:padding-box;background-color:#fff;border:.1rem solid #ccc;border-radius:0;color:#444;display:inline-block;padding:.8rem;text-align:left}input[type=color]{padding:.8rem 1.6rem}input:not([type]):focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,textarea:focus{border-color:#b3d4fc}input[type=checkbox],input[type=radio]{vertical-align:middle}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:.1rem thin solid #444}input:not([type])[disabled],input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled],textarea[disabled]{background-color:#efefef;color:#777;cursor:not-allowed}input[readonly],textarea[readonly]{background-color:#efefef;border-color:#ccc;color:#777}input:focus:invalid,textarea:focus:invalid{border-color:#e9322d;color:#b94a48}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#ff4136}select[multiple]{height:auto}label{line-height:2}fieldset{border:0;margin:0;padding:.8rem 0}legend{border-bottom:.1rem solid #ccc;color:#444;display:block;margin-bottom:.8rem;padding:.8rem 0;width:100%}button,input[type=submit]{-moz-user-select:none;-ms-user-select:none;-webkit-transition:.25s ease;-webkit-user-drag:none;-webkit-user-select:none;border:.2rem solid #444;border-radius:0;color:#444;cursor:pointer;display:inline-block;margin-bottom:.8rem;margin-right:.4rem;padding:.8rem 1.6rem;text-align:center;text-decoration:none;text-transform:uppercase;transition:.25s ease;user-select:none;vertical-align:baseline}button a,input[type=submit] a{color:#444}button::-moz-focus-inner,input[type=submit]::-moz-focus-inner{padding:0}button:hover,input[type=submit]:hover{background:#444;border-color:#444;color:#fff}button:hover a,input[type=submit]:hover a{color:#fff}button:active,input[type=submit]:active{background:#6a6a6a;border-color:#6a6a6a;color:#fff}button:active a,input[type=submit]:active a{color:#fff}button:disabled,input[type=submit]:disabled{box-shadow:none;cursor:not-allowed;opacity:.4}nav ul{list-style:none;margin:0;padding:0;text-align:center}nav ul li{display:inline}nav a{-webkit-transition:.25s ease;border-bottom:.2rem solid transparent;color:#444;padding:.8rem 1.6rem;text-decoration:none;transition:.25s ease}nav a:hover,nav li.selected a{border-color:rgba(0,0,0,.2)}nav a:active{border-color:rgba(0,0,0,.56)}caption{padding:.8rem 0}thead th{background:#efefef;color:#444}tr{background:#fff;margin-bottom:.8rem}td,th{border:.1rem solid #ccc;padding:.8rem 1.6rem;text-align:center;vertical-align:inherit}tfoot tr{background:none}tfoot td{color:#efefef;font-size:.8rem;font-style:italic;padding:1.6rem .4rem}@media screen{[hidden~=screen]{display:inherit}[hidden~=screen]:not(:active):not(:focus):not(:target){clip:rect(0)!important;position:absolute!important}}@media screen and max-width 40rem{article,aside,section{clear:both;display:block;max-width:100%}img{margin-right:1.6rem}}:root{--blue-link:#1271db;--link-shadow:1px 1px 1px #000;--white-link-shadow:1px 1px 1px #fff;--shadow:2px 2px 2px #000;--title-overlay:rgba(0,0,0,0.45);--title-overlay-fallback:#000;--text-color:#fff;--normal-padding:0.25em 0.125em;--link-hover-color:#7d12db;--edit-link-hover-color:#db7d12;--edit-link-color:#12db18;--radius:5px}.media[hidden],[hidden=hidden],template{display:none}body{margin:.5em}button{background:#fff;background:linear-gradient(#ddd,#eee,#fff,#eee,#ddd)}button,button:hover{border-color:#555;color:#555}button:hover{background:#bbb;background:linear-gradient(#cfcfcf,#dfdfdf,#efefef,#dfdfdf,#cfcfcf)}button:active{background:#ddd;background:linear-gradient(#ddd,#ddd)}.media:hover button{background:linear-gradient(#bbb,#ccc,#ddd,#ccc,#bbb)}.media:hover button:hover{background:linear-gradient(#afafaf,#bfbfbf,#cfcfcf,#bfbfbf,#afafaf)}table{box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin:0 auto}td{padding:1rem}thead td,thead th{padding:.5rem}input[type=number]{min-width:0;width:4.5em}input[type=checkbox],input[type=radio]{min-width:auto;vertical-align:inherit}input,textarea{min-width:30em;min-width:30rem}tbody>tr:nth-child(odd){background:#ddd}a:active,a:hover{color:#7d12db;color:var(--link-hover-color)}iframe{display:block;margin:0 auto;border:0}.bracketed{color:#12db18;color:var(--edit-link-color)}#main-nav a,.bracketed{text-shadow:1px 1px 1px #000;text-shadow:var(--link-shadow)}.bracketed:before{content:"[\00a0"}.bracketed:after{content:"\00a0]"}.bracketed:active,.bracketed:hover{color:#db7d12;color:var(--edit-link-hover-color)}.grow-1{flex-grow:1}.flex-wrap{flex-wrap:wrap}.flex-no-wrap{flex-wrap:nowrap}.flex-align-start{align-content:flex-start}.flex-align-end{align-items:flex-end}.flex-align-space-around{align-content:space-around}.flex-justify-start{justify-content:flex-start}.flex-justify-space-around{justify-content:space-around}.flex-center{justify-content:center}.flex-self-center{align-self:center}.flex-space-evenly{justify-content:space-evenly}.flex{display:inline-block;display:flex}.small-font{font-size:1.6rem}.justify{text-align:justify}.align-center{text-align:center!important}.align-left{text-align:left!important}.align-right{text-align:right!important}.valign-top{vertical-align:top}.no-border{border:none}.media-wrap{text-align:center;margin:0 auto;position:relative}.media-wrap-flex{display:inline-block;display:flex;flex-wrap:wrap;align-content:space-evenly;justify-content:space-between;position:relative}td .media-wrap-flex{justify-content:center}.danger{background-color:#ff4136;border-color:#924949;color:#924949}.danger:active,.danger:hover{background-color:#924949;border-color:#ff4136;color:#ff4136}td.danger,td.danger:active,td.danger:hover{background-color:transparent;color:#924949}.user-btn{background:transparent;border-color:#12db18;border-color:var(--edit-link-color);color:#12db18;color:var(--edit-link-color);text-shadow:1px 1px 1px #000;text-shadow:var(--link-shadow);padding:0 .5rem}.user-btn:active,.user-btn:hover{background:transparent;border-color:#db7d12;border-color:var(--edit-link-hover-color);color:#db7d12;color:var(--edit-link-hover-color)}.user-btn:active{background:#db7d12;background:var(--edit-link-hover-color);color:#fff}.full-width{width:100%}.full-height{max-height:none}.toph{margin-top:0}#main-nav{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);margin:2rem 0 1.6rem;border-bottom:.1rem solid rgba(0,0,0,.2);font-size:3.6em;font-size:3.6rem;font-style:normal;font-weight:500}.sorting,.sorting-asc,.sorting-desc{vertical-align:text-bottom}.sorting:before{content:" ↕\00a0"}.sorting-asc:before{content:" ↑\00a0"}.sorting-desc:before{content:" ↓\00a0"}.form thead th,.form thead tr{background:inherit;border:0}.form tr>td:nth-child(odd){text-align:right;min-width:25px;max-width:30%}.form tr>td:nth-child(2n){text-align:left}.invisible tbody>tr:nth-child(odd){background:inherit}.borderless,.borderless td,.borderless th,.borderless tr,.invisible td,.invisible th,.invisible tr{box-shadow:none;border:0}.message,.static-message{position:relative;margin:.5em auto;padding:.5em;width:95%}.message .close{width:1em;height:1em;position:absolute;right:.5em;top:.5em;text-align:center;vertical-align:middle;line-height:1em}.message:hover .close:after{content:"☒"}.message:hover{cursor:pointer}.message .icon{left:.5em;top:.5em;margin-right:1em}.message.error,.static-message.error{border:1px solid #924949;background:#f3e6e6}.message.error .icon:after{content:"✘"}.message.success,.static-message.success{border:1px solid #1f8454;background:#70dda9}.message.success .icon:after{content:"✔"}.message.info,.static-message.info{border:1px solid #bfbe3a;background:#ffc}.message.info .icon:after{content:"⚠"}.character,.media,.small-character{position:relative;vertical-align:top;display:inline-block;text-align:center;width:220px;height:312px;margin:.25em .125em;margin:var(--normal-padding);z-index:0;background:rgba(0,0,0,.15)}.details picture.cover,picture.cover{display:inline;display:initial;width:100%}.character>img,.media>img,.small-character>img{width:100%}.media .edit-buttons>button{margin:.5em auto}.media-metadata>div,.medium-metadata>div,.name,.row{text-shadow:2px 2px 2px #000;text-shadow:var(--shadow);color:#fff;color:var(--text-color);padding:.25em .125em;padding:var(--normal-padding);text-align:right;z-index:2}.age-rating,.media-type{text-align:left}.media>.media-metadata{position:absolute;bottom:0;right:0}.media>.medium-metadata{position:absolute;bottom:0;left:0}.media>.name{position:absolute;top:0}.media>.name a{display:inline-block;transition:none}.media .name a:before{content:"";display:block;height:312px;left:0;position:absolute;top:0;width:220px;z-index:-1}.media-list .media:hover .name a:before{background:rgba(0,0,0,.75)}.media>.name span.canonical{font-weight:700}.media>.name small{font-weight:400}.media:hover .name{background:rgba(0,0,0,.75)}.media-list .media>.name a:hover,.media-list .media>.name a:hover small{color:#1271db;color:var(--blue-link)}.media:hover>.edit-buttons[hidden],.media:hover>button[hidden]{transition:.25s ease;display:block}.media:hover{transition:.25s ease}.character>.name a,.character>.name a small,.media>.name a,.media>.name a small,.small-character>.name a,.small-character>.name a small{background:none;color:#fff;text-shadow:2px 2px 2px #000;text-shadow:var(--shadow)}.anime .name,.manga .name{background:#000;background:var(--title-overlay-fallback);background:rgba(0,0,0,.45);background:var(--title-overlay);text-align:center;width:100%;padding:.5em .25em}.anime .age-rating,.anime .airing-status,.anime .completion,.anime .delete,.anime .edit,.anime .media-type,.anime .user-rating{background:none;text-align:center}.anime .table,.manga .table{position:absolute;bottom:0;left:0;width:100%}.anime .row,.manga .row{width:100%;display:inline-block;display:flex;align-content:space-around;justify-content:space-around;text-align:center;padding:0 inherit}.anime .row>span,.manga .row>span{text-align:left;z-index:2}.anime .row>div,.manga .row>div{font-size:.8em;display:inline-block;display:flex-item;align-self:center;text-align:center;vertical-align:middle;z-index:2}.anime .media>button.plus-one{border-color:hsla(0,0%,100%,.65);position:absolute;top:138px;top:calc(50% - 21.2px);left:44px;left:calc(50% - 57.8px);z-index:50}.manga .row{padding:1px}.manga .media{height:310px;margin:.25em}.manga .media>.edit-buttons{position:absolute;top:86px;top:calc(50% - 21.2px);left:43.5px;left:calc(50% - 57.8px);z-index:40}.manga .media>.edit-buttons button{border-color:hsla(0,0%,100%,.65)}.media.search>.name{background-color:#555;background-color:rgba(0,0,0,.35);background-size:cover;background-size:contain;background-repeat:no-repeat}.media.search>.row{z-index:6}.big-check,.mal-check{display:none}.big-check:checked+label{transition:.25s ease;background:rgba(0,0,0,.75)}.big-check:checked+label:after{content:"✓";font-size:15em;font-size:15rem;text-align:center;color:#adff2f;position:absolute;top:147px;left:0;width:100%;z-index:5}#series-list article.media{position:relative}#series-list .name,#series-list .name label{position:absolute;display:block;top:0;left:0;height:100%;width:100%;vertical-align:middle;line-height:1.25em}#series-list .name small{color:#fff}.details{margin:1.5rem auto 0;padding:1rem;font-size:inherit}.fixed{max-width:115em;max-width:115rem;margin:0 auto}.details .cover{display:block}.details .flex>*{margin:1rem}.details .media-details td{padding:0 1.5rem}.details p{text-align:justify}.details .media-details td:nth-child(odd){width:1%;white-space:nowrap;text-align:right}.details .media-details td:nth-child(2n){text-align:left}.details a h1,.details a h2{margin-top:0}.character,.person,.small-character{width:225px;height:350px;vertical-align:middle;white-space:nowrap;position:relative}.person{width:225px;height:338px}.small-person{width:200px;height:300px}.character a{height:350px}.character:hover .name,.small-character:hover .name{background:rgba(0,0,0,.8)}.small-character a{display:inline-block;width:100%;height:100%}.character .name,.small-character .name{position:absolute;bottom:0;left:0;z-index:10}.character img,.character picture,.person img,.person picture,.small-character img,.small-character picture{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:5;max-height:350px;max-width:225px}.person img,.person picture{max-height:338px}.small-person img,.small-person picture{max-height:300px;max-width:200px}.min-table{min-width:0;margin-left:0}.max-table{min-width:100%;margin:0}aside.info{max-width:33%}.fixed aside{max-width:390px}aside img,aside picture{display:block;margin:0 auto}.small-character{width:160px;height:250px}.small-character img,.small-character picture{max-height:250px;max-width:160px}.user-page .media-wrap{text-align:left}.media a{display:inline-block;width:100%;height:100%}.streaming-logo{width:50px;height:50px;vertical-align:middle}.small-streaming-logo{width:25px;height:25px;vertical-align:middle}.cover-streaming-link{display:none}.media:hover .cover-streaming-link{display:block}.cover-streaming-link .streaming-logo{width:20px;height:20px;-webkit-filter:drop-shadow(0 -1px 4px #fff);filter:drop-shadow(0 -1px 4px #fff)}.history-img{width:110px;height:156px}.settings.form .content article{margin:1em;display:inline-block;width:auto}.responsive-iframe{margin-top:1em;overflow:hidden;padding-bottom:56.25%;position:relative;height:0}.responsive-iframe iframe{left:0;top:0;height:100%;width:100%;position:absolute}.cssload-loader{position:relative;left:calc(50% - 31px);width:62px;height:62px;border-radius:50%;perspective:780px}.cssload-inner{position:absolute;width:100%;height:100%;box-sizing:border-box;border-radius:50%}.cssload-inner.cssload-one{left:0;top:0;-webkit-animation:cssload-rotate-one 1.15s linear infinite;animation:cssload-rotate-one 1.15s linear infinite;border-bottom:3px solid #000}.cssload-inner.cssload-two{right:0;top:0;-webkit-animation:cssload-rotate-two 1.15s linear infinite;animation:cssload-rotate-two 1.15s linear infinite;border-right:3px solid #000}.cssload-inner.cssload-three{right:0;bottom:0;-webkit-animation:cssload-rotate-three 1.15s linear infinite;animation:cssload-rotate-three 1.15s linear infinite;border-top:3px solid #000}@-webkit-keyframes cssload-rotate-one{0%{transform:rotateX(35deg) rotateY(-45deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(-45deg) rotate(1turn)}}@keyframes cssload-rotate-one{0%{transform:rotateX(35deg) rotateY(-45deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(-45deg) rotate(1turn)}}@-webkit-keyframes cssload-rotate-two{0%{transform:rotateX(50deg) rotateY(10deg) rotate(0deg)}to{transform:rotateX(50deg) rotateY(10deg) rotate(1turn)}}@keyframes cssload-rotate-two{0%{transform:rotateX(50deg) rotateY(10deg) rotate(0deg)}to{transform:rotateX(50deg) rotateY(10deg) rotate(1turn)}}@-webkit-keyframes cssload-rotate-three{0%{transform:rotateX(35deg) rotateY(55deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(55deg) rotate(1turn)}}@keyframes cssload-rotate-three{0%{transform:rotateX(35deg) rotateY(55deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(55deg) rotate(1turn)}}#loading-shadow{background:rgba(0,0,0,.8);z-index:500}#loading-shadow,#loading-shadow .loading-wrapper{position:fixed;top:0;left:0;width:100%;height:100%}#loading-shadow .loading-wrapper{z-index:501;display:flex;align-items:center;justify-content:center}#loading-shadow .loading-content{position:relative;color:#fff}.loading-content .cssload-inner.cssload-one,.loading-content .cssload-inner.cssload-three,.loading-content .cssload-inner.cssload-two{border-color:#fff}.tabs{display:inline-block;display:flex;flex-wrap:wrap;background:#efefef;box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin-top:1.5em}.tabs>label{border:1px solid #e5e5e5;width:100%;padding:20px 30px;background:#e5e5e5;cursor:pointer;font-weight:700;font-size:18px;color:#7f7f7f;transition:background .1s,color .1s}.tabs>label:hover{background:#d8d8d8}.tabs>label:active{background:#ccc}.tabs>[type=radio]:focus+label{box-shadow:inset 0 0 0 3px #2aa1c0;z-index:1}.tabs>[type=radio]{position:absolute;opacity:0}.tabs>[type=radio]:checked+label{border-bottom:1px solid #fff;background:#fff;color:#000}.tabs>[type=radio]:checked+label+.content{display:block}.single-tab,.tabs .content,.tabs>[type=radio]:checked+label+.content{border:1px solid #e5e5e5;border-top:0;padding:15px;background:#fff;width:100%;margin:0 auto;overflow:auto}.single-tab,.tabs .content{display:none;max-height:950px}.single-tab{display:block;border:1px solid #e5e5e5;box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin-top:1.5em}.single-tab.full-height,.tabs .content.full-height{max-height:none}@media (min-width:800px){.tabs>label{width:auto}.tabs .content{order:99}}.vertical-tabs{border:1px solid #e5e5e5;box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin:0 auto;position:relative;width:100%}.vertical-tabs input[type=radio]{position:absolute;opacity:0}.vertical-tabs .tab{align-items:center;display:inline-block;display:flex;flex-wrap:nowrap}.vertical-tabs .tab label{align-items:center;background:#e5e5e5;border:1px solid #e5e5e5;color:#7f7f7f;cursor:pointer;font-size:18px;font-weight:700;padding:0 20px;width:28%}.vertical-tabs .tab label:hover{background:#d8d8d8}.vertical-tabs .tab label:active{background:#ccc}.vertical-tabs .tab .content{display:none;border:1px solid #e5e5e5;border-left:0;border-right:0;max-height:950px;overflow:auto}.vertical-tabs .tab .content.full-height{max-height:none}.vertical-tabs [type=radio]:checked+label{border:0;background:#fff;color:#000;width:38%}.vertical-tabs [type=radio]:focus+label{box-shadow:inset 0 0 0 3px #2aa1c0;z-index:1}.vertical-tabs [type=radio]:checked~.content{display:block}@media screen and (max-width:1100px){.flex{flex-wrap:wrap}.fixed aside.info,.fixed aside.info+article,aside.info,aside.info+article{max-width:none;width:100%}}@media screen and (max-width:800px){*{max-width:none}table{box-shadow:none}.details .flex>*,body{margin:0}table,table.align-center,table .align-right,table td,table th{border:0;margin-left:auto;margin-right:auto;text-align:left;width:100%}table td{display:inline-block}table.media-details,table tbody{width:100%}table.media-details td{display:block;text-align:left!important;width:100%}table thead{display:none}.details .media-details td:nth-child(odd){font-weight:700;width:100%}table.streaming-links tr td:not(:first-child){display:none}}@media screen and (max-width:40em){nav a{line-height:4em;line-height:4rem}img,picture{width:100%}main{padding:0 .5rem .5rem}.media{margin:2px 0}.details{padding:.5rem}.tabs>[type=radio]:checked+label{background:#fff}.vertical-tabs .tab{flex-wrap:wrap}.tabs .content,.tabs>[type=radio]:checked+label+.content,.vertical-tabs .tab .content{display:block;border:0;max-height:none}.tabs>[type=radio]:checked+label,.tabs>label,.tabs>label:active,.tabs>label:hover,.vertical-tabs .tab label,.vertical-tabs .tab label:active,.vertical-tabs .tab label:hover,.vertical-tabs [type=radio]:checked+label,.vertical-tabs [type=radio]:focus+label{background:#fff;border:0;width:100%;cursor:default;color:#000}}a{color:#1978e2;text-shadow:1px 1px 1px #000;text-shadow:var(--link-shadow)}a:hover{color:#9e34fd}body,legend,nav ul li a{background:#333;color:#eee}nav a:hover,nav li.selected a{border-color:#fff}header button{background:transparent}table{box-shadow:none}td,th{border-color:#111}thead td,thead th{background:#333;color:#eee}tbody>tr:nth-child(2n){background:#555;color:#eee}tbody>tr:nth-child(odd){background:#333}footer,hr,legend{border-color:#ddd}small{color:#fff}input,input[type],select,textarea{border-color:#bbb;color:#bbb;background:#333;padding:.8em}button{background:#444;background:linear-gradient(#666,#555,#444,#555,#666);border-radius:.5em;margin:0;text-transform:none}button,button:hover{border-color:#ddd;color:#ddd}button:hover{background:#222;background:linear-gradient(#444,#333,#222,#333,#444)}button:active{background:#333;background:linear-gradient(#333,#333)}.media:hover button{background:linear-gradient(#666,#555,#444,#555,#666)}.media:hover button:hover{background:linear-gradient(#444,#555,#666,#555,#444)}.message,.static-message{text-shadow:1px 1px 1px #fff;text-shadow:var(--white-link-shadow)}.message.success,.static-message.success{background:#1f8454;border-color:#70dda9}.message.error,.static-message.error{border-color:#f3e6e6;background:#924949}.message.info,.static-message.info{border-color:#ffc;background:#bfbe3a}.invisible tbody>tr:nth-child(2n),.invisible tbody>tr:nth-child(odd),.invisible td,.invisible th,.invisible tr{background:transparent}#main-nav{border-bottom:.1rem solid #ddd}.tabs,.vertical-tabs{background:#333}.tabs>label,.vertical-tabs .tab label{background:#222;border:0;color:#eee}.vertical-tabs .tab label{width:100%}.tabs>label:hover,.vertical-tabs .tab>label:hover{background:#888}.tabs>label:active,.vertical-tabs .tab>label:active{background:#999}.single-tab,.tabs>[type=radio]:checked+label,.tabs>[type=radio]:checked+label+.content,.vertical-tabs [type=radio]:checked+label,.vertical-tabs [type=radio]:checked~.content{border:0;background:#666;color:#eee}.vertical-tabs{background:#222;border:1px solid #444}.vertical-tabs .tab{background:#666;border-bottom:1px solid #444}.streaming-logo{-webkit-filter:drop-shadow(0 0 2px #fff);filter:drop-shadow(0 0 2px #fff)} \ No newline at end of file +:root{--default-font-list:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;--monospace-font-list:"Anonymous Pro","Fira Code",Menlo,Monaco,Consolas,"Courier New",monospace;--serif-font-list:Georgia,Times,"Times New Roman",serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;box-sizing:border-box;cursor:default;font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);line-height:1.4;overflow-y:scroll;-moz-text-size-adjust:100%;text-size-adjust:100%;scroll-behavior:smooth}audio:not([controls]){display:none}details{display:block}input[type=search]{-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}main{margin:0 auto;padding:0 1.6rem 1.6rem}main,pre,summary{display:block}pre{background:#efefef;color:#444;font-family:Anonymous Pro,Fira Code,Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--monospace-font-list);font-size:1.4em;font-size:1.4rem;margin:1.6rem 0;overflow:auto;padding:1.6rem;word-break:break-all;word-wrap:break-word}progress{display:inline-block}small{color:#777;font-size:75%}big{font-size:125%}template{display:none}textarea{border:.1rem solid #ccc;border-radius:0;display:block;margin-bottom:.8rem;overflow:auto;padding:.8rem;resize:vertical;vertical-align:middle}[hidden]{display:none}[unselectable]{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}*,:after,:before{box-sizing:inherit}*{font-size:inherit;line-height:inherit;margin:0;padding:0}:after,:before{text-decoration:inherit;vertical-align:inherit}a{-webkit-transition:.25s ease;color:#1271db;text-decoration:none;transition:.25s ease}audio,canvas,iframe,img,svg,video{vertical-align:middle}input,textarea{border:.1rem solid #ccc;color:inherit;font-family:inherit;font-style:inherit;font-weight:inherit;min-height:1.4em}code,kbd,pre,samp{font-family:Anonymous Pro,Fira Code,Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--monospace-font-list)}table{border-collapse:collapse;border-spacing:0;margin-bottom:1.6rem}::-moz-selection{background-color:#b3d4fc;text-shadow:none}::selection{background-color:#b3d4fc;text-shadow:none}button::-moz-focus-inner{border:0}body{color:#444;font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);font-size:1.6rem;font-style:normal;font-weight:400;padding:0}p{margin:0 0 1.6rem}h1,h2,h3,h4,h5,h6{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);margin:2rem 0 1.6rem}h1{border-bottom:.1rem solid rgba(0,0,0,.2);font-size:3.6em;font-size:3.6rem}h1,h2{font-style:normal;font-weight:500}h2{font-size:3em;font-size:3rem}h3{font-size:2.4em;font-size:2.4rem;font-style:normal;font-weight:500;margin:1.6rem 0 .4rem}h4{font-size:1.8em;font-size:1.8rem}h4,h5{font-style:normal;font-weight:600;margin:1.6rem 0 .4rem}h5{font-size:1.6em;font-size:1.6rem}h6{color:#777;font-size:1.4em;font-style:normal;font-weight:600;margin:1.6rem 0 .4rem}code,h6{font-size:1.4rem}code{background:#efefef;color:#444;font-family:Anonymous Pro,Fira Code,Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--monospace-font-list);word-break:break-all;word-wrap:break-word}a:focus,a:hover{text-decoration:none}dl{margin-bottom:1.6rem}dd{margin-left:4rem}ol,ul{margin-bottom:.8rem;padding-left:2rem}blockquote{border-left:.2rem solid #1271db;font-style:italic;margin:1.6rem 0;padding-left:1.6rem}blockquote,figcaption{font-family:Georgia,Times,Times New Roman,serif;font-family:var(--serif-font-list)}html{font-size:62.5%}article,aside,details,footer,header,main,section,summary{display:block;height:auto;margin:0 auto;width:100%}footer{clear:both;display:inline-block;float:left;max-width:100%;padding:1rem 0;text-align:center}footer,hr{border-top:.1rem solid rgba(0,0,0,.2)}hr{display:block;margin-bottom:1.6rem;width:100%}img{height:auto;vertical-align:baseline}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{border:.1rem solid #ccc;border-radius:0;display:inline-block;padding:.8rem;vertical-align:middle}input:not([type]){-webkit-appearance:none;background-clip:padding-box;background-color:#fff;border:.1rem solid #ccc;border-radius:0;color:#444;display:inline-block;padding:.8rem;text-align:left}input[type=color]{padding:.8rem 1.6rem}input:not([type]):focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,textarea:focus{border-color:#b3d4fc}input[type=checkbox],input[type=radio]{vertical-align:middle}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:.1rem thin solid #444}input:not([type])[disabled],input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled],textarea[disabled]{background-color:#efefef;color:#777;cursor:not-allowed}input[readonly],textarea[readonly]{background-color:#efefef;border-color:#ccc;color:#777}input:focus:invalid,textarea:focus:invalid{border-color:#e9322d;color:#b94a48}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#ff4136}select[multiple]{height:auto}label{line-height:2}fieldset{border:0;margin:0;padding:.8rem 0}legend{border-bottom:.1rem solid #ccc;color:#444;display:block;margin-bottom:.8rem;padding:.8rem 0;width:100%}button,input[type=submit]{-moz-user-select:none;-ms-user-select:none;-webkit-transition:.25s ease;-webkit-user-drag:none;-webkit-user-select:none;border:.2rem solid #444;border-radius:0;color:#444;cursor:pointer;display:inline-block;margin-bottom:.8rem;margin-right:.4rem;padding:.8rem 1.6rem;text-align:center;text-decoration:none;text-transform:uppercase;transition:.25s ease;user-select:none;vertical-align:baseline}button a,input[type=submit] a{color:#444}button::-moz-focus-inner,input[type=submit]::-moz-focus-inner{padding:0}button:hover,input[type=submit]:hover{background:#444;border-color:#444;color:#fff}button:hover a,input[type=submit]:hover a{color:#fff}button:active,input[type=submit]:active{background:#6a6a6a;border-color:#6a6a6a;color:#fff}button:active a,input[type=submit]:active a{color:#fff}button:disabled,input[type=submit]:disabled{box-shadow:none;cursor:not-allowed;opacity:.4}nav ul{list-style:none;margin:0;padding:0;text-align:center}nav ul li{display:inline}nav a{-webkit-transition:.25s ease;border-bottom:.2rem solid transparent;color:#444;padding:.8rem 1.6rem;text-decoration:none;transition:.25s ease}nav a:hover,nav li.selected a{border-color:rgba(0,0,0,.2)}nav a:active{border-color:rgba(0,0,0,.56)}caption{padding:.8rem 0}thead th{background:#efefef;color:#444}tr{background:#fff;margin-bottom:.8rem}td,th{border:.1rem solid #ccc;padding:.8rem 1.6rem;text-align:center;vertical-align:inherit}tfoot tr{background:none}tfoot td{color:#efefef;font-size:.8rem;font-style:italic;padding:1.6rem .4rem}@media screen{[hidden~=screen]{display:inherit}[hidden~=screen]:not(:active):not(:focus):not(:target){clip:rect(0)!important;position:absolute!important}}@media screen and max-width 40rem{article,aside,section{clear:both;display:block;max-width:100%}img{margin-right:1.6rem}}:root{--blue-link:#1271db;--link-shadow:1px 1px 1px #000;--white-link-shadow:1px 1px 1px #fff;--shadow:2px 2px 2px #000;--title-overlay:rgba(0,0,0,0.45);--title-overlay-fallback:#000;--text-color:#fff;--normal-padding:0.25em 0.125em;--link-hover-color:#7d12db;--edit-link-hover-color:#db7d12;--edit-link-color:#12db18;--radius:5px}.media[hidden],[hidden=hidden],template{display:none}body{margin:.5em}button{background:#fff;background:linear-gradient(#ddd,#eee,#fff,#eee,#ddd)}button,button:hover{border-color:#555;color:#555}button:hover{background:#bbb;background:linear-gradient(#cfcfcf,#dfdfdf,#efefef,#dfdfdf,#cfcfcf)}button:active{background:#ddd;background:linear-gradient(#ddd,#ddd)}.media:hover button{background:linear-gradient(#bbb,#ccc,#ddd,#ccc,#bbb)}.media:hover button:hover{background:linear-gradient(#afafaf,#bfbfbf,#cfcfcf,#bfbfbf,#afafaf)}table{box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin:0 auto}td{padding:1rem}thead td,thead th{padding:.5rem}input[type=number]{min-width:0;width:4.5em}input[type=checkbox],input[type=radio]{min-width:auto;vertical-align:inherit}input,textarea{min-width:30em;min-width:30rem}tbody>tr:nth-child(odd){background:#ddd}a:active,a:hover{color:#7d12db;color:var(--link-hover-color)}iframe{display:block;margin:0 auto;border:0}.bracketed{color:#12db18;color:var(--edit-link-color)}#main-nav a,.bracketed{text-shadow:1px 1px 1px #000;text-shadow:var(--link-shadow)}.bracketed:before{content:"[\00a0"}.bracketed:after{content:"\00a0]"}.bracketed:active,.bracketed:hover{color:#db7d12;color:var(--edit-link-hover-color)}.grow-1{flex-grow:1}.flex-wrap{flex-wrap:wrap}.flex-no-wrap{flex-wrap:nowrap}.flex-align-start{align-content:flex-start}.flex-align-end{align-items:flex-end}.flex-align-space-around{align-content:space-around}.flex-justify-start{justify-content:flex-start}.flex-justify-space-around{justify-content:space-around}.flex-center{justify-content:center}.flex-self-center{align-self:center}.flex-space-evenly{justify-content:space-evenly}.flex{display:inline-block;display:flex}.small-font{font-size:1.6rem}.justify{text-align:justify}.align-center{text-align:center!important}.align-left{text-align:left!important}.align-right{text-align:right!important}.valign-top{vertical-align:top}.no-border{border:none}.media-wrap{text-align:center;margin:0 auto;position:relative}.media-wrap-flex{display:inline-block;display:flex;flex-wrap:wrap;align-content:space-evenly;justify-content:space-between;position:relative}td .media-wrap-flex{justify-content:center}.danger{background-color:#ff4136;border-color:#924949;color:#924949}.danger:active,.danger:hover{background-color:#924949;border-color:#ff4136;color:#ff4136}td.danger,td.danger:active,td.danger:hover{background-color:transparent;color:#924949}.user-btn{background:transparent;border-color:#12db18;border-color:var(--edit-link-color);color:#12db18;color:var(--edit-link-color);text-shadow:1px 1px 1px #000;text-shadow:var(--link-shadow);padding:0 .5rem}.user-btn:active,.user-btn:hover{background:transparent;border-color:#db7d12;border-color:var(--edit-link-hover-color);color:#db7d12;color:var(--edit-link-hover-color)}.user-btn:active{background:#db7d12;background:var(--edit-link-hover-color);color:#fff}.full-width{width:100%}.full-height{max-height:none}.toph{margin-top:0}#main-nav{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);margin:2rem 0 1.6rem;border-bottom:.1rem solid rgba(0,0,0,.2);font-size:3.6em;font-size:3.6rem;font-style:normal;font-weight:500}.sorting,.sorting-asc,.sorting-desc{vertical-align:text-bottom}.sorting:before{content:" ↕\00a0"}.sorting-asc:before{content:" ↑\00a0"}.sorting-desc:before{content:" ↓\00a0"}.form thead th,.form thead tr{background:inherit;border:0}.form tr>td:nth-child(odd){text-align:right;min-width:25px;max-width:30%}.form tr>td:nth-child(2n){text-align:left}.invisible tbody>tr:nth-child(odd){background:inherit}.borderless,.borderless td,.borderless th,.borderless tr,.invisible td,.invisible th,.invisible tr{box-shadow:none;border:0}.message,.static-message{position:relative;margin:.5em auto;padding:.5em;width:95%}.message .close{width:1em;height:1em;position:absolute;right:.5em;top:.5em;text-align:center;vertical-align:middle;line-height:1em}.message:hover .close:after{content:"☒"}.message:hover{cursor:pointer}.message .icon{left:.5em;top:.5em;margin-right:1em}.message.error,.static-message.error{border:1px solid #924949;background:#f3e6e6}.message.error .icon:after{content:"✘"}.message.success,.static-message.success{border:1px solid #1f8454;background:#70dda9}.message.success .icon:after{content:"✔"}.message.info,.static-message.info{border:1px solid #bfbe3a;background:#ffc}.message.info .icon:after{content:"⚠"}.character,.media,.small-character{position:relative;vertical-align:top;display:inline-block;text-align:center;width:220px;height:312px;margin:.25em .125em;margin:var(--normal-padding);z-index:0;background:rgba(0,0,0,.15)}.details picture.cover,picture.cover{display:inline;display:initial;width:100%}.character>img,.media>img,.small-character>img{width:100%}.media .edit-buttons>button{margin:.5em auto}.media-metadata>div,.medium-metadata>div,.name,.row{text-shadow:2px 2px 2px #000;text-shadow:var(--shadow);color:#fff;color:var(--text-color);padding:.25em .125em;padding:var(--normal-padding);text-align:right;z-index:2}.age-rating,.media-type{text-align:left}.media>.media-metadata{position:absolute;bottom:0;right:0}.media>.medium-metadata{position:absolute;bottom:0;left:0}.media>.name{position:absolute;top:0}.media>.name a{display:inline-block;transition:none}.media .name a:before{content:"";display:block;height:312px;left:0;position:absolute;top:0;width:220px;z-index:-1}.media-list .media:hover .name a:before{background:rgba(0,0,0,.75)}.media>.name span.canonical{font-weight:700}.media>.name small{font-weight:400}.media:hover .name{background:rgba(0,0,0,.75)}.media-list .media>.name a:hover,.media-list .media>.name a:hover small{color:#1271db;color:var(--blue-link)}.media:hover>.edit-buttons[hidden],.media:hover>button[hidden]{transition:.25s ease;display:block}.media:hover{transition:.25s ease}.character>.name a,.character>.name a small,.media>.name a,.media>.name a small,.small-character>.name a,.small-character>.name a small{background:none;color:#fff;text-shadow:2px 2px 2px #000;text-shadow:var(--shadow)}.anime .name,.manga .name{background:#000;background:var(--title-overlay-fallback);background:rgba(0,0,0,.45);background:var(--title-overlay);text-align:center;width:100%;padding:.5em .25em}.anime .age-rating,.anime .airing-status,.anime .completion,.anime .delete,.anime .edit,.anime .media-type,.anime .user-rating{background:none;text-align:center}.anime .table,.manga .table{position:absolute;bottom:0;left:0;width:100%}.anime .row,.manga .row{width:100%;display:inline-block;display:flex;align-content:space-around;justify-content:space-around;text-align:center;padding:0 inherit}.anime .row>span,.manga .row>span{text-align:left;z-index:2}.anime .row>div,.manga .row>div{font-size:.8em;display:inline-block;display:flex-item;align-self:center;text-align:center;vertical-align:middle;z-index:2}.anime .media>button.plus-one{border-color:hsla(0,0%,100%,.65);position:absolute;top:138px;top:calc(50% - 21.2px);left:44px;left:calc(50% - 57.8px);z-index:50}.manga .row{padding:1px}.manga .media{height:310px;margin:.25em}.manga .media>.edit-buttons{position:absolute;top:86px;top:calc(50% - 21.2px);left:43.5px;left:calc(50% - 57.8px);z-index:40}.manga .media>.edit-buttons button{border-color:hsla(0,0%,100%,.65)}.media.search>.name{background-color:#555;background-color:rgba(0,0,0,.35);background-size:cover;background-size:contain;background-repeat:no-repeat}.media.search>.row{z-index:6}.big-check,.mal-check{display:none}.big-check:checked+label{transition:.25s ease;background:rgba(0,0,0,.75)}.big-check:checked+label:after{content:"✓";font-size:15em;font-size:15rem;text-align:center;color:#adff2f;position:absolute;top:147px;left:0;width:100%;z-index:5}#series-list article.media{position:relative}#series-list .name,#series-list .name label{position:absolute;display:block;top:0;left:0;height:100%;width:100%;vertical-align:middle;line-height:1.25em}#series-list .name small{color:#fff}.details{margin:1.5rem auto 0;padding:1rem;font-size:inherit}.fixed{max-width:115em;max-width:115rem;margin:0 auto}.details .cover{display:block}.details .flex>*{margin:1rem}.details .media-details td{padding:0 1.5rem}.details p{text-align:justify}.details .media-details td:nth-child(odd){width:1%;white-space:nowrap;text-align:right}.details .media-details td:nth-child(2n){text-align:left}.details a h1,.details a h2{margin-top:0}.character,.person,.small-character{width:225px;height:350px;vertical-align:middle;white-space:nowrap;position:relative}.person{width:225px;height:338px}.small-person{width:200px;height:300px}.character a{height:350px}.character:hover .name,.small-character:hover .name{background:rgba(0,0,0,.8)}.small-character a{display:inline-block;width:100%;height:100%}.character .name,.small-character .name{position:absolute;bottom:0;left:0;z-index:10}.character img,.character picture,.person img,.person picture,.small-character img,.small-character picture{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:5;max-height:350px;max-width:225px}.person img,.person picture{max-height:338px}.small-person img,.small-person picture{max-height:300px;max-width:200px}.min-table{min-width:0;margin-left:0}.max-table{min-width:100%;margin:0}aside.info{max-width:33%}.fixed aside{max-width:390px}aside img,aside picture{display:block;margin:0 auto}.small-character{width:160px;height:250px}.small-character img,.small-character picture{max-height:250px;max-width:160px}.user-page .media-wrap{text-align:left}.media a{display:inline-block;width:100%;height:100%}.streaming-logo{width:50px;height:50px;vertical-align:middle}.small-streaming-logo{width:25px;height:25px;vertical-align:middle}.cover-streaming-link{display:none}.media:hover .cover-streaming-link{display:block}.cover-streaming-link .streaming-logo{width:20px;height:20px;filter:drop-shadow(0 -1px 4px #fff)}.history-img{width:110px;height:156px}.settings.form .content article{margin:1em;display:inline-block;width:auto}.responsive-iframe{margin-top:1em;overflow:hidden;padding-bottom:56.25%;position:relative;height:0}.responsive-iframe iframe{left:0;top:0;height:100%;width:100%;position:absolute}.cssload-loader{position:relative;left:calc(50% - 31px);width:62px;height:62px;border-radius:50%;perspective:780px}.cssload-inner{position:absolute;width:100%;height:100%;box-sizing:border-box;border-radius:50%}.cssload-inner.cssload-one{left:0;top:0;-webkit-animation:cssload-rotate-one 1.15s linear infinite;animation:cssload-rotate-one 1.15s linear infinite;border-bottom:3px solid #000}.cssload-inner.cssload-two{right:0;top:0;-webkit-animation:cssload-rotate-two 1.15s linear infinite;animation:cssload-rotate-two 1.15s linear infinite;border-right:3px solid #000}.cssload-inner.cssload-three{right:0;bottom:0;-webkit-animation:cssload-rotate-three 1.15s linear infinite;animation:cssload-rotate-three 1.15s linear infinite;border-top:3px solid #000}@-webkit-keyframes cssload-rotate-one{0%{transform:rotateX(35deg) rotateY(-45deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(-45deg) rotate(1turn)}}@keyframes cssload-rotate-one{0%{transform:rotateX(35deg) rotateY(-45deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(-45deg) rotate(1turn)}}@-webkit-keyframes cssload-rotate-two{0%{transform:rotateX(50deg) rotateY(10deg) rotate(0deg)}to{transform:rotateX(50deg) rotateY(10deg) rotate(1turn)}}@keyframes cssload-rotate-two{0%{transform:rotateX(50deg) rotateY(10deg) rotate(0deg)}to{transform:rotateX(50deg) rotateY(10deg) rotate(1turn)}}@-webkit-keyframes cssload-rotate-three{0%{transform:rotateX(35deg) rotateY(55deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(55deg) rotate(1turn)}}@keyframes cssload-rotate-three{0%{transform:rotateX(35deg) rotateY(55deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(55deg) rotate(1turn)}}#loading-shadow{background:rgba(0,0,0,.8);z-index:500}#loading-shadow,#loading-shadow .loading-wrapper{position:fixed;top:0;left:0;width:100%;height:100%}#loading-shadow .loading-wrapper{z-index:501;display:flex;align-items:center;justify-content:center}#loading-shadow .loading-content{position:relative;color:#fff}.loading-content .cssload-inner.cssload-one,.loading-content .cssload-inner.cssload-three,.loading-content .cssload-inner.cssload-two{border-color:#fff}.tabs{display:inline-block;display:flex;flex-wrap:wrap;background:#efefef;box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin-top:1.5em}.tabs>label{border:1px solid #e5e5e5;width:100%;padding:20px 30px;background:#e5e5e5;cursor:pointer;font-weight:700;font-size:18px;color:#7f7f7f;transition:background .1s,color .1s}.tabs>label:hover{background:#d8d8d8}.tabs>label:active{background:#ccc}.tabs>[type=radio]:focus+label{box-shadow:inset 0 0 0 3px #2aa1c0;z-index:1}.tabs>[type=radio]{position:absolute;opacity:0}.tabs>[type=radio]:checked+label{border-bottom:1px solid #fff;background:#fff;color:#000}.tabs>[type=radio]:checked+label+.content{display:block}.single-tab,.tabs .content,.tabs>[type=radio]:checked+label+.content{border:1px solid #e5e5e5;border-top:0;padding:15px;background:#fff;width:100%;margin:0 auto;overflow:auto}.single-tab,.tabs .content{display:none;max-height:950px}.single-tab{display:block;border:1px solid #e5e5e5;box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin-top:1.5em}.single-tab.full-height,.tabs .content.full-height{max-height:none}@media (min-width:800px){.tabs>label{width:auto}.tabs .content{order:99}}.vertical-tabs{border:1px solid #e5e5e5;box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin:0 auto;position:relative;width:100%}.vertical-tabs input[type=radio]{position:absolute;opacity:0}.vertical-tabs .tab{align-items:center;display:inline-block;display:flex;flex-wrap:nowrap}.vertical-tabs .tab label{align-items:center;background:#e5e5e5;border:1px solid #e5e5e5;color:#7f7f7f;cursor:pointer;font-size:18px;font-weight:700;padding:0 20px;width:28%}.vertical-tabs .tab label:hover{background:#d8d8d8}.vertical-tabs .tab label:active{background:#ccc}.vertical-tabs .tab .content{display:none;border:1px solid #e5e5e5;border-left:0;border-right:0;max-height:950px;overflow:auto}.vertical-tabs .tab .content.full-height{max-height:none}.vertical-tabs [type=radio]:checked+label{border:0;background:#fff;color:#000;width:38%}.vertical-tabs [type=radio]:focus+label{box-shadow:inset 0 0 0 3px #2aa1c0;z-index:1}.vertical-tabs [type=radio]:checked~.content{display:block}@media screen and (max-width:1100px){.flex{flex-wrap:wrap}.fixed aside.info,.fixed aside.info+article,aside.info,aside.info+article{max-width:none;width:100%}}@media screen and (max-width:800px){*{max-width:none}table{box-shadow:none}.details .flex>*,body{margin:0}table,table.align-center,table .align-right,table td,table th{border:0;margin-left:auto;margin-right:auto;text-align:left;width:100%}table td{display:inline-block}table.media-details,table tbody{width:100%}table.media-details td{display:block;text-align:left!important;width:100%}table thead{display:none}.details .media-details td:nth-child(odd){font-weight:700;width:100%}table.streaming-links tr td:not(:first-child){display:none}}@media screen and (max-width:40em){nav a{line-height:4em;line-height:4rem}img,picture{width:100%}main{padding:0 .5rem .5rem}.media{margin:2px 0}.details{padding:.5rem}.tabs>[type=radio]:checked+label{background:#fff}.vertical-tabs .tab{flex-wrap:wrap}.tabs .content,.tabs>[type=radio]:checked+label+.content,.vertical-tabs .tab .content{display:block;border:0;max-height:none}.tabs>[type=radio]:checked+label,.tabs>label,.tabs>label:active,.tabs>label:hover,.vertical-tabs .tab label,.vertical-tabs .tab label:active,.vertical-tabs .tab label:hover,.vertical-tabs [type=radio]:checked+label,.vertical-tabs [type=radio]:focus+label{background:#fff;border:0;width:100%;cursor:default;color:#000}}a{color:#1978e2;text-shadow:1px 1px 1px #000;text-shadow:var(--link-shadow)}a:hover{color:#9e34fd}body,legend,nav ul li a{background:#333;color:#eee}nav a:hover,nav li.selected a{border-color:#fff}header button{background:transparent}table{box-shadow:none}td,th{border-color:#111}thead td,thead th{background:#333;color:#eee}tbody>tr:nth-child(2n){background:#555;color:#eee}tbody>tr:nth-child(odd){background:#333}footer,hr,legend{border-color:#ddd}small{color:#fff}input,input[type],select,textarea{border-color:#bbb;color:#bbb;background:#333;padding:.8em}button{background:#444;background:linear-gradient(#666,#555,#444,#555,#666);border-radius:.5em;margin:0;text-transform:none}button,button:hover{border-color:#ddd;color:#ddd}button:hover{background:#222;background:linear-gradient(#444,#333,#222,#333,#444)}button:active{background:#333;background:linear-gradient(#333,#333)}.media:hover button{background:linear-gradient(#666,#555,#444,#555,#666)}.media:hover button:hover{background:linear-gradient(#444,#555,#666,#555,#444)}.message,.static-message{text-shadow:1px 1px 1px #fff;text-shadow:var(--white-link-shadow)}.message.success,.static-message.success{background:#1f8454;border-color:#70dda9}.message.error,.static-message.error{border-color:#f3e6e6;background:#924949}.message.info,.static-message.info{border-color:#ffc;background:#bfbe3a}.invisible tbody>tr:nth-child(2n),.invisible tbody>tr:nth-child(odd),.invisible td,.invisible th,.invisible tr{background:transparent}#main-nav{border-bottom:.1rem solid #ddd}.tabs,.vertical-tabs{background:#333}.tabs>label,.vertical-tabs .tab label{background:#222;border:0;color:#eee}.vertical-tabs .tab label{width:100%}.tabs>label:hover,.vertical-tabs .tab>label:hover{background:#888}.tabs>label:active,.vertical-tabs .tab>label:active{background:#999}.single-tab,.tabs>[type=radio]:checked+label,.tabs>[type=radio]:checked+label+.content,.vertical-tabs [type=radio]:checked+label,.vertical-tabs [type=radio]:checked~.content{border:0;background:#666;color:#eee}.vertical-tabs{background:#222;border:1px solid #444}.vertical-tabs .tab{background:#666;border-bottom:1px solid #444}.streaming-logo{filter:drop-shadow(0 0 2px #fff)} \ No newline at end of file diff --git a/public/css/light.min.css b/public/css/light.min.css index 78163a04..9496f9ea 100644 --- a/public/css/light.min.css +++ b/public/css/light.min.css @@ -1 +1 @@ -:root{--default-font-list:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;--monospace-font-list:"Anonymous Pro","Fira Code",Menlo,Monaco,Consolas,"Courier New",monospace;--serif-font-list:Georgia,Times,"Times New Roman",serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;box-sizing:border-box;cursor:default;font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);line-height:1.4;overflow-y:scroll;-moz-text-size-adjust:100%;text-size-adjust:100%;scroll-behavior:smooth}audio:not([controls]){display:none}details{display:block}input[type=search]{-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}main{margin:0 auto;padding:0 1.6rem 1.6rem}main,pre,summary{display:block}pre{background:#efefef;color:#444;font-family:Anonymous Pro,Fira Code,Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--monospace-font-list);font-size:1.4em;font-size:1.4rem;margin:1.6rem 0;overflow:auto;padding:1.6rem;word-break:break-all;word-wrap:break-word}progress{display:inline-block}small{color:#777;font-size:75%}big{font-size:125%}template{display:none}textarea{border:.1rem solid #ccc;border-radius:0;display:block;margin-bottom:.8rem;overflow:auto;padding:.8rem;resize:vertical;vertical-align:middle}[hidden]{display:none}[unselectable]{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}*,:after,:before{box-sizing:inherit}*{font-size:inherit;line-height:inherit;margin:0;padding:0}:after,:before{text-decoration:inherit;vertical-align:inherit}a{-webkit-transition:.25s ease;color:#1271db;text-decoration:none;transition:.25s ease}audio,canvas,iframe,img,svg,video{vertical-align:middle}input,textarea{border:.1rem solid #ccc;color:inherit;font-family:inherit;font-style:inherit;font-weight:inherit;min-height:1.4em}code,kbd,pre,samp{font-family:Anonymous Pro,Fira Code,Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--monospace-font-list)}table{border-collapse:collapse;border-spacing:0;margin-bottom:1.6rem}::-moz-selection{background-color:#b3d4fc;text-shadow:none}::selection{background-color:#b3d4fc;text-shadow:none}button::-moz-focus-inner{border:0}body{color:#444;font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);font-size:1.6rem;font-style:normal;font-weight:400;padding:0}p{margin:0 0 1.6rem}h1,h2,h3,h4,h5,h6{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);margin:2rem 0 1.6rem}h1{border-bottom:.1rem solid rgba(0,0,0,.2);font-size:3.6em;font-size:3.6rem}h1,h2{font-style:normal;font-weight:500}h2{font-size:3em;font-size:3rem}h3{font-size:2.4em;font-size:2.4rem;font-style:normal;font-weight:500;margin:1.6rem 0 .4rem}h4{font-size:1.8em;font-size:1.8rem}h4,h5{font-style:normal;font-weight:600;margin:1.6rem 0 .4rem}h5{font-size:1.6em;font-size:1.6rem}h6{color:#777;font-size:1.4em;font-style:normal;font-weight:600;margin:1.6rem 0 .4rem}code,h6{font-size:1.4rem}code{background:#efefef;color:#444;font-family:Anonymous Pro,Fira Code,Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--monospace-font-list);word-break:break-all;word-wrap:break-word}a:focus,a:hover{text-decoration:none}dl{margin-bottom:1.6rem}dd{margin-left:4rem}ol,ul{margin-bottom:.8rem;padding-left:2rem}blockquote{border-left:.2rem solid #1271db;font-style:italic;margin:1.6rem 0;padding-left:1.6rem}blockquote,figcaption{font-family:Georgia,Times,Times New Roman,serif;font-family:var(--serif-font-list)}html{font-size:62.5%}article,aside,details,footer,header,main,section,summary{display:block;height:auto;margin:0 auto;width:100%}footer{clear:both;display:inline-block;float:left;max-width:100%;padding:1rem 0;text-align:center}footer,hr{border-top:.1rem solid rgba(0,0,0,.2)}hr{display:block;margin-bottom:1.6rem;width:100%}img{height:auto;vertical-align:baseline}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{border:.1rem solid #ccc;border-radius:0;display:inline-block;padding:.8rem;vertical-align:middle}input:not([type]){-webkit-appearance:none;background-clip:padding-box;background-color:#fff;border:.1rem solid #ccc;border-radius:0;color:#444;display:inline-block;padding:.8rem;text-align:left}input[type=color]{padding:.8rem 1.6rem}input:not([type]):focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,textarea:focus{border-color:#b3d4fc}input[type=checkbox],input[type=radio]{vertical-align:middle}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:.1rem thin solid #444}input:not([type])[disabled],input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled],textarea[disabled]{background-color:#efefef;color:#777;cursor:not-allowed}input[readonly],textarea[readonly]{background-color:#efefef;border-color:#ccc;color:#777}input:focus:invalid,textarea:focus:invalid{border-color:#e9322d;color:#b94a48}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#ff4136}select[multiple]{height:auto}label{line-height:2}fieldset{border:0;margin:0;padding:.8rem 0}legend{border-bottom:.1rem solid #ccc;color:#444;display:block;margin-bottom:.8rem;padding:.8rem 0;width:100%}button,input[type=submit]{-moz-user-select:none;-ms-user-select:none;-webkit-transition:.25s ease;-webkit-user-drag:none;-webkit-user-select:none;border:.2rem solid #444;border-radius:0;color:#444;cursor:pointer;display:inline-block;margin-bottom:.8rem;margin-right:.4rem;padding:.8rem 1.6rem;text-align:center;text-decoration:none;text-transform:uppercase;transition:.25s ease;user-select:none;vertical-align:baseline}button a,input[type=submit] a{color:#444}button::-moz-focus-inner,input[type=submit]::-moz-focus-inner{padding:0}button:hover,input[type=submit]:hover{background:#444;border-color:#444;color:#fff}button:hover a,input[type=submit]:hover a{color:#fff}button:active,input[type=submit]:active{background:#6a6a6a;border-color:#6a6a6a;color:#fff}button:active a,input[type=submit]:active a{color:#fff}button:disabled,input[type=submit]:disabled{box-shadow:none;cursor:not-allowed;opacity:.4}nav ul{list-style:none;margin:0;padding:0;text-align:center}nav ul li{display:inline}nav a{-webkit-transition:.25s ease;border-bottom:.2rem solid transparent;color:#444;padding:.8rem 1.6rem;text-decoration:none;transition:.25s ease}nav a:hover,nav li.selected a{border-color:rgba(0,0,0,.2)}nav a:active{border-color:rgba(0,0,0,.56)}caption{padding:.8rem 0}thead th{background:#efefef;color:#444}tr{background:#fff;margin-bottom:.8rem}td,th{border:.1rem solid #ccc;padding:.8rem 1.6rem;text-align:center;vertical-align:inherit}tfoot tr{background:none}tfoot td{color:#efefef;font-size:.8rem;font-style:italic;padding:1.6rem .4rem}@media screen{[hidden~=screen]{display:inherit}[hidden~=screen]:not(:active):not(:focus):not(:target){clip:rect(0)!important;position:absolute!important}}@media screen and max-width 40rem{article,aside,section{clear:both;display:block;max-width:100%}img{margin-right:1.6rem}}:root{--blue-link:#1271db;--link-shadow:1px 1px 1px #000;--white-link-shadow:1px 1px 1px #fff;--shadow:2px 2px 2px #000;--title-overlay:rgba(0,0,0,0.45);--title-overlay-fallback:#000;--text-color:#fff;--normal-padding:0.25em 0.125em;--link-hover-color:#7d12db;--edit-link-hover-color:#db7d12;--edit-link-color:#12db18;--radius:5px}.media[hidden],[hidden=hidden],template{display:none}body{margin:.5em}button{background:#fff;background:linear-gradient(#ddd,#eee,#fff,#eee,#ddd);border-radius:.5em;margin:0;text-transform:none}button,button:hover{border-color:#555;color:#555}button:hover{background:#bbb;background:linear-gradient(#cfcfcf,#dfdfdf,#efefef,#dfdfdf,#cfcfcf)}button:active{background:#ddd;background:linear-gradient(#ddd,#ddd)}.media:hover button{background:linear-gradient(#bbb,#ccc,#ddd,#ccc,#bbb)}.media:hover button:hover{background:linear-gradient(#afafaf,#bfbfbf,#cfcfcf,#bfbfbf,#afafaf)}table{box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin:0 auto}td{padding:1rem}thead td,thead th{padding:.5rem}input[type=number]{min-width:0;width:4.5em}input[type=checkbox],input[type=radio]{min-width:auto;vertical-align:inherit}input,textarea{min-width:30em;min-width:30rem}tbody>tr:nth-child(odd){background:#ddd}a:active,a:hover{color:#7d12db;color:var(--link-hover-color)}iframe{display:block;margin:0 auto;border:0}.bracketed{color:#12db18;color:var(--edit-link-color)}#main-nav a,.bracketed{text-shadow:1px 1px 1px #000;text-shadow:var(--link-shadow)}.bracketed:before{content:"[\00a0"}.bracketed:after{content:"\00a0]"}.bracketed:active,.bracketed:hover{color:#db7d12;color:var(--edit-link-hover-color)}.grow-1{flex-grow:1}.flex-wrap{flex-wrap:wrap}.flex-no-wrap{flex-wrap:nowrap}.flex-align-start{align-content:flex-start}.flex-align-end{align-items:flex-end}.flex-align-space-around{align-content:space-around}.flex-justify-start{justify-content:flex-start}.flex-justify-space-around{justify-content:space-around}.flex-center{justify-content:center}.flex-self-center{align-self:center}.flex-space-evenly{justify-content:space-evenly}.flex{display:inline-block;display:flex}.small-font{font-size:1.6rem}.justify{text-align:justify}.align-center{text-align:center!important}.align-left{text-align:left!important}.align-right{text-align:right!important}.valign-top{vertical-align:top}.no-border{border:none}.media-wrap{text-align:center;margin:0 auto;position:relative}.media-wrap-flex{display:inline-block;display:flex;flex-wrap:wrap;align-content:space-evenly;justify-content:space-between;position:relative}td .media-wrap-flex{justify-content:center}.danger{background-color:#ff4136;border-color:#924949;color:#924949}.danger:active,.danger:hover{background-color:#924949;border-color:#ff4136;color:#ff4136}td.danger,td.danger:active,td.danger:hover{background-color:transparent;color:#924949}.user-btn{background:transparent;border-color:#12db18;border-color:var(--edit-link-color);color:#12db18;color:var(--edit-link-color);text-shadow:1px 1px 1px #000;text-shadow:var(--link-shadow);padding:0 .5rem}.user-btn:active,.user-btn:hover{background:transparent;border-color:#db7d12;border-color:var(--edit-link-hover-color);color:#db7d12;color:var(--edit-link-hover-color)}.user-btn:active{background:#db7d12;background:var(--edit-link-hover-color);color:#fff}.full-width{width:100%}.full-height{max-height:none}.toph{margin-top:0}#main-nav{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);margin:2rem 0 1.6rem;border-bottom:.1rem solid rgba(0,0,0,.2);font-size:3.6em;font-size:3.6rem;font-style:normal;font-weight:500}.sorting,.sorting-asc,.sorting-desc{vertical-align:text-bottom}.sorting:before{content:" ↕\00a0"}.sorting-asc:before{content:" ↑\00a0"}.sorting-desc:before{content:" ↓\00a0"}.form thead th,.form thead tr{background:inherit;border:0}.form tr>td:nth-child(odd){text-align:right;min-width:25px;max-width:30%}.form tr>td:nth-child(2n){text-align:left}.invisible tbody>tr:nth-child(odd){background:inherit}.borderless,.borderless td,.borderless th,.borderless tr,.invisible td,.invisible th,.invisible tr{box-shadow:none;border:0}.message,.static-message{position:relative;margin:.5em auto;padding:.5em;width:95%}.message .close{width:1em;height:1em;position:absolute;right:.5em;top:.5em;text-align:center;vertical-align:middle;line-height:1em}.message:hover .close:after{content:"☒"}.message:hover{cursor:pointer}.message .icon{left:.5em;top:.5em;margin-right:1em}.message.error,.static-message.error{border:1px solid #924949;background:#f3e6e6}.message.error .icon:after{content:"✘"}.message.success,.static-message.success{border:1px solid #1f8454;background:#70dda9}.message.success .icon:after{content:"✔"}.message.info,.static-message.info{border:1px solid #bfbe3a;background:#ffc}.message.info .icon:after{content:"⚠"}.character,.media,.small-character{position:relative;vertical-align:top;display:inline-block;text-align:center;width:220px;height:312px;margin:.25em .125em;margin:var(--normal-padding);z-index:0;background:rgba(0,0,0,.15)}.details picture.cover,picture.cover{display:inline;display:initial;width:100%}.character>img,.media>img,.small-character>img{width:100%}.media .edit-buttons>button{margin:.5em auto}.media-metadata>div,.medium-metadata>div,.name,.row{text-shadow:2px 2px 2px #000;text-shadow:var(--shadow);color:#fff;color:var(--text-color);padding:.25em .125em;padding:var(--normal-padding);text-align:right;z-index:2}.age-rating,.media-type{text-align:left}.media>.media-metadata{position:absolute;bottom:0;right:0}.media>.medium-metadata{position:absolute;bottom:0;left:0}.media>.name{position:absolute;top:0}.media>.name a{display:inline-block;transition:none}.media .name a:before{content:"";display:block;height:312px;left:0;position:absolute;top:0;width:220px;z-index:-1}.media-list .media:hover .name a:before{background:rgba(0,0,0,.75)}.media>.name span.canonical{font-weight:700}.media>.name small{font-weight:400}.media:hover .name{background:rgba(0,0,0,.75)}.media-list .media>.name a:hover,.media-list .media>.name a:hover small{color:#1271db;color:var(--blue-link)}.media:hover>.edit-buttons[hidden],.media:hover>button[hidden]{transition:.25s ease;display:block}.media:hover{transition:.25s ease}.character>.name a,.character>.name a small,.media>.name a,.media>.name a small,.small-character>.name a,.small-character>.name a small{background:none;color:#fff;text-shadow:2px 2px 2px #000;text-shadow:var(--shadow)}.anime .name,.manga .name{background:#000;background:var(--title-overlay-fallback);background:rgba(0,0,0,.45);background:var(--title-overlay);text-align:center;width:100%;padding:.5em .25em}.anime .age-rating,.anime .airing-status,.anime .completion,.anime .delete,.anime .edit,.anime .media-type,.anime .user-rating{background:none;text-align:center}.anime .table,.manga .table{position:absolute;bottom:0;left:0;width:100%}.anime .row,.manga .row{width:100%;display:inline-block;display:flex;align-content:space-around;justify-content:space-around;text-align:center;padding:0 inherit}.anime .row>span,.manga .row>span{text-align:left;z-index:2}.anime .row>div,.manga .row>div{font-size:.8em;display:inline-block;display:flex-item;align-self:center;text-align:center;vertical-align:middle;z-index:2}.anime .media>button.plus-one{border-color:hsla(0,0%,100%,.65);position:absolute;top:138px;top:calc(50% - 21.2px);left:44px;left:calc(50% - 57.8px);z-index:50}.manga .row{padding:1px}.manga .media{height:310px;margin:.25em}.manga .media>.edit-buttons{position:absolute;top:86px;top:calc(50% - 21.2px);left:43.5px;left:calc(50% - 57.8px);z-index:40}.manga .media>.edit-buttons button{border-color:hsla(0,0%,100%,.65)}.media.search>.name{background-color:#555;background-color:rgba(0,0,0,.35);background-size:cover;background-size:contain;background-repeat:no-repeat}.media.search>.row{z-index:6}.big-check,.mal-check{display:none}.big-check:checked+label{transition:.25s ease;background:rgba(0,0,0,.75)}.big-check:checked+label:after{content:"✓";font-size:15em;font-size:15rem;text-align:center;color:#adff2f;position:absolute;top:147px;left:0;width:100%;z-index:5}#series-list article.media{position:relative}#series-list .name,#series-list .name label{position:absolute;display:block;top:0;left:0;height:100%;width:100%;vertical-align:middle;line-height:1.25em}#series-list .name small{color:#fff}.details{margin:1.5rem auto 0;padding:1rem;font-size:inherit}.fixed{max-width:115em;max-width:115rem;margin:0 auto}.details .cover{display:block}.details .flex>*{margin:1rem}.details .media-details td{padding:0 1.5rem}.details p{text-align:justify}.details .media-details td:nth-child(odd){width:1%;white-space:nowrap;text-align:right}.details .media-details td:nth-child(2n){text-align:left}.details a h1,.details a h2{margin-top:0}.character,.person,.small-character{width:225px;height:350px;vertical-align:middle;white-space:nowrap;position:relative}.person{width:225px;height:338px}.small-person{width:200px;height:300px}.character a{height:350px}.character:hover .name,.small-character:hover .name{background:rgba(0,0,0,.8)}.small-character a{display:inline-block;width:100%;height:100%}.character .name,.small-character .name{position:absolute;bottom:0;left:0;z-index:10}.character img,.character picture,.person img,.person picture,.small-character img,.small-character picture{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:5;max-height:350px;max-width:225px}.person img,.person picture{max-height:338px}.small-person img,.small-person picture{max-height:300px;max-width:200px}.min-table{min-width:0;margin-left:0}.max-table{min-width:100%;margin:0}aside.info{max-width:33%}.fixed aside{max-width:390px}aside img,aside picture{display:block;margin:0 auto}.small-character{width:160px;height:250px}.small-character img,.small-character picture{max-height:250px;max-width:160px}.user-page .media-wrap{text-align:left}.media a{display:inline-block;width:100%;height:100%}.streaming-logo{width:50px;height:50px;vertical-align:middle}.small-streaming-logo{width:25px;height:25px;vertical-align:middle}.cover-streaming-link{display:none}.media:hover .cover-streaming-link{display:block}.cover-streaming-link .streaming-logo{width:20px;height:20px;-webkit-filter:drop-shadow(0 -1px 4px #fff);filter:drop-shadow(0 -1px 4px #fff)}.history-img{width:110px;height:156px}.settings.form .content article{margin:1em;display:inline-block;width:auto}.responsive-iframe{margin-top:1em;overflow:hidden;padding-bottom:56.25%;position:relative;height:0}.responsive-iframe iframe{left:0;top:0;height:100%;width:100%;position:absolute}.cssload-loader{position:relative;left:calc(50% - 31px);width:62px;height:62px;border-radius:50%;perspective:780px}.cssload-inner{position:absolute;width:100%;height:100%;box-sizing:border-box;border-radius:50%}.cssload-inner.cssload-one{left:0;top:0;-webkit-animation:cssload-rotate-one 1.15s linear infinite;animation:cssload-rotate-one 1.15s linear infinite;border-bottom:3px solid #000}.cssload-inner.cssload-two{right:0;top:0;-webkit-animation:cssload-rotate-two 1.15s linear infinite;animation:cssload-rotate-two 1.15s linear infinite;border-right:3px solid #000}.cssload-inner.cssload-three{right:0;bottom:0;-webkit-animation:cssload-rotate-three 1.15s linear infinite;animation:cssload-rotate-three 1.15s linear infinite;border-top:3px solid #000}@-webkit-keyframes cssload-rotate-one{0%{transform:rotateX(35deg) rotateY(-45deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(-45deg) rotate(1turn)}}@keyframes cssload-rotate-one{0%{transform:rotateX(35deg) rotateY(-45deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(-45deg) rotate(1turn)}}@-webkit-keyframes cssload-rotate-two{0%{transform:rotateX(50deg) rotateY(10deg) rotate(0deg)}to{transform:rotateX(50deg) rotateY(10deg) rotate(1turn)}}@keyframes cssload-rotate-two{0%{transform:rotateX(50deg) rotateY(10deg) rotate(0deg)}to{transform:rotateX(50deg) rotateY(10deg) rotate(1turn)}}@-webkit-keyframes cssload-rotate-three{0%{transform:rotateX(35deg) rotateY(55deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(55deg) rotate(1turn)}}@keyframes cssload-rotate-three{0%{transform:rotateX(35deg) rotateY(55deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(55deg) rotate(1turn)}}#loading-shadow{background:rgba(0,0,0,.8);z-index:500}#loading-shadow,#loading-shadow .loading-wrapper{position:fixed;top:0;left:0;width:100%;height:100%}#loading-shadow .loading-wrapper{z-index:501;display:flex;align-items:center;justify-content:center}#loading-shadow .loading-content{position:relative;color:#fff}.loading-content .cssload-inner.cssload-one,.loading-content .cssload-inner.cssload-three,.loading-content .cssload-inner.cssload-two{border-color:#fff}.tabs{display:inline-block;display:flex;flex-wrap:wrap;background:#efefef;box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin-top:1.5em}.tabs>label{border:1px solid #e5e5e5;width:100%;padding:20px 30px;background:#e5e5e5;cursor:pointer;font-weight:700;font-size:18px;color:#7f7f7f;transition:background .1s,color .1s}.tabs>label:hover{background:#d8d8d8}.tabs>label:active{background:#ccc}.tabs>[type=radio]:focus+label{box-shadow:inset 0 0 0 3px #2aa1c0;z-index:1}.tabs>[type=radio]{position:absolute;opacity:0}.tabs>[type=radio]:checked+label{border-bottom:1px solid #fff;background:#fff;color:#000}.tabs>[type=radio]:checked+label+.content{display:block}.single-tab,.tabs .content,.tabs>[type=radio]:checked+label+.content{border:1px solid #e5e5e5;border-top:0;padding:15px;background:#fff;width:100%;margin:0 auto;overflow:auto}.single-tab,.tabs .content{display:none;max-height:950px}.single-tab{display:block;border:1px solid #e5e5e5;box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin-top:1.5em}.single-tab.full-height,.tabs .content.full-height{max-height:none}@media (min-width:800px){.tabs>label{width:auto}.tabs .content{order:99}}.vertical-tabs{border:1px solid #e5e5e5;box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin:0 auto;position:relative;width:100%}.vertical-tabs input[type=radio]{position:absolute;opacity:0}.vertical-tabs .tab{align-items:center;display:inline-block;display:flex;flex-wrap:nowrap}.vertical-tabs .tab label{align-items:center;background:#e5e5e5;border:1px solid #e5e5e5;color:#7f7f7f;cursor:pointer;font-size:18px;font-weight:700;padding:0 20px;width:28%}.vertical-tabs .tab label:hover{background:#d8d8d8}.vertical-tabs .tab label:active{background:#ccc}.vertical-tabs .tab .content{display:none;border:1px solid #e5e5e5;border-left:0;border-right:0;max-height:950px;overflow:auto}.vertical-tabs .tab .content.full-height{max-height:none}.vertical-tabs [type=radio]:checked+label{border:0;background:#fff;color:#000;width:38%}.vertical-tabs [type=radio]:focus+label{box-shadow:inset 0 0 0 3px #2aa1c0;z-index:1}.vertical-tabs [type=radio]:checked~.content{display:block}@media screen and (max-width:1100px){.flex{flex-wrap:wrap}.fixed aside.info,.fixed aside.info+article,aside.info,aside.info+article{max-width:none;width:100%}}@media screen and (max-width:800px){*{max-width:none}table{box-shadow:none}.details .flex>*,body{margin:0}table,table.align-center,table .align-right,table td,table th{border:0;margin-left:auto;margin-right:auto;text-align:left;width:100%}table td{display:inline-block}table.media-details,table tbody{width:100%}table.media-details td{display:block;text-align:left!important;width:100%}table thead{display:none}.details .media-details td:nth-child(odd){font-weight:700;width:100%}table.streaming-links tr td:not(:first-child){display:none}}@media screen and (max-width:40em){nav a{line-height:4em;line-height:4rem}img,picture{width:100%}main{padding:0 .5rem .5rem}.media{margin:2px 0}.details{padding:.5rem}.tabs>[type=radio]:checked+label{background:#fff}.vertical-tabs .tab{flex-wrap:wrap}.tabs .content,.tabs>[type=radio]:checked+label+.content,.vertical-tabs .tab .content{display:block;border:0;max-height:none}.tabs>[type=radio]:checked+label,.tabs>label,.tabs>label:active,.tabs>label:hover,.vertical-tabs .tab label,.vertical-tabs .tab label:active,.vertical-tabs .tab label:hover,.vertical-tabs [type=radio]:checked+label,.vertical-tabs [type=radio]:focus+label{background:#fff;border:0;width:100%;cursor:default;color:#000}} \ No newline at end of file +:root{--default-font-list:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;--monospace-font-list:"Anonymous Pro","Fira Code",Menlo,Monaco,Consolas,"Courier New",monospace;--serif-font-list:Georgia,Times,"Times New Roman",serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;box-sizing:border-box;cursor:default;font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);line-height:1.4;overflow-y:scroll;-moz-text-size-adjust:100%;text-size-adjust:100%;scroll-behavior:smooth}audio:not([controls]){display:none}details{display:block}input[type=search]{-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}main{margin:0 auto;padding:0 1.6rem 1.6rem}main,pre,summary{display:block}pre{background:#efefef;color:#444;font-family:Anonymous Pro,Fira Code,Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--monospace-font-list);font-size:1.4em;font-size:1.4rem;margin:1.6rem 0;overflow:auto;padding:1.6rem;word-break:break-all;word-wrap:break-word}progress{display:inline-block}small{color:#777;font-size:75%}big{font-size:125%}template{display:none}textarea{border:.1rem solid #ccc;border-radius:0;display:block;margin-bottom:.8rem;overflow:auto;padding:.8rem;resize:vertical;vertical-align:middle}[hidden]{display:none}[unselectable]{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}*,:after,:before{box-sizing:inherit}*{font-size:inherit;line-height:inherit;margin:0;padding:0}:after,:before{text-decoration:inherit;vertical-align:inherit}a{-webkit-transition:.25s ease;color:#1271db;text-decoration:none;transition:.25s ease}audio,canvas,iframe,img,svg,video{vertical-align:middle}input,textarea{border:.1rem solid #ccc;color:inherit;font-family:inherit;font-style:inherit;font-weight:inherit;min-height:1.4em}code,kbd,pre,samp{font-family:Anonymous Pro,Fira Code,Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--monospace-font-list)}table{border-collapse:collapse;border-spacing:0;margin-bottom:1.6rem}::-moz-selection{background-color:#b3d4fc;text-shadow:none}::selection{background-color:#b3d4fc;text-shadow:none}button::-moz-focus-inner{border:0}body{color:#444;font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);font-size:1.6rem;font-style:normal;font-weight:400;padding:0}p{margin:0 0 1.6rem}h1,h2,h3,h4,h5,h6{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);margin:2rem 0 1.6rem}h1{border-bottom:.1rem solid rgba(0,0,0,.2);font-size:3.6em;font-size:3.6rem}h1,h2{font-style:normal;font-weight:500}h2{font-size:3em;font-size:3rem}h3{font-size:2.4em;font-size:2.4rem;font-style:normal;font-weight:500;margin:1.6rem 0 .4rem}h4{font-size:1.8em;font-size:1.8rem}h4,h5{font-style:normal;font-weight:600;margin:1.6rem 0 .4rem}h5{font-size:1.6em;font-size:1.6rem}h6{color:#777;font-size:1.4em;font-style:normal;font-weight:600;margin:1.6rem 0 .4rem}code,h6{font-size:1.4rem}code{background:#efefef;color:#444;font-family:Anonymous Pro,Fira Code,Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--monospace-font-list);word-break:break-all;word-wrap:break-word}a:focus,a:hover{text-decoration:none}dl{margin-bottom:1.6rem}dd{margin-left:4rem}ol,ul{margin-bottom:.8rem;padding-left:2rem}blockquote{border-left:.2rem solid #1271db;font-style:italic;margin:1.6rem 0;padding-left:1.6rem}blockquote,figcaption{font-family:Georgia,Times,Times New Roman,serif;font-family:var(--serif-font-list)}html{font-size:62.5%}article,aside,details,footer,header,main,section,summary{display:block;height:auto;margin:0 auto;width:100%}footer{clear:both;display:inline-block;float:left;max-width:100%;padding:1rem 0;text-align:center}footer,hr{border-top:.1rem solid rgba(0,0,0,.2)}hr{display:block;margin-bottom:1.6rem;width:100%}img{height:auto;vertical-align:baseline}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{border:.1rem solid #ccc;border-radius:0;display:inline-block;padding:.8rem;vertical-align:middle}input:not([type]){-webkit-appearance:none;background-clip:padding-box;background-color:#fff;border:.1rem solid #ccc;border-radius:0;color:#444;display:inline-block;padding:.8rem;text-align:left}input[type=color]{padding:.8rem 1.6rem}input:not([type]):focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,textarea:focus{border-color:#b3d4fc}input[type=checkbox],input[type=radio]{vertical-align:middle}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:.1rem thin solid #444}input:not([type])[disabled],input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled],textarea[disabled]{background-color:#efefef;color:#777;cursor:not-allowed}input[readonly],textarea[readonly]{background-color:#efefef;border-color:#ccc;color:#777}input:focus:invalid,textarea:focus:invalid{border-color:#e9322d;color:#b94a48}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#ff4136}select[multiple]{height:auto}label{line-height:2}fieldset{border:0;margin:0;padding:.8rem 0}legend{border-bottom:.1rem solid #ccc;color:#444;display:block;margin-bottom:.8rem;padding:.8rem 0;width:100%}button,input[type=submit]{-moz-user-select:none;-ms-user-select:none;-webkit-transition:.25s ease;-webkit-user-drag:none;-webkit-user-select:none;border:.2rem solid #444;border-radius:0;color:#444;cursor:pointer;display:inline-block;margin-bottom:.8rem;margin-right:.4rem;padding:.8rem 1.6rem;text-align:center;text-decoration:none;text-transform:uppercase;transition:.25s ease;user-select:none;vertical-align:baseline}button a,input[type=submit] a{color:#444}button::-moz-focus-inner,input[type=submit]::-moz-focus-inner{padding:0}button:hover,input[type=submit]:hover{background:#444;border-color:#444;color:#fff}button:hover a,input[type=submit]:hover a{color:#fff}button:active,input[type=submit]:active{background:#6a6a6a;border-color:#6a6a6a;color:#fff}button:active a,input[type=submit]:active a{color:#fff}button:disabled,input[type=submit]:disabled{box-shadow:none;cursor:not-allowed;opacity:.4}nav ul{list-style:none;margin:0;padding:0;text-align:center}nav ul li{display:inline}nav a{-webkit-transition:.25s ease;border-bottom:.2rem solid transparent;color:#444;padding:.8rem 1.6rem;text-decoration:none;transition:.25s ease}nav a:hover,nav li.selected a{border-color:rgba(0,0,0,.2)}nav a:active{border-color:rgba(0,0,0,.56)}caption{padding:.8rem 0}thead th{background:#efefef;color:#444}tr{background:#fff;margin-bottom:.8rem}td,th{border:.1rem solid #ccc;padding:.8rem 1.6rem;text-align:center;vertical-align:inherit}tfoot tr{background:none}tfoot td{color:#efefef;font-size:.8rem;font-style:italic;padding:1.6rem .4rem}@media screen{[hidden~=screen]{display:inherit}[hidden~=screen]:not(:active):not(:focus):not(:target){clip:rect(0)!important;position:absolute!important}}@media screen and max-width 40rem{article,aside,section{clear:both;display:block;max-width:100%}img{margin-right:1.6rem}}:root{--blue-link:#1271db;--link-shadow:1px 1px 1px #000;--white-link-shadow:1px 1px 1px #fff;--shadow:2px 2px 2px #000;--title-overlay:rgba(0,0,0,0.45);--title-overlay-fallback:#000;--text-color:#fff;--normal-padding:0.25em 0.125em;--link-hover-color:#7d12db;--edit-link-hover-color:#db7d12;--edit-link-color:#12db18;--radius:5px}.media[hidden],[hidden=hidden],template{display:none}body{margin:.5em}button{background:#fff;background:linear-gradient(#ddd,#eee,#fff,#eee,#ddd);border-radius:.5em;margin:0;text-transform:none}button,button:hover{border-color:#555;color:#555}button:hover{background:#bbb;background:linear-gradient(#cfcfcf,#dfdfdf,#efefef,#dfdfdf,#cfcfcf)}button:active{background:#ddd;background:linear-gradient(#ddd,#ddd)}.media:hover button{background:linear-gradient(#bbb,#ccc,#ddd,#ccc,#bbb)}.media:hover button:hover{background:linear-gradient(#afafaf,#bfbfbf,#cfcfcf,#bfbfbf,#afafaf)}table{box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin:0 auto}td{padding:1rem}thead td,thead th{padding:.5rem}input[type=number]{min-width:0;width:4.5em}input[type=checkbox],input[type=radio]{min-width:auto;vertical-align:inherit}input,textarea{min-width:30em;min-width:30rem}tbody>tr:nth-child(odd){background:#ddd}a:active,a:hover{color:#7d12db;color:var(--link-hover-color)}iframe{display:block;margin:0 auto;border:0}.bracketed{color:#12db18;color:var(--edit-link-color)}#main-nav a,.bracketed{text-shadow:1px 1px 1px #000;text-shadow:var(--link-shadow)}.bracketed:before{content:"[\00a0"}.bracketed:after{content:"\00a0]"}.bracketed:active,.bracketed:hover{color:#db7d12;color:var(--edit-link-hover-color)}.grow-1{flex-grow:1}.flex-wrap{flex-wrap:wrap}.flex-no-wrap{flex-wrap:nowrap}.flex-align-start{align-content:flex-start}.flex-align-end{align-items:flex-end}.flex-align-space-around{align-content:space-around}.flex-justify-start{justify-content:flex-start}.flex-justify-space-around{justify-content:space-around}.flex-center{justify-content:center}.flex-self-center{align-self:center}.flex-space-evenly{justify-content:space-evenly}.flex{display:inline-block;display:flex}.small-font{font-size:1.6rem}.justify{text-align:justify}.align-center{text-align:center!important}.align-left{text-align:left!important}.align-right{text-align:right!important}.valign-top{vertical-align:top}.no-border{border:none}.media-wrap{text-align:center;margin:0 auto;position:relative}.media-wrap-flex{display:inline-block;display:flex;flex-wrap:wrap;align-content:space-evenly;justify-content:space-between;position:relative}td .media-wrap-flex{justify-content:center}.danger{background-color:#ff4136;border-color:#924949;color:#924949}.danger:active,.danger:hover{background-color:#924949;border-color:#ff4136;color:#ff4136}td.danger,td.danger:active,td.danger:hover{background-color:transparent;color:#924949}.user-btn{background:transparent;border-color:#12db18;border-color:var(--edit-link-color);color:#12db18;color:var(--edit-link-color);text-shadow:1px 1px 1px #000;text-shadow:var(--link-shadow);padding:0 .5rem}.user-btn:active,.user-btn:hover{background:transparent;border-color:#db7d12;border-color:var(--edit-link-hover-color);color:#db7d12;color:var(--edit-link-hover-color)}.user-btn:active{background:#db7d12;background:var(--edit-link-hover-color);color:#fff}.full-width{width:100%}.full-height{max-height:none}.toph{margin-top:0}#main-nav{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;font-family:var(--default-font-list);margin:2rem 0 1.6rem;border-bottom:.1rem solid rgba(0,0,0,.2);font-size:3.6em;font-size:3.6rem;font-style:normal;font-weight:500}.sorting,.sorting-asc,.sorting-desc{vertical-align:text-bottom}.sorting:before{content:" ↕\00a0"}.sorting-asc:before{content:" ↑\00a0"}.sorting-desc:before{content:" ↓\00a0"}.form thead th,.form thead tr{background:inherit;border:0}.form tr>td:nth-child(odd){text-align:right;min-width:25px;max-width:30%}.form tr>td:nth-child(2n){text-align:left}.invisible tbody>tr:nth-child(odd){background:inherit}.borderless,.borderless td,.borderless th,.borderless tr,.invisible td,.invisible th,.invisible tr{box-shadow:none;border:0}.message,.static-message{position:relative;margin:.5em auto;padding:.5em;width:95%}.message .close{width:1em;height:1em;position:absolute;right:.5em;top:.5em;text-align:center;vertical-align:middle;line-height:1em}.message:hover .close:after{content:"☒"}.message:hover{cursor:pointer}.message .icon{left:.5em;top:.5em;margin-right:1em}.message.error,.static-message.error{border:1px solid #924949;background:#f3e6e6}.message.error .icon:after{content:"✘"}.message.success,.static-message.success{border:1px solid #1f8454;background:#70dda9}.message.success .icon:after{content:"✔"}.message.info,.static-message.info{border:1px solid #bfbe3a;background:#ffc}.message.info .icon:after{content:"⚠"}.character,.media,.small-character{position:relative;vertical-align:top;display:inline-block;text-align:center;width:220px;height:312px;margin:.25em .125em;margin:var(--normal-padding);z-index:0;background:rgba(0,0,0,.15)}.details picture.cover,picture.cover{display:inline;display:initial;width:100%}.character>img,.media>img,.small-character>img{width:100%}.media .edit-buttons>button{margin:.5em auto}.media-metadata>div,.medium-metadata>div,.name,.row{text-shadow:2px 2px 2px #000;text-shadow:var(--shadow);color:#fff;color:var(--text-color);padding:.25em .125em;padding:var(--normal-padding);text-align:right;z-index:2}.age-rating,.media-type{text-align:left}.media>.media-metadata{position:absolute;bottom:0;right:0}.media>.medium-metadata{position:absolute;bottom:0;left:0}.media>.name{position:absolute;top:0}.media>.name a{display:inline-block;transition:none}.media .name a:before{content:"";display:block;height:312px;left:0;position:absolute;top:0;width:220px;z-index:-1}.media-list .media:hover .name a:before{background:rgba(0,0,0,.75)}.media>.name span.canonical{font-weight:700}.media>.name small{font-weight:400}.media:hover .name{background:rgba(0,0,0,.75)}.media-list .media>.name a:hover,.media-list .media>.name a:hover small{color:#1271db;color:var(--blue-link)}.media:hover>.edit-buttons[hidden],.media:hover>button[hidden]{transition:.25s ease;display:block}.media:hover{transition:.25s ease}.character>.name a,.character>.name a small,.media>.name a,.media>.name a small,.small-character>.name a,.small-character>.name a small{background:none;color:#fff;text-shadow:2px 2px 2px #000;text-shadow:var(--shadow)}.anime .name,.manga .name{background:#000;background:var(--title-overlay-fallback);background:rgba(0,0,0,.45);background:var(--title-overlay);text-align:center;width:100%;padding:.5em .25em}.anime .age-rating,.anime .airing-status,.anime .completion,.anime .delete,.anime .edit,.anime .media-type,.anime .user-rating{background:none;text-align:center}.anime .table,.manga .table{position:absolute;bottom:0;left:0;width:100%}.anime .row,.manga .row{width:100%;display:inline-block;display:flex;align-content:space-around;justify-content:space-around;text-align:center;padding:0 inherit}.anime .row>span,.manga .row>span{text-align:left;z-index:2}.anime .row>div,.manga .row>div{font-size:.8em;display:inline-block;display:flex-item;align-self:center;text-align:center;vertical-align:middle;z-index:2}.anime .media>button.plus-one{border-color:hsla(0,0%,100%,.65);position:absolute;top:138px;top:calc(50% - 21.2px);left:44px;left:calc(50% - 57.8px);z-index:50}.manga .row{padding:1px}.manga .media{height:310px;margin:.25em}.manga .media>.edit-buttons{position:absolute;top:86px;top:calc(50% - 21.2px);left:43.5px;left:calc(50% - 57.8px);z-index:40}.manga .media>.edit-buttons button{border-color:hsla(0,0%,100%,.65)}.media.search>.name{background-color:#555;background-color:rgba(0,0,0,.35);background-size:cover;background-size:contain;background-repeat:no-repeat}.media.search>.row{z-index:6}.big-check,.mal-check{display:none}.big-check:checked+label{transition:.25s ease;background:rgba(0,0,0,.75)}.big-check:checked+label:after{content:"✓";font-size:15em;font-size:15rem;text-align:center;color:#adff2f;position:absolute;top:147px;left:0;width:100%;z-index:5}#series-list article.media{position:relative}#series-list .name,#series-list .name label{position:absolute;display:block;top:0;left:0;height:100%;width:100%;vertical-align:middle;line-height:1.25em}#series-list .name small{color:#fff}.details{margin:1.5rem auto 0;padding:1rem;font-size:inherit}.fixed{max-width:115em;max-width:115rem;margin:0 auto}.details .cover{display:block}.details .flex>*{margin:1rem}.details .media-details td{padding:0 1.5rem}.details p{text-align:justify}.details .media-details td:nth-child(odd){width:1%;white-space:nowrap;text-align:right}.details .media-details td:nth-child(2n){text-align:left}.details a h1,.details a h2{margin-top:0}.character,.person,.small-character{width:225px;height:350px;vertical-align:middle;white-space:nowrap;position:relative}.person{width:225px;height:338px}.small-person{width:200px;height:300px}.character a{height:350px}.character:hover .name,.small-character:hover .name{background:rgba(0,0,0,.8)}.small-character a{display:inline-block;width:100%;height:100%}.character .name,.small-character .name{position:absolute;bottom:0;left:0;z-index:10}.character img,.character picture,.person img,.person picture,.small-character img,.small-character picture{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:5;max-height:350px;max-width:225px}.person img,.person picture{max-height:338px}.small-person img,.small-person picture{max-height:300px;max-width:200px}.min-table{min-width:0;margin-left:0}.max-table{min-width:100%;margin:0}aside.info{max-width:33%}.fixed aside{max-width:390px}aside img,aside picture{display:block;margin:0 auto}.small-character{width:160px;height:250px}.small-character img,.small-character picture{max-height:250px;max-width:160px}.user-page .media-wrap{text-align:left}.media a{display:inline-block;width:100%;height:100%}.streaming-logo{width:50px;height:50px;vertical-align:middle}.small-streaming-logo{width:25px;height:25px;vertical-align:middle}.cover-streaming-link{display:none}.media:hover .cover-streaming-link{display:block}.cover-streaming-link .streaming-logo{width:20px;height:20px;filter:drop-shadow(0 -1px 4px #fff)}.history-img{width:110px;height:156px}.settings.form .content article{margin:1em;display:inline-block;width:auto}.responsive-iframe{margin-top:1em;overflow:hidden;padding-bottom:56.25%;position:relative;height:0}.responsive-iframe iframe{left:0;top:0;height:100%;width:100%;position:absolute}.cssload-loader{position:relative;left:calc(50% - 31px);width:62px;height:62px;border-radius:50%;perspective:780px}.cssload-inner{position:absolute;width:100%;height:100%;box-sizing:border-box;border-radius:50%}.cssload-inner.cssload-one{left:0;top:0;-webkit-animation:cssload-rotate-one 1.15s linear infinite;animation:cssload-rotate-one 1.15s linear infinite;border-bottom:3px solid #000}.cssload-inner.cssload-two{right:0;top:0;-webkit-animation:cssload-rotate-two 1.15s linear infinite;animation:cssload-rotate-two 1.15s linear infinite;border-right:3px solid #000}.cssload-inner.cssload-three{right:0;bottom:0;-webkit-animation:cssload-rotate-three 1.15s linear infinite;animation:cssload-rotate-three 1.15s linear infinite;border-top:3px solid #000}@-webkit-keyframes cssload-rotate-one{0%{transform:rotateX(35deg) rotateY(-45deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(-45deg) rotate(1turn)}}@keyframes cssload-rotate-one{0%{transform:rotateX(35deg) rotateY(-45deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(-45deg) rotate(1turn)}}@-webkit-keyframes cssload-rotate-two{0%{transform:rotateX(50deg) rotateY(10deg) rotate(0deg)}to{transform:rotateX(50deg) rotateY(10deg) rotate(1turn)}}@keyframes cssload-rotate-two{0%{transform:rotateX(50deg) rotateY(10deg) rotate(0deg)}to{transform:rotateX(50deg) rotateY(10deg) rotate(1turn)}}@-webkit-keyframes cssload-rotate-three{0%{transform:rotateX(35deg) rotateY(55deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(55deg) rotate(1turn)}}@keyframes cssload-rotate-three{0%{transform:rotateX(35deg) rotateY(55deg) rotate(0deg)}to{transform:rotateX(35deg) rotateY(55deg) rotate(1turn)}}#loading-shadow{background:rgba(0,0,0,.8);z-index:500}#loading-shadow,#loading-shadow .loading-wrapper{position:fixed;top:0;left:0;width:100%;height:100%}#loading-shadow .loading-wrapper{z-index:501;display:flex;align-items:center;justify-content:center}#loading-shadow .loading-content{position:relative;color:#fff}.loading-content .cssload-inner.cssload-one,.loading-content .cssload-inner.cssload-three,.loading-content .cssload-inner.cssload-two{border-color:#fff}.tabs{display:inline-block;display:flex;flex-wrap:wrap;background:#efefef;box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin-top:1.5em}.tabs>label{border:1px solid #e5e5e5;width:100%;padding:20px 30px;background:#e5e5e5;cursor:pointer;font-weight:700;font-size:18px;color:#7f7f7f;transition:background .1s,color .1s}.tabs>label:hover{background:#d8d8d8}.tabs>label:active{background:#ccc}.tabs>[type=radio]:focus+label{box-shadow:inset 0 0 0 3px #2aa1c0;z-index:1}.tabs>[type=radio]{position:absolute;opacity:0}.tabs>[type=radio]:checked+label{border-bottom:1px solid #fff;background:#fff;color:#000}.tabs>[type=radio]:checked+label+.content{display:block}.single-tab,.tabs .content,.tabs>[type=radio]:checked+label+.content{border:1px solid #e5e5e5;border-top:0;padding:15px;background:#fff;width:100%;margin:0 auto;overflow:auto}.single-tab,.tabs .content{display:none;max-height:950px}.single-tab{display:block;border:1px solid #e5e5e5;box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin-top:1.5em}.single-tab.full-height,.tabs .content.full-height{max-height:none}@media (min-width:800px){.tabs>label{width:auto}.tabs .content{order:99}}.vertical-tabs{border:1px solid #e5e5e5;box-shadow:0 48px 80px -32px rgba(0,0,0,.3);margin:0 auto;position:relative;width:100%}.vertical-tabs input[type=radio]{position:absolute;opacity:0}.vertical-tabs .tab{align-items:center;display:inline-block;display:flex;flex-wrap:nowrap}.vertical-tabs .tab label{align-items:center;background:#e5e5e5;border:1px solid #e5e5e5;color:#7f7f7f;cursor:pointer;font-size:18px;font-weight:700;padding:0 20px;width:28%}.vertical-tabs .tab label:hover{background:#d8d8d8}.vertical-tabs .tab label:active{background:#ccc}.vertical-tabs .tab .content{display:none;border:1px solid #e5e5e5;border-left:0;border-right:0;max-height:950px;overflow:auto}.vertical-tabs .tab .content.full-height{max-height:none}.vertical-tabs [type=radio]:checked+label{border:0;background:#fff;color:#000;width:38%}.vertical-tabs [type=radio]:focus+label{box-shadow:inset 0 0 0 3px #2aa1c0;z-index:1}.vertical-tabs [type=radio]:checked~.content{display:block}@media screen and (max-width:1100px){.flex{flex-wrap:wrap}.fixed aside.info,.fixed aside.info+article,aside.info,aside.info+article{max-width:none;width:100%}}@media screen and (max-width:800px){*{max-width:none}table{box-shadow:none}.details .flex>*,body{margin:0}table,table.align-center,table .align-right,table td,table th{border:0;margin-left:auto;margin-right:auto;text-align:left;width:100%}table td{display:inline-block}table.media-details,table tbody{width:100%}table.media-details td{display:block;text-align:left!important;width:100%}table thead{display:none}.details .media-details td:nth-child(odd){font-weight:700;width:100%}table.streaming-links tr td:not(:first-child){display:none}}@media screen and (max-width:40em){nav a{line-height:4em;line-height:4rem}img,picture{width:100%}main{padding:0 .5rem .5rem}.media{margin:2px 0}.details{padding:.5rem}.tabs>[type=radio]:checked+label{background:#fff}.vertical-tabs .tab{flex-wrap:wrap}.tabs .content,.tabs>[type=radio]:checked+label+.content,.vertical-tabs .tab .content{display:block;border:0;max-height:none}.tabs>[type=radio]:checked+label,.tabs>label,.tabs>label:active,.tabs>label:hover,.vertical-tabs .tab label,.vertical-tabs .tab label:active,.vertical-tabs .tab label:hover,.vertical-tabs [type=radio]:checked+label,.vertical-tabs [type=radio]:focus+label{background:#fff;border:0;width:100%;cursor:default;color:#000}} \ No newline at end of file diff --git a/public/es/scripts.js b/public/es/scripts.js index ceb11ef1..45bff56e 100644 --- a/public/es/scripts.js +++ b/public/es/scripts.js @@ -510,12 +510,10 @@ AnimeClient.on('main', 'change', '.big-check', (e) => { }); function renderAnimeSearchResults (data) { - const results = []; - - data.forEach(item => { + return data.map(item => { const titles = item.titles.join('
'); - results.push(` + return ` - `); - }); - - return results.join(''); + `; + }).join(''); } function renderMangaSearchResults (data) { - const results = []; - - data.forEach(item => { + return data.map(item => { const titles = item.titles.join('
'); - - results.push(` + return ` - `); - }); - - return results.join(''); + `; + }).join(''); } const search = (query) => { diff --git a/public/js/scripts.min.js b/public/js/scripts.min.js index 7e69d270..5dfe3744 100644 --- a/public/js/scripts.min.js +++ b/public/js/scripts.min.js @@ -11,12 +11,12 @@ element){listener.call(element,e);e.stopPropagation()}})})}AnimeClient.on=functi rect.top+window.pageYOffset;window.scrollTo({top:top,behavior:"smooth"})}function filterMedia(event){var rawFilter=event.target.value;var filter=new RegExp(rawFilter,"i");if(rawFilter!==""){AnimeClient.$("article.media").forEach(function(article){var titleLink=AnimeClient.$(".name a",article)[0];var title=String(titleLink.textContent).trim();if(!filter.test(title))AnimeClient.hide(article);else AnimeClient.show(article)});AnimeClient.$("table.media-wrap tbody tr").forEach(function(tr){var titleCell= AnimeClient.$("td.align-left",tr)[0];var titleLink=AnimeClient.$("a",titleCell)[0];var linkTitle=String(titleLink.textContent).trim();var textTitle=String(titleCell.textContent).trim();if(!(filter.test(linkTitle)||filter.test(textTitle)))AnimeClient.hide(tr);else AnimeClient.show(tr)})}else{AnimeClient.show("article.media");AnimeClient.show("table.media-wrap tbody tr")}}if("serviceWorker"in navigator)navigator.serviceWorker.register("/sw.js").then(function(reg){console.log("Service worker registered", reg.scope)})["catch"](function(error){console.error("Failed to register service worker",error)});(function(){var hidden=null;var visibilityChange=null;if(typeof document.hidden!=="undefined"){hidden="hidden";visibilityChange="visibilitychange"}else if(typeof document.msHidden!=="undefined"){hidden="msHidden";visibilityChange="msvisibilitychange"}else if(typeof document.webkitHidden!=="undefined"){hidden="webkitHidden";visibilityChange="webkitvisibilitychange"}function handleVisibilityChange(){if(!document[hidden])AnimeClient.get("/heartbeat", -function(beat){var status=JSON.parse(beat);if(status.hasAuth!==true){document.removeEventListener(visibilityChange,handleVisibilityChange,false);location.reload()}})}if(hidden===null)console.info("Page visibility API not supported, JS session check will not work");else document.addEventListener(visibilityChange,handleVisibilityChange,false)})();AnimeClient.on("main","change",".big-check",function(e){var id=e.target.id;document.getElementById("mal_"+id).checked=true});function renderAnimeSearchResults(data){var results= -[];data.forEach(function(item){var titles=item.titles.join("
");results.push('\n\t\t\t\n\t\t')}); -return results.join("")}function renderMangaSearchResults(data){var results=[];data.forEach(function(item){var titles=item.titles.join("
");results.push('\n\t\t\t\n\t\t'}).join("")}var search=function(query){AnimeClient.show(".cssload-loader");return AnimeClient.get(AnimeClient.url("/anime-collection/search"),{query:query},function(searchResults,status){searchResults=JSON.parse(searchResults);AnimeClient.hide(".cssload-loader");AnimeClient.$("#series-list")[0].innerHTML=renderAnimeSearchResults(searchResults)})};if(AnimeClient.hasElement(".anime #search")){var prevRequest= null;AnimeClient.on("#search","input",AnimeClient.throttle(250,function(e){var query=encodeURIComponent(e.target.value);if(query==="")return;if(prevRequest!==null)prevRequest.abort();prevRequest=search(query)}))}AnimeClient.on("body.anime.list","click",".plus-one",function(e){var parentSel=AnimeClient.closestParent(e.target,"article");var watchedCount=parseInt(AnimeClient.$(".completed_number",parentSel)[0].textContent,10)||0;var totalCount=parseInt(AnimeClient.$(".total_number",parentSel)[0].textContent, 10);var title=AnimeClient.$(".name a",parentSel)[0].textContent;var data={id:parentSel.dataset.kitsuId,mal_id:parentSel.dataset.malId,data:{progress:watchedCount+1}};if(isNaN(watchedCount)||watchedCount===0)data.data.status="CURRENT";if(!isNaN(watchedCount)&&watchedCount+1===totalCount)data.data.status="COMPLETED";AnimeClient.show("#loading-shadow");AnimeClient.ajax(AnimeClient.url("/anime/increment"),{data:data,dataType:"json",type:"POST",success:function(res){var resData=JSON.parse(res);if(resData.errors){AnimeClient.hide("#loading-shadow"); AnimeClient.showMessage("error","Failed to update "+title+". ");AnimeClient.scrollToTop();return}if(resData.data.libraryEntry.update.libraryEntry.status==="COMPLETED")AnimeClient.hide(parentSel);AnimeClient.hide("#loading-shadow");AnimeClient.showMessage("success","Successfully updated "+title);AnimeClient.$(".completed_number",parentSel)[0].textContent=++watchedCount;AnimeClient.scrollToTop()},error:function(){AnimeClient.hide("#loading-shadow");AnimeClient.showMessage("error","Failed to update "+ diff --git a/public/js/scripts.min.js.map b/public/js/scripts.min.js.map index b644c456..2a4bd5a6 100644 --- a/public/js/scripts.min.js.map +++ b/public/js/scripts.min.js.map @@ -1 +1 @@ -{"version":3,"file":"scripts.min.js.map","sources":["../../frontEndSrc/js/anime-client.js","../../frontEndSrc/js/events.js","../../frontEndSrc/js/anon.js","../../frontEndSrc/js/session-check.js","../../frontEndSrc/js/template-helpers.js","../../frontEndSrc/js/anime.js","../../frontEndSrc/js/manga.js"],"sourcesContent":["// -------------------------------------------------------------------------\n// ! Base\n// -------------------------------------------------------------------------\n\nconst matches = (elm, selector) => {\n\tlet m = (elm.document || elm.ownerDocument).querySelectorAll(selector);\n\tlet i = matches.length;\n\twhile (--i >= 0 && m.item(i) !== elm) {};\n\treturn i > -1;\n}\n\nexport const AnimeClient = {\n\t/**\n\t * Placeholder function\n\t */\n\tnoop: () => {},\n\t/**\n\t * DOM selector\n\t *\n\t * @param {string} selector - The dom selector string\n\t * @param {object} [context]\n\t * @return {[HTMLElement]} - array of dom elements\n\t */\n\t$(selector, context = null) {\n\t\tif (typeof selector !== 'string') {\n\t\t\treturn selector;\n\t\t}\n\n\t\tcontext = (context !== null && context.nodeType === 1)\n\t\t\t? context\n\t\t\t: document;\n\n\t\tlet elements = [];\n\t\tif (selector.match(/^#([\\w]+$)/)) {\n\t\t\telements.push(document.getElementById(selector.split('#')[1]));\n\t\t} else {\n\t\t\telements = [].slice.apply(context.querySelectorAll(selector));\n\t\t}\n\n\t\treturn elements;\n\t},\n\t/**\n\t * Does the selector exist on the current page?\n\t *\n\t * @param {string} selector\n\t * @returns {boolean}\n\t */\n\thasElement (selector) {\n\t\treturn AnimeClient.$(selector).length > 0;\n\t},\n\t/**\n\t * Scroll to the top of the Page\n\t *\n\t * @return {void}\n\t */\n\tscrollToTop () {\n\t\tconst el = AnimeClient.$('header')[0];\n\t\tel.scrollIntoView(true);\n\t},\n\t/**\n\t * Hide the selected element\n\t *\n\t * @param {string|Element} sel - the selector of the element to hide\n\t * @return {void}\n\t */\n\thide (sel) {\n\t\tif (typeof sel === 'string') {\n\t\t\tsel = AnimeClient.$(sel);\n\t\t}\n\n\t\tif (Array.isArray(sel)) {\n\t\t\tsel.forEach(el => el.setAttribute('hidden', 'hidden'));\n\t\t} else {\n\t\t\tsel.setAttribute('hidden', 'hidden');\n\t\t}\n\t},\n\t/**\n\t * UnHide the selected element\n\t *\n\t * @param {string|Element} sel - the selector of the element to hide\n\t * @return {void}\n\t */\n\tshow (sel) {\n\t\tif (typeof sel === 'string') {\n\t\t\tsel = AnimeClient.$(sel);\n\t\t}\n\n\t\tif (Array.isArray(sel)) {\n\t\t\tsel.forEach(el => el.removeAttribute('hidden'));\n\t\t} else {\n\t\t\tsel.removeAttribute('hidden');\n\t\t}\n\t},\n\t/**\n\t * Display a message box\n\t *\n\t * @param {string} type - message type: info, error, success\n\t * @param {string} message - the message itself\n\t * @return {void}\n\t */\n\tshowMessage (type, message) {\n\t\tlet template =\n\t\t\t`
\n\t\t\t\t\n\t\t\t\t${message}\n\t\t\t\t\n\t\t\t
`;\n\n\t\tlet sel = AnimeClient.$('.message');\n\t\tif (sel[0] !== undefined) {\n\t\t\tsel[0].remove();\n\t\t}\n\n\t\tAnimeClient.$('header')[0].insertAdjacentHTML('beforeend', template);\n\t},\n\t/**\n\t * Finds the closest parent element matching the passed selector\n\t *\n\t * @param {HTMLElement} current - the current HTMLElement\n\t * @param {string} parentSelector - selector for the parent element\n\t * @return {HTMLElement|null} - the parent element\n\t */\n\tclosestParent (current, parentSelector) {\n\t\tif (Element.prototype.closest !== undefined) {\n\t\t\treturn current.closest(parentSelector);\n\t\t}\n\n\t\twhile (current !== document.documentElement) {\n\t\t\tif (matches(current, parentSelector)) {\n\t\t\t\treturn current;\n\t\t\t}\n\n\t\t\tcurrent = current.parentElement;\n\t\t}\n\n\t\treturn null;\n\t},\n\t/**\n\t * Generate a full url from a relative path\n\t *\n\t * @param {string} path - url path\n\t * @return {string} - full url\n\t */\n\turl (path) {\n\t\tlet uri = `//${document.location.host}`;\n\t\turi += (path.charAt(0) === '/') ? path : `/${path}`;\n\n\t\treturn uri;\n\t},\n\t/**\n\t * Throttle execution of a function\n\t *\n\t * @see https://remysharp.com/2010/07/21/throttling-function-calls\n\t * @see https://jsfiddle.net/jonathansampson/m7G64/\n\t * @param {Number} interval - the minimum throttle time in ms\n\t * @param {Function} fn - the function to throttle\n\t * @param {Object} [scope] - the 'this' object for the function\n\t * @return {Function}\n\t */\n\tthrottle (interval, fn, scope) {\n\t\tlet wait = false;\n\t\treturn function (...args) {\n\t\t\tconst context = scope || this;\n\n\t\t\tif ( ! wait) {\n\t\t\t\tfn.apply(context, args);\n\t\t\t\twait = true;\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\twait = false;\n\t\t\t\t}, interval);\n\t\t\t}\n\t\t};\n\t},\n};\n\n// -------------------------------------------------------------------------\n// ! Events\n// -------------------------------------------------------------------------\n\nfunction addEvent(sel, event, listener) {\n\t// Recurse!\n\tif (! event.match(/^([\\w\\-]+)$/)) {\n\t\tevent.split(' ').forEach((evt) => {\n\t\t\taddEvent(sel, evt, listener);\n\t\t});\n\t}\n\n\tsel.addEventListener(event, listener, false);\n}\n\nfunction delegateEvent(sel, target, event, listener) {\n\t// Attach the listener to the parent\n\taddEvent(sel, event, (e) => {\n\t\t// Get live version of the target selector\n\t\tAnimeClient.$(target, sel).forEach((element) => {\n\t\t\tif(e.target == element) {\n\t\t\t\tlistener.call(element, e);\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Add an event listener\n *\n * @param {string|HTMLElement} sel - the parent selector to bind to\n * @param {string} event - event name(s) to bind\n * @param {string|HTMLElement|function} target - the element to directly bind the event to\n * @param {function} [listener] - event listener callback\n * @return {void}\n */\nAnimeClient.on = (sel, event, target, listener) => {\n\tif (listener === undefined) {\n\t\tlistener = target;\n\t\tAnimeClient.$(sel).forEach((el) => {\n\t\t\taddEvent(el, event, listener);\n\t\t});\n\t} else {\n\t\tAnimeClient.$(sel).forEach((el) => {\n\t\t\tdelegateEvent(el, target, event, listener);\n\t\t});\n\t}\n};\n\n// -------------------------------------------------------------------------\n// ! Ajax\n// -------------------------------------------------------------------------\n\n/**\n * Url encoding for non-get requests\n *\n * @param data\n * @returns {string}\n * @private\n */\nfunction ajaxSerialize(data) {\n\tlet pairs = [];\n\n\tObject.keys(data).forEach((name) => {\n\t\tlet value = data[name].toString();\n\n\t\tname = encodeURIComponent(name);\n\t\tvalue = encodeURIComponent(value);\n\n\t\tpairs.push(`${name}=${value}`);\n\t});\n\n\treturn pairs.join('&');\n}\n\n/**\n * Make an ajax request\n *\n * Config:{\n * \tdata: // data to send with the request\n * \ttype: // http verb of the request, defaults to GET\n * \tsuccess: // success callback\n * \terror: // error callback\n * }\n *\n * @param {string} url - the url to request\n * @param {Object} config - the configuration object\n * @return {XMLHttpRequest}\n */\nAnimeClient.ajax = (url, config) => {\n\t// Set some sane defaults\n\tconst defaultConfig = {\n\t\tdata: {},\n\t\ttype: 'GET',\n\t\tdataType: '',\n\t\tsuccess: AnimeClient.noop,\n\t\tmimeType: 'application/x-www-form-urlencoded',\n\t\terror: AnimeClient.noop\n\t}\n\n\tconfig = {\n\t\t...defaultConfig,\n\t\t...config,\n\t}\n\n\tlet request = new XMLHttpRequest();\n\tlet method = String(config.type).toUpperCase();\n\n\tif (method === 'GET') {\n\t\turl += (url.match(/\\?/))\n\t\t\t? ajaxSerialize(config.data)\n\t\t\t: `?${ajaxSerialize(config.data)}`;\n\t}\n\n\trequest.open(method, url);\n\n\trequest.onreadystatechange = () => {\n\t\tif (request.readyState === 4) {\n\t\t\tlet responseText = '';\n\n\t\t\tif (request.responseType === 'json') {\n\t\t\t\tresponseText = JSON.parse(request.responseText);\n\t\t\t} else {\n\t\t\t\tresponseText = request.responseText;\n\t\t\t}\n\n\t\t\tif (request.status > 299) {\n\t\t\t\tconfig.error.call(null, request.status, responseText, request.response);\n\t\t\t} else {\n\t\t\t\tconfig.success.call(null, responseText, request.status);\n\t\t\t}\n\t\t}\n\t};\n\n\tif (config.dataType === 'json') {\n\t\tconfig.data = JSON.stringify(config.data);\n\t\tconfig.mimeType = 'application/json';\n\t} else {\n\t\tconfig.data = ajaxSerialize(config.data);\n\t}\n\n\trequest.setRequestHeader('Content-Type', config.mimeType);\n\n\tif (method === 'GET') {\n\t\trequest.send(null);\n\t} else {\n\t\trequest.send(config.data);\n\t}\n\n\treturn request\n};\n\n/**\n * Do a get request\n *\n * @param {string} url\n * @param {object|function} data\n * @param {function} [callback]\n * @return {XMLHttpRequest}\n */\nAnimeClient.get = (url, data, callback = null) => {\n\tif (callback === null) {\n\t\tcallback = data;\n\t\tdata = {};\n\t}\n\n\treturn AnimeClient.ajax(url, {\n\t\tdata,\n\t\tsuccess: callback\n\t});\n};\n\n// -------------------------------------------------------------------------\n// Export\n// -------------------------------------------------------------------------\n\nexport default AnimeClient;","import _ from './anime-client.js';\n\n// ----------------------------------------------------------------------------\n// Event subscriptions\n// ----------------------------------------------------------------------------\n_.on('header', 'click', '.message', hide);\n_.on('form.js-delete', 'submit', confirmDelete);\n_.on('.js-clear-cache', 'click', clearAPICache);\n_.on('.vertical-tabs input', 'change', scrollToSection);\n_.on('.media-filter', 'input', filterMedia);\n\n// ----------------------------------------------------------------------------\n// Handler functions\n// ----------------------------------------------------------------------------\n\n/**\n * Hide the html element attached to the event\n *\n * @param event\n * @return void\n */\nfunction hide (event) {\n\t_.hide(event.target)\n}\n\n/**\n * Confirm deletion of an item\n *\n * @param event\n * @return void\n */\nfunction confirmDelete (event) {\n\tconst proceed = confirm('Are you ABSOLUTELY SURE you want to delete this item?');\n\n\tif (proceed === false) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t}\n}\n\n/**\n * Clear the API cache, and show a message if the cache is cleared\n *\n * @return void\n */\nfunction clearAPICache () {\n\t_.get('/cache_purge', () => {\n\t\t_.showMessage('success', 'Successfully purged api cache');\n\t});\n}\n\n/**\n * Scroll to the accordion/vertical tab section just opened\n *\n * @param event\n * @return void\n */\nfunction scrollToSection (event) {\n\tconst el = event.currentTarget.parentElement;\n\tconst rect = el.getBoundingClientRect();\n\n\tconst top = rect.top + window.pageYOffset;\n\n\twindow.scrollTo({\n\t\ttop,\n\t\tbehavior: 'smooth',\n\t});\n}\n\n/**\n * Filter an anime or manga list\n *\n * @param event\n * @return void\n */\nfunction filterMedia (event) {\n\tconst rawFilter = event.target.value;\n\tconst filter = new RegExp(rawFilter, 'i');\n\n\t// console.log('Filtering items by: ', filter);\n\n\tif (rawFilter !== '') {\n\t\t// Filter the cover view\n\t\t_.$('article.media').forEach(article => {\n\t\t\tconst titleLink = _.$('.name a', article)[0];\n\t\t\tconst title = String(titleLink.textContent).trim();\n\t\t\tif ( ! filter.test(title)) {\n\t\t\t\t_.hide(article);\n\t\t\t} else {\n\t\t\t\t_.show(article);\n\t\t\t}\n\t\t});\n\n\t\t// Filter the list view\n\t\t_.$('table.media-wrap tbody tr').forEach(tr => {\n\t\t\tconst titleCell = _.$('td.align-left', tr)[0];\n\t\t\tconst titleLink = _.$('a', titleCell)[0];\n\t\t\tconst linkTitle = String(titleLink.textContent).trim();\n\t\t\tconst textTitle = String(titleCell.textContent).trim();\n\t\t\tif ( ! (filter.test(linkTitle) || filter.test(textTitle))) {\n\t\t\t\t_.hide(tr);\n\t\t\t} else {\n\t\t\t\t_.show(tr);\n\t\t\t}\n\t\t});\n\t} else {\n\t\t_.show('article.media');\n\t\t_.show('table.media-wrap tbody tr');\n\t}\n}\n","import './events.js';\n\nif ('serviceWorker' in navigator) {\n\tnavigator.serviceWorker.register('/sw.js').then(reg => {\n\t\tconsole.log('Service worker registered', reg.scope);\n\t}).catch(error => {\n\t\tconsole.error('Failed to register service worker', error);\n\t});\n}\n\n","import _ from './anime-client.js';\n\n(() => {\n\t// Var is intentional\n\tvar hidden = null;\n\tvar visibilityChange = null;\n\n\tif (typeof document.hidden !== \"undefined\") {\n\t\thidden = \"hidden\";\n\t\tvisibilityChange = \"visibilitychange\";\n\t} else if (typeof document.msHidden !== \"undefined\") {\n\t\thidden = \"msHidden\";\n\t\tvisibilityChange = \"msvisibilitychange\";\n\t} else if (typeof document.webkitHidden !== \"undefined\") {\n\t\thidden = \"webkitHidden\";\n\t\tvisibilityChange = \"webkitvisibilitychange\";\n\t}\n\n\tfunction handleVisibilityChange() {\n\t\t// Check the user's session to see if they are currently logged-in\n\t\t// when the page becomes visible\n\t\tif ( ! document[hidden]) {\n\t\t\t_.get('/heartbeat', (beat) => {\n\t\t\t\tconst status = JSON.parse(beat)\n\n\t\t\t\t// If the session is expired, immediately reload so that\n\t\t\t\t// you can't attempt to do an action that requires authentication\n\t\t\t\tif (status.hasAuth !== true) {\n\t\t\t\t\tdocument.removeEventListener(visibilityChange, handleVisibilityChange, false);\n\t\t\t\t\tlocation.reload();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tif (hidden === null) {\n\t\tconsole.info('Page visibility API not supported, JS session check will not work');\n\t} else {\n\t\tdocument.addEventListener(visibilityChange, handleVisibilityChange, false);\n\t}\n})();","import _ from './anime-client.js';\n\n// Click on hidden MAL checkbox so\n// that MAL id is passed\n_.on('main', 'change', '.big-check', (e) => {\n\tconst id = e.target.id;\n\tdocument.getElementById(`mal_${id}`).checked = true;\n});\n\nexport function renderAnimeSearchResults (data) {\n\tconst results = [];\n\n\tdata.forEach(item => {\n\t\tconst titles = item.titles.join('
');\n\n\t\tresults.push(`\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tInfo Page\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t`);\n\t});\n\n\treturn results.join('');\n}\n\nexport function renderMangaSearchResults (data) {\n\tconst results = [];\n\n\tdata.forEach(item => {\n\t\tconst titles = item.titles.join('
');\n\n\t\tresults.push(`\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tInfo Page\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t`);\n\t});\n\n\treturn results.join('');\n}","import _ from './anime-client.js'\nimport { renderAnimeSearchResults } from './template-helpers.js'\n\nconst search = (query) => {\n\t// Show the loader\n\t_.show('.cssload-loader');\n\n\t// Do the api search\n\treturn _.get(_.url('/anime-collection/search'), { query }, (searchResults, status) => {\n\t\tsearchResults = JSON.parse(searchResults);\n\n\t\t// Hide the loader\n\t\t_.hide('.cssload-loader');\n\n\t\t// Show the results\n\t\t_.$('#series-list')[ 0 ].innerHTML = renderAnimeSearchResults(searchResults);\n\t});\n};\n\nif (_.hasElement('.anime #search')) {\n\tlet prevRequest = null;\n\n\t_.on('#search', 'input', _.throttle(250, (e) => {\n\t\tconst query = encodeURIComponent(e.target.value);\n\t\tif (query === '') {\n\t\t\treturn;\n\t\t}\n\n\t\tif (prevRequest !== null) {\n\t\t\tprevRequest.abort();\n\t\t}\n\n\t\tprevRequest = search(query);\n\t}));\n}\n\n// Action to increment episode count\n_.on('body.anime.list', 'click', '.plus-one', (e) => {\n\tlet parentSel = _.closestParent(e.target, 'article');\n\tlet watchedCount = parseInt(_.$('.completed_number', parentSel)[ 0 ].textContent, 10) || 0;\n\tlet totalCount = parseInt(_.$('.total_number', parentSel)[ 0 ].textContent, 10);\n\tlet title = _.$('.name a', parentSel)[ 0 ].textContent;\n\n\t// Setup the update data\n\tlet data = {\n\t\tid: parentSel.dataset.kitsuId,\n\t\tmal_id: parentSel.dataset.malId,\n\t\tdata: {\n\t\t\tprogress: watchedCount + 1\n\t\t}\n\t};\n\n\t// If the episode count is 0, and incremented,\n\t// change status to currently watching\n\tif (isNaN(watchedCount) || watchedCount === 0) {\n\t\tdata.data.status = 'CURRENT';\n\t}\n\n\t// If you increment at the last episode, mark as completed\n\tif ((!isNaN(watchedCount)) && (watchedCount + 1) === totalCount) {\n\t\tdata.data.status = 'COMPLETED';\n\t}\n\n\t_.show('#loading-shadow');\n\n\t// okay, lets actually make some changes!\n\t_.ajax(_.url('/anime/increment'), {\n\t\tdata,\n\t\tdataType: 'json',\n\t\ttype: 'POST',\n\t\tsuccess: (res) => {\n\t\t\tconst resData = JSON.parse(res);\n\n\t\t\tif (resData.errors) {\n\t\t\t\t_.hide('#loading-shadow');\n\t\t\t\t_.showMessage('error', `Failed to update ${title}. `);\n\t\t\t\t_.scrollToTop();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (resData.data.libraryEntry.update.libraryEntry.status === 'COMPLETED') {\n\t\t\t\t_.hide(parentSel);\n\t\t\t}\n\n\t\t\t_.hide('#loading-shadow');\n\n\t\t\t_.showMessage('success', `Successfully updated ${title}`);\n\t\t\t_.$('.completed_number', parentSel)[ 0 ].textContent = ++watchedCount;\n\t\t\t_.scrollToTop();\n\t\t},\n\t\terror: () => {\n\t\t\t_.hide('#loading-shadow');\n\t\t\t_.showMessage('error', `Failed to update ${title}. `);\n\t\t\t_.scrollToTop();\n\t\t}\n\t});\n});","import _ from './anime-client.js'\nimport { renderMangaSearchResults } from './template-helpers.js'\n\nconst search = (query) => {\n\t_.show('.cssload-loader');\n\treturn _.get(_.url('/manga/search'), { query }, (searchResults, status) => {\n\t\tsearchResults = JSON.parse(searchResults);\n\t\t_.hide('.cssload-loader');\n\t\t_.$('#series-list')[ 0 ].innerHTML = renderMangaSearchResults(searchResults);\n\t});\n};\n\nif (_.hasElement('.manga #search')) {\n\tlet prevRequest = null\n\n\t_.on('#search', 'input', _.throttle(250, (e) => {\n\t\tlet query = encodeURIComponent(e.target.value);\n\t\tif (query === '') {\n\t\t\treturn;\n\t\t}\n\n\t\tif (prevRequest !== null) {\n\t\t\tprevRequest.abort();\n\t\t}\n\n\t\tprevRequest = search(query);\n\t}));\n}\n\n/**\n * Javascript for editing manga, if logged in\n */\n_.on('.manga.list', 'click', '.edit-buttons button', (e) => {\n\tlet thisSel = e.target;\n\tlet parentSel = _.closestParent(e.target, 'article');\n\tlet type = thisSel.classList.contains('plus-one-chapter') ? 'chapter' : 'volume';\n\tlet completed = parseInt(_.$(`.${type}s_read`, parentSel)[ 0 ].textContent, 10) || 0;\n\tlet total = parseInt(_.$(`.${type}_count`, parentSel)[ 0 ].textContent, 10);\n\tlet mangaName = _.$('.name', parentSel)[ 0 ].textContent;\n\n\tif (isNaN(completed)) {\n\t\tcompleted = 0;\n\t}\n\n\t// Setup the update data\n\tlet data = {\n\t\tid: parentSel.dataset.kitsuId,\n\t\tmal_id: parentSel.dataset.malId,\n\t\tdata: {\n\t\t\tprogress: completed\n\t\t}\n\t};\n\n\t// If the episode count is 0, and incremented,\n\t// change status to currently reading\n\tif (isNaN(completed) || completed === 0) {\n\t\tdata.data.status = 'CURRENT';\n\t}\n\n\t// If you increment at the last chapter, mark as completed\n\tif ((!isNaN(completed)) && (completed + 1) === total) {\n\t\tdata.data.status = 'COMPLETED';\n\t}\n\n\t// Update the total count\n\tdata.data.progress = ++completed;\n\n\t_.show('#loading-shadow');\n\n\t_.ajax(_.url('/manga/increment'), {\n\t\tdata,\n\t\tdataType: 'json',\n\t\ttype: 'POST',\n\t\tmimeType: 'application/json',\n\t\tsuccess: () => {\n\t\t\tif (String(data.data.status).toUpperCase() === 'COMPLETED') {\n\t\t\t\t_.hide(parentSel);\n\t\t\t}\n\n\t\t\t_.hide('#loading-shadow');\n\n\t\t\t_.$(`.${type}s_read`, parentSel)[ 0 ].textContent = completed;\n\t\t\t_.showMessage('success', `Successfully updated ${mangaName}`);\n\t\t\t_.scrollToTop();\n\t\t},\n\t\terror: () => {\n\t\t\t_.hide('#loading-shadow');\n\t\t\t_.showMessage('error', `Failed to update ${mangaName}`);\n\t\t\t_.scrollToTop();\n\t\t}\n\t});\n});"],"names":["selector","m","querySelectorAll","elm","document","ownerDocument","i","matches","length","item","noop","$","context","nodeType","elements","match","push","getElementById","split","slice","apply","hasElement","AnimeClient","scrollToTop","el","scrollIntoView","hide","sel","Array","isArray","forEach","setAttribute","show","removeAttribute","showMessage","type","message","template","undefined","remove","insertAdjacentHTML","closestParent","current","parentSelector","Element","prototype","closest","documentElement","parentElement","url","path","uri","location","host","charAt","throttle","interval","fn","scope","wait","args","setTimeout","addEvent","event","listener","evt","addEventListener","delegateEvent","target","e","element","call","stopPropagation","on","AnimeClient.on","ajaxSerialize","data","pairs","Object","keys","name","value","toString","encodeURIComponent","join","ajax","AnimeClient.ajax","config","dataType","success","mimeType","error","defaultConfig","request","XMLHttpRequest","method","String","toUpperCase","open","onreadystatechange","request.onreadystatechange","readyState","responseText","responseType","JSON","parse","status","response","stringify","setRequestHeader","send","get","AnimeClient.get","callback","confirmDelete","clearAPICache","scrollToSection","filterMedia","_","proceed","preventDefault","window","scrollTo","top","behavior","rawFilter","article","filter","test","title","tr","titleCell","linkTitle","textTitle","navigator","serviceWorker","register","then","reg","console","log","catch","hidden","visibilityChange","msHidden","webkitHidden","handleVisibilityChange","beat","hasAuth","removeEventListener","reload","info","id","checked","renderAnimeSearchResults","results","slug","mal_id","canonicalTitle","titles","renderMangaSearchResults","query","searchResults","prevRequest","abort","search","parentSel","watchedCount","parseInt","totalCount","dataset","kitsuId","malId","progress","isNaN","res","resData","errors","libraryEntry","update","thisSel","classList","contains","completed","total","mangaName"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"scripts.min.js.map","sources":["../../frontEndSrc/js/anime-client.js","../../frontEndSrc/js/events.js","../../frontEndSrc/js/anon.js","../../frontEndSrc/js/session-check.js","../../frontEndSrc/js/template-helpers.js","../../frontEndSrc/js/anime.js","../../frontEndSrc/js/manga.js"],"sourcesContent":["// -------------------------------------------------------------------------\n// ! Base\n// -------------------------------------------------------------------------\n\nconst matches = (elm, selector) => {\n\tlet m = (elm.document || elm.ownerDocument).querySelectorAll(selector);\n\tlet i = matches.length;\n\twhile (--i >= 0 && m.item(i) !== elm) {};\n\treturn i > -1;\n}\n\nexport const AnimeClient = {\n\t/**\n\t * Placeholder function\n\t */\n\tnoop: () => {},\n\t/**\n\t * DOM selector\n\t *\n\t * @param {string} selector - The dom selector string\n\t * @param {object} [context]\n\t * @return {[HTMLElement]} - array of dom elements\n\t */\n\t$(selector, context = null) {\n\t\tif (typeof selector !== 'string') {\n\t\t\treturn selector;\n\t\t}\n\n\t\tcontext = (context !== null && context.nodeType === 1)\n\t\t\t? context\n\t\t\t: document;\n\n\t\tlet elements = [];\n\t\tif (selector.match(/^#([\\w]+$)/)) {\n\t\t\telements.push(document.getElementById(selector.split('#')[1]));\n\t\t} else {\n\t\t\telements = [].slice.apply(context.querySelectorAll(selector));\n\t\t}\n\n\t\treturn elements;\n\t},\n\t/**\n\t * Does the selector exist on the current page?\n\t *\n\t * @param {string} selector\n\t * @returns {boolean}\n\t */\n\thasElement (selector) {\n\t\treturn AnimeClient.$(selector).length > 0;\n\t},\n\t/**\n\t * Scroll to the top of the Page\n\t *\n\t * @return {void}\n\t */\n\tscrollToTop () {\n\t\tconst el = AnimeClient.$('header')[0];\n\t\tel.scrollIntoView(true);\n\t},\n\t/**\n\t * Hide the selected element\n\t *\n\t * @param {string|Element} sel - the selector of the element to hide\n\t * @return {void}\n\t */\n\thide (sel) {\n\t\tif (typeof sel === 'string') {\n\t\t\tsel = AnimeClient.$(sel);\n\t\t}\n\n\t\tif (Array.isArray(sel)) {\n\t\t\tsel.forEach(el => el.setAttribute('hidden', 'hidden'));\n\t\t} else {\n\t\t\tsel.setAttribute('hidden', 'hidden');\n\t\t}\n\t},\n\t/**\n\t * UnHide the selected element\n\t *\n\t * @param {string|Element} sel - the selector of the element to hide\n\t * @return {void}\n\t */\n\tshow (sel) {\n\t\tif (typeof sel === 'string') {\n\t\t\tsel = AnimeClient.$(sel);\n\t\t}\n\n\t\tif (Array.isArray(sel)) {\n\t\t\tsel.forEach(el => el.removeAttribute('hidden'));\n\t\t} else {\n\t\t\tsel.removeAttribute('hidden');\n\t\t}\n\t},\n\t/**\n\t * Display a message box\n\t *\n\t * @param {string} type - message type: info, error, success\n\t * @param {string} message - the message itself\n\t * @return {void}\n\t */\n\tshowMessage (type, message) {\n\t\tlet template =\n\t\t\t`
\n\t\t\t\t\n\t\t\t\t${message}\n\t\t\t\t\n\t\t\t
`;\n\n\t\tlet sel = AnimeClient.$('.message');\n\t\tif (sel[0] !== undefined) {\n\t\t\tsel[0].remove();\n\t\t}\n\n\t\tAnimeClient.$('header')[0].insertAdjacentHTML('beforeend', template);\n\t},\n\t/**\n\t * Finds the closest parent element matching the passed selector\n\t *\n\t * @param {HTMLElement} current - the current HTMLElement\n\t * @param {string} parentSelector - selector for the parent element\n\t * @return {HTMLElement|null} - the parent element\n\t */\n\tclosestParent (current, parentSelector) {\n\t\tif (Element.prototype.closest !== undefined) {\n\t\t\treturn current.closest(parentSelector);\n\t\t}\n\n\t\twhile (current !== document.documentElement) {\n\t\t\tif (matches(current, parentSelector)) {\n\t\t\t\treturn current;\n\t\t\t}\n\n\t\t\tcurrent = current.parentElement;\n\t\t}\n\n\t\treturn null;\n\t},\n\t/**\n\t * Generate a full url from a relative path\n\t *\n\t * @param {string} path - url path\n\t * @return {string} - full url\n\t */\n\turl (path) {\n\t\tlet uri = `//${document.location.host}`;\n\t\turi += (path.charAt(0) === '/') ? path : `/${path}`;\n\n\t\treturn uri;\n\t},\n\t/**\n\t * Throttle execution of a function\n\t *\n\t * @see https://remysharp.com/2010/07/21/throttling-function-calls\n\t * @see https://jsfiddle.net/jonathansampson/m7G64/\n\t * @param {Number} interval - the minimum throttle time in ms\n\t * @param {Function} fn - the function to throttle\n\t * @param {Object} [scope] - the 'this' object for the function\n\t * @return {Function}\n\t */\n\tthrottle (interval, fn, scope) {\n\t\tlet wait = false;\n\t\treturn function (...args) {\n\t\t\tconst context = scope || this;\n\n\t\t\tif ( ! wait) {\n\t\t\t\tfn.apply(context, args);\n\t\t\t\twait = true;\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\twait = false;\n\t\t\t\t}, interval);\n\t\t\t}\n\t\t};\n\t},\n};\n\n// -------------------------------------------------------------------------\n// ! Events\n// -------------------------------------------------------------------------\n\nfunction addEvent(sel, event, listener) {\n\t// Recurse!\n\tif (! event.match(/^([\\w\\-]+)$/)) {\n\t\tevent.split(' ').forEach((evt) => {\n\t\t\taddEvent(sel, evt, listener);\n\t\t});\n\t}\n\n\tsel.addEventListener(event, listener, false);\n}\n\nfunction delegateEvent(sel, target, event, listener) {\n\t// Attach the listener to the parent\n\taddEvent(sel, event, (e) => {\n\t\t// Get live version of the target selector\n\t\tAnimeClient.$(target, sel).forEach((element) => {\n\t\t\tif(e.target == element) {\n\t\t\t\tlistener.call(element, e);\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Add an event listener\n *\n * @param {string|HTMLElement} sel - the parent selector to bind to\n * @param {string} event - event name(s) to bind\n * @param {string|HTMLElement|function} target - the element to directly bind the event to\n * @param {function} [listener] - event listener callback\n * @return {void}\n */\nAnimeClient.on = (sel, event, target, listener) => {\n\tif (listener === undefined) {\n\t\tlistener = target;\n\t\tAnimeClient.$(sel).forEach((el) => {\n\t\t\taddEvent(el, event, listener);\n\t\t});\n\t} else {\n\t\tAnimeClient.$(sel).forEach((el) => {\n\t\t\tdelegateEvent(el, target, event, listener);\n\t\t});\n\t}\n};\n\n// -------------------------------------------------------------------------\n// ! Ajax\n// -------------------------------------------------------------------------\n\n/**\n * Url encoding for non-get requests\n *\n * @param data\n * @returns {string}\n * @private\n */\nfunction ajaxSerialize(data) {\n\tlet pairs = [];\n\n\tObject.keys(data).forEach((name) => {\n\t\tlet value = data[name].toString();\n\n\t\tname = encodeURIComponent(name);\n\t\tvalue = encodeURIComponent(value);\n\n\t\tpairs.push(`${name}=${value}`);\n\t});\n\n\treturn pairs.join('&');\n}\n\n/**\n * Make an ajax request\n *\n * Config:{\n * \tdata: // data to send with the request\n * \ttype: // http verb of the request, defaults to GET\n * \tsuccess: // success callback\n * \terror: // error callback\n * }\n *\n * @param {string} url - the url to request\n * @param {Object} config - the configuration object\n * @return {XMLHttpRequest}\n */\nAnimeClient.ajax = (url, config) => {\n\t// Set some sane defaults\n\tconst defaultConfig = {\n\t\tdata: {},\n\t\ttype: 'GET',\n\t\tdataType: '',\n\t\tsuccess: AnimeClient.noop,\n\t\tmimeType: 'application/x-www-form-urlencoded',\n\t\terror: AnimeClient.noop\n\t}\n\n\tconfig = {\n\t\t...defaultConfig,\n\t\t...config,\n\t}\n\n\tlet request = new XMLHttpRequest();\n\tlet method = String(config.type).toUpperCase();\n\n\tif (method === 'GET') {\n\t\turl += (url.match(/\\?/))\n\t\t\t? ajaxSerialize(config.data)\n\t\t\t: `?${ajaxSerialize(config.data)}`;\n\t}\n\n\trequest.open(method, url);\n\n\trequest.onreadystatechange = () => {\n\t\tif (request.readyState === 4) {\n\t\t\tlet responseText = '';\n\n\t\t\tif (request.responseType === 'json') {\n\t\t\t\tresponseText = JSON.parse(request.responseText);\n\t\t\t} else {\n\t\t\t\tresponseText = request.responseText;\n\t\t\t}\n\n\t\t\tif (request.status > 299) {\n\t\t\t\tconfig.error.call(null, request.status, responseText, request.response);\n\t\t\t} else {\n\t\t\t\tconfig.success.call(null, responseText, request.status);\n\t\t\t}\n\t\t}\n\t};\n\n\tif (config.dataType === 'json') {\n\t\tconfig.data = JSON.stringify(config.data);\n\t\tconfig.mimeType = 'application/json';\n\t} else {\n\t\tconfig.data = ajaxSerialize(config.data);\n\t}\n\n\trequest.setRequestHeader('Content-Type', config.mimeType);\n\n\tif (method === 'GET') {\n\t\trequest.send(null);\n\t} else {\n\t\trequest.send(config.data);\n\t}\n\n\treturn request\n};\n\n/**\n * Do a get request\n *\n * @param {string} url\n * @param {object|function} data\n * @param {function} [callback]\n * @return {XMLHttpRequest}\n */\nAnimeClient.get = (url, data, callback = null) => {\n\tif (callback === null) {\n\t\tcallback = data;\n\t\tdata = {};\n\t}\n\n\treturn AnimeClient.ajax(url, {\n\t\tdata,\n\t\tsuccess: callback\n\t});\n};\n\n// -------------------------------------------------------------------------\n// Export\n// -------------------------------------------------------------------------\n\nexport default AnimeClient;","import _ from './anime-client.js';\n\n// ----------------------------------------------------------------------------\n// Event subscriptions\n// ----------------------------------------------------------------------------\n_.on('header', 'click', '.message', hide);\n_.on('form.js-delete', 'submit', confirmDelete);\n_.on('.js-clear-cache', 'click', clearAPICache);\n_.on('.vertical-tabs input', 'change', scrollToSection);\n_.on('.media-filter', 'input', filterMedia);\n\n// ----------------------------------------------------------------------------\n// Handler functions\n// ----------------------------------------------------------------------------\n\n/**\n * Hide the html element attached to the event\n *\n * @param event\n * @return void\n */\nfunction hide (event) {\n\t_.hide(event.target)\n}\n\n/**\n * Confirm deletion of an item\n *\n * @param event\n * @return void\n */\nfunction confirmDelete (event) {\n\tconst proceed = confirm('Are you ABSOLUTELY SURE you want to delete this item?');\n\n\tif (proceed === false) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t}\n}\n\n/**\n * Clear the API cache, and show a message if the cache is cleared\n *\n * @return void\n */\nfunction clearAPICache () {\n\t_.get('/cache_purge', () => {\n\t\t_.showMessage('success', 'Successfully purged api cache');\n\t});\n}\n\n/**\n * Scroll to the accordion/vertical tab section just opened\n *\n * @param event\n * @return void\n */\nfunction scrollToSection (event) {\n\tconst el = event.currentTarget.parentElement;\n\tconst rect = el.getBoundingClientRect();\n\n\tconst top = rect.top + window.pageYOffset;\n\n\twindow.scrollTo({\n\t\ttop,\n\t\tbehavior: 'smooth',\n\t});\n}\n\n/**\n * Filter an anime or manga list\n *\n * @param event\n * @return void\n */\nfunction filterMedia (event) {\n\tconst rawFilter = event.target.value;\n\tconst filter = new RegExp(rawFilter, 'i');\n\n\t// console.log('Filtering items by: ', filter);\n\n\tif (rawFilter !== '') {\n\t\t// Filter the cover view\n\t\t_.$('article.media').forEach(article => {\n\t\t\tconst titleLink = _.$('.name a', article)[0];\n\t\t\tconst title = String(titleLink.textContent).trim();\n\t\t\tif ( ! filter.test(title)) {\n\t\t\t\t_.hide(article);\n\t\t\t} else {\n\t\t\t\t_.show(article);\n\t\t\t}\n\t\t});\n\n\t\t// Filter the list view\n\t\t_.$('table.media-wrap tbody tr').forEach(tr => {\n\t\t\tconst titleCell = _.$('td.align-left', tr)[0];\n\t\t\tconst titleLink = _.$('a', titleCell)[0];\n\t\t\tconst linkTitle = String(titleLink.textContent).trim();\n\t\t\tconst textTitle = String(titleCell.textContent).trim();\n\t\t\tif ( ! (filter.test(linkTitle) || filter.test(textTitle))) {\n\t\t\t\t_.hide(tr);\n\t\t\t} else {\n\t\t\t\t_.show(tr);\n\t\t\t}\n\t\t});\n\t} else {\n\t\t_.show('article.media');\n\t\t_.show('table.media-wrap tbody tr');\n\t}\n}\n","import './events.js';\n\nif ('serviceWorker' in navigator) {\n\tnavigator.serviceWorker.register('/sw.js').then(reg => {\n\t\tconsole.log('Service worker registered', reg.scope);\n\t}).catch(error => {\n\t\tconsole.error('Failed to register service worker', error);\n\t});\n}\n\n","import _ from './anime-client.js';\n\n(() => {\n\t// Var is intentional\n\tvar hidden = null;\n\tvar visibilityChange = null;\n\n\tif (typeof document.hidden !== \"undefined\") {\n\t\thidden = \"hidden\";\n\t\tvisibilityChange = \"visibilitychange\";\n\t} else if (typeof document.msHidden !== \"undefined\") {\n\t\thidden = \"msHidden\";\n\t\tvisibilityChange = \"msvisibilitychange\";\n\t} else if (typeof document.webkitHidden !== \"undefined\") {\n\t\thidden = \"webkitHidden\";\n\t\tvisibilityChange = \"webkitvisibilitychange\";\n\t}\n\n\tfunction handleVisibilityChange() {\n\t\t// Check the user's session to see if they are currently logged-in\n\t\t// when the page becomes visible\n\t\tif ( ! document[hidden]) {\n\t\t\t_.get('/heartbeat', (beat) => {\n\t\t\t\tconst status = JSON.parse(beat)\n\n\t\t\t\t// If the session is expired, immediately reload so that\n\t\t\t\t// you can't attempt to do an action that requires authentication\n\t\t\t\tif (status.hasAuth !== true) {\n\t\t\t\t\tdocument.removeEventListener(visibilityChange, handleVisibilityChange, false);\n\t\t\t\t\tlocation.reload();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tif (hidden === null) {\n\t\tconsole.info('Page visibility API not supported, JS session check will not work');\n\t} else {\n\t\tdocument.addEventListener(visibilityChange, handleVisibilityChange, false);\n\t}\n})();","import _ from './anime-client.js';\n\n// Click on hidden MAL checkbox so\n// that MAL id is passed\n_.on('main', 'change', '.big-check', (e) => {\n\tconst id = e.target.id;\n\tdocument.getElementById(`mal_${id}`).checked = true;\n});\n\nexport function renderAnimeSearchResults (data) {\n\treturn data.map(item => {\n\t\tconst titles = item.titles.join('
');\n\n\t\treturn `\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tInfo Page\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t`;\n\t}).join('');\n}\n\nexport function renderMangaSearchResults (data) {\n\treturn data.map(item => {\n\t\tconst titles = item.titles.join('
');\n\t\treturn `\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tInfo Page\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t`;\n\t}).join('');\n}","import _ from './anime-client.js'\nimport { renderAnimeSearchResults } from './template-helpers.js'\n\nconst search = (query) => {\n\t// Show the loader\n\t_.show('.cssload-loader');\n\n\t// Do the api search\n\treturn _.get(_.url('/anime-collection/search'), { query }, (searchResults, status) => {\n\t\tsearchResults = JSON.parse(searchResults);\n\n\t\t// Hide the loader\n\t\t_.hide('.cssload-loader');\n\n\t\t// Show the results\n\t\t_.$('#series-list')[ 0 ].innerHTML = renderAnimeSearchResults(searchResults);\n\t});\n};\n\nif (_.hasElement('.anime #search')) {\n\tlet prevRequest = null;\n\n\t_.on('#search', 'input', _.throttle(250, (e) => {\n\t\tconst query = encodeURIComponent(e.target.value);\n\t\tif (query === '') {\n\t\t\treturn;\n\t\t}\n\n\t\tif (prevRequest !== null) {\n\t\t\tprevRequest.abort();\n\t\t}\n\n\t\tprevRequest = search(query);\n\t}));\n}\n\n// Action to increment episode count\n_.on('body.anime.list', 'click', '.plus-one', (e) => {\n\tlet parentSel = _.closestParent(e.target, 'article');\n\tlet watchedCount = parseInt(_.$('.completed_number', parentSel)[ 0 ].textContent, 10) || 0;\n\tlet totalCount = parseInt(_.$('.total_number', parentSel)[ 0 ].textContent, 10);\n\tlet title = _.$('.name a', parentSel)[ 0 ].textContent;\n\n\t// Setup the update data\n\tlet data = {\n\t\tid: parentSel.dataset.kitsuId,\n\t\tmal_id: parentSel.dataset.malId,\n\t\tdata: {\n\t\t\tprogress: watchedCount + 1\n\t\t}\n\t};\n\n\t// If the episode count is 0, and incremented,\n\t// change status to currently watching\n\tif (isNaN(watchedCount) || watchedCount === 0) {\n\t\tdata.data.status = 'CURRENT';\n\t}\n\n\t// If you increment at the last episode, mark as completed\n\tif ((!isNaN(watchedCount)) && (watchedCount + 1) === totalCount) {\n\t\tdata.data.status = 'COMPLETED';\n\t}\n\n\t_.show('#loading-shadow');\n\n\t// okay, lets actually make some changes!\n\t_.ajax(_.url('/anime/increment'), {\n\t\tdata,\n\t\tdataType: 'json',\n\t\ttype: 'POST',\n\t\tsuccess: (res) => {\n\t\t\tconst resData = JSON.parse(res);\n\n\t\t\tif (resData.errors) {\n\t\t\t\t_.hide('#loading-shadow');\n\t\t\t\t_.showMessage('error', `Failed to update ${title}. `);\n\t\t\t\t_.scrollToTop();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (resData.data.libraryEntry.update.libraryEntry.status === 'COMPLETED') {\n\t\t\t\t_.hide(parentSel);\n\t\t\t}\n\n\t\t\t_.hide('#loading-shadow');\n\n\t\t\t_.showMessage('success', `Successfully updated ${title}`);\n\t\t\t_.$('.completed_number', parentSel)[ 0 ].textContent = ++watchedCount;\n\t\t\t_.scrollToTop();\n\t\t},\n\t\terror: () => {\n\t\t\t_.hide('#loading-shadow');\n\t\t\t_.showMessage('error', `Failed to update ${title}. `);\n\t\t\t_.scrollToTop();\n\t\t}\n\t});\n});","import _ from './anime-client.js'\nimport { renderMangaSearchResults } from './template-helpers.js'\n\nconst search = (query) => {\n\t_.show('.cssload-loader');\n\treturn _.get(_.url('/manga/search'), { query }, (searchResults, status) => {\n\t\tsearchResults = JSON.parse(searchResults);\n\t\t_.hide('.cssload-loader');\n\t\t_.$('#series-list')[ 0 ].innerHTML = renderMangaSearchResults(searchResults);\n\t});\n};\n\nif (_.hasElement('.manga #search')) {\n\tlet prevRequest = null\n\n\t_.on('#search', 'input', _.throttle(250, (e) => {\n\t\tlet query = encodeURIComponent(e.target.value);\n\t\tif (query === '') {\n\t\t\treturn;\n\t\t}\n\n\t\tif (prevRequest !== null) {\n\t\t\tprevRequest.abort();\n\t\t}\n\n\t\tprevRequest = search(query);\n\t}));\n}\n\n/**\n * Javascript for editing manga, if logged in\n */\n_.on('.manga.list', 'click', '.edit-buttons button', (e) => {\n\tlet thisSel = e.target;\n\tlet parentSel = _.closestParent(e.target, 'article');\n\tlet type = thisSel.classList.contains('plus-one-chapter') ? 'chapter' : 'volume';\n\tlet completed = parseInt(_.$(`.${type}s_read`, parentSel)[ 0 ].textContent, 10) || 0;\n\tlet total = parseInt(_.$(`.${type}_count`, parentSel)[ 0 ].textContent, 10);\n\tlet mangaName = _.$('.name', parentSel)[ 0 ].textContent;\n\n\tif (isNaN(completed)) {\n\t\tcompleted = 0;\n\t}\n\n\t// Setup the update data\n\tlet data = {\n\t\tid: parentSel.dataset.kitsuId,\n\t\tmal_id: parentSel.dataset.malId,\n\t\tdata: {\n\t\t\tprogress: completed\n\t\t}\n\t};\n\n\t// If the episode count is 0, and incremented,\n\t// change status to currently reading\n\tif (isNaN(completed) || completed === 0) {\n\t\tdata.data.status = 'CURRENT';\n\t}\n\n\t// If you increment at the last chapter, mark as completed\n\tif ((!isNaN(completed)) && (completed + 1) === total) {\n\t\tdata.data.status = 'COMPLETED';\n\t}\n\n\t// Update the total count\n\tdata.data.progress = ++completed;\n\n\t_.show('#loading-shadow');\n\n\t_.ajax(_.url('/manga/increment'), {\n\t\tdata,\n\t\tdataType: 'json',\n\t\ttype: 'POST',\n\t\tmimeType: 'application/json',\n\t\tsuccess: () => {\n\t\t\tif (String(data.data.status).toUpperCase() === 'COMPLETED') {\n\t\t\t\t_.hide(parentSel);\n\t\t\t}\n\n\t\t\t_.hide('#loading-shadow');\n\n\t\t\t_.$(`.${type}s_read`, parentSel)[ 0 ].textContent = completed;\n\t\t\t_.showMessage('success', `Successfully updated ${mangaName}`);\n\t\t\t_.scrollToTop();\n\t\t},\n\t\terror: () => {\n\t\t\t_.hide('#loading-shadow');\n\t\t\t_.showMessage('error', `Failed to update ${mangaName}`);\n\t\t\t_.scrollToTop();\n\t\t}\n\t});\n});"],"names":["selector","m","querySelectorAll","elm","document","ownerDocument","i","matches","length","item","noop","$","context","nodeType","elements","match","push","getElementById","split","slice","apply","hasElement","AnimeClient","scrollToTop","el","scrollIntoView","hide","sel","Array","isArray","forEach","setAttribute","show","removeAttribute","showMessage","type","message","template","undefined","remove","insertAdjacentHTML","closestParent","current","parentSelector","Element","prototype","closest","documentElement","parentElement","url","path","uri","location","host","charAt","throttle","interval","fn","scope","wait","args","setTimeout","addEvent","event","listener","evt","addEventListener","delegateEvent","target","e","element","call","stopPropagation","on","AnimeClient.on","ajaxSerialize","data","pairs","Object","keys","name","value","toString","encodeURIComponent","join","ajax","AnimeClient.ajax","config","dataType","success","mimeType","error","defaultConfig","request","XMLHttpRequest","method","String","toUpperCase","open","onreadystatechange","request.onreadystatechange","readyState","responseText","responseType","JSON","parse","status","response","stringify","setRequestHeader","send","get","AnimeClient.get","callback","confirmDelete","clearAPICache","scrollToSection","filterMedia","_","proceed","preventDefault","window","scrollTo","top","behavior","rawFilter","article","filter","test","title","tr","titleCell","linkTitle","textTitle","navigator","serviceWorker","register","then","reg","console","log","catch","hidden","visibilityChange","msHidden","webkitHidden","handleVisibilityChange","beat","hasAuth","removeEventListener","reload","info","id","checked","renderAnimeSearchResults","map","slug","mal_id","canonicalTitle","titles","renderMangaSearchResults","query","searchResults","prevRequest","abort","search","parentSel","watchedCount","parseInt","totalCount","dataset","kitsuId","malId","progress","isNaN","res","resData","errors","libraryEntry","update","thisSel","classList","contains","completed","total","mangaName"],"mappings":"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"} \ No newline at end of file From c6677de5432131cc0b8c9e8a0769312ac28fad0c Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Thu, 18 Feb 2021 07:15:43 -0500 Subject: [PATCH 04/28] Fix Content Security Policy --- src/AnimeClient/Controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AnimeClient/Controller.php b/src/AnimeClient/Controller.php index f96318d8..ab109960 100644 --- a/src/AnimeClient/Controller.php +++ b/src/AnimeClient/Controller.php @@ -236,7 +236,7 @@ class Controller { $csp = [ "default-src 'self'", "object-src 'none'", - 'frame-src *.youtube.com', + "child-src 'self' *.youtube.com polyfill.io", ]; $view->addHeader('Content-Security-Policy', implode('; ', $csp)); From cd7f042acbe79403f1ca1565874844590f70f3f7 Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Thu, 18 Feb 2021 07:22:10 -0500 Subject: [PATCH 05/28] Remove some invalid exception docblock tags --- src/AnimeClient/Controller.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/AnimeClient/Controller.php b/src/AnimeClient/Controller.php index ab109960..519d8213 100644 --- a/src/AnimeClient/Controller.php +++ b/src/AnimeClient/Controller.php @@ -259,8 +259,6 @@ class Controller { * @param string $title * @param string $message * @throws InvalidArgumentException - * @throws ContainerException - * @throws NotFoundException * @return void */ public function notFound( @@ -283,8 +281,6 @@ class Controller { * @param string $message * @param string $longMessage * @throws InvalidArgumentException - * @throws ContainerException - * @throws NotFoundException * @return void */ public function errorPage(int $httpCode, string $title, string $message, string $longMessage = ''): void @@ -351,8 +347,6 @@ class Controller { * @param string $type * @param string $message * @throws InvalidArgumentException - * @throws ContainerException - * @throws NotFoundException * @return string */ protected function showMessage(HtmlView $view, string $type, string $message): string @@ -371,8 +365,6 @@ class Controller { * @param HtmlView|NULL $view * @param int $code * @throws InvalidArgumentException - * @throws ContainerException - * @throws NotFoundException * @return void */ protected function outputHTML(string $template, array $data = [], $view = NULL, int $code = 200): void From 97df64bf7a6239707c7c10dd3006cbd22a89e713 Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Thu, 18 Feb 2021 07:37:33 -0500 Subject: [PATCH 06/28] Remove RoboFile --- RoboFile.php | 316 -------------------------------------------------- composer.json | 1 - 2 files changed, 317 deletions(-) delete mode 100644 RoboFile.php diff --git a/RoboFile.php b/RoboFile.php deleted file mode 100644 index 26749f7e..00000000 --- a/RoboFile.php +++ /dev/null @@ -1,316 +0,0 @@ -prepare(); - $this->lint(); - $this->phploc(TRUE); - $this->phpcs(TRUE); - $this->phpmd(TRUE); - $this->dependencyReport(); - $this->phpcpdReport(); - } - - /** - * Run all tests, generate coverage, generate docs, generate code statistics - */ - public function build(): void - { - $this->analyze(); - $this->coverage(); - $this->docs(); - } - - /** - * Cleanup temporary files - */ - public function clean(): void - { - $cleanFiles = [ - 'build/humbug.json', - 'build/humbug-log.txt', - ]; - array_map(static function ($file) { - @unlink($file); - }, $cleanFiles); - - // So the task doesn't complain, - // make any 'missing' dirs to cleanup - array_map(static function ($dir) { - if ( ! is_dir($dir)) - { - `mkdir -p {$dir}`; - } - }, $this->cleanDirs); - - $this->_cleanDir($this->cleanDirs); - $this->_deleteDir($this->cleanDirs); - } - - /** - * Run unit tests and generate coverage reports - */ - public function coverage(): void - { - $this->_run(['phpdbg -qrr -- vendor/bin/phpunit -c build']); - } - - /** - * Generate documentation with phpdox - */ - public function docs(): void - { - $cmd_parts = [ - 'vendor/bin/phpdox', - ]; - $this->_run($cmd_parts, ' && '); - } - - /** - * Verify that source files are valid - */ - public function lint(): void - { - $files = $this->getAllSourceFiles(); - - $chunks = array_chunk($files, (int)shell_exec('getconf _NPROCESSORS_ONLN')); - - foreach($chunks as $chunk) - { - $this->parallelLint($chunk); - } - } - - /** - * Run the phpcs tool - * - * @param bool $report - if true, generates reports instead of direct output - */ - public function phpcs($report = FALSE): void - { - $report_cmd_parts = [ - 'vendor/bin/phpcs', - '--standard=./build/phpcs.xml', - '--report-checkstyle=./build/logs/phpcs.xml', - ]; - - $normal_cmd_parts = [ - 'vendor/bin/phpcs', - '--standard=./build/phpcs.xml', - ]; - - $cmd_parts = ($report) ? $report_cmd_parts : $normal_cmd_parts; - - $this->_run($cmd_parts); - } - - public function phpmd($report = FALSE): void - { - $report_cmd_parts = [ - 'vendor/bin/phpmd', - './src', - 'xml', - 'cleancode,codesize,controversial,design,naming,unusedcode', - '--exclude ParallelAPIRequest', - '--reportfile ./build/logs/phpmd.xml' - ]; - - $normal_cmd_parts = [ - 'vendor/bin/phpmd', - './src', - 'ansi', - 'cleancode,codesize,controversial,design,naming,unusedcode', - '--exclude ParallelAPIRequest' - ]; - - $cmd_parts = ($report) ? $report_cmd_parts : $normal_cmd_parts; - - $this->_run($cmd_parts); - } - - /** - * Run the phploc tool - * - * @param bool $report - if true, generates reports instead of direct output - */ - public function phploc($report = FALSE): void - { - // Command for generating reports - $report_cmd_parts = [ - 'vendor/bin/phploc', - '--count-tests', - '--log-csv=build/logs/phploc.csv', - '--log-xml=build/logs/phploc.xml', - 'src', - 'tests' - ]; - - // Command for generating direct output - $normal_cmd_parts = [ - 'vendor/bin/phploc', - '--count-tests', - 'src', - 'tests' - ]; - - $cmd_parts = ($report) ? $report_cmd_parts : $normal_cmd_parts; - - $this->_run($cmd_parts); - } - - /** - * Create temporary directories - */ - public function prepare(): void - { - array_map([$this, '_mkdir'], $this->taskDirs); - } - - /** - * Lint php files and run unit tests - */ - public function test(): void - { - $this->lint(); - - $this->_run(['vendor/bin/phpunit']); - } - - /** - * Create pdepend reports - */ - protected function dependencyReport(): void - { - $cmd_parts = [ - 'vendor/bin/pdepend', - '--jdepend-xml=build/logs/jdepend.xml', - '--jdepend-chart=build/pdepend/dependencies.svg', - '--overview-pyramid=build/pdepend/overview-pyramid.svg', - 'src' - ]; - $this->_run($cmd_parts); - } - - /** - * Get the total list of source files, including tests - * - * @return array - */ - protected function getAllSourceFiles(): array - { - $files = array_merge( - glob_recursive('build/*.php'), - glob_recursive('src/*.php'), - glob_recursive('src/**/*.php'), - glob_recursive('tests/*.php'), - glob_recursive('tests/**/*.php'), - glob('*.php') - ); - - $files = array_filter($files, static function(string $value) { - return strpos($value, '__snapshots__') === FALSE; - }); - - sort($files); - - return $files; - } - - /** - * Run php's linter in one parallel task for the passed chunk - * - * @param array $chunk - */ - protected function parallelLint(array $chunk): void - { - $task = $this->taskParallelExec() - ->timeout(5) - ->printed(FALSE); - - foreach($chunk as $file) - { - $task = $task->process("php -l {$file}"); - } - - $task->run(); - } - - /** - * Generate copy paste detector report - */ - protected function phpcpdReport(): void - { - $cmd_parts = [ - 'vendor/bin/phpcpd', - '--log-pmd build/logs/pmd-cpd.xml', - 'src' - ]; - $this->_run($cmd_parts); - } - - /** - * Shortcut for joining an array of command arguments - * and then running it - * - * @param array $cmd_parts - command arguments - * @param string $join_on - what to join the command arguments with - */ - protected function _run(array $cmd_parts, $join_on = ' '): void - { - $this->taskExec(implode($join_on, $cmd_parts))->run(); - } -} \ No newline at end of file diff --git a/composer.json b/composer.json index 315f2f16..10d0833e 100644 --- a/composer.json +++ b/composer.json @@ -62,7 +62,6 @@ "yosymfony/toml": "^1.0.4" }, "require-dev": { - "consolidation/robo": "^2.0.0", "pdepend/pdepend": "^2.", "phploc/phploc": "^7.0.0", "phpmd/phpmd": "^2.8.2", From a338a43e43c320b45edcc0462c849afa16ed6c16 Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Thu, 18 Feb 2021 12:48:59 -0500 Subject: [PATCH 07/28] A few minor fixes --- Jenkinsfile | 2 +- console | 2 +- index.php | 11 ++++++++--- src/AnimeClient/Command/BaseCommand.php | 8 +++++--- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 1b7c9715..47f58808 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -37,7 +37,7 @@ pipeline { stage('Code Cleanliness') { agent any steps { - sh "php8 ./vendor/bin/phpstan analyse -c phpstan.neon -n --no-progress --no-ansi --error-format=checkstyle | awk '{\$1=\$1;print}' > build/logs/phpstan.log" + sh "php ./vendor/bin/phpstan analyse -c phpstan.neon -n --no-progress --no-ansi --error-format=checkstyle | awk '{\$1=\$1;print}' > build/logs/phpstan.log" recordIssues( failOnError: false, tools: [phpStan(reportEncoding: 'UTF-8', pattern: 'build/logs/phpstan.log')] diff --git a/console b/console index fb69e144..7c4260cb 100755 --- a/console +++ b/console @@ -26,7 +26,7 @@ try 'sync:lists' => Command\SyncLists::class ]))->run(); } -catch (\Exception $e) +catch (\Throwable) { } diff --git a/index.php b/index.php index 0aa93974..598a5604 100644 --- a/index.php +++ b/index.php @@ -17,9 +17,9 @@ namespace Aviat\AnimeClient; use Aviat\AnimeClient\Types\Config as ConfigType; -use Whoops\Handler\PrettyPageHandler; +use Whoops\Handler; use Whoops\Run; - +use Whoops\Util; use function Aviat\Ion\_dir; setlocale(LC_CTYPE, 'en_US'); @@ -30,7 +30,12 @@ require_once __DIR__ . '/vendor/autoload.php'; if (file_exists('.is-dev')) { $whoops = new Run; - $whoops->pushHandler(new PrettyPageHandler); + $whoops->pushHandler(new Handler\PrettyPageHandler); + + if (Util\Misc::isAjaxRequest()) { + $whoops->pushHandler(new Handler\JsonResponseHandler); + } + $whoops->register(); } diff --git a/src/AnimeClient/Command/BaseCommand.php b/src/AnimeClient/Command/BaseCommand.php index f05d2a60..3451972f 100644 --- a/src/AnimeClient/Command/BaseCommand.php +++ b/src/AnimeClient/Command/BaseCommand.php @@ -61,14 +61,16 @@ abstract class BaseCommand extends Command { if ($fgColor !== NULL) { - $fgColor = (string)$fgColor; + $fgColor = (int)$fgColor; } if ($bgColor !== NULL) { - $bgColor = (string)$bgColor; + $bgColor = (int)$bgColor; } - // color message + // Colorize the CLI output + // the documented type for the function is wrong + // @phpstan-ignore-next-line $message = Colors::colorize($message, $fgColor, $bgColor); // create the box From 177eff911cfb354a3f48c85124d6b07078c710e2 Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Mon, 22 Feb 2021 15:37:35 -0500 Subject: [PATCH 08/28] Better catch api errors on incrementing progress --- frontEndSrc/js/anime.js | 2 +- frontEndSrc/js/manga.js | 12 ++++++++++-- public/es/scripts.js | 14 +++++++++++--- public/js/scripts.min.js | 5 +++-- public/js/scripts.min.js.map | 2 +- 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/frontEndSrc/js/anime.js b/frontEndSrc/js/anime.js index c0a7fad3..77ec194b 100644 --- a/frontEndSrc/js/anime.js +++ b/frontEndSrc/js/anime.js @@ -71,7 +71,7 @@ _.on('body.anime.list', 'click', '.plus-one', (e) => { success: (res) => { const resData = JSON.parse(res); - if (resData.errors) { + if (resData.error) { _.hide('#loading-shadow'); _.showMessage('error', `Failed to update ${title}. `); _.scrollToTop(); diff --git a/frontEndSrc/js/manga.js b/frontEndSrc/js/manga.js index cb8ad8a7..21992d26 100644 --- a/frontEndSrc/js/manga.js +++ b/frontEndSrc/js/manga.js @@ -72,14 +72,22 @@ _.on('.manga.list', 'click', '.edit-buttons button', (e) => { dataType: 'json', type: 'POST', mimeType: 'application/json', - success: () => { + success: (res) => { + const resData = JSON.parse(res) + if (resData.error) { + _.hide('#loading-shadow'); + _.showMessage('error', `Failed to update ${mangaName}. `); + _.scrollToTop(); + return; + } + if (String(data.data.status).toUpperCase() === 'COMPLETED') { _.hide(parentSel); } _.hide('#loading-shadow'); - _.$(`.${type}s_read`, parentSel)[ 0 ].textContent = completed; + _.$(`.${type}s_read`, parentSel)[ 0 ].textContent = String(completed); _.showMessage('success', `Successfully updated ${mangaName}`); _.scrollToTop(); }, diff --git a/public/es/scripts.js b/public/es/scripts.js index 45bff56e..97d2067d 100644 --- a/public/es/scripts.js +++ b/public/es/scripts.js @@ -644,7 +644,7 @@ AnimeClient.on('body.anime.list', 'click', '.plus-one', (e) => { success: (res) => { const resData = JSON.parse(res); - if (resData.errors) { + if (resData.error) { AnimeClient.hide('#loading-shadow'); AnimeClient.showMessage('error', `Failed to update ${title}. `); AnimeClient.scrollToTop(); @@ -740,14 +740,22 @@ AnimeClient.on('.manga.list', 'click', '.edit-buttons button', (e) => { dataType: 'json', type: 'POST', mimeType: 'application/json', - success: () => { + success: (res) => { + const resData = JSON.parse(res); + if (resData.error) { + AnimeClient.hide('#loading-shadow'); + AnimeClient.showMessage('error', `Failed to update ${mangaName}. `); + AnimeClient.scrollToTop(); + return; + } + if (String(data.data.status).toUpperCase() === 'COMPLETED') { AnimeClient.hide(parentSel); } AnimeClient.hide('#loading-shadow'); - AnimeClient.$(`.${type}s_read`, parentSel)[ 0 ].textContent = completed; + AnimeClient.$(`.${type}s_read`, parentSel)[ 0 ].textContent = String(completed); AnimeClient.showMessage('success', `Successfully updated ${mangaName}`); AnimeClient.scrollToTop(); }, diff --git a/public/js/scripts.min.js b/public/js/scripts.min.js index 5dfe3744..da5acd91 100644 --- a/public/js/scripts.min.js +++ b/public/js/scripts.min.js @@ -18,10 +18,11 @@ function renderMangaSearchResults(data){return data.map(function(item){var title item.id+'.webp" type="image/webp" />\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t'+item.canonicalTitle+"
\n\t\t\t\t\t\t\t"+titles+'\n\t\t\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tInfo Page\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\n\t\t'}).join("")}var search=function(query){AnimeClient.show(".cssload-loader");return AnimeClient.get(AnimeClient.url("/anime-collection/search"),{query:query},function(searchResults,status){searchResults=JSON.parse(searchResults);AnimeClient.hide(".cssload-loader");AnimeClient.$("#series-list")[0].innerHTML=renderAnimeSearchResults(searchResults)})};if(AnimeClient.hasElement(".anime #search")){var prevRequest= null;AnimeClient.on("#search","input",AnimeClient.throttle(250,function(e){var query=encodeURIComponent(e.target.value);if(query==="")return;if(prevRequest!==null)prevRequest.abort();prevRequest=search(query)}))}AnimeClient.on("body.anime.list","click",".plus-one",function(e){var parentSel=AnimeClient.closestParent(e.target,"article");var watchedCount=parseInt(AnimeClient.$(".completed_number",parentSel)[0].textContent,10)||0;var totalCount=parseInt(AnimeClient.$(".total_number",parentSel)[0].textContent, -10);var title=AnimeClient.$(".name a",parentSel)[0].textContent;var data={id:parentSel.dataset.kitsuId,mal_id:parentSel.dataset.malId,data:{progress:watchedCount+1}};if(isNaN(watchedCount)||watchedCount===0)data.data.status="CURRENT";if(!isNaN(watchedCount)&&watchedCount+1===totalCount)data.data.status="COMPLETED";AnimeClient.show("#loading-shadow");AnimeClient.ajax(AnimeClient.url("/anime/increment"),{data:data,dataType:"json",type:"POST",success:function(res){var resData=JSON.parse(res);if(resData.errors){AnimeClient.hide("#loading-shadow"); +10);var title=AnimeClient.$(".name a",parentSel)[0].textContent;var data={id:parentSel.dataset.kitsuId,mal_id:parentSel.dataset.malId,data:{progress:watchedCount+1}};if(isNaN(watchedCount)||watchedCount===0)data.data.status="CURRENT";if(!isNaN(watchedCount)&&watchedCount+1===totalCount)data.data.status="COMPLETED";AnimeClient.show("#loading-shadow");AnimeClient.ajax(AnimeClient.url("/anime/increment"),{data:data,dataType:"json",type:"POST",success:function(res){var resData=JSON.parse(res);if(resData.error){AnimeClient.hide("#loading-shadow"); AnimeClient.showMessage("error","Failed to update "+title+". ");AnimeClient.scrollToTop();return}if(resData.data.libraryEntry.update.libraryEntry.status==="COMPLETED")AnimeClient.hide(parentSel);AnimeClient.hide("#loading-shadow");AnimeClient.showMessage("success","Successfully updated "+title);AnimeClient.$(".completed_number",parentSel)[0].textContent=++watchedCount;AnimeClient.scrollToTop()},error:function(){AnimeClient.hide("#loading-shadow");AnimeClient.showMessage("error","Failed to update "+ title+". ");AnimeClient.scrollToTop()}})});var search$1=function(query){AnimeClient.show(".cssload-loader");return AnimeClient.get(AnimeClient.url("/manga/search"),{query:query},function(searchResults,status){searchResults=JSON.parse(searchResults);AnimeClient.hide(".cssload-loader");AnimeClient.$("#series-list")[0].innerHTML=renderMangaSearchResults(searchResults)})};if(AnimeClient.hasElement(".manga #search")){var prevRequest$1=null;AnimeClient.on("#search","input",AnimeClient.throttle(250,function(e){var query= encodeURIComponent(e.target.value);if(query==="")return;if(prevRequest$1!==null)prevRequest$1.abort();prevRequest$1=search$1(query)}))}AnimeClient.on(".manga.list","click",".edit-buttons button",function(e){var thisSel=e.target;var parentSel=AnimeClient.closestParent(e.target,"article");var type=thisSel.classList.contains("plus-one-chapter")?"chapter":"volume";var completed=parseInt(AnimeClient.$("."+type+"s_read",parentSel)[0].textContent,10)||0;var total=parseInt(AnimeClient.$("."+type+"_count", parentSel)[0].textContent,10);var mangaName=AnimeClient.$(".name",parentSel)[0].textContent;if(isNaN(completed))completed=0;var data={id:parentSel.dataset.kitsuId,mal_id:parentSel.dataset.malId,data:{progress:completed}};if(isNaN(completed)||completed===0)data.data.status="CURRENT";if(!isNaN(completed)&&completed+1===total)data.data.status="COMPLETED";data.data.progress=++completed;AnimeClient.show("#loading-shadow");AnimeClient.ajax(AnimeClient.url("/manga/increment"),{data:data,dataType:"json", -type:"POST",mimeType:"application/json",success:function(){if(String(data.data.status).toUpperCase()==="COMPLETED")AnimeClient.hide(parentSel);AnimeClient.hide("#loading-shadow");AnimeClient.$("."+type+"s_read",parentSel)[0].textContent=completed;AnimeClient.showMessage("success","Successfully updated "+mangaName);AnimeClient.scrollToTop()},error:function(){AnimeClient.hide("#loading-shadow");AnimeClient.showMessage("error","Failed to update "+mangaName);AnimeClient.scrollToTop()}})})})() +type:"POST",mimeType:"application/json",success:function(res){var resData=JSON.parse(res);if(resData.error){AnimeClient.hide("#loading-shadow");AnimeClient.showMessage("error","Failed to update "+mangaName+". ");AnimeClient.scrollToTop();return}if(String(data.data.status).toUpperCase()==="COMPLETED")AnimeClient.hide(parentSel);AnimeClient.hide("#loading-shadow");AnimeClient.$("."+type+"s_read",parentSel)[0].textContent=String(completed);AnimeClient.showMessage("success","Successfully updated "+mangaName); +AnimeClient.scrollToTop()},error:function(){AnimeClient.hide("#loading-shadow");AnimeClient.showMessage("error","Failed to update "+mangaName);AnimeClient.scrollToTop()}})})})() //# sourceMappingURL=scripts.min.js.map diff --git a/public/js/scripts.min.js.map b/public/js/scripts.min.js.map index 2a4bd5a6..b4448c15 100644 --- a/public/js/scripts.min.js.map +++ b/public/js/scripts.min.js.map @@ -1 +1 @@ -{"version":3,"file":"scripts.min.js.map","sources":["../../frontEndSrc/js/anime-client.js","../../frontEndSrc/js/events.js","../../frontEndSrc/js/anon.js","../../frontEndSrc/js/session-check.js","../../frontEndSrc/js/template-helpers.js","../../frontEndSrc/js/anime.js","../../frontEndSrc/js/manga.js"],"sourcesContent":["// -------------------------------------------------------------------------\n// ! Base\n// -------------------------------------------------------------------------\n\nconst matches = (elm, selector) => {\n\tlet m = (elm.document || elm.ownerDocument).querySelectorAll(selector);\n\tlet i = matches.length;\n\twhile (--i >= 0 && m.item(i) !== elm) {};\n\treturn i > -1;\n}\n\nexport const AnimeClient = {\n\t/**\n\t * Placeholder function\n\t */\n\tnoop: () => {},\n\t/**\n\t * DOM selector\n\t *\n\t * @param {string} selector - The dom selector string\n\t * @param {object} [context]\n\t * @return {[HTMLElement]} - array of dom elements\n\t */\n\t$(selector, context = null) {\n\t\tif (typeof selector !== 'string') {\n\t\t\treturn selector;\n\t\t}\n\n\t\tcontext = (context !== null && context.nodeType === 1)\n\t\t\t? context\n\t\t\t: document;\n\n\t\tlet elements = [];\n\t\tif (selector.match(/^#([\\w]+$)/)) {\n\t\t\telements.push(document.getElementById(selector.split('#')[1]));\n\t\t} else {\n\t\t\telements = [].slice.apply(context.querySelectorAll(selector));\n\t\t}\n\n\t\treturn elements;\n\t},\n\t/**\n\t * Does the selector exist on the current page?\n\t *\n\t * @param {string} selector\n\t * @returns {boolean}\n\t */\n\thasElement (selector) {\n\t\treturn AnimeClient.$(selector).length > 0;\n\t},\n\t/**\n\t * Scroll to the top of the Page\n\t *\n\t * @return {void}\n\t */\n\tscrollToTop () {\n\t\tconst el = AnimeClient.$('header')[0];\n\t\tel.scrollIntoView(true);\n\t},\n\t/**\n\t * Hide the selected element\n\t *\n\t * @param {string|Element} sel - the selector of the element to hide\n\t * @return {void}\n\t */\n\thide (sel) {\n\t\tif (typeof sel === 'string') {\n\t\t\tsel = AnimeClient.$(sel);\n\t\t}\n\n\t\tif (Array.isArray(sel)) {\n\t\t\tsel.forEach(el => el.setAttribute('hidden', 'hidden'));\n\t\t} else {\n\t\t\tsel.setAttribute('hidden', 'hidden');\n\t\t}\n\t},\n\t/**\n\t * UnHide the selected element\n\t *\n\t * @param {string|Element} sel - the selector of the element to hide\n\t * @return {void}\n\t */\n\tshow (sel) {\n\t\tif (typeof sel === 'string') {\n\t\t\tsel = AnimeClient.$(sel);\n\t\t}\n\n\t\tif (Array.isArray(sel)) {\n\t\t\tsel.forEach(el => el.removeAttribute('hidden'));\n\t\t} else {\n\t\t\tsel.removeAttribute('hidden');\n\t\t}\n\t},\n\t/**\n\t * Display a message box\n\t *\n\t * @param {string} type - message type: info, error, success\n\t * @param {string} message - the message itself\n\t * @return {void}\n\t */\n\tshowMessage (type, message) {\n\t\tlet template =\n\t\t\t`
\n\t\t\t\t\n\t\t\t\t${message}\n\t\t\t\t\n\t\t\t
`;\n\n\t\tlet sel = AnimeClient.$('.message');\n\t\tif (sel[0] !== undefined) {\n\t\t\tsel[0].remove();\n\t\t}\n\n\t\tAnimeClient.$('header')[0].insertAdjacentHTML('beforeend', template);\n\t},\n\t/**\n\t * Finds the closest parent element matching the passed selector\n\t *\n\t * @param {HTMLElement} current - the current HTMLElement\n\t * @param {string} parentSelector - selector for the parent element\n\t * @return {HTMLElement|null} - the parent element\n\t */\n\tclosestParent (current, parentSelector) {\n\t\tif (Element.prototype.closest !== undefined) {\n\t\t\treturn current.closest(parentSelector);\n\t\t}\n\n\t\twhile (current !== document.documentElement) {\n\t\t\tif (matches(current, parentSelector)) {\n\t\t\t\treturn current;\n\t\t\t}\n\n\t\t\tcurrent = current.parentElement;\n\t\t}\n\n\t\treturn null;\n\t},\n\t/**\n\t * Generate a full url from a relative path\n\t *\n\t * @param {string} path - url path\n\t * @return {string} - full url\n\t */\n\turl (path) {\n\t\tlet uri = `//${document.location.host}`;\n\t\turi += (path.charAt(0) === '/') ? path : `/${path}`;\n\n\t\treturn uri;\n\t},\n\t/**\n\t * Throttle execution of a function\n\t *\n\t * @see https://remysharp.com/2010/07/21/throttling-function-calls\n\t * @see https://jsfiddle.net/jonathansampson/m7G64/\n\t * @param {Number} interval - the minimum throttle time in ms\n\t * @param {Function} fn - the function to throttle\n\t * @param {Object} [scope] - the 'this' object for the function\n\t * @return {Function}\n\t */\n\tthrottle (interval, fn, scope) {\n\t\tlet wait = false;\n\t\treturn function (...args) {\n\t\t\tconst context = scope || this;\n\n\t\t\tif ( ! wait) {\n\t\t\t\tfn.apply(context, args);\n\t\t\t\twait = true;\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\twait = false;\n\t\t\t\t}, interval);\n\t\t\t}\n\t\t};\n\t},\n};\n\n// -------------------------------------------------------------------------\n// ! Events\n// -------------------------------------------------------------------------\n\nfunction addEvent(sel, event, listener) {\n\t// Recurse!\n\tif (! event.match(/^([\\w\\-]+)$/)) {\n\t\tevent.split(' ').forEach((evt) => {\n\t\t\taddEvent(sel, evt, listener);\n\t\t});\n\t}\n\n\tsel.addEventListener(event, listener, false);\n}\n\nfunction delegateEvent(sel, target, event, listener) {\n\t// Attach the listener to the parent\n\taddEvent(sel, event, (e) => {\n\t\t// Get live version of the target selector\n\t\tAnimeClient.$(target, sel).forEach((element) => {\n\t\t\tif(e.target == element) {\n\t\t\t\tlistener.call(element, e);\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Add an event listener\n *\n * @param {string|HTMLElement} sel - the parent selector to bind to\n * @param {string} event - event name(s) to bind\n * @param {string|HTMLElement|function} target - the element to directly bind the event to\n * @param {function} [listener] - event listener callback\n * @return {void}\n */\nAnimeClient.on = (sel, event, target, listener) => {\n\tif (listener === undefined) {\n\t\tlistener = target;\n\t\tAnimeClient.$(sel).forEach((el) => {\n\t\t\taddEvent(el, event, listener);\n\t\t});\n\t} else {\n\t\tAnimeClient.$(sel).forEach((el) => {\n\t\t\tdelegateEvent(el, target, event, listener);\n\t\t});\n\t}\n};\n\n// -------------------------------------------------------------------------\n// ! Ajax\n// -------------------------------------------------------------------------\n\n/**\n * Url encoding for non-get requests\n *\n * @param data\n * @returns {string}\n * @private\n */\nfunction ajaxSerialize(data) {\n\tlet pairs = [];\n\n\tObject.keys(data).forEach((name) => {\n\t\tlet value = data[name].toString();\n\n\t\tname = encodeURIComponent(name);\n\t\tvalue = encodeURIComponent(value);\n\n\t\tpairs.push(`${name}=${value}`);\n\t});\n\n\treturn pairs.join('&');\n}\n\n/**\n * Make an ajax request\n *\n * Config:{\n * \tdata: // data to send with the request\n * \ttype: // http verb of the request, defaults to GET\n * \tsuccess: // success callback\n * \terror: // error callback\n * }\n *\n * @param {string} url - the url to request\n * @param {Object} config - the configuration object\n * @return {XMLHttpRequest}\n */\nAnimeClient.ajax = (url, config) => {\n\t// Set some sane defaults\n\tconst defaultConfig = {\n\t\tdata: {},\n\t\ttype: 'GET',\n\t\tdataType: '',\n\t\tsuccess: AnimeClient.noop,\n\t\tmimeType: 'application/x-www-form-urlencoded',\n\t\terror: AnimeClient.noop\n\t}\n\n\tconfig = {\n\t\t...defaultConfig,\n\t\t...config,\n\t}\n\n\tlet request = new XMLHttpRequest();\n\tlet method = String(config.type).toUpperCase();\n\n\tif (method === 'GET') {\n\t\turl += (url.match(/\\?/))\n\t\t\t? ajaxSerialize(config.data)\n\t\t\t: `?${ajaxSerialize(config.data)}`;\n\t}\n\n\trequest.open(method, url);\n\n\trequest.onreadystatechange = () => {\n\t\tif (request.readyState === 4) {\n\t\t\tlet responseText = '';\n\n\t\t\tif (request.responseType === 'json') {\n\t\t\t\tresponseText = JSON.parse(request.responseText);\n\t\t\t} else {\n\t\t\t\tresponseText = request.responseText;\n\t\t\t}\n\n\t\t\tif (request.status > 299) {\n\t\t\t\tconfig.error.call(null, request.status, responseText, request.response);\n\t\t\t} else {\n\t\t\t\tconfig.success.call(null, responseText, request.status);\n\t\t\t}\n\t\t}\n\t};\n\n\tif (config.dataType === 'json') {\n\t\tconfig.data = JSON.stringify(config.data);\n\t\tconfig.mimeType = 'application/json';\n\t} else {\n\t\tconfig.data = ajaxSerialize(config.data);\n\t}\n\n\trequest.setRequestHeader('Content-Type', config.mimeType);\n\n\tif (method === 'GET') {\n\t\trequest.send(null);\n\t} else {\n\t\trequest.send(config.data);\n\t}\n\n\treturn request\n};\n\n/**\n * Do a get request\n *\n * @param {string} url\n * @param {object|function} data\n * @param {function} [callback]\n * @return {XMLHttpRequest}\n */\nAnimeClient.get = (url, data, callback = null) => {\n\tif (callback === null) {\n\t\tcallback = data;\n\t\tdata = {};\n\t}\n\n\treturn AnimeClient.ajax(url, {\n\t\tdata,\n\t\tsuccess: callback\n\t});\n};\n\n// -------------------------------------------------------------------------\n// Export\n// -------------------------------------------------------------------------\n\nexport default AnimeClient;","import _ from './anime-client.js';\n\n// ----------------------------------------------------------------------------\n// Event subscriptions\n// ----------------------------------------------------------------------------\n_.on('header', 'click', '.message', hide);\n_.on('form.js-delete', 'submit', confirmDelete);\n_.on('.js-clear-cache', 'click', clearAPICache);\n_.on('.vertical-tabs input', 'change', scrollToSection);\n_.on('.media-filter', 'input', filterMedia);\n\n// ----------------------------------------------------------------------------\n// Handler functions\n// ----------------------------------------------------------------------------\n\n/**\n * Hide the html element attached to the event\n *\n * @param event\n * @return void\n */\nfunction hide (event) {\n\t_.hide(event.target)\n}\n\n/**\n * Confirm deletion of an item\n *\n * @param event\n * @return void\n */\nfunction confirmDelete (event) {\n\tconst proceed = confirm('Are you ABSOLUTELY SURE you want to delete this item?');\n\n\tif (proceed === false) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t}\n}\n\n/**\n * Clear the API cache, and show a message if the cache is cleared\n *\n * @return void\n */\nfunction clearAPICache () {\n\t_.get('/cache_purge', () => {\n\t\t_.showMessage('success', 'Successfully purged api cache');\n\t});\n}\n\n/**\n * Scroll to the accordion/vertical tab section just opened\n *\n * @param event\n * @return void\n */\nfunction scrollToSection (event) {\n\tconst el = event.currentTarget.parentElement;\n\tconst rect = el.getBoundingClientRect();\n\n\tconst top = rect.top + window.pageYOffset;\n\n\twindow.scrollTo({\n\t\ttop,\n\t\tbehavior: 'smooth',\n\t});\n}\n\n/**\n * Filter an anime or manga list\n *\n * @param event\n * @return void\n */\nfunction filterMedia (event) {\n\tconst rawFilter = event.target.value;\n\tconst filter = new RegExp(rawFilter, 'i');\n\n\t// console.log('Filtering items by: ', filter);\n\n\tif (rawFilter !== '') {\n\t\t// Filter the cover view\n\t\t_.$('article.media').forEach(article => {\n\t\t\tconst titleLink = _.$('.name a', article)[0];\n\t\t\tconst title = String(titleLink.textContent).trim();\n\t\t\tif ( ! filter.test(title)) {\n\t\t\t\t_.hide(article);\n\t\t\t} else {\n\t\t\t\t_.show(article);\n\t\t\t}\n\t\t});\n\n\t\t// Filter the list view\n\t\t_.$('table.media-wrap tbody tr').forEach(tr => {\n\t\t\tconst titleCell = _.$('td.align-left', tr)[0];\n\t\t\tconst titleLink = _.$('a', titleCell)[0];\n\t\t\tconst linkTitle = String(titleLink.textContent).trim();\n\t\t\tconst textTitle = String(titleCell.textContent).trim();\n\t\t\tif ( ! (filter.test(linkTitle) || filter.test(textTitle))) {\n\t\t\t\t_.hide(tr);\n\t\t\t} else {\n\t\t\t\t_.show(tr);\n\t\t\t}\n\t\t});\n\t} else {\n\t\t_.show('article.media');\n\t\t_.show('table.media-wrap tbody tr');\n\t}\n}\n","import './events.js';\n\nif ('serviceWorker' in navigator) {\n\tnavigator.serviceWorker.register('/sw.js').then(reg => {\n\t\tconsole.log('Service worker registered', reg.scope);\n\t}).catch(error => {\n\t\tconsole.error('Failed to register service worker', error);\n\t});\n}\n\n","import _ from './anime-client.js';\n\n(() => {\n\t// Var is intentional\n\tvar hidden = null;\n\tvar visibilityChange = null;\n\n\tif (typeof document.hidden !== \"undefined\") {\n\t\thidden = \"hidden\";\n\t\tvisibilityChange = \"visibilitychange\";\n\t} else if (typeof document.msHidden !== \"undefined\") {\n\t\thidden = \"msHidden\";\n\t\tvisibilityChange = \"msvisibilitychange\";\n\t} else if (typeof document.webkitHidden !== \"undefined\") {\n\t\thidden = \"webkitHidden\";\n\t\tvisibilityChange = \"webkitvisibilitychange\";\n\t}\n\n\tfunction handleVisibilityChange() {\n\t\t// Check the user's session to see if they are currently logged-in\n\t\t// when the page becomes visible\n\t\tif ( ! document[hidden]) {\n\t\t\t_.get('/heartbeat', (beat) => {\n\t\t\t\tconst status = JSON.parse(beat)\n\n\t\t\t\t// If the session is expired, immediately reload so that\n\t\t\t\t// you can't attempt to do an action that requires authentication\n\t\t\t\tif (status.hasAuth !== true) {\n\t\t\t\t\tdocument.removeEventListener(visibilityChange, handleVisibilityChange, false);\n\t\t\t\t\tlocation.reload();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tif (hidden === null) {\n\t\tconsole.info('Page visibility API not supported, JS session check will not work');\n\t} else {\n\t\tdocument.addEventListener(visibilityChange, handleVisibilityChange, false);\n\t}\n})();","import _ from './anime-client.js';\n\n// Click on hidden MAL checkbox so\n// that MAL id is passed\n_.on('main', 'change', '.big-check', (e) => {\n\tconst id = e.target.id;\n\tdocument.getElementById(`mal_${id}`).checked = true;\n});\n\nexport function renderAnimeSearchResults (data) {\n\treturn data.map(item => {\n\t\tconst titles = item.titles.join('
');\n\n\t\treturn `\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tInfo Page\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t`;\n\t}).join('');\n}\n\nexport function renderMangaSearchResults (data) {\n\treturn data.map(item => {\n\t\tconst titles = item.titles.join('
');\n\t\treturn `\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tInfo Page\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t`;\n\t}).join('');\n}","import _ from './anime-client.js'\nimport { renderAnimeSearchResults } from './template-helpers.js'\n\nconst search = (query) => {\n\t// Show the loader\n\t_.show('.cssload-loader');\n\n\t// Do the api search\n\treturn _.get(_.url('/anime-collection/search'), { query }, (searchResults, status) => {\n\t\tsearchResults = JSON.parse(searchResults);\n\n\t\t// Hide the loader\n\t\t_.hide('.cssload-loader');\n\n\t\t// Show the results\n\t\t_.$('#series-list')[ 0 ].innerHTML = renderAnimeSearchResults(searchResults);\n\t});\n};\n\nif (_.hasElement('.anime #search')) {\n\tlet prevRequest = null;\n\n\t_.on('#search', 'input', _.throttle(250, (e) => {\n\t\tconst query = encodeURIComponent(e.target.value);\n\t\tif (query === '') {\n\t\t\treturn;\n\t\t}\n\n\t\tif (prevRequest !== null) {\n\t\t\tprevRequest.abort();\n\t\t}\n\n\t\tprevRequest = search(query);\n\t}));\n}\n\n// Action to increment episode count\n_.on('body.anime.list', 'click', '.plus-one', (e) => {\n\tlet parentSel = _.closestParent(e.target, 'article');\n\tlet watchedCount = parseInt(_.$('.completed_number', parentSel)[ 0 ].textContent, 10) || 0;\n\tlet totalCount = parseInt(_.$('.total_number', parentSel)[ 0 ].textContent, 10);\n\tlet title = _.$('.name a', parentSel)[ 0 ].textContent;\n\n\t// Setup the update data\n\tlet data = {\n\t\tid: parentSel.dataset.kitsuId,\n\t\tmal_id: parentSel.dataset.malId,\n\t\tdata: {\n\t\t\tprogress: watchedCount + 1\n\t\t}\n\t};\n\n\t// If the episode count is 0, and incremented,\n\t// change status to currently watching\n\tif (isNaN(watchedCount) || watchedCount === 0) {\n\t\tdata.data.status = 'CURRENT';\n\t}\n\n\t// If you increment at the last episode, mark as completed\n\tif ((!isNaN(watchedCount)) && (watchedCount + 1) === totalCount) {\n\t\tdata.data.status = 'COMPLETED';\n\t}\n\n\t_.show('#loading-shadow');\n\n\t// okay, lets actually make some changes!\n\t_.ajax(_.url('/anime/increment'), {\n\t\tdata,\n\t\tdataType: 'json',\n\t\ttype: 'POST',\n\t\tsuccess: (res) => {\n\t\t\tconst resData = JSON.parse(res);\n\n\t\t\tif (resData.errors) {\n\t\t\t\t_.hide('#loading-shadow');\n\t\t\t\t_.showMessage('error', `Failed to update ${title}. `);\n\t\t\t\t_.scrollToTop();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (resData.data.libraryEntry.update.libraryEntry.status === 'COMPLETED') {\n\t\t\t\t_.hide(parentSel);\n\t\t\t}\n\n\t\t\t_.hide('#loading-shadow');\n\n\t\t\t_.showMessage('success', `Successfully updated ${title}`);\n\t\t\t_.$('.completed_number', parentSel)[ 0 ].textContent = ++watchedCount;\n\t\t\t_.scrollToTop();\n\t\t},\n\t\terror: () => {\n\t\t\t_.hide('#loading-shadow');\n\t\t\t_.showMessage('error', `Failed to update ${title}. `);\n\t\t\t_.scrollToTop();\n\t\t}\n\t});\n});","import _ from './anime-client.js'\nimport { renderMangaSearchResults } from './template-helpers.js'\n\nconst search = (query) => {\n\t_.show('.cssload-loader');\n\treturn _.get(_.url('/manga/search'), { query }, (searchResults, status) => {\n\t\tsearchResults = JSON.parse(searchResults);\n\t\t_.hide('.cssload-loader');\n\t\t_.$('#series-list')[ 0 ].innerHTML = renderMangaSearchResults(searchResults);\n\t});\n};\n\nif (_.hasElement('.manga #search')) {\n\tlet prevRequest = null\n\n\t_.on('#search', 'input', _.throttle(250, (e) => {\n\t\tlet query = encodeURIComponent(e.target.value);\n\t\tif (query === '') {\n\t\t\treturn;\n\t\t}\n\n\t\tif (prevRequest !== null) {\n\t\t\tprevRequest.abort();\n\t\t}\n\n\t\tprevRequest = search(query);\n\t}));\n}\n\n/**\n * Javascript for editing manga, if logged in\n */\n_.on('.manga.list', 'click', '.edit-buttons button', (e) => {\n\tlet thisSel = e.target;\n\tlet parentSel = _.closestParent(e.target, 'article');\n\tlet type = thisSel.classList.contains('plus-one-chapter') ? 'chapter' : 'volume';\n\tlet completed = parseInt(_.$(`.${type}s_read`, parentSel)[ 0 ].textContent, 10) || 0;\n\tlet total = parseInt(_.$(`.${type}_count`, parentSel)[ 0 ].textContent, 10);\n\tlet mangaName = _.$('.name', parentSel)[ 0 ].textContent;\n\n\tif (isNaN(completed)) {\n\t\tcompleted = 0;\n\t}\n\n\t// Setup the update data\n\tlet data = {\n\t\tid: parentSel.dataset.kitsuId,\n\t\tmal_id: parentSel.dataset.malId,\n\t\tdata: {\n\t\t\tprogress: completed\n\t\t}\n\t};\n\n\t// If the episode count is 0, and incremented,\n\t// change status to currently reading\n\tif (isNaN(completed) || completed === 0) {\n\t\tdata.data.status = 'CURRENT';\n\t}\n\n\t// If you increment at the last chapter, mark as completed\n\tif ((!isNaN(completed)) && (completed + 1) === total) {\n\t\tdata.data.status = 'COMPLETED';\n\t}\n\n\t// Update the total count\n\tdata.data.progress = ++completed;\n\n\t_.show('#loading-shadow');\n\n\t_.ajax(_.url('/manga/increment'), {\n\t\tdata,\n\t\tdataType: 'json',\n\t\ttype: 'POST',\n\t\tmimeType: 'application/json',\n\t\tsuccess: () => {\n\t\t\tif (String(data.data.status).toUpperCase() === 'COMPLETED') {\n\t\t\t\t_.hide(parentSel);\n\t\t\t}\n\n\t\t\t_.hide('#loading-shadow');\n\n\t\t\t_.$(`.${type}s_read`, parentSel)[ 0 ].textContent = completed;\n\t\t\t_.showMessage('success', `Successfully updated ${mangaName}`);\n\t\t\t_.scrollToTop();\n\t\t},\n\t\terror: () => {\n\t\t\t_.hide('#loading-shadow');\n\t\t\t_.showMessage('error', `Failed to update ${mangaName}`);\n\t\t\t_.scrollToTop();\n\t\t}\n\t});\n});"],"names":["selector","m","querySelectorAll","elm","document","ownerDocument","i","matches","length","item","noop","$","context","nodeType","elements","match","push","getElementById","split","slice","apply","hasElement","AnimeClient","scrollToTop","el","scrollIntoView","hide","sel","Array","isArray","forEach","setAttribute","show","removeAttribute","showMessage","type","message","template","undefined","remove","insertAdjacentHTML","closestParent","current","parentSelector","Element","prototype","closest","documentElement","parentElement","url","path","uri","location","host","charAt","throttle","interval","fn","scope","wait","args","setTimeout","addEvent","event","listener","evt","addEventListener","delegateEvent","target","e","element","call","stopPropagation","on","AnimeClient.on","ajaxSerialize","data","pairs","Object","keys","name","value","toString","encodeURIComponent","join","ajax","AnimeClient.ajax","config","dataType","success","mimeType","error","defaultConfig","request","XMLHttpRequest","method","String","toUpperCase","open","onreadystatechange","request.onreadystatechange","readyState","responseText","responseType","JSON","parse","status","response","stringify","setRequestHeader","send","get","AnimeClient.get","callback","confirmDelete","clearAPICache","scrollToSection","filterMedia","_","proceed","preventDefault","window","scrollTo","top","behavior","rawFilter","article","filter","test","title","tr","titleCell","linkTitle","textTitle","navigator","serviceWorker","register","then","reg","console","log","catch","hidden","visibilityChange","msHidden","webkitHidden","handleVisibilityChange","beat","hasAuth","removeEventListener","reload","info","id","checked","renderAnimeSearchResults","map","slug","mal_id","canonicalTitle","titles","renderMangaSearchResults","query","searchResults","prevRequest","abort","search","parentSel","watchedCount","parseInt","totalCount","dataset","kitsuId","malId","progress","isNaN","res","resData","errors","libraryEntry","update","thisSel","classList","contains","completed","total","mangaName"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"scripts.min.js.map","sources":["../../frontEndSrc/js/anime-client.js","../../frontEndSrc/js/events.js","../../frontEndSrc/js/anon.js","../../frontEndSrc/js/session-check.js","../../frontEndSrc/js/template-helpers.js","../../frontEndSrc/js/anime.js","../../frontEndSrc/js/manga.js"],"sourcesContent":["// -------------------------------------------------------------------------\n// ! Base\n// -------------------------------------------------------------------------\n\nconst matches = (elm, selector) => {\n\tlet m = (elm.document || elm.ownerDocument).querySelectorAll(selector);\n\tlet i = matches.length;\n\twhile (--i >= 0 && m.item(i) !== elm) {};\n\treturn i > -1;\n}\n\nexport const AnimeClient = {\n\t/**\n\t * Placeholder function\n\t */\n\tnoop: () => {},\n\t/**\n\t * DOM selector\n\t *\n\t * @param {string} selector - The dom selector string\n\t * @param {object} [context]\n\t * @return {[HTMLElement]} - array of dom elements\n\t */\n\t$(selector, context = null) {\n\t\tif (typeof selector !== 'string') {\n\t\t\treturn selector;\n\t\t}\n\n\t\tcontext = (context !== null && context.nodeType === 1)\n\t\t\t? context\n\t\t\t: document;\n\n\t\tlet elements = [];\n\t\tif (selector.match(/^#([\\w]+$)/)) {\n\t\t\telements.push(document.getElementById(selector.split('#')[1]));\n\t\t} else {\n\t\t\telements = [].slice.apply(context.querySelectorAll(selector));\n\t\t}\n\n\t\treturn elements;\n\t},\n\t/**\n\t * Does the selector exist on the current page?\n\t *\n\t * @param {string} selector\n\t * @returns {boolean}\n\t */\n\thasElement (selector) {\n\t\treturn AnimeClient.$(selector).length > 0;\n\t},\n\t/**\n\t * Scroll to the top of the Page\n\t *\n\t * @return {void}\n\t */\n\tscrollToTop () {\n\t\tconst el = AnimeClient.$('header')[0];\n\t\tel.scrollIntoView(true);\n\t},\n\t/**\n\t * Hide the selected element\n\t *\n\t * @param {string|Element} sel - the selector of the element to hide\n\t * @return {void}\n\t */\n\thide (sel) {\n\t\tif (typeof sel === 'string') {\n\t\t\tsel = AnimeClient.$(sel);\n\t\t}\n\n\t\tif (Array.isArray(sel)) {\n\t\t\tsel.forEach(el => el.setAttribute('hidden', 'hidden'));\n\t\t} else {\n\t\t\tsel.setAttribute('hidden', 'hidden');\n\t\t}\n\t},\n\t/**\n\t * UnHide the selected element\n\t *\n\t * @param {string|Element} sel - the selector of the element to hide\n\t * @return {void}\n\t */\n\tshow (sel) {\n\t\tif (typeof sel === 'string') {\n\t\t\tsel = AnimeClient.$(sel);\n\t\t}\n\n\t\tif (Array.isArray(sel)) {\n\t\t\tsel.forEach(el => el.removeAttribute('hidden'));\n\t\t} else {\n\t\t\tsel.removeAttribute('hidden');\n\t\t}\n\t},\n\t/**\n\t * Display a message box\n\t *\n\t * @param {string} type - message type: info, error, success\n\t * @param {string} message - the message itself\n\t * @return {void}\n\t */\n\tshowMessage (type, message) {\n\t\tlet template =\n\t\t\t`
\n\t\t\t\t\n\t\t\t\t${message}\n\t\t\t\t\n\t\t\t
`;\n\n\t\tlet sel = AnimeClient.$('.message');\n\t\tif (sel[0] !== undefined) {\n\t\t\tsel[0].remove();\n\t\t}\n\n\t\tAnimeClient.$('header')[0].insertAdjacentHTML('beforeend', template);\n\t},\n\t/**\n\t * Finds the closest parent element matching the passed selector\n\t *\n\t * @param {HTMLElement} current - the current HTMLElement\n\t * @param {string} parentSelector - selector for the parent element\n\t * @return {HTMLElement|null} - the parent element\n\t */\n\tclosestParent (current, parentSelector) {\n\t\tif (Element.prototype.closest !== undefined) {\n\t\t\treturn current.closest(parentSelector);\n\t\t}\n\n\t\twhile (current !== document.documentElement) {\n\t\t\tif (matches(current, parentSelector)) {\n\t\t\t\treturn current;\n\t\t\t}\n\n\t\t\tcurrent = current.parentElement;\n\t\t}\n\n\t\treturn null;\n\t},\n\t/**\n\t * Generate a full url from a relative path\n\t *\n\t * @param {string} path - url path\n\t * @return {string} - full url\n\t */\n\turl (path) {\n\t\tlet uri = `//${document.location.host}`;\n\t\turi += (path.charAt(0) === '/') ? path : `/${path}`;\n\n\t\treturn uri;\n\t},\n\t/**\n\t * Throttle execution of a function\n\t *\n\t * @see https://remysharp.com/2010/07/21/throttling-function-calls\n\t * @see https://jsfiddle.net/jonathansampson/m7G64/\n\t * @param {Number} interval - the minimum throttle time in ms\n\t * @param {Function} fn - the function to throttle\n\t * @param {Object} [scope] - the 'this' object for the function\n\t * @return {Function}\n\t */\n\tthrottle (interval, fn, scope) {\n\t\tlet wait = false;\n\t\treturn function (...args) {\n\t\t\tconst context = scope || this;\n\n\t\t\tif ( ! wait) {\n\t\t\t\tfn.apply(context, args);\n\t\t\t\twait = true;\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\twait = false;\n\t\t\t\t}, interval);\n\t\t\t}\n\t\t};\n\t},\n};\n\n// -------------------------------------------------------------------------\n// ! Events\n// -------------------------------------------------------------------------\n\nfunction addEvent(sel, event, listener) {\n\t// Recurse!\n\tif (! event.match(/^([\\w\\-]+)$/)) {\n\t\tevent.split(' ').forEach((evt) => {\n\t\t\taddEvent(sel, evt, listener);\n\t\t});\n\t}\n\n\tsel.addEventListener(event, listener, false);\n}\n\nfunction delegateEvent(sel, target, event, listener) {\n\t// Attach the listener to the parent\n\taddEvent(sel, event, (e) => {\n\t\t// Get live version of the target selector\n\t\tAnimeClient.$(target, sel).forEach((element) => {\n\t\t\tif(e.target == element) {\n\t\t\t\tlistener.call(element, e);\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Add an event listener\n *\n * @param {string|HTMLElement} sel - the parent selector to bind to\n * @param {string} event - event name(s) to bind\n * @param {string|HTMLElement|function} target - the element to directly bind the event to\n * @param {function} [listener] - event listener callback\n * @return {void}\n */\nAnimeClient.on = (sel, event, target, listener) => {\n\tif (listener === undefined) {\n\t\tlistener = target;\n\t\tAnimeClient.$(sel).forEach((el) => {\n\t\t\taddEvent(el, event, listener);\n\t\t});\n\t} else {\n\t\tAnimeClient.$(sel).forEach((el) => {\n\t\t\tdelegateEvent(el, target, event, listener);\n\t\t});\n\t}\n};\n\n// -------------------------------------------------------------------------\n// ! Ajax\n// -------------------------------------------------------------------------\n\n/**\n * Url encoding for non-get requests\n *\n * @param data\n * @returns {string}\n * @private\n */\nfunction ajaxSerialize(data) {\n\tlet pairs = [];\n\n\tObject.keys(data).forEach((name) => {\n\t\tlet value = data[name].toString();\n\n\t\tname = encodeURIComponent(name);\n\t\tvalue = encodeURIComponent(value);\n\n\t\tpairs.push(`${name}=${value}`);\n\t});\n\n\treturn pairs.join('&');\n}\n\n/**\n * Make an ajax request\n *\n * Config:{\n * \tdata: // data to send with the request\n * \ttype: // http verb of the request, defaults to GET\n * \tsuccess: // success callback\n * \terror: // error callback\n * }\n *\n * @param {string} url - the url to request\n * @param {Object} config - the configuration object\n * @return {XMLHttpRequest}\n */\nAnimeClient.ajax = (url, config) => {\n\t// Set some sane defaults\n\tconst defaultConfig = {\n\t\tdata: {},\n\t\ttype: 'GET',\n\t\tdataType: '',\n\t\tsuccess: AnimeClient.noop,\n\t\tmimeType: 'application/x-www-form-urlencoded',\n\t\terror: AnimeClient.noop\n\t}\n\n\tconfig = {\n\t\t...defaultConfig,\n\t\t...config,\n\t}\n\n\tlet request = new XMLHttpRequest();\n\tlet method = String(config.type).toUpperCase();\n\n\tif (method === 'GET') {\n\t\turl += (url.match(/\\?/))\n\t\t\t? ajaxSerialize(config.data)\n\t\t\t: `?${ajaxSerialize(config.data)}`;\n\t}\n\n\trequest.open(method, url);\n\n\trequest.onreadystatechange = () => {\n\t\tif (request.readyState === 4) {\n\t\t\tlet responseText = '';\n\n\t\t\tif (request.responseType === 'json') {\n\t\t\t\tresponseText = JSON.parse(request.responseText);\n\t\t\t} else {\n\t\t\t\tresponseText = request.responseText;\n\t\t\t}\n\n\t\t\tif (request.status > 299) {\n\t\t\t\tconfig.error.call(null, request.status, responseText, request.response);\n\t\t\t} else {\n\t\t\t\tconfig.success.call(null, responseText, request.status);\n\t\t\t}\n\t\t}\n\t};\n\n\tif (config.dataType === 'json') {\n\t\tconfig.data = JSON.stringify(config.data);\n\t\tconfig.mimeType = 'application/json';\n\t} else {\n\t\tconfig.data = ajaxSerialize(config.data);\n\t}\n\n\trequest.setRequestHeader('Content-Type', config.mimeType);\n\n\tif (method === 'GET') {\n\t\trequest.send(null);\n\t} else {\n\t\trequest.send(config.data);\n\t}\n\n\treturn request\n};\n\n/**\n * Do a get request\n *\n * @param {string} url\n * @param {object|function} data\n * @param {function} [callback]\n * @return {XMLHttpRequest}\n */\nAnimeClient.get = (url, data, callback = null) => {\n\tif (callback === null) {\n\t\tcallback = data;\n\t\tdata = {};\n\t}\n\n\treturn AnimeClient.ajax(url, {\n\t\tdata,\n\t\tsuccess: callback\n\t});\n};\n\n// -------------------------------------------------------------------------\n// Export\n// -------------------------------------------------------------------------\n\nexport default AnimeClient;","import _ from './anime-client.js';\n\n// ----------------------------------------------------------------------------\n// Event subscriptions\n// ----------------------------------------------------------------------------\n_.on('header', 'click', '.message', hide);\n_.on('form.js-delete', 'submit', confirmDelete);\n_.on('.js-clear-cache', 'click', clearAPICache);\n_.on('.vertical-tabs input', 'change', scrollToSection);\n_.on('.media-filter', 'input', filterMedia);\n\n// ----------------------------------------------------------------------------\n// Handler functions\n// ----------------------------------------------------------------------------\n\n/**\n * Hide the html element attached to the event\n *\n * @param event\n * @return void\n */\nfunction hide (event) {\n\t_.hide(event.target)\n}\n\n/**\n * Confirm deletion of an item\n *\n * @param event\n * @return void\n */\nfunction confirmDelete (event) {\n\tconst proceed = confirm('Are you ABSOLUTELY SURE you want to delete this item?');\n\n\tif (proceed === false) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t}\n}\n\n/**\n * Clear the API cache, and show a message if the cache is cleared\n *\n * @return void\n */\nfunction clearAPICache () {\n\t_.get('/cache_purge', () => {\n\t\t_.showMessage('success', 'Successfully purged api cache');\n\t});\n}\n\n/**\n * Scroll to the accordion/vertical tab section just opened\n *\n * @param event\n * @return void\n */\nfunction scrollToSection (event) {\n\tconst el = event.currentTarget.parentElement;\n\tconst rect = el.getBoundingClientRect();\n\n\tconst top = rect.top + window.pageYOffset;\n\n\twindow.scrollTo({\n\t\ttop,\n\t\tbehavior: 'smooth',\n\t});\n}\n\n/**\n * Filter an anime or manga list\n *\n * @param event\n * @return void\n */\nfunction filterMedia (event) {\n\tconst rawFilter = event.target.value;\n\tconst filter = new RegExp(rawFilter, 'i');\n\n\t// console.log('Filtering items by: ', filter);\n\n\tif (rawFilter !== '') {\n\t\t// Filter the cover view\n\t\t_.$('article.media').forEach(article => {\n\t\t\tconst titleLink = _.$('.name a', article)[0];\n\t\t\tconst title = String(titleLink.textContent).trim();\n\t\t\tif ( ! filter.test(title)) {\n\t\t\t\t_.hide(article);\n\t\t\t} else {\n\t\t\t\t_.show(article);\n\t\t\t}\n\t\t});\n\n\t\t// Filter the list view\n\t\t_.$('table.media-wrap tbody tr').forEach(tr => {\n\t\t\tconst titleCell = _.$('td.align-left', tr)[0];\n\t\t\tconst titleLink = _.$('a', titleCell)[0];\n\t\t\tconst linkTitle = String(titleLink.textContent).trim();\n\t\t\tconst textTitle = String(titleCell.textContent).trim();\n\t\t\tif ( ! (filter.test(linkTitle) || filter.test(textTitle))) {\n\t\t\t\t_.hide(tr);\n\t\t\t} else {\n\t\t\t\t_.show(tr);\n\t\t\t}\n\t\t});\n\t} else {\n\t\t_.show('article.media');\n\t\t_.show('table.media-wrap tbody tr');\n\t}\n}\n","import './events.js';\n\nif ('serviceWorker' in navigator) {\n\tnavigator.serviceWorker.register('/sw.js').then(reg => {\n\t\tconsole.log('Service worker registered', reg.scope);\n\t}).catch(error => {\n\t\tconsole.error('Failed to register service worker', error);\n\t});\n}\n\n","import _ from './anime-client.js';\n\n(() => {\n\t// Var is intentional\n\tvar hidden = null;\n\tvar visibilityChange = null;\n\n\tif (typeof document.hidden !== \"undefined\") {\n\t\thidden = \"hidden\";\n\t\tvisibilityChange = \"visibilitychange\";\n\t} else if (typeof document.msHidden !== \"undefined\") {\n\t\thidden = \"msHidden\";\n\t\tvisibilityChange = \"msvisibilitychange\";\n\t} else if (typeof document.webkitHidden !== \"undefined\") {\n\t\thidden = \"webkitHidden\";\n\t\tvisibilityChange = \"webkitvisibilitychange\";\n\t}\n\n\tfunction handleVisibilityChange() {\n\t\t// Check the user's session to see if they are currently logged-in\n\t\t// when the page becomes visible\n\t\tif ( ! document[hidden]) {\n\t\t\t_.get('/heartbeat', (beat) => {\n\t\t\t\tconst status = JSON.parse(beat)\n\n\t\t\t\t// If the session is expired, immediately reload so that\n\t\t\t\t// you can't attempt to do an action that requires authentication\n\t\t\t\tif (status.hasAuth !== true) {\n\t\t\t\t\tdocument.removeEventListener(visibilityChange, handleVisibilityChange, false);\n\t\t\t\t\tlocation.reload();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tif (hidden === null) {\n\t\tconsole.info('Page visibility API not supported, JS session check will not work');\n\t} else {\n\t\tdocument.addEventListener(visibilityChange, handleVisibilityChange, false);\n\t}\n})();","import _ from './anime-client.js';\n\n// Click on hidden MAL checkbox so\n// that MAL id is passed\n_.on('main', 'change', '.big-check', (e) => {\n\tconst id = e.target.id;\n\tdocument.getElementById(`mal_${id}`).checked = true;\n});\n\nexport function renderAnimeSearchResults (data) {\n\treturn data.map(item => {\n\t\tconst titles = item.titles.join('
');\n\n\t\treturn `\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tInfo Page\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t`;\n\t}).join('');\n}\n\nexport function renderMangaSearchResults (data) {\n\treturn data.map(item => {\n\t\tconst titles = item.titles.join('
');\n\t\treturn `\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tInfo Page\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t`;\n\t}).join('');\n}","import _ from './anime-client.js'\nimport { renderAnimeSearchResults } from './template-helpers.js'\n\nconst search = (query) => {\n\t// Show the loader\n\t_.show('.cssload-loader');\n\n\t// Do the api search\n\treturn _.get(_.url('/anime-collection/search'), { query }, (searchResults, status) => {\n\t\tsearchResults = JSON.parse(searchResults);\n\n\t\t// Hide the loader\n\t\t_.hide('.cssload-loader');\n\n\t\t// Show the results\n\t\t_.$('#series-list')[ 0 ].innerHTML = renderAnimeSearchResults(searchResults);\n\t});\n};\n\nif (_.hasElement('.anime #search')) {\n\tlet prevRequest = null;\n\n\t_.on('#search', 'input', _.throttle(250, (e) => {\n\t\tconst query = encodeURIComponent(e.target.value);\n\t\tif (query === '') {\n\t\t\treturn;\n\t\t}\n\n\t\tif (prevRequest !== null) {\n\t\t\tprevRequest.abort();\n\t\t}\n\n\t\tprevRequest = search(query);\n\t}));\n}\n\n// Action to increment episode count\n_.on('body.anime.list', 'click', '.plus-one', (e) => {\n\tlet parentSel = _.closestParent(e.target, 'article');\n\tlet watchedCount = parseInt(_.$('.completed_number', parentSel)[ 0 ].textContent, 10) || 0;\n\tlet totalCount = parseInt(_.$('.total_number', parentSel)[ 0 ].textContent, 10);\n\tlet title = _.$('.name a', parentSel)[ 0 ].textContent;\n\n\t// Setup the update data\n\tlet data = {\n\t\tid: parentSel.dataset.kitsuId,\n\t\tmal_id: parentSel.dataset.malId,\n\t\tdata: {\n\t\t\tprogress: watchedCount + 1\n\t\t}\n\t};\n\n\t// If the episode count is 0, and incremented,\n\t// change status to currently watching\n\tif (isNaN(watchedCount) || watchedCount === 0) {\n\t\tdata.data.status = 'CURRENT';\n\t}\n\n\t// If you increment at the last episode, mark as completed\n\tif ((!isNaN(watchedCount)) && (watchedCount + 1) === totalCount) {\n\t\tdata.data.status = 'COMPLETED';\n\t}\n\n\t_.show('#loading-shadow');\n\n\t// okay, lets actually make some changes!\n\t_.ajax(_.url('/anime/increment'), {\n\t\tdata,\n\t\tdataType: 'json',\n\t\ttype: 'POST',\n\t\tsuccess: (res) => {\n\t\t\tconst resData = JSON.parse(res);\n\n\t\t\tif (resData.error) {\n\t\t\t\t_.hide('#loading-shadow');\n\t\t\t\t_.showMessage('error', `Failed to update ${title}. `);\n\t\t\t\t_.scrollToTop();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (resData.data.libraryEntry.update.libraryEntry.status === 'COMPLETED') {\n\t\t\t\t_.hide(parentSel);\n\t\t\t}\n\n\t\t\t_.hide('#loading-shadow');\n\n\t\t\t_.showMessage('success', `Successfully updated ${title}`);\n\t\t\t_.$('.completed_number', parentSel)[ 0 ].textContent = ++watchedCount;\n\t\t\t_.scrollToTop();\n\t\t},\n\t\terror: () => {\n\t\t\t_.hide('#loading-shadow');\n\t\t\t_.showMessage('error', `Failed to update ${title}. `);\n\t\t\t_.scrollToTop();\n\t\t}\n\t});\n});","import _ from './anime-client.js'\nimport { renderMangaSearchResults } from './template-helpers.js'\n\nconst search = (query) => {\n\t_.show('.cssload-loader');\n\treturn _.get(_.url('/manga/search'), { query }, (searchResults, status) => {\n\t\tsearchResults = JSON.parse(searchResults);\n\t\t_.hide('.cssload-loader');\n\t\t_.$('#series-list')[ 0 ].innerHTML = renderMangaSearchResults(searchResults);\n\t});\n};\n\nif (_.hasElement('.manga #search')) {\n\tlet prevRequest = null\n\n\t_.on('#search', 'input', _.throttle(250, (e) => {\n\t\tlet query = encodeURIComponent(e.target.value);\n\t\tif (query === '') {\n\t\t\treturn;\n\t\t}\n\n\t\tif (prevRequest !== null) {\n\t\t\tprevRequest.abort();\n\t\t}\n\n\t\tprevRequest = search(query);\n\t}));\n}\n\n/**\n * Javascript for editing manga, if logged in\n */\n_.on('.manga.list', 'click', '.edit-buttons button', (e) => {\n\tlet thisSel = e.target;\n\tlet parentSel = _.closestParent(e.target, 'article');\n\tlet type = thisSel.classList.contains('plus-one-chapter') ? 'chapter' : 'volume';\n\tlet completed = parseInt(_.$(`.${type}s_read`, parentSel)[ 0 ].textContent, 10) || 0;\n\tlet total = parseInt(_.$(`.${type}_count`, parentSel)[ 0 ].textContent, 10);\n\tlet mangaName = _.$('.name', parentSel)[ 0 ].textContent;\n\n\tif (isNaN(completed)) {\n\t\tcompleted = 0;\n\t}\n\n\t// Setup the update data\n\tlet data = {\n\t\tid: parentSel.dataset.kitsuId,\n\t\tmal_id: parentSel.dataset.malId,\n\t\tdata: {\n\t\t\tprogress: completed\n\t\t}\n\t};\n\n\t// If the episode count is 0, and incremented,\n\t// change status to currently reading\n\tif (isNaN(completed) || completed === 0) {\n\t\tdata.data.status = 'CURRENT';\n\t}\n\n\t// If you increment at the last chapter, mark as completed\n\tif ((!isNaN(completed)) && (completed + 1) === total) {\n\t\tdata.data.status = 'COMPLETED';\n\t}\n\n\t// Update the total count\n\tdata.data.progress = ++completed;\n\n\t_.show('#loading-shadow');\n\n\t_.ajax(_.url('/manga/increment'), {\n\t\tdata,\n\t\tdataType: 'json',\n\t\ttype: 'POST',\n\t\tmimeType: 'application/json',\n\t\tsuccess: (res) => {\n\t\t\tconst resData = JSON.parse(res)\n\t\t\tif (resData.error) {\n\t\t\t\t_.hide('#loading-shadow');\n\t\t\t\t_.showMessage('error', `Failed to update ${mangaName}. `);\n\t\t\t\t_.scrollToTop();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (String(data.data.status).toUpperCase() === 'COMPLETED') {\n\t\t\t\t_.hide(parentSel);\n\t\t\t}\n\n\t\t\t_.hide('#loading-shadow');\n\n\t\t\t_.$(`.${type}s_read`, parentSel)[ 0 ].textContent = String(completed);\n\t\t\t_.showMessage('success', `Successfully updated ${mangaName}`);\n\t\t\t_.scrollToTop();\n\t\t},\n\t\terror: () => {\n\t\t\t_.hide('#loading-shadow');\n\t\t\t_.showMessage('error', `Failed to update ${mangaName}`);\n\t\t\t_.scrollToTop();\n\t\t}\n\t});\n});"],"names":["selector","m","querySelectorAll","elm","document","ownerDocument","i","matches","length","item","noop","$","context","nodeType","elements","match","push","getElementById","split","slice","apply","hasElement","AnimeClient","scrollToTop","el","scrollIntoView","hide","sel","Array","isArray","forEach","setAttribute","show","removeAttribute","showMessage","type","message","template","undefined","remove","insertAdjacentHTML","closestParent","current","parentSelector","Element","prototype","closest","documentElement","parentElement","url","path","uri","location","host","charAt","throttle","interval","fn","scope","wait","args","setTimeout","addEvent","event","listener","evt","addEventListener","delegateEvent","target","e","element","call","stopPropagation","on","AnimeClient.on","ajaxSerialize","data","pairs","Object","keys","name","value","toString","encodeURIComponent","join","ajax","AnimeClient.ajax","config","dataType","success","mimeType","error","defaultConfig","request","XMLHttpRequest","method","String","toUpperCase","open","onreadystatechange","request.onreadystatechange","readyState","responseText","responseType","JSON","parse","status","response","stringify","setRequestHeader","send","get","AnimeClient.get","callback","confirmDelete","clearAPICache","scrollToSection","filterMedia","_","proceed","preventDefault","window","scrollTo","top","behavior","rawFilter","article","filter","test","title","tr","titleCell","linkTitle","textTitle","navigator","serviceWorker","register","then","reg","console","log","catch","hidden","visibilityChange","msHidden","webkitHidden","handleVisibilityChange","beat","hasAuth","removeEventListener","reload","info","id","checked","renderAnimeSearchResults","map","slug","mal_id","canonicalTitle","titles","renderMangaSearchResults","query","searchResults","prevRequest","abort","search","parentSel","watchedCount","parseInt","totalCount","dataset","kitsuId","malId","progress","isNaN","res","resData","libraryEntry","update","thisSel","classList","contains","completed","total","mangaName"],"mappings":"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"} \ No newline at end of file From 54983835878ab3a17b510216133df5c0d0485f23 Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Mon, 22 Feb 2021 15:38:29 -0500 Subject: [PATCH 09/28] Update GraphQL schemas --- src/AnimeClient/API/Anilist/schema.graphql | 32 +++- src/AnimeClient/API/Kitsu/schema.graphql | 173 +++++++++------------ 2 files changed, 100 insertions(+), 105 deletions(-) diff --git a/src/AnimeClient/API/Anilist/schema.graphql b/src/AnimeClient/API/Anilist/schema.graphql index 4737470e..dd0295bb 100644 --- a/src/AnimeClient/API/Anilist/schema.graphql +++ b/src/AnimeClient/API/Anilist/schema.graphql @@ -240,6 +240,7 @@ type Character { isFavourite: Boolean! "Media that includes the character" media( + onList: Boolean, "The page" page: Int, "The amount of entries per page, max 25" @@ -855,7 +856,7 @@ type InternalPage { mediaType: MediaType, "The order the results will be returned in" sort: [ReviewSort], - "Filter by media id" + "Filter by user id" userId: Int ): [Review] revisionHistory( @@ -1114,7 +1115,10 @@ type Media { startDate: FuzzyDate stats: MediaStats "The current releasing status of the media" - status: MediaStatus + status( + "Provide 2 to use new version 2 of sources enum" + version: Int + ): MediaStatus "Data and links to legal streaming episodes on external sites" streamingEpisodes: [MediaStreamingEpisode] "The companies who produced the media" @@ -1297,8 +1301,7 @@ type MediaListOptions { sharedTheme: Json @deprecated(reason : "No longer used") "If the shared theme should be used instead of the individual list themes" sharedThemeEnabled: Boolean @deprecated(reason : "No longer used") - "(Site only) If the user should be using legacy css-supporting list versions" - useLegacyLists: Boolean + useLegacyLists: Boolean @deprecated(reason : "No longer used") } "A user's list options for anime or manga lists" @@ -1832,6 +1835,8 @@ type Mutation { rowOrder: String, "The user's list scoring system" scoreFormat: ScoreFormat, + "Timezone offset format: -?HH:MM" + timezone: String, "User's title language" titleLanguage: UserTitleLanguage ): User @@ -2258,7 +2263,7 @@ type Page { mediaType: MediaType, "The order the results will be returned in" sort: [ReviewSort], - "Filter by media id" + "Filter by user id" userId: Int ): [Review] staff( @@ -2837,7 +2842,7 @@ type Query { mediaType: MediaType, "The order the results will be returned in" sort: [ReviewSort], - "Filter by media id" + "Filter by user id" userId: Int ): Review "Site statistics query" @@ -3127,6 +3132,15 @@ type SiteTrendEdge { "Voice actors or production staff" type Staff { + "Media the actor voiced characters in. (Same data as characters with media as node instead of characters)" + characterMedia( + onList: Boolean, + "The page" + page: Int, + "The amount of entries per page, max 25" + perPage: Int, + sort: [MediaSort] + ): MediaConnection "Characters voiced by the actor" characters( "The page" @@ -3160,6 +3174,7 @@ type Staff { staff: Staff "Media where the staff member has a production role" staffMedia( + onList: Boolean, "The page" page: Int, "The amount of entries per page, max 25" @@ -3264,6 +3279,7 @@ type Studio { media( "If the studio was the primary animation studio of the media" isMain: Boolean, + onList: Boolean, "The page" page: Int, "The amount of entries per page, max 25" @@ -3671,6 +3687,8 @@ type UserOptions { notificationOptions: [NotificationOption] "Profile highlight color (blue, purple, pink, orange, red, green, gray)" profileColor: String + "The user's timezone offset (Auth user only)" + timezone: String "The language the user wants to see media titles in" titleLanguage: UserTitleLanguage } @@ -4058,6 +4076,8 @@ enum MediaStatus { CANCELLED "Has completed and is no longer being released" FINISHED + "Version 2 only. Is currently paused from releasing and will resume at a later date" + HIATUS "To be released at a later date" NOT_YET_RELEASED "Currently releasing" diff --git a/src/AnimeClient/API/Kitsu/schema.graphql b/src/AnimeClient/API/Kitsu/schema.graphql index 3d572188..b34ba5f6 100644 --- a/src/AnimeClient/API/Kitsu/schema.graphql +++ b/src/AnimeClient/API/Kitsu/schema.graphql @@ -20,16 +20,6 @@ interface AmountConsumed { units: Int! } -"Generic error fields used by all errors." -interface Base { - "The error code." - code: String - "A description of the error" - message: String! - "Which input value this error came from" - path: [String!] -} - "Generic Category Breakdown based on Media" interface CategoryBreakdown { "A Map of category_id -> count for all categories present on the library entries" @@ -65,6 +55,16 @@ interface Episodic { totalLength: Int } +"Generic error fields used by all errors." +interface Error { + "The error code." + code: String + "A description of the error" + message: String! + "Which input value this error came from" + path: [String!] +} + "A media in the Kitsu database" interface Media { "The recommended minimum age group for this media" @@ -445,15 +445,13 @@ type AnimeConnection { "Autogenerated return type of AnimeCreate" type AnimeCreatePayload { anime: Anime - "Graphql Errors" - errors: [Generic!] + errors: [Error!] } "Autogenerated return type of AnimeDelete" type AnimeDeletePayload { anime: GenericDelete - "Graphql Errors" - errors: [Generic!] + errors: [Error!] } "An edge in a connection." @@ -464,7 +462,7 @@ type AnimeEdge { node: Anime } -type AnimeMutation { +type AnimeMutations { "Create an Anime." create( "Create an Anime." @@ -485,8 +483,7 @@ type AnimeMutation { "Autogenerated return type of AnimeUpdate" type AnimeUpdatePayload { anime: Anime - "Graphql Errors" - errors: [Generic!] + errors: [Error!] } "Information about a specific Category" @@ -736,15 +733,13 @@ type EpisodeConnection { "Autogenerated return type of EpisodeCreate" type EpisodeCreatePayload { episode: Episode - "Graphql Errors" - errors: [Generic!] + errors: [Error!] } "Autogenerated return type of EpisodeDelete" type EpisodeDeletePayload { episode: GenericDelete - "Graphql Errors" - errors: [Generic!] + errors: [Error!] } "An edge in a connection." @@ -755,7 +750,7 @@ type EpisodeEdge { node: Episode } -type EpisodeMutation { +type EpisodeMutations { "Create an Episode." create( "Create an Episode" @@ -776,8 +771,7 @@ type EpisodeMutation { "Autogenerated return type of EpisodeUpdate" type EpisodeUpdatePayload { episode: Episode - "Graphql Errors" - errors: [Generic!] + errors: [Error!] } "Favorite media, characters, and people for a user" @@ -811,7 +805,7 @@ type FavoriteEdge { node: Favorite } -type Generic implements Base { +type Generic implements Error { "The error code." code: String "A description of the error" @@ -991,15 +985,13 @@ type LibraryEntryConnection { "Autogenerated return type of LibraryEntryCreate" type LibraryEntryCreatePayload { - "Graphql Errors" - errors: [Generic!] + errors: [Error!] libraryEntry: LibraryEntry } "Autogenerated return type of LibraryEntryDelete" type LibraryEntryDeletePayload { - "Graphql Errors" - errors: [Generic!] + errors: [Error!] libraryEntry: GenericDelete } @@ -1011,7 +1003,7 @@ type LibraryEntryEdge { node: LibraryEntry } -type LibraryEntryMutation { +type LibraryEntryMutations { "Create a library entry" create( "Create a Library Entry" @@ -1061,50 +1053,43 @@ type LibraryEntryMutation { "Autogenerated return type of LibraryEntryUpdate" type LibraryEntryUpdatePayload { - "Graphql Errors" - errors: [Generic!] + errors: [Error!] libraryEntry: LibraryEntry } "Autogenerated return type of LibraryEntryUpdateProgressById" type LibraryEntryUpdateProgressByIdPayload { - "Graphql Errors" - errors: [Generic!] + errors: [Error!] libraryEntry: LibraryEntry } "Autogenerated return type of LibraryEntryUpdateProgressByMedia" type LibraryEntryUpdateProgressByMediaPayload { - "Graphql Errors" - errors: [Generic!] + errors: [Error!] libraryEntry: LibraryEntry } "Autogenerated return type of LibraryEntryUpdateRatingById" type LibraryEntryUpdateRatingByIdPayload { - "Graphql Errors" - errors: [Generic!] + errors: [Error!] libraryEntry: LibraryEntry } "Autogenerated return type of LibraryEntryUpdateRatingByMedia" type LibraryEntryUpdateRatingByMediaPayload { - "Graphql Errors" - errors: [Generic!] + errors: [Error!] libraryEntry: LibraryEntry } "Autogenerated return type of LibraryEntryUpdateStatusById" type LibraryEntryUpdateStatusByIdPayload { - "Graphql Errors" - errors: [Generic!] + errors: [Error!] libraryEntry: LibraryEntry } "Autogenerated return type of LibraryEntryUpdateStatusByMedia" type LibraryEntryUpdateStatusByMediaPayload { - "Graphql Errors" - errors: [Generic!] + errors: [Error!] libraryEntry: LibraryEntry } @@ -1145,13 +1130,6 @@ type LibraryEventEdge { node: LibraryEvent } -"Autogenerated return type of LockPost" -type LockPostPayload { - "Graphql Errors" - errors: [Generic!] - post: Post -} - type Manga implements Media & WithTimestamps { "The recommended minimum age group for this media" ageRating: AgeRatingEnum @@ -1361,15 +1339,13 @@ type MappingConnection { "Autogenerated return type of MappingCreate" type MappingCreatePayload { - "Graphql Errors" - errors: [Generic!] + errors: [Error!] mapping: Mapping } "Autogenerated return type of MappingDelete" type MappingDeletePayload { - "Graphql Errors" - errors: [Generic!] + errors: [Error!] mapping: GenericDelete } @@ -1381,7 +1357,7 @@ type MappingEdge { node: Mapping } -type MappingMutation { +type MappingMutations { "Create a Mapping" create( "Create a Mapping" @@ -1401,8 +1377,7 @@ type MappingMutation { "Autogenerated return type of MappingUpdate" type MappingUpdatePayload { - "Graphql Errors" - errors: [Generic!] + errors: [Error!] mapping: Mapping } @@ -1584,12 +1559,12 @@ type MediaStaffEdge { } type Mutation { - anime: AnimeMutation - episode: EpisodeMutation - libraryEntry: LibraryEntryMutation - mapping: MappingMutation - post: PostMutation - pro: ProMutation! + anime: AnimeMutations + episode: EpisodeMutations + libraryEntry: LibraryEntryMutations + mapping: MappingMutations + post: PostMutations + pro: ProMutations! } "Information about pagination in a connection." @@ -1723,32 +1698,54 @@ type PostEdge { node: Post } -type PostMutation { +"Autogenerated return type of PostLock" +type PostLockPayload { + errors: [Error!] + post: Post +} + +type PostMutations { "Lock a Post." lock( "Lock a Post." input: LockInput! - ): LockPostPayload + ): PostLockPayload "Unlock a Post." unlock( "Unlock a Post." input: UnlockInput! - ): UnlockPostPayload + ): PostUnlockPayload } -type ProMutation { +"Autogenerated return type of PostUnlock" +type PostUnlockPayload { + errors: [Error!] + post: Post +} + +type ProMutations { "Set the user's discord tag" setDiscord( "Your discord tag (Name#1234)" discord: String! - ): SetDiscordPayload + ): ProSetDiscordPayload "Set the user's Hall-of-Fame message" setMessage( "The message to set for your Hall of Fame entry" message: String! - ): SetMessagePayload + ): ProSetMessagePayload "End the user's pro subscription" - unsubscribe: UnsubscribePayload + unsubscribe: ProUnsubscribePayload +} + +"Autogenerated return type of ProSetDiscord" +type ProSetDiscordPayload { + discord: String! +} + +"Autogenerated return type of ProSetMessage" +type ProSetMessagePayload { + message: String! } "A subscription to Kitsu PRO" @@ -1763,6 +1760,11 @@ type ProSubscription implements WithTimestamps { updatedAt: ISO8601DateTime! } +"Autogenerated return type of ProUnsubscribe" +type ProUnsubscribePayload { + expiresAt: ISO8601DateTime +} + "A company involved in the creation or localization of media" type Producer implements WithTimestamps { createdAt: ISO8601DateTime! @@ -2223,20 +2225,6 @@ type Session { profile: Profile } -"Autogenerated return type of SetDiscord" -type SetDiscordPayload { - discord: String! - "Graphql Errors" - errors: [Generic!] -} - -"Autogenerated return type of SetMessage" -type SetMessagePayload { - "Graphql Errors" - errors: [Generic!] - message: String! -} - "A link to a user's profile on an external site." type SiteLink implements WithTimestamps { "The user profile the site is linked to." @@ -2349,20 +2337,6 @@ type TitlesList { localized(locales: [String!]): Map! } -"Autogenerated return type of UnlockPost" -type UnlockPostPayload { - "Graphql Errors" - errors: [Generic!] - post: Post -} - -"Autogenerated return type of Unsubscribe" -type UnsubscribePayload { - "Graphql Errors" - errors: [Generic!] - expiresAt: ISO8601DateTime -} - "The media video." type Video implements Streamable & WithTimestamps { createdAt: ISO8601DateTime! @@ -2770,6 +2744,7 @@ input MappingUpdateInput { input TitlesListInput { alternatives: [String!] + canonical: String canonicalLocale: String localized: Map } From 0f9dd61b6b4f926c306f58bb5c6b51f12a2d8c43 Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Mon, 22 Feb 2021 15:39:03 -0500 Subject: [PATCH 10/28] Better handle update API errors --- src/AnimeClient/Command/BaseCommand.php | 7 +++++-- src/AnimeClient/Command/SyncLists.php | 13 +++++++++++-- src/AnimeClient/Controller/Anime.php | 2 +- src/AnimeClient/Controller/Manga.php | 2 +- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/AnimeClient/Command/BaseCommand.php b/src/AnimeClient/Command/BaseCommand.php index 3451972f..10ec679e 100644 --- a/src/AnimeClient/Command/BaseCommand.php +++ b/src/AnimeClient/Command/BaseCommand.php @@ -144,13 +144,16 @@ abstract class BaseCommand extends Command { { if ($fgColor !== NULL) { - $fgColor = (string)$fgColor; + $fgColor = (int)$fgColor; } if ($bgColor !== NULL) { - $bgColor = (string)$bgColor; + $bgColor = (int)$bgColor; } + // Colorize the CLI output + // the documented type for the function is wrong + // @phpstan-ignore-next-line $message = Colors::colorize($message, $fgColor, $bgColor); $this->getConsole()->writeln($message); } diff --git a/src/AnimeClient/Command/SyncLists.php b/src/AnimeClient/Command/SyncLists.php index cb062b02..01964a2b 100644 --- a/src/AnimeClient/Command/SyncLists.php +++ b/src/AnimeClient/Command/SyncLists.php @@ -16,6 +16,7 @@ namespace Aviat\AnimeClient\Command; +use Aviat\Ion\JsonException; use ConsoleKit\Widgets; use Aviat\AnimeClient\API\{ @@ -288,7 +289,15 @@ final class SyncLists extends BaseCommand { // This uses a static so I don't have to fetch this list twice for a count if ($list[$type] === NULL) { - $list[$type] = $this->anilistModel->getSyncList(strtoupper($type)); + try + { + $list[$type] = $this->anilistModel->getSyncList(strtoupper($type)); + } + catch (JsonException) + { + $this->echoErrorBox('Anlist API exception. Can not sync.'); + die(); + } } return $list[$type]; @@ -599,7 +608,7 @@ final class SyncLists extends BaseCommand { $kitsuItem['data']['ratingTwenty'] !== 0 ) { - $update['data']['ratingTwenty'] = $kitsuItem['data']['ratingTwenty']; + $update['data']['ratingTwenty'] = $kitsuItem['data']['rating']; $return['updateType'][] = Enum\API::ANILIST; } else if($dateDiff === self::ANILIST_GREATER && $anilistItem['data']['rating'] !== 0) diff --git a/src/AnimeClient/Controller/Anime.php b/src/AnimeClient/Controller/Anime.php index 90aa63c5..d56740a0 100644 --- a/src/AnimeClient/Controller/Anime.php +++ b/src/AnimeClient/Controller/Anime.php @@ -228,7 +228,7 @@ final class Anime extends BaseController { $postData = $transformer->untransform($data); $fullResult = $this->model->updateLibraryItem(FormItem::from($postData)); - if ($fullResult['statusCode'] === 200) + if ($fullResult['statusCode'] === 200 && $fullResult['body']['error'] === NULL) { $this->setFlashMessage('Successfully updated.', 'success'); $this->cache->clear(); diff --git a/src/AnimeClient/Controller/Manga.php b/src/AnimeClient/Controller/Manga.php index d0aa83ce..05e7719d 100644 --- a/src/AnimeClient/Controller/Manga.php +++ b/src/AnimeClient/Controller/Manga.php @@ -229,7 +229,7 @@ final class Manga extends Controller { $post_data = $transformer->untransform($data); $full_result = $this->model->updateLibraryItem(FormItem::from($post_data)); - if ($full_result['statusCode'] === 200) + if ($full_result['statusCode'] === 200 && $full_result['body']['error'] === NULL) { $this->setFlashMessage('Successfully updated manga.', 'success'); $this->cache->clear(); From 0a87f817688e067ae8cefe76e0adde9eb6d42a56 Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Tue, 23 Feb 2021 12:00:22 -0500 Subject: [PATCH 11/28] Improve test coverage --- src/AnimeClient/Helper/Picture.php | 44 +++++++++---------- tests/AnimeClient/Helper/FormHelperTest.php | 37 ++++++++++++++++ .../AnimeClient/Helper/PictureHelperTest.php | 41 ++++++++++------- .../FormHelperTest__testFormHelper__1.txt | 1 + ...eHelper with data set Full AVIF URL__1.txt | 1 + tests/AnimeClient/KitsuTest.php | 15 ++++++- 6 files changed, 96 insertions(+), 43 deletions(-) create mode 100644 tests/AnimeClient/Helper/FormHelperTest.php create mode 100644 tests/AnimeClient/Helper/__snapshots__/FormHelperTest__testFormHelper__1.txt create mode 100644 tests/AnimeClient/Helper/__snapshots__/PictureHelperTest__testPictureHelper with data set Full AVIF URL__1.txt diff --git a/src/AnimeClient/Helper/Picture.php b/src/AnimeClient/Helper/Picture.php index 32334ebd..0c36abd0 100644 --- a/src/AnimeClient/Helper/Picture.php +++ b/src/AnimeClient/Helper/Picture.php @@ -25,22 +25,6 @@ final class Picture { use ContainerAware; - private const MIME_MAP = [ - 'apng' => 'image/vnd.mozilla.apng', - 'bmp' => 'image/bmp', - 'gif' => 'image/gif', - 'ico' => 'image/x-icon', - 'jpeg' => 'image/jpeg', - 'jpf' => 'image/jpx', - 'jpg' => 'image/jpeg', - 'jpx' => 'image/jpx', - 'png' => 'image/png', - 'svg' => 'image/svg+xml', - 'tif' => 'image/tiff', - 'tiff' => 'image/tiff', - 'webp' => 'image/webp', - ]; - private const SIMPLE_IMAGE_TYPES = [ 'gif', 'jpeg', @@ -82,22 +66,34 @@ final class Picture { $ext = array_pop($urlParts); $path = implode('.', $urlParts); - $mime = array_key_exists($ext, static::MIME_MAP) - ? static::MIME_MAP[$ext] - : 'image/jpeg'; + $mime = match ($ext) { + 'avif' => 'image/avif', + 'apng' => 'image/vnd.mozilla.apng', + 'bmp' => 'image/bmp', + 'gif' => 'image/gif', + 'ico' => 'image/x-icon', + 'jpf', 'jpx' => 'image/jpx', + 'png' => 'image/png', + 'svg' => 'image/svg+xml', + 'tif', 'tiff' => 'image/tiff', + 'webp' => 'image/webp', + default => 'image/jpeg', + }; - $fallbackMime = array_key_exists($fallbackExt, static::MIME_MAP) - ? static::MIME_MAP[$fallbackExt] - : 'image/jpeg'; + $fallbackMime = match ($fallbackExt) { + 'gif' => 'image/gif', + 'png' => 'image/png', + default => 'image/jpeg', + }; // For image types that are well-established, just return a // simple element instead if ( $ext === $fallbackExt || - \in_array($ext, static::SIMPLE_IMAGE_TYPES, TRUE) + \in_array($ext, Picture::SIMPLE_IMAGE_TYPES, TRUE) ) { - $attrs = ( ! empty($imgAttrs)) + $attrs = (count($imgAttrs) > 1) ? $imgAttrs : $picAttrs; diff --git a/tests/AnimeClient/Helper/FormHelperTest.php b/tests/AnimeClient/Helper/FormHelperTest.php new file mode 100644 index 00000000..7db90484 --- /dev/null +++ b/tests/AnimeClient/Helper/FormHelperTest.php @@ -0,0 +1,37 @@ + + * @copyright 2015 - 2021 Timothy J. Warren + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @version 5.2 + * @link https://git.timshomepage.net/timw4mail/HummingBirdAnimeClient + */ + +namespace Aviat\AnimeClient\Tests\Helper; + +use Aviat\AnimeClient\Helper\Form as FormHelper; +use Aviat\AnimeClient\Tests\AnimeClientTestCase; + +class FormHelperTest extends AnimeClientTestCase { + public function testFormHelper(): void + { + $helper = new FormHelper(); + $helper->setContainer($this->container); + + $actual = $helper('input', [ + 'type' => 'text', + 'value' => 'foo', + 'placeholder' => 'field', + 'name' => 'test' + ]); + + $this->assertMatchesSnapshot($actual); + } +} \ No newline at end of file diff --git a/tests/AnimeClient/Helper/PictureHelperTest.php b/tests/AnimeClient/Helper/PictureHelperTest.php index 9df0f61c..48a35c4d 100644 --- a/tests/AnimeClient/Helper/PictureHelperTest.php +++ b/tests/AnimeClient/Helper/PictureHelperTest.php @@ -22,53 +22,55 @@ use Aviat\AnimeClient\Tests\AnimeClientTestCase; class PictureHelperTest extends AnimeClientTestCase { /** * @dataProvider dataPictureCase + * @param array $params */ - public function testPictureHelper($params, $expected = NULL) + public function testPictureHelper(array $params): void { $helper = new PictureHelper(); $helper->setContainer($this->container); $actual = $helper(...$params); - if ($expected === NULL) - { - $this->assertMatchesSnapshot($actual); - } - else - { - $this->assertEquals($expected, $actual); - } + $this->assertMatchesSnapshot($actual); } /** * @dataProvider dataSimpleImageCase + * @param string $ext + * @param bool $isSimple + * @param string $fallbackExt */ - public function testSimpleImage(string $ext, bool $isSimple) + public function testSimpleImage(string $ext, bool $isSimple, string $fallbackExt = 'jpg'): void { $helper = new PictureHelper(); $helper->setContainer($this->container); $url = "https://example.com/image.{$ext}"; - $actual = $helper($url); + $actual = $helper($url, $fallbackExt); - $actuallySimple = strpos($actual, 'assertEquals($isSimple, $actuallySimple); } - public function testSimpleImageByFallback() + public function testSimpleImageByFallback(): void { $helper = new PictureHelper(); $helper->setContainer($this->container); $actual = $helper("foo.svg", 'svg'); - $this->assertTrue(strpos($actual, 'assertTrue(! str_contains($actual, ' [ + 'params' => [ + 'https://www.example.com/image.avif', + ], + ], 'Full webp URL' => [ 'params' => [ 'https://www.example.com/image.webp', @@ -112,16 +114,21 @@ class PictureHelperTest extends AnimeClientTestCase { 'params' => [ 'images/foo.jpg', 'jpg', - [ 'x' => 1, 'y' => 1 ], + [], ['width' => 200, 'height' => 200, 'alt' => 'should exist'], ] ] ]; } - public function dataSimpleImageCase() + public function dataSimpleImageCase(): array { return [ + 'avif' => [ + 'ext' => 'avif', + 'isSimple' => FALSE, + 'fallback' => 'jpf' + ], 'apng' => [ 'ext' => 'apng', 'isSimple' => FALSE, diff --git a/tests/AnimeClient/Helper/__snapshots__/FormHelperTest__testFormHelper__1.txt b/tests/AnimeClient/Helper/__snapshots__/FormHelperTest__testFormHelper__1.txt new file mode 100644 index 00000000..bc40489d --- /dev/null +++ b/tests/AnimeClient/Helper/__snapshots__/FormHelperTest__testFormHelper__1.txt @@ -0,0 +1 @@ + diff --git a/tests/AnimeClient/Helper/__snapshots__/PictureHelperTest__testPictureHelper with data set Full AVIF URL__1.txt b/tests/AnimeClient/Helper/__snapshots__/PictureHelperTest__testPictureHelper with data set Full AVIF URL__1.txt new file mode 100644 index 00000000..d0856346 --- /dev/null +++ b/tests/AnimeClient/Helper/__snapshots__/PictureHelperTest__testPictureHelper with data set Full AVIF URL__1.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/AnimeClient/KitsuTest.php b/tests/AnimeClient/KitsuTest.php index 7a099a6f..c644db09 100644 --- a/tests/AnimeClient/KitsuTest.php +++ b/tests/AnimeClient/KitsuTest.php @@ -55,6 +55,17 @@ class KitsuTest extends TestCase { $this->assertEquals($expected, Kitsu::parseStreamingLinks($nodes)); } + public function testParseStreamingLinksNoHost(): void + { + $nodes = [[ + 'url' => '/link-fragment', + 'dubs' => [], + 'subs' => [], + ]]; + + $this->assertEquals([], Kitsu::parseStreamingLinks($nodes)); + } + public function testGetAiringStatusEmptyArguments(): void { $this->assertEquals(AnimeAiringStatus::NOT_YET_AIRED, Kitsu::getAiringStatus()); @@ -123,7 +134,7 @@ class KitsuTest extends TestCase { $this->assertEquals($expected, $actual); } - public function testFilterLocalizedTitles() + public function testFilterLocalizedTitles(): void { $input = [ 'canonical' => 'foo', @@ -140,7 +151,7 @@ class KitsuTest extends TestCase { $this->assertEquals(['Foo the Movie'], $actual); } - public function testGetFilteredTitles() + public function testGetFilteredTitles(): void { $input = [ 'canonical' => 'foo', From e25c68b97cca28ce8dff5fdbef689374614db08e Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Tue, 23 Feb 2021 13:00:30 -0500 Subject: [PATCH 12/28] Increase test coverage of Kitsu Transformer classes --- src/AnimeClient/Types/HistoryItem.php | 2 +- .../Transformer/AnimeListTransformerTest.php | 14 +- .../Transformer/CharacterTransformerTest.php | 40 + .../Transformer/HistoryTransformerTest.php | 47 + .../Transformer/PersonTransformerTest.php | 40 + .../Kitsu/Transformer/UserTransformerTest.php | 40 + ...storyTransformerTest__testTransform__1.yml | 630 ++ ...acterTransformerTest__testTransform__1.yml | 14 + ...TransformerTest__testAnimeTransform__1.yml | 630 ++ ...TransformerTest__testMangaTransform__1.yml | 1 + ...ersonTransformerTest__testTransform__1.yml | 12 + .../UserTransformerTest__testTransform__1.yml | 20 + tests/AnimeClient/Command/BaseCommandTest.php | 4 +- tests/AnimeClient/RequirementsTest.php | 2 +- tests/AnimeClient/mocks.php | 6 +- .../Kitsu/characterBeforeTransform.json | 3178 +++++++ .../Kitsu/historyBeforeTransform.json | 5846 ++++++++++++ .../Kitsu/personBeforeTransform.json | 7833 +++++++++++++++++ .../test_data/Kitsu/userBeforeTransform.json | 536 ++ 19 files changed, 18881 insertions(+), 14 deletions(-) create mode 100644 tests/AnimeClient/API/Kitsu/Transformer/CharacterTransformerTest.php create mode 100644 tests/AnimeClient/API/Kitsu/Transformer/HistoryTransformerTest.php create mode 100644 tests/AnimeClient/API/Kitsu/Transformer/PersonTransformerTest.php create mode 100644 tests/AnimeClient/API/Kitsu/Transformer/UserTransformerTest.php create mode 100644 tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/AnimeHistoryTransformerTest__testTransform__1.yml create mode 100644 tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/CharacterTransformerTest__testTransform__1.yml create mode 100644 tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/HistoryTransformerTest__testAnimeTransform__1.yml create mode 100644 tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/HistoryTransformerTest__testMangaTransform__1.yml create mode 100644 tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/PersonTransformerTest__testTransform__1.yml create mode 100644 tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/UserTransformerTest__testTransform__1.yml create mode 100644 tests/AnimeClient/test_data/Kitsu/characterBeforeTransform.json create mode 100644 tests/AnimeClient/test_data/Kitsu/historyBeforeTransform.json create mode 100644 tests/AnimeClient/test_data/Kitsu/personBeforeTransform.json create mode 100644 tests/AnimeClient/test_data/Kitsu/userBeforeTransform.json diff --git a/src/AnimeClient/Types/HistoryItem.php b/src/AnimeClient/Types/HistoryItem.php index 68f608db..795f98d6 100644 --- a/src/AnimeClient/Types/HistoryItem.php +++ b/src/AnimeClient/Types/HistoryItem.php @@ -42,7 +42,7 @@ class HistoryItem extends AbstractType { /** * The kind of history event */ - public string $kind = ''; + public ?string $kind = ''; /** * When the item was last updated diff --git a/tests/AnimeClient/API/Kitsu/Transformer/AnimeListTransformerTest.php b/tests/AnimeClient/API/Kitsu/Transformer/AnimeListTransformerTest.php index a79462c9..8b65952d 100644 --- a/tests/AnimeClient/API/Kitsu/Transformer/AnimeListTransformerTest.php +++ b/tests/AnimeClient/API/Kitsu/Transformer/AnimeListTransformerTest.php @@ -21,10 +21,9 @@ use Aviat\AnimeClient\Tests\AnimeClientTestCase; use Aviat\Ion\Json; class AnimeListTransformerTest extends AnimeClientTestCase { - protected $dir; - protected $beforeTransform; - protected $afterTransform; - protected $transformer; + protected string $dir; + protected array $beforeTransform; + protected AnimeListTransformer $transformer; public function setUp(): void { parent::setUp(); @@ -36,13 +35,13 @@ class AnimeListTransformerTest extends AnimeClientTestCase { $this->transformer = new AnimeListTransformer(); } - public function testTransform() + public function testTransform(): void { $actual = $this->transformer->transform($this->beforeTransform); $this->assertMatchesSnapshot($actual); } - public function dataUntransform() + public function dataUntransform(): array { return [[ 'input' => [ @@ -85,8 +84,9 @@ class AnimeListTransformerTest extends AnimeClientTestCase { /** * @dataProvider dataUntransform + * @param array $input */ - public function testUntransform($input) + public function testUntransform(array $input): void { $actual = $this->transformer->untransform($input); $this->assertMatchesSnapshot($actual); diff --git a/tests/AnimeClient/API/Kitsu/Transformer/CharacterTransformerTest.php b/tests/AnimeClient/API/Kitsu/Transformer/CharacterTransformerTest.php new file mode 100644 index 00000000..9d477b94 --- /dev/null +++ b/tests/AnimeClient/API/Kitsu/Transformer/CharacterTransformerTest.php @@ -0,0 +1,40 @@ + + * @copyright 2015 - 2021 Timothy J. Warren + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @version 5.2 + * @link https://git.timshomepage.net/timw4mail/HummingBirdAnimeClient + */ + +namespace Aviat\AnimeClient\Tests\API\Kitsu\Transformer; + +use Aviat\AnimeClient\API\Kitsu\Transformer\CharacterTransformer; +use Aviat\AnimeClient\Tests\AnimeClientTestCase; +use Aviat\Ion\Json; + +class CharacterTransformerTest extends AnimeClientTestCase { + protected array $beforeTransform; + protected string $dir; + + public function setUp(): void { + parent::setUp(); + $this->dir = AnimeClientTestCase::TEST_DATA_DIR . '/Kitsu'; + + $raw = Json::decodeFile("{$this->dir}/characterBeforeTransform.json"); + $this->beforeTransform = $raw; + } + + public function testTransform(): void + { + $actual = (new CharacterTransformer())->transform($this->beforeTransform); + $this->assertMatchesSnapshot($actual); + } +} \ No newline at end of file diff --git a/tests/AnimeClient/API/Kitsu/Transformer/HistoryTransformerTest.php b/tests/AnimeClient/API/Kitsu/Transformer/HistoryTransformerTest.php new file mode 100644 index 00000000..8873efd5 --- /dev/null +++ b/tests/AnimeClient/API/Kitsu/Transformer/HistoryTransformerTest.php @@ -0,0 +1,47 @@ + + * @copyright 2015 - 2021 Timothy J. Warren + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @version 5.2 + * @link https://git.timshomepage.net/timw4mail/HummingBirdAnimeClient + */ + +namespace Aviat\AnimeClient\Tests\API\Kitsu\Transformer; + +use Aviat\AnimeClient\API\Kitsu\Transformer\AnimeHistoryTransformer; +use Aviat\AnimeClient\API\Kitsu\Transformer\MangaHistoryTransformer; +use Aviat\AnimeClient\Tests\AnimeClientTestCase; +use Aviat\Ion\Json; + +class HistoryTransformerTest extends AnimeClientTestCase { + protected array $beforeTransform; + protected string $dir; + + public function setUp(): void { + parent::setUp(); + $this->dir = AnimeClientTestCase::TEST_DATA_DIR . '/Kitsu'; + + $raw = Json::decodeFile("{$this->dir}/historyBeforeTransform.json"); + $this->beforeTransform = $raw; + } + + public function testAnimeTransform(): void + { + $actual = (new AnimeHistoryTransformer())->transform($this->beforeTransform); + $this->assertMatchesSnapshot($actual); + } + + public function testMangaTransform(): void + { + $actual = (new MangaHistoryTransformer())->transform($this->beforeTransform); + $this->assertMatchesSnapshot($actual); + } +} \ No newline at end of file diff --git a/tests/AnimeClient/API/Kitsu/Transformer/PersonTransformerTest.php b/tests/AnimeClient/API/Kitsu/Transformer/PersonTransformerTest.php new file mode 100644 index 00000000..930910e0 --- /dev/null +++ b/tests/AnimeClient/API/Kitsu/Transformer/PersonTransformerTest.php @@ -0,0 +1,40 @@ + + * @copyright 2015 - 2021 Timothy J. Warren + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @version 5.2 + * @link https://git.timshomepage.net/timw4mail/HummingBirdAnimeClient + */ + +namespace Aviat\AnimeClient\Tests\API\Kitsu\Transformer; + +use Aviat\AnimeClient\API\Kitsu\Transformer\PersonTransformer; +use Aviat\AnimeClient\Tests\AnimeClientTestCase; +use Aviat\Ion\Json; + +class PersonTransformerTest extends AnimeClientTestCase { + protected array $beforeTransform; + protected string $dir; + + public function setUp(): void { + parent::setUp(); + $this->dir = AnimeClientTestCase::TEST_DATA_DIR . '/Kitsu'; + + $raw = Json::decodeFile("{$this->dir}/personBeforeTransform.json"); + $this->beforeTransform = $raw; + } + + public function testTransform(): void + { + $actual = (new PersonTransformer())->transform($this->beforeTransform); + $this->assertMatchesSnapshot($actual); + } +} \ No newline at end of file diff --git a/tests/AnimeClient/API/Kitsu/Transformer/UserTransformerTest.php b/tests/AnimeClient/API/Kitsu/Transformer/UserTransformerTest.php new file mode 100644 index 00000000..0b2afd97 --- /dev/null +++ b/tests/AnimeClient/API/Kitsu/Transformer/UserTransformerTest.php @@ -0,0 +1,40 @@ + + * @copyright 2015 - 2021 Timothy J. Warren + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @version 5.2 + * @link https://git.timshomepage.net/timw4mail/HummingBirdAnimeClient + */ + +namespace Aviat\AnimeClient\Tests\API\Kitsu\Transformer; + +use Aviat\AnimeClient\API\Kitsu\Transformer\UserTransformer; +use Aviat\AnimeClient\Tests\AnimeClientTestCase; +use Aviat\Ion\Json; + +class UserTransformerTest extends AnimeClientTestCase { + protected array $beforeTransform; + protected string $dir; + + public function setUp(): void { + parent::setUp(); + $this->dir = AnimeClientTestCase::TEST_DATA_DIR . '/Kitsu'; + + $raw = Json::decodeFile("{$this->dir}/userBeforeTransform.json"); + $this->beforeTransform = $raw; + } + + public function testTransform(): void + { + $actual = (new UserTransformer())->transform($this->beforeTransform); + $this->assertMatchesSnapshot($actual); + } +} \ No newline at end of file diff --git a/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/AnimeHistoryTransformerTest__testTransform__1.yml b/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/AnimeHistoryTransformerTest__testTransform__1.yml new file mode 100644 index 00000000..71f401d5 --- /dev/null +++ b/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/AnimeHistoryTransformerTest__testTransform__1.yml @@ -0,0 +1,630 @@ +- + empty: false + title: 'Shin Chuuka Ichiban! 2nd Season' + coverImg: images/anime/43825.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-23T12:24:03-05:00' + url: /anime/details/shin-chuuka-ichiban-2nd-season + original: { id: '47211008', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43825', slug: shin-chuuka-ichiban-2nd-season, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43825/tiny.jpg?1609082225' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43825/small.jpg?1609082225' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43825/medium.jpg?1609082225' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43825/large.jpg?1609082225' }] }, titles: { alternatives: ['New Cooking Master Boy!'], canonical: 'Shin Chuuka Ichiban! 2nd Season', localized: { en: 'True Cooking Master Boy Season 2', en_jp: 'Shin Chuuka Ichiban! 2nd Season', ja_jp: 真・中華一番! } } }, updatedAt: '2021-02-23T17:24:03Z' } +- + empty: false + title: Horimiya + coverImg: images/anime/43545.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-23T07:45:26-05:00' + url: /anime/details/horimiya + original: { id: '47197990', changedData: { progress: [6, 7], time_spent: [5520, 6900] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43545', slug: horimiya, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43545/tiny.jpg?1609224996' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43545/small.jpg?1609224996' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43545/medium.jpg?1609224996' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43545/large.jpg?1609224996' }] }, titles: { alternatives: { }, canonical: Horimiya, localized: { en_jp: Horimiya, ja_jp: ホリミヤ } } }, updatedAt: '2021-02-23T12:45:26Z' } +- + empty: false + title: 'Kai Byoui Ramune' + coverImg: images/anime/43818.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-23T07:20:46-05:00' + url: /anime/details/kai-byoui-ramune + original: { id: '47197145', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '43818', slug: kai-byoui-ramune, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43818/tiny.jpg?1608544506' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43818/small.jpg?1608544506' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43818/medium.jpg?1608544506' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43818/large.jpg?1608544506' }] }, titles: { alternatives: { }, canonical: 'Kai Byoui Ramune', localized: { en: 'Dr. Ramune -Mysterious Disease Specialist-', en_jp: 'Kai Byoui Ramune', ja_jp: 怪病医ラムネ } } }, updatedAt: '2021-02-23T12:20:46Z' } +- + empty: false + title: 'Yes! Precure 5' + coverImg: images/anime/1742.webp + action: 'Watched episode 23' + kind: progressed + updated: '2021-02-22T15:25:05-05:00' + url: /anime/details/yes-precure-5 + original: { id: '47150310', changedData: { progress: [24, 23], time_spent: [1992, 1968] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-22T20:25:05Z' } +- + empty: false + title: 'Tatoeba Last Dungeon Mae no Mura no Shounen ga Joban no Machi de Kurasu Youna Monogatari' + coverImg: images/anime/42635.webp + action: 'Watched episode 8' + kind: progressed + updated: '2021-02-22T12:50:38-05:00' + url: /anime/details/tatoeba-last-dungeon-mae-no-mura-no-shounen-ga-joban-no-machi-de-kurasu-youna-monogatari + original: { id: '47142671', changedData: { progress: [7, 8] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42635', slug: tatoeba-last-dungeon-mae-no-mura-no-shounen-ga-joban-no-machi-de-kurasu-youna-monogatari, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42635/tiny.jpg?1571504181' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42635/small.jpg?1571504181' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42635/medium.jpg?1571504181' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42635/large.jpg?1571504181' }] }, titles: { alternatives: ['Suppose a Kid from the Last Dungeon Boonies Moved to a Starter Town'], canonical: 'Tatoeba Last Dungeon Mae no Mura no Shounen ga Joban no Machi de Kurasu Youna Monogatari', localized: { en_jp: 'Tatoeba Last Dungeon Mae no Mura no Shounen ga Joban no Machi de Kurasu Youna Monogatari', ja_jp: たとえばラストダンジョン前の村の少年が序盤の街で暮らすような物語 } } }, updatedAt: '2021-02-22T17:50:38Z' } +- + empty: false + title: 'Mushoku Tensei: Isekai Ittara Honki Dasu' + coverImg: images/anime/42323.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-22T12:27:39-05:00' + url: /anime/details/mushoku-tensei-isekai-ittara-honki-dasu + original: { id: '47141571', changedData: { progress: [6, 7], time_spent: [4320, 5760] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: 'The pervert aspect of this dampens my enjoyment. ' }, media: { __typename: Anime, id: '42323', slug: mushoku-tensei-isekai-ittara-honki-dasu, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42323/tiny.jpg?1571408000' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42323/small.jpg?1571408000' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42323/medium.jpg?1571408000' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42323/large.jpg?1571408000' }] }, titles: { alternatives: { }, canonical: 'Mushoku Tensei: Isekai Ittara Honki Dasu', localized: { en: 'Mushoku Tensei: Jobless Reincarnation', en_jp: 'Mushoku Tensei: Isekai Ittara Honki Dasu', ja_jp: '無職転生 ~異世界行ったら本気だす~' } } }, updatedAt: '2021-02-22T17:27:39Z' } +- + empty: false + title: 'Healin'' Good♡Precure' + coverImg: images/anime/42650.webp + action: Completed + kind: updated + updated: '2021-02-21T07:47:27-05:00' + url: /anime/details/healin-good-precure + original: { id: '47057900', changedData: { status: [current] }, kind: UPDATED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42650', slug: healin-good-precure, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42650/tiny.jpg?1578070083' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42650/small.jpg?1578070083' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42650/medium.jpg?1578070083' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42650/large.jpg?1578070083' }] }, titles: { alternatives: { }, canonical: 'Healin'' Good♡Precure', localized: { en: 'Healin'' Good Pretty Cure', en_jp: 'Healin'' Good♡Precure', ja_jp: ヒーリングっど♡プリキュア } } }, updatedAt: '2021-02-21T12:47:27Z' } +- + empty: false + title: 'Healin'' Good♡Precure' + coverImg: images/anime/42650.webp + action: 'Watched episode 45' + kind: progressed + updated: '2021-02-21T07:47:27-05:00' + url: /anime/details/healin-good-precure + original: { id: '47057899', changedData: { progress: [44, 45], time_spent: [63360, 64800] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42650', slug: healin-good-precure, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42650/tiny.jpg?1578070083' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42650/small.jpg?1578070083' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42650/medium.jpg?1578070083' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42650/large.jpg?1578070083' }] }, titles: { alternatives: { }, canonical: 'Healin'' Good♡Precure', localized: { en: 'Healin'' Good Pretty Cure', en_jp: 'Healin'' Good♡Precure', ja_jp: ヒーリングっど♡プリキュア } } }, updatedAt: '2021-02-21T12:47:27Z' } +- + empty: false + title: 'Yes! Precure 5' + coverImg: images/anime/1742.webp + action: 'Watched episodes 23-24' + kind: null + updated: '2021-02-20T18:39:13-05:00' + url: /anime/details/yes-precure-5 + original: [{ empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 24', kind: progressed, updated: '2021-02-20T18:39:13-05:00', url: /anime/details/yes-precure-5, original: { id: '47027732', changedData: { progress: [23, 24], time_spent: [1968, 1992] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-20T23:39:13Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 23', kind: progressed, updated: '2021-02-20T18:14:59-05:00', url: /anime/details/yes-precure-5, original: { id: '47026266', changedData: { progress: [22, 23], time_spent: [1944, 1968] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-20T23:14:59Z' } }] +- + empty: false + title: 'Ore dake Haireru Kakushi Dungeon' + coverImg: images/anime/43301.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-20T17:42:45-05:00' + url: /anime/details/ore-dake-haireru-kakushi-dungeon + original: { id: '47024295', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43301', slug: ore-dake-haireru-kakushi-dungeon, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43301/tiny.jpg?1607696005' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43301/small.jpg?1607696005' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43301/medium.jpg?1607696005' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43301/large.jpg?1607696005' }] }, titles: { alternatives: ['Special training in the Secret Dungeon', 'Ore Dake Haireru Kakushi Dungeon: Kossori Kitaete Sekai Saikyou'], canonical: 'Ore dake Haireru Kakushi Dungeon', localized: { en: 'The Hidden Dungeon Only I Can Enter', en_jp: 'Ore dake Haireru Kakushi Dungeon', ja_jp: 俺だけ入れる隠しダンジョン } } }, updatedAt: '2021-02-20T22:42:45Z' } +- + empty: false + title: 'Inu to Neko Docchi mo Katteru to Mainichi Tanoshii' + coverImg: images/anime/43550.webp + action: 'Watched episode 19' + kind: progressed + updated: '2021-02-20T17:14:24-05:00' + url: /anime/details/inu-to-neko-docchi-mo-katteru-to-mainichi-tanoshii + original: { id: '47022910', changedData: { progress: [18, 19], time_spent: [360, 420] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43550', slug: inu-to-neko-docchi-mo-katteru-to-mainichi-tanoshii, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43550/tiny.jpg?1600679941' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43550/small.jpg?1600679941' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43550/medium.jpg?1600679941' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43550/large.jpg?1600679941' }] }, titles: { alternatives: { }, canonical: 'Inu to Neko Docchi mo Katteru to Mainichi Tanoshii', localized: { en: 'With a Dog and a Cat, Every Day is Fun', en_jp: 'Inu to Neko Docchi mo Katteru to Mainichi Tanoshii', ja_jp: 犬と猫どっちも飼ってると毎日たのしい } } }, updatedAt: '2021-02-20T22:14:24Z' } +- + empty: false + title: 'Otona no Bouguya-san 2nd Season' + coverImg: images/anime/43569.webp + action: 'Watched episode 8' + kind: progressed + updated: '2021-02-20T17:05:29-05:00' + url: /anime/details/otona-no-bouguya-san-2nd-season + original: { id: '47022451', changedData: { progress: [7, 8] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43569', slug: otona-no-bouguya-san-2nd-season, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43569/tiny.jpg?1601057792' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43569/small.jpg?1601057792' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43569/medium.jpg?1601057792' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43569/large.jpg?1601057792' }] }, titles: { alternatives: { }, canonical: 'Otona no Bouguya-san 2nd Season', localized: { en: 'Armor Shop for Ladies & Gentlemen 2nd Season', en_jp: 'Otona no Bouguya-san 2nd Season', ja_jp: 'おとなの防具屋さん 第2シリーズ' } } }, updatedAt: '2021-02-20T22:05:29Z' } +- + empty: false + title: 'Kumo desu ga, Nani ka?' + coverImg: images/anime/41463.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-20T17:00:59-05:00' + url: /anime/details/kumo-desu-ga-nani-ka + original: { id: '47022229', changedData: { progress: [6, 7], time_spent: [4320, 5760] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '41463', slug: kumo-desu-ga-nani-ka, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/41463/tiny.jpg?1593607925' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/41463/small.jpg?1593607925' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/41463/medium.jpg?1593607925' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/41463/large.jpg?1593607925' }] }, titles: { alternatives: { }, canonical: 'Kumo desu ga, Nani ka?', localized: { en: 'So I''m a Spider, So What?', en_jp: 'Kumo desu ga, Nani ka?', ja_jp: 蜘蛛ですが、なにか? } } }, updatedAt: '2021-02-20T22:00:59Z' } +- + empty: false + title: '5-toubun no Hanayome ∬' + coverImg: images/anime/42324.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-20T16:32:29-05:00' + url: /anime/details/5-toubun-no-hanayome-2 + original: { id: '47020824', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42324', slug: 5-toubun-no-hanayome-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42324/tiny.jpg?1597697087' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42324/small.jpg?1597697087' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42324/medium.jpg?1597697087' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42324/large.jpg?1597697087' }] }, titles: { alternatives: ['Gotoubun no Hanayome 2', 'The Five Wedded Brides 2', '5-Toubun no Hanayome 2'], canonical: '5-toubun no Hanayome ∬', localized: { en: 'The Quintessential Quintuplets 2', en_jp: '5-toubun no Hanayome ∬', ja_jp: 五等分の花嫁∬ } } }, updatedAt: '2021-02-20T21:32:29Z' } +- + empty: false + title: 'Tenchi Souzou Design-bu' + coverImg: images/anime/43137.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-20T16:01:31-05:00' + url: /anime/details/tenchi-souzou-design-bu + original: { id: '47019073', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43137', slug: tenchi-souzou-design-bu, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43137/tiny.jpg?1611330634' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43137/small.jpg?1611330634' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43137/medium.jpg?1611330634' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43137/large.jpg?1611330634' }] }, titles: { alternatives: ['[Ten-De-Bu] What a strange animal!', Tendebu], canonical: 'Tenchi Souzou Design-bu', localized: { en: 'Heaven''s Design Team', en_jp: 'Tenchi Souzou Design-bu', ja_jp: 天地創造デザイン部 } } }, updatedAt: '2021-02-20T21:01:31Z' } +- + empty: false + title: 'Yuru Camp△ 2' + coverImg: images/anime/41976.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-20T15:27:54-05:00' + url: /anime/details/yuru-camp-2 + original: { id: '47017464', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '41976', slug: yuru-camp-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/41976/tiny.jpg?1611329947' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/41976/small.jpg?1611329947' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/41976/medium.jpg?1611329947' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/41976/large.jpg?1611329947' }] }, titles: { alternatives: { }, canonical: 'Yuru Camp△ 2', localized: { en: 'Laid-Back Camp 2', en_jp: 'Yuru Camp△ 2', ja_jp: 'ゆるキャン△ 2' } } }, updatedAt: '2021-02-20T20:27:54Z' } +- + empty: false + title: 'Hanyou no Yashahime: Sengoku Otogizoushi' + coverImg: images/anime/43180.webp + action: 'Watched episode 20' + kind: progressed + updated: '2021-02-20T14:47:33-05:00' + url: /anime/details/hanyou-no-yasha-hime + original: { id: '47015272', changedData: { progress: [19, 20], time_spent: [4320, 5760] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: 'InuYasha universe, mostly a different cast.' }, media: { __typename: Anime, id: '43180', slug: hanyou-no-yasha-hime, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43180/tiny.jpg?1589037137' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43180/small.jpg?1589037137' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43180/medium.jpg?1589037137' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43180/large.jpg?1589037137' }] }, titles: { alternatives: ['Inuyasha: Hanyou no Yasha Hime'], canonical: 'Hanyou no Yashahime: Sengoku Otogizoushi', localized: { en: 'Yashahime: Princess Half-Demon', en_jp: 'Hanyou no Yashahime: Sengoku Otogizoushi', ja_jp: 半妖の夜叉姫 } } }, updatedAt: '2021-02-20T19:47:33Z' } +- + empty: false + title: 'Jaku-chara Tomozaki-kun' + coverImg: images/anime/42621.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-20T14:23:07-05:00' + url: /anime/details/jaku-chara-tomozaki-kun + original: { id: '47013918', changedData: { progress: [6, 7], time_spent: [0, 1380] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '42621', slug: jaku-chara-tomozaki-kun, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42621/tiny.jpg?1611329334' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42621/small.jpg?1611329334' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42621/medium.jpg?1611329334' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42621/large.jpg?1611329334' }] }, titles: { alternatives: ['Bottom-tier Character Tomozaki', 'Jakusha Character Tomozaki-kun'], canonical: 'Jaku-chara Tomozaki-kun', localized: { en: 'The Low Tier Character "Tomozaki-kun"', en_jp: 'Jaku-chara Tomozaki-kun', ja_jp: 弱キャラ友崎くん } } }, updatedAt: '2021-02-20T19:23:07Z' } +- + empty: false + title: 'Hataraku Saibou Black (TV)' + coverImg: images/anime/43167.webp + action: 'Watched episode 9' + kind: progressed + updated: '2021-02-20T13:58:33-05:00' + url: /anime/details/hataraku-saibou-black-tv + original: { id: '47012582', changedData: { progress: [8, 9] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43167', slug: hataraku-saibou-black-tv, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43167/tiny.jpg?1611330065' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43167/small.jpg?1611330065' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43167/medium.jpg?1611330065' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43167/large.jpg?1611330065' }] }, titles: { alternatives: ['Cells at Work! Code Black'], canonical: 'Hataraku Saibou Black (TV)', localized: { en_jp: 'Hataraku Saibou Black (TV)', ja_jp: はたらく細胞BLACK } } }, updatedAt: '2021-02-20T18:58:33Z' } +- + empty: false + title: 'Yes! Precure 5' + coverImg: images/anime/1742.webp + action: 'Watched episode 22' + kind: progressed + updated: '2021-02-20T13:35:49-05:00' + url: /anime/details/yes-precure-5 + original: { id: '47011542', changedData: { progress: [21, 22], time_spent: [1920, 1944] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-20T18:35:49Z' } +- + empty: false + title: 'Hataraku Saibou!!' + coverImg: images/anime/42202.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-20T09:02:18-05:00' + url: /anime/details/hataraku-saibou-2 + original: { id: '46999511', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42202', slug: hataraku-saibou-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42202/tiny.jpg?1611329853' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42202/small.jpg?1611329853' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42202/medium.jpg?1611329853' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42202/large.jpg?1611329853' }] }, titles: { alternatives: ['Hataraku Saibou!!'], canonical: 'Hataraku Saibou!!', localized: { en: 'Cells at Work! 2', en_jp: 'Hataraku Saibou!!', ja_jp: はたらく細胞!! } } }, updatedAt: '2021-02-20T14:02:18Z' } +- + empty: false + title: 'Dr. Stone: Stone Wars' + coverImg: images/anime/42867.webp + action: 'Watched episode 6' + kind: progressed + updated: '2021-02-19T07:55:58-05:00' + url: /anime/details/dr-stone-two + original: { id: '46935503', changedData: { progress: [5, 6], time_spent: [120, 144] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '42867', slug: dr-stone-two, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42867/tiny.jpg?1611329475' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42867/small.jpg?1611329475' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42867/medium.jpg?1611329475' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42867/large.jpg?1611329475' }] }, titles: { alternatives: ['Dr. Stone 2nd Season', 'Dr. Stone Second Season'], canonical: 'Dr. Stone: Stone Wars', localized: { en_jp: 'Dr. Stone: Stone Wars', ja_jp: 'ドクターストーン STONE WARS' } } }, updatedAt: '2021-02-19T12:55:58Z' } +- + empty: false + title: 'Mahou no Tenshi Creamy Mami' + coverImg: images/anime/1843.webp + action: 'Watched episodes 12-13' + kind: null + updated: '2021-02-18T12:25:49-05:00' + url: /anime/details/mahou-no-tenshi-creamy-mami + original: [{ empty: false, title: 'Mahou no Tenshi Creamy Mami', coverImg: images/anime/1843.webp, action: 'Watched episode 13', kind: progressed, updated: '2021-02-18T12:25:49-05:00', url: /anime/details/mahou-no-tenshi-creamy-mami, original: { id: '46884733', changedData: { progress: [12, 13], time_spent: [17280, 18720] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '1843', slug: mahou-no-tenshi-creamy-mami, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096' }] }, titles: { alternatives: ['Incantevole Creamy', 'Creamy Mami', 'the Magic Angel'], canonical: 'Mahou no Tenshi Creamy Mami', localized: { en: 'Magical Angel Creamy Mami', en_jp: 'Mahou no Tenshi Creamy Mami', en_us: 'Magical Angel Creamy Mami', ja_jp: '魔法の天使 クリィミーマミ' } } }, updatedAt: '2021-02-18T17:25:49Z' } }, { empty: false, title: 'Mahou no Tenshi Creamy Mami', coverImg: images/anime/1843.webp, action: 'Watched episode 12', kind: progressed, updated: '2021-02-18T08:00:42-05:00', url: /anime/details/mahou-no-tenshi-creamy-mami, original: { id: '46872813', changedData: { progress: [11, 12], time_spent: [15840, 17280] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '1843', slug: mahou-no-tenshi-creamy-mami, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096' }] }, titles: { alternatives: ['Incantevole Creamy', 'Creamy Mami', 'the Magic Angel'], canonical: 'Mahou no Tenshi Creamy Mami', localized: { en: 'Magical Angel Creamy Mami', en_jp: 'Mahou no Tenshi Creamy Mami', en_us: 'Magical Angel Creamy Mami', ja_jp: '魔法の天使 クリィミーマミ' } } }, updatedAt: '2021-02-18T13:00:42Z' } }] +- + empty: false + title: 'Yes! Precure 5' + coverImg: images/anime/1742.webp + action: 'Watched episodes 20-21' + kind: null + updated: '2021-02-17T20:06:18-05:00' + url: /anime/details/yes-precure-5 + original: [{ empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 21', kind: progressed, updated: '2021-02-17T20:06:18-05:00', url: /anime/details/yes-precure-5, original: { id: '46846704', changedData: { progress: [20, 21], time_spent: [1896, 1920] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-18T01:06:18Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 20', kind: progressed, updated: '2021-02-17T19:37:32-05:00', url: /anime/details/yes-precure-5, original: { id: '46845383', changedData: { progress: [19, 20], time_spent: [1872, 1896] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-18T00:37:32Z' } }] +- + empty: false + title: 'Urasekai Picnic' + coverImg: images/anime/43042.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-17T19:03:44-05:00' + url: /anime/details/urasekai-picnic + original: { id: '46844029', changedData: { progress: [6, 7], time_spent: [0, 1380] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '43042', slug: urasekai-picnic, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43042/tiny.jpg?1597691180' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43042/small.jpg?1597691180' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43042/medium.jpg?1597691180' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43042/large.jpg?1597691180' }] }, titles: { alternatives: ['Ura Sekai Picnic'], canonical: 'Urasekai Picnic', localized: { en_jp: 'Urasekai Picnic', en_us: 'Otherside Picnic', ja_jp: 裏世界ピクニック } } }, updatedAt: '2021-02-18T00:03:44Z' } +- + empty: false + title: 'Re:Zero kara Hajimeru Isekai Seikatsu 2nd Season Part 2' + coverImg: images/anime/43247.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-17T13:08:52-05:00' + url: /anime/details/rezero-season-2-part-2 + original: { id: '46824973', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43247', slug: rezero-season-2-part-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43247/tiny.jpg?1607955457' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43247/small.jpg?1607955457' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43247/medium.jpg?1607955457' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43247/large.jpg?1607955457' }] }, titles: { alternatives: ['Re:Zero - Starting Life in Another World 2 Part 2', 'Re: Life in a different world from zero 2nd Season Part 2'], canonical: 'Re:Zero kara Hajimeru Isekai Seikatsu 2nd Season Part 2', localized: { en: 'Re:ZERO -Starting Life in Another World- Season 2 Part 2', en_jp: 'Re:Zero kara Hajimeru Isekai Seikatsu 2nd Season Part 2', ja_jp: ゼロから始める異世界生活 } } }, updatedAt: '2021-02-17T18:08:52Z' } +- + empty: false + title: 'World Witches Hasshin Shimasu!' + coverImg: images/anime/43428.webp + action: 'Watched episode 6' + kind: progressed + updated: '2021-02-17T12:31:50-05:00' + url: /anime/details/world-witches-hasshin-shimasu + original: { id: '46823096', changedData: { progress: [5, 6] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43428', slug: world-witches-hasshin-shimasu, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43428/tiny.jpg?1597691212' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43428/small.jpg?1597691212' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43428/medium.jpg?1597691212' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43428/large.jpg?1597691212' }] }, titles: { alternatives: { }, canonical: 'World Witches Hasshin Shimasu!', localized: { en: 'World Witches Take Off!', en_jp: 'World Witches Hasshin Shimasu!', ja_jp: ワールドウィッチーズ発進しますっ! } } }, updatedAt: '2021-02-17T17:31:50Z' } +- + empty: false + title: 'Black Clover' + coverImg: images/anime/13209.webp + action: 'Watched episode 164' + kind: progressed + updated: '2021-02-17T08:15:11-05:00' + url: /anime/details/black-clover-tv + original: { id: '46811062', changedData: { progress: [163, 164], time_spent: [233040, 234470] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13209', slug: black-clover-tv, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13209/tiny.jpg?1611504643' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13209/small.jpg?1611504643' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13209/medium.jpg?1611504643' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13209/large.jpg?1611504643' }] }, titles: { alternatives: { }, canonical: 'Black Clover', localized: { en: 'Black Clover', en_jp: 'Black Clover', ja_jp: ブラッククローバー } } }, updatedAt: '2021-02-17T13:15:11Z' } +- + empty: false + title: 'Tensei shitara Slime Datta Ken 2' + coverImg: images/anime/42196.webp + action: 'Watched episode 6' + kind: progressed + updated: '2021-02-17T07:49:21-05:00' + url: /anime/details/tensei-shitara-slime-datta-ken-2 + original: { id: '46809985', changedData: { progress: [5, 6] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '42196', slug: tensei-shitara-slime-datta-ken-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42196/tiny.jpg?1597691848' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42196/small.jpg?1597691848' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42196/medium.jpg?1597691848' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42196/large.jpg?1597691848' }] }, titles: { alternatives: ['TenSura 2', 'Tensei Shitara Slime Datta Ken 2nd Season Part 1'], canonical: 'Tensei shitara Slime Datta Ken 2', localized: { en: 'That Time I Got Reincarnated as a Slime 2', en_jp: 'Tensei shitara Slime Datta Ken 2', ja_jp: 転生したらスライムだった件2 } } }, updatedAt: '2021-02-17T12:49:21Z' } +- + empty: false + title: 'Mahou no Tenshi Creamy Mami' + coverImg: images/anime/1843.webp + action: 'Watched episode 11' + kind: progressed + updated: '2021-02-16T15:40:55-05:00' + url: /anime/details/mahou-no-tenshi-creamy-mami + original: { id: '46770266', changedData: { progress: [10, 11], time_spent: [14400, 15840] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '1843', slug: mahou-no-tenshi-creamy-mami, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096' }] }, titles: { alternatives: ['Incantevole Creamy', 'Creamy Mami', 'the Magic Angel'], canonical: 'Mahou no Tenshi Creamy Mami', localized: { en: 'Magical Angel Creamy Mami', en_jp: 'Mahou no Tenshi Creamy Mami', en_us: 'Magical Angel Creamy Mami', ja_jp: '魔法の天使 クリィミーマミ' } } }, updatedAt: '2021-02-16T20:40:55Z' } +- + empty: false + title: 'Shin Chuuka Ichiban! 2nd Season' + coverImg: images/anime/43825.webp + action: 'Watched episode 6' + kind: progressed + updated: '2021-02-16T12:28:40-05:00' + url: /anime/details/shin-chuuka-ichiban-2nd-season + original: { id: '46761075', changedData: { progress: [5, 6] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43825', slug: shin-chuuka-ichiban-2nd-season, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43825/tiny.jpg?1609082225' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43825/small.jpg?1609082225' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43825/medium.jpg?1609082225' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43825/large.jpg?1609082225' }] }, titles: { alternatives: ['New Cooking Master Boy!'], canonical: 'Shin Chuuka Ichiban! 2nd Season', localized: { en: 'True Cooking Master Boy Season 2', en_jp: 'Shin Chuuka Ichiban! 2nd Season', ja_jp: 真・中華一番! } } }, updatedAt: '2021-02-16T17:28:40Z' } +- + empty: false + title: 'Yes! Precure 5' + coverImg: images/anime/1742.webp + action: 'Watched episode 19' + kind: progressed + updated: '2021-02-15T17:49:37-05:00' + url: /anime/details/yes-precure-5 + original: { id: '46716267', changedData: { progress: [18, 19], time_spent: [1848, 1872] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-15T22:49:37Z' } +- + empty: false + title: 'Hataraku Saibou Black (TV)' + coverImg: images/anime/43167.webp + action: 'Watched episode 6' + kind: progressed + updated: '2021-01-30T11:09:51-05:00' + url: /anime/details/hataraku-saibou-black-tv + original: { id: '45746341', changedData: { progress: [5, 6] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43167', slug: hataraku-saibou-black-tv, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43167/tiny.jpg?1611330065' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43167/small.jpg?1611330065' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43167/medium.jpg?1611330065' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43167/large.jpg?1611330065' }] }, titles: { alternatives: ['Cells at Work! Code Black'], canonical: 'Hataraku Saibou Black (TV)', localized: { en_jp: 'Hataraku Saibou Black (TV)', ja_jp: はたらく細胞BLACK } } }, updatedAt: '2021-01-30T16:09:51Z' } +- + empty: false + title: 'Hataraku Saibou!!' + coverImg: images/anime/42202.webp + action: 'Watched episode 4' + kind: progressed + updated: '2021-01-30T10:40:47-05:00' + url: /anime/details/hataraku-saibou-2 + original: { id: '45745352', changedData: { progress: [3, 4] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42202', slug: hataraku-saibou-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42202/tiny.jpg?1611329853' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42202/small.jpg?1611329853' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42202/medium.jpg?1611329853' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42202/large.jpg?1611329853' }] }, titles: { alternatives: ['Hataraku Saibou!!'], canonical: 'Hataraku Saibou!!', localized: { en: 'Cells at Work! 2', en_jp: 'Hataraku Saibou!!', ja_jp: はたらく細胞!! } } }, updatedAt: '2021-01-30T15:40:47Z' } +- + empty: false + title: 'Yes! Precure 5' + coverImg: images/anime/1742.webp + action: 'Watched episode 9' + kind: progressed + updated: '2021-01-29T13:26:49-05:00' + url: /anime/details/yes-precure-5 + original: { id: '45691191', changedData: { progress: [8, 9], time_spent: [1608, 1632] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-29T18:26:49Z' } +- + empty: false + title: 'Mahou no Tenshi Creamy Mami' + coverImg: images/anime/1843.webp + action: 'Watched episodes 1-2' + kind: null + updated: '2021-01-28T12:57:44-05:00' + url: /anime/details/mahou-no-tenshi-creamy-mami + original: [{ empty: false, title: 'Mahou no Tenshi Creamy Mami', coverImg: images/anime/1843.webp, action: 'Watched episode 2', kind: progressed, updated: '2021-01-28T12:57:44-05:00', url: /anime/details/mahou-no-tenshi-creamy-mami, original: { id: '45636802', changedData: { progress: [1, 2], time_spent: [1440, 2880] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '1843', slug: mahou-no-tenshi-creamy-mami, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096' }] }, titles: { alternatives: ['Incantevole Creamy', 'Creamy Mami', 'the Magic Angel'], canonical: 'Mahou no Tenshi Creamy Mami', localized: { en: 'Magical Angel Creamy Mami', en_jp: 'Mahou no Tenshi Creamy Mami', en_us: 'Magical Angel Creamy Mami', ja_jp: '魔法の天使 クリィミーマミ' } } }, updatedAt: '2021-01-28T17:57:44Z' } }, { empty: false, title: 'Mahou no Tenshi Creamy Mami', coverImg: images/anime/1843.webp, action: 'Watched episode 1', kind: progressed, updated: '2021-01-28T08:19:49-05:00', url: /anime/details/mahou-no-tenshi-creamy-mami, original: { id: '45626831', changedData: { progress: [0, 1], time_spent: [0, 1440] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '1843', slug: mahou-no-tenshi-creamy-mami, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096' }] }, titles: { alternatives: ['Incantevole Creamy', 'Creamy Mami', 'the Magic Angel'], canonical: 'Mahou no Tenshi Creamy Mami', localized: { en: 'Magical Angel Creamy Mami', en_jp: 'Mahou no Tenshi Creamy Mami', en_us: 'Magical Angel Creamy Mami', ja_jp: '魔法の天使 クリィミーマミ' } } }, updatedAt: '2021-01-28T13:19:49Z' } }] +- + empty: false + title: 'Urasekai Picnic' + coverImg: images/anime/43042.webp + action: 'Watched episode 4' + kind: progressed + updated: '2021-01-28T07:49:24-05:00' + url: /anime/details/urasekai-picnic + original: { id: '45625945', changedData: { progress: [3, 4] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '43042', slug: urasekai-picnic, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43042/tiny.jpg?1597691180' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43042/small.jpg?1597691180' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43042/medium.jpg?1597691180' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43042/large.jpg?1597691180' }] }, titles: { alternatives: ['Ura Sekai Picnic'], canonical: 'Urasekai Picnic', localized: { en_jp: 'Urasekai Picnic', en_us: 'Otherside Picnic', ja_jp: 裏世界ピクニック } } }, updatedAt: '2021-01-28T12:49:24Z' } +- + empty: false + title: 'Tensei shitara Slime Datta Ken 2' + coverImg: images/anime/42196.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-27T13:06:29-05:00' + url: /anime/details/tensei-shitara-slime-datta-ken-2 + original: { id: '45585487', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '42196', slug: tensei-shitara-slime-datta-ken-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42196/tiny.jpg?1597691848' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42196/small.jpg?1597691848' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42196/medium.jpg?1597691848' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42196/large.jpg?1597691848' }] }, titles: { alternatives: ['TenSura 2', 'Tensei Shitara Slime Datta Ken 2nd Season Part 1'], canonical: 'Tensei shitara Slime Datta Ken 2', localized: { en: 'That Time I Got Reincarnated as a Slime 2', en_jp: 'Tensei shitara Slime Datta Ken 2', ja_jp: 転生したらスライムだった件2 } } }, updatedAt: '2021-01-27T18:06:29Z' } +- + empty: false + title: 'Yes! Precure 5' + coverImg: images/anime/1742.webp + action: 'Watched episode 8' + kind: progressed + updated: '2021-01-27T07:54:31-05:00' + url: /anime/details/yes-precure-5 + original: { id: '45572019', changedData: { progress: [7, 8], time_spent: [1584, 1608] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-27T12:54:31Z' } +- + empty: false + title: 'Black Clover' + coverImg: images/anime/13209.webp + action: 'Watched episode 161' + kind: progressed + updated: '2021-01-27T07:24:48-05:00' + url: /anime/details/black-clover-tv + original: { id: '45571028', changedData: { progress: [160, 161], time_spent: [228750, 230180] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13209', slug: black-clover-tv, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13209/tiny.jpg?1611504643' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13209/small.jpg?1611504643' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13209/medium.jpg?1611504643' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13209/large.jpg?1611504643' }] }, titles: { alternatives: { }, canonical: 'Black Clover', localized: { en: 'Black Clover', en_jp: 'Black Clover', ja_jp: ブラッククローバー } } }, updatedAt: '2021-01-27T12:24:48Z' } +- + empty: false + title: 'World Witches Hasshin Shimasu!' + coverImg: images/anime/43428.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-26T13:01:38-05:00' + url: /anime/details/world-witches-hasshin-shimasu + original: { id: '45529665', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43428', slug: world-witches-hasshin-shimasu, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43428/tiny.jpg?1597691212' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43428/small.jpg?1597691212' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43428/medium.jpg?1597691212' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43428/large.jpg?1597691212' }] }, titles: { alternatives: { }, canonical: 'World Witches Hasshin Shimasu!', localized: { en: 'World Witches Take Off!', en_jp: 'World Witches Hasshin Shimasu!', ja_jp: ワールドウィッチーズ発進しますっ! } } }, updatedAt: '2021-01-26T18:01:38Z' } +- + empty: false + title: 'Shin Chuuka Ichiban! 2nd Season' + coverImg: images/anime/43825.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-26T12:49:04-05:00' + url: /anime/details/shin-chuuka-ichiban-2nd-season + original: { id: '45529168', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43825', slug: shin-chuuka-ichiban-2nd-season, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43825/tiny.jpg?1609082225' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43825/small.jpg?1609082225' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43825/medium.jpg?1609082225' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43825/large.jpg?1609082225' }] }, titles: { alternatives: ['New Cooking Master Boy!'], canonical: 'Shin Chuuka Ichiban! 2nd Season', localized: { en: 'True Cooking Master Boy Season 2', en_jp: 'Shin Chuuka Ichiban! 2nd Season', ja_jp: 真・中華一番! } } }, updatedAt: '2021-01-26T17:49:04Z' } +- + empty: false + title: 'Tatoeba Last Dungeon Mae no Mura no Shounen ga Joban no Machi de Kurasu Youna Monogatari' + coverImg: images/anime/42635.webp + action: 'Watched episode 4' + kind: progressed + updated: '2021-01-25T12:56:13-05:00' + url: /anime/details/tatoeba-last-dungeon-mae-no-mura-no-shounen-ga-joban-no-machi-de-kurasu-youna-monogatari + original: { id: '45471756', changedData: { progress: [3, 4] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42635', slug: tatoeba-last-dungeon-mae-no-mura-no-shounen-ga-joban-no-machi-de-kurasu-youna-monogatari, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42635/tiny.jpg?1571504181' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42635/small.jpg?1571504181' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42635/medium.jpg?1571504181' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42635/large.jpg?1571504181' }] }, titles: { alternatives: ['Suppose a Kid from the Last Dungeon Boonies Moved to a Starter Town'], canonical: 'Tatoeba Last Dungeon Mae no Mura no Shounen ga Joban no Machi de Kurasu Youna Monogatari', localized: { en_jp: 'Tatoeba Last Dungeon Mae no Mura no Shounen ga Joban no Machi de Kurasu Youna Monogatari', ja_jp: たとえばラストダンジョン前の村の少年が序盤の街で暮らすような物語 } } }, updatedAt: '2021-01-25T17:56:13Z' } +- + empty: false + title: 'Healin'' Good♡Precure' + coverImg: images/anime/42650.webp + action: 'Watched episode 41' + kind: progressed + updated: '2021-01-25T12:29:55-05:00' + url: /anime/details/healin-good-precure + original: { id: '45470609', changedData: { progress: [40, 41], time_spent: [57600, 59040] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42650', slug: healin-good-precure, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42650/tiny.jpg?1578070083' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42650/small.jpg?1578070083' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42650/medium.jpg?1578070083' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42650/large.jpg?1578070083' }] }, titles: { alternatives: { }, canonical: 'Healin'' Good♡Precure', localized: { en: 'Healin'' Good Pretty Cure', en_jp: 'Healin'' Good♡Precure', ja_jp: ヒーリングっど♡プリキュア } } }, updatedAt: '2021-01-25T17:29:55Z' } +- + empty: false + title: 'Kai Byoui Ramune' + coverImg: images/anime/43818.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-25T12:05:16-05:00' + url: /anime/details/kai-byoui-ramune + original: { id: '45469463', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '43818', slug: kai-byoui-ramune, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43818/tiny.jpg?1608544506' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43818/small.jpg?1608544506' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43818/medium.jpg?1608544506' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43818/large.jpg?1608544506' }] }, titles: { alternatives: { }, canonical: 'Kai Byoui Ramune', localized: { en: 'Dr. Ramune -Mysterious Disease Specialist-', en_jp: 'Kai Byoui Ramune', ja_jp: 怪病医ラムネ } } }, updatedAt: '2021-01-25T17:05:16Z' } +- + empty: false + title: 'Yes! Precure 5' + coverImg: images/anime/1742.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-01-24T20:16:10-05:00' + url: /anime/details/yes-precure-5 + original: { id: '45433091', changedData: { progress: [6, 7], time_spent: [1560, 1584] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-25T01:16:10Z' } +- + empty: false + title: 'Mushoku Tensei: Isekai Ittara Honki Dasu' + coverImg: images/anime/42323.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-24T19:52:32-05:00' + url: /anime/details/mushoku-tensei-isekai-ittara-honki-dasu + original: { id: '45431671', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: 'The pervert aspect of this dampens my enjoyment. ' }, media: { __typename: Anime, id: '42323', slug: mushoku-tensei-isekai-ittara-honki-dasu, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42323/tiny.jpg?1571408000' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42323/small.jpg?1571408000' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42323/medium.jpg?1571408000' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42323/large.jpg?1571408000' }] }, titles: { alternatives: { }, canonical: 'Mushoku Tensei: Isekai Ittara Honki Dasu', localized: { en: 'Mushoku Tensei: Jobless Reincarnation', en_jp: 'Mushoku Tensei: Isekai Ittara Honki Dasu', ja_jp: '無職転生 ~異世界行ったら本気だす~' } } }, updatedAt: '2021-01-25T00:52:32Z' } +- + empty: false + title: Horimiya + coverImg: images/anime/43545.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-24T19:26:33-05:00' + url: /anime/details/horimiya + original: { id: '45430382', changedData: { progress: [2, 3], time_spent: [0, 1380] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43545', slug: horimiya, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43545/tiny.jpg?1609224996' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43545/small.jpg?1609224996' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43545/medium.jpg?1609224996' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43545/large.jpg?1609224996' }] }, titles: { alternatives: { }, canonical: Horimiya, localized: { en_jp: Horimiya, ja_jp: ホリミヤ } } }, updatedAt: '2021-01-25T00:26:33Z' } +- + empty: false + title: 'Yes! Precure 5' + coverImg: images/anime/1742.webp + action: 'Marathoned episodes 1-6' + kind: null + updated: '2021-01-23T19:18:29-05:00' + url: /anime/details/yes-precure-5 + original: [{ empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 6', kind: progressed, updated: '2021-01-23T19:18:29-05:00', url: /anime/details/yes-precure-5, original: { id: '45370466', changedData: { progress: [5, 6], time_spent: [1536, 1560] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-24T00:18:29Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 5', kind: progressed, updated: '2021-01-23T18:53:47-05:00', url: /anime/details/yes-precure-5, original: { id: '45369278', changedData: { progress: [4, 5], time_spent: [1512, 1536] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T23:53:47Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 4', kind: progressed, updated: '2021-01-23T18:29:37-05:00', url: /anime/details/yes-precure-5, original: { id: '45368222', changedData: { progress: [3, 4], time_spent: [1488, 1512] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T23:29:37Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 3', kind: progressed, updated: '2021-01-23T17:48:17-05:00', url: /anime/details/yes-precure-5, original: { id: '45366144', changedData: { progress: [2, 3], time_spent: [1464, 1488] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T22:48:17Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 2', kind: progressed, updated: '2021-01-23T17:25:36-05:00', url: /anime/details/yes-precure-5, original: { id: '45364651', changedData: { progress: [1, 2], time_spent: [1440, 1464] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T22:25:36Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 1', kind: progressed, updated: '2021-01-23T16:56:50-05:00', url: /anime/details/yes-precure-5, original: { id: '45363270', changedData: { progress: [0, 1], time_spent: [0, 1440] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T21:56:50Z' } }] +- + empty: false + title: 'Yes! Precure 5' + coverImg: images/anime/1742.webp + action: 'Currently Watching' + kind: updated + updated: '2021-01-23T16:32:39-05:00' + url: /anime/details/yes-precure-5 + original: { id: '45361701', changedData: { status: [planned] }, kind: UPDATED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T21:32:39Z' } +- + empty: false + title: 'Futari wa Precure: Splash☆Star' + coverImg: images/anime/1375.webp + action: Completed + kind: updated + updated: '2021-01-23T16:20:56-05:00' + url: /anime/details/futari-wa-precure-splash-star + original: { id: '45361017', changedData: { status: [current] }, kind: UPDATED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T21:20:56Z' } +- + empty: false + title: 'Futari wa Precure: Splash☆Star' + coverImg: images/anime/1375.webp + action: 'Marathoned episodes 45-49' + kind: null + updated: '2021-01-23T16:20:56-05:00' + url: /anime/details/futari-wa-precure-splash-star + original: [{ empty: false, title: 'Futari wa Precure: Splash☆Star', coverImg: images/anime/1375.webp, action: 'Watched episode 49', kind: progressed, updated: '2021-01-23T16:20:56-05:00', url: /anime/details/futari-wa-precure-splash-star, original: { id: '45361016', changedData: { progress: [48, 49], time_spent: [2568, 2592] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T21:20:56Z' } }, { empty: false, title: 'Futari wa Precure: Splash☆Star', coverImg: images/anime/1375.webp, action: 'Watched episode 48', kind: progressed, updated: '2021-01-23T16:00:16-05:00', url: /anime/details/futari-wa-precure-splash-star, original: { id: '45359950', changedData: { progress: [47, 48], time_spent: [2544, 2568] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T21:00:16Z' } }, { empty: false, title: 'Futari wa Precure: Splash☆Star', coverImg: images/anime/1375.webp, action: 'Watched episode 47', kind: progressed, updated: '2021-01-23T15:35:56-05:00', url: /anime/details/futari-wa-precure-splash-star, original: { id: '45358544', changedData: { progress: [46, 47], time_spent: [2520, 2544] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T20:35:56Z' } }, { empty: false, title: 'Futari wa Precure: Splash☆Star', coverImg: images/anime/1375.webp, action: 'Watched episode 46', kind: progressed, updated: '2021-01-23T13:36:34-05:00', url: /anime/details/futari-wa-precure-splash-star, original: { id: '45352462', changedData: { progress: [45, 46], time_spent: [2496, 2520] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T18:36:34Z' } }, { empty: false, title: 'Futari wa Precure: Splash☆Star', coverImg: images/anime/1375.webp, action: 'Watched episode 45', kind: progressed, updated: '2021-01-23T13:10:06-05:00', url: /anime/details/futari-wa-precure-splash-star, original: { id: '45351234', changedData: { progress: [44, 45], time_spent: [2472, 2496] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T18:10:06Z' } }] +- + empty: false + title: 'Hanyou no Yashahime: Sengoku Otogizoushi' + coverImg: images/anime/43180.webp + action: 'Watched episode 16' + kind: progressed + updated: '2021-01-23T12:40:53-05:00' + url: /anime/details/hanyou-no-yasha-hime + original: { id: '45350120', changedData: { progress: [15, 16] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: 'InuYasha universe, mostly a different cast.' }, media: { __typename: Anime, id: '43180', slug: hanyou-no-yasha-hime, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43180/tiny.jpg?1589037137' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43180/small.jpg?1589037137' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43180/medium.jpg?1589037137' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43180/large.jpg?1589037137' }] }, titles: { alternatives: ['Inuyasha: Hanyou no Yasha Hime'], canonical: 'Hanyou no Yashahime: Sengoku Otogizoushi', localized: { en: 'Yashahime: Princess Half-Demon', en_jp: 'Hanyou no Yashahime: Sengoku Otogizoushi', ja_jp: 半妖の夜叉姫 } } }, updatedAt: '2021-01-23T17:40:53Z' } +- + empty: false + title: 'Ore dake Haireru Kakushi Dungeon' + coverImg: images/anime/43301.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-23T12:07:59-05:00' + url: /anime/details/ore-dake-haireru-kakushi-dungeon + original: { id: '45348842', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43301', slug: ore-dake-haireru-kakushi-dungeon, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43301/tiny.jpg?1607696005' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43301/small.jpg?1607696005' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43301/medium.jpg?1607696005' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43301/large.jpg?1607696005' }] }, titles: { alternatives: ['Special training in the Secret Dungeon', 'Ore Dake Haireru Kakushi Dungeon: Kossori Kitaete Sekai Saikyou'], canonical: 'Ore dake Haireru Kakushi Dungeon', localized: { en: 'The Hidden Dungeon Only I Can Enter', en_jp: 'Ore dake Haireru Kakushi Dungeon', ja_jp: 俺だけ入れる隠しダンジョン } } }, updatedAt: '2021-01-23T17:07:59Z' } +- + empty: false + title: 'Otona no Bouguya-san 2nd Season' + coverImg: images/anime/43569.webp + action: 'Watched episode 4' + kind: progressed + updated: '2021-01-23T11:36:34-05:00' + url: /anime/details/otona-no-bouguya-san-2nd-season + original: { id: '45347598', changedData: { progress: [3, 4] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43569', slug: otona-no-bouguya-san-2nd-season, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43569/tiny.jpg?1601057792' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43569/small.jpg?1601057792' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43569/medium.jpg?1601057792' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43569/large.jpg?1601057792' }] }, titles: { alternatives: { }, canonical: 'Otona no Bouguya-san 2nd Season', localized: { en: 'Armor Shop for Ladies & Gentlemen 2nd Season', en_jp: 'Otona no Bouguya-san 2nd Season', ja_jp: 'おとなの防具屋さん 第2シリーズ' } } }, updatedAt: '2021-01-23T16:36:34Z' } +- + empty: false + title: 'Inu to Neko Docchi mo Katteru to Mainichi Tanoshii' + coverImg: images/anime/43550.webp + action: 'Watched episode 15' + kind: progressed + updated: '2021-01-23T11:36:07-05:00' + url: /anime/details/inu-to-neko-docchi-mo-katteru-to-mainichi-tanoshii + original: { id: '45347581', changedData: { progress: [14, 15], time_spent: [120, 180] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43550', slug: inu-to-neko-docchi-mo-katteru-to-mainichi-tanoshii, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43550/tiny.jpg?1600679941' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43550/small.jpg?1600679941' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43550/medium.jpg?1600679941' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43550/large.jpg?1600679941' }] }, titles: { alternatives: { }, canonical: 'Inu to Neko Docchi mo Katteru to Mainichi Tanoshii', localized: { en: 'With a Dog and a Cat, Every Day is Fun', en_jp: 'Inu to Neko Docchi mo Katteru to Mainichi Tanoshii', ja_jp: 犬と猫どっちも飼ってると毎日たのしい } } }, updatedAt: '2021-01-23T16:36:07Z' } +- + empty: false + title: 'Kumo desu ga, Nani ka?' + coverImg: images/anime/41463.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-23T11:18:43-05:00' + url: /anime/details/kumo-desu-ga-nani-ka + original: { id: '45346956', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '41463', slug: kumo-desu-ga-nani-ka, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/41463/tiny.jpg?1593607925' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/41463/small.jpg?1593607925' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/41463/medium.jpg?1593607925' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/41463/large.jpg?1593607925' }] }, titles: { alternatives: { }, canonical: 'Kumo desu ga, Nani ka?', localized: { en: 'So I''m a Spider, So What?', en_jp: 'Kumo desu ga, Nani ka?', ja_jp: 蜘蛛ですが、なにか? } } }, updatedAt: '2021-01-23T16:18:43Z' } +- + empty: false + title: '5-toubun no Hanayome ∬' + coverImg: images/anime/42324.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-23T10:57:01-05:00' + url: /anime/details/5-toubun-no-hanayome-2 + original: { id: '45346222', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42324', slug: 5-toubun-no-hanayome-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42324/tiny.jpg?1597697087' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42324/small.jpg?1597697087' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42324/medium.jpg?1597697087' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42324/large.jpg?1597697087' }] }, titles: { alternatives: ['Gotoubun no Hanayome 2', 'The Five Wedded Brides 2', '5-Toubun no Hanayome 2'], canonical: '5-toubun no Hanayome ∬', localized: { en: 'The Quintessential Quintuplets 2', en_jp: '5-toubun no Hanayome ∬', ja_jp: 五等分の花嫁∬ } } }, updatedAt: '2021-01-23T15:57:01Z' } +- + empty: false + title: 'Tenchi Souzou Design-bu' + coverImg: images/anime/43137.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-23T09:28:05-05:00' + url: /anime/details/tenchi-souzou-design-bu + original: { id: '45343004', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43137', slug: tenchi-souzou-design-bu, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43137/tiny.jpg?1611330634' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43137/small.jpg?1611330634' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43137/medium.jpg?1611330634' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43137/large.jpg?1611330634' }] }, titles: { alternatives: ['[Ten-De-Bu] What a strange animal!', Tendebu], canonical: 'Tenchi Souzou Design-bu', localized: { en: 'Heaven''s Design Team', en_jp: 'Tenchi Souzou Design-bu', ja_jp: 天地創造デザイン部 } } }, updatedAt: '2021-01-23T14:28:05Z' } +- + empty: false + title: 'Yuru Camp△ 2' + coverImg: images/anime/41976.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-23T09:04:48-05:00' + url: /anime/details/yuru-camp-2 + original: { id: '45342210', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '41976', slug: yuru-camp-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/41976/tiny.jpg?1611329947' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/41976/small.jpg?1611329947' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/41976/medium.jpg?1611329947' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/41976/large.jpg?1611329947' }] }, titles: { alternatives: { }, canonical: 'Yuru Camp△ 2', localized: { en: 'Laid-Back Camp 2', en_jp: 'Yuru Camp△ 2', ja_jp: 'ゆるキャン△ 2' } } }, updatedAt: '2021-01-23T14:04:48Z' } +- + empty: false + title: 'Dr. Stone: Stone Wars' + coverImg: images/anime/42867.webp + action: 'Watched episode 2' + kind: progressed + updated: '2021-01-23T08:27:39-05:00' + url: /anime/details/dr-stone-two + original: { id: '45341107', changedData: { progress: [1, 2], time_spent: [24, 48] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '42867', slug: dr-stone-two, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42867/tiny.jpg?1611329475' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42867/small.jpg?1611329475' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42867/medium.jpg?1611329475' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42867/large.jpg?1611329475' }] }, titles: { alternatives: ['Dr. Stone 2nd Season', 'Dr. Stone Second Season'], canonical: 'Dr. Stone: Stone Wars', localized: { en_jp: 'Dr. Stone: Stone Wars', ja_jp: 'ドクターストーン STONE WARS' } } }, updatedAt: '2021-01-23T13:27:39Z' } +- + empty: false + title: 'Gakuen Babysitters' + coverImg: images/anime/13265.webp + action: 'Watched episode 7' + kind: progressed + updated: '2018-02-24T10:05:35-05:00' + url: /anime/details/gakuen-babysitters + original: { id: '5096548', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13265', slug: gakuen-babysitters, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13265/tiny.jpg?1597692098' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13265/small.jpg?1597692098' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13265/medium.jpg?1597692098' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13265/large.jpg?1597692098' }] }, titles: { alternatives: { }, canonical: 'Gakuen Babysitters', localized: { en: 'School Babysitters', en_jp: 'Gakuen Babysitters', en_us: 'School Babysitters', ja_jp: 学園ベビーシッターズ } } }, updatedAt: '2018-02-24T15:05:35Z' } +- + empty: false + title: 'Ryuuou no Oshigoto!' + coverImg: images/anime/13661.webp + action: 'Watched episode 7' + kind: progressed + updated: '2018-02-24T10:31:29-05:00' + url: /anime/details/ryuuou-no-oshigoto + original: { id: '5096816', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13661', slug: ryuuou-no-oshigoto, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13661/tiny.jpg?1597698518' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13661/small.jpg?1597698518' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13661/medium.jpg?1597698518' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13661/large.jpg?1597698518' }] }, titles: { alternatives: ['Ryuoh no Oshigoto'], canonical: 'Ryuuou no Oshigoto!', localized: { en: 'The Ryuo’s Work is Never Done!', en_jp: 'Ryuuou no Oshigoto!', en_us: 'The Ryuo''s Work is Never Done!', ja_jp: りゅうおうのおしごと! } } }, updatedAt: '2018-02-24T15:31:29Z' } +- + empty: false + title: 'Karakai Jouzu no Takagi-san' + coverImg: images/anime/13635.webp + action: 'Watched episode 7' + kind: progressed + updated: '2018-02-24T10:54:16-05:00' + url: /anime/details/karakai-jouzu-no-takagi-san + original: { id: '5096938', changedData: { progress: [6, 7], time_spent: [384, 408] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13635', slug: karakai-jouzu-no-takagi-san, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13635/tiny.jpg?1597691135' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13635/small.jpg?1597691135' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13635/medium.jpg?1597691135' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13635/large.jpg?1597691135' }] }, titles: { alternatives: ['Skilled Teaser Takagi-san'], canonical: 'Karakai Jouzu no Takagi-san', localized: { en: 'Teasing Master Takagi-san', en_jp: 'Karakai Jouzu no Takagi-san', ja_jp: からかい上手の高木さん } } }, updatedAt: '2018-02-24T15:54:16Z' } +- + empty: false + title: 'Kaijuu Girls: Ultra Kaijuu Gijinka Keikaku 2nd Season' + coverImg: images/anime/14152.webp + action: 'Watched episode 7' + kind: progressed + updated: '2018-02-24T10:56:09-05:00' + url: /anime/details/kaijuu-girls-ultra-kaijuu-gijinka-keikaku-2nd-season + original: { id: '5096963', changedData: { progress: [6, 7], time_spent: [35, 40] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '14152', slug: kaijuu-girls-ultra-kaijuu-gijinka-keikaku-2nd-season, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/14152/tiny.jpg?1597691494' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/14152/small.jpg?1597691494' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/14152/medium.jpg?1597691494' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/14152/large.jpg?1597691494' }] }, titles: { alternatives: { }, canonical: 'Kaijuu Girls: Ultra Kaijuu Gijinka Keikaku 2nd Season', localized: { en_jp: 'Kaijuu Girls: Ultra Kaijuu Gijinka Keikaku 2nd Season', ja_jp: '怪獣娘~ウルトラ怪獣擬人化計画~ 第2期' } } }, updatedAt: '2018-02-24T15:56:09Z' } +- + empty: false + title: 'Black Clover' + coverImg: images/anime/13209.webp + action: 'Watched episode 20' + kind: progressed + updated: '2018-02-24T11:36:16-05:00' + url: /anime/details/black-clover-tv + original: { id: '5097284', changedData: { progress: [19, 20], time_spent: [1344, 1368] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13209', slug: black-clover-tv, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13209/tiny.jpg?1611504643' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13209/small.jpg?1611504643' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13209/medium.jpg?1611504643' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13209/large.jpg?1611504643' }] }, titles: { alternatives: { }, canonical: 'Black Clover', localized: { en: 'Black Clover', en_jp: 'Black Clover', ja_jp: ブラッククローバー } } }, updatedAt: '2018-02-24T16:36:16Z' } +- + empty: false + title: 'A Place Further Than the Universe' + coverImg: images/anime/13615.webp + action: 'Watched episode 8' + kind: progressed + updated: '2018-02-24T12:02:06-05:00' + url: /anime/details/a-place-further-than-the-universe + original: { id: '5097527', changedData: { progress: [7, 8] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13615', slug: a-place-further-than-the-universe, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13615/tiny.jpg?1597696818' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13615/small.jpg?1597696818' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13615/medium.jpg?1597696818' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13615/large.jpg?1597696818' }] }, titles: { alternatives: ['Uchuu yori mo Tooi Basho', 'A Story That Leads to the Antarctica', 'Sora Yorimo Tōi Basho', Yorimoi], canonical: 'A Place Further Than the Universe', localized: { en: 'A Place Further Than the Universe', en_jp: 'Sora yori mo Tooi Basho', en_us: 'A Place Further Than The Universe', ja_jp: 宇宙よりも遠い場所 } } }, updatedAt: '2018-02-24T17:02:06Z' } +- + empty: false + title: 'Overlord II' + coverImg: images/anime/13237.webp + action: 'Watched episode 7' + kind: progressed + updated: '2018-02-24T12:38:38-05:00' + url: /anime/details/overlord-ii + original: { id: '5097839', changedData: { progress: [6, 7], time_spent: [432, 456] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13237', slug: overlord-ii, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13237/tiny.jpg?1597694945' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13237/small.jpg?1597694945' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13237/medium.jpg?1597694945' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13237/large.jpg?1597694945' }] }, titles: { alternatives: { }, canonical: 'Overlord II', localized: { en_jp: 'Overlord II', en_us: 'Overlord II', ja_jp: オーバーロードⅡ } } }, updatedAt: '2018-02-24T17:38:38Z' } +- + empty: false + title: 'Hitori no Shita: The Outcast 2nd Season' + coverImg: images/anime/13885.webp + action: 'Watched episode 6' + kind: progressed + updated: '2018-02-24T13:10:32-05:00' + url: /anime/details/hitori-no-shita-the-outcast-2nd-season + original: { id: '5098167', changedData: { progress: [5, 6], time_spent: [96, 120] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13885', slug: hitori-no-shita-the-outcast-2nd-season, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13885/tiny.jpg?1517377133' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13885/small.jpg?1517377133' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13885/medium.jpg?1517377133' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13885/large.jpg?1517377133' }] }, titles: { alternatives: ['hitorinoshita - The Outcast'], canonical: 'Hitori no Shita: The Outcast 2nd Season', localized: { en: 'Hitori no Shita - The Outcast 2', en_jp: 'Hitori no Shita: The Outcast 2nd Season', en_us: 'Hitori no Shita - The Outcast 2', ja_jp: '一人之下 THE OUTCAST 2ndシーズン' } } }, updatedAt: '2018-02-24T18:10:32Z' } +- + empty: false + title: 'Ramen Daisuki Koizumi-san' + coverImg: images/anime/13531.webp + action: 'Watched episode 8' + kind: progressed + updated: '2018-02-24T13:32:09-05:00' + url: /anime/details/ramen-daisuki-koizumi-san + original: { id: '5098364', changedData: { progress: [7, 8] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13531', slug: ramen-daisuki-koizumi-san, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13531/tiny.jpg?1597698994' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13531/small.jpg?1597698994' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13531/medium.jpg?1597698994' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13531/large.jpg?1597698994' }] }, titles: { alternatives: { }, canonical: 'Ramen Daisuki Koizumi-san', localized: { en: 'Ms. Koizumi Loves Ramen Noodles', en_jp: 'Ramen Daisuki Koizumi-san', en_us: 'Ms. Koizumi Loves Ramen Noodles', ja_jp: ラーメン大好き小泉さん } } }, updatedAt: '2018-02-24T18:32:09Z' } diff --git a/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/CharacterTransformerTest__testTransform__1.yml b/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/CharacterTransformerTest__testTransform__1.yml new file mode 100644 index 00000000..8e614ddb --- /dev/null +++ b/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/CharacterTransformerTest__testTransform__1.yml @@ -0,0 +1,14 @@ +empty: false +castings: + 'Voice Actor': { Japanese: { 'Ayako Kawasumi': { person: { id: '468', slug: ayako-kawasumi, image: 'https://media.kitsu.io/people/images/468/original.jpg?1416260918', name: 'Ayako Kawasumi' }, series: { 5992: { id: '5992', slug: carnival-phantasm, title: 'Carnival Phantasm', titles: [カーニバル・ファンタズム], posterImage: 'https://media.kitsu.io/anime/poster_images/5992/small.jpg?1597697878' }, 6685: { id: '6685', slug: carnival-phantasm-ex-season, title: 'Carnival Phantasm EX Season', titles: ['カーニバル・ファンタズム EX Season'], posterImage: 'https://media.kitsu.io/anime/poster_images/6685/small.jpg?1597697725' }, 7342: { id: '7342', slug: carnival-phantasm-hibichika-special, title: 'Carnival Phantasm: HibiChika Special', titles: ['カーニバル・ファンタズム ひびちかスペシャル'], posterImage: 'https://media.kitsu.io/anime/poster_images/7342/small.jpg?1408461040' }, 6695: { id: '6695', slug: carnival-phantasm-illya-s-castle, title: 'Carnival Phantasm: Illya-jou', titles: ['カーニバル・ファンタズム: イリヤ城'], posterImage: 'https://media.kitsu.io/anime/poster_images/6695/small.jpg?1597698397' }, 14154: { id: '14154', slug: emiya-san-chi-no-kyou-no-gohan, title: 'Emiya-san Chi no Kyou no Gohan', titles: ['Today''s Menu for the Emiya Family', 衛宮さんちの今日のごはん], posterImage: 'https://media.kitsu.io/anime/poster_images/14154/small.jpg?1597697373' }, 13066: { id: '13066', slug: fate-apocrypha, title: Fate/Apocrypha, titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/13066/small.jpg?1597698308' }, 12710: { id: '12710', slug: fate-grand-order-first-order, title: 'Fate/Grand Order: First Order', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/12710/small.jpg?1597698686' }, 6028: { id: '6028', slug: fate-zero, title: Fate/Zero, titles: [フェイト/ゼロ], posterImage: 'https://media.kitsu.io/anime/poster_images/6028/small.jpg?1597698769' }, 7658: { id: '7658', slug: fate-zero-2nd-season, title: 'Fate/Zero 2nd Season', titles: ['Fate/Zero Season 2', 'フェイト/ゼロ 2ndシーズン'], posterImage: 'https://media.kitsu.io/anime/poster_images/7658/small.jpg?1597698796' }, 6906: { id: '6906', slug: fate-zero-remix, title: 'Fate/Zero Remix', titles: ['フェイト/ゼロ Remix'], posterImage: 'https://media.kitsu.io/anime/poster_images/6906/small.jpg?1597698293' }, 7173: { id: '7173', slug: fate-kaleid-liner-prisma-illya, title: 'Fate/kaleid liner Prisma☆Illya', titles: ['Fate/kaleid liner プリズマ☆イリヤ'], posterImage: 'https://media.kitsu.io/anime/poster_images/7173/small.jpg?1597695114' }, 323: { id: '323', slug: fate-stay-night, title: 'Fate/stay night', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/323/small.jpg?1597698066' }, 4788: { id: '4788', slug: fate-stay-night-unlimited-blade-works, title: 'Fate/stay night Movie: Unlimited Blade Works', titles: ['Fate/stay night - Unlimited Blade Works', '劇場版 Fate/stay night: UNLIMITED BLADE WORKS'], posterImage: 'https://media.kitsu.io/anime/poster_images/4788/small.jpg?1597697939' }, 5028: { id: '5028', slug: fate-stay-night-tv-reproduction, title: 'Fate/stay night TV Reproduction', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/5028/small.jpg?1597698733' }, 8675: { id: '8675', slug: fate-stay-night-movie-heaven-s-feel, title: 'Fate/stay night: Heaven''s Feel I. Presage Flower', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/8675/small.jpg?1597696968' }, 12007: { id: '12007', slug: fate-stay-night-movie-heaven-s-feel-2, title: 'Fate/stay night: Heaven''s Feel II. Lost Butterfly', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/12007/small.jpg?1597696985' }, 7882: { id: '7882', slug: fate-stay-night-unlimited-blade-works-2014, title: 'Fate/stay night: Unlimited Blade Works', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/7882/small.jpg?1597690834' }, 10052: { id: '10052', slug: fate-stay-night-unlimited-blade-works-tv-2, title: 'Fate/stay night: Unlimited Blade Works 2nd Season', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/10052/small.jpg?1597696781' }, 11321: { id: '11321', slug: fate-stay-night-unlimited-blade-works-tv-2nd-season-sunny-day, title: 'Fate/stay night: Unlimited Blade Works 2nd Season - Sunny Day', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/11321/small.jpg?1597697929' } } } }, English: { 'Emily Woo Zeller': { person: { id: '1549', slug: emily-woo-zeller, image: 'https://media.kitsu.io/people/images/1549/original.jpg?1416262343', name: 'Emily Woo Zeller' }, series: { 323: { id: '323', slug: fate-stay-night, title: 'Fate/stay night', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/323/small.jpg?1597698066' } } }, 'Kari Wahlgren': { person: { id: '238', slug: kari-wahlgren, image: 'https://media.kitsu.io/people/images/238/original.jpg?1416260610', name: 'Kari Wahlgren' }, series: { 12710: { id: '12710', slug: fate-grand-order-first-order, title: 'Fate/Grand Order: First Order', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/12710/small.jpg?1597698686' }, 6028: { id: '6028', slug: fate-zero, title: Fate/Zero, titles: [フェイト/ゼロ], posterImage: 'https://media.kitsu.io/anime/poster_images/6028/small.jpg?1597698769' }, 7658: { id: '7658', slug: fate-zero-2nd-season, title: 'Fate/Zero 2nd Season', titles: ['Fate/Zero Season 2', 'フェイト/ゼロ 2ndシーズン'], posterImage: 'https://media.kitsu.io/anime/poster_images/7658/small.jpg?1597698796' }, 8675: { id: '8675', slug: fate-stay-night-movie-heaven-s-feel, title: 'Fate/stay night: Heaven''s Feel I. Presage Flower', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/8675/small.jpg?1597696968' }, 7882: { id: '7882', slug: fate-stay-night-unlimited-blade-works-2014, title: 'Fate/stay night: Unlimited Blade Works', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/7882/small.jpg?1597690834' }, 10052: { id: '10052', slug: fate-stay-night-unlimited-blade-works-tv-2, title: 'Fate/stay night: Unlimited Blade Works 2nd Season', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/10052/small.jpg?1597696781' }, 11321: { id: '11321', slug: fate-stay-night-unlimited-blade-works-tv-2nd-season-sunny-day, title: 'Fate/stay night: Unlimited Blade Works 2nd Season - Sunny Day', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/11321/small.jpg?1597697929' } } }, 'Kate Higgins': { person: { id: '284', slug: kate-higgins, image: 'https://media.kitsu.io/people/images/284/original.jpg?1416260678', name: 'Kate Higgins' }, series: { 323: { id: '323', slug: fate-stay-night, title: 'Fate/stay night', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/323/small.jpg?1597698066' } } }, 'Michelle Ruff': { person: { id: '225', slug: michelle-ruff, image: 'https://media.kitsu.io/people/images/225/original.jpg?1416260589', name: 'Michelle Ruff' }, series: { 13066: { id: '13066', slug: fate-apocrypha, title: Fate/Apocrypha, titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/13066/small.jpg?1597698308' }, 4788: { id: '4788', slug: fate-stay-night-unlimited-blade-works, title: 'Fate/stay night Movie: Unlimited Blade Works', titles: ['Fate/stay night - Unlimited Blade Works', '劇場版 Fate/stay night: UNLIMITED BLADE WORKS'], posterImage: 'https://media.kitsu.io/anime/poster_images/4788/small.jpg?1597697939' } } } }, German: { 'Iris Hassenzahl': { person: { id: '17174', slug: iris-hassenzahl, image: 'https://media.kitsu.io/people/images/17174/original.jpg?1533273089', name: 'Iris Hassenzahl' }, series: { 6028: { id: '6028', slug: fate-zero, title: Fate/Zero, titles: [フェイト/ゼロ], posterImage: 'https://media.kitsu.io/anime/poster_images/6028/small.jpg?1597698769' }, 7658: { id: '7658', slug: fate-zero-2nd-season, title: 'Fate/Zero 2nd Season', titles: ['Fate/Zero Season 2', 'フェイト/ゼロ 2ndシーズン'], posterImage: 'https://media.kitsu.io/anime/poster_images/7658/small.jpg?1597698796' }, 4788: { id: '4788', slug: fate-stay-night-unlimited-blade-works, title: 'Fate/stay night Movie: Unlimited Blade Works', titles: ['Fate/stay night - Unlimited Blade Works', '劇場版 Fate/stay night: UNLIMITED BLADE WORKS'], posterImage: 'https://media.kitsu.io/anime/poster_images/4788/small.jpg?1597697939' }, 7882: { id: '7882', slug: fate-stay-night-unlimited-blade-works-2014, title: 'Fate/stay night: Unlimited Blade Works', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/7882/small.jpg?1597690834' } } } }, French: { 'Dany Benedito': { person: { id: '33010', slug: dany-benedito, image: 'https://media.kitsu.io/people/images/33010/original.jpg?1533275065', name: 'Dany Benedito' }, series: { 323: { id: '323', slug: fate-stay-night, title: 'Fate/stay night', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/323/small.jpg?1597698066' }, 4788: { id: '4788', slug: fate-stay-night-unlimited-blade-works, title: 'Fate/stay night Movie: Unlimited Blade Works', titles: ['Fate/stay night - Unlimited Blade Works', '劇場版 Fate/stay night: UNLIMITED BLADE WORKS'], posterImage: 'https://media.kitsu.io/anime/poster_images/4788/small.jpg?1597697939' } } } }, Italian: { 'Benedetta Degli Innocenti': { person: { id: '7457', slug: benedetta-degli-innocenti, image: 'https://media.kitsu.io/people/images/7457/original.jpg?1416268653', name: 'Benedetta Degli Innocenti' }, series: { 8675: { id: '8675', slug: fate-stay-night-movie-heaven-s-feel, title: 'Fate/stay night: Heaven''s Feel I. Presage Flower', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/8675/small.jpg?1597696968' }, 7882: { id: '7882', slug: fate-stay-night-unlimited-blade-works-2014, title: 'Fate/stay night: Unlimited Blade Works', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/7882/small.jpg?1597690834' }, 10052: { id: '10052', slug: fate-stay-night-unlimited-blade-works-tv-2, title: 'Fate/stay night: Unlimited Blade Works 2nd Season', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/10052/small.jpg?1597696781' } } } }, Korean: { 'Jeong Hwa Yang': { person: { id: '67', slug: jeong-hwa-yang, image: 'https://media.kitsu.io/people/images/67/original.jpg?1416260395', name: 'Jeong Hwa Yang' }, series: { 6028: { id: '6028', slug: fate-zero, title: Fate/Zero, titles: [フェイト/ゼロ], posterImage: 'https://media.kitsu.io/anime/poster_images/6028/small.jpg?1597698769' }, 323: { id: '323', slug: fate-stay-night, title: 'Fate/stay night', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/323/small.jpg?1597698066' } } } }, Portuguese: { 'Priscila Franco': { person: { id: '781', slug: priscila-franco, image: 'https://media.kitsu.io/people/images/781/original.jpg?1416261317', name: 'Priscila Franco' }, series: { 323: { id: '323', slug: fate-stay-night, title: 'Fate/stay night', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/323/small.jpg?1597698066' } } } }, Spanish: { 'Desiré Pillado': { person: { id: '34665', slug: desire-pillado, image: 'https://media.kitsu.io/people/images/34665/original.jpg?1533275328', name: 'Desiré Pillado' }, series: { 13066: { id: '13066', slug: fate-apocrypha, title: Fate/Apocrypha, titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/13066/small.jpg?1597698308' } } }, 'Isabel Valls': { person: { id: '33873', slug: isabel-valls, image: 'https://media.kitsu.io/people/images/33873/original.jpg?1533275201', name: 'Isabel Valls' }, series: { 323: { id: '323', slug: fate-stay-night, title: 'Fate/stay night', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/323/small.jpg?1597698066' } } }, 'Marycel González': { person: { id: '25876', slug: marycel-gonzalez, image: 'https://media.kitsu.io/people/images/25876/original.jpg?1486415264', name: 'Marycel González' }, series: { 323: { id: '323', slug: fate-stay-night, title: 'Fate/stay night', titles: { }, posterImage: 'https://media.kitsu.io/anime/poster_images/323/small.jpg?1597698066' } } } } } +description: 'Height: 154 cm
Weight: 42 kg
BWH: 73-53-76
Blood type: O
Armaments: armor, sword
Likes: well structured meals, stuffed animals
Dislikes: badly structured meals, dressing up too much
Talents: gymnastic exercise, secretly good in all kinds of gambling
Famous quote: "There are no regrets. If one can be proud of one''s life, one should not wish for another chance."

Fate/stay night
She is Shirou''s Servant, an agile but powerful warrior. Loyal, independent, and reserved, Saber acts coldly but is actually suppressing her emotions to focus on her goals. Her class is considered the "Most Outstanding," with excellent ratings in all categories. Since her Master cannot effectively provide her with mana, she minimizes her activity to preserve what she has. Saber is frustrated by Shirou''s "protective" tendencies, believing his erratic and reckless behavior will jeopardize her chances of winning the Holy Grail War.

Saber is a strong-willed young woman who always speaks resolutely. She is courageous, determined, and set on winning the Holy Grail. She constantly insists that she is a knight first and that her gender is of little importance to her. She is resolute in following her own morals regardless of more viable tactics being available should she consider them to be underhanded, leading to conflicts with Kiritsugu over the strategy within the Fourth Holy Grail War. While obtaining the Holy Grail is of the utmost importance, rejecting her chivalry is something that she will not do under normal circumstance even if it should put her at a disadvantage.

She doesn''t like to be treated as a woman, or even as a human, due to her status as a knight and a Servant. She tries to keep the notion that she is only a Servant, a tool for her Master, first and foremost in her mind, so she initially has no objections about Shirou accidentally seeing her naked body. She slowly becomes more aware of herself after their relationship develops, and eventually even becomes flustered upon the same situation being repeated. She is unwilling to show emotions, as she has suppressed them so strongly and views herself as a knight foremost. Even though she attempts to hide them, her insecurities become more and more apparent, and she later begins to open up more and show her emotions more easily, especially to Shirou.

Though she once felt more linked to dragons, she came to enjoy lions after taking care of a lion cub for a month at some point in her life. She claims that it is not that she "likes" them, but rather the happiness she experienced as he became attached to her brought forth a bond with them. He was very energetic, often biting or scratching, but she wished to be able to stay with him until the end. She has had feelings for them since then, and even remembers the fond memories while holding a stuffed lion. Shirou seeing the memory of her rubbing her cheek against the lion comments on it being a time where she looks like a girl her age.

She is shown to have a humongous appetite, finishing large servings of rice within one minute. Although she can normally eat anything, Shirou''s food education is what awoke her gourmet spirit. She originally did not appreciate modern food as she doesn''t actually need to eat as a Servant and because she had believed that all food was like fish and chips. She had very bad experiences with the food in her time, due being limited to meals like large quantities of potatoes, vinegar, bread, and ale or even at times simply eating vegetables alone.

She did not concern herself with food much in her life, allowing the cooks to do as they wished. She felt it was unrefined, although she was not displeased by it. She does shudder at the thought of eating it compared to Shirou''s cooking. She thought it had been made to suit the tastes of the knights because they acknowledged it as tasting good, but they simply were unable to say it was bad to the King''s face.

She is very cold and merciless to Illya during most of Fate/stay night despite her being Irisviel''s daughter. This is due to the fact that she never asked Irisviel about the name of her daughter, and when Saber sees Illya during the war, she completely disregards the possibility that it could be the same child. She believes that Illya is too young to be the girl she saw getting a piggy-back ride ten years before, and she believes that she would have become more mature like her mother by the time of the Fifth Holy Grail War. She reasons that Illya is a new homunculus completely unrelated to Irisviel with similarities in her appearance due to the Einzbern homunculi looking alike after their creation. Given a chance to casually interact with her, while she doesn''t trust Illya at first, she is eventually able to act nicely around her. She is able to freely have fun around her without any worries.

Fate/Zero
Saber is summoned by Kiritsugu Emiya to participate in the Fourth Holy Grail War on behalf of Jubstacheit von Einzbern and the Einzbern family. Kiritsugu partners Saber with Irisviel von Einzbern, to act as Saber''s Master in the open while he acts from behind to win with his own methods. On the final day of the Holy Grail war, Saber found the Holy Grail but she also meets Gilgamesh who was waiting for her. He proposes that she becomes his wife while she lays defeated in front of him. Saber refuses as the Holy Grail is just in front of her. Saber destroyed the Holy Grail in the fourth Holy Grail War because Kiritsugu used multiple command seals in order to force her to act against her will. However, she only managed to destroy the Grail''s physical form. She was also caught in her own Excalibur blast, sending her back to the battlefield of Camlann. She was the sixth and final servant to perish in the fourth Holy Grail War.
Her true identity is that of King Arthur aka. Arthur Pendragon (Uther''s daughter who hid her gender to be accepted as King). She has joined the Holy Grail War in order to grant her wish of redoing the selection of King due to her belief that she failed to keep her country from chaos. She wields the legendary holy sword Excalibur (cloaked in a veil of wind to hide its popular identity and thus its owner''s) but no longer carries its lost sheath Avalon.
(Source: Type Moon Wikia, Wikipedia)' +id: '6553' +media: + empty: false + anime: { 4: { id: '5992', slug: carnival-phantasm, posterImage: { original: { height: 693, name: original, url: 'https://media.kitsu.io/anime/poster_images/5992/original.jpg?1597697878', width: 533 }, views: [{ height: 156, name: tiny, url: 'https://media.kitsu.io/anime/poster_images/5992/tiny.jpg?1597697878', width: 110 }, { height: 402, name: small, url: 'https://media.kitsu.io/anime/poster_images/5992/small.jpg?1597697878', width: 284 }, { height: 554, name: medium, url: 'https://media.kitsu.io/anime/poster_images/5992/medium.jpg?1597697878', width: 390 }, { height: 780, name: large, url: 'https://media.kitsu.io/anime/poster_images/5992/large.jpg?1597697878', width: 550 }] }, type: Anime, title: 'Carnival Phantasm', titles: [カーニバル・ファンタズム] }, 13: { id: '6685', slug: carnival-phantasm-ex-season, posterImage: { original: { height: 500, name: original, url: 'https://media.kitsu.io/anime/poster_images/6685/original.jpg?1597697725', width: 351 }, views: [{ height: 156, name: tiny, url: 'https://media.kitsu.io/anime/poster_images/6685/tiny.jpg?1597697725', width: 110 }, { height: 402, name: small, url: 'https://media.kitsu.io/anime/poster_images/6685/small.jpg?1597697725', width: 284 }, { height: 554, name: medium, url: 'https://media.kitsu.io/anime/poster_images/6685/medium.jpg?1597697725', width: 390 }, { height: 780, name: large, url: 'https://media.kitsu.io/anime/poster_images/6685/large.jpg?1597697725', width: 550 }] }, type: Anime, title: 'Carnival Phantasm EX Season', titles: ['カーニバル・ファンタズム EX Season'] }, 5: { id: '7342', slug: carnival-phantasm-hibichika-special, posterImage: { original: { height: null, name: original, url: 'https://media.kitsu.io/anime/poster_images/7342/original.jpg?1408461040', width: null }, views: [{ height: null, name: tiny, url: 'https://media.kitsu.io/anime/poster_images/7342/tiny.jpg?1408461040', width: null }, { height: null, name: small, url: 'https://media.kitsu.io/anime/poster_images/7342/small.jpg?1408461040', width: null }, { height: null, name: medium, url: 'https://media.kitsu.io/anime/poster_images/7342/medium.jpg?1408461040', width: null }, { height: null, name: large, url: 'https://media.kitsu.io/anime/poster_images/7342/large.jpg?1408461040', width: null }] }, type: Anime, title: 'Carnival Phantasm: HibiChika Special', titles: ['カーニバル・ファンタズム ひびちかスペシャル'] }, 14: { id: '6695', slug: carnival-phantasm-illya-s-castle, posterImage: { original: { height: 338, name: original, url: 'https://media.kitsu.io/anime/poster_images/6695/original.jpg?1597698397', width: 225 }, views: [{ height: 156, name: tiny, url: 'https://media.kitsu.io/anime/poster_images/6695/tiny.jpg?1597698397', width: 110 }, { height: 402, name: small, url: 'https://media.kitsu.io/anime/poster_images/6695/small.jpg?1597698397', width: 284 }, { height: 554, name: medium, url: 'https://media.kitsu.io/anime/poster_images/6695/medium.jpg?1597698397', width: 390 }, { height: 780, name: large, url: 'https://media.kitsu.io/anime/poster_images/6695/large.jpg?1597698397', width: 550 }] }, type: Anime, title: 'Carnival Phantasm: Illya-jou', titles: ['カーニバル・ファンタズム: イリヤ城'] }, 26: { id: '14154', slug: emiya-san-chi-no-kyou-no-gohan, posterImage: { original: { height: 1014, name: original, url: 'https://media.kitsu.io/anime/poster_images/14154/original.jpg?1597697373', width: 730 }, views: [{ height: 156, name: tiny, url: 'https://media.kitsu.io/anime/poster_images/14154/tiny.jpg?1597697373', width: 110 }, { height: 402, name: small, url: 'https://media.kitsu.io/anime/poster_images/14154/small.jpg?1597697373', width: 284 }, { height: 554, name: medium, url: 'https://media.kitsu.io/anime/poster_images/14154/medium.jpg?1597697373', width: 390 }, { height: 780, name: large, url: 'https://media.kitsu.io/anime/poster_images/14154/large.jpg?1597697373', width: 550 }] }, type: Anime, title: 'Emiya-san Chi no Kyou no Gohan', titles: ['Today''s Menu for the Emiya Family', 衛宮さんちの今日のごはん] }, 29: { id: '13066', slug: fate-apocrypha, posterImage: { original: { height: 2535, name: original, url: 'https://media.kitsu.io/anime/poster_images/13066/original.jpg?1597698308', width: 1800 }, views: [{ height: 156, name: tiny, url: 'https://media.kitsu.io/anime/poster_images/13066/tiny.jpg?1597698308', width: 110 }, { height: 402, name: small, url: 'https://media.kitsu.io/anime/poster_images/13066/small.jpg?1597698308', width: 284 }, { height: 554, name: medium, url: 'https://media.kitsu.io/anime/poster_images/13066/medium.jpg?1597698308', width: 390 }, { height: 780, name: large, url: 'https://media.kitsu.io/anime/poster_images/13066/large.jpg?1597698308', width: 550 }] }, type: Anime, title: Fate/Apocrypha, titles: { } }, 30: { id: '13874', slug: fate-grand-order-cms, posterImage: { original: { height: null, name: original, url: 'https://media.kitsu.io/anime/poster_images/13874/original.jpg?1506646077', width: null }, views: [{ height: null, name: tiny, url: 'https://media.kitsu.io/anime/poster_images/13874/tiny.jpg?1506646077', width: null }, { height: null, name: small, url: 'https://media.kitsu.io/anime/poster_images/13874/small.jpg?1506646077', width: null }, { height: null, name: medium, url: 'https://media.kitsu.io/anime/poster_images/13874/medium.jpg?1506646077', width: null }, { height: null, name: large, url: 'https://media.kitsu.io/anime/poster_images/13874/large.jpg?1506646077', width: null }] }, type: Anime, title: 'Fate/Grand Order CMs', titles: { } }, 28: { id: '12710', slug: fate-grand-order-first-order, posterImage: { original: { height: 648, name: original, url: 'https://media.kitsu.io/anime/poster_images/12710/original.png?1597698686', width: 460 }, views: [{ height: 156, name: tiny, url: 'https://media.kitsu.io/anime/poster_images/12710/tiny.jpg?1597698686', width: 110 }, { height: 402, name: small, url: 'https://media.kitsu.io/anime/poster_images/12710/small.jpg?1597698686', width: 284 }, { height: 554, name: medium, url: 'https://media.kitsu.io/anime/poster_images/12710/medium.jpg?1597698686', width: 390 }, { height: 780, name: large, url: 'https://media.kitsu.io/anime/poster_images/12710/large.jpg?1597698686', width: 550 }] }, type: Anime, title: 'Fate/Grand Order: First Order', titles: { } }, 10: { id: '6028', slug: fate-zero, posterImage: { original: { height: 2000, name: original, url: 'https://media.kitsu.io/anime/poster_images/6028/original.jpg?1597698769', width: 1408 }, views: [{ height: 156, name: tiny, url: 'https://media.kitsu.io/anime/poster_images/6028/tiny.jpg?1597698769', width: 110 }, { height: 402, name: small, url: 'https://media.kitsu.io/anime/poster_images/6028/small.jpg?1597698769', width: 284 }, { height: 554, name: medium, url: 'https://media.kitsu.io/anime/poster_images/6028/medium.jpg?1597698769', width: 390 }, { height: 780, name: large, url: 'https://media.kitsu.io/anime/poster_images/6028/large.jpg?1597698769', width: 550 }] }, type: Anime, title: Fate/Zero, titles: [フェイト/ゼロ] }, 11: { id: '7658', slug: fate-zero-2nd-season, posterImage: { original: { height: 6650, name: original, url: 'https://media.kitsu.io/anime/poster_images/7658/original.jpg?1597698796', width: 4675 }, views: [{ height: 156, name: tiny, url: 'https://media.kitsu.io/anime/poster_images/7658/tiny.jpg?1597698796', width: 110 }, { height: 402, name: small, url: 'https://media.kitsu.io/anime/poster_images/7658/small.jpg?1597698796', width: 284 }, { height: 554, name: medium, url: 'https://media.kitsu.io/anime/poster_images/7658/medium.jpg?1597698796', width: 390 }, { height: 780, name: large, url: 'https://media.kitsu.io/anime/poster_images/7658/large.jpg?1597698796', width: 550 }] }, type: Anime, title: 'Fate/Zero 2nd Season', titles: ['Fate/Zero Season 2', 'フェイト/ゼロ 2ndシーズン'] }, 1: { id: '7873', slug: fate-zero-cafe, posterImage: { original: { height: null, name: original, url: 'https://media.kitsu.io/anime/poster_images/7873/original.jpg?1408462757', width: null }, views: [{ height: null, name: tiny, url: 'https://media.kitsu.io/anime/poster_images/7873/tiny.jpg?1408462757', width: null }, { height: null, name: small, url: 'https://media.kitsu.io/anime/poster_images/7873/small.jpg?1408462757', width: null }, { height: null, name: medium, url: 'https://media.kitsu.io/anime/poster_images/7873/medium.jpg?1408462757', width: null }, { height: null, name: large, url: 'https://media.kitsu.io/anime/poster_images/7873/large.jpg?1408462757', width: null }] }, type: Anime, title: 'Fate/Zero Cafe', titles: [Fate/ゼロカフェ] }, 7: { id: '6906', slug: fate-zero-remix, posterImage: { original: { height: 350, name: original, url: 'https://media.kitsu.io/anime/poster_images/6906/original.jpg?1597698293', width: 225 }, views: [{ height: 156, name: tiny, url: 'https://media.kitsu.io/anime/poster_images/6906/tiny.jpg?1597698293', width: 110 }, { height: 402, name: small, url: 'https://media.kitsu.io/anime/poster_images/6906/small.jpg?1597698293', width: 284 }, { height: 554, name: medium, url: 'https://media.kitsu.io/anime/poster_images/6906/medium.jpg?1597698293', width: 390 }, { height: 780, name: large, url: 'https://media.kitsu.io/anime/poster_images/6906/large.jpg?1597698293', width: 550 }] }, type: Anime, title: 'Fate/Zero Remix', titles: ['フェイト/ゼロ Remix'] }, 8: { id: '7173', slug: fate-kaleid-liner-prisma-illya, posterImage: { original: { height: 943, name: original, url: 'https://media.kitsu.io/anime/poster_images/7173/original.jpg?1597695114', width: 700 }, views: [{ height: 156, name: tiny, url: 'https://media.kitsu.io/anime/poster_images/7173/tiny.jpg?1597695114', width: 110 }, { height: 402, name: small, url: 'https://media.kitsu.io/anime/poster_images/7173/small.jpg?1597695114', width: 284 }, { height: 554, name: medium, url: 'https://media.kitsu.io/anime/poster_images/7173/medium.jpg?1597695114', width: 390 }, { height: 780, name: large, url: 'https://media.kitsu.io/anime/poster_images/7173/large.jpg?1597695114', width: 550 }] }, type: Anime, title: 'Fate/kaleid liner Prisma☆Illya', titles: ['Fate/kaleid liner プリズマ☆イリヤ'] }, 12: { id: '323', slug: fate-stay-night, posterImage: { original: { height: 1074, name: original, url: 'https://media.kitsu.io/anime/poster_images/323/original.jpg?1597698066', width: 760 }, views: [{ height: 156, name: tiny, url: 'https://media.kitsu.io/anime/poster_images/323/tiny.jpg?1597698066', width: 110 }, { height: 402, name: small, url: 'https://media.kitsu.io/anime/poster_images/323/small.jpg?1597698066', width: 284 }, { height: 554, name: medium, url: 'https://media.kitsu.io/anime/poster_images/323/medium.jpg?1597698066', width: 390 }, { height: 780, name: large, url: 'https://media.kitsu.io/anime/poster_images/323/large.jpg?1597698066', width: 550 }] }, type: Anime, title: 'Fate/stay night', titles: { } }, 2: { id: '4788', slug: fate-stay-night-unlimited-blade-works, posterImage: { original: { height: 320, name: original, url: 'https://media.kitsu.io/anime/poster_images/4788/original.jpg?1597697939', width: 225 }, views: [{ height: 156, name: tiny, url: 'https://media.kitsu.io/anime/poster_images/4788/tiny.jpg?1597697939', width: 110 }, { height: 402, name: small, url: 'https://media.kitsu.io/anime/poster_images/4788/small.jpg?1597697939', width: 284 }, { height: 554, name: medium, url: 'https://media.kitsu.io/anime/poster_images/4788/medium.jpg?1597697939', width: 390 }, { height: 780, name: large, url: 'https://media.kitsu.io/anime/poster_images/4788/large.jpg?1597697939', width: 550 }] }, type: Anime, title: 'Fate/stay night Movie: Unlimited Blade Works', titles: ['Fate/stay night - Unlimited Blade Works', '劇場版 Fate/stay night: UNLIMITED BLADE WORKS'] }, 0: { id: '5028', slug: fate-stay-night-tv-reproduction, posterImage: { original: { height: 318, name: original, url: 'https://media.kitsu.io/anime/poster_images/5028/original.jpg?1597698733', width: 225 }, views: [{ height: 156, name: tiny, url: 'https://media.kitsu.io/anime/poster_images/5028/tiny.jpg?1597698733', width: 110 }, { height: 402, name: small, url: 'https://media.kitsu.io/anime/poster_images/5028/small.jpg?1597698733', width: 284 }, { height: 554, name: medium, url: 'https://media.kitsu.io/anime/poster_images/5028/medium.jpg?1597698733', width: 390 }, { height: 780, name: large, url: 'https://media.kitsu.io/anime/poster_images/5028/large.jpg?1597698733', width: 550 }] }, type: Anime, title: 'Fate/stay night TV Reproduction', titles: { } }, 9: { id: '8675', slug: fate-stay-night-movie-heaven-s-feel, posterImage: { original: { height: 1701, name: original, url: 'https://media.kitsu.io/anime/poster_images/8675/original.jpg?1597696968', width: 1200 }, views: [{ height: 156, name: tiny, url: 'https://media.kitsu.io/anime/poster_images/8675/tiny.jpg?1597696968', width: 110 }, { height: 402, name: small, url: 'https://media.kitsu.io/anime/poster_images/8675/small.jpg?1597696968', width: 284 }, { height: 554, name: medium, url: 'https://media.kitsu.io/anime/poster_images/8675/medium.jpg?1597696968', width: 390 }, { height: 780, name: large, url: 'https://media.kitsu.io/anime/poster_images/8675/large.jpg?1597696968', width: 550 }] }, type: Anime, title: 'Fate/stay night: Heaven''s Feel I. Presage Flower', titles: { } }, 27: { id: '12007', slug: fate-stay-night-movie-heaven-s-feel-2, posterImage: { original: { height: 2799, name: original, url: 'https://media.kitsu.io/anime/poster_images/12007/original.jpg?1597696985', width: 2000 }, views: [{ height: 156, name: tiny, url: 'https://media.kitsu.io/anime/poster_images/12007/tiny.jpg?1597696985', width: 110 }, { height: 402, name: small, url: 'https://media.kitsu.io/anime/poster_images/12007/small.jpg?1597696985', width: 284 }, { height: 554, name: medium, url: 'https://media.kitsu.io/anime/poster_images/12007/medium.jpg?1597696985', width: 390 }, { height: 780, name: large, url: 'https://media.kitsu.io/anime/poster_images/12007/large.jpg?1597696985', width: 550 }] }, type: Anime, title: 'Fate/stay night: Heaven''s Feel II. Lost Butterfly', titles: { } }, 6: { id: '7882', slug: fate-stay-night-unlimited-blade-works-2014, posterImage: { original: { height: 1471, name: original, url: 'https://media.kitsu.io/anime/poster_images/7882/original.jpg?1597690834', width: 1000 }, views: [{ height: 156, name: tiny, url: 'https://media.kitsu.io/anime/poster_images/7882/tiny.jpg?1597690834', width: 110 }, { height: 402, name: small, url: 'https://media.kitsu.io/anime/poster_images/7882/small.jpg?1597690834', width: 284 }, { height: 554, name: medium, url: 'https://media.kitsu.io/anime/poster_images/7882/medium.jpg?1597690834', width: 390 }, { height: 780, name: large, url: 'https://media.kitsu.io/anime/poster_images/7882/large.jpg?1597690834', width: 550 }] }, type: Anime, title: 'Fate/stay night: Unlimited Blade Works', titles: { } }, 3: { id: '10052', slug: fate-stay-night-unlimited-blade-works-tv-2, posterImage: { original: { height: 1385, name: original, url: 'https://media.kitsu.io/anime/poster_images/10052/original.jpg?1597696781', width: 955 }, views: [{ height: 156, name: tiny, url: 'https://media.kitsu.io/anime/poster_images/10052/tiny.jpg?1597696781', width: 110 }, { height: 402, name: small, url: 'https://media.kitsu.io/anime/poster_images/10052/small.jpg?1597696781', width: 284 }, { height: 554, name: medium, url: 'https://media.kitsu.io/anime/poster_images/10052/medium.jpg?1597696781', width: 390 }, { height: 780, name: large, url: 'https://media.kitsu.io/anime/poster_images/10052/large.jpg?1597696781', width: 550 }] }, type: Anime, title: 'Fate/stay night: Unlimited Blade Works 2nd Season', titles: { } }, 15: { id: '11321', slug: fate-stay-night-unlimited-blade-works-tv-2nd-season-sunny-day, posterImage: { original: { height: 1980, name: original, url: 'https://media.kitsu.io/anime/poster_images/11321/original.jpg?1597697929', width: 1417 }, views: [{ height: 156, name: tiny, url: 'https://media.kitsu.io/anime/poster_images/11321/tiny.jpg?1597697929', width: 110 }, { height: 402, name: small, url: 'https://media.kitsu.io/anime/poster_images/11321/small.jpg?1597697929', width: 284 }, { height: 554, name: medium, url: 'https://media.kitsu.io/anime/poster_images/11321/medium.jpg?1597697929', width: 390 }, { height: 780, name: large, url: 'https://media.kitsu.io/anime/poster_images/11321/large.jpg?1597697929', width: 550 }] }, type: Anime, title: 'Fate/stay night: Unlimited Blade Works 2nd Season - Sunny Day', titles: { } } } + manga: { 22: { id: '20870', slug: all-around-type-moon, posterImage: { original: { height: null, name: original, url: 'https://media.kitsu.io/manga/poster_images/20870/original.jpg?1434295256', width: null }, views: [{ height: null, name: tiny, url: 'https://media.kitsu.io/manga/poster_images/20870/tiny.jpg?1434295256', width: null }, { height: null, name: small, url: 'https://media.kitsu.io/manga/poster_images/20870/small.jpg?1434295256', width: null }, { height: null, name: medium, url: 'https://media.kitsu.io/manga/poster_images/20870/medium.jpg?1434295256', width: null }, { height: null, name: large, url: 'https://media.kitsu.io/manga/poster_images/20870/large.jpg?1434295256', width: null }] }, type: Manga, title: 'All Around Type-Moon', titles: { } }, 25: { id: '38780', slug: emiya-san-chi-no-kyou-no-gohan, posterImage: { original: { height: null, name: original, url: 'https://media.kitsu.io/manga/poster_images/38780/original.jpg?1493684265', width: null }, views: [{ height: null, name: tiny, url: 'https://media.kitsu.io/manga/poster_images/38780/tiny.jpg?1493684265', width: null }, { height: null, name: small, url: 'https://media.kitsu.io/manga/poster_images/38780/small.jpg?1493684265', width: null }, { height: null, name: medium, url: 'https://media.kitsu.io/manga/poster_images/38780/medium.jpg?1493684265', width: null }, { height: null, name: large, url: 'https://media.kitsu.io/manga/poster_images/38780/large.jpg?1493684265', width: null }] }, type: Manga, title: 'Emiya-san Chi no Kyou no Gohan', titles: ['Today''s Menu For Emiya Family', 衛宮さんちの今日のごはん] }, 34: { id: '36203', slug: fate-labyrinth, posterImage: { original: { height: null, name: original, url: 'https://media.kitsu.io/manga/poster_images/36203/original.jpg?1436352578', width: null }, views: [{ height: null, name: tiny, url: 'https://media.kitsu.io/manga/poster_images/36203/tiny.jpg?1436352578', width: null }, { height: null, name: small, url: 'https://media.kitsu.io/manga/poster_images/36203/small.jpg?1436352578', width: null }, { height: null, name: medium, url: 'https://media.kitsu.io/manga/poster_images/36203/medium.jpg?1436352578', width: null }, { height: null, name: large, url: 'https://media.kitsu.io/manga/poster_images/36203/large.jpg?1436352578', width: null }] }, type: Manga, title: Fate/Labyrinth, titles: { } }, 18: { id: '8132', slug: fate-zero, posterImage: { original: { height: null, name: original, url: 'https://media.kitsu.io/manga/poster_images/8132/original.jpg?1493616972', width: null }, views: [{ height: null, name: tiny, url: 'https://media.kitsu.io/manga/poster_images/8132/tiny.jpg?1493616972', width: null }, { height: null, name: small, url: 'https://media.kitsu.io/manga/poster_images/8132/small.jpg?1493616972', width: null }, { height: null, name: medium, url: 'https://media.kitsu.io/manga/poster_images/8132/medium.jpg?1493616972', width: null }, { height: null, name: large, url: 'https://media.kitsu.io/manga/poster_images/8132/large.jpg?1493616972', width: null }] }, type: Manga, title: Fate/Zero, titles: { } }, 21: { id: '18251', slug: fate-zero-manga, posterImage: { original: { height: null, name: original, url: 'https://media.kitsu.io/manga/poster_images/18251/original.jpg?1434289541', width: null }, views: [{ height: null, name: tiny, url: 'https://media.kitsu.io/manga/poster_images/18251/tiny.jpg?1434289541', width: null }, { height: null, name: small, url: 'https://media.kitsu.io/manga/poster_images/18251/small.jpg?1434289541', width: null }, { height: null, name: medium, url: 'https://media.kitsu.io/manga/poster_images/18251/medium.jpg?1434289541', width: null }, { height: null, name: large, url: 'https://media.kitsu.io/manga/poster_images/18251/large.jpg?1434289541', width: null }] }, type: Manga, title: Fate/Zero, titles: { } }, 23: { id: '10498', slug: fate-hollow-ataraxia, posterImage: { original: { height: null, name: original, url: 'https://media.kitsu.io/manga/poster_images/10498/original.jpg?1434272159', width: null }, views: [{ height: null, name: tiny, url: 'https://media.kitsu.io/manga/poster_images/10498/tiny.jpg?1434272159', width: null }, { height: null, name: small, url: 'https://media.kitsu.io/manga/poster_images/10498/small.jpg?1434272159', width: null }, { height: null, name: medium, url: 'https://media.kitsu.io/manga/poster_images/10498/medium.jpg?1434272159', width: null }, { height: null, name: large, url: 'https://media.kitsu.io/manga/poster_images/10498/large.jpg?1434272159', width: null }] }, type: Manga, title: 'Fate/hollow ataraxia', titles: { } }, 17: { id: '7782', slug: fate-kaleid-liner-prisma-illya, posterImage: { original: { height: null, name: original, url: 'https://media.kitsu.io/manga/poster_images/7782/original.jpg?1434266196', width: null }, views: [{ height: null, name: tiny, url: 'https://media.kitsu.io/manga/poster_images/7782/tiny.jpg?1434266196', width: null }, { height: null, name: small, url: 'https://media.kitsu.io/manga/poster_images/7782/small.jpg?1434266196', width: null }, { height: null, name: medium, url: 'https://media.kitsu.io/manga/poster_images/7782/medium.jpg?1434266196', width: null }, { height: null, name: large, url: 'https://media.kitsu.io/manga/poster_images/7782/large.jpg?1434266196', width: null }] }, type: Manga, title: 'Fate/kaleid liner Prisma☆Illya', titles: ['Fate/kaleid liner プリズマ☆イリヤ'] }, 16: { id: '1590', slug: fate-stay-night, posterImage: { original: { height: null, name: original, url: 'https://media.kitsu.io/manga/poster_images/1590/original.jpg?1434252732', width: null }, views: [{ height: null, name: tiny, url: 'https://media.kitsu.io/manga/poster_images/1590/tiny.jpg?1434252732', width: null }, { height: null, name: small, url: 'https://media.kitsu.io/manga/poster_images/1590/small.jpg?1434252732', width: null }, { height: null, name: medium, url: 'https://media.kitsu.io/manga/poster_images/1590/medium.jpg?1434252732', width: null }, { height: null, name: large, url: 'https://media.kitsu.io/manga/poster_images/1590/large.jpg?1434252732', width: null }] }, type: Manga, title: 'Fate/stay night', titles: { } }, 20: { id: '9533', slug: fate-stay-night-x-magical-girl-lyrical-nanoha, posterImage: { original: { height: null, name: original, url: 'https://media.kitsu.io/manga/poster_images/9533/original.jpg?1434270014', width: null }, views: [{ height: null, name: tiny, url: 'https://media.kitsu.io/manga/poster_images/9533/tiny.jpg?1434270014', width: null }, { height: null, name: small, url: 'https://media.kitsu.io/manga/poster_images/9533/small.jpg?1434270014', width: null }, { height: null, name: medium, url: 'https://media.kitsu.io/manga/poster_images/9533/medium.jpg?1434270014', width: null }, { height: null, name: large, url: 'https://media.kitsu.io/manga/poster_images/9533/large.jpg?1434270014', width: null }] }, type: Manga, title: 'Fate/stay night x Mahou Shoujo Lyrical Nanoha', titles: ['Fate/stay night×魔法少女リリカルなのは'] }, 19: { id: '20224', slug: fate-stay-night-comic-battle, posterImage: { original: { height: null, name: original, url: 'https://media.kitsu.io/manga/poster_images/20224/original.jpg?1434293860', width: null }, views: [{ height: null, name: tiny, url: 'https://media.kitsu.io/manga/poster_images/20224/tiny.jpg?1434293860', width: null }, { height: null, name: small, url: 'https://media.kitsu.io/manga/poster_images/20224/small.jpg?1434293860', width: null }, { height: null, name: medium, url: 'https://media.kitsu.io/manga/poster_images/20224/medium.jpg?1434293860', width: null }, { height: null, name: large, url: 'https://media.kitsu.io/manga/poster_images/20224/large.jpg?1434293860', width: null }] }, type: Manga, title: 'Fate/stay night: Comic Battle', titles: { } }, 32: { id: '34356', slug: fate-stay-night-garden-of-avalon, posterImage: { original: { height: null, name: original, url: 'https://media.kitsu.io/manga/poster_images/34356/original.jpg?1434324146', width: null }, views: [{ height: null, name: tiny, url: 'https://media.kitsu.io/manga/poster_images/34356/tiny.jpg?1434324146', width: null }, { height: null, name: small, url: 'https://media.kitsu.io/manga/poster_images/34356/small.jpg?1434324146', width: null }, { height: null, name: medium, url: 'https://media.kitsu.io/manga/poster_images/34356/medium.jpg?1434324146', width: null }, { height: null, name: large, url: 'https://media.kitsu.io/manga/poster_images/34356/large.jpg?1434324146', width: null }] }, type: Manga, title: 'Fate/stay night: Garden of Avalon', titles: { } }, 24: { id: '35847', slug: fate-stay-night-heaven-s-feel, posterImage: { original: { height: null, name: original, url: 'https://media.kitsu.io/manga/poster_images/35847/original.jpg?1434327356', width: null }, views: [{ height: null, name: tiny, url: 'https://media.kitsu.io/manga/poster_images/35847/tiny.jpg?1434327356', width: null }, { height: null, name: small, url: 'https://media.kitsu.io/manga/poster_images/35847/small.jpg?1434327356', width: null }, { height: null, name: medium, url: 'https://media.kitsu.io/manga/poster_images/35847/medium.jpg?1434327356', width: null }, { height: null, name: large, url: 'https://media.kitsu.io/manga/poster_images/35847/large.jpg?1434327356', width: null }] }, type: Manga, title: 'Fate/stay night: Heaven''s Feel', titles: { } }, 31: { id: '1710', slug: take-moon, posterImage: { original: { height: null, name: original, url: 'https://media.kitsu.io/manga/poster_images/1710/original.jpg?1434253007', width: null }, views: [{ height: null, name: tiny, url: 'https://media.kitsu.io/manga/poster_images/1710/tiny.jpg?1434253007', width: null }, { height: null, name: small, url: 'https://media.kitsu.io/manga/poster_images/1710/small.jpg?1434253007', width: null }, { height: null, name: medium, url: 'https://media.kitsu.io/manga/poster_images/1710/medium.jpg?1434253007', width: null }, { height: null, name: large, url: 'https://media.kitsu.io/manga/poster_images/1710/large.jpg?1434253007', width: null }] }, type: Manga, title: 'Take Moon', titles: ['TYPE-MOON作品集・TAKE MOON'] }, 33: { id: '35473', slug: chibichuki, posterImage: { original: { height: null, name: original, url: 'https://media.kitsu.io/manga/poster_images/35473/original.jpg?1434326526', width: null }, views: [{ height: null, name: tiny, url: 'https://media.kitsu.io/manga/poster_images/35473/tiny.jpg?1434326526', width: null }, { height: null, name: small, url: 'https://media.kitsu.io/manga/poster_images/35473/small.jpg?1434326526', width: null }, { height: null, name: medium, url: 'https://media.kitsu.io/manga/poster_images/35473/medium.jpg?1434326526', width: null }, { height: null, name: large, url: 'https://media.kitsu.io/manga/poster_images/35473/large.jpg?1434326526', width: null }] }, type: Manga, title: 'Type-Moon Gakuen: Chibichuki!', titles: ['TYPE-MOON学園 ちびちゅき!'] } } +name: Saber +names: + - セイバー +otherNames: + - 'King of Knights' diff --git a/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/HistoryTransformerTest__testAnimeTransform__1.yml b/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/HistoryTransformerTest__testAnimeTransform__1.yml new file mode 100644 index 00000000..71f401d5 --- /dev/null +++ b/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/HistoryTransformerTest__testAnimeTransform__1.yml @@ -0,0 +1,630 @@ +- + empty: false + title: 'Shin Chuuka Ichiban! 2nd Season' + coverImg: images/anime/43825.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-23T12:24:03-05:00' + url: /anime/details/shin-chuuka-ichiban-2nd-season + original: { id: '47211008', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43825', slug: shin-chuuka-ichiban-2nd-season, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43825/tiny.jpg?1609082225' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43825/small.jpg?1609082225' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43825/medium.jpg?1609082225' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43825/large.jpg?1609082225' }] }, titles: { alternatives: ['New Cooking Master Boy!'], canonical: 'Shin Chuuka Ichiban! 2nd Season', localized: { en: 'True Cooking Master Boy Season 2', en_jp: 'Shin Chuuka Ichiban! 2nd Season', ja_jp: 真・中華一番! } } }, updatedAt: '2021-02-23T17:24:03Z' } +- + empty: false + title: Horimiya + coverImg: images/anime/43545.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-23T07:45:26-05:00' + url: /anime/details/horimiya + original: { id: '47197990', changedData: { progress: [6, 7], time_spent: [5520, 6900] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43545', slug: horimiya, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43545/tiny.jpg?1609224996' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43545/small.jpg?1609224996' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43545/medium.jpg?1609224996' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43545/large.jpg?1609224996' }] }, titles: { alternatives: { }, canonical: Horimiya, localized: { en_jp: Horimiya, ja_jp: ホリミヤ } } }, updatedAt: '2021-02-23T12:45:26Z' } +- + empty: false + title: 'Kai Byoui Ramune' + coverImg: images/anime/43818.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-23T07:20:46-05:00' + url: /anime/details/kai-byoui-ramune + original: { id: '47197145', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '43818', slug: kai-byoui-ramune, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43818/tiny.jpg?1608544506' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43818/small.jpg?1608544506' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43818/medium.jpg?1608544506' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43818/large.jpg?1608544506' }] }, titles: { alternatives: { }, canonical: 'Kai Byoui Ramune', localized: { en: 'Dr. Ramune -Mysterious Disease Specialist-', en_jp: 'Kai Byoui Ramune', ja_jp: 怪病医ラムネ } } }, updatedAt: '2021-02-23T12:20:46Z' } +- + empty: false + title: 'Yes! Precure 5' + coverImg: images/anime/1742.webp + action: 'Watched episode 23' + kind: progressed + updated: '2021-02-22T15:25:05-05:00' + url: /anime/details/yes-precure-5 + original: { id: '47150310', changedData: { progress: [24, 23], time_spent: [1992, 1968] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-22T20:25:05Z' } +- + empty: false + title: 'Tatoeba Last Dungeon Mae no Mura no Shounen ga Joban no Machi de Kurasu Youna Monogatari' + coverImg: images/anime/42635.webp + action: 'Watched episode 8' + kind: progressed + updated: '2021-02-22T12:50:38-05:00' + url: /anime/details/tatoeba-last-dungeon-mae-no-mura-no-shounen-ga-joban-no-machi-de-kurasu-youna-monogatari + original: { id: '47142671', changedData: { progress: [7, 8] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42635', slug: tatoeba-last-dungeon-mae-no-mura-no-shounen-ga-joban-no-machi-de-kurasu-youna-monogatari, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42635/tiny.jpg?1571504181' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42635/small.jpg?1571504181' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42635/medium.jpg?1571504181' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42635/large.jpg?1571504181' }] }, titles: { alternatives: ['Suppose a Kid from the Last Dungeon Boonies Moved to a Starter Town'], canonical: 'Tatoeba Last Dungeon Mae no Mura no Shounen ga Joban no Machi de Kurasu Youna Monogatari', localized: { en_jp: 'Tatoeba Last Dungeon Mae no Mura no Shounen ga Joban no Machi de Kurasu Youna Monogatari', ja_jp: たとえばラストダンジョン前の村の少年が序盤の街で暮らすような物語 } } }, updatedAt: '2021-02-22T17:50:38Z' } +- + empty: false + title: 'Mushoku Tensei: Isekai Ittara Honki Dasu' + coverImg: images/anime/42323.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-22T12:27:39-05:00' + url: /anime/details/mushoku-tensei-isekai-ittara-honki-dasu + original: { id: '47141571', changedData: { progress: [6, 7], time_spent: [4320, 5760] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: 'The pervert aspect of this dampens my enjoyment. ' }, media: { __typename: Anime, id: '42323', slug: mushoku-tensei-isekai-ittara-honki-dasu, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42323/tiny.jpg?1571408000' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42323/small.jpg?1571408000' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42323/medium.jpg?1571408000' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42323/large.jpg?1571408000' }] }, titles: { alternatives: { }, canonical: 'Mushoku Tensei: Isekai Ittara Honki Dasu', localized: { en: 'Mushoku Tensei: Jobless Reincarnation', en_jp: 'Mushoku Tensei: Isekai Ittara Honki Dasu', ja_jp: '無職転生 ~異世界行ったら本気だす~' } } }, updatedAt: '2021-02-22T17:27:39Z' } +- + empty: false + title: 'Healin'' Good♡Precure' + coverImg: images/anime/42650.webp + action: Completed + kind: updated + updated: '2021-02-21T07:47:27-05:00' + url: /anime/details/healin-good-precure + original: { id: '47057900', changedData: { status: [current] }, kind: UPDATED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42650', slug: healin-good-precure, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42650/tiny.jpg?1578070083' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42650/small.jpg?1578070083' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42650/medium.jpg?1578070083' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42650/large.jpg?1578070083' }] }, titles: { alternatives: { }, canonical: 'Healin'' Good♡Precure', localized: { en: 'Healin'' Good Pretty Cure', en_jp: 'Healin'' Good♡Precure', ja_jp: ヒーリングっど♡プリキュア } } }, updatedAt: '2021-02-21T12:47:27Z' } +- + empty: false + title: 'Healin'' Good♡Precure' + coverImg: images/anime/42650.webp + action: 'Watched episode 45' + kind: progressed + updated: '2021-02-21T07:47:27-05:00' + url: /anime/details/healin-good-precure + original: { id: '47057899', changedData: { progress: [44, 45], time_spent: [63360, 64800] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42650', slug: healin-good-precure, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42650/tiny.jpg?1578070083' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42650/small.jpg?1578070083' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42650/medium.jpg?1578070083' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42650/large.jpg?1578070083' }] }, titles: { alternatives: { }, canonical: 'Healin'' Good♡Precure', localized: { en: 'Healin'' Good Pretty Cure', en_jp: 'Healin'' Good♡Precure', ja_jp: ヒーリングっど♡プリキュア } } }, updatedAt: '2021-02-21T12:47:27Z' } +- + empty: false + title: 'Yes! Precure 5' + coverImg: images/anime/1742.webp + action: 'Watched episodes 23-24' + kind: null + updated: '2021-02-20T18:39:13-05:00' + url: /anime/details/yes-precure-5 + original: [{ empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 24', kind: progressed, updated: '2021-02-20T18:39:13-05:00', url: /anime/details/yes-precure-5, original: { id: '47027732', changedData: { progress: [23, 24], time_spent: [1968, 1992] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-20T23:39:13Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 23', kind: progressed, updated: '2021-02-20T18:14:59-05:00', url: /anime/details/yes-precure-5, original: { id: '47026266', changedData: { progress: [22, 23], time_spent: [1944, 1968] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-20T23:14:59Z' } }] +- + empty: false + title: 'Ore dake Haireru Kakushi Dungeon' + coverImg: images/anime/43301.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-20T17:42:45-05:00' + url: /anime/details/ore-dake-haireru-kakushi-dungeon + original: { id: '47024295', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43301', slug: ore-dake-haireru-kakushi-dungeon, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43301/tiny.jpg?1607696005' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43301/small.jpg?1607696005' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43301/medium.jpg?1607696005' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43301/large.jpg?1607696005' }] }, titles: { alternatives: ['Special training in the Secret Dungeon', 'Ore Dake Haireru Kakushi Dungeon: Kossori Kitaete Sekai Saikyou'], canonical: 'Ore dake Haireru Kakushi Dungeon', localized: { en: 'The Hidden Dungeon Only I Can Enter', en_jp: 'Ore dake Haireru Kakushi Dungeon', ja_jp: 俺だけ入れる隠しダンジョン } } }, updatedAt: '2021-02-20T22:42:45Z' } +- + empty: false + title: 'Inu to Neko Docchi mo Katteru to Mainichi Tanoshii' + coverImg: images/anime/43550.webp + action: 'Watched episode 19' + kind: progressed + updated: '2021-02-20T17:14:24-05:00' + url: /anime/details/inu-to-neko-docchi-mo-katteru-to-mainichi-tanoshii + original: { id: '47022910', changedData: { progress: [18, 19], time_spent: [360, 420] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43550', slug: inu-to-neko-docchi-mo-katteru-to-mainichi-tanoshii, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43550/tiny.jpg?1600679941' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43550/small.jpg?1600679941' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43550/medium.jpg?1600679941' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43550/large.jpg?1600679941' }] }, titles: { alternatives: { }, canonical: 'Inu to Neko Docchi mo Katteru to Mainichi Tanoshii', localized: { en: 'With a Dog and a Cat, Every Day is Fun', en_jp: 'Inu to Neko Docchi mo Katteru to Mainichi Tanoshii', ja_jp: 犬と猫どっちも飼ってると毎日たのしい } } }, updatedAt: '2021-02-20T22:14:24Z' } +- + empty: false + title: 'Otona no Bouguya-san 2nd Season' + coverImg: images/anime/43569.webp + action: 'Watched episode 8' + kind: progressed + updated: '2021-02-20T17:05:29-05:00' + url: /anime/details/otona-no-bouguya-san-2nd-season + original: { id: '47022451', changedData: { progress: [7, 8] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43569', slug: otona-no-bouguya-san-2nd-season, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43569/tiny.jpg?1601057792' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43569/small.jpg?1601057792' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43569/medium.jpg?1601057792' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43569/large.jpg?1601057792' }] }, titles: { alternatives: { }, canonical: 'Otona no Bouguya-san 2nd Season', localized: { en: 'Armor Shop for Ladies & Gentlemen 2nd Season', en_jp: 'Otona no Bouguya-san 2nd Season', ja_jp: 'おとなの防具屋さん 第2シリーズ' } } }, updatedAt: '2021-02-20T22:05:29Z' } +- + empty: false + title: 'Kumo desu ga, Nani ka?' + coverImg: images/anime/41463.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-20T17:00:59-05:00' + url: /anime/details/kumo-desu-ga-nani-ka + original: { id: '47022229', changedData: { progress: [6, 7], time_spent: [4320, 5760] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '41463', slug: kumo-desu-ga-nani-ka, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/41463/tiny.jpg?1593607925' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/41463/small.jpg?1593607925' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/41463/medium.jpg?1593607925' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/41463/large.jpg?1593607925' }] }, titles: { alternatives: { }, canonical: 'Kumo desu ga, Nani ka?', localized: { en: 'So I''m a Spider, So What?', en_jp: 'Kumo desu ga, Nani ka?', ja_jp: 蜘蛛ですが、なにか? } } }, updatedAt: '2021-02-20T22:00:59Z' } +- + empty: false + title: '5-toubun no Hanayome ∬' + coverImg: images/anime/42324.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-20T16:32:29-05:00' + url: /anime/details/5-toubun-no-hanayome-2 + original: { id: '47020824', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42324', slug: 5-toubun-no-hanayome-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42324/tiny.jpg?1597697087' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42324/small.jpg?1597697087' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42324/medium.jpg?1597697087' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42324/large.jpg?1597697087' }] }, titles: { alternatives: ['Gotoubun no Hanayome 2', 'The Five Wedded Brides 2', '5-Toubun no Hanayome 2'], canonical: '5-toubun no Hanayome ∬', localized: { en: 'The Quintessential Quintuplets 2', en_jp: '5-toubun no Hanayome ∬', ja_jp: 五等分の花嫁∬ } } }, updatedAt: '2021-02-20T21:32:29Z' } +- + empty: false + title: 'Tenchi Souzou Design-bu' + coverImg: images/anime/43137.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-20T16:01:31-05:00' + url: /anime/details/tenchi-souzou-design-bu + original: { id: '47019073', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43137', slug: tenchi-souzou-design-bu, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43137/tiny.jpg?1611330634' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43137/small.jpg?1611330634' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43137/medium.jpg?1611330634' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43137/large.jpg?1611330634' }] }, titles: { alternatives: ['[Ten-De-Bu] What a strange animal!', Tendebu], canonical: 'Tenchi Souzou Design-bu', localized: { en: 'Heaven''s Design Team', en_jp: 'Tenchi Souzou Design-bu', ja_jp: 天地創造デザイン部 } } }, updatedAt: '2021-02-20T21:01:31Z' } +- + empty: false + title: 'Yuru Camp△ 2' + coverImg: images/anime/41976.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-20T15:27:54-05:00' + url: /anime/details/yuru-camp-2 + original: { id: '47017464', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '41976', slug: yuru-camp-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/41976/tiny.jpg?1611329947' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/41976/small.jpg?1611329947' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/41976/medium.jpg?1611329947' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/41976/large.jpg?1611329947' }] }, titles: { alternatives: { }, canonical: 'Yuru Camp△ 2', localized: { en: 'Laid-Back Camp 2', en_jp: 'Yuru Camp△ 2', ja_jp: 'ゆるキャン△ 2' } } }, updatedAt: '2021-02-20T20:27:54Z' } +- + empty: false + title: 'Hanyou no Yashahime: Sengoku Otogizoushi' + coverImg: images/anime/43180.webp + action: 'Watched episode 20' + kind: progressed + updated: '2021-02-20T14:47:33-05:00' + url: /anime/details/hanyou-no-yasha-hime + original: { id: '47015272', changedData: { progress: [19, 20], time_spent: [4320, 5760] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: 'InuYasha universe, mostly a different cast.' }, media: { __typename: Anime, id: '43180', slug: hanyou-no-yasha-hime, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43180/tiny.jpg?1589037137' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43180/small.jpg?1589037137' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43180/medium.jpg?1589037137' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43180/large.jpg?1589037137' }] }, titles: { alternatives: ['Inuyasha: Hanyou no Yasha Hime'], canonical: 'Hanyou no Yashahime: Sengoku Otogizoushi', localized: { en: 'Yashahime: Princess Half-Demon', en_jp: 'Hanyou no Yashahime: Sengoku Otogizoushi', ja_jp: 半妖の夜叉姫 } } }, updatedAt: '2021-02-20T19:47:33Z' } +- + empty: false + title: 'Jaku-chara Tomozaki-kun' + coverImg: images/anime/42621.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-20T14:23:07-05:00' + url: /anime/details/jaku-chara-tomozaki-kun + original: { id: '47013918', changedData: { progress: [6, 7], time_spent: [0, 1380] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '42621', slug: jaku-chara-tomozaki-kun, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42621/tiny.jpg?1611329334' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42621/small.jpg?1611329334' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42621/medium.jpg?1611329334' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42621/large.jpg?1611329334' }] }, titles: { alternatives: ['Bottom-tier Character Tomozaki', 'Jakusha Character Tomozaki-kun'], canonical: 'Jaku-chara Tomozaki-kun', localized: { en: 'The Low Tier Character "Tomozaki-kun"', en_jp: 'Jaku-chara Tomozaki-kun', ja_jp: 弱キャラ友崎くん } } }, updatedAt: '2021-02-20T19:23:07Z' } +- + empty: false + title: 'Hataraku Saibou Black (TV)' + coverImg: images/anime/43167.webp + action: 'Watched episode 9' + kind: progressed + updated: '2021-02-20T13:58:33-05:00' + url: /anime/details/hataraku-saibou-black-tv + original: { id: '47012582', changedData: { progress: [8, 9] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43167', slug: hataraku-saibou-black-tv, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43167/tiny.jpg?1611330065' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43167/small.jpg?1611330065' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43167/medium.jpg?1611330065' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43167/large.jpg?1611330065' }] }, titles: { alternatives: ['Cells at Work! Code Black'], canonical: 'Hataraku Saibou Black (TV)', localized: { en_jp: 'Hataraku Saibou Black (TV)', ja_jp: はたらく細胞BLACK } } }, updatedAt: '2021-02-20T18:58:33Z' } +- + empty: false + title: 'Yes! Precure 5' + coverImg: images/anime/1742.webp + action: 'Watched episode 22' + kind: progressed + updated: '2021-02-20T13:35:49-05:00' + url: /anime/details/yes-precure-5 + original: { id: '47011542', changedData: { progress: [21, 22], time_spent: [1920, 1944] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-20T18:35:49Z' } +- + empty: false + title: 'Hataraku Saibou!!' + coverImg: images/anime/42202.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-20T09:02:18-05:00' + url: /anime/details/hataraku-saibou-2 + original: { id: '46999511', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42202', slug: hataraku-saibou-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42202/tiny.jpg?1611329853' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42202/small.jpg?1611329853' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42202/medium.jpg?1611329853' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42202/large.jpg?1611329853' }] }, titles: { alternatives: ['Hataraku Saibou!!'], canonical: 'Hataraku Saibou!!', localized: { en: 'Cells at Work! 2', en_jp: 'Hataraku Saibou!!', ja_jp: はたらく細胞!! } } }, updatedAt: '2021-02-20T14:02:18Z' } +- + empty: false + title: 'Dr. Stone: Stone Wars' + coverImg: images/anime/42867.webp + action: 'Watched episode 6' + kind: progressed + updated: '2021-02-19T07:55:58-05:00' + url: /anime/details/dr-stone-two + original: { id: '46935503', changedData: { progress: [5, 6], time_spent: [120, 144] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '42867', slug: dr-stone-two, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42867/tiny.jpg?1611329475' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42867/small.jpg?1611329475' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42867/medium.jpg?1611329475' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42867/large.jpg?1611329475' }] }, titles: { alternatives: ['Dr. Stone 2nd Season', 'Dr. Stone Second Season'], canonical: 'Dr. Stone: Stone Wars', localized: { en_jp: 'Dr. Stone: Stone Wars', ja_jp: 'ドクターストーン STONE WARS' } } }, updatedAt: '2021-02-19T12:55:58Z' } +- + empty: false + title: 'Mahou no Tenshi Creamy Mami' + coverImg: images/anime/1843.webp + action: 'Watched episodes 12-13' + kind: null + updated: '2021-02-18T12:25:49-05:00' + url: /anime/details/mahou-no-tenshi-creamy-mami + original: [{ empty: false, title: 'Mahou no Tenshi Creamy Mami', coverImg: images/anime/1843.webp, action: 'Watched episode 13', kind: progressed, updated: '2021-02-18T12:25:49-05:00', url: /anime/details/mahou-no-tenshi-creamy-mami, original: { id: '46884733', changedData: { progress: [12, 13], time_spent: [17280, 18720] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '1843', slug: mahou-no-tenshi-creamy-mami, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096' }] }, titles: { alternatives: ['Incantevole Creamy', 'Creamy Mami', 'the Magic Angel'], canonical: 'Mahou no Tenshi Creamy Mami', localized: { en: 'Magical Angel Creamy Mami', en_jp: 'Mahou no Tenshi Creamy Mami', en_us: 'Magical Angel Creamy Mami', ja_jp: '魔法の天使 クリィミーマミ' } } }, updatedAt: '2021-02-18T17:25:49Z' } }, { empty: false, title: 'Mahou no Tenshi Creamy Mami', coverImg: images/anime/1843.webp, action: 'Watched episode 12', kind: progressed, updated: '2021-02-18T08:00:42-05:00', url: /anime/details/mahou-no-tenshi-creamy-mami, original: { id: '46872813', changedData: { progress: [11, 12], time_spent: [15840, 17280] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '1843', slug: mahou-no-tenshi-creamy-mami, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096' }] }, titles: { alternatives: ['Incantevole Creamy', 'Creamy Mami', 'the Magic Angel'], canonical: 'Mahou no Tenshi Creamy Mami', localized: { en: 'Magical Angel Creamy Mami', en_jp: 'Mahou no Tenshi Creamy Mami', en_us: 'Magical Angel Creamy Mami', ja_jp: '魔法の天使 クリィミーマミ' } } }, updatedAt: '2021-02-18T13:00:42Z' } }] +- + empty: false + title: 'Yes! Precure 5' + coverImg: images/anime/1742.webp + action: 'Watched episodes 20-21' + kind: null + updated: '2021-02-17T20:06:18-05:00' + url: /anime/details/yes-precure-5 + original: [{ empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 21', kind: progressed, updated: '2021-02-17T20:06:18-05:00', url: /anime/details/yes-precure-5, original: { id: '46846704', changedData: { progress: [20, 21], time_spent: [1896, 1920] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-18T01:06:18Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 20', kind: progressed, updated: '2021-02-17T19:37:32-05:00', url: /anime/details/yes-precure-5, original: { id: '46845383', changedData: { progress: [19, 20], time_spent: [1872, 1896] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-18T00:37:32Z' } }] +- + empty: false + title: 'Urasekai Picnic' + coverImg: images/anime/43042.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-17T19:03:44-05:00' + url: /anime/details/urasekai-picnic + original: { id: '46844029', changedData: { progress: [6, 7], time_spent: [0, 1380] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '43042', slug: urasekai-picnic, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43042/tiny.jpg?1597691180' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43042/small.jpg?1597691180' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43042/medium.jpg?1597691180' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43042/large.jpg?1597691180' }] }, titles: { alternatives: ['Ura Sekai Picnic'], canonical: 'Urasekai Picnic', localized: { en_jp: 'Urasekai Picnic', en_us: 'Otherside Picnic', ja_jp: 裏世界ピクニック } } }, updatedAt: '2021-02-18T00:03:44Z' } +- + empty: false + title: 'Re:Zero kara Hajimeru Isekai Seikatsu 2nd Season Part 2' + coverImg: images/anime/43247.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-02-17T13:08:52-05:00' + url: /anime/details/rezero-season-2-part-2 + original: { id: '46824973', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43247', slug: rezero-season-2-part-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43247/tiny.jpg?1607955457' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43247/small.jpg?1607955457' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43247/medium.jpg?1607955457' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43247/large.jpg?1607955457' }] }, titles: { alternatives: ['Re:Zero - Starting Life in Another World 2 Part 2', 'Re: Life in a different world from zero 2nd Season Part 2'], canonical: 'Re:Zero kara Hajimeru Isekai Seikatsu 2nd Season Part 2', localized: { en: 'Re:ZERO -Starting Life in Another World- Season 2 Part 2', en_jp: 'Re:Zero kara Hajimeru Isekai Seikatsu 2nd Season Part 2', ja_jp: ゼロから始める異世界生活 } } }, updatedAt: '2021-02-17T18:08:52Z' } +- + empty: false + title: 'World Witches Hasshin Shimasu!' + coverImg: images/anime/43428.webp + action: 'Watched episode 6' + kind: progressed + updated: '2021-02-17T12:31:50-05:00' + url: /anime/details/world-witches-hasshin-shimasu + original: { id: '46823096', changedData: { progress: [5, 6] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43428', slug: world-witches-hasshin-shimasu, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43428/tiny.jpg?1597691212' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43428/small.jpg?1597691212' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43428/medium.jpg?1597691212' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43428/large.jpg?1597691212' }] }, titles: { alternatives: { }, canonical: 'World Witches Hasshin Shimasu!', localized: { en: 'World Witches Take Off!', en_jp: 'World Witches Hasshin Shimasu!', ja_jp: ワールドウィッチーズ発進しますっ! } } }, updatedAt: '2021-02-17T17:31:50Z' } +- + empty: false + title: 'Black Clover' + coverImg: images/anime/13209.webp + action: 'Watched episode 164' + kind: progressed + updated: '2021-02-17T08:15:11-05:00' + url: /anime/details/black-clover-tv + original: { id: '46811062', changedData: { progress: [163, 164], time_spent: [233040, 234470] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13209', slug: black-clover-tv, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13209/tiny.jpg?1611504643' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13209/small.jpg?1611504643' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13209/medium.jpg?1611504643' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13209/large.jpg?1611504643' }] }, titles: { alternatives: { }, canonical: 'Black Clover', localized: { en: 'Black Clover', en_jp: 'Black Clover', ja_jp: ブラッククローバー } } }, updatedAt: '2021-02-17T13:15:11Z' } +- + empty: false + title: 'Tensei shitara Slime Datta Ken 2' + coverImg: images/anime/42196.webp + action: 'Watched episode 6' + kind: progressed + updated: '2021-02-17T07:49:21-05:00' + url: /anime/details/tensei-shitara-slime-datta-ken-2 + original: { id: '46809985', changedData: { progress: [5, 6] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '42196', slug: tensei-shitara-slime-datta-ken-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42196/tiny.jpg?1597691848' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42196/small.jpg?1597691848' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42196/medium.jpg?1597691848' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42196/large.jpg?1597691848' }] }, titles: { alternatives: ['TenSura 2', 'Tensei Shitara Slime Datta Ken 2nd Season Part 1'], canonical: 'Tensei shitara Slime Datta Ken 2', localized: { en: 'That Time I Got Reincarnated as a Slime 2', en_jp: 'Tensei shitara Slime Datta Ken 2', ja_jp: 転生したらスライムだった件2 } } }, updatedAt: '2021-02-17T12:49:21Z' } +- + empty: false + title: 'Mahou no Tenshi Creamy Mami' + coverImg: images/anime/1843.webp + action: 'Watched episode 11' + kind: progressed + updated: '2021-02-16T15:40:55-05:00' + url: /anime/details/mahou-no-tenshi-creamy-mami + original: { id: '46770266', changedData: { progress: [10, 11], time_spent: [14400, 15840] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '1843', slug: mahou-no-tenshi-creamy-mami, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096' }] }, titles: { alternatives: ['Incantevole Creamy', 'Creamy Mami', 'the Magic Angel'], canonical: 'Mahou no Tenshi Creamy Mami', localized: { en: 'Magical Angel Creamy Mami', en_jp: 'Mahou no Tenshi Creamy Mami', en_us: 'Magical Angel Creamy Mami', ja_jp: '魔法の天使 クリィミーマミ' } } }, updatedAt: '2021-02-16T20:40:55Z' } +- + empty: false + title: 'Shin Chuuka Ichiban! 2nd Season' + coverImg: images/anime/43825.webp + action: 'Watched episode 6' + kind: progressed + updated: '2021-02-16T12:28:40-05:00' + url: /anime/details/shin-chuuka-ichiban-2nd-season + original: { id: '46761075', changedData: { progress: [5, 6] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43825', slug: shin-chuuka-ichiban-2nd-season, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43825/tiny.jpg?1609082225' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43825/small.jpg?1609082225' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43825/medium.jpg?1609082225' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43825/large.jpg?1609082225' }] }, titles: { alternatives: ['New Cooking Master Boy!'], canonical: 'Shin Chuuka Ichiban! 2nd Season', localized: { en: 'True Cooking Master Boy Season 2', en_jp: 'Shin Chuuka Ichiban! 2nd Season', ja_jp: 真・中華一番! } } }, updatedAt: '2021-02-16T17:28:40Z' } +- + empty: false + title: 'Yes! Precure 5' + coverImg: images/anime/1742.webp + action: 'Watched episode 19' + kind: progressed + updated: '2021-02-15T17:49:37-05:00' + url: /anime/details/yes-precure-5 + original: { id: '46716267', changedData: { progress: [18, 19], time_spent: [1848, 1872] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-15T22:49:37Z' } +- + empty: false + title: 'Hataraku Saibou Black (TV)' + coverImg: images/anime/43167.webp + action: 'Watched episode 6' + kind: progressed + updated: '2021-01-30T11:09:51-05:00' + url: /anime/details/hataraku-saibou-black-tv + original: { id: '45746341', changedData: { progress: [5, 6] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43167', slug: hataraku-saibou-black-tv, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43167/tiny.jpg?1611330065' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43167/small.jpg?1611330065' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43167/medium.jpg?1611330065' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43167/large.jpg?1611330065' }] }, titles: { alternatives: ['Cells at Work! Code Black'], canonical: 'Hataraku Saibou Black (TV)', localized: { en_jp: 'Hataraku Saibou Black (TV)', ja_jp: はたらく細胞BLACK } } }, updatedAt: '2021-01-30T16:09:51Z' } +- + empty: false + title: 'Hataraku Saibou!!' + coverImg: images/anime/42202.webp + action: 'Watched episode 4' + kind: progressed + updated: '2021-01-30T10:40:47-05:00' + url: /anime/details/hataraku-saibou-2 + original: { id: '45745352', changedData: { progress: [3, 4] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42202', slug: hataraku-saibou-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42202/tiny.jpg?1611329853' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42202/small.jpg?1611329853' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42202/medium.jpg?1611329853' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42202/large.jpg?1611329853' }] }, titles: { alternatives: ['Hataraku Saibou!!'], canonical: 'Hataraku Saibou!!', localized: { en: 'Cells at Work! 2', en_jp: 'Hataraku Saibou!!', ja_jp: はたらく細胞!! } } }, updatedAt: '2021-01-30T15:40:47Z' } +- + empty: false + title: 'Yes! Precure 5' + coverImg: images/anime/1742.webp + action: 'Watched episode 9' + kind: progressed + updated: '2021-01-29T13:26:49-05:00' + url: /anime/details/yes-precure-5 + original: { id: '45691191', changedData: { progress: [8, 9], time_spent: [1608, 1632] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-29T18:26:49Z' } +- + empty: false + title: 'Mahou no Tenshi Creamy Mami' + coverImg: images/anime/1843.webp + action: 'Watched episodes 1-2' + kind: null + updated: '2021-01-28T12:57:44-05:00' + url: /anime/details/mahou-no-tenshi-creamy-mami + original: [{ empty: false, title: 'Mahou no Tenshi Creamy Mami', coverImg: images/anime/1843.webp, action: 'Watched episode 2', kind: progressed, updated: '2021-01-28T12:57:44-05:00', url: /anime/details/mahou-no-tenshi-creamy-mami, original: { id: '45636802', changedData: { progress: [1, 2], time_spent: [1440, 2880] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '1843', slug: mahou-no-tenshi-creamy-mami, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096' }] }, titles: { alternatives: ['Incantevole Creamy', 'Creamy Mami', 'the Magic Angel'], canonical: 'Mahou no Tenshi Creamy Mami', localized: { en: 'Magical Angel Creamy Mami', en_jp: 'Mahou no Tenshi Creamy Mami', en_us: 'Magical Angel Creamy Mami', ja_jp: '魔法の天使 クリィミーマミ' } } }, updatedAt: '2021-01-28T17:57:44Z' } }, { empty: false, title: 'Mahou no Tenshi Creamy Mami', coverImg: images/anime/1843.webp, action: 'Watched episode 1', kind: progressed, updated: '2021-01-28T08:19:49-05:00', url: /anime/details/mahou-no-tenshi-creamy-mami, original: { id: '45626831', changedData: { progress: [0, 1], time_spent: [0, 1440] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '1843', slug: mahou-no-tenshi-creamy-mami, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096' }] }, titles: { alternatives: ['Incantevole Creamy', 'Creamy Mami', 'the Magic Angel'], canonical: 'Mahou no Tenshi Creamy Mami', localized: { en: 'Magical Angel Creamy Mami', en_jp: 'Mahou no Tenshi Creamy Mami', en_us: 'Magical Angel Creamy Mami', ja_jp: '魔法の天使 クリィミーマミ' } } }, updatedAt: '2021-01-28T13:19:49Z' } }] +- + empty: false + title: 'Urasekai Picnic' + coverImg: images/anime/43042.webp + action: 'Watched episode 4' + kind: progressed + updated: '2021-01-28T07:49:24-05:00' + url: /anime/details/urasekai-picnic + original: { id: '45625945', changedData: { progress: [3, 4] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '43042', slug: urasekai-picnic, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43042/tiny.jpg?1597691180' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43042/small.jpg?1597691180' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43042/medium.jpg?1597691180' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43042/large.jpg?1597691180' }] }, titles: { alternatives: ['Ura Sekai Picnic'], canonical: 'Urasekai Picnic', localized: { en_jp: 'Urasekai Picnic', en_us: 'Otherside Picnic', ja_jp: 裏世界ピクニック } } }, updatedAt: '2021-01-28T12:49:24Z' } +- + empty: false + title: 'Tensei shitara Slime Datta Ken 2' + coverImg: images/anime/42196.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-27T13:06:29-05:00' + url: /anime/details/tensei-shitara-slime-datta-ken-2 + original: { id: '45585487', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '42196', slug: tensei-shitara-slime-datta-ken-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42196/tiny.jpg?1597691848' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42196/small.jpg?1597691848' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42196/medium.jpg?1597691848' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42196/large.jpg?1597691848' }] }, titles: { alternatives: ['TenSura 2', 'Tensei Shitara Slime Datta Ken 2nd Season Part 1'], canonical: 'Tensei shitara Slime Datta Ken 2', localized: { en: 'That Time I Got Reincarnated as a Slime 2', en_jp: 'Tensei shitara Slime Datta Ken 2', ja_jp: 転生したらスライムだった件2 } } }, updatedAt: '2021-01-27T18:06:29Z' } +- + empty: false + title: 'Yes! Precure 5' + coverImg: images/anime/1742.webp + action: 'Watched episode 8' + kind: progressed + updated: '2021-01-27T07:54:31-05:00' + url: /anime/details/yes-precure-5 + original: { id: '45572019', changedData: { progress: [7, 8], time_spent: [1584, 1608] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-27T12:54:31Z' } +- + empty: false + title: 'Black Clover' + coverImg: images/anime/13209.webp + action: 'Watched episode 161' + kind: progressed + updated: '2021-01-27T07:24:48-05:00' + url: /anime/details/black-clover-tv + original: { id: '45571028', changedData: { progress: [160, 161], time_spent: [228750, 230180] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13209', slug: black-clover-tv, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13209/tiny.jpg?1611504643' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13209/small.jpg?1611504643' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13209/medium.jpg?1611504643' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13209/large.jpg?1611504643' }] }, titles: { alternatives: { }, canonical: 'Black Clover', localized: { en: 'Black Clover', en_jp: 'Black Clover', ja_jp: ブラッククローバー } } }, updatedAt: '2021-01-27T12:24:48Z' } +- + empty: false + title: 'World Witches Hasshin Shimasu!' + coverImg: images/anime/43428.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-26T13:01:38-05:00' + url: /anime/details/world-witches-hasshin-shimasu + original: { id: '45529665', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43428', slug: world-witches-hasshin-shimasu, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43428/tiny.jpg?1597691212' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43428/small.jpg?1597691212' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43428/medium.jpg?1597691212' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43428/large.jpg?1597691212' }] }, titles: { alternatives: { }, canonical: 'World Witches Hasshin Shimasu!', localized: { en: 'World Witches Take Off!', en_jp: 'World Witches Hasshin Shimasu!', ja_jp: ワールドウィッチーズ発進しますっ! } } }, updatedAt: '2021-01-26T18:01:38Z' } +- + empty: false + title: 'Shin Chuuka Ichiban! 2nd Season' + coverImg: images/anime/43825.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-26T12:49:04-05:00' + url: /anime/details/shin-chuuka-ichiban-2nd-season + original: { id: '45529168', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43825', slug: shin-chuuka-ichiban-2nd-season, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43825/tiny.jpg?1609082225' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43825/small.jpg?1609082225' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43825/medium.jpg?1609082225' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43825/large.jpg?1609082225' }] }, titles: { alternatives: ['New Cooking Master Boy!'], canonical: 'Shin Chuuka Ichiban! 2nd Season', localized: { en: 'True Cooking Master Boy Season 2', en_jp: 'Shin Chuuka Ichiban! 2nd Season', ja_jp: 真・中華一番! } } }, updatedAt: '2021-01-26T17:49:04Z' } +- + empty: false + title: 'Tatoeba Last Dungeon Mae no Mura no Shounen ga Joban no Machi de Kurasu Youna Monogatari' + coverImg: images/anime/42635.webp + action: 'Watched episode 4' + kind: progressed + updated: '2021-01-25T12:56:13-05:00' + url: /anime/details/tatoeba-last-dungeon-mae-no-mura-no-shounen-ga-joban-no-machi-de-kurasu-youna-monogatari + original: { id: '45471756', changedData: { progress: [3, 4] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42635', slug: tatoeba-last-dungeon-mae-no-mura-no-shounen-ga-joban-no-machi-de-kurasu-youna-monogatari, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42635/tiny.jpg?1571504181' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42635/small.jpg?1571504181' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42635/medium.jpg?1571504181' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42635/large.jpg?1571504181' }] }, titles: { alternatives: ['Suppose a Kid from the Last Dungeon Boonies Moved to a Starter Town'], canonical: 'Tatoeba Last Dungeon Mae no Mura no Shounen ga Joban no Machi de Kurasu Youna Monogatari', localized: { en_jp: 'Tatoeba Last Dungeon Mae no Mura no Shounen ga Joban no Machi de Kurasu Youna Monogatari', ja_jp: たとえばラストダンジョン前の村の少年が序盤の街で暮らすような物語 } } }, updatedAt: '2021-01-25T17:56:13Z' } +- + empty: false + title: 'Healin'' Good♡Precure' + coverImg: images/anime/42650.webp + action: 'Watched episode 41' + kind: progressed + updated: '2021-01-25T12:29:55-05:00' + url: /anime/details/healin-good-precure + original: { id: '45470609', changedData: { progress: [40, 41], time_spent: [57600, 59040] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42650', slug: healin-good-precure, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42650/tiny.jpg?1578070083' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42650/small.jpg?1578070083' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42650/medium.jpg?1578070083' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42650/large.jpg?1578070083' }] }, titles: { alternatives: { }, canonical: 'Healin'' Good♡Precure', localized: { en: 'Healin'' Good Pretty Cure', en_jp: 'Healin'' Good♡Precure', ja_jp: ヒーリングっど♡プリキュア } } }, updatedAt: '2021-01-25T17:29:55Z' } +- + empty: false + title: 'Kai Byoui Ramune' + coverImg: images/anime/43818.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-25T12:05:16-05:00' + url: /anime/details/kai-byoui-ramune + original: { id: '45469463', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '43818', slug: kai-byoui-ramune, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43818/tiny.jpg?1608544506' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43818/small.jpg?1608544506' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43818/medium.jpg?1608544506' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43818/large.jpg?1608544506' }] }, titles: { alternatives: { }, canonical: 'Kai Byoui Ramune', localized: { en: 'Dr. Ramune -Mysterious Disease Specialist-', en_jp: 'Kai Byoui Ramune', ja_jp: 怪病医ラムネ } } }, updatedAt: '2021-01-25T17:05:16Z' } +- + empty: false + title: 'Yes! Precure 5' + coverImg: images/anime/1742.webp + action: 'Watched episode 7' + kind: progressed + updated: '2021-01-24T20:16:10-05:00' + url: /anime/details/yes-precure-5 + original: { id: '45433091', changedData: { progress: [6, 7], time_spent: [1560, 1584] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-25T01:16:10Z' } +- + empty: false + title: 'Mushoku Tensei: Isekai Ittara Honki Dasu' + coverImg: images/anime/42323.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-24T19:52:32-05:00' + url: /anime/details/mushoku-tensei-isekai-ittara-honki-dasu + original: { id: '45431671', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: 'The pervert aspect of this dampens my enjoyment. ' }, media: { __typename: Anime, id: '42323', slug: mushoku-tensei-isekai-ittara-honki-dasu, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42323/tiny.jpg?1571408000' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42323/small.jpg?1571408000' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42323/medium.jpg?1571408000' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42323/large.jpg?1571408000' }] }, titles: { alternatives: { }, canonical: 'Mushoku Tensei: Isekai Ittara Honki Dasu', localized: { en: 'Mushoku Tensei: Jobless Reincarnation', en_jp: 'Mushoku Tensei: Isekai Ittara Honki Dasu', ja_jp: '無職転生 ~異世界行ったら本気だす~' } } }, updatedAt: '2021-01-25T00:52:32Z' } +- + empty: false + title: Horimiya + coverImg: images/anime/43545.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-24T19:26:33-05:00' + url: /anime/details/horimiya + original: { id: '45430382', changedData: { progress: [2, 3], time_spent: [0, 1380] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43545', slug: horimiya, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43545/tiny.jpg?1609224996' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43545/small.jpg?1609224996' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43545/medium.jpg?1609224996' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43545/large.jpg?1609224996' }] }, titles: { alternatives: { }, canonical: Horimiya, localized: { en_jp: Horimiya, ja_jp: ホリミヤ } } }, updatedAt: '2021-01-25T00:26:33Z' } +- + empty: false + title: 'Yes! Precure 5' + coverImg: images/anime/1742.webp + action: 'Marathoned episodes 1-6' + kind: null + updated: '2021-01-23T19:18:29-05:00' + url: /anime/details/yes-precure-5 + original: [{ empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 6', kind: progressed, updated: '2021-01-23T19:18:29-05:00', url: /anime/details/yes-precure-5, original: { id: '45370466', changedData: { progress: [5, 6], time_spent: [1536, 1560] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-24T00:18:29Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 5', kind: progressed, updated: '2021-01-23T18:53:47-05:00', url: /anime/details/yes-precure-5, original: { id: '45369278', changedData: { progress: [4, 5], time_spent: [1512, 1536] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T23:53:47Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 4', kind: progressed, updated: '2021-01-23T18:29:37-05:00', url: /anime/details/yes-precure-5, original: { id: '45368222', changedData: { progress: [3, 4], time_spent: [1488, 1512] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T23:29:37Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 3', kind: progressed, updated: '2021-01-23T17:48:17-05:00', url: /anime/details/yes-precure-5, original: { id: '45366144', changedData: { progress: [2, 3], time_spent: [1464, 1488] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T22:48:17Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 2', kind: progressed, updated: '2021-01-23T17:25:36-05:00', url: /anime/details/yes-precure-5, original: { id: '45364651', changedData: { progress: [1, 2], time_spent: [1440, 1464] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T22:25:36Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 1', kind: progressed, updated: '2021-01-23T16:56:50-05:00', url: /anime/details/yes-precure-5, original: { id: '45363270', changedData: { progress: [0, 1], time_spent: [0, 1440] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T21:56:50Z' } }] +- + empty: false + title: 'Yes! Precure 5' + coverImg: images/anime/1742.webp + action: 'Currently Watching' + kind: updated + updated: '2021-01-23T16:32:39-05:00' + url: /anime/details/yes-precure-5 + original: { id: '45361701', changedData: { status: [planned] }, kind: UPDATED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T21:32:39Z' } +- + empty: false + title: 'Futari wa Precure: Splash☆Star' + coverImg: images/anime/1375.webp + action: Completed + kind: updated + updated: '2021-01-23T16:20:56-05:00' + url: /anime/details/futari-wa-precure-splash-star + original: { id: '45361017', changedData: { status: [current] }, kind: UPDATED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T21:20:56Z' } +- + empty: false + title: 'Futari wa Precure: Splash☆Star' + coverImg: images/anime/1375.webp + action: 'Marathoned episodes 45-49' + kind: null + updated: '2021-01-23T16:20:56-05:00' + url: /anime/details/futari-wa-precure-splash-star + original: [{ empty: false, title: 'Futari wa Precure: Splash☆Star', coverImg: images/anime/1375.webp, action: 'Watched episode 49', kind: progressed, updated: '2021-01-23T16:20:56-05:00', url: /anime/details/futari-wa-precure-splash-star, original: { id: '45361016', changedData: { progress: [48, 49], time_spent: [2568, 2592] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T21:20:56Z' } }, { empty: false, title: 'Futari wa Precure: Splash☆Star', coverImg: images/anime/1375.webp, action: 'Watched episode 48', kind: progressed, updated: '2021-01-23T16:00:16-05:00', url: /anime/details/futari-wa-precure-splash-star, original: { id: '45359950', changedData: { progress: [47, 48], time_spent: [2544, 2568] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T21:00:16Z' } }, { empty: false, title: 'Futari wa Precure: Splash☆Star', coverImg: images/anime/1375.webp, action: 'Watched episode 47', kind: progressed, updated: '2021-01-23T15:35:56-05:00', url: /anime/details/futari-wa-precure-splash-star, original: { id: '45358544', changedData: { progress: [46, 47], time_spent: [2520, 2544] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T20:35:56Z' } }, { empty: false, title: 'Futari wa Precure: Splash☆Star', coverImg: images/anime/1375.webp, action: 'Watched episode 46', kind: progressed, updated: '2021-01-23T13:36:34-05:00', url: /anime/details/futari-wa-precure-splash-star, original: { id: '45352462', changedData: { progress: [45, 46], time_spent: [2496, 2520] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T18:36:34Z' } }, { empty: false, title: 'Futari wa Precure: Splash☆Star', coverImg: images/anime/1375.webp, action: 'Watched episode 45', kind: progressed, updated: '2021-01-23T13:10:06-05:00', url: /anime/details/futari-wa-precure-splash-star, original: { id: '45351234', changedData: { progress: [44, 45], time_spent: [2472, 2496] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T18:10:06Z' } }] +- + empty: false + title: 'Hanyou no Yashahime: Sengoku Otogizoushi' + coverImg: images/anime/43180.webp + action: 'Watched episode 16' + kind: progressed + updated: '2021-01-23T12:40:53-05:00' + url: /anime/details/hanyou-no-yasha-hime + original: { id: '45350120', changedData: { progress: [15, 16] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: 'InuYasha universe, mostly a different cast.' }, media: { __typename: Anime, id: '43180', slug: hanyou-no-yasha-hime, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43180/tiny.jpg?1589037137' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43180/small.jpg?1589037137' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43180/medium.jpg?1589037137' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43180/large.jpg?1589037137' }] }, titles: { alternatives: ['Inuyasha: Hanyou no Yasha Hime'], canonical: 'Hanyou no Yashahime: Sengoku Otogizoushi', localized: { en: 'Yashahime: Princess Half-Demon', en_jp: 'Hanyou no Yashahime: Sengoku Otogizoushi', ja_jp: 半妖の夜叉姫 } } }, updatedAt: '2021-01-23T17:40:53Z' } +- + empty: false + title: 'Ore dake Haireru Kakushi Dungeon' + coverImg: images/anime/43301.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-23T12:07:59-05:00' + url: /anime/details/ore-dake-haireru-kakushi-dungeon + original: { id: '45348842', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43301', slug: ore-dake-haireru-kakushi-dungeon, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43301/tiny.jpg?1607696005' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43301/small.jpg?1607696005' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43301/medium.jpg?1607696005' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43301/large.jpg?1607696005' }] }, titles: { alternatives: ['Special training in the Secret Dungeon', 'Ore Dake Haireru Kakushi Dungeon: Kossori Kitaete Sekai Saikyou'], canonical: 'Ore dake Haireru Kakushi Dungeon', localized: { en: 'The Hidden Dungeon Only I Can Enter', en_jp: 'Ore dake Haireru Kakushi Dungeon', ja_jp: 俺だけ入れる隠しダンジョン } } }, updatedAt: '2021-01-23T17:07:59Z' } +- + empty: false + title: 'Otona no Bouguya-san 2nd Season' + coverImg: images/anime/43569.webp + action: 'Watched episode 4' + kind: progressed + updated: '2021-01-23T11:36:34-05:00' + url: /anime/details/otona-no-bouguya-san-2nd-season + original: { id: '45347598', changedData: { progress: [3, 4] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43569', slug: otona-no-bouguya-san-2nd-season, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43569/tiny.jpg?1601057792' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43569/small.jpg?1601057792' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43569/medium.jpg?1601057792' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43569/large.jpg?1601057792' }] }, titles: { alternatives: { }, canonical: 'Otona no Bouguya-san 2nd Season', localized: { en: 'Armor Shop for Ladies & Gentlemen 2nd Season', en_jp: 'Otona no Bouguya-san 2nd Season', ja_jp: 'おとなの防具屋さん 第2シリーズ' } } }, updatedAt: '2021-01-23T16:36:34Z' } +- + empty: false + title: 'Inu to Neko Docchi mo Katteru to Mainichi Tanoshii' + coverImg: images/anime/43550.webp + action: 'Watched episode 15' + kind: progressed + updated: '2021-01-23T11:36:07-05:00' + url: /anime/details/inu-to-neko-docchi-mo-katteru-to-mainichi-tanoshii + original: { id: '45347581', changedData: { progress: [14, 15], time_spent: [120, 180] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43550', slug: inu-to-neko-docchi-mo-katteru-to-mainichi-tanoshii, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43550/tiny.jpg?1600679941' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43550/small.jpg?1600679941' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43550/medium.jpg?1600679941' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43550/large.jpg?1600679941' }] }, titles: { alternatives: { }, canonical: 'Inu to Neko Docchi mo Katteru to Mainichi Tanoshii', localized: { en: 'With a Dog and a Cat, Every Day is Fun', en_jp: 'Inu to Neko Docchi mo Katteru to Mainichi Tanoshii', ja_jp: 犬と猫どっちも飼ってると毎日たのしい } } }, updatedAt: '2021-01-23T16:36:07Z' } +- + empty: false + title: 'Kumo desu ga, Nani ka?' + coverImg: images/anime/41463.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-23T11:18:43-05:00' + url: /anime/details/kumo-desu-ga-nani-ka + original: { id: '45346956', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '41463', slug: kumo-desu-ga-nani-ka, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/41463/tiny.jpg?1593607925' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/41463/small.jpg?1593607925' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/41463/medium.jpg?1593607925' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/41463/large.jpg?1593607925' }] }, titles: { alternatives: { }, canonical: 'Kumo desu ga, Nani ka?', localized: { en: 'So I''m a Spider, So What?', en_jp: 'Kumo desu ga, Nani ka?', ja_jp: 蜘蛛ですが、なにか? } } }, updatedAt: '2021-01-23T16:18:43Z' } +- + empty: false + title: '5-toubun no Hanayome ∬' + coverImg: images/anime/42324.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-23T10:57:01-05:00' + url: /anime/details/5-toubun-no-hanayome-2 + original: { id: '45346222', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42324', slug: 5-toubun-no-hanayome-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42324/tiny.jpg?1597697087' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42324/small.jpg?1597697087' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42324/medium.jpg?1597697087' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42324/large.jpg?1597697087' }] }, titles: { alternatives: ['Gotoubun no Hanayome 2', 'The Five Wedded Brides 2', '5-Toubun no Hanayome 2'], canonical: '5-toubun no Hanayome ∬', localized: { en: 'The Quintessential Quintuplets 2', en_jp: '5-toubun no Hanayome ∬', ja_jp: 五等分の花嫁∬ } } }, updatedAt: '2021-01-23T15:57:01Z' } +- + empty: false + title: 'Tenchi Souzou Design-bu' + coverImg: images/anime/43137.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-23T09:28:05-05:00' + url: /anime/details/tenchi-souzou-design-bu + original: { id: '45343004', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43137', slug: tenchi-souzou-design-bu, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43137/tiny.jpg?1611330634' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43137/small.jpg?1611330634' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43137/medium.jpg?1611330634' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43137/large.jpg?1611330634' }] }, titles: { alternatives: ['[Ten-De-Bu] What a strange animal!', Tendebu], canonical: 'Tenchi Souzou Design-bu', localized: { en: 'Heaven''s Design Team', en_jp: 'Tenchi Souzou Design-bu', ja_jp: 天地創造デザイン部 } } }, updatedAt: '2021-01-23T14:28:05Z' } +- + empty: false + title: 'Yuru Camp△ 2' + coverImg: images/anime/41976.webp + action: 'Watched episode 3' + kind: progressed + updated: '2021-01-23T09:04:48-05:00' + url: /anime/details/yuru-camp-2 + original: { id: '45342210', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '41976', slug: yuru-camp-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/41976/tiny.jpg?1611329947' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/41976/small.jpg?1611329947' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/41976/medium.jpg?1611329947' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/41976/large.jpg?1611329947' }] }, titles: { alternatives: { }, canonical: 'Yuru Camp△ 2', localized: { en: 'Laid-Back Camp 2', en_jp: 'Yuru Camp△ 2', ja_jp: 'ゆるキャン△ 2' } } }, updatedAt: '2021-01-23T14:04:48Z' } +- + empty: false + title: 'Dr. Stone: Stone Wars' + coverImg: images/anime/42867.webp + action: 'Watched episode 2' + kind: progressed + updated: '2021-01-23T08:27:39-05:00' + url: /anime/details/dr-stone-two + original: { id: '45341107', changedData: { progress: [1, 2], time_spent: [24, 48] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '42867', slug: dr-stone-two, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42867/tiny.jpg?1611329475' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42867/small.jpg?1611329475' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42867/medium.jpg?1611329475' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42867/large.jpg?1611329475' }] }, titles: { alternatives: ['Dr. Stone 2nd Season', 'Dr. Stone Second Season'], canonical: 'Dr. Stone: Stone Wars', localized: { en_jp: 'Dr. Stone: Stone Wars', ja_jp: 'ドクターストーン STONE WARS' } } }, updatedAt: '2021-01-23T13:27:39Z' } +- + empty: false + title: 'Gakuen Babysitters' + coverImg: images/anime/13265.webp + action: 'Watched episode 7' + kind: progressed + updated: '2018-02-24T10:05:35-05:00' + url: /anime/details/gakuen-babysitters + original: { id: '5096548', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13265', slug: gakuen-babysitters, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13265/tiny.jpg?1597692098' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13265/small.jpg?1597692098' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13265/medium.jpg?1597692098' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13265/large.jpg?1597692098' }] }, titles: { alternatives: { }, canonical: 'Gakuen Babysitters', localized: { en: 'School Babysitters', en_jp: 'Gakuen Babysitters', en_us: 'School Babysitters', ja_jp: 学園ベビーシッターズ } } }, updatedAt: '2018-02-24T15:05:35Z' } +- + empty: false + title: 'Ryuuou no Oshigoto!' + coverImg: images/anime/13661.webp + action: 'Watched episode 7' + kind: progressed + updated: '2018-02-24T10:31:29-05:00' + url: /anime/details/ryuuou-no-oshigoto + original: { id: '5096816', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13661', slug: ryuuou-no-oshigoto, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13661/tiny.jpg?1597698518' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13661/small.jpg?1597698518' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13661/medium.jpg?1597698518' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13661/large.jpg?1597698518' }] }, titles: { alternatives: ['Ryuoh no Oshigoto'], canonical: 'Ryuuou no Oshigoto!', localized: { en: 'The Ryuo’s Work is Never Done!', en_jp: 'Ryuuou no Oshigoto!', en_us: 'The Ryuo''s Work is Never Done!', ja_jp: りゅうおうのおしごと! } } }, updatedAt: '2018-02-24T15:31:29Z' } +- + empty: false + title: 'Karakai Jouzu no Takagi-san' + coverImg: images/anime/13635.webp + action: 'Watched episode 7' + kind: progressed + updated: '2018-02-24T10:54:16-05:00' + url: /anime/details/karakai-jouzu-no-takagi-san + original: { id: '5096938', changedData: { progress: [6, 7], time_spent: [384, 408] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13635', slug: karakai-jouzu-no-takagi-san, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13635/tiny.jpg?1597691135' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13635/small.jpg?1597691135' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13635/medium.jpg?1597691135' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13635/large.jpg?1597691135' }] }, titles: { alternatives: ['Skilled Teaser Takagi-san'], canonical: 'Karakai Jouzu no Takagi-san', localized: { en: 'Teasing Master Takagi-san', en_jp: 'Karakai Jouzu no Takagi-san', ja_jp: からかい上手の高木さん } } }, updatedAt: '2018-02-24T15:54:16Z' } +- + empty: false + title: 'Kaijuu Girls: Ultra Kaijuu Gijinka Keikaku 2nd Season' + coverImg: images/anime/14152.webp + action: 'Watched episode 7' + kind: progressed + updated: '2018-02-24T10:56:09-05:00' + url: /anime/details/kaijuu-girls-ultra-kaijuu-gijinka-keikaku-2nd-season + original: { id: '5096963', changedData: { progress: [6, 7], time_spent: [35, 40] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '14152', slug: kaijuu-girls-ultra-kaijuu-gijinka-keikaku-2nd-season, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/14152/tiny.jpg?1597691494' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/14152/small.jpg?1597691494' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/14152/medium.jpg?1597691494' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/14152/large.jpg?1597691494' }] }, titles: { alternatives: { }, canonical: 'Kaijuu Girls: Ultra Kaijuu Gijinka Keikaku 2nd Season', localized: { en_jp: 'Kaijuu Girls: Ultra Kaijuu Gijinka Keikaku 2nd Season', ja_jp: '怪獣娘~ウルトラ怪獣擬人化計画~ 第2期' } } }, updatedAt: '2018-02-24T15:56:09Z' } +- + empty: false + title: 'Black Clover' + coverImg: images/anime/13209.webp + action: 'Watched episode 20' + kind: progressed + updated: '2018-02-24T11:36:16-05:00' + url: /anime/details/black-clover-tv + original: { id: '5097284', changedData: { progress: [19, 20], time_spent: [1344, 1368] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13209', slug: black-clover-tv, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13209/tiny.jpg?1611504643' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13209/small.jpg?1611504643' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13209/medium.jpg?1611504643' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13209/large.jpg?1611504643' }] }, titles: { alternatives: { }, canonical: 'Black Clover', localized: { en: 'Black Clover', en_jp: 'Black Clover', ja_jp: ブラッククローバー } } }, updatedAt: '2018-02-24T16:36:16Z' } +- + empty: false + title: 'A Place Further Than the Universe' + coverImg: images/anime/13615.webp + action: 'Watched episode 8' + kind: progressed + updated: '2018-02-24T12:02:06-05:00' + url: /anime/details/a-place-further-than-the-universe + original: { id: '5097527', changedData: { progress: [7, 8] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13615', slug: a-place-further-than-the-universe, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13615/tiny.jpg?1597696818' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13615/small.jpg?1597696818' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13615/medium.jpg?1597696818' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13615/large.jpg?1597696818' }] }, titles: { alternatives: ['Uchuu yori mo Tooi Basho', 'A Story That Leads to the Antarctica', 'Sora Yorimo Tōi Basho', Yorimoi], canonical: 'A Place Further Than the Universe', localized: { en: 'A Place Further Than the Universe', en_jp: 'Sora yori mo Tooi Basho', en_us: 'A Place Further Than The Universe', ja_jp: 宇宙よりも遠い場所 } } }, updatedAt: '2018-02-24T17:02:06Z' } +- + empty: false + title: 'Overlord II' + coverImg: images/anime/13237.webp + action: 'Watched episode 7' + kind: progressed + updated: '2018-02-24T12:38:38-05:00' + url: /anime/details/overlord-ii + original: { id: '5097839', changedData: { progress: [6, 7], time_spent: [432, 456] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13237', slug: overlord-ii, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13237/tiny.jpg?1597694945' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13237/small.jpg?1597694945' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13237/medium.jpg?1597694945' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13237/large.jpg?1597694945' }] }, titles: { alternatives: { }, canonical: 'Overlord II', localized: { en_jp: 'Overlord II', en_us: 'Overlord II', ja_jp: オーバーロードⅡ } } }, updatedAt: '2018-02-24T17:38:38Z' } +- + empty: false + title: 'Hitori no Shita: The Outcast 2nd Season' + coverImg: images/anime/13885.webp + action: 'Watched episode 6' + kind: progressed + updated: '2018-02-24T13:10:32-05:00' + url: /anime/details/hitori-no-shita-the-outcast-2nd-season + original: { id: '5098167', changedData: { progress: [5, 6], time_spent: [96, 120] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13885', slug: hitori-no-shita-the-outcast-2nd-season, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13885/tiny.jpg?1517377133' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13885/small.jpg?1517377133' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13885/medium.jpg?1517377133' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13885/large.jpg?1517377133' }] }, titles: { alternatives: ['hitorinoshita - The Outcast'], canonical: 'Hitori no Shita: The Outcast 2nd Season', localized: { en: 'Hitori no Shita - The Outcast 2', en_jp: 'Hitori no Shita: The Outcast 2nd Season', en_us: 'Hitori no Shita - The Outcast 2', ja_jp: '一人之下 THE OUTCAST 2ndシーズン' } } }, updatedAt: '2018-02-24T18:10:32Z' } +- + empty: false + title: 'Ramen Daisuki Koizumi-san' + coverImg: images/anime/13531.webp + action: 'Watched episode 8' + kind: progressed + updated: '2018-02-24T13:32:09-05:00' + url: /anime/details/ramen-daisuki-koizumi-san + original: { id: '5098364', changedData: { progress: [7, 8] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13531', slug: ramen-daisuki-koizumi-san, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13531/tiny.jpg?1597698994' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13531/small.jpg?1597698994' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13531/medium.jpg?1597698994' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13531/large.jpg?1597698994' }] }, titles: { alternatives: { }, canonical: 'Ramen Daisuki Koizumi-san', localized: { en: 'Ms. Koizumi Loves Ramen Noodles', en_jp: 'Ramen Daisuki Koizumi-san', en_us: 'Ms. Koizumi Loves Ramen Noodles', ja_jp: ラーメン大好き小泉さん } } }, updatedAt: '2018-02-24T18:32:09Z' } diff --git a/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/HistoryTransformerTest__testMangaTransform__1.yml b/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/HistoryTransformerTest__testMangaTransform__1.yml new file mode 100644 index 00000000..f7bcb871 --- /dev/null +++ b/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/HistoryTransformerTest__testMangaTransform__1.yml @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/PersonTransformerTest__testTransform__1.yml b/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/PersonTransformerTest__testTransform__1.yml new file mode 100644 index 00000000..f87b5181 --- /dev/null +++ b/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/PersonTransformerTest__testTransform__1.yml @@ -0,0 +1,12 @@ +empty: false +id: '468' +name: 'Ayako Kawasumi' +names: + ja_jp: '川澄 綾子' +description: "

Birth Place: Tokyo, Japan
\r\nBlood Type: B
\r\nHeight: 157cm
\r\nAstrological sign: Aries
\r\nNicknames: Ayachii (あやちー), Ayasumi (あやすみ), Aya-nee (あやねえ)
\r\n
\r\nFavorites: Yakult Swallows (baseball team)
\r\nHobbies: Cooking, Scuba diving, Yoga
\r\nSkills: Playing the Piano

" +characters: + main: { 1556: { character: { id: '1556', slug: ayumu-kasuga, image: { original: 'https://media.kitsu.io/characters/images/1556/original.jpg?1483096805' }, canonicalName: 'Ayumu Kasuga' }, media: { 1433: { id: '1433', slug: azumanga-web-daioh, titles: ['Azumanga Web Daioh', あずまんがWEB大王] } } }, 2931: { character: { id: '2931', slug: chikane-himemiya, image: { original: 'https://media.kitsu.io/characters/images/2931/original.jpg?1483096805' }, canonicalName: 'Chikane Himemiya' }, media: { 121: { id: '121', slug: kannazuki-no-miko, titles: ['Kannazuki no Miko', 'Destiny of the Shrine Maiden', 神無月の巫女] } } }, 5059: { character: { id: '5059', slug: elie, image: { original: 'https://media.kitsu.io/characters/images/5059/original.jpg?1483096805' }, canonicalName: Elie }, media: { 7692: { id: '7692', slug: fairy-tail-x-rave, titles: ['Fairy Tail x Rave'] } } }, 38549: { character: { id: '38549', slug: erika-kuramoto, image: { original: 'https://media.kitsu.io/characters/images/38549/original.jpg?1483096805' }, canonicalName: 'Erika Kuramoto' }, media: { 7484: { id: '7484', slug: zettai-junpaku-mahou-shoujo, titles: ['Zettai Junpaku♡Mahou Shoujo', 絶対純白♡魔法少女] } } }, 65952: { character: { id: '65952', slug: fear, image: { original: 'https://media.kitsu.io/characters/images/65952/original.jpg?1485074995' }, canonicalName: Fear }, media: { 1179: { id: '1179', slug: dt-eightron, titles: ['DT Eightron', DTエイトロン] } } }, 3879: { character: { id: '3879', slug: fuu-kasumi, image: { original: 'https://media.kitsu.io/characters/images/3879/original.jpg?1483096805' }, canonicalName: 'Fuu Kasumi' }, media: { 181: { id: '181', slug: samurai-champloo, titles: ['Samurai Champloo', サムライチャンプルー] } } }, 13385: { character: { id: '13385', slug: henrietta-de-tristain, image: { original: 'https://media.kitsu.io/characters/images/13385/original.jpg?1483096805' }, canonicalName: 'Henrietta de Tristain' }, media: { 1657: { id: '1657', slug: zero-no-tsukaima-futatsuki-no-kishi, titles: ['Zero no Tsukaima: Futatsuki no Kishi', 'ゼロの使い魔 ~双月の騎士~'] } } }, 2964: { character: { id: '2964', slug: hikari-hoshino, image: { original: 'https://media.kitsu.io/characters/images/2964/original.jpg?1483096805' }, canonicalName: 'Hikari Hoshino' }, media: { 124: { id: '124', slug: kono-minikuku-mo-utsukushii-sekai, titles: ['Kono Minikuku mo Utsukushii Sekai', 'This Ugly Yet Beautiful World', この醜くも美しい世界] } } }, 6524: { character: { id: '6524', slug: kazumi-yoshida, image: { original: 'https://media.kitsu.io/characters/images/6524/original.jpg?1483096805' }, canonicalName: 'Kazumi Yoshida' }, media: { 1372: { id: '1372', slug: shakugan-no-shana-special-koi-to-onsen-no-kougai-gakushuu, titles: ['Shakugan no Shana SP: Koi to Onsen no Kougai Gakushuu!'] }, 953: { id: '953', slug: shakugan-no-shana-specials, titles: ['Shakugan no Shana Specials', 灼眼のシャナたん] } } }, 5983: { character: { id: '5983', slug: lafiel-abriel, image: { original: 'https://media.kitsu.io/characters/images/5983/original.jpg?1483096805' }, canonicalName: 'Lafiel Abriel' }, media: { 1235: { id: '1235', slug: seikai-no-monshou-special, titles: ['Seikai no Monshou Special', '星界の紋章 総集編'] } } }, 29560: { character: { id: '29560', slug: reina-vance, image: { original: 'https://media.kitsu.io/characters/images/29560/original.jpg?1483096805' }, canonicalName: 'Leina Vance' }, media: { 7412: { id: '7412', slug: vanquished-queens, titles: ['Vanquished Queens', ヴァンキッシュド・クイーンズ] }, 7847: { id: '7847', slug: vanquished-queens-specials, titles: ['Vanquished Queens Specials', ヴァンキッシュド・クイーンズ] } } }, 25628: { character: { id: '25628', slug: liliane, image: { original: 'https://media.kitsu.io/characters/images/25628/original.jpg?1483096805' }, canonicalName: Liliane }, media: { 7783: { id: '7783', slug: princess-resurrection, titles: ['Kaibutsu Oujo', 'Princess Resurrection', 怪物王女] } } }, 7886: { character: { id: '7886', slug: matsuri-sakuragi, image: { original: 'https://media.kitsu.io/characters/images/7886/original.jpg?1483096805' }, canonicalName: 'Matsuri Sakuragi' }, media: { 1698: { id: '1698', slug: ichigo-mashimaro-ova, titles: ['Ichigo Mashimaro OVA', 'Strawberry Marshmallow OVA', '苺ましまろ OVA'] } } }, 17441: { character: { id: '17441', slug: megumi-noda, image: { original: 'https://media.kitsu.io/characters/images/17441/original.jpg?1483096805' }, canonicalName: 'Megumi Noda' }, media: { 1525: { id: '1525', slug: nodame-cantabile, titles: ['Nodame Cantabile', のだめカンタービレ] } } }, 16621: { character: { id: '16621', slug: nanoca-flanka, image: { original: 'https://media.kitsu.io/characters/images/16621/original.jpg?1483096805' }, canonicalName: 'Nanoca Flanka' }, media: { 1426: { id: '1426', slug: aoi-umi-no-tristia, titles: ['Aoi Umi no Tristia', 蒼い海のトリスティア] } } }, 17608: { character: { id: '17608', slug: nono-ichinose, image: { original: 'https://media.kitsu.io/characters/images/17608/original.jpg?1483096805' }, canonicalName: 'Nono Ichinose' }, media: { 1542: { id: '1542', slug: hitohira, titles: [Hitohira, ひとひら] } } }, 15253: { character: { id: '15253', slug: otoha-sakurano, image: { original: 'https://media.kitsu.io/characters/images/15253/original.jpg?1483096805' }, canonicalName: 'Otoha Sakurano' }, media: { 1326: { id: '1326', slug: sky-girls-ova, titles: ['Sky Girls OVA', スカイガールズ] } } }, 94247: { character: { id: '94247', slug: rikotto, image: { original: 'https://media.kitsu.io/characters/images/94247/original.jpg?1485088023' }, canonicalName: Rikotto }, media: { 8108: { id: '8108', slug: parol-no-mirai-shima, titles: ['Parol no Miraijima', 'Paroru''s Future Island', パロルのみらい島] } } }, 2674: { character: { id: '2674', slug: ruriko-ikusawa, image: { original: 'https://media.kitsu.io/characters/images/2674/original.jpg?1483096805' }, canonicalName: 'Ruriko Ikusawa' }, media: { 106: { id: '106', slug: gate-keepers, titles: ['Gate Keepers', ゲートキーパーズ] } } }, 6553: { character: { id: '6553', slug: saber, image: { original: 'https://media.kitsu.io/characters/images/6553/original.jpg?1483096805' }, canonicalName: Saber }, media: { 5992: { id: '5992', slug: carnival-phantasm, titles: ['Carnival Phantasm', カーニバル・ファンタズム] }, 6695: { id: '6695', slug: carnival-phantasm-illya-s-castle, titles: ['Carnival Phantasm: Illya-jou', 'カーニバル・ファンタズム: イリヤ城'] }, 6028: { id: '6028', slug: fate-zero, titles: [Fate/Zero, フェイト/ゼロ] }, 7658: { id: '7658', slug: fate-zero-2nd-season, titles: ['Fate/Zero 2nd Season', 'Fate/Zero Season 2', 'フェイト/ゼロ 2ndシーズン'] }, 6906: { id: '6906', slug: fate-zero-remix, titles: ['Fate/Zero Remix', 'フェイト/ゼロ Remix'] } } }, 16753: { character: { id: '16753', slug: sara-werec, image: { original: 'https://media.kitsu.io/characters/images/16753/original.jpg?1483096805' }, canonicalName: 'Sara Werec' }, media: { 1442: { id: '1442', slug: soukou-no-strain, titles: ['Soukou no Strain', 'Strain: Strategic Armored Infantry', 奏光のストレイン] } } }, 18533: { character: { id: '18533', slug: yuki-azuma, image: { original: 'https://media.kitsu.io/characters/images/18533/original.jpg?1483096805' }, canonicalName: 'Yuki Azuma' }, media: { 1663: { id: '1663', slug: princess-nine, titles: ['Princess Nine: Kisaragi Joshikou Yakyuubu', 'プリンセスナイン 如月女子高野球部'] } } } } + background: { 34916: { character: { id: '34916', slug: akari-fujibayashi, image: { original: 'https://media.kitsu.io/characters/images/34916/original.jpg?1483096805' }, canonicalName: 'Akari Fujibayashi' }, media: { 6316: { id: '6316', slug: boku-wa-tomodachi-ga-sukunai, titles: ['Boku wa Tomodachi ga Sukunai', 'Haganai: I don''t have many friends', 僕は友達が少ない] } } }, 36114: { character: { id: '36114', slug: akira-igarashi-bbec632e-9df3-4317-943b-1c6f9265a1a8, image: { original: 'https://media.kitsu.io/characters/images/36114/original.jpg?1483096805' }, canonicalName: 'Akira Igarashi' }, media: { 6678: { id: '6678', slug: akb0048-first-stage, titles: [AKB0048] }, 7184: { id: '7184', slug: akb0048-next-stage, titles: ['AKB0048: Next Stage'] } } }, 25903: { character: { id: '25903', slug: athena-tennos, image: { original: 'https://media.kitsu.io/characters/images/25903/original.jpg?1483096805' }, canonicalName: 'Athena Tennousu' }, media: { 7561: { id: '7561', slug: hayate-the-combat-butler-cuties, titles: ['Hayate no Gotoku! Cuties', 'Hayate the Combat Butler! Cuties', 'ハヤテのごとく! Cuties'] } } }, 31810: { character: { id: '31810', slug: ayumi-tokita, image: { original: 'https://media.kitsu.io/characters/images/31810/original.jpg?1483096805' }, canonicalName: 'Ayumi Tokita' }, media: { 6929: { id: '6929', slug: shinryaku-ika-musume, titles: ['Shinryaku!! Ika Musume', 侵略!!イカ娘] }, 6156: { id: '6156', slug: squid-girl-2, titles: ['Squid Girl 2', 'Shinryaku!? Ika Musume', '侵略!?イカ娘'] } } }, 19507: { character: { id: '19507', slug: blanc-neige, image: { original: 'https://media.kitsu.io/characters/images/19507/original.jpg?1483096805' }, canonicalName: 'Blanc Neige' }, media: { 1830: { id: '1830', slug: shining-tears-x-wind, titles: ['Shining Tears X Wind', シャイニング・ティアーズ・クロス・ウィンド] } } }, 81076: { character: { id: '81076', slug: cacao-kun, image: { original: 'https://media.kitsu.io/characters/images/81076/original.jpg?1485082691' }, canonicalName: Cacao-kun }, media: { 1766: { id: '1766', slug: sore-ike-anpanman, titles: ['Sore Ike! Anpanman', それいけ!アンパンマン] } } }, 2358: { character: { id: '2358', slug: chidori-kuruma, image: { original: 'https://media.kitsu.io/characters/images/2358/original.jpg?1483096805' }, canonicalName: 'Chidori Kuruma' }, media: { 83: { id: '83', slug: ayashi-no-ceres, titles: ['Ayashi no Ceres', 'Ceres, Celestial Legend', 妖しのセレス] } } }, 19518: { character: { id: '19518', slug: clalaclan-philias, image: { original: 'https://media.kitsu.io/characters/images/19518/original.jpg?1483096805' }, canonicalName: 'Clalaclan Philias' }, media: { 1830: { id: '1830', slug: shining-tears-x-wind, titles: ['Shining Tears X Wind', シャイニング・ティアーズ・クロス・ウィンド] } } }, 18333: { character: { id: '18333', slug: elena-014dc0ac-f4bf-41de-89bb-5b2dd07dea90, image: { original: 'https://media.kitsu.io/characters/images/18333/original.jpg?1483096805' }, canonicalName: Elena }, media: { 1635: { id: '1635', slug: claymore, titles: [Claymore, クレイモア] } } }, 18730: { character: { id: '18730', slug: elsa-ff4fe679-fd15-40fa-8add-93fdd412acd6, image: { original: 'https://media.kitsu.io/characters/images/18730/original.jpg?1483096805' }, canonicalName: Elsa }, media: { 464: { id: '464', slug: fushigiboshi-no-futagohime-gyu, titles: ['Fushigiboshi no☆Futagohime Gyu!', ふしぎ星の☆ふたご姫] } } }, 17472: { character: { id: '17472', slug: emilia, image: { original: 'https://media.kitsu.io/characters/images/17472/original.jpg?1483096805' }, canonicalName: Emilia }, media: { 1526: { id: '1526', slug: romeo-x-juliet, titles: ['Romeo x Juliet', ロミオ×ジュリエット] } } }, 24528: { character: { id: '24528', slug: erina-pendleton, image: { original: 'https://media.kitsu.io/characters/images/24528/original.jpg?1483096805' }, canonicalName: 'Erina Pendleton' }, media: { 7158: { id: '7158', slug: jojo-s-bizarre-adventure-2012, titles: ['JoJo no Kimyou na Bouken (TV)', 'JoJo''s Bizarre Adventure (2012)', ジョジョの奇妙な冒険] } } }, 17692: { character: { id: '17692', slug: eufinley-tsuge, image: { original: 'https://media.kitsu.io/characters/images/17692/original.jpg?1483096805' }, canonicalName: 'Eufinley Tsuge' }, media: { 1548: { id: '1548', slug: shinkyoku-soukai-polyphonica, titles: ['Shinkyoku Soukai Polyphonica', 神曲奏界ポリフォニカ] } } }, 14040: { character: { id: '14040', slug: hanako-e8b5973b-be52-4990-b28d-a624ee08c30d, image: { original: 'https://media.kitsu.io/characters/images/14040/original.jpg?1483096805' }, canonicalName: Hanako }, media: { 1156: { id: '1156', slug: ghost-stories, titles: ['Ghost Stories', 'Gakkou no Kaidan', 学校の怪談] } } }, 37138: { character: { id: '37138', slug: haruka-tanaka, image: { original: 'https://media.kitsu.io/characters/images/37138/original.jpg?1483096805' }, canonicalName: 'Haruka Tanaka' }, media: { 6941: { id: '6941', slug: tari-tari, titles: ['Tari Tari'] } } }, 34746: { character: { id: '34746', slug: hatsue-nobidome, image: { original: 'https://media.kitsu.io/characters/images/34746/original.jpg?1483096805' }, canonicalName: 'Hatsue Nobidome' }, media: { 6246: { id: '6246', slug: ro-kyu-bu, titles: [Ro-Kyu-Bu!, 'Ro-Kyu-Bu ~ Fast Break!', ロウきゅーぶ!] }, 7367: { id: '7367', slug: ro-kyu-bu-ss, titles: ['Ro-Kyu-Bu! SS', 'ロウきゅーぶ! SS'] } } }, 13385: { character: { id: '13385', slug: henrietta-de-tristain, image: { original: 'https://media.kitsu.io/characters/images/13385/original.jpg?1483096805' }, canonicalName: 'Henrietta de Tristain' }, media: { 1075: { id: '1075', slug: zero-no-tsukaima, titles: ['Zero no Tsukaima', 'The Familiar of Zero', ゼロの使い魔] }, 6493: { id: '6493', slug: zero-no-tsukaima-f, titles: ['Zero no Tsukaima F', 'The Familiar of Zero F', ゼロの使い魔F] } } }, 6051: { character: { id: '6051', slug: hotaru, image: { original: 'https://media.kitsu.io/characters/images/6051/original.jpg?1483096805' }, canonicalName: Hotaru }, media: { 1795: { id: '1795', slug: hack-legend-of-the-twilight-offline-meeting-special, titles: ['.hack//Tasogare no Udewa Densetsu: Offline de Aimashou'] } } }, 40291: { character: { id: '40291', slug: izumi-nase, image: { original: 'https://media.kitsu.io/characters/images/40291/original.jpg?1483096805' }, canonicalName: 'Izumi Nase' }, media: { 7714: { id: '7714', slug: kyoukai-no-kanata, titles: ['Kyoukai no Kanata', 'Beyond the Boundary', 境界の彼方] }, 8086: { id: '8086', slug: kyoukai-no-kanata-idol-saiban-mayoi-nagara-mo-kimi-wo-sabaku-tami, titles: ['Kyoukai no Kanata: Idol Saiban! Mayoi Nagara mo Kimi wo Sabaku Tami'] }, 8088: { id: '8088', slug: kyoukai-no-kanata-mini-theater, titles: ['Kyoukai no Kanata: Mini Theater', '境界の彼方 ミニ劇場'] } } }, 31855: { character: { id: '31855', slug: jeanne-d-arc-7536315c-0358-4f26-a136-13431573949f, image: { original: 'https://media.kitsu.io/characters/images/31855/original.jpg?1483096805' }, canonicalName: 'Jeanne d''Arc' }, media: { 6263: { id: '6263', slug: hidan-no-aria-special, titles: ['Hidan no Aria Special', 'Aria the Scarlet Ammo Special', 緋弾のアリア] } } }, 4882: { character: { id: '4882', slug: kanako-ohno, image: { original: 'https://media.kitsu.io/characters/images/4882/original.jpg?1483096805' }, canonicalName: 'Kanako Oono' }, media: { 1631: { id: '1631', slug: genshiken-ova, titles: ['Genshiken OVA', 'げんしけん OVA'] } } }, 18247: { character: { id: '18247', slug: kaon, image: { original: 'https://media.kitsu.io/characters/images/18247/original.jpg?1483096805' }, canonicalName: Kaon }, media: { 1628: { id: '1628', slug: kyoshiro-to-towa-no-sora, titles: ['Kyoushirou to Towa no Sora', 'Shattered Angels', 京四郎と永遠(とわ)の空] } } }, 9681: { character: { id: '9681', slug: kaori-misaka, image: { original: 'https://media.kitsu.io/characters/images/9681/original.jpg?1483096805' }, canonicalName: 'Kaori Misaka' }, media: { 7659: { id: '7659', slug: kanon, titles: [Kanon, カノン] }, 122: { id: '122', slug: kanon-2006, titles: ['Kanon (2006)', 'カノン (2006)'] } } }, 72415: { character: { id: '72415', slug: kasumi-konjou, image: { original: 'https://media.kitsu.io/characters/images/72415/original.jpg?1485079568' }, canonicalName: 'Kasumi Konjou' }, media: { 8162: { id: '8162', slug: ryuugajou-nanana-no-maizoukin-tv, titles: ['Ryuugajou Nanana no Maizoukin (TV)', 'Nanana''s Buried Treasure', 龍ヶ嬢七々々の埋蔵金] } } }, 6524: { character: { id: '6524', slug: kazumi-yoshida, image: { original: 'https://media.kitsu.io/characters/images/6524/original.jpg?1483096805' }, canonicalName: 'Kazumi Yoshida' }, media: { 1632: { id: '1632', slug: shakugan-no-shana-movie, titles: ['Shakugan no Shana Movie', 'Shakugan no Shana: The Movie', '劇場版 灼眼のシャナ'] } } }, 37404: { character: { id: '37404', slug: kay, image: { original: 'https://media.kitsu.io/characters/images/37404/original.jpg?1483096805' }, canonicalName: Kei }, media: { 7087: { id: '7087', slug: girls-und-panzer, titles: ['Girls & Panzer', 'ガールズ&パンツァー'] }, 7904: { id: '7904', slug: girls-und-panzer-der-film, titles: ['Girls & Panzer Movie', 'Girls und Panzer der Film', 'ガールズ&パンツァー 劇場版'] } } }, 67421: { character: { id: '67421', slug: kirara-chan, image: { original: 'https://media.kitsu.io/characters/images/67421/original.jpg?1485077808' }, canonicalName: Kirara-chan }, media: { 1766: { id: '1766', slug: sore-ike-anpanman, titles: ['Sore Ike! Anpanman', それいけ!アンパンマン] } } }, 3747: { character: { id: '3747', slug: koishi-herikawa, image: { original: 'https://media.kitsu.io/characters/images/3747/original.jpg?1483096805' }, canonicalName: 'Koishi Herikawa' }, media: { 172: { id: '172', slug: onegai-teacher, titles: [Onegai☆Teacher, 'Please Teacher!', おねがい☆ティーチャー] }, 173: { id: '173', slug: onegai-twins, titles: [Onegai☆Twins, 'Please Twins', おねがい☆ツインズ] } } }, 40432: { character: { id: '40432', slug: komachi-takamiya, image: { original: 'https://media.kitsu.io/characters/images/40432/original.jpg?1483096805' }, canonicalName: 'Komachi Takamiya' }, media: { 8017: { id: '8017', slug: witch-craft-works, titles: ['Witch Craft Works', ウィッチクラフトワークス] } } }, 90743: { character: { id: '90743', slug: kyouko-miyano, image: { original: 'https://media.kitsu.io/characters/images/90743/original.jpg?1485086523' }, canonicalName: 'Kyouko Miyano' }, media: { 1204: { id: '1204', slug: a-d-police, titles: ['A.D. Police (TV)', 'A.D. Police: To Protect and Serve', アドバンスドポリス] } } }, 5983: { character: { id: '5983', slug: lafiel-abriel, image: { original: 'https://media.kitsu.io/characters/images/5983/original.jpg?1483096805' }, canonicalName: 'Lafiel Abriel' }, media: { 1008: { id: '1008', slug: seikai-no-danshou-tanjou, titles: ['Seikai no Danshou: Tanjou', 'Crest of the Stars: Birth', '星界の断章 “誕生”'] } } }, 26432: { character: { id: '26432', slug: laura-stuart, image: { original: 'https://media.kitsu.io/characters/images/26432/original.jpg?1483096805' }, canonicalName: 'Laura Stuart' }, media: { 6583: { id: '6583', slug: toaru-majutsu-no-index-endymion-no-kiseki, titles: ['Toaru Majutsu no Index Movie: Endymion no Kiseki', '劇場版 とある魔術の禁書目録 エンデュミオーンの奇蹟'] }, 8120: { id: '8120', slug: toaru-majutsu-no-index-endymion-no-kiseki-special, titles: ['Toaru Majutsu no Index Movie: Endymion no Kiseki Special'] } } }, 29560: { character: { id: '29560', slug: reina-vance, image: { original: 'https://media.kitsu.io/characters/images/29560/original.jpg?1483096805' }, canonicalName: 'Leina Vance' }, media: { 6620: { id: '6620', slug: queen-s-blade-rebellion, titles: ['Queen''s Blade: Rebellion', 'クイーンズブレイド リベリオン'] } } }, 70385: { character: { id: '70385', slug: loco-chan, image: { original: 'https://media.kitsu.io/characters/images/70385/original.jpg?1485078849' }, canonicalName: Loco-chan }, media: { 1766: { id: '1766', slug: sore-ike-anpanman, titles: ['Sore Ike! Anpanman', それいけ!アンパンマン] } } }, 19043: { character: { id: '19043', slug: manari, image: { original: 'https://media.kitsu.io/characters/images/19043/original.jpg?1483096805' }, canonicalName: Manari }, media: { 1746: { id: '1746', slug: nakoruru-ano-hito-kara-no-okurimono, titles: ['Nakoruru: Ano Hito kara no Okurimono', 'ナコルル ~あのひとからのおくりもの~'] } } }, 3331: { character: { id: '3331', slug: megumi-shitow, image: { original: 'https://media.kitsu.io/characters/images/3331/original.jpg?1483096805' }, canonicalName: 'Megumi Shitow' }, media: { 143: { id: '143', slug: rahxephon, titles: [RahXephon, ラーゼフォン] } } }, 35783: { character: { id: '35783', slug: blood-leopard, image: { original: 'https://media.kitsu.io/characters/images/35783/original.jpg?1483096805' }, canonicalName: 'Mihaya Kakei' }, media: { 6590: { id: '6590', slug: accel-world, titles: ['Accel World', アクセル・ワールド] }, 7057: { id: '7057', slug: accel-world-ex, titles: ['Accel World EX', 'アクセル・ワールド EX'] }, 7050: { id: '7050', slug: accel-world-specials, titles: ['Accel World: Acchel World.', あくちぇる・わーるど。] } } }, 54624: { character: { id: '54624', slug: minato-shirakawa, image: { original: 'https://media.kitsu.io/characters/images/54624/original.jpg?1483096805' }, canonicalName: 'Minato Shirakawa' }, media: { 7501: { id: '7501', slug: kiniro-mosaic, titles: ['Kiniro Mosaic', KINMOZA!, きんいろモザイク] } } }, 29350: { character: { id: '29350', slug: miyuri-tsujidou, image: { original: 'https://media.kitsu.io/characters/images/29350/original.jpg?1483096805' }, canonicalName: 'Miyuri Tsujidou' }, media: { 6020: { id: '6020', slug: seikon-no-qwaser-ii, titles: ['Seikon no Qwaser II', 'The Qwaser of Stigmata II', '聖痕のクェイサー II'] } } }, 17254: { character: { id: '17254', slug: mysterious-girl-fc00287e-cca6-4f1f-8dcd-4d947f83cf47, image: { original: 'https://media.kitsu.io/characters/images/17254/original.jpg?1483096805' }, canonicalName: 'Mysterious Girl' }, media: { 1510: { id: '1510', slug: brave-story, titles: ['Brave Story', ブレイブ・ストーリー] } } }, 178: { character: { id: '178', slug: natsuki-mogi, image: { original: 'https://media.kitsu.io/characters/images/178/original.jpg?1483096805' }, canonicalName: 'Natsuki Mogi' }, media: { 162: { id: '162', slug: initial-d-first-stage, titles: ['Initial D First Stage', 頭文字〈イニシャル〉D] }, 9: { id: '9', slug: initial-d-fourth-stage, titles: ['Initial D Fourth Stage', '頭文字〈イニシャル〉D FOURTH STAGE'] }, 163: { id: '163', slug: initial-d-second-stage, titles: ['Initial D Second Stage', '頭文字〈イニシャル〉D SECOND STAGE'] }, 164: { id: '164', slug: initial-d-third-stage, titles: ['Initial D Third Stage', '頭文字〈イニシャル〉D THIRD STAGE'] } } }, 76050: { character: { id: '76050', slug: ooyodo, image: { original: 'https://media.kitsu.io/characters/images/76050/original.jpg?1485080864' }, canonicalName: Ooyodo }, media: { 8039: { id: '8039', slug: kantai-collection, titles: ['Kantai Collection: KanColle', 'KanColle: Kantai Collection', '艦隊これくしょん -艦これ-'] } } }, 71640: { character: { id: '71640', slug: pajaman, image: { original: 'https://media.kitsu.io/characters/images/71640/original.jpg?1485079270' }, canonicalName: Pajaman }, media: { 1766: { id: '1766', slug: sore-ike-anpanman, titles: ['Sore Ike! Anpanman', それいけ!アンパンマン] } } }, 58849: { character: { id: '58849', slug: rira-mochizuki, image: { original: '/images/original/missing.png?1483096805' }, canonicalName: 'Rira Mochizuki' }, media: { 9689: { id: '9689', slug: visitor, titles: [Visitor, (ビジター] } } }, 37181: { character: { id: '37181', slug: risa-seri, image: { original: 'https://media.kitsu.io/characters/images/37181/original.jpg?1483096805' }, canonicalName: 'Risa Seri' }, media: { 6947: { id: '6947', slug: kono-naka-ni-hitori-imouto-ga-iru, titles: ['Kono Naka ni Hitori, Imouto ga Iru!', 'NAKAIMO - My Little Sister Is Among Them!', この中に1人、妹がいる!] } } }, 37314: { character: { id: '37314', slug: rita-ainsworth, image: { original: 'https://media.kitsu.io/characters/images/37314/original.jpg?1483096805' }, canonicalName: 'Rita Ainsworth' }, media: { 7023: { id: '7023', slug: sakurasou-no-pet-na-kanojo, titles: ['Sakurasou no Pet na Kanojo', 'The Pet Girl of Sakurasou', さくら荘のペットな彼女] } } }, 6553: { character: { id: '6553', slug: saber, image: { original: 'https://media.kitsu.io/characters/images/6553/original.jpg?1483096805' }, canonicalName: Saber }, media: { 6685: { id: '6685', slug: carnival-phantasm-ex-season, titles: ['Carnival Phantasm EX Season', 'カーニバル・ファンタズム EX Season'] }, 7342: { id: '7342', slug: carnival-phantasm-hibichika-special, titles: ['Carnival Phantasm: HibiChika Special', 'カーニバル・ファンタズム ひびちかスペシャル'] }, 7173: { id: '7173', slug: fate-kaleid-liner-prisma-illya, titles: ['Fate/kaleid liner Prisma☆Illya', 'Fate/kaleid liner プリズマ☆イリヤ'] } } }, 24036: { character: { id: '24036', slug: saki-tenjouin, image: { original: 'https://media.kitsu.io/characters/images/24036/original.jpg?1483096805' }, canonicalName: 'Saki Tenjouin' }, media: { 7007: { id: '7007', slug: to-love-ru-darkness, titles: ['To LOVE-Ru Darkness', 'To LOVEる -とらぶる- ダークネス'] } } }, 6580: { character: { id: '6580', slug: shizuki-minagami, image: { original: 'https://media.kitsu.io/characters/images/6580/original.jpg?1483096805' }, canonicalName: 'Shizuki Minagami' }, media: { 1928: { id: '1928', slug: bokusatsu-tenshi-dokuro-chan-2, titles: ['Bokusatsu Tenshi Dokuro-chan 2', 'Bludgeoning Angel Dokuro-chan 2', '撲殺天使ドクロちゃん2[セカンド]'] } } }, 18650: { character: { id: '18650', slug: sumire-nishiwa, image: { original: 'https://media.kitsu.io/characters/images/18650/original.jpg?1483096805' }, canonicalName: 'Sumire Nishiwa' }, media: { 1682: { id: '1682', slug: getsumen-to-heiki-mina, titles: ['Getsumen To Heiki Mina', 月面兎兵器ミーナ] } } }, 35609: { character: { id: '35609', slug: susan-b72d260d-5a1e-4738-9613-06761fe0156f, image: { original: 'https://media.kitsu.io/characters/images/35609/original.jpg?1483096805' }, canonicalName: Susan }, media: { 6550: { id: '6550', slug: high-school-dxd, titles: ['High School DxD', ハイスクールD×D] } } }, 16321: { character: { id: '16321', slug: urara-9d087f16-782c-4e17-8aaf-839bd5f3a795, image: { original: 'https://media.kitsu.io/characters/images/16321/original.jpg?1483096805' }, canonicalName: 'Urara ' }, media: { 1405: { id: '1405', slug: pokemon-diamond-pearl, titles: ['Pokemon Diamond & Pearl', 'ポケットモンスター ダイヤモンド&パール'] } } }, 3379: { character: { id: '3379', slug: winia-chester, image: { original: 'https://media.kitsu.io/characters/images/3379/original.jpg?1483096805' }, canonicalName: 'Winia Chester' }, media: { 145: { id: '145', slug: scrapped-princess, titles: ['Scrapped Princess', スクラップド・プリンセス] } } }, 31024: { character: { id: '31024', slug: yuriko-aoki, image: { original: 'https://media.kitsu.io/characters/images/31024/original.jpg?1483096805' }, canonicalName: 'Yuriko Aoki' }, media: { 6001: { id: '6001', slug: bakuman-2, titles: ['Bakuman. 2nd Season', バクマン。2ndシーズン] }, 6714: { id: '6714', slug: bakuman-3, titles: ['Bakuman. 3rd Season', バクマン。] } } } } +staff: + 'Theme Song Performance': { anime: { 607: { id: '607', title: 'Denshin Mamotte Shugogetten', titles: ['Denshin Mamotte Shugogetten', '伝心 まもって守護月天!'], image: { original: 'https://media.kitsu.io/anime/poster_images/607/small.jpg?1597691223' }, slug: denshin-mamotte-shugogetten }, 1236: { id: '1236', title: 'GaoGaiGar Final', titles: ['GaoGaiGar Final', 'Yuusha-Ou GaoGaiGar Final', 勇者王ガオガイガーFINAL], image: { original: 'https://media.kitsu.io/anime/poster_images/1236/small.jpg?1597697229' }, slug: gaogaigar-final }, 418: { id: '418', title: 'Gokujou Seitokai', titles: ['Gokujou Seitokai', 'Best Student Council', 極上生徒会], image: { original: 'https://media.kitsu.io/anime/poster_images/418/small.jpg?1597692251' }, slug: gokujou-seitokai }, 221: { id: '221', title: 'Groove Adventure Rave', titles: ['Groove Adventure Rave', 'Rave Master', レイヴ], image: { original: 'https://media.kitsu.io/anime/poster_images/221/small.jpg?1597698304' }, slug: groove-adventure-rave }, 449: { id: '449', title: 'Ichigo Mashimaro', titles: ['Ichigo Mashimaro', 'Strawberry Marshmallow', 苺ましまろ], image: { original: 'https://media.kitsu.io/anime/poster_images/449/small.jpg?1597697413' }, slug: ichigo-mashimaro }, 1698: { id: '1698', title: 'Ichigo Mashimaro OVA', titles: ['Ichigo Mashimaro OVA', 'Strawberry Marshmallow OVA', '苺ましまろ OVA'], image: { original: 'https://media.kitsu.io/anime/poster_images/1698/small.jpg?1597697486' }, slug: ichigo-mashimaro-ova }, 3029: { id: '3029', title: 'Kemeko Deluxe!', titles: ['Kemeko Deluxe!', ケメコデラックス!], image: { original: 'https://media.kitsu.io/anime/poster_images/3029/small.jpg?1408448468' }, slug: kemeko-dx }, 124: { id: '124', title: 'Kono Minikuku mo Utsukushii Sekai', titles: ['Kono Minikuku mo Utsukushii Sekai', 'This Ugly Yet Beautiful World', この醜くも美しい世界], image: { original: 'https://media.kitsu.io/anime/poster_images/124/small.jpg?1597691586' }, slug: kono-minikuku-mo-utsukushii-sekai }, 4879: { id: '4879', title: 'Ladies versus Butlers!', titles: ['Ladies versus Butlers!', れでぃ×ばと!], image: { original: 'https://media.kitsu.io/anime/poster_images/4879/small.jpg?1597698839' }, slug: ladies-versus-butlers }, 252: { id: '252', title: 'Mahoromatic 2', titles: ['Mahoromatic 2', 'Mahoromatic ~Something More Beautiful~', 'まほろまてぃっく ~もっと美しいもの~'], image: { original: 'https://media.kitsu.io/anime/poster_images/252/small.jpg?1597691960' }, slug: mahoromatic-2 }, 251: { id: '251', title: 'Mahoromatic: Automatic Maiden', titles: ['Mahoromatic: Automatic Maiden', まほろまてぃっく], image: { original: 'https://media.kitsu.io/anime/poster_images/251/small.jpg?1597698190' }, slug: mahoromatic }, 432: { id: '432', title: 'Okusama wa Joshikousei (TV)', titles: ['Okusama wa Joshikousei (TV)', 'My Wife is a High School Girl', おくさまは女子高生], image: { original: 'https://media.kitsu.io/anime/poster_images/432/small.jpg?1597692181' }, slug: okusama-wa-joshikousei-2005 }, 617: { id: '617', title: 'One: Kagayaku Kisetsu e', titles: ['One: Kagayaku Kisetsu e', 'ONE ~輝く季節へ~'], image: { original: 'https://media.kitsu.io/anime/poster_images/617/small.jpg?1408441902' }, slug: one-kagayaku-kisetsu-e }, 294: { id: '294', title: 'Puchi Pri*Yucie', titles: ['Puchi Pri*Yucie', 'Petite Princess Yucie', ぷちぷり*ユーシィ], image: { original: 'https://media.kitsu.io/anime/poster_images/294/small.jpg?1408441147' }, slug: puchi-puri-yuushi }, 7762: { id: '7762', title: 'Queen''s Blade: Rurou no Senshi', titles: ['Queen''s Blade: Rurou no Senshi', 'Queen''s Blade: The Exiled Virgin', 'クイーンズブレイド 流浪の戦士'], image: { original: 'https://media.kitsu.io/anime/poster_images/7762/small.jpg?1408462333' }, slug: queen-s-blade-rurou-no-senshi }, 364: { id: '364', title: 'Seikai no Senki II', titles: ['Seikai no Senki II', 'Banner of the Stars II', '星界の戦旗 II'], image: { original: 'https://media.kitsu.io/anime/poster_images/364/small.jpg?1597697259' }, slug: seikai-no-senki-ii }, 2034: { id: '2034', title: 'Seraphim Call', titles: ['Seraphim Call', セラフィムコール], image: { original: 'https://media.kitsu.io/anime/poster_images/2034/small.jpg?1597691748' }, slug: seraphim-call }, 434: { id: '434', title: 'To Heart', titles: ['To Heart', トゥハート], image: { original: 'https://media.kitsu.io/anime/poster_images/434/small.jpg?1597698729' }, slug: to-heart }, 839: { id: '839', title: 'Yume Tsukai', titles: ['Yume Tsukai', 夢使い], image: { original: 'https://media.kitsu.io/anime/poster_images/839/small.jpg?1597698821' }, slug: yume-tsukai } } } + 'Theme Song Performance, Theme Song Composition': { anime: { 295: { id: '295', title: Piano, titles: [Piano, 'Piano: The Melody of a Young Girl''s Heart'], image: { original: 'https://media.kitsu.io/anime/poster_images/295/small.jpg?1597684113' }, slug: piano } } } diff --git a/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/UserTransformerTest__testTransform__1.yml b/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/UserTransformerTest__testTransform__1.yml new file mode 100644 index 00000000..1f3e3e8c --- /dev/null +++ b/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/UserTransformerTest__testTransform__1.yml @@ -0,0 +1,20 @@ +empty: false +about: 'Web Developer, Anime Fan, Reader of VNs, and web comics.' +avatar: images/avatars/2644.gif +favorites: + anime: { 933073: { __typename: Anime, id: '14212', slug: hataraku-saibou-tv, posterImage: { original: { url: 'https://media.kitsu.io/anime/poster_images/14212/original.jpg?1597697195', height: 1050, width: 750 }, views: [{ url: 'https://media.kitsu.io/anime/poster_images/14212/tiny.jpg?1597697195', height: 156, width: 110 }, { url: 'https://media.kitsu.io/anime/poster_images/14212/small.jpg?1597697195', height: 402, width: 284 }, { url: 'https://media.kitsu.io/anime/poster_images/14212/medium.jpg?1597697195', height: 554, width: 390 }, { url: 'https://media.kitsu.io/anime/poster_images/14212/large.jpg?1597697195', height: 780, width: 550 }] }, titles: { canonical: 'Hataraku Saibou', localized: { en: 'Cells at Work!', en_jp: 'Hataraku Saibou', ja_jp: はたらく細胞 } } }, 586217: { __typename: Anime, id: '323', slug: fate-stay-night, posterImage: { original: { url: 'https://media.kitsu.io/anime/poster_images/323/original.jpg?1597698066', height: 1074, width: 760 }, views: [{ url: 'https://media.kitsu.io/anime/poster_images/323/tiny.jpg?1597698066', height: 156, width: 110 }, { url: 'https://media.kitsu.io/anime/poster_images/323/small.jpg?1597698066', height: 402, width: 284 }, { url: 'https://media.kitsu.io/anime/poster_images/323/medium.jpg?1597698066', height: 554, width: 390 }, { url: 'https://media.kitsu.io/anime/poster_images/323/large.jpg?1597698066', height: 780, width: 550 }] }, titles: { canonical: 'Fate/stay night', localized: { en: 'Fate/stay night', en_jp: 'Fate/stay night', en_us: 'Fate/stay night', ja_jp: 'Fate/stay night' } } }, 607473: { __typename: Anime, id: '310', slug: tsukuyomi-moon-phase, posterImage: { original: { url: 'https://media.kitsu.io/anime/poster_images/310/original.jpg?1597690591', height: 320, width: 225 }, views: [{ url: 'https://media.kitsu.io/anime/poster_images/310/tiny.jpg?1597690591', height: 156, width: 110 }, { url: 'https://media.kitsu.io/anime/poster_images/310/small.jpg?1597690591', height: 402, width: 284 }, { url: 'https://media.kitsu.io/anime/poster_images/310/medium.jpg?1597690591', height: 554, width: 390 }, { url: 'https://media.kitsu.io/anime/poster_images/310/large.jpg?1597690591', height: 780, width: 550 }] }, titles: { canonical: 'Tsukuyomi: Moon Phase', localized: { en: 'Tsukuyomi: Moon Phase', en_jp: 'Tsukuyomi: Moon Phase', en_us: 'Tsukuyomi: Moon Phase', ja_jp: '月詠 −MOON PHASE−' } } }, 607472: { __typename: Anime, id: '5992', slug: carnival-phantasm, posterImage: { original: { url: 'https://media.kitsu.io/anime/poster_images/5992/original.jpg?1597697878', height: 693, width: 533 }, views: [{ url: 'https://media.kitsu.io/anime/poster_images/5992/tiny.jpg?1597697878', height: 156, width: 110 }, { url: 'https://media.kitsu.io/anime/poster_images/5992/small.jpg?1597697878', height: 402, width: 284 }, { url: 'https://media.kitsu.io/anime/poster_images/5992/medium.jpg?1597697878', height: 554, width: 390 }, { url: 'https://media.kitsu.io/anime/poster_images/5992/large.jpg?1597697878', height: 780, width: 550 }] }, titles: { canonical: 'Carnival Phantasm', localized: { en_jp: 'Carnival Phantasm', ja_jp: カーニバル・ファンタズム } } }, 636892: { __typename: Anime, id: '6062', slug: nichijou, posterImage: { original: { url: 'https://media.kitsu.io/anime/poster_images/6062/original.jpg?1597696783', height: 2292, width: 1610 }, views: [{ url: 'https://media.kitsu.io/anime/poster_images/6062/tiny.jpg?1597696783', height: 156, width: 110 }, { url: 'https://media.kitsu.io/anime/poster_images/6062/small.jpg?1597696783', height: 402, width: 284 }, { url: 'https://media.kitsu.io/anime/poster_images/6062/medium.jpg?1597696783', height: 554, width: 390 }, { url: 'https://media.kitsu.io/anime/poster_images/6062/large.jpg?1597696783', height: 780, width: 550 }] }, titles: { canonical: Nichijou, localized: { en: 'Nichijou - My Ordinary Life', en_jp: Nichijou, en_us: 'Nichijou - My Ordinary Life', ja_jp: 日常 } } } } + character: { 586219: { __typename: Character, id: '6553', slug: saber, image: { original: { url: 'https://media.kitsu.io/characters/images/6553/original.jpg?1483096805' } }, names: { alternatives: ['King of Knights'], canonical: Saber, canonicalLocale: null, localized: { en: Saber, ja_jp: セイバー } } }, 586218: { __typename: Character, id: '6556', slug: rin-tohsaka, image: { original: { url: 'https://media.kitsu.io/characters/images/6556/original.jpg?1483096805' } }, names: { alternatives: { }, canonical: 'Rin Toosaka', canonicalLocale: null, localized: { en: 'Rin Toosaka', ja_jp: '遠坂 凛' } } }, 611365: { __typename: Character, id: '32035', slug: nano-shinonome, image: { original: { url: 'https://media.kitsu.io/characters/images/32035/original.jpg?1483096805' } }, names: { alternatives: { }, canonical: 'Nano Shinonome', canonicalLocale: null, localized: { en: 'Nano Shinonome', ja_jp: '東雲 なの' } } }, 611364: { __typename: Character, id: '32034', slug: mio-naganohara, image: { original: { url: 'https://media.kitsu.io/characters/images/32034/original.jpg?1483096805' } }, names: { alternatives: { }, canonical: 'Mio Naganohara', canonicalLocale: null, localized: { en: 'Mio Naganohara', ja_jp: 長野原みお } } }, 636590: { __typename: Character, id: '31851', slug: aria-holmes-kanzaki, image: { original: { url: 'https://media.kitsu.io/characters/images/31851/original.jpg?1483096805' } }, names: { alternatives: ['Quadra Aria'], canonical: 'Aria Holmes Kanzaki', canonicalLocale: null, localized: { en: 'Aria Holmes Kanzaki', ja_jp: 神崎・H・アリア } } }, 636591: { __typename: Character, id: '25930', slug: taiga-aisaka, image: { original: { url: 'https://media.kitsu.io/characters/images/25930/original.jpg?1483096805' } }, names: { alternatives: ['Palmtop Tiger'], canonical: 'Taiga Aisaka', canonicalLocale: null, localized: { en: 'Taiga Aisaka', ja_jp: '逢坂 大河' } } }, 636593: { __typename: Character, id: '31625', slug: victorique-de-blois, image: { original: { url: 'https://media.kitsu.io/characters/images/31625/original.jpg?1483096805' } }, names: { alternatives: ['The Golden Fairy', 'Gray Wolf', 'Monstre Charmant'], canonical: 'Victorique de Blois', canonicalLocale: null, localized: { en: 'Victorique de Blois', ja_jp: ヴィクトリカ・ド・ブロワ } } } } + manga: { 636888: { __typename: Manga, id: '21733', slug: tonari-no-seki-kun, posterImage: { original: { url: 'https://media.kitsu.io/manga/poster_images/21733/original.jpg?1496845097', height: null, width: null }, views: [{ url: 'https://media.kitsu.io/manga/poster_images/21733/tiny.jpg?1496845097', height: null, width: null }, { url: 'https://media.kitsu.io/manga/poster_images/21733/small.jpg?1496845097', height: null, width: null }, { url: 'https://media.kitsu.io/manga/poster_images/21733/medium.jpg?1496845097', height: null, width: null }, { url: 'https://media.kitsu.io/manga/poster_images/21733/large.jpg?1496845097', height: null, width: null }] }, titles: { canonical: 'Tonari no Seki-kun', localized: { en: 'My Neighbour Seki', en_jp: 'Tonari no Seki-kun', en_us: 'My Neighbour Seki', ja_jp: となりの関くん } } } } +location: 'Michigan, USA' +name: timw4mail +slug: timw4mail +stats: + 'Time spent watching anime:': '196 days, 5 hours, 25 minutes, and 17 seconds' + 'Anime series watched:': '1,044' + 'Anime episodes watched:': '14,943' + 'Manga series read:': '49' + 'Manga chapters read:': '2,678' +waifu: + label: Waifu + character: { id: '6553', slug: saber, image: { original: { name: original, url: 'https://media.kitsu.io/characters/images/6553/original.jpg?1483096805', width: null, height: null } }, names: { canonical: Saber, alternatives: ['King of Knights'], localized: { en: Saber, ja_jp: セイバー } } } +website: 'https://timshomepage.net' diff --git a/tests/AnimeClient/Command/BaseCommandTest.php b/tests/AnimeClient/Command/BaseCommandTest.php index da24a031..6e1a85a8 100644 --- a/tests/AnimeClient/Command/BaseCommandTest.php +++ b/tests/AnimeClient/Command/BaseCommandTest.php @@ -27,8 +27,8 @@ class Command extends BaseCommand { } class BaseCommandTest extends AnimeClientTestCase { - protected $base; - protected $friend; + protected Command $base; + protected Friend $friend; public function setUp(): void { $this->base = new Command(new Console()); diff --git a/tests/AnimeClient/RequirementsTest.php b/tests/AnimeClient/RequirementsTest.php index bf7b5860..a535fec6 100644 --- a/tests/AnimeClient/RequirementsTest.php +++ b/tests/AnimeClient/RequirementsTest.php @@ -22,7 +22,7 @@ class RequirementsTest extends AnimeClientTestCase { public function testPHPVersion(): void { - $this->assertTrue(version_compare(PHP_VERSION, "7.4", "ge")); + $this->assertTrue(version_compare(PHP_VERSION, "8", "ge")); } public function testHasPDO(): void diff --git a/tests/AnimeClient/mocks.php b/tests/AnimeClient/mocks.php index fe7faa4b..9914aba0 100644 --- a/tests/AnimeClient/mocks.php +++ b/tests/AnimeClient/mocks.php @@ -17,7 +17,7 @@ use Aviat\Ion\View\{HtmlView, HttpView, JsonView}; // ----------------------------------------------------------------------------- class MockErrorHandler { - public function addDataTable($name, array $values=[]) {} + public function addDataTable(string $name, array $values=[]): void {} } // ----------------------------------------------------------------------------- @@ -128,12 +128,12 @@ class TestJsonView extends JsonView { // ----------------------------------------------------------------------------- trait MockInjectionTrait { - public function __get($key) + public function __get(string $key): mixed { return $this->$key; } - public function __set($key, $value) + public function __set(string $key, mixed $value) { $this->$key = $value; return $this; diff --git a/tests/AnimeClient/test_data/Kitsu/characterBeforeTransform.json b/tests/AnimeClient/test_data/Kitsu/characterBeforeTransform.json new file mode 100644 index 00000000..f02863bd --- /dev/null +++ b/tests/AnimeClient/test_data/Kitsu/characterBeforeTransform.json @@ -0,0 +1,3178 @@ +{ + "data": { + "findCharacterBySlug": { + "id": "6553", + "image": { + "original": { + "url": "https://media.kitsu.io/characters/images/6553/original.jpg?1483096805" + } + }, + "description": { + "en": "Height: 154 cm\u003cbr/\u003eWeight: 42 kg\u003cbr/\u003eBWH: 73-53-76\u003cbr/\u003eBlood type: O\u003cbr/\u003eArmaments: armor, sword\u003cbr/\u003eLikes: well structured meals, stuffed animals\u003cbr/\u003eDislikes: badly structured meals, dressing up too much\u003cbr/\u003eTalents: gymnastic exercise, secretly good in all kinds of gambling\u003cbr/\u003eFamous quote: \"There are no regrets. If one can be proud of one's life, one should not wish for another chance.\"\u003cbr/\u003e\u003cbr/\u003eFate/stay night\u003cbr/\u003e\u003cspan class=\"spoiler\"\u003eShe is Shirou's Servant, an agile but powerful warrior. Loyal, independent, and reserved, Saber acts coldly but is actually suppressing her emotions to focus on her goals. Her class is considered the \"Most Outstanding,\" with excellent ratings in all categories. Since her Master cannot effectively provide her with mana, she minimizes her activity to preserve what she has. Saber is frustrated by Shirou's \"protective\" tendencies, believing his erratic and reckless behavior will jeopardize her chances of winning the Holy Grail War.\u003cbr/\u003e\u003cbr/\u003eSaber is a strong-willed young woman who always speaks resolutely. She is courageous, determined, and set on winning the Holy Grail. She constantly insists that she is a knight first and that her gender is of little importance to her. She is resolute in following her own morals regardless of more viable tactics being available should she consider them to be underhanded, leading to conflicts with Kiritsugu over the strategy within the Fourth Holy Grail War. While obtaining the Holy Grail is of the utmost importance, rejecting her chivalry is something that she will not do under normal circumstance even if it should put her at a disadvantage.\u003cbr/\u003e\u003cbr/\u003eShe doesn't like to be treated as a woman, or even as a human, due to her status as a knight and a Servant. She tries to keep the notion that she is only a Servant, a tool for her Master, first and foremost in her mind, so she initially has no objections about Shirou accidentally seeing her naked body. She slowly becomes more aware of herself after their relationship develops, and eventually even becomes flustered upon the same situation being repeated. She is unwilling to show emotions, as she has suppressed them so strongly and views herself as a knight foremost. Even though she attempts to hide them, her insecurities become more and more apparent, and she later begins to open up more and show her emotions more easily, especially to Shirou.\u003cbr/\u003e\u003cbr/\u003eThough she once felt more linked to dragons, she came to enjoy lions after taking care of a lion cub for a month at some point in her life. She claims that it is not that she \"likes\" them, but rather the happiness she experienced as he became attached to her brought forth a bond with them. He was very energetic, often biting or scratching, but she wished to be able to stay with him until the end. She has had feelings for them since then, and even remembers the fond memories while holding a stuffed lion. Shirou seeing the memory of her rubbing her cheek against the lion comments on it being a time where she looks like a girl her age.\u003cbr/\u003e\u003cbr/\u003eShe is shown to have a humongous appetite, finishing large servings of rice within one minute. Although she can normally eat anything, Shirou's food education is what awoke her gourmet spirit. She originally did not appreciate modern food as she doesn't actually need to eat as a Servant and because she had believed that all food was like fish and chips. She had very bad experiences with the food in her time, due being limited to meals like large quantities of potatoes, vinegar, bread, and ale or even at times simply eating vegetables alone.\u003cbr/\u003e\u003cbr/\u003eShe did not concern herself with food much in her life, allowing the cooks to do as they wished. She felt it was unrefined, although she was not displeased by it. She does shudder at the thought of eating it compared to Shirou's cooking. She thought it had been made to suit the tastes of the knights because they acknowledged it as tasting good, but they simply were unable to say it was bad to the King's face.\u003cbr/\u003e\u003cbr/\u003eShe is very cold and merciless to Illya during most of Fate/stay night despite her being Irisviel's daughter. This is due to the fact that she never asked Irisviel about the name of her daughter, and when Saber sees Illya during the war, she completely disregards the possibility that it could be the same child. She believes that Illya is too young to be the girl she saw getting a piggy-back ride ten years before, and she believes that she would have become more mature like her mother by the time of the Fifth Holy Grail War. She reasons that Illya is a new homunculus completely unrelated to Irisviel with similarities in her appearance due to the Einzbern homunculi looking alike after their creation. Given a chance to casually interact with her, while she doesn't trust Illya at first, she is eventually able to act nicely around her. She is able to freely have fun around her without any worries.\u003c/span\u003e\u003cbr/\u003eFate/Zero\u003cbr/\u003e\u003cspan class=\"spoiler\"\u003eSaber is summoned by Kiritsugu Emiya to participate in the Fourth Holy Grail War on behalf of Jubstacheit von Einzbern and the Einzbern family. Kiritsugu partners Saber with Irisviel von Einzbern, to act as Saber's Master in the open while he acts from behind to win with his own methods. On the final day of the Holy Grail war, Saber found the Holy Grail but she also meets Gilgamesh who was waiting for her. He proposes that she becomes his wife while she lays defeated in front of him. Saber refuses as the Holy Grail is just in front of her. Saber destroyed the Holy Grail in the fourth Holy Grail War because Kiritsugu used multiple command seals in order to force her to act against her will. However, she only managed to destroy the Grail's physical form. She was also caught in her own Excalibur blast, sending her back to the battlefield of Camlann. She was the sixth and final servant to perish in the fourth Holy Grail War.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"spoiler\"\u003eHer true identity is that of King Arthur aka. Arthur Pendragon (Uther's daughter who hid her gender to be accepted as King). She has joined the Holy Grail War in order to grant her wish of redoing the selection of King due to her belief that she failed to keep her country from chaos. She wields the legendary holy sword Excalibur (cloaked in a veil of wind to hide its popular identity and thus its owner's) but no longer carries its lost sheath Avalon.\u003c/span\u003e\u003cbr/\u003e(Source: Type Moon Wikia, Wikipedia)" + }, + "names": { + "alternatives": [ + "King of Knights" + ], + "canonical": "Saber", + "canonicalLocale": null, + "localized": { + "en": "Saber", + "ja_jp": "セイバー" + } + }, + "media": { + "nodes": [ + { + "media": { + "id": "5028", + "slug": "fate-stay-night-tv-reproduction", + "titles": { + "alternatives": [ + "Fate/stay night Recap", + "Fate/stay night OVA" + ], + "canonical": "Fate/stay night TV Reproduction", + "canonicalLocale": "en_jp", + "localized": { + "en_jp": "Fate/stay night TV Reproduction", + "ja_jp": "Fate/stay night" + } + }, + "posterImage": { + "original": { + "height": 318, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/5028/original.jpg?1597698733", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/5028/tiny.jpg?1597698733", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/5028/small.jpg?1597698733", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/5028/medium.jpg?1597698733", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/5028/large.jpg?1597698733", + "width": 550 + } + ] + }, + "type": "Anime" + }, + "voices": { + "nodes": [ + { + "id": "296005", + "licensor": null, + "locale": "ja_jp", + "person": { + "id": "468", + "slug": "ayako-kawasumi", + "name": "Ayako Kawasumi", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Ayako Kawasumi", + "ja_jp": "川澄 綾子" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/468/original.jpg?1416260918", + "name": "original" + } + } + } + } + ] + } + }, + { + "media": { + "id": "7873", + "slug": "fate-zero-cafe", + "titles": { + "alternatives": [ + "Fate/Zero Café" + ], + "canonical": "Fate/Zero Cafe", + "canonicalLocale": "en_jp", + "localized": { + "en_jp": "Fate/Zero Cafe", + "ja_jp": "Fate/ゼロカフェ" + } + }, + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7873/original.jpg?1408462757", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7873/tiny.jpg?1408462757", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7873/small.jpg?1408462757", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7873/medium.jpg?1408462757", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7873/large.jpg?1408462757", + "width": null + } + ] + }, + "type": "Anime" + }, + "voices": { + "nodes": [] + } + }, + { + "media": { + "id": "4788", + "slug": "fate-stay-night-unlimited-blade-works", + "titles": { + "alternatives": [ + "Gekijouban Fate/Stay Night: Unlimited Blade Works", + "Fate/stay night Movie", + "Fate/stay night UBW" + ], + "canonical": "Fate/stay night Movie: Unlimited Blade Works", + "canonicalLocale": "en_jp", + "localized": { + "en": "Fate/stay night - Unlimited Blade Works", + "en_jp": "Fate/stay night Movie: Unlimited Blade Works", + "en_us": "Fate/stay night: Unlimited Blade Works", + "ja_jp": "劇場版 Fate/stay night: UNLIMITED BLADE WORKS" + } + }, + "posterImage": { + "original": { + "height": 320, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/4788/original.jpg?1597697939", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/4788/tiny.jpg?1597697939", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/4788/small.jpg?1597697939", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/4788/medium.jpg?1597697939", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/4788/large.jpg?1597697939", + "width": 550 + } + ] + }, + "type": "Anime" + }, + "voices": { + "nodes": [ + { + "id": "292239", + "licensor": null, + "locale": "ja_jp", + "person": { + "id": "468", + "slug": "ayako-kawasumi", + "name": "Ayako Kawasumi", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Ayako Kawasumi", + "ja_jp": "川澄 綾子" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/468/original.jpg?1416260918", + "name": "original" + } + } + } + }, + { + "id": "292240", + "licensor": null, + "locale": "en", + "person": { + "id": "225", + "slug": "michelle-ruff", + "name": "Michelle Ruff", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Michelle Ruff" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/225/original.jpg?1416260589", + "name": "original" + } + } + } + }, + { + "id": "292241", + "licensor": null, + "locale": "de", + "person": { + "id": "17174", + "slug": "iris-hassenzahl", + "name": "Iris Hassenzahl", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Iris Hassenzahl" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/17174/original.jpg?1533273089", + "name": "original" + } + } + } + }, + { + "id": "292242", + "licensor": null, + "locale": "fr", + "person": { + "id": "33010", + "slug": "dany-benedito", + "name": "Dany Benedito", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Dany Benedito" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/33010/original.jpg?1533275065", + "name": "original" + } + } + } + } + ] + } + }, + { + "media": { + "id": "10052", + "slug": "fate-stay-night-unlimited-blade-works-tv-2", + "titles": { + "alternatives": [ + "Fate/stay night (2015)", + "Fate - Stay Night" + ], + "canonical": "Fate/stay night: Unlimited Blade Works 2nd Season", + "canonicalLocale": "en_jp", + "localized": { + "en_jp": "Fate/stay night: Unlimited Blade Works 2nd Season", + "en_us": "Fate/stay night [Unlimited Blade Works] Season 2", + "ja_jp": "Fate/stay night [Unlimited Blade Works] 2nd シーズン" + } + }, + "posterImage": { + "original": { + "height": 1385, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/10052/original.jpg?1597696781", + "width": 955 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/10052/tiny.jpg?1597696781", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/10052/small.jpg?1597696781", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/10052/medium.jpg?1597696781", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/10052/large.jpg?1597696781", + "width": 550 + } + ] + }, + "type": "Anime" + }, + "voices": { + "nodes": [ + { + "id": "217762", + "licensor": null, + "locale": "ja_jp", + "person": { + "id": "468", + "slug": "ayako-kawasumi", + "name": "Ayako Kawasumi", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Ayako Kawasumi", + "ja_jp": "川澄 綾子" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/468/original.jpg?1416260918", + "name": "original" + } + } + } + }, + { + "id": "217764", + "licensor": null, + "locale": "en", + "person": { + "id": "238", + "slug": "kari-wahlgren", + "name": "Kari Wahlgren", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Kari Wahlgren" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/238/original.jpg?1416260610", + "name": "original" + } + } + } + }, + { + "id": "217766", + "licensor": null, + "locale": "it", + "person": { + "id": "7457", + "slug": "benedetta-degli-innocenti", + "name": "Benedetta Degli Innocenti", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Benedetta Degli Innocenti" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/7457/original.jpg?1416268653", + "name": "original" + } + } + } + } + ] + } + }, + { + "media": { + "id": "5992", + "slug": "carnival-phantasm", + "titles": { + "alternatives": [ + "Carnival Phantasm" + ], + "canonical": "Carnival Phantasm", + "canonicalLocale": "en_jp", + "localized": { + "en_jp": "Carnival Phantasm", + "ja_jp": "カーニバル・ファンタズム" + } + }, + "posterImage": { + "original": { + "height": 693, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/5992/original.jpg?1597697878", + "width": 533 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/5992/tiny.jpg?1597697878", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/5992/small.jpg?1597697878", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/5992/medium.jpg?1597697878", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/5992/large.jpg?1597697878", + "width": 550 + } + ] + }, + "type": "Anime" + }, + "voices": { + "nodes": [ + { + "id": "112413", + "licensor": null, + "locale": "ja_jp", + "person": { + "id": "468", + "slug": "ayako-kawasumi", + "name": "Ayako Kawasumi", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Ayako Kawasumi", + "ja_jp": "川澄 綾子" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/468/original.jpg?1416260918", + "name": "original" + } + } + } + } + ] + } + }, + { + "media": { + "id": "7342", + "slug": "carnival-phantasm-hibichika-special", + "titles": { + "alternatives": [ + "Carnival Phantasm (2013)", + "Carnival Phantasm Special Season" + ], + "canonical": "Carnival Phantasm: HibiChika Special", + "canonicalLocale": "en_jp", + "localized": { + "en_jp": "Carnival Phantasm: HibiChika Special", + "ja_jp": "カーニバル・ファンタズム ひびちかスペシャル" + } + }, + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7342/original.jpg?1408461040", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7342/tiny.jpg?1408461040", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7342/small.jpg?1408461040", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7342/medium.jpg?1408461040", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7342/large.jpg?1408461040", + "width": null + } + ] + }, + "type": "Anime" + }, + "voices": { + "nodes": [ + { + "id": "156253", + "licensor": null, + "locale": "ja_jp", + "person": { + "id": "468", + "slug": "ayako-kawasumi", + "name": "Ayako Kawasumi", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Ayako Kawasumi", + "ja_jp": "川澄 綾子" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/468/original.jpg?1416260918", + "name": "original" + } + } + } + } + ] + } + }, + { + "media": { + "id": "7882", + "slug": "fate-stay-night-unlimited-blade-works-2014", + "titles": { + "alternatives": [ + "Fate/stay night (2014)", + "Fate - Stay Night" + ], + "canonical": "Fate/stay night: Unlimited Blade Works", + "canonicalLocale": "en_jp", + "localized": { + "en": "Fate/stay night [Unlimited Blade Works]", + "en_jp": "Fate/stay night: Unlimited Blade Works", + "en_us": "Fate/stay night [Unlimited Blade Works]", + "ja_jp": "Fate/stay night [Unlimited Blade Works]" + } + }, + "posterImage": { + "original": { + "height": 1471, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7882/original.jpg?1597690834", + "width": 1000 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7882/tiny.jpg?1597690834", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7882/small.jpg?1597690834", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7882/medium.jpg?1597690834", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7882/large.jpg?1597690834", + "width": 550 + } + ] + }, + "type": "Anime" + }, + "voices": { + "nodes": [ + { + "id": "190309", + "licensor": null, + "locale": "ja_jp", + "person": { + "id": "468", + "slug": "ayako-kawasumi", + "name": "Ayako Kawasumi", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Ayako Kawasumi", + "ja_jp": "川澄 綾子" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/468/original.jpg?1416260918", + "name": "original" + } + } + } + }, + { + "id": "190310", + "licensor": null, + "locale": "en", + "person": { + "id": "238", + "slug": "kari-wahlgren", + "name": "Kari Wahlgren", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Kari Wahlgren" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/238/original.jpg?1416260610", + "name": "original" + } + } + } + }, + { + "id": "190312", + "licensor": null, + "locale": "de", + "person": { + "id": "17174", + "slug": "iris-hassenzahl", + "name": "Iris Hassenzahl", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Iris Hassenzahl" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/17174/original.jpg?1533273089", + "name": "original" + } + } + } + }, + { + "id": "190314", + "licensor": null, + "locale": "it", + "person": { + "id": "7457", + "slug": "benedetta-degli-innocenti", + "name": "Benedetta Degli Innocenti", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Benedetta Degli Innocenti" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/7457/original.jpg?1416268653", + "name": "original" + } + } + } + } + ] + } + }, + { + "media": { + "id": "6906", + "slug": "fate-zero-remix", + "titles": { + "alternatives": [ + "Fate/Zero Remix I", + "Fate/Zero Remix II" + ], + "canonical": "Fate/Zero Remix", + "canonicalLocale": "en_jp", + "localized": { + "en_jp": "Fate/Zero Remix", + "ja_jp": "フェイト/ゼロ Remix" + } + }, + "posterImage": { + "original": { + "height": 350, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6906/original.jpg?1597698293", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6906/tiny.jpg?1597698293", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6906/small.jpg?1597698293", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6906/medium.jpg?1597698293", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6906/large.jpg?1597698293", + "width": 550 + } + ] + }, + "type": "Anime" + }, + "voices": { + "nodes": [ + { + "id": "137898", + "licensor": null, + "locale": "ja_jp", + "person": { + "id": "468", + "slug": "ayako-kawasumi", + "name": "Ayako Kawasumi", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Ayako Kawasumi", + "ja_jp": "川澄 綾子" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/468/original.jpg?1416260918", + "name": "original" + } + } + } + } + ] + } + }, + { + "media": { + "id": "7173", + "slug": "fate-kaleid-liner-prisma-illya", + "titles": { + "alternatives": [], + "canonical": "Fate/kaleid liner Prisma☆Illya", + "canonicalLocale": "en_jp", + "localized": { + "en": "Fate/Kaleid Liner Prisma Illya", + "en_jp": "Fate/kaleid liner Prisma☆Illya", + "en_us": "Fate/Kaleid Liner Prisma Illya", + "ja_jp": "Fate/kaleid liner プリズマ☆イリヤ" + } + }, + "posterImage": { + "original": { + "height": 943, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7173/original.jpg?1597695114", + "width": 700 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7173/tiny.jpg?1597695114", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7173/small.jpg?1597695114", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7173/medium.jpg?1597695114", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7173/large.jpg?1597695114", + "width": 550 + } + ] + }, + "type": "Anime" + }, + "voices": { + "nodes": [ + { + "id": "147166", + "licensor": null, + "locale": "ja_jp", + "person": { + "id": "468", + "slug": "ayako-kawasumi", + "name": "Ayako Kawasumi", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Ayako Kawasumi", + "ja_jp": "川澄 綾子" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/468/original.jpg?1416260918", + "name": "original" + } + } + } + } + ] + } + }, + { + "media": { + "id": "8675", + "slug": "fate-stay-night-movie-heaven-s-feel", + "titles": { + "alternatives": [], + "canonical": "Fate/stay night: Heaven's Feel I. Presage Flower", + "canonicalLocale": "en", + "localized": { + "en": "Fate/stay night: Heaven's Feel I. Presage Flower", + "en_jp": "Gekijouban Fate/stay night: Heaven's Feel I. Presage Flower", + "ja_jp": "劇場版「Fate/stay night [Heaven's Feel] Ⅰ.presage flower」" + } + }, + "posterImage": { + "original": { + "height": 1701, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/8675/original.jpg?1597696968", + "width": 1200 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/8675/tiny.jpg?1597696968", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/8675/small.jpg?1597696968", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/8675/medium.jpg?1597696968", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/8675/large.jpg?1597696968", + "width": 550 + } + ] + }, + "type": "Anime" + }, + "voices": { + "nodes": [ + { + "id": "206579", + "licensor": null, + "locale": "ja_jp", + "person": { + "id": "468", + "slug": "ayako-kawasumi", + "name": "Ayako Kawasumi", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Ayako Kawasumi", + "ja_jp": "川澄 綾子" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/468/original.jpg?1416260918", + "name": "original" + } + } + } + }, + { + "id": "206580", + "licensor": null, + "locale": "it", + "person": { + "id": "7457", + "slug": "benedetta-degli-innocenti", + "name": "Benedetta Degli Innocenti", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Benedetta Degli Innocenti" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/7457/original.jpg?1416268653", + "name": "original" + } + } + } + }, + { + "id": "206581", + "licensor": null, + "locale": "en", + "person": { + "id": "238", + "slug": "kari-wahlgren", + "name": "Kari Wahlgren", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Kari Wahlgren" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/238/original.jpg?1416260610", + "name": "original" + } + } + } + } + ] + } + }, + { + "media": { + "id": "6028", + "slug": "fate-zero", + "titles": { + "alternatives": [], + "canonical": "Fate/Zero", + "canonicalLocale": "en_jp", + "localized": { + "en": "Fate/Zero", + "en_jp": "Fate/Zero", + "en_us": "Fate/Zero", + "ja_jp": "フェイト/ゼロ" + } + }, + "posterImage": { + "original": { + "height": 2000, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6028/original.jpg?1597698769", + "width": 1408 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6028/tiny.jpg?1597698769", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6028/small.jpg?1597698769", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6028/medium.jpg?1597698769", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6028/large.jpg?1597698769", + "width": 550 + } + ] + }, + "type": "Anime" + }, + "voices": { + "nodes": [ + { + "id": "114610", + "licensor": null, + "locale": "ja_jp", + "person": { + "id": "468", + "slug": "ayako-kawasumi", + "name": "Ayako Kawasumi", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Ayako Kawasumi", + "ja_jp": "川澄 綾子" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/468/original.jpg?1416260918", + "name": "original" + } + } + } + }, + { + "id": "114612", + "licensor": null, + "locale": "en", + "person": { + "id": "238", + "slug": "kari-wahlgren", + "name": "Kari Wahlgren", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Kari Wahlgren" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/238/original.jpg?1416260610", + "name": "original" + } + } + } + }, + { + "id": "114613", + "licensor": null, + "locale": "ko", + "person": { + "id": "67", + "slug": "jeong-hwa-yang", + "name": "Jeong Hwa Yang", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Jeong Hwa Yang", + "ja_jp": "양 정화" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/67/original.jpg?1416260395", + "name": "original" + } + } + } + }, + { + "id": "114614", + "licensor": null, + "locale": "de", + "person": { + "id": "17174", + "slug": "iris-hassenzahl", + "name": "Iris Hassenzahl", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Iris Hassenzahl" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/17174/original.jpg?1533273089", + "name": "original" + } + } + } + } + ] + } + }, + { + "media": { + "id": "7658", + "slug": "fate-zero-2nd-season", + "titles": { + "alternatives": [ + "Fate/Zero Second Season" + ], + "canonical": "Fate/Zero 2nd Season", + "canonicalLocale": "en_jp", + "localized": { + "en": "Fate/Zero Season 2", + "en_jp": "Fate/Zero 2nd Season", + "en_us": "Fate/Zero Season 2", + "ja_jp": "フェイト/ゼロ 2ndシーズン" + } + }, + "posterImage": { + "original": { + "height": 6650, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7658/original.jpg?1597698796", + "width": 4675 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7658/tiny.jpg?1597698796", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7658/small.jpg?1597698796", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7658/medium.jpg?1597698796", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7658/large.jpg?1597698796", + "width": 550 + } + ] + }, + "type": "Anime" + }, + "voices": { + "nodes": [ + { + "id": "127102", + "licensor": null, + "locale": "ja_jp", + "person": { + "id": "468", + "slug": "ayako-kawasumi", + "name": "Ayako Kawasumi", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Ayako Kawasumi", + "ja_jp": "川澄 綾子" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/468/original.jpg?1416260918", + "name": "original" + } + } + } + }, + { + "id": "127104", + "licensor": null, + "locale": "en", + "person": { + "id": "238", + "slug": "kari-wahlgren", + "name": "Kari Wahlgren", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Kari Wahlgren" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/238/original.jpg?1416260610", + "name": "original" + } + } + } + }, + { + "id": "127106", + "licensor": null, + "locale": "de", + "person": { + "id": "17174", + "slug": "iris-hassenzahl", + "name": "Iris Hassenzahl", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Iris Hassenzahl" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/17174/original.jpg?1533273089", + "name": "original" + } + } + } + } + ] + } + }, + { + "media": { + "id": "323", + "slug": "fate-stay-night", + "titles": { + "alternatives": [ + "Fate - Stay Night" + ], + "canonical": "Fate/stay night", + "canonicalLocale": "en_jp", + "localized": { + "en": "Fate/stay night", + "en_jp": "Fate/stay night", + "en_us": "Fate/stay night", + "ja_jp": "Fate/stay night" + } + }, + "posterImage": { + "original": { + "height": 1074, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/323/original.jpg?1597698066", + "width": 760 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/323/tiny.jpg?1597698066", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/323/small.jpg?1597698066", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/323/medium.jpg?1597698066", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/323/large.jpg?1597698066", + "width": 550 + } + ] + }, + "type": "Anime" + }, + "voices": { + "nodes": [ + { + "id": "252862", + "licensor": null, + "locale": "ja_jp", + "person": { + "id": "468", + "slug": "ayako-kawasumi", + "name": "Ayako Kawasumi", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Ayako Kawasumi", + "ja_jp": "川澄 綾子" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/468/original.jpg?1416260918", + "name": "original" + } + } + } + }, + { + "id": "252863", + "licensor": null, + "locale": "en", + "person": { + "id": "284", + "slug": "kate-higgins", + "name": "Kate Higgins", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Kate Higgins" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/284/original.jpg?1416260678", + "name": "original" + } + } + } + }, + { + "id": "252864", + "licensor": null, + "locale": "en", + "person": { + "id": "1549", + "slug": "emily-woo-zeller", + "name": "Emily Woo Zeller", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Emily Woo Zeller" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/1549/original.jpg?1416262343", + "name": "original" + } + } + } + }, + { + "id": "252865", + "licensor": null, + "locale": "pt_br", + "person": { + "id": "781", + "slug": "priscila-franco", + "name": "Priscila Franco", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Priscila Franco" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/781/original.jpg?1416261317", + "name": "original" + } + } + } + }, + { + "id": "252867", + "licensor": null, + "locale": "ko", + "person": { + "id": "67", + "slug": "jeong-hwa-yang", + "name": "Jeong Hwa Yang", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Jeong Hwa Yang", + "ja_jp": "양 정화" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/67/original.jpg?1416260395", + "name": "original" + } + } + } + }, + { + "id": "252869", + "licensor": null, + "locale": "es", + "person": { + "id": "25876", + "slug": "marycel-gonzalez", + "name": "Marycel González", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Marycel González" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/25876/original.jpg?1486415264", + "name": "original" + } + } + } + }, + { + "id": "252871", + "licensor": null, + "locale": "fr", + "person": { + "id": "33010", + "slug": "dany-benedito", + "name": "Dany Benedito", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Dany Benedito" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/33010/original.jpg?1533275065", + "name": "original" + } + } + } + }, + { + "id": "252872", + "licensor": null, + "locale": "es", + "person": { + "id": "33873", + "slug": "isabel-valls", + "name": "Isabel Valls", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Isabel Valls" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/33873/original.jpg?1533275201", + "name": "original" + } + } + } + } + ] + } + }, + { + "media": { + "id": "6685", + "slug": "carnival-phantasm-ex-season", + "titles": { + "alternatives": [ + "Carnival Phantasm OVA" + ], + "canonical": "Carnival Phantasm EX Season", + "canonicalLocale": "en_jp", + "localized": { + "en_jp": "Carnival Phantasm EX Season", + "ja_jp": "カーニバル・ファンタズム EX Season" + } + }, + "posterImage": { + "original": { + "height": 500, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6685/original.jpg?1597697725", + "width": 351 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6685/tiny.jpg?1597697725", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6685/small.jpg?1597697725", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6685/medium.jpg?1597697725", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6685/large.jpg?1597697725", + "width": 550 + } + ] + }, + "type": "Anime" + }, + "voices": { + "nodes": [ + { + "id": "130657", + "licensor": null, + "locale": "ja_jp", + "person": { + "id": "468", + "slug": "ayako-kawasumi", + "name": "Ayako Kawasumi", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Ayako Kawasumi", + "ja_jp": "川澄 綾子" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/468/original.jpg?1416260918", + "name": "original" + } + } + } + } + ] + } + }, + { + "media": { + "id": "6695", + "slug": "carnival-phantasm-illya-s-castle", + "titles": { + "alternatives": [ + "Carnival Phantasm Special", + "Carnival Phantasm: Illya's Castle" + ], + "canonical": "Carnival Phantasm: Illya-jou", + "canonicalLocale": "en_jp", + "localized": { + "en_jp": "Carnival Phantasm: Illya-jou", + "ja_jp": "カーニバル・ファンタズム: イリヤ城" + } + }, + "posterImage": { + "original": { + "height": 338, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6695/original.jpg?1597698397", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6695/tiny.jpg?1597698397", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6695/small.jpg?1597698397", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6695/medium.jpg?1597698397", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6695/large.jpg?1597698397", + "width": 550 + } + ] + }, + "type": "Anime" + }, + "voices": { + "nodes": [ + { + "id": "131243", + "licensor": null, + "locale": "ja_jp", + "person": { + "id": "468", + "slug": "ayako-kawasumi", + "name": "Ayako Kawasumi", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Ayako Kawasumi", + "ja_jp": "川澄 綾子" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/468/original.jpg?1416260918", + "name": "original" + } + } + } + } + ] + } + }, + { + "media": { + "id": "11321", + "slug": "fate-stay-night-unlimited-blade-works-tv-2nd-season-sunny-day", + "titles": { + "alternatives": [ + "Fate/stay night [Unlimited Blade Works] Season 2 - Sunny Day" + ], + "canonical": "Fate/stay night: Unlimited Blade Works 2nd Season - Sunny Day", + "canonicalLocale": "en_jp", + "localized": { + "en_jp": "Fate/stay night: Unlimited Blade Works 2nd Season - Sunny Day", + "ja_jp": "Fate/stay night [Unlimited Blade Works] 新作映像「sunny day」" + } + }, + "posterImage": { + "original": { + "height": 1980, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/11321/original.jpg?1597697929", + "width": 1417 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/11321/tiny.jpg?1597697929", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/11321/small.jpg?1597697929", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/11321/medium.jpg?1597697929", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/11321/large.jpg?1597697929", + "width": 550 + } + ] + }, + "type": "Anime" + }, + "voices": { + "nodes": [ + { + "id": "229932", + "licensor": null, + "locale": "ja_jp", + "person": { + "id": "468", + "slug": "ayako-kawasumi", + "name": "Ayako Kawasumi", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Ayako Kawasumi", + "ja_jp": "川澄 綾子" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/468/original.jpg?1416260918", + "name": "original" + } + } + } + }, + { + "id": "229933", + "licensor": null, + "locale": "en", + "person": { + "id": "238", + "slug": "kari-wahlgren", + "name": "Kari Wahlgren", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Kari Wahlgren" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/238/original.jpg?1416260610", + "name": "original" + } + } + } + } + ] + } + }, + { + "media": { + "id": "1590", + "slug": "fate-stay-night", + "titles": { + "alternatives": [], + "canonical": "Fate/stay night", + "canonicalLocale": "en_jp", + "localized": { + "en": null, + "en_jp": "Fate/stay night", + "en_us": "Fate/stay night", + "ja_jp": "Fate/stay night" + } + }, + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/manga/poster_images/1590/original.jpg?1434252732", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/manga/poster_images/1590/tiny.jpg?1434252732", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/manga/poster_images/1590/small.jpg?1434252732", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/manga/poster_images/1590/medium.jpg?1434252732", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/manga/poster_images/1590/large.jpg?1434252732", + "width": null + } + ] + }, + "type": "Manga" + }, + "voices": { + "nodes": [] + } + }, + { + "media": { + "id": "7782", + "slug": "fate-kaleid-liner-prisma-illya", + "titles": { + "alternatives": [], + "canonical": "Fate/kaleid liner Prisma☆Illya", + "canonicalLocale": "en_jp", + "localized": { + "en": null, + "en_jp": "Fate/kaleid liner Prisma☆Illya", + "ja_jp": "Fate/kaleid liner プリズマ☆イリヤ" + } + }, + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/manga/poster_images/7782/original.jpg?1434266196", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/manga/poster_images/7782/tiny.jpg?1434266196", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/manga/poster_images/7782/small.jpg?1434266196", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/manga/poster_images/7782/medium.jpg?1434266196", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/manga/poster_images/7782/large.jpg?1434266196", + "width": null + } + ] + }, + "type": "Manga" + }, + "voices": { + "nodes": [] + } + }, + { + "media": { + "id": "8132", + "slug": "fate-zero", + "titles": { + "alternatives": [], + "canonical": "Fate/Zero", + "canonicalLocale": "en_jp", + "localized": { + "en_jp": "Fate/Zero", + "ja_jp": "Fate/Zero" + } + }, + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/manga/poster_images/8132/original.jpg?1493616972", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/manga/poster_images/8132/tiny.jpg?1493616972", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/manga/poster_images/8132/small.jpg?1493616972", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/manga/poster_images/8132/medium.jpg?1493616972", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/manga/poster_images/8132/large.jpg?1493616972", + "width": null + } + ] + }, + "type": "Manga" + }, + "voices": { + "nodes": [] + } + }, + { + "media": { + "id": "20224", + "slug": "fate-stay-night-comic-battle", + "titles": { + "alternatives": [], + "canonical": "Fate/stay night: Comic Battle", + "canonicalLocale": "en_jp", + "localized": { + "en": null, + "en_jp": "Fate/stay night: Comic Battle", + "ja_jp": "Fate/stay night comic battle" + } + }, + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/manga/poster_images/20224/original.jpg?1434293860", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/manga/poster_images/20224/tiny.jpg?1434293860", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/manga/poster_images/20224/small.jpg?1434293860", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/manga/poster_images/20224/medium.jpg?1434293860", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/manga/poster_images/20224/large.jpg?1434293860", + "width": null + } + ] + }, + "type": "Manga" + }, + "voices": { + "nodes": [] + } + }, + { + "media": { + "id": "9533", + "slug": "fate-stay-night-x-magical-girl-lyrical-nanoha", + "titles": { + "alternatives": [ + "Fate/stay night x Magical Girl Lyrical Nanoha 5th Anniversary Collaboration Comic", + "Mahou Shoujo Lyrical Nanoha" + ], + "canonical": "Fate/stay night x Mahou Shoujo Lyrical Nanoha", + "canonicalLocale": "en_jp", + "localized": { + "en": null, + "en_jp": "Fate/stay night x Mahou Shoujo Lyrical Nanoha", + "ja_jp": "Fate/stay night×魔法少女リリカルなのは" + } + }, + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/manga/poster_images/9533/original.jpg?1434270014", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/manga/poster_images/9533/tiny.jpg?1434270014", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/manga/poster_images/9533/small.jpg?1434270014", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/manga/poster_images/9533/medium.jpg?1434270014", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/manga/poster_images/9533/large.jpg?1434270014", + "width": null + } + ] + }, + "type": "Manga" + }, + "voices": { + "nodes": [] + } + }, + { + "media": { + "id": "18251", + "slug": "fate-zero-manga", + "titles": { + "alternatives": [], + "canonical": "Fate/Zero", + "canonicalLocale": "en_jp", + "localized": { + "en": null, + "en_jp": "Fate/Zero", + "en_us": "Fate/Zero", + "ja_jp": "Fate/Zero" + } + }, + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/manga/poster_images/18251/original.jpg?1434289541", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/manga/poster_images/18251/tiny.jpg?1434289541", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/manga/poster_images/18251/small.jpg?1434289541", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/manga/poster_images/18251/medium.jpg?1434289541", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/manga/poster_images/18251/large.jpg?1434289541", + "width": null + } + ] + }, + "type": "Manga" + }, + "voices": { + "nodes": [] + } + }, + { + "media": { + "id": "20870", + "slug": "all-around-type-moon", + "titles": { + "alternatives": [ + "Ahnen-Erube no Nichijou", + "A Day of Ahnenerbe", + "Another Day of Ahnenerbe", + "The Magical, Terrible Ahnenerbe", + "I Am Neco-Arc", + "Type Michelin ~The Trial of Hibi-Chika~", + "~Saber x Saber~", + "The Magical", + "Terrible Ahnenerbe" + ], + "canonical": "All Around Type-Moon", + "canonicalLocale": "en_jp", + "localized": { + "en": null, + "en_jp": "All Around Type-Moon", + "ja_jp": "ALL AROUND TYPE-MOON" + } + }, + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/manga/poster_images/20870/original.jpg?1434295256", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/manga/poster_images/20870/tiny.jpg?1434295256", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/manga/poster_images/20870/small.jpg?1434295256", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/manga/poster_images/20870/medium.jpg?1434295256", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/manga/poster_images/20870/large.jpg?1434295256", + "width": null + } + ] + }, + "type": "Manga" + }, + "voices": { + "nodes": [] + } + }, + { + "media": { + "id": "10498", + "slug": "fate-hollow-ataraxia", + "titles": { + "alternatives": [], + "canonical": "Fate/hollow ataraxia", + "canonicalLocale": "en_jp", + "localized": { + "en": null, + "en_jp": "Fate/hollow ataraxia", + "ja_jp": "Fate/hollow ataraxia" + } + }, + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/manga/poster_images/10498/original.jpg?1434272159", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/manga/poster_images/10498/tiny.jpg?1434272159", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/manga/poster_images/10498/small.jpg?1434272159", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/manga/poster_images/10498/medium.jpg?1434272159", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/manga/poster_images/10498/large.jpg?1434272159", + "width": null + } + ] + }, + "type": "Manga" + }, + "voices": { + "nodes": [] + } + }, + { + "media": { + "id": "35847", + "slug": "fate-stay-night-heaven-s-feel", + "titles": { + "alternatives": [], + "canonical": "Fate/stay night: Heaven's Feel", + "canonicalLocale": "en_jp", + "localized": { + "en": null, + "en_jp": "Fate/stay night: Heaven's Feel", + "ja_jp": "Fate/stay night [Heaven's Feel]" + } + }, + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/manga/poster_images/35847/original.jpg?1434327356", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/manga/poster_images/35847/tiny.jpg?1434327356", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/manga/poster_images/35847/small.jpg?1434327356", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/manga/poster_images/35847/medium.jpg?1434327356", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/manga/poster_images/35847/large.jpg?1434327356", + "width": null + } + ] + }, + "type": "Manga" + }, + "voices": { + "nodes": [] + } + }, + { + "media": { + "id": "38780", + "slug": "emiya-san-chi-no-kyou-no-gohan", + "titles": { + "alternatives": [], + "canonical": "Emiya-san Chi no Kyou no Gohan", + "canonicalLocale": "en_jp", + "localized": { + "en": "Today's Menu For Emiya Family", + "en_jp": "Emiya-san Chi no Kyou no Gohan", + "en_us": "Today's Menu For Emiya Family", + "ja_jp": "衛宮さんちの今日のごはん" + } + }, + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/manga/poster_images/38780/original.jpg?1493684265", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/manga/poster_images/38780/tiny.jpg?1493684265", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/manga/poster_images/38780/small.jpg?1493684265", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/manga/poster_images/38780/medium.jpg?1493684265", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/manga/poster_images/38780/large.jpg?1493684265", + "width": null + } + ] + }, + "type": "Manga" + }, + "voices": { + "nodes": [] + } + }, + { + "media": { + "id": "14154", + "slug": "emiya-san-chi-no-kyou-no-gohan", + "titles": { + "alternatives": [], + "canonical": "Emiya-san Chi no Kyou no Gohan", + "canonicalLocale": "en_jp", + "localized": { + "en": "Today's Menu for the Emiya Family", + "en_jp": "Emiya-san Chi no Kyou no Gohan", + "ja_jp": "衛宮さんちの今日のごはん" + } + }, + "posterImage": { + "original": { + "height": 1014, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/14154/original.jpg?1597697373", + "width": 730 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/14154/tiny.jpg?1597697373", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/14154/small.jpg?1597697373", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/14154/medium.jpg?1597697373", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/14154/large.jpg?1597697373", + "width": 550 + } + ] + }, + "type": "Anime" + }, + "voices": { + "nodes": [ + { + "id": "257395", + "licensor": null, + "locale": "ja_jp", + "person": { + "id": "468", + "slug": "ayako-kawasumi", + "name": "Ayako Kawasumi", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Ayako Kawasumi", + "ja_jp": "川澄 綾子" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/468/original.jpg?1416260918", + "name": "original" + } + } + } + } + ] + } + }, + { + "media": { + "id": "12007", + "slug": "fate-stay-night-movie-heaven-s-feel-2", + "titles": { + "alternatives": [], + "canonical": "Fate/stay night: Heaven's Feel II. Lost Butterfly", + "canonicalLocale": "en", + "localized": { + "en": "Fate/stay night: Heaven's Feel II. Lost Butterfly", + "en_jp": "Gekijouban Fate/stay night: Heaven's Feel II. Lost Butterfly", + "ja_jp": "劇場版「Fate/stay night [Heaven's Feel] ⅠⅠ.lost butterfly" + } + }, + "posterImage": { + "original": { + "height": 2799, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/12007/original.jpg?1597696985", + "width": 2000 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/12007/tiny.jpg?1597696985", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/12007/small.jpg?1597696985", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/12007/medium.jpg?1597696985", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/12007/large.jpg?1597696985", + "width": 550 + } + ] + }, + "type": "Anime" + }, + "voices": { + "nodes": [ + { + "id": "240351", + "licensor": null, + "locale": "ja_jp", + "person": { + "id": "468", + "slug": "ayako-kawasumi", + "name": "Ayako Kawasumi", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Ayako Kawasumi", + "ja_jp": "川澄 綾子" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/468/original.jpg?1416260918", + "name": "original" + } + } + } + } + ] + } + }, + { + "media": { + "id": "12710", + "slug": "fate-grand-order-first-order", + "titles": { + "alternatives": [], + "canonical": "Fate/Grand Order: First Order", + "canonicalLocale": "en_jp", + "localized": { + "en": "Fate/Grand Order -First Order-", + "en_jp": "Fate/Grand Order: First Order", + "ja_jp": "Fate/Grand Order -First Order-" + } + }, + "posterImage": { + "original": { + "height": 648, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/12710/original.png?1597698686", + "width": 460 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/12710/tiny.jpg?1597698686", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/12710/small.jpg?1597698686", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/12710/medium.jpg?1597698686", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/12710/large.jpg?1597698686", + "width": 550 + } + ] + }, + "type": "Anime" + }, + "voices": { + "nodes": [ + { + "id": "246311", + "licensor": null, + "locale": "ja_jp", + "person": { + "id": "468", + "slug": "ayako-kawasumi", + "name": "Ayako Kawasumi", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Ayako Kawasumi", + "ja_jp": "川澄 綾子" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/468/original.jpg?1416260918", + "name": "original" + } + } + } + }, + { + "id": "246313", + "licensor": null, + "locale": "en", + "person": { + "id": "238", + "slug": "kari-wahlgren", + "name": "Kari Wahlgren", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Kari Wahlgren" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/238/original.jpg?1416260610", + "name": "original" + } + } + } + } + ] + } + }, + { + "media": { + "id": "13066", + "slug": "fate-apocrypha", + "titles": { + "alternatives": [], + "canonical": "Fate/Apocrypha", + "canonicalLocale": "en_jp", + "localized": { + "en_jp": "Fate/Apocrypha", + "ja_jp": "Fate/Apocrypha" + } + }, + "posterImage": { + "original": { + "height": 2535, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/13066/original.jpg?1597698308", + "width": 1800 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/13066/tiny.jpg?1597698308", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/13066/small.jpg?1597698308", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/13066/medium.jpg?1597698308", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/13066/large.jpg?1597698308", + "width": 550 + } + ] + }, + "type": "Anime" + }, + "voices": { + "nodes": [ + { + "id": "249137", + "licensor": null, + "locale": "ja_jp", + "person": { + "id": "468", + "slug": "ayako-kawasumi", + "name": "Ayako Kawasumi", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Ayako Kawasumi", + "ja_jp": "川澄 綾子" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/468/original.jpg?1416260918", + "name": "original" + } + } + } + }, + { + "id": "249138", + "licensor": null, + "locale": "en", + "person": { + "id": "225", + "slug": "michelle-ruff", + "name": "Michelle Ruff", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Michelle Ruff" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/225/original.jpg?1416260589", + "name": "original" + } + } + } + }, + { + "id": "249140", + "licensor": null, + "locale": "es", + "person": { + "id": "34665", + "slug": "desire-pillado", + "name": "Desiré Pillado", + "names": { + "alternatives": [], + "canonical": "en", + "canonicalLocale": null, + "localized": { + "en": "Desiré Pillado" + } + }, + "image": { + "original": { + "height": null, + "width": null, + "url": "https://media.kitsu.io/people/images/34665/original.jpg?1533275328", + "name": "original" + } + } + } + } + ] + } + }, + { + "media": { + "id": "13874", + "slug": "fate-grand-order-cms", + "titles": { + "alternatives": [], + "canonical": "Fate/Grand Order CMs", + "canonicalLocale": "en_jp", + "localized": { + "en_jp": "Fate/Grand Order CMs", + "ja_jp": "Fate/Grand Order" + } + }, + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/13874/original.jpg?1506646077", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/13874/tiny.jpg?1506646077", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/13874/small.jpg?1506646077", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/13874/medium.jpg?1506646077", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/13874/large.jpg?1506646077", + "width": null + } + ] + }, + "type": "Anime" + }, + "voices": { + "nodes": [] + } + }, + { + "media": { + "id": "1710", + "slug": "take-moon", + "titles": { + "alternatives": [], + "canonical": "Take Moon", + "canonicalLocale": "en_jp", + "localized": { + "en": null, + "en_jp": "Take Moon", + "ja_jp": "TYPE-MOON作品集・TAKE MOON" + } + }, + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/manga/poster_images/1710/original.jpg?1434253007", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/manga/poster_images/1710/tiny.jpg?1434253007", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/manga/poster_images/1710/small.jpg?1434253007", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/manga/poster_images/1710/medium.jpg?1434253007", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/manga/poster_images/1710/large.jpg?1434253007", + "width": null + } + ] + }, + "type": "Manga" + }, + "voices": { + "nodes": [] + } + }, + { + "media": { + "id": "34356", + "slug": "fate-stay-night-garden-of-avalon", + "titles": { + "alternatives": [], + "canonical": "Fate/stay night: Garden of Avalon", + "canonicalLocale": "en_jp", + "localized": { + "en": null, + "en_jp": "Fate/stay night: Garden of Avalon", + "ja_jp": "Fate/stay night Garden of Avalon" + } + }, + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/manga/poster_images/34356/original.jpg?1434324146", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/manga/poster_images/34356/tiny.jpg?1434324146", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/manga/poster_images/34356/small.jpg?1434324146", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/manga/poster_images/34356/medium.jpg?1434324146", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/manga/poster_images/34356/large.jpg?1434324146", + "width": null + } + ] + }, + "type": "Manga" + }, + "voices": { + "nodes": [] + } + }, + { + "media": { + "id": "35473", + "slug": "chibichuki", + "titles": { + "alternatives": [ + "Type-Moon Gakuen: Chibi Chuki!" + ], + "canonical": "Type-Moon Gakuen: Chibichuki!", + "canonicalLocale": "en_jp", + "localized": { + "en": null, + "en_jp": "Type-Moon Gakuen: Chibichuki!", + "ja_jp": "TYPE-MOON学園 ちびちゅき!" + } + }, + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/manga/poster_images/35473/original.jpg?1434326526", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/manga/poster_images/35473/tiny.jpg?1434326526", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/manga/poster_images/35473/small.jpg?1434326526", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/manga/poster_images/35473/medium.jpg?1434326526", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/manga/poster_images/35473/large.jpg?1434326526", + "width": null + } + ] + }, + "type": "Manga" + }, + "voices": { + "nodes": [] + } + }, + { + "media": { + "id": "36203", + "slug": "fate-labyrinth", + "titles": { + "alternatives": [], + "canonical": "Fate/Labyrinth", + "canonicalLocale": "en_jp", + "localized": { + "en": null, + "en_jp": "Fate/Labyrinth", + "ja_jp": "Fate/Labyrinth" + } + }, + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/manga/poster_images/36203/original.jpg?1436352578", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/manga/poster_images/36203/tiny.jpg?1436352578", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/manga/poster_images/36203/small.jpg?1436352578", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/manga/poster_images/36203/medium.jpg?1436352578", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/manga/poster_images/36203/large.jpg?1436352578", + "width": null + } + ] + }, + "type": "Manga" + }, + "voices": { + "nodes": [] + } + } + ] + }, + "slug": "saber" + } + } +} \ No newline at end of file diff --git a/tests/AnimeClient/test_data/Kitsu/historyBeforeTransform.json b/tests/AnimeClient/test_data/Kitsu/historyBeforeTransform.json new file mode 100644 index 00000000..d1d47342 --- /dev/null +++ b/tests/AnimeClient/test_data/Kitsu/historyBeforeTransform.json @@ -0,0 +1,5846 @@ +{ + "data": { + "findProfileBySlug": { + "libraryEvents": { + "nodes": [ + { + "id": "47211008", + "changedData": { + "progress": [ + 6, + 7 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43825", + "slug": "shin-chuuka-ichiban-2nd-season", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43825/tiny.jpg?1609082225" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43825/small.jpg?1609082225" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43825/medium.jpg?1609082225" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43825/large.jpg?1609082225" + } + ] + }, + "titles": { + "alternatives": [ + "New Cooking Master Boy!" + ], + "canonical": "Shin Chuuka Ichiban! 2nd Season", + "localized": { + "en": "True Cooking Master Boy Season 2", + "en_jp": "Shin Chuuka Ichiban! 2nd Season", + "ja_jp": "真・中華一番!" + } + } + }, + "updatedAt": "2021-02-23T17:24:03Z" + }, + { + "id": "47197990", + "changedData": { + "progress": [ + 6, + 7 + ], + "time_spent": [ + 5520, + 6900 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43545", + "slug": "horimiya", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43545/tiny.jpg?1609224996" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43545/small.jpg?1609224996" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43545/medium.jpg?1609224996" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43545/large.jpg?1609224996" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Horimiya", + "localized": { + "en_jp": "Horimiya", + "ja_jp": "ホリミヤ" + } + } + }, + "updatedAt": "2021-02-23T12:45:26Z" + }, + { + "id": "47197145", + "changedData": { + "progress": [ + 6, + 7 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": null + }, + "media": { + "__typename": "Anime", + "id": "43818", + "slug": "kai-byoui-ramune", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43818/tiny.jpg?1608544506" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43818/small.jpg?1608544506" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43818/medium.jpg?1608544506" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43818/large.jpg?1608544506" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Kai Byoui Ramune", + "localized": { + "en": "Dr. Ramune -Mysterious Disease Specialist-", + "en_jp": "Kai Byoui Ramune", + "ja_jp": "怪病医ラムネ" + } + } + }, + "updatedAt": "2021-02-23T12:20:46Z" + }, + { + "id": "47150310", + "changedData": { + "progress": [ + 24, + 23 + ], + "time_spent": [ + 1992, + 1968 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1742", + "slug": "yes-precure-5", + "posterImage": { + "views": [ + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Yes! Precure 5", + "localized": { + "en": "Yes! Pretty Cure 5", + "en_jp": "Yes! Precure 5", + "en_us": "Yes! Pretty Cure 5", + "ja_jp": "Yes! プリキュア5" + } + } + }, + "updatedAt": "2021-02-22T20:25:05Z" + }, + { + "id": "47142671", + "changedData": { + "progress": [ + 7, + 8 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "42635", + "slug": "tatoeba-last-dungeon-mae-no-mura-no-shounen-ga-joban-no-machi-de-kurasu-youna-monogatari", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/42635/tiny.jpg?1571504181" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/42635/small.jpg?1571504181" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/42635/medium.jpg?1571504181" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/42635/large.jpg?1571504181" + } + ] + }, + "titles": { + "alternatives": [ + "Suppose a Kid from the Last Dungeon Boonies Moved to a Starter Town" + ], + "canonical": "Tatoeba Last Dungeon Mae no Mura no Shounen ga Joban no Machi de Kurasu Youna Monogatari", + "localized": { + "en_jp": "Tatoeba Last Dungeon Mae no Mura no Shounen ga Joban no Machi de Kurasu Youna Monogatari", + "ja_jp": "たとえばラストダンジョン前の村の少年が序盤の街で暮らすような物語" + } + } + }, + "updatedAt": "2021-02-22T17:50:38Z" + }, + { + "id": "47141571", + "changedData": { + "progress": [ + 6, + 7 + ], + "time_spent": [ + 4320, + 5760 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "The pervert aspect of this dampens my enjoyment. " + }, + "media": { + "__typename": "Anime", + "id": "42323", + "slug": "mushoku-tensei-isekai-ittara-honki-dasu", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/42323/tiny.jpg?1571408000" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/42323/small.jpg?1571408000" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/42323/medium.jpg?1571408000" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/42323/large.jpg?1571408000" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Mushoku Tensei: Isekai Ittara Honki Dasu", + "localized": { + "en": "Mushoku Tensei: Jobless Reincarnation", + "en_jp": "Mushoku Tensei: Isekai Ittara Honki Dasu", + "ja_jp": "無職転生 ~異世界行ったら本気だす~" + } + } + }, + "updatedAt": "2021-02-22T17:27:39Z" + }, + { + "id": "47057900", + "changedData": { + "status": [ + "current", + "completed" + ] + }, + "kind": "UPDATED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "42650", + "slug": "healin-good-precure", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/42650/tiny.jpg?1578070083" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/42650/small.jpg?1578070083" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/42650/medium.jpg?1578070083" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/42650/large.jpg?1578070083" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Healin' Good♡Precure", + "localized": { + "en": "Healin' Good Pretty Cure", + "en_jp": "Healin' Good♡Precure", + "ja_jp": "ヒーリングっど♡プリキュア" + } + } + }, + "updatedAt": "2021-02-21T12:47:27Z" + }, + { + "id": "47057899", + "changedData": { + "progress": [ + 44, + 45 + ], + "time_spent": [ + 63360, + 64800 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "42650", + "slug": "healin-good-precure", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/42650/tiny.jpg?1578070083" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/42650/small.jpg?1578070083" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/42650/medium.jpg?1578070083" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/42650/large.jpg?1578070083" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Healin' Good♡Precure", + "localized": { + "en": "Healin' Good Pretty Cure", + "en_jp": "Healin' Good♡Precure", + "ja_jp": "ヒーリングっど♡プリキュア" + } + } + }, + "updatedAt": "2021-02-21T12:47:27Z" + }, + { + "id": "47027732", + "changedData": { + "progress": [ + 23, + 24 + ], + "time_spent": [ + 1968, + 1992 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1742", + "slug": "yes-precure-5", + "posterImage": { + "views": [ + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Yes! Precure 5", + "localized": { + "en": "Yes! Pretty Cure 5", + "en_jp": "Yes! Precure 5", + "en_us": "Yes! Pretty Cure 5", + "ja_jp": "Yes! プリキュア5" + } + } + }, + "updatedAt": "2021-02-20T23:39:13Z" + }, + { + "id": "47026266", + "changedData": { + "progress": [ + 22, + 23 + ], + "time_spent": [ + 1944, + 1968 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1742", + "slug": "yes-precure-5", + "posterImage": { + "views": [ + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Yes! Precure 5", + "localized": { + "en": "Yes! Pretty Cure 5", + "en_jp": "Yes! Precure 5", + "en_us": "Yes! Pretty Cure 5", + "ja_jp": "Yes! プリキュア5" + } + } + }, + "updatedAt": "2021-02-20T23:14:59Z" + }, + { + "id": "47024295", + "changedData": { + "progress": [ + 6, + 7 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43301", + "slug": "ore-dake-haireru-kakushi-dungeon", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43301/tiny.jpg?1607696005" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43301/small.jpg?1607696005" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43301/medium.jpg?1607696005" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43301/large.jpg?1607696005" + } + ] + }, + "titles": { + "alternatives": [ + "Special training in the Secret Dungeon", + "Ore Dake Haireru Kakushi Dungeon: Kossori Kitaete Sekai Saikyou" + ], + "canonical": "Ore dake Haireru Kakushi Dungeon", + "localized": { + "en": "The Hidden Dungeon Only I Can Enter", + "en_jp": "Ore dake Haireru Kakushi Dungeon", + "ja_jp": "俺だけ入れる隠しダンジョン" + } + } + }, + "updatedAt": "2021-02-20T22:42:45Z" + }, + { + "id": "47022910", + "changedData": { + "progress": [ + 18, + 19 + ], + "time_spent": [ + 360, + 420 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43550", + "slug": "inu-to-neko-docchi-mo-katteru-to-mainichi-tanoshii", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43550/tiny.jpg?1600679941" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43550/small.jpg?1600679941" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43550/medium.jpg?1600679941" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43550/large.jpg?1600679941" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Inu to Neko Docchi mo Katteru to Mainichi Tanoshii", + "localized": { + "en": "With a Dog and a Cat, Every Day is Fun", + "en_jp": "Inu to Neko Docchi mo Katteru to Mainichi Tanoshii", + "ja_jp": "犬と猫どっちも飼ってると毎日たのしい" + } + } + }, + "updatedAt": "2021-02-20T22:14:24Z" + }, + { + "id": "47022451", + "changedData": { + "progress": [ + 7, + 8 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43569", + "slug": "otona-no-bouguya-san-2nd-season", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43569/tiny.jpg?1601057792" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43569/small.jpg?1601057792" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43569/medium.jpg?1601057792" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43569/large.jpg?1601057792" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Otona no Bouguya-san 2nd Season", + "localized": { + "en": "Armor Shop for Ladies \u0026 Gentlemen 2nd Season", + "en_jp": "Otona no Bouguya-san 2nd Season", + "ja_jp": "おとなの防具屋さん 第2シリーズ" + } + } + }, + "updatedAt": "2021-02-20T22:05:29Z" + }, + { + "id": "47022229", + "changedData": { + "progress": [ + 6, + 7 + ], + "time_spent": [ + 4320, + 5760 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": null + }, + "media": { + "__typename": "Anime", + "id": "41463", + "slug": "kumo-desu-ga-nani-ka", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/41463/tiny.jpg?1593607925" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/41463/small.jpg?1593607925" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/41463/medium.jpg?1593607925" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/41463/large.jpg?1593607925" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Kumo desu ga, Nani ka?", + "localized": { + "en": "So I'm a Spider, So What?", + "en_jp": "Kumo desu ga, Nani ka?", + "ja_jp": "蜘蛛ですが、なにか?" + } + } + }, + "updatedAt": "2021-02-20T22:00:59Z" + }, + { + "id": "47020824", + "changedData": { + "progress": [ + 6, + 7 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "42324", + "slug": "5-toubun-no-hanayome-2", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/42324/tiny.jpg?1597697087" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/42324/small.jpg?1597697087" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/42324/medium.jpg?1597697087" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/42324/large.jpg?1597697087" + } + ] + }, + "titles": { + "alternatives": [ + "Gotoubun no Hanayome 2", + "The Five Wedded Brides 2", + "5-Toubun no Hanayome 2" + ], + "canonical": "5-toubun no Hanayome ∬", + "localized": { + "en": "The Quintessential Quintuplets 2", + "en_jp": "5-toubun no Hanayome ∬", + "ja_jp": "五等分の花嫁∬" + } + } + }, + "updatedAt": "2021-02-20T21:32:29Z" + }, + { + "id": "47019073", + "changedData": { + "progress": [ + 6, + 7 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43137", + "slug": "tenchi-souzou-design-bu", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43137/tiny.jpg?1611330634" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43137/small.jpg?1611330634" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43137/medium.jpg?1611330634" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43137/large.jpg?1611330634" + } + ] + }, + "titles": { + "alternatives": [ + "[Ten-De-Bu] What a strange animal!", + "Tendebu" + ], + "canonical": "Tenchi Souzou Design-bu", + "localized": { + "en": "Heaven's Design Team", + "en_jp": "Tenchi Souzou Design-bu", + "ja_jp": "天地創造デザイン部" + } + } + }, + "updatedAt": "2021-02-20T21:01:31Z" + }, + { + "id": "47017464", + "changedData": { + "progress": [ + 6, + 7 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "41976", + "slug": "yuru-camp-2", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/41976/tiny.jpg?1611329947" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/41976/small.jpg?1611329947" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/41976/medium.jpg?1611329947" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/41976/large.jpg?1611329947" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Yuru Camp△ 2", + "localized": { + "en": "Laid-Back Camp 2", + "en_jp": "Yuru Camp△ 2", + "ja_jp": "ゆるキャン△ 2" + } + } + }, + "updatedAt": "2021-02-20T20:27:54Z" + }, + { + "id": "47015272", + "changedData": { + "progress": [ + 19, + 20 + ], + "time_spent": [ + 4320, + 5760 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "InuYasha universe, mostly a different cast." + }, + "media": { + "__typename": "Anime", + "id": "43180", + "slug": "hanyou-no-yasha-hime", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43180/tiny.jpg?1589037137" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43180/small.jpg?1589037137" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43180/medium.jpg?1589037137" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43180/large.jpg?1589037137" + } + ] + }, + "titles": { + "alternatives": [ + "Inuyasha: Hanyou no Yasha Hime" + ], + "canonical": "Hanyou no Yashahime: Sengoku Otogizoushi", + "localized": { + "en": "Yashahime: Princess Half-Demon", + "en_jp": "Hanyou no Yashahime: Sengoku Otogizoushi", + "ja_jp": "半妖の夜叉姫" + } + } + }, + "updatedAt": "2021-02-20T19:47:33Z" + }, + { + "id": "47013918", + "changedData": { + "progress": [ + 6, + 7 + ], + "time_spent": [ + 0, + 1380 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": null + }, + "media": { + "__typename": "Anime", + "id": "42621", + "slug": "jaku-chara-tomozaki-kun", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/42621/tiny.jpg?1611329334" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/42621/small.jpg?1611329334" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/42621/medium.jpg?1611329334" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/42621/large.jpg?1611329334" + } + ] + }, + "titles": { + "alternatives": [ + "Bottom-tier Character Tomozaki", + "Jakusha Character Tomozaki-kun" + ], + "canonical": "Jaku-chara Tomozaki-kun", + "localized": { + "en": "The Low Tier Character \"Tomozaki-kun\"", + "en_jp": "Jaku-chara Tomozaki-kun", + "ja_jp": "弱キャラ友崎くん" + } + } + }, + "updatedAt": "2021-02-20T19:23:07Z" + }, + { + "id": "47012582", + "changedData": { + "progress": [ + 8, + 9 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43167", + "slug": "hataraku-saibou-black-tv", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43167/tiny.jpg?1611330065" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43167/small.jpg?1611330065" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43167/medium.jpg?1611330065" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43167/large.jpg?1611330065" + } + ] + }, + "titles": { + "alternatives": [ + "Cells at Work! Code Black" + ], + "canonical": "Hataraku Saibou Black (TV)", + "localized": { + "en_jp": "Hataraku Saibou Black (TV)", + "ja_jp": "はたらく細胞BLACK" + } + } + }, + "updatedAt": "2021-02-20T18:58:33Z" + }, + { + "id": "47011542", + "changedData": { + "progress": [ + 21, + 22 + ], + "time_spent": [ + 1920, + 1944 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1742", + "slug": "yes-precure-5", + "posterImage": { + "views": [ + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Yes! Precure 5", + "localized": { + "en": "Yes! Pretty Cure 5", + "en_jp": "Yes! Precure 5", + "en_us": "Yes! Pretty Cure 5", + "ja_jp": "Yes! プリキュア5" + } + } + }, + "updatedAt": "2021-02-20T18:35:49Z" + }, + { + "id": "46999511", + "changedData": { + "progress": [ + 6, + 7 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "42202", + "slug": "hataraku-saibou-2", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/42202/tiny.jpg?1611329853" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/42202/small.jpg?1611329853" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/42202/medium.jpg?1611329853" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/42202/large.jpg?1611329853" + } + ] + }, + "titles": { + "alternatives": [ + "Hataraku Saibou!!" + ], + "canonical": "Hataraku Saibou!!", + "localized": { + "en": "Cells at Work! 2", + "en_jp": "Hataraku Saibou!!", + "ja_jp": "はたらく細胞!!" + } + } + }, + "updatedAt": "2021-02-20T14:02:18Z" + }, + { + "id": "46935503", + "changedData": { + "progress": [ + 5, + 6 + ], + "time_spent": [ + 120, + 144 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": null + }, + "media": { + "__typename": "Anime", + "id": "42867", + "slug": "dr-stone-two", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/42867/tiny.jpg?1611329475" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/42867/small.jpg?1611329475" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/42867/medium.jpg?1611329475" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/42867/large.jpg?1611329475" + } + ] + }, + "titles": { + "alternatives": [ + "Dr. Stone 2nd Season", + "Dr. Stone Second Season" + ], + "canonical": "Dr. Stone: Stone Wars", + "localized": { + "en_jp": "Dr. Stone: Stone Wars", + "ja_jp": "ドクターストーン STONE WARS" + } + } + }, + "updatedAt": "2021-02-19T12:55:58Z" + }, + { + "id": "46884733", + "changedData": { + "progress": [ + 12, + 13 + ], + "time_spent": [ + 17280, + 18720 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": null + }, + "media": { + "__typename": "Anime", + "id": "1843", + "slug": "mahou-no-tenshi-creamy-mami", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096" + } + ] + }, + "titles": { + "alternatives": [ + "Incantevole Creamy", + "Creamy Mami", + "the Magic Angel" + ], + "canonical": "Mahou no Tenshi Creamy Mami", + "localized": { + "en": "Magical Angel Creamy Mami", + "en_jp": "Mahou no Tenshi Creamy Mami", + "en_us": "Magical Angel Creamy Mami", + "ja_jp": "魔法の天使 クリィミーマミ" + } + } + }, + "updatedAt": "2021-02-18T17:25:49Z" + }, + { + "id": "46872813", + "changedData": { + "progress": [ + 11, + 12 + ], + "time_spent": [ + 15840, + 17280 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": null + }, + "media": { + "__typename": "Anime", + "id": "1843", + "slug": "mahou-no-tenshi-creamy-mami", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096" + } + ] + }, + "titles": { + "alternatives": [ + "Incantevole Creamy", + "Creamy Mami", + "the Magic Angel" + ], + "canonical": "Mahou no Tenshi Creamy Mami", + "localized": { + "en": "Magical Angel Creamy Mami", + "en_jp": "Mahou no Tenshi Creamy Mami", + "en_us": "Magical Angel Creamy Mami", + "ja_jp": "魔法の天使 クリィミーマミ" + } + } + }, + "updatedAt": "2021-02-18T13:00:42Z" + }, + { + "id": "46846704", + "changedData": { + "progress": [ + 20, + 21 + ], + "time_spent": [ + 1896, + 1920 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1742", + "slug": "yes-precure-5", + "posterImage": { + "views": [ + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Yes! Precure 5", + "localized": { + "en": "Yes! Pretty Cure 5", + "en_jp": "Yes! Precure 5", + "en_us": "Yes! Pretty Cure 5", + "ja_jp": "Yes! プリキュア5" + } + } + }, + "updatedAt": "2021-02-18T01:06:18Z" + }, + { + "id": "46845383", + "changedData": { + "progress": [ + 19, + 20 + ], + "time_spent": [ + 1872, + 1896 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1742", + "slug": "yes-precure-5", + "posterImage": { + "views": [ + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Yes! Precure 5", + "localized": { + "en": "Yes! Pretty Cure 5", + "en_jp": "Yes! Precure 5", + "en_us": "Yes! Pretty Cure 5", + "ja_jp": "Yes! プリキュア5" + } + } + }, + "updatedAt": "2021-02-18T00:37:32Z" + }, + { + "id": "46844029", + "changedData": { + "progress": [ + 6, + 7 + ], + "time_spent": [ + 0, + 1380 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": null + }, + "media": { + "__typename": "Anime", + "id": "43042", + "slug": "urasekai-picnic", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43042/tiny.jpg?1597691180" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43042/small.jpg?1597691180" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43042/medium.jpg?1597691180" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43042/large.jpg?1597691180" + } + ] + }, + "titles": { + "alternatives": [ + "Ura Sekai Picnic" + ], + "canonical": "Urasekai Picnic", + "localized": { + "en_jp": "Urasekai Picnic", + "en_us": "Otherside Picnic", + "ja_jp": "裏世界ピクニック" + } + } + }, + "updatedAt": "2021-02-18T00:03:44Z" + }, + { + "id": "46825041", + "changedData": { + "notes": [ + null, + "" + ] + }, + "kind": "ANNOTATED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43247", + "slug": "rezero-season-2-part-2", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43247/tiny.jpg?1607955457" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43247/small.jpg?1607955457" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43247/medium.jpg?1607955457" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43247/large.jpg?1607955457" + } + ] + }, + "titles": { + "alternatives": [ + "Re:Zero - Starting Life in Another World 2 Part 2", + "Re: Life in a different world from zero 2nd Season Part 2" + ], + "canonical": "Re:Zero kara Hajimeru Isekai Seikatsu 2nd Season Part 2", + "localized": { + "en": "Re:ZERO -Starting Life in Another World- Season 2 Part 2", + "en_jp": "Re:Zero kara Hajimeru Isekai Seikatsu 2nd Season Part 2", + "ja_jp": "ゼロから始める異世界生活" + } + } + }, + "updatedAt": "2021-02-17T18:10:34Z" + }, + { + "id": "46825040", + "changedData": { + "rating": [ + null, + 18 + ] + }, + "kind": "RATED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43247", + "slug": "rezero-season-2-part-2", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43247/tiny.jpg?1607955457" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43247/small.jpg?1607955457" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43247/medium.jpg?1607955457" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43247/large.jpg?1607955457" + } + ] + }, + "titles": { + "alternatives": [ + "Re:Zero - Starting Life in Another World 2 Part 2", + "Re: Life in a different world from zero 2nd Season Part 2" + ], + "canonical": "Re:Zero kara Hajimeru Isekai Seikatsu 2nd Season Part 2", + "localized": { + "en": "Re:ZERO -Starting Life in Another World- Season 2 Part 2", + "en_jp": "Re:Zero kara Hajimeru Isekai Seikatsu 2nd Season Part 2", + "ja_jp": "ゼロから始める異世界生活" + } + } + }, + "updatedAt": "2021-02-17T18:10:34Z" + }, + { + "id": "46824973", + "changedData": { + "progress": [ + 6, + 7 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43247", + "slug": "rezero-season-2-part-2", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43247/tiny.jpg?1607955457" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43247/small.jpg?1607955457" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43247/medium.jpg?1607955457" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43247/large.jpg?1607955457" + } + ] + }, + "titles": { + "alternatives": [ + "Re:Zero - Starting Life in Another World 2 Part 2", + "Re: Life in a different world from zero 2nd Season Part 2" + ], + "canonical": "Re:Zero kara Hajimeru Isekai Seikatsu 2nd Season Part 2", + "localized": { + "en": "Re:ZERO -Starting Life in Another World- Season 2 Part 2", + "en_jp": "Re:Zero kara Hajimeru Isekai Seikatsu 2nd Season Part 2", + "ja_jp": "ゼロから始める異世界生活" + } + } + }, + "updatedAt": "2021-02-17T18:08:52Z" + }, + { + "id": "46823096", + "changedData": { + "progress": [ + 5, + 6 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43428", + "slug": "world-witches-hasshin-shimasu", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43428/tiny.jpg?1597691212" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43428/small.jpg?1597691212" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43428/medium.jpg?1597691212" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43428/large.jpg?1597691212" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "World Witches Hasshin Shimasu!", + "localized": { + "en": "World Witches Take Off!", + "en_jp": "World Witches Hasshin Shimasu!", + "ja_jp": "ワールドウィッチーズ発進しますっ!" + } + } + }, + "updatedAt": "2021-02-17T17:31:50Z" + }, + { + "id": "46811062", + "changedData": { + "progress": [ + 163, + 164 + ], + "time_spent": [ + 233040, + 234470 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "13209", + "slug": "black-clover-tv", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/13209/tiny.jpg?1611504643" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/13209/small.jpg?1611504643" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/13209/medium.jpg?1611504643" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/13209/large.jpg?1611504643" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Black Clover", + "localized": { + "en": "Black Clover", + "en_jp": "Black Clover", + "ja_jp": "ブラッククローバー" + } + } + }, + "updatedAt": "2021-02-17T13:15:11Z" + }, + { + "id": "46809985", + "changedData": { + "progress": [ + 5, + 6 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": null + }, + "media": { + "__typename": "Anime", + "id": "42196", + "slug": "tensei-shitara-slime-datta-ken-2", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/42196/tiny.jpg?1597691848" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/42196/small.jpg?1597691848" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/42196/medium.jpg?1597691848" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/42196/large.jpg?1597691848" + } + ] + }, + "titles": { + "alternatives": [ + "TenSura 2", + "Tensei Shitara Slime Datta Ken 2nd Season Part 1" + ], + "canonical": "Tensei shitara Slime Datta Ken 2", + "localized": { + "en": "That Time I Got Reincarnated as a Slime 2", + "en_jp": "Tensei shitara Slime Datta Ken 2", + "ja_jp": "転生したらスライムだった件2" + } + } + }, + "updatedAt": "2021-02-17T12:49:21Z" + }, + { + "id": "46770266", + "changedData": { + "progress": [ + 10, + 11 + ], + "time_spent": [ + 14400, + 15840 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": null + }, + "media": { + "__typename": "Anime", + "id": "1843", + "slug": "mahou-no-tenshi-creamy-mami", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096" + } + ] + }, + "titles": { + "alternatives": [ + "Incantevole Creamy", + "Creamy Mami", + "the Magic Angel" + ], + "canonical": "Mahou no Tenshi Creamy Mami", + "localized": { + "en": "Magical Angel Creamy Mami", + "en_jp": "Mahou no Tenshi Creamy Mami", + "en_us": "Magical Angel Creamy Mami", + "ja_jp": "魔法の天使 クリィミーマミ" + } + } + }, + "updatedAt": "2021-02-16T20:40:55Z" + }, + { + "id": "46761075", + "changedData": { + "progress": [ + 5, + 6 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43825", + "slug": "shin-chuuka-ichiban-2nd-season", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43825/tiny.jpg?1609082225" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43825/small.jpg?1609082225" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43825/medium.jpg?1609082225" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43825/large.jpg?1609082225" + } + ] + }, + "titles": { + "alternatives": [ + "New Cooking Master Boy!" + ], + "canonical": "Shin Chuuka Ichiban! 2nd Season", + "localized": { + "en": "True Cooking Master Boy Season 2", + "en_jp": "Shin Chuuka Ichiban! 2nd Season", + "ja_jp": "真・中華一番!" + } + } + }, + "updatedAt": "2021-02-16T17:28:40Z" + }, + { + "id": "46760387", + "changedData": { + "notes": [ + null, + "" + ] + }, + "kind": "ANNOTATED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43301", + "slug": "ore-dake-haireru-kakushi-dungeon", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43301/tiny.jpg?1607696005" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43301/small.jpg?1607696005" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43301/medium.jpg?1607696005" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43301/large.jpg?1607696005" + } + ] + }, + "titles": { + "alternatives": [ + "Special training in the Secret Dungeon", + "Ore Dake Haireru Kakushi Dungeon: Kossori Kitaete Sekai Saikyou" + ], + "canonical": "Ore dake Haireru Kakushi Dungeon", + "localized": { + "en": "The Hidden Dungeon Only I Can Enter", + "en_jp": "Ore dake Haireru Kakushi Dungeon", + "ja_jp": "俺だけ入れる隠しダンジョン" + } + } + }, + "updatedAt": "2021-02-16T17:15:33Z" + }, + { + "id": "46760386", + "changedData": { + "rating": [ + null, + 14 + ] + }, + "kind": "RATED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43301", + "slug": "ore-dake-haireru-kakushi-dungeon", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43301/tiny.jpg?1607696005" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43301/small.jpg?1607696005" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43301/medium.jpg?1607696005" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43301/large.jpg?1607696005" + } + ] + }, + "titles": { + "alternatives": [ + "Special training in the Secret Dungeon", + "Ore Dake Haireru Kakushi Dungeon: Kossori Kitaete Sekai Saikyou" + ], + "canonical": "Ore dake Haireru Kakushi Dungeon", + "localized": { + "en": "The Hidden Dungeon Only I Can Enter", + "en_jp": "Ore dake Haireru Kakushi Dungeon", + "ja_jp": "俺だけ入れる隠しダンジョン" + } + } + }, + "updatedAt": "2021-02-16T17:15:33Z" + }, + { + "id": "46760374", + "changedData": { + "notes": [ + null, + "" + ] + }, + "kind": "ANNOTATED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43428", + "slug": "world-witches-hasshin-shimasu", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43428/tiny.jpg?1597691212" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43428/small.jpg?1597691212" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43428/medium.jpg?1597691212" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43428/large.jpg?1597691212" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "World Witches Hasshin Shimasu!", + "localized": { + "en": "World Witches Take Off!", + "en_jp": "World Witches Hasshin Shimasu!", + "ja_jp": "ワールドウィッチーズ発進しますっ!" + } + } + }, + "updatedAt": "2021-02-16T17:15:12Z" + }, + { + "id": "46760373", + "changedData": { + "rating": [ + null, + 12 + ] + }, + "kind": "RATED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43428", + "slug": "world-witches-hasshin-shimasu", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43428/tiny.jpg?1597691212" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43428/small.jpg?1597691212" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43428/medium.jpg?1597691212" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43428/large.jpg?1597691212" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "World Witches Hasshin Shimasu!", + "localized": { + "en": "World Witches Take Off!", + "en_jp": "World Witches Hasshin Shimasu!", + "ja_jp": "ワールドウィッチーズ発進しますっ!" + } + } + }, + "updatedAt": "2021-02-16T17:15:12Z" + }, + { + "id": "46760109", + "changedData": { + "notes": [ + null, + "" + ] + }, + "kind": "ANNOTATED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43825", + "slug": "shin-chuuka-ichiban-2nd-season", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43825/tiny.jpg?1609082225" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43825/small.jpg?1609082225" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43825/medium.jpg?1609082225" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43825/large.jpg?1609082225" + } + ] + }, + "titles": { + "alternatives": [ + "New Cooking Master Boy!" + ], + "canonical": "Shin Chuuka Ichiban! 2nd Season", + "localized": { + "en": "True Cooking Master Boy Season 2", + "en_jp": "Shin Chuuka Ichiban! 2nd Season", + "ja_jp": "真・中華一番!" + } + } + }, + "updatedAt": "2021-02-16T17:10:31Z" + }, + { + "id": "46760108", + "changedData": { + "rating": [ + null, + 16 + ] + }, + "kind": "RATED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43825", + "slug": "shin-chuuka-ichiban-2nd-season", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43825/tiny.jpg?1609082225" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43825/small.jpg?1609082225" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43825/medium.jpg?1609082225" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43825/large.jpg?1609082225" + } + ] + }, + "titles": { + "alternatives": [ + "New Cooking Master Boy!" + ], + "canonical": "Shin Chuuka Ichiban! 2nd Season", + "localized": { + "en": "True Cooking Master Boy Season 2", + "en_jp": "Shin Chuuka Ichiban! 2nd Season", + "ja_jp": "真・中華一番!" + } + } + }, + "updatedAt": "2021-02-16T17:10:31Z" + }, + { + "id": "46716267", + "changedData": { + "progress": [ + 18, + 19 + ], + "time_spent": [ + 1848, + 1872 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1742", + "slug": "yes-precure-5", + "posterImage": { + "views": [ + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Yes! Precure 5", + "localized": { + "en": "Yes! Pretty Cure 5", + "en_jp": "Yes! Precure 5", + "en_us": "Yes! Pretty Cure 5", + "ja_jp": "Yes! プリキュア5" + } + } + }, + "updatedAt": "2021-02-15T22:49:37Z" + }, + { + "id": "45746341", + "changedData": { + "progress": [ + 5, + 6 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43167", + "slug": "hataraku-saibou-black-tv", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43167/tiny.jpg?1611330065" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43167/small.jpg?1611330065" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43167/medium.jpg?1611330065" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43167/large.jpg?1611330065" + } + ] + }, + "titles": { + "alternatives": [ + "Cells at Work! Code Black" + ], + "canonical": "Hataraku Saibou Black (TV)", + "localized": { + "en_jp": "Hataraku Saibou Black (TV)", + "ja_jp": "はたらく細胞BLACK" + } + } + }, + "updatedAt": "2021-01-30T16:09:51Z" + }, + { + "id": "45745352", + "changedData": { + "progress": [ + 3, + 4 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "42202", + "slug": "hataraku-saibou-2", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/42202/tiny.jpg?1611329853" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/42202/small.jpg?1611329853" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/42202/medium.jpg?1611329853" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/42202/large.jpg?1611329853" + } + ] + }, + "titles": { + "alternatives": [ + "Hataraku Saibou!!" + ], + "canonical": "Hataraku Saibou!!", + "localized": { + "en": "Cells at Work! 2", + "en_jp": "Hataraku Saibou!!", + "ja_jp": "はたらく細胞!!" + } + } + }, + "updatedAt": "2021-01-30T15:40:47Z" + }, + { + "id": "45691191", + "changedData": { + "progress": [ + 8, + 9 + ], + "time_spent": [ + 1608, + 1632 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1742", + "slug": "yes-precure-5", + "posterImage": { + "views": [ + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Yes! Precure 5", + "localized": { + "en": "Yes! Pretty Cure 5", + "en_jp": "Yes! Precure 5", + "en_us": "Yes! Pretty Cure 5", + "ja_jp": "Yes! プリキュア5" + } + } + }, + "updatedAt": "2021-01-29T18:26:49Z" + }, + { + "id": "45636802", + "changedData": { + "progress": [ + 1, + 2 + ], + "time_spent": [ + 1440, + 2880 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": null + }, + "media": { + "__typename": "Anime", + "id": "1843", + "slug": "mahou-no-tenshi-creamy-mami", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096" + } + ] + }, + "titles": { + "alternatives": [ + "Incantevole Creamy", + "Creamy Mami", + "the Magic Angel" + ], + "canonical": "Mahou no Tenshi Creamy Mami", + "localized": { + "en": "Magical Angel Creamy Mami", + "en_jp": "Mahou no Tenshi Creamy Mami", + "en_us": "Magical Angel Creamy Mami", + "ja_jp": "魔法の天使 クリィミーマミ" + } + } + }, + "updatedAt": "2021-01-28T17:57:44Z" + }, + { + "id": "45626831", + "changedData": { + "progress": [ + 0, + 1 + ], + "time_spent": [ + 0, + 1440 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": null + }, + "media": { + "__typename": "Anime", + "id": "1843", + "slug": "mahou-no-tenshi-creamy-mami", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096" + } + ] + }, + "titles": { + "alternatives": [ + "Incantevole Creamy", + "Creamy Mami", + "the Magic Angel" + ], + "canonical": "Mahou no Tenshi Creamy Mami", + "localized": { + "en": "Magical Angel Creamy Mami", + "en_jp": "Mahou no Tenshi Creamy Mami", + "en_us": "Magical Angel Creamy Mami", + "ja_jp": "魔法の天使 クリィミーマミ" + } + } + }, + "updatedAt": "2021-01-28T13:19:49Z" + }, + { + "id": "45625945", + "changedData": { + "progress": [ + 3, + 4 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": null + }, + "media": { + "__typename": "Anime", + "id": "43042", + "slug": "urasekai-picnic", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43042/tiny.jpg?1597691180" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43042/small.jpg?1597691180" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43042/medium.jpg?1597691180" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43042/large.jpg?1597691180" + } + ] + }, + "titles": { + "alternatives": [ + "Ura Sekai Picnic" + ], + "canonical": "Urasekai Picnic", + "localized": { + "en_jp": "Urasekai Picnic", + "en_us": "Otherside Picnic", + "ja_jp": "裏世界ピクニック" + } + } + }, + "updatedAt": "2021-01-28T12:49:24Z" + }, + { + "id": "45585487", + "changedData": { + "progress": [ + 2, + 3 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": null + }, + "media": { + "__typename": "Anime", + "id": "42196", + "slug": "tensei-shitara-slime-datta-ken-2", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/42196/tiny.jpg?1597691848" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/42196/small.jpg?1597691848" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/42196/medium.jpg?1597691848" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/42196/large.jpg?1597691848" + } + ] + }, + "titles": { + "alternatives": [ + "TenSura 2", + "Tensei Shitara Slime Datta Ken 2nd Season Part 1" + ], + "canonical": "Tensei shitara Slime Datta Ken 2", + "localized": { + "en": "That Time I Got Reincarnated as a Slime 2", + "en_jp": "Tensei shitara Slime Datta Ken 2", + "ja_jp": "転生したらスライムだった件2" + } + } + }, + "updatedAt": "2021-01-27T18:06:29Z" + }, + { + "id": "45572019", + "changedData": { + "progress": [ + 7, + 8 + ], + "time_spent": [ + 1584, + 1608 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1742", + "slug": "yes-precure-5", + "posterImage": { + "views": [ + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Yes! Precure 5", + "localized": { + "en": "Yes! Pretty Cure 5", + "en_jp": "Yes! Precure 5", + "en_us": "Yes! Pretty Cure 5", + "ja_jp": "Yes! プリキュア5" + } + } + }, + "updatedAt": "2021-01-27T12:54:31Z" + }, + { + "id": "45571028", + "changedData": { + "progress": [ + 160, + 161 + ], + "time_spent": [ + 228750, + 230180 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "13209", + "slug": "black-clover-tv", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/13209/tiny.jpg?1611504643" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/13209/small.jpg?1611504643" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/13209/medium.jpg?1611504643" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/13209/large.jpg?1611504643" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Black Clover", + "localized": { + "en": "Black Clover", + "en_jp": "Black Clover", + "ja_jp": "ブラッククローバー" + } + } + }, + "updatedAt": "2021-01-27T12:24:48Z" + }, + { + "id": "45529665", + "changedData": { + "progress": [ + 2, + 3 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43428", + "slug": "world-witches-hasshin-shimasu", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43428/tiny.jpg?1597691212" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43428/small.jpg?1597691212" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43428/medium.jpg?1597691212" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43428/large.jpg?1597691212" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "World Witches Hasshin Shimasu!", + "localized": { + "en": "World Witches Take Off!", + "en_jp": "World Witches Hasshin Shimasu!", + "ja_jp": "ワールドウィッチーズ発進しますっ!" + } + } + }, + "updatedAt": "2021-01-26T18:01:38Z" + }, + { + "id": "45529168", + "changedData": { + "progress": [ + 2, + 3 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43825", + "slug": "shin-chuuka-ichiban-2nd-season", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43825/tiny.jpg?1609082225" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43825/small.jpg?1609082225" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43825/medium.jpg?1609082225" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43825/large.jpg?1609082225" + } + ] + }, + "titles": { + "alternatives": [ + "New Cooking Master Boy!" + ], + "canonical": "Shin Chuuka Ichiban! 2nd Season", + "localized": { + "en": "True Cooking Master Boy Season 2", + "en_jp": "Shin Chuuka Ichiban! 2nd Season", + "ja_jp": "真・中華一番!" + } + } + }, + "updatedAt": "2021-01-26T17:49:04Z" + }, + { + "id": "45471756", + "changedData": { + "progress": [ + 3, + 4 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "42635", + "slug": "tatoeba-last-dungeon-mae-no-mura-no-shounen-ga-joban-no-machi-de-kurasu-youna-monogatari", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/42635/tiny.jpg?1571504181" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/42635/small.jpg?1571504181" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/42635/medium.jpg?1571504181" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/42635/large.jpg?1571504181" + } + ] + }, + "titles": { + "alternatives": [ + "Suppose a Kid from the Last Dungeon Boonies Moved to a Starter Town" + ], + "canonical": "Tatoeba Last Dungeon Mae no Mura no Shounen ga Joban no Machi de Kurasu Youna Monogatari", + "localized": { + "en_jp": "Tatoeba Last Dungeon Mae no Mura no Shounen ga Joban no Machi de Kurasu Youna Monogatari", + "ja_jp": "たとえばラストダンジョン前の村の少年が序盤の街で暮らすような物語" + } + } + }, + "updatedAt": "2021-01-25T17:56:13Z" + }, + { + "id": "45470609", + "changedData": { + "progress": [ + 40, + 41 + ], + "time_spent": [ + 57600, + 59040 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "42650", + "slug": "healin-good-precure", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/42650/tiny.jpg?1578070083" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/42650/small.jpg?1578070083" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/42650/medium.jpg?1578070083" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/42650/large.jpg?1578070083" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Healin' Good♡Precure", + "localized": { + "en": "Healin' Good Pretty Cure", + "en_jp": "Healin' Good♡Precure", + "ja_jp": "ヒーリングっど♡プリキュア" + } + } + }, + "updatedAt": "2021-01-25T17:29:55Z" + }, + { + "id": "45469463", + "changedData": { + "progress": [ + 2, + 3 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": null + }, + "media": { + "__typename": "Anime", + "id": "43818", + "slug": "kai-byoui-ramune", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43818/tiny.jpg?1608544506" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43818/small.jpg?1608544506" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43818/medium.jpg?1608544506" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43818/large.jpg?1608544506" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Kai Byoui Ramune", + "localized": { + "en": "Dr. Ramune -Mysterious Disease Specialist-", + "en_jp": "Kai Byoui Ramune", + "ja_jp": "怪病医ラムネ" + } + } + }, + "updatedAt": "2021-01-25T17:05:16Z" + }, + { + "id": "45433091", + "changedData": { + "progress": [ + 6, + 7 + ], + "time_spent": [ + 1560, + 1584 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1742", + "slug": "yes-precure-5", + "posterImage": { + "views": [ + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Yes! Precure 5", + "localized": { + "en": "Yes! Pretty Cure 5", + "en_jp": "Yes! Precure 5", + "en_us": "Yes! Pretty Cure 5", + "ja_jp": "Yes! プリキュア5" + } + } + }, + "updatedAt": "2021-01-25T01:16:10Z" + }, + { + "id": "45431671", + "changedData": { + "progress": [ + 2, + 3 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "The pervert aspect of this dampens my enjoyment. " + }, + "media": { + "__typename": "Anime", + "id": "42323", + "slug": "mushoku-tensei-isekai-ittara-honki-dasu", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/42323/tiny.jpg?1571408000" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/42323/small.jpg?1571408000" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/42323/medium.jpg?1571408000" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/42323/large.jpg?1571408000" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Mushoku Tensei: Isekai Ittara Honki Dasu", + "localized": { + "en": "Mushoku Tensei: Jobless Reincarnation", + "en_jp": "Mushoku Tensei: Isekai Ittara Honki Dasu", + "ja_jp": "無職転生 ~異世界行ったら本気だす~" + } + } + }, + "updatedAt": "2021-01-25T00:52:32Z" + }, + { + "id": "45430382", + "changedData": { + "progress": [ + 2, + 3 + ], + "time_spent": [ + 0, + 1380 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43545", + "slug": "horimiya", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43545/tiny.jpg?1609224996" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43545/small.jpg?1609224996" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43545/medium.jpg?1609224996" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43545/large.jpg?1609224996" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Horimiya", + "localized": { + "en_jp": "Horimiya", + "ja_jp": "ホリミヤ" + } + } + }, + "updatedAt": "2021-01-25T00:26:33Z" + }, + { + "id": "45370466", + "changedData": { + "progress": [ + 5, + 6 + ], + "time_spent": [ + 1536, + 1560 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1742", + "slug": "yes-precure-5", + "posterImage": { + "views": [ + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Yes! Precure 5", + "localized": { + "en": "Yes! Pretty Cure 5", + "en_jp": "Yes! Precure 5", + "en_us": "Yes! Pretty Cure 5", + "ja_jp": "Yes! プリキュア5" + } + } + }, + "updatedAt": "2021-01-24T00:18:29Z" + }, + { + "id": "45369278", + "changedData": { + "progress": [ + 4, + 5 + ], + "time_spent": [ + 1512, + 1536 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1742", + "slug": "yes-precure-5", + "posterImage": { + "views": [ + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Yes! Precure 5", + "localized": { + "en": "Yes! Pretty Cure 5", + "en_jp": "Yes! Precure 5", + "en_us": "Yes! Pretty Cure 5", + "ja_jp": "Yes! プリキュア5" + } + } + }, + "updatedAt": "2021-01-23T23:53:47Z" + }, + { + "id": "45368222", + "changedData": { + "progress": [ + 3, + 4 + ], + "time_spent": [ + 1488, + 1512 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1742", + "slug": "yes-precure-5", + "posterImage": { + "views": [ + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Yes! Precure 5", + "localized": { + "en": "Yes! Pretty Cure 5", + "en_jp": "Yes! Precure 5", + "en_us": "Yes! Pretty Cure 5", + "ja_jp": "Yes! プリキュア5" + } + } + }, + "updatedAt": "2021-01-23T23:29:37Z" + }, + { + "id": "45366144", + "changedData": { + "progress": [ + 2, + 3 + ], + "time_spent": [ + 1464, + 1488 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1742", + "slug": "yes-precure-5", + "posterImage": { + "views": [ + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Yes! Precure 5", + "localized": { + "en": "Yes! Pretty Cure 5", + "en_jp": "Yes! Precure 5", + "en_us": "Yes! Pretty Cure 5", + "ja_jp": "Yes! プリキュア5" + } + } + }, + "updatedAt": "2021-01-23T22:48:17Z" + }, + { + "id": "45364651", + "changedData": { + "progress": [ + 1, + 2 + ], + "time_spent": [ + 1440, + 1464 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1742", + "slug": "yes-precure-5", + "posterImage": { + "views": [ + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Yes! Precure 5", + "localized": { + "en": "Yes! Pretty Cure 5", + "en_jp": "Yes! Precure 5", + "en_us": "Yes! Pretty Cure 5", + "ja_jp": "Yes! プリキュア5" + } + } + }, + "updatedAt": "2021-01-23T22:25:36Z" + }, + { + "id": "45363270", + "changedData": { + "progress": [ + 0, + 1 + ], + "time_spent": [ + 0, + 1440 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1742", + "slug": "yes-precure-5", + "posterImage": { + "views": [ + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Yes! Precure 5", + "localized": { + "en": "Yes! Pretty Cure 5", + "en_jp": "Yes! Precure 5", + "en_us": "Yes! Pretty Cure 5", + "ja_jp": "Yes! プリキュア5" + } + } + }, + "updatedAt": "2021-01-23T21:56:50Z" + }, + { + "id": "45361702", + "changedData": { + "notes": [ + null, + "" + ] + }, + "kind": "ANNOTATED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1742", + "slug": "yes-precure-5", + "posterImage": { + "views": [ + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Yes! Precure 5", + "localized": { + "en": "Yes! Pretty Cure 5", + "en_jp": "Yes! Precure 5", + "en_us": "Yes! Pretty Cure 5", + "ja_jp": "Yes! プリキュア5" + } + } + }, + "updatedAt": "2021-01-23T21:32:39Z" + }, + { + "id": "45361701", + "changedData": { + "status": [ + "planned", + "current" + ] + }, + "kind": "UPDATED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1742", + "slug": "yes-precure-5", + "posterImage": { + "views": [ + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815" + }, + { + "width": null, + "height": null, + "url": "https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Yes! Precure 5", + "localized": { + "en": "Yes! Pretty Cure 5", + "en_jp": "Yes! Precure 5", + "en_us": "Yes! Pretty Cure 5", + "ja_jp": "Yes! プリキュア5" + } + } + }, + "updatedAt": "2021-01-23T21:32:39Z" + }, + { + "id": "45361017", + "changedData": { + "status": [ + "current", + "completed" + ] + }, + "kind": "UPDATED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1375", + "slug": "futari-wa-precure-splash-star", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Futari wa Precure: Splash☆Star", + "localized": { + "en": "Pretty Cure: Splash Star", + "en_jp": "Futari wa Precure: Splash☆Star", + "en_us": "Pretty Cure: Splash Star", + "ja_jp": "ふたりはプリキュア Splash☆Star" + } + } + }, + "updatedAt": "2021-01-23T21:20:56Z" + }, + { + "id": "45361016", + "changedData": { + "progress": [ + 48, + 49 + ], + "time_spent": [ + 2568, + 2592 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1375", + "slug": "futari-wa-precure-splash-star", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Futari wa Precure: Splash☆Star", + "localized": { + "en": "Pretty Cure: Splash Star", + "en_jp": "Futari wa Precure: Splash☆Star", + "en_us": "Pretty Cure: Splash Star", + "ja_jp": "ふたりはプリキュア Splash☆Star" + } + } + }, + "updatedAt": "2021-01-23T21:20:56Z" + }, + { + "id": "45359950", + "changedData": { + "progress": [ + 47, + 48 + ], + "time_spent": [ + 2544, + 2568 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1375", + "slug": "futari-wa-precure-splash-star", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Futari wa Precure: Splash☆Star", + "localized": { + "en": "Pretty Cure: Splash Star", + "en_jp": "Futari wa Precure: Splash☆Star", + "en_us": "Pretty Cure: Splash Star", + "ja_jp": "ふたりはプリキュア Splash☆Star" + } + } + }, + "updatedAt": "2021-01-23T21:00:16Z" + }, + { + "id": "45358544", + "changedData": { + "progress": [ + 46, + 47 + ], + "time_spent": [ + 2520, + 2544 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1375", + "slug": "futari-wa-precure-splash-star", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Futari wa Precure: Splash☆Star", + "localized": { + "en": "Pretty Cure: Splash Star", + "en_jp": "Futari wa Precure: Splash☆Star", + "en_us": "Pretty Cure: Splash Star", + "ja_jp": "ふたりはプリキュア Splash☆Star" + } + } + }, + "updatedAt": "2021-01-23T20:35:56Z" + }, + { + "id": "45352462", + "changedData": { + "progress": [ + 45, + 46 + ], + "time_spent": [ + 2496, + 2520 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1375", + "slug": "futari-wa-precure-splash-star", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Futari wa Precure: Splash☆Star", + "localized": { + "en": "Pretty Cure: Splash Star", + "en_jp": "Futari wa Precure: Splash☆Star", + "en_us": "Pretty Cure: Splash Star", + "ja_jp": "ふたりはプリキュア Splash☆Star" + } + } + }, + "updatedAt": "2021-01-23T18:36:34Z" + }, + { + "id": "45351234", + "changedData": { + "progress": [ + 44, + 45 + ], + "time_spent": [ + 2472, + 2496 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "1375", + "slug": "futari-wa-precure-splash-star", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Futari wa Precure: Splash☆Star", + "localized": { + "en": "Pretty Cure: Splash Star", + "en_jp": "Futari wa Precure: Splash☆Star", + "en_us": "Pretty Cure: Splash Star", + "ja_jp": "ふたりはプリキュア Splash☆Star" + } + } + }, + "updatedAt": "2021-01-23T18:10:06Z" + }, + { + "id": "45350120", + "changedData": { + "progress": [ + 15, + 16 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "InuYasha universe, mostly a different cast." + }, + "media": { + "__typename": "Anime", + "id": "43180", + "slug": "hanyou-no-yasha-hime", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43180/tiny.jpg?1589037137" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43180/small.jpg?1589037137" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43180/medium.jpg?1589037137" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43180/large.jpg?1589037137" + } + ] + }, + "titles": { + "alternatives": [ + "Inuyasha: Hanyou no Yasha Hime" + ], + "canonical": "Hanyou no Yashahime: Sengoku Otogizoushi", + "localized": { + "en": "Yashahime: Princess Half-Demon", + "en_jp": "Hanyou no Yashahime: Sengoku Otogizoushi", + "ja_jp": "半妖の夜叉姫" + } + } + }, + "updatedAt": "2021-01-23T17:40:53Z" + }, + { + "id": "45348842", + "changedData": { + "progress": [ + 2, + 3 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43301", + "slug": "ore-dake-haireru-kakushi-dungeon", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43301/tiny.jpg?1607696005" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43301/small.jpg?1607696005" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43301/medium.jpg?1607696005" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43301/large.jpg?1607696005" + } + ] + }, + "titles": { + "alternatives": [ + "Special training in the Secret Dungeon", + "Ore Dake Haireru Kakushi Dungeon: Kossori Kitaete Sekai Saikyou" + ], + "canonical": "Ore dake Haireru Kakushi Dungeon", + "localized": { + "en": "The Hidden Dungeon Only I Can Enter", + "en_jp": "Ore dake Haireru Kakushi Dungeon", + "ja_jp": "俺だけ入れる隠しダンジョン" + } + } + }, + "updatedAt": "2021-01-23T17:07:59Z" + }, + { + "id": "45347598", + "changedData": { + "progress": [ + 3, + 4 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43569", + "slug": "otona-no-bouguya-san-2nd-season", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43569/tiny.jpg?1601057792" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43569/small.jpg?1601057792" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43569/medium.jpg?1601057792" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43569/large.jpg?1601057792" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Otona no Bouguya-san 2nd Season", + "localized": { + "en": "Armor Shop for Ladies \u0026 Gentlemen 2nd Season", + "en_jp": "Otona no Bouguya-san 2nd Season", + "ja_jp": "おとなの防具屋さん 第2シリーズ" + } + } + }, + "updatedAt": "2021-01-23T16:36:34Z" + }, + { + "id": "45347581", + "changedData": { + "progress": [ + 14, + 15 + ], + "time_spent": [ + 120, + 180 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43550", + "slug": "inu-to-neko-docchi-mo-katteru-to-mainichi-tanoshii", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43550/tiny.jpg?1600679941" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43550/small.jpg?1600679941" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43550/medium.jpg?1600679941" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43550/large.jpg?1600679941" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Inu to Neko Docchi mo Katteru to Mainichi Tanoshii", + "localized": { + "en": "With a Dog and a Cat, Every Day is Fun", + "en_jp": "Inu to Neko Docchi mo Katteru to Mainichi Tanoshii", + "ja_jp": "犬と猫どっちも飼ってると毎日たのしい" + } + } + }, + "updatedAt": "2021-01-23T16:36:07Z" + }, + { + "id": "45346956", + "changedData": { + "progress": [ + 2, + 3 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": null + }, + "media": { + "__typename": "Anime", + "id": "41463", + "slug": "kumo-desu-ga-nani-ka", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/41463/tiny.jpg?1593607925" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/41463/small.jpg?1593607925" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/41463/medium.jpg?1593607925" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/41463/large.jpg?1593607925" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Kumo desu ga, Nani ka?", + "localized": { + "en": "So I'm a Spider, So What?", + "en_jp": "Kumo desu ga, Nani ka?", + "ja_jp": "蜘蛛ですが、なにか?" + } + } + }, + "updatedAt": "2021-01-23T16:18:43Z" + }, + { + "id": "45346222", + "changedData": { + "progress": [ + 2, + 3 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "42324", + "slug": "5-toubun-no-hanayome-2", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/42324/tiny.jpg?1597697087" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/42324/small.jpg?1597697087" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/42324/medium.jpg?1597697087" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/42324/large.jpg?1597697087" + } + ] + }, + "titles": { + "alternatives": [ + "Gotoubun no Hanayome 2", + "The Five Wedded Brides 2", + "5-Toubun no Hanayome 2" + ], + "canonical": "5-toubun no Hanayome ∬", + "localized": { + "en": "The Quintessential Quintuplets 2", + "en_jp": "5-toubun no Hanayome ∬", + "ja_jp": "五等分の花嫁∬" + } + } + }, + "updatedAt": "2021-01-23T15:57:01Z" + }, + { + "id": "45343004", + "changedData": { + "progress": [ + 2, + 3 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "43137", + "slug": "tenchi-souzou-design-bu", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/43137/tiny.jpg?1611330634" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/43137/small.jpg?1611330634" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/43137/medium.jpg?1611330634" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/43137/large.jpg?1611330634" + } + ] + }, + "titles": { + "alternatives": [ + "[Ten-De-Bu] What a strange animal!", + "Tendebu" + ], + "canonical": "Tenchi Souzou Design-bu", + "localized": { + "en": "Heaven's Design Team", + "en_jp": "Tenchi Souzou Design-bu", + "ja_jp": "天地創造デザイン部" + } + } + }, + "updatedAt": "2021-01-23T14:28:05Z" + }, + { + "id": "45342210", + "changedData": { + "progress": [ + 2, + 3 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "41976", + "slug": "yuru-camp-2", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/41976/tiny.jpg?1611329947" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/41976/small.jpg?1611329947" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/41976/medium.jpg?1611329947" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/41976/large.jpg?1611329947" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Yuru Camp△ 2", + "localized": { + "en": "Laid-Back Camp 2", + "en_jp": "Yuru Camp△ 2", + "ja_jp": "ゆるキャン△ 2" + } + } + }, + "updatedAt": "2021-01-23T14:04:48Z" + }, + { + "id": "45341107", + "changedData": { + "progress": [ + 1, + 2 + ], + "time_spent": [ + 24, + 48 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": null + }, + "media": { + "__typename": "Anime", + "id": "42867", + "slug": "dr-stone-two", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/42867/tiny.jpg?1611329475" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/42867/small.jpg?1611329475" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/42867/medium.jpg?1611329475" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/42867/large.jpg?1611329475" + } + ] + }, + "titles": { + "alternatives": [ + "Dr. Stone 2nd Season", + "Dr. Stone Second Season" + ], + "canonical": "Dr. Stone: Stone Wars", + "localized": { + "en_jp": "Dr. Stone: Stone Wars", + "ja_jp": "ドクターストーン STONE WARS" + } + } + }, + "updatedAt": "2021-01-23T13:27:39Z" + }, + { + "id": "5096548", + "changedData": { + "progress": [ + 6, + 7 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "13265", + "slug": "gakuen-babysitters", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/13265/tiny.jpg?1597692098" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/13265/small.jpg?1597692098" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/13265/medium.jpg?1597692098" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/13265/large.jpg?1597692098" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Gakuen Babysitters", + "localized": { + "en": "School Babysitters", + "en_jp": "Gakuen Babysitters", + "en_us": "School Babysitters", + "ja_jp": "学園ベビーシッターズ" + } + } + }, + "updatedAt": "2018-02-24T15:05:35Z" + }, + { + "id": "5096816", + "changedData": { + "progress": [ + 6, + 7 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "13661", + "slug": "ryuuou-no-oshigoto", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/13661/tiny.jpg?1597698518" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/13661/small.jpg?1597698518" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/13661/medium.jpg?1597698518" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/13661/large.jpg?1597698518" + } + ] + }, + "titles": { + "alternatives": [ + "Ryuoh no Oshigoto" + ], + "canonical": "Ryuuou no Oshigoto!", + "localized": { + "en": "The Ryuo’s Work is Never Done!", + "en_jp": "Ryuuou no Oshigoto!", + "en_us": "The Ryuo's Work is Never Done!", + "ja_jp": "りゅうおうのおしごと!" + } + } + }, + "updatedAt": "2018-02-24T15:31:29Z" + }, + { + "id": "5096938", + "changedData": { + "progress": [ + 6, + 7 + ], + "time_spent": [ + 384, + 408 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "13635", + "slug": "karakai-jouzu-no-takagi-san", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/13635/tiny.jpg?1597691135" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/13635/small.jpg?1597691135" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/13635/medium.jpg?1597691135" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/13635/large.jpg?1597691135" + } + ] + }, + "titles": { + "alternatives": [ + "Skilled Teaser Takagi-san" + ], + "canonical": "Karakai Jouzu no Takagi-san", + "localized": { + "en": "Teasing Master Takagi-san", + "en_jp": "Karakai Jouzu no Takagi-san", + "ja_jp": "からかい上手の高木さん" + } + } + }, + "updatedAt": "2018-02-24T15:54:16Z" + }, + { + "id": "5096942", + "changedData": { + "rating": [ + null, + 18 + ] + }, + "kind": "RATED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "13635", + "slug": "karakai-jouzu-no-takagi-san", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/13635/tiny.jpg?1597691135" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/13635/small.jpg?1597691135" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/13635/medium.jpg?1597691135" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/13635/large.jpg?1597691135" + } + ] + }, + "titles": { + "alternatives": [ + "Skilled Teaser Takagi-san" + ], + "canonical": "Karakai Jouzu no Takagi-san", + "localized": { + "en": "Teasing Master Takagi-san", + "en_jp": "Karakai Jouzu no Takagi-san", + "ja_jp": "からかい上手の高木さん" + } + } + }, + "updatedAt": "2018-02-24T15:54:37Z" + }, + { + "id": "5096943", + "changedData": { + "notes": [ + null, + "" + ] + }, + "kind": "ANNOTATED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "13635", + "slug": "karakai-jouzu-no-takagi-san", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/13635/tiny.jpg?1597691135" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/13635/small.jpg?1597691135" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/13635/medium.jpg?1597691135" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/13635/large.jpg?1597691135" + } + ] + }, + "titles": { + "alternatives": [ + "Skilled Teaser Takagi-san" + ], + "canonical": "Karakai Jouzu no Takagi-san", + "localized": { + "en": "Teasing Master Takagi-san", + "en_jp": "Karakai Jouzu no Takagi-san", + "ja_jp": "からかい上手の高木さん" + } + } + }, + "updatedAt": "2018-02-24T15:54:37Z" + }, + { + "id": "5096963", + "changedData": { + "progress": [ + 6, + 7 + ], + "time_spent": [ + 35, + 40 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "14152", + "slug": "kaijuu-girls-ultra-kaijuu-gijinka-keikaku-2nd-season", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/14152/tiny.jpg?1597691494" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/14152/small.jpg?1597691494" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/14152/medium.jpg?1597691494" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/14152/large.jpg?1597691494" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Kaijuu Girls: Ultra Kaijuu Gijinka Keikaku 2nd Season", + "localized": { + "en_jp": "Kaijuu Girls: Ultra Kaijuu Gijinka Keikaku 2nd Season", + "ja_jp": "怪獣娘~ウルトラ怪獣擬人化計画~ 第2期" + } + } + }, + "updatedAt": "2018-02-24T15:56:09Z" + }, + { + "id": "5096965", + "changedData": { + "rating": [ + null, + 14 + ] + }, + "kind": "RATED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "14152", + "slug": "kaijuu-girls-ultra-kaijuu-gijinka-keikaku-2nd-season", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/14152/tiny.jpg?1597691494" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/14152/small.jpg?1597691494" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/14152/medium.jpg?1597691494" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/14152/large.jpg?1597691494" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Kaijuu Girls: Ultra Kaijuu Gijinka Keikaku 2nd Season", + "localized": { + "en_jp": "Kaijuu Girls: Ultra Kaijuu Gijinka Keikaku 2nd Season", + "ja_jp": "怪獣娘~ウルトラ怪獣擬人化計画~ 第2期" + } + } + }, + "updatedAt": "2018-02-24T15:56:34Z" + }, + { + "id": "5096966", + "changedData": { + "notes": [ + null, + "" + ] + }, + "kind": "ANNOTATED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "14152", + "slug": "kaijuu-girls-ultra-kaijuu-gijinka-keikaku-2nd-season", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/14152/tiny.jpg?1597691494" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/14152/small.jpg?1597691494" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/14152/medium.jpg?1597691494" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/14152/large.jpg?1597691494" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Kaijuu Girls: Ultra Kaijuu Gijinka Keikaku 2nd Season", + "localized": { + "en_jp": "Kaijuu Girls: Ultra Kaijuu Gijinka Keikaku 2nd Season", + "ja_jp": "怪獣娘~ウルトラ怪獣擬人化計画~ 第2期" + } + } + }, + "updatedAt": "2018-02-24T15:56:34Z" + }, + { + "id": "5097284", + "changedData": { + "progress": [ + 19, + 20 + ], + "time_spent": [ + 1344, + 1368 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "13209", + "slug": "black-clover-tv", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/13209/tiny.jpg?1611504643" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/13209/small.jpg?1611504643" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/13209/medium.jpg?1611504643" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/13209/large.jpg?1611504643" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Black Clover", + "localized": { + "en": "Black Clover", + "en_jp": "Black Clover", + "ja_jp": "ブラッククローバー" + } + } + }, + "updatedAt": "2018-02-24T16:36:16Z" + }, + { + "id": "5097527", + "changedData": { + "progress": [ + 7, + 8 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "13615", + "slug": "a-place-further-than-the-universe", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/13615/tiny.jpg?1597696818" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/13615/small.jpg?1597696818" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/13615/medium.jpg?1597696818" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/13615/large.jpg?1597696818" + } + ] + }, + "titles": { + "alternatives": [ + "Uchuu yori mo Tooi Basho", + "A Story That Leads to the Antarctica", + "Sora Yorimo Tōi Basho", + "Yorimoi" + ], + "canonical": "A Place Further Than the Universe", + "localized": { + "en": "A Place Further Than the Universe", + "en_jp": "Sora yori mo Tooi Basho", + "en_us": "A Place Further Than The Universe", + "ja_jp": "宇宙よりも遠い場所" + } + } + }, + "updatedAt": "2018-02-24T17:02:06Z" + }, + { + "id": "5097533", + "changedData": { + "rating": [ + null, + 16 + ] + }, + "kind": "RATED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "13615", + "slug": "a-place-further-than-the-universe", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/13615/tiny.jpg?1597696818" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/13615/small.jpg?1597696818" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/13615/medium.jpg?1597696818" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/13615/large.jpg?1597696818" + } + ] + }, + "titles": { + "alternatives": [ + "Uchuu yori mo Tooi Basho", + "A Story That Leads to the Antarctica", + "Sora Yorimo Tōi Basho", + "Yorimoi" + ], + "canonical": "A Place Further Than the Universe", + "localized": { + "en": "A Place Further Than the Universe", + "en_jp": "Sora yori mo Tooi Basho", + "en_us": "A Place Further Than The Universe", + "ja_jp": "宇宙よりも遠い場所" + } + } + }, + "updatedAt": "2018-02-24T17:02:23Z" + }, + { + "id": "5097534", + "changedData": { + "notes": [ + null, + "" + ] + }, + "kind": "ANNOTATED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "13615", + "slug": "a-place-further-than-the-universe", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/13615/tiny.jpg?1597696818" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/13615/small.jpg?1597696818" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/13615/medium.jpg?1597696818" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/13615/large.jpg?1597696818" + } + ] + }, + "titles": { + "alternatives": [ + "Uchuu yori mo Tooi Basho", + "A Story That Leads to the Antarctica", + "Sora Yorimo Tōi Basho", + "Yorimoi" + ], + "canonical": "A Place Further Than the Universe", + "localized": { + "en": "A Place Further Than the Universe", + "en_jp": "Sora yori mo Tooi Basho", + "en_us": "A Place Further Than The Universe", + "ja_jp": "宇宙よりも遠い場所" + } + } + }, + "updatedAt": "2018-02-24T17:02:23Z" + }, + { + "id": "5097839", + "changedData": { + "progress": [ + 6, + 7 + ], + "time_spent": [ + 432, + 456 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "13237", + "slug": "overlord-ii", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/13237/tiny.jpg?1597694945" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/13237/small.jpg?1597694945" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/13237/medium.jpg?1597694945" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/13237/large.jpg?1597694945" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Overlord II", + "localized": { + "en_jp": "Overlord II", + "en_us": "Overlord II", + "ja_jp": "オーバーロードⅡ" + } + } + }, + "updatedAt": "2018-02-24T17:38:38Z" + }, + { + "id": "5098167", + "changedData": { + "progress": [ + 5, + 6 + ], + "time_spent": [ + 96, + 120 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "13885", + "slug": "hitori-no-shita-the-outcast-2nd-season", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/13885/tiny.jpg?1517377133" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/13885/small.jpg?1517377133" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/13885/medium.jpg?1517377133" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/13885/large.jpg?1517377133" + } + ] + }, + "titles": { + "alternatives": [ + "hitorinoshita - The Outcast" + ], + "canonical": "Hitori no Shita: The Outcast 2nd Season", + "localized": { + "en": "Hitori no Shita - The Outcast 2", + "en_jp": "Hitori no Shita: The Outcast 2nd Season", + "en_us": "Hitori no Shita - The Outcast 2", + "ja_jp": "一人之下 THE OUTCAST 2ndシーズン" + } + } + }, + "updatedAt": "2018-02-24T18:10:32Z" + }, + { + "id": "5098366", + "changedData": { + "rating": [ + null, + 14 + ] + }, + "kind": "RATED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "13531", + "slug": "ramen-daisuki-koizumi-san", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/13531/tiny.jpg?1597698994" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/13531/small.jpg?1597698994" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/13531/medium.jpg?1597698994" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/13531/large.jpg?1597698994" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Ramen Daisuki Koizumi-san", + "localized": { + "en": "Ms. Koizumi Loves Ramen Noodles", + "en_jp": "Ramen Daisuki Koizumi-san", + "en_us": "Ms. Koizumi Loves Ramen Noodles", + "ja_jp": "ラーメン大好き小泉さん" + } + } + }, + "updatedAt": "2018-02-24T18:32:23Z" + }, + { + "id": "5098367", + "changedData": { + "notes": [ + null, + "" + ] + }, + "kind": "ANNOTATED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "13531", + "slug": "ramen-daisuki-koizumi-san", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/13531/tiny.jpg?1597698994" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/13531/small.jpg?1597698994" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/13531/medium.jpg?1597698994" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/13531/large.jpg?1597698994" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Ramen Daisuki Koizumi-san", + "localized": { + "en": "Ms. Koizumi Loves Ramen Noodles", + "en_jp": "Ramen Daisuki Koizumi-san", + "en_us": "Ms. Koizumi Loves Ramen Noodles", + "ja_jp": "ラーメン大好き小泉さん" + } + } + }, + "updatedAt": "2018-02-24T18:32:23Z" + }, + { + "id": "5098364", + "changedData": { + "progress": [ + 7, + 8 + ] + }, + "kind": "PROGRESSED", + "libraryEntry": { + "reconsumeCount": 0, + "reconsuming": false, + "private": false, + "notes": "" + }, + "media": { + "__typename": "Anime", + "id": "13531", + "slug": "ramen-daisuki-koizumi-san", + "posterImage": { + "views": [ + { + "width": 110, + "height": 156, + "url": "https://media.kitsu.io/anime/poster_images/13531/tiny.jpg?1597698994" + }, + { + "width": 284, + "height": 402, + "url": "https://media.kitsu.io/anime/poster_images/13531/small.jpg?1597698994" + }, + { + "width": 390, + "height": 554, + "url": "https://media.kitsu.io/anime/poster_images/13531/medium.jpg?1597698994" + }, + { + "width": 550, + "height": 780, + "url": "https://media.kitsu.io/anime/poster_images/13531/large.jpg?1597698994" + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Ramen Daisuki Koizumi-san", + "localized": { + "en": "Ms. Koizumi Loves Ramen Noodles", + "en_jp": "Ramen Daisuki Koizumi-san", + "en_us": "Ms. Koizumi Loves Ramen Noodles", + "ja_jp": "ラーメン大好き小泉さん" + } + } + }, + "updatedAt": "2018-02-24T18:32:09Z" + } + ] + } + } + } +} \ No newline at end of file diff --git a/tests/AnimeClient/test_data/Kitsu/personBeforeTransform.json b/tests/AnimeClient/test_data/Kitsu/personBeforeTransform.json new file mode 100644 index 00000000..953c4549 --- /dev/null +++ b/tests/AnimeClient/test_data/Kitsu/personBeforeTransform.json @@ -0,0 +1,7833 @@ +{ + "data": { + "findPersonBySlug": { + "id": "468", + "description": { + "en": "\u003cp\u003e\u003cdiv class=\"people-informantion-more js-people-informantion-more\"\u003eBirth Place: Tokyo, Japan\u003cbr\u003e\r\nBlood Type: B\u003cbr\u003e\r\nHeight: 157cm\u003cbr\u003e\r\nAstrological sign: Aries\u003cbr\u003e\r\nNicknames: Ayachii (あやちー), Ayasumi (あやすみ), Aya-nee (あやねえ)\u003cbr\u003e\r\n\u003cbr\u003e\r\nFavorites: Yakult Swallows (baseball team)\u003cbr\u003e\r\nHobbies: Cooking, Scuba diving, Yoga\u003cbr\u003e\r\nSkills: Playing the Piano\u003c/div\u003e\u003c/p\u003e" + }, + "birthday": "1976-03-30", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/people/images/468/original.jpg?1416260918", + "width": null + }, + "views": [] + }, + "names": { + "alternatives": [], + "canonical": "en", + "localized": { + "en": "Ayako Kawasumi", + "ja_jp": "川澄 綾子" + } + }, + "mediaStaff": { + "nodes": [ + { + "id": "153", + "role": "Theme Song Performance", + "media": { + "id": "252", + "slug": "mahoromatic-2", + "type": "Anime", + "posterImage": { + "original": { + "height": 314, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/252/original.jpg?1597691960", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/252/tiny.jpg?1597691960", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/252/small.jpg?1597691960", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/252/medium.jpg?1597691960", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/252/large.jpg?1597691960", + "width": 550 + } + ] + }, + "titles": { + "alternatives": [ + "Mahoromatic: Motto Utsukushii Mono" + ], + "canonical": "Mahoromatic 2", + "localized": { + "en": "Mahoromatic ~Something More Beautiful~", + "en_jp": "Mahoromatic 2", + "en_us": "Mahoromatic ~Something More Beautiful~", + "ja_jp": "まほろまてぃっく ~もっと美しいもの~" + } + } + } + }, + { + "id": "4069", + "role": "Theme Song Performance", + "media": { + "id": "839", + "slug": "yume-tsukai", + "type": "Anime", + "posterImage": { + "original": { + "height": 795, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/839/original.jpg?1597698821", + "width": 567 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/839/tiny.jpg?1597698821", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/839/small.jpg?1597698821", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/839/medium.jpg?1597698821", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/839/large.jpg?1597698821", + "width": 550 + } + ] + }, + "titles": { + "alternatives": [ + "Dream Users" + ], + "canonical": "Yume Tsukai", + "localized": { + "en_jp": "Yume Tsukai", + "ja_jp": "夢使い" + } + } + } + }, + { + "id": "16887", + "role": "Theme Song Performance", + "media": { + "id": "607", + "slug": "denshin-mamotte-shugogetten", + "type": "Anime", + "posterImage": { + "original": { + "height": 318, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/607/original.jpg?1597691223", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/607/tiny.jpg?1597691223", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/607/small.jpg?1597691223", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/607/medium.jpg?1597691223", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/607/large.jpg?1597691223", + "width": 550 + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Denshin Mamotte Shugogetten", + "localized": { + "en_jp": "Denshin Mamotte Shugogetten", + "ja_jp": "伝心 まもって守護月天!" + } + } + } + }, + { + "id": "23841", + "role": "Theme Song Performance, Theme Song Composition", + "media": { + "id": "295", + "slug": "piano", + "type": "Anime", + "posterImage": { + "original": { + "height": 318, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/295/original.jpg?1597684113", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/295/tiny.jpg?1597684113", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/295/small.jpg?1597684113", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/295/medium.jpg?1597684113", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/295/large.jpg?1597684113", + "width": 550 + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Piano", + "localized": { + "en": "Piano: The Melody of a Young Girl's Heart", + "en_jp": "Piano", + "en_us": "Piano: The Melody of a Young Girl's Heart", + "ja_jp": "PIANO" + } + } + } + }, + { + "id": "27033", + "role": "Theme Song Performance", + "media": { + "id": "449", + "slug": "ichigo-mashimaro", + "type": "Anime", + "posterImage": { + "original": { + "height": 2158, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/449/original.jpg?1597697413", + "width": 1515 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/449/tiny.jpg?1597697413", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/449/small.jpg?1597697413", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/449/medium.jpg?1597697413", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/449/large.jpg?1597697413", + "width": 550 + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Ichigo Mashimaro", + "localized": { + "en": "Strawberry Marshmallow", + "en_jp": "Ichigo Mashimaro", + "ja_jp": "苺ましまろ" + } + } + } + }, + { + "id": "28548", + "role": "Theme Song Performance", + "media": { + "id": "434", + "slug": "to-heart", + "type": "Anime", + "posterImage": { + "original": { + "height": 350, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/434/original.jpg?1597698729", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/434/tiny.jpg?1597698729", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/434/small.jpg?1597698729", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/434/medium.jpg?1597698729", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/434/large.jpg?1597698729", + "width": 550 + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "To Heart", + "localized": { + "en": "To Heart", + "en_jp": "To Heart", + "ja_jp": "トゥハート" + } + } + } + }, + { + "id": "36825", + "role": "Theme Song Performance", + "media": { + "id": "221", + "slug": "groove-adventure-rave", + "type": "Anime", + "posterImage": { + "original": { + "height": 1152, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/221/original.jpg?1597698304", + "width": 864 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/221/tiny.jpg?1597698304", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/221/small.jpg?1597698304", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/221/medium.jpg?1597698304", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/221/large.jpg?1597698304", + "width": 550 + } + ] + }, + "titles": { + "alternatives": [ + "Groove Adventure Rave" + ], + "canonical": "Groove Adventure Rave", + "localized": { + "en": "Rave Master", + "en_jp": "Groove Adventure Rave", + "ja_jp": "レイヴ" + } + } + } + }, + { + "id": "38946", + "role": "Theme Song Performance", + "media": { + "id": "2034", + "slug": "seraphim-call", + "type": "Anime", + "posterImage": { + "original": { + "height": 350, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/2034/original.jpg?1597691748", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/2034/tiny.jpg?1597691748", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/2034/small.jpg?1597691748", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/2034/medium.jpg?1597691748", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/2034/large.jpg?1597691748", + "width": 550 + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Seraphim Call", + "localized": { + "en_jp": "Seraphim Call", + "ja_jp": "セラフィムコール" + } + } + } + }, + { + "id": "39512", + "role": "Theme Song Performance", + "media": { + "id": "4879", + "slug": "ladies-versus-butlers", + "type": "Anime", + "posterImage": { + "original": { + "height": 1000, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/4879/original.jpg?1597698839", + "width": 680 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/4879/tiny.jpg?1597698839", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/4879/small.jpg?1597698839", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/4879/medium.jpg?1597698839", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/4879/large.jpg?1597698839", + "width": 550 + } + ] + }, + "titles": { + "alternatives": [ + "Ladies vs. Butlers!", + "Redei x Bato" + ], + "canonical": "Ladies versus Butlers!", + "localized": { + "en": "Ladies versus Butlers!", + "en_jp": "Ladies versus Butlers!", + "en_us": "Ladies versus Butlers!", + "ja_jp": "れでぃ×ばと!" + } + } + } + }, + { + "id": "39650", + "role": "Theme Song Performance", + "media": { + "id": "432", + "slug": "okusama-wa-joshikousei-2005", + "type": "Anime", + "posterImage": { + "original": { + "height": 295, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/432/original.jpg?1597692181", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/432/tiny.jpg?1597692181", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/432/small.jpg?1597692181", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/432/medium.jpg?1597692181", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/432/large.jpg?1597692181", + "width": 550 + } + ] + }, + "titles": { + "alternatives": [ + "Oku-sama wa Joshi Kousei", + "Oku-sama wa Joshikosei" + ], + "canonical": "Okusama wa Joshikousei (TV)", + "localized": { + "en": "My Wife is a High School Girl", + "en_jp": "Okusama wa Joshikousei (TV)", + "ja_jp": "おくさまは女子高生" + } + } + } + }, + { + "id": "42061", + "role": "Theme Song Performance", + "media": { + "id": "251", + "slug": "mahoromatic", + "type": "Anime", + "posterImage": { + "original": { + "height": 332, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/251/original.jpg?1597698190", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/251/tiny.jpg?1597698190", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/251/small.jpg?1597698190", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/251/medium.jpg?1597698190", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/251/large.jpg?1597698190", + "width": 550 + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Mahoromatic: Automatic Maiden", + "localized": { + "en": "Mahoromatic: Automatic Maiden", + "en_jp": "Mahoromatic: Automatic Maiden", + "en_us": "Mahoromatic: Automatic Maiden", + "ja_jp": "まほろまてぃっく" + } + } + } + }, + { + "id": "44496", + "role": "Theme Song Performance", + "media": { + "id": "1698", + "slug": "ichigo-mashimaro-ova", + "type": "Anime", + "posterImage": { + "original": { + "height": 303, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1698/original.jpg?1597697486", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1698/tiny.jpg?1597697486", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1698/small.jpg?1597697486", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1698/medium.jpg?1597697486", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1698/large.jpg?1597697486", + "width": 550 + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Ichigo Mashimaro OVA", + "localized": { + "en": "Strawberry Marshmallow OVA", + "en_jp": "Ichigo Mashimaro OVA", + "en_us": "Strawberry Marshmallow OVA", + "ja_jp": "苺ましまろ OVA" + } + } + } + }, + { + "id": "47703", + "role": "Theme Song Performance", + "media": { + "id": "617", + "slug": "one-kagayaku-kisetsu-e", + "type": "Anime", + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/617/original.jpg?1408441902", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/617/tiny.jpg?1408441902", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/617/small.jpg?1408441902", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/617/medium.jpg?1408441902", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/617/large.jpg?1408441902", + "width": null + } + ] + }, + "titles": { + "alternatives": [ + "One: To a Shining Season" + ], + "canonical": "One: Kagayaku Kisetsu e", + "localized": { + "en_jp": "One: Kagayaku Kisetsu e", + "ja_jp": "ONE ~輝く季節へ~" + } + } + } + }, + { + "id": "57756", + "role": "Theme Song Performance", + "media": { + "id": "294", + "slug": "puchi-puri-yuushi", + "type": "Anime", + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/294/original.jpg?1408441147", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/294/tiny.jpg?1408441147", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/294/small.jpg?1408441147", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/294/medium.jpg?1408441147", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/294/large.jpg?1408441147", + "width": null + } + ] + }, + "titles": { + "alternatives": [ + "Petite Pri Yuushi", + "Puchi Puri Yuushi" + ], + "canonical": "Puchi Pri*Yucie", + "localized": { + "en": "Petite Princess Yucie", + "en_jp": "Puchi Pri*Yucie", + "en_us": "Petite Princess Yucie", + "ja_jp": "ぷちぷり*ユーシィ" + } + } + } + }, + { + "id": "59725", + "role": "Theme Song Performance", + "media": { + "id": "418", + "slug": "gokujou-seitokai", + "type": "Anime", + "posterImage": { + "original": { + "height": 340, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/418/original.jpg?1597692251", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/418/tiny.jpg?1597692251", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/418/small.jpg?1597692251", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/418/medium.jpg?1597692251", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/418/large.jpg?1597692251", + "width": 550 + } + ] + }, + "titles": { + "alternatives": [ + "Gokujo Seitokai" + ], + "canonical": "Gokujou Seitokai", + "localized": { + "en": "Best Student Council", + "en_jp": "Gokujou Seitokai", + "ja_jp": "極上生徒会" + } + } + } + }, + { + "id": "60841", + "role": "Theme Song Performance", + "media": { + "id": "7762", + "slug": "queen-s-blade-rurou-no-senshi", + "type": "Anime", + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7762/original.jpg?1408462333", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7762/tiny.jpg?1408462333", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7762/small.jpg?1408462333", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7762/medium.jpg?1408462333", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7762/large.jpg?1408462333", + "width": null + } + ] + }, + "titles": { + "alternatives": [ + "Queen's Blade", + "Sentou Kyoukain Alain" + ], + "canonical": "Queen's Blade: Rurou no Senshi", + "localized": { + "en": "Queen's Blade: The Exiled Virgin", + "en_jp": "Queen's Blade: Rurou no Senshi", + "en_us": "Queen's Blade: The Exiled Virgin", + "ja_jp": "クイーンズブレイド 流浪の戦士" + } + } + } + }, + { + "id": "69558", + "role": "Theme Song Performance", + "media": { + "id": "364", + "slug": "seikai-no-senki-ii", + "type": "Anime", + "posterImage": { + "original": { + "height": 350, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/364/original.jpg?1597697259", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/364/tiny.jpg?1597697259", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/364/small.jpg?1597697259", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/364/medium.jpg?1597697259", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/364/large.jpg?1597697259", + "width": 550 + } + ] + }, + "titles": { + "alternatives": [ + "Battle Flag of the Stars II" + ], + "canonical": "Seikai no Senki II", + "localized": { + "en": "Banner of the Stars II", + "en_jp": "Seikai no Senki II", + "ja_jp": "星界の戦旗 II" + } + } + } + }, + { + "id": "80248", + "role": "Theme Song Performance", + "media": { + "id": "3029", + "slug": "kemeko-dx", + "type": "Anime", + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/3029/original.jpg?1408448468", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/3029/tiny.jpg?1408448468", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/3029/small.jpg?1408448468", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/3029/medium.jpg?1408448468", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/3029/large.jpg?1408448468", + "width": null + } + ] + }, + "titles": { + "alternatives": [ + "The Unknown Girlfriend", + "Kemeko DX" + ], + "canonical": "Kemeko Deluxe!", + "localized": { + "en_jp": "Kemeko Deluxe!", + "ja_jp": "ケメコデラックス!" + } + } + } + }, + { + "id": "80826", + "role": "Theme Song Performance", + "media": { + "id": "124", + "slug": "kono-minikuku-mo-utsukushii-sekai", + "type": "Anime", + "posterImage": { + "original": { + "height": 273, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/124/original.jpg?1597691586", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/124/tiny.jpg?1597691586", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/124/small.jpg?1597691586", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/124/medium.jpg?1597691586", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/124/large.jpg?1597691586", + "width": 550 + } + ] + }, + "titles": { + "alternatives": [], + "canonical": "Kono Minikuku mo Utsukushii Sekai", + "localized": { + "en": "This Ugly Yet Beautiful World", + "en_jp": "Kono Minikuku mo Utsukushii Sekai", + "en_us": "This Ugly Yet Beautiful World", + "ja_jp": "この醜くも美しい世界" + } + } + } + }, + { + "id": "87809", + "role": "Theme Song Performance", + "media": { + "id": "1236", + "slug": "gaogaigar-final", + "type": "Anime", + "posterImage": { + "original": { + "height": 1024, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1236/original.jpg?1597697229", + "width": 750 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1236/tiny.jpg?1597697229", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1236/small.jpg?1597697229", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1236/medium.jpg?1597697229", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1236/large.jpg?1597697229", + "width": 550 + } + ] + }, + "titles": { + "alternatives": [ + "Brave King GaoGaiGar Final", + "King of Braves GaoGaiGar Final", + "Yuusha Ou GaoGaiGar Final", + "Yuusha-Oh GaoGaiGar Final" + ], + "canonical": "GaoGaiGar Final", + "localized": { + "en": "GaoGaiGar Final", + "en_jp": "Yuusha-Ou GaoGaiGar Final", + "en_us": "GaoGaiGar Final", + "ja_jp": "勇者王ガオガイガーFINAL" + } + } + } + } + ] + }, + "voices": { + "nodes": [ + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "178", + "slug": "natsuki-mogi", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/178/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Natsuki Mogi" + } + }, + "media": { + "id": "9", + "slug": "initial-d-fourth-stage", + "posterImage": { + "original": { + "height": 306, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/9/original.jpeg?1597604243", + "width": 228 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/9/tiny.jpg?1597604243", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/9/small.jpg?1597604243", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/9/medium.jpg?1597604243", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/9/large.jpg?1597604243", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Initial D Fourth Stage", + "localized": { + "en_jp": "Initial D Fourth Stage", + "ja_jp": "頭文字〈イニシャル〉D FOURTH STAGE" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "6553", + "slug": "saber", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/6553/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Saber" + } + }, + "media": { + "id": "5992", + "slug": "carnival-phantasm", + "posterImage": { + "original": { + "height": 693, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/5992/original.jpg?1597697878", + "width": 533 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/5992/tiny.jpg?1597697878", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/5992/small.jpg?1597697878", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/5992/medium.jpg?1597697878", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/5992/large.jpg?1597697878", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Carnival Phantasm", + "localized": { + "en_jp": "Carnival Phantasm", + "ja_jp": "カーニバル・ファンタズム" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "31024", + "slug": "yuriko-aoki", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/31024/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Yuriko Aoki" + } + }, + "media": { + "id": "6001", + "slug": "bakuman-2", + "posterImage": { + "original": { + "height": 1090, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6001/original.png?1597696834", + "width": 778 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6001/tiny.jpg?1597696834", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6001/small.jpg?1597696834", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6001/medium.jpg?1597696834", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6001/large.jpg?1597696834", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Bakuman. 2nd Season", + "localized": { + "en": "Bakuman. 2", + "en_jp": "Bakuman. 2nd Season", + "en_us": "Bakuman.", + "ja_jp": "バクマン。2ndシーズン" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "29350", + "slug": "miyuri-tsujidou", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/29350/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Miyuri Tsujidou" + } + }, + "media": { + "id": "6020", + "slug": "seikon-no-qwaser-ii", + "posterImage": { + "original": { + "height": 350, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6020/original.jpg?1597692182", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6020/tiny.jpg?1597692182", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6020/small.jpg?1597692182", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6020/medium.jpg?1597692182", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6020/large.jpg?1597692182", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Seikon no Qwaser II", + "localized": { + "en": "The Qwaser of Stigmata II", + "en_jp": "Seikon no Qwaser II", + "en_us": "The Qwaser of Stigmata II", + "ja_jp": "聖痕のクェイサー II" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "6553", + "slug": "saber", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/6553/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Saber" + } + }, + "media": { + "id": "6028", + "slug": "fate-zero", + "posterImage": { + "original": { + "height": 2000, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6028/original.jpg?1597698769", + "width": 1408 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6028/tiny.jpg?1597698769", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6028/small.jpg?1597698769", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6028/medium.jpg?1597698769", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6028/large.jpg?1597698769", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Fate/Zero", + "localized": { + "en": "Fate/Zero", + "en_jp": "Fate/Zero", + "en_us": "Fate/Zero", + "ja_jp": "フェイト/ゼロ" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "31810", + "slug": "ayumi-tokita", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/31810/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Ayumi Tokita" + } + }, + "media": { + "id": "6156", + "slug": "squid-girl-2", + "posterImage": { + "original": { + "height": 800, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6156/original.jpg?1597697485", + "width": 548 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6156/tiny.jpg?1597697485", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6156/small.jpg?1597697485", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6156/medium.jpg?1597697485", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6156/large.jpg?1597697485", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Squid Girl 2", + "localized": { + "en": "Squid Girl 2", + "en_jp": "Shinryaku!? Ika Musume", + "en_us": "The Squid Girl 2", + "ja_jp": "侵略!?イカ娘" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "2358", + "slug": "chidori-kuruma", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/2358/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Chidori Kuruma" + } + }, + "media": { + "id": "83", + "slug": "ayashi-no-ceres", + "posterImage": { + "original": { + "height": 960, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/83/original.jpg?1597698295", + "width": 640 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/83/tiny.jpg?1597698295", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/83/small.jpg?1597698295", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/83/medium.jpg?1597698295", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/83/large.jpg?1597698295", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Ayashi no Ceres", + "localized": { + "en": "Ceres", + "en_jp": "Ayashi no Ceres", + "en_us": "Ceres, Celestial Legend", + "ja_jp": "妖しのセレス" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "34746", + "slug": "hatsue-nobidome", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/34746/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Hatsue Nobidome" + } + }, + "media": { + "id": "6246", + "slug": "ro-kyu-bu", + "posterImage": { + "original": { + "height": 1024, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6246/original.jpg?1597698662", + "width": 736 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6246/tiny.jpg?1597698662", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6246/small.jpg?1597698662", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6246/medium.jpg?1597698662", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6246/large.jpg?1597698662", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Ro-Kyu-Bu!", + "localized": { + "en": "Ro-Kyu-Bu ~ Fast Break!", + "en_jp": "Ro-Kyu-Bu!", + "en_us": "Ro-Kyu-Bu ~ Fast Break!", + "ja_jp": "ロウきゅーぶ!" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "31855", + "slug": "jeanne-d-arc-7536315c-0358-4f26-a136-13431573949f", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/31855/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Jeanne d'Arc" + } + }, + "media": { + "id": "6263", + "slug": "hidan-no-aria-special", + "posterImage": { + "original": { + "height": 315, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6263/original.jpg?1597691553", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6263/tiny.jpg?1597691553", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6263/small.jpg?1597691553", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6263/medium.jpg?1597691553", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6263/large.jpg?1597691553", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Hidan no Aria Special", + "localized": { + "en": "Aria the Scarlet Ammo Special", + "en_jp": "Hidan no Aria Special", + "en_us": "Aria the Scarlet Ammo Special", + "ja_jp": "緋弾のアリア" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "6524", + "slug": "kazumi-yoshida", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/6524/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Kazumi Yoshida" + } + }, + "media": { + "id": "953", + "slug": "shakugan-no-shana-specials", + "posterImage": { + "original": { + "height": 200, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/953/original.jpg?1597698411", + "width": 200 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/953/tiny.jpg?1597698411", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/953/small.jpg?1597698411", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/953/medium.jpg?1597698411", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/953/large.jpg?1597698411", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Shakugan no Shana Specials", + "localized": { + "en_jp": "Shakugan no Shana Specials", + "ja_jp": "灼眼のシャナたん" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "34916", + "slug": "akari-fujibayashi", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/34916/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Akari Fujibayashi" + } + }, + "media": { + "id": "6316", + "slug": "boku-wa-tomodachi-ga-sukunai", + "posterImage": { + "original": { + "height": 900, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6316/original.jpg?1597694883", + "width": 636 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6316/tiny.jpg?1597694883", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6316/small.jpg?1597694883", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6316/medium.jpg?1597694883", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6316/large.jpg?1597694883", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Boku wa Tomodachi ga Sukunai", + "localized": { + "en": "Haganai: I don't have many friends", + "en_jp": "Boku wa Tomodachi ga Sukunai", + "en_us": "Haganai: I don't have many friends", + "ja_jp": "僕は友達が少ない" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "5983", + "slug": "lafiel-abriel", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/5983/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Lafiel Abriel" + } + }, + "media": { + "id": "1008", + "slug": "seikai-no-danshou-tanjou", + "posterImage": { + "original": { + "height": 230, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1008/original.jpg?1597698123", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1008/tiny.jpg?1597698123", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1008/small.jpg?1597698123", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1008/medium.jpg?1597698123", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1008/large.jpg?1597698123", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Seikai no Danshou: Tanjou", + "localized": { + "en": "Crest of the Stars: Birth", + "en_jp": "Seikai no Danshou: Tanjou", + "en_us": "Crest of the Stars: Birth", + "ja_jp": "星界の断章 “誕生”" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "13385", + "slug": "henrietta-de-tristain", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/13385/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Henrietta de Tristain" + } + }, + "media": { + "id": "6493", + "slug": "zero-no-tsukaima-f", + "posterImage": { + "original": { + "height": 302, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6493/original.jpg?1597691256", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6493/tiny.jpg?1597691256", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6493/small.jpg?1597691256", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6493/medium.jpg?1597691256", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6493/large.jpg?1597691256", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Zero no Tsukaima F", + "localized": { + "en": "The Familiar of Zero F", + "en_jp": "Zero no Tsukaima F", + "en_us": "The Familiar of Zero F", + "ja_jp": "ゼロの使い魔F" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "6553", + "slug": "saber", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/6553/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Saber" + } + }, + "media": { + "id": "7658", + "slug": "fate-zero-2nd-season", + "posterImage": { + "original": { + "height": 6650, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7658/original.jpg?1597698796", + "width": 4675 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7658/tiny.jpg?1597698796", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7658/small.jpg?1597698796", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7658/medium.jpg?1597698796", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7658/large.jpg?1597698796", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Fate/Zero 2nd Season", + "localized": { + "en": "Fate/Zero Season 2", + "en_jp": "Fate/Zero 2nd Season", + "en_us": "Fate/Zero Season 2", + "ja_jp": "フェイト/ゼロ 2ndシーズン" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "35609", + "slug": "susan-b72d260d-5a1e-4738-9613-06761fe0156f", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/35609/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Susan" + } + }, + "media": { + "id": "6550", + "slug": "high-school-dxd", + "posterImage": { + "original": { + "height": 1492, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6550/original.jpg?1597697752", + "width": 1054 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6550/tiny.jpg?1597697752", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6550/small.jpg?1597697752", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6550/medium.jpg?1597697752", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6550/large.jpg?1597697752", + "width": 550 + } + ] + }, + "titles": { + "canonical": "High School DxD", + "localized": { + "en": "High School DxD", + "en_jp": "High School DxD", + "en_us": "High School DxD", + "ja_jp": "ハイスクールD×D" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "26432", + "slug": "laura-stuart", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/26432/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Laura Stuart" + } + }, + "media": { + "id": "6583", + "slug": "toaru-majutsu-no-index-endymion-no-kiseki", + "posterImage": { + "original": { + "height": 1500, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6583/original.jpg?1597697614", + "width": 1041 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6583/tiny.jpg?1597697614", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6583/small.jpg?1597697614", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6583/medium.jpg?1597697614", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6583/large.jpg?1597697614", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Toaru Majutsu no Index Movie: Endymion no Kiseki", + "localized": { + "en": "A Certain Magical Index the Movie: The Miracle of Endymion", + "en_jp": "Toaru Majutsu no Index Movie: Endymion no Kiseki", + "ja_jp": "劇場版 とある魔術の禁書目録 エンデュミオーンの奇蹟" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "35783", + "slug": "blood-leopard", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/35783/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Mihaya Kakei" + } + }, + "media": { + "id": "6590", + "slug": "accel-world", + "posterImage": { + "original": { + "height": 985, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6590/original.png?1597694895", + "width": 680 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6590/tiny.jpg?1597694895", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6590/small.jpg?1597694895", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6590/medium.jpg?1597694895", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6590/large.jpg?1597694895", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Accel World", + "localized": { + "en": "Accel World", + "en_jp": "Accel World", + "en_us": "Accel World", + "ja_jp": "アクセル・ワールド" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "29560", + "slug": "reina-vance", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/29560/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Leina Vance" + } + }, + "media": { + "id": "6620", + "slug": "queen-s-blade-rebellion", + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6620/original.jpg?1408458922", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6620/tiny.jpg?1408458922", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6620/small.jpg?1408458922", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6620/medium.jpg?1408458922", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6620/large.jpg?1408458922", + "width": null + } + ] + }, + "titles": { + "canonical": "Queen's Blade: Rebellion", + "localized": { + "en_jp": "Queen's Blade: Rebellion", + "ja_jp": "クイーンズブレイド リベリオン" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "13385", + "slug": "henrietta-de-tristain", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/13385/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Henrietta de Tristain" + } + }, + "media": { + "id": "1075", + "slug": "zero-no-tsukaima", + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1075/original.jpg?1408443044", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1075/tiny.jpg?1408443044", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1075/small.jpg?1408443044", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1075/medium.jpg?1408443044", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1075/large.jpg?1408443044", + "width": null + } + ] + }, + "titles": { + "canonical": "Zero no Tsukaima", + "localized": { + "en": "The Familiar of Zero", + "en_jp": "Zero no Tsukaima", + "en_us": "The Familiar of Zero", + "ja_jp": "ゼロの使い魔" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "36114", + "slug": "akira-igarashi-bbec632e-9df3-4317-943b-1c6f9265a1a8", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/36114/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Akira Igarashi" + } + }, + "media": { + "id": "6678", + "slug": "akb0048-first-stage", + "posterImage": { + "original": { + "height": 5096, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6678/original.jpg?1597697961", + "width": 3550 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6678/tiny.jpg?1597697961", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6678/small.jpg?1597697961", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6678/medium.jpg?1597697961", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6678/large.jpg?1597697961", + "width": 550 + } + ] + }, + "titles": { + "canonical": "AKB0048", + "localized": { + "en": "AKB0048", + "en_jp": "AKB0048", + "en_us": "AKB0048", + "ja_jp": "AKB0048" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "6553", + "slug": "saber", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/6553/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Saber" + } + }, + "media": { + "id": "6695", + "slug": "carnival-phantasm-illya-s-castle", + "posterImage": { + "original": { + "height": 338, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6695/original.jpg?1597698397", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6695/tiny.jpg?1597698397", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6695/small.jpg?1597698397", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6695/medium.jpg?1597698397", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6695/large.jpg?1597698397", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Carnival Phantasm: Illya-jou", + "localized": { + "en_jp": "Carnival Phantasm: Illya-jou", + "ja_jp": "カーニバル・ファンタズム: イリヤ城" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "6553", + "slug": "saber", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/6553/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Saber" + } + }, + "media": { + "id": "6685", + "slug": "carnival-phantasm-ex-season", + "posterImage": { + "original": { + "height": 500, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6685/original.jpg?1597697725", + "width": 351 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6685/tiny.jpg?1597697725", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6685/small.jpg?1597697725", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6685/medium.jpg?1597697725", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6685/large.jpg?1597697725", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Carnival Phantasm EX Season", + "localized": { + "en_jp": "Carnival Phantasm EX Season", + "ja_jp": "カーニバル・ファンタズム EX Season" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "31024", + "slug": "yuriko-aoki", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/31024/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Yuriko Aoki" + } + }, + "media": { + "id": "6714", + "slug": "bakuman-3", + "posterImage": { + "original": { + "height": 707, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6714/original.jpg?1597696817", + "width": 500 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6714/tiny.jpg?1597696817", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6714/small.jpg?1597696817", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6714/medium.jpg?1597696817", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6714/large.jpg?1597696817", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Bakuman. 3rd Season", + "localized": { + "en": "Bakuman. 3", + "en_jp": "Bakuman. 3rd Season", + "en_us": "Bakuman.", + "ja_jp": "バクマン。" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "2674", + "slug": "ruriko-ikusawa", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/2674/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Ruriko Ikusawa" + } + }, + "media": { + "id": "106", + "slug": "gate-keepers", + "posterImage": { + "original": { + "height": 325, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/106/original.jpg?1597692194", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/106/tiny.jpg?1597692194", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/106/small.jpg?1597692194", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/106/medium.jpg?1597692194", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/106/large.jpg?1597692194", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Gate Keepers", + "localized": { + "en_jp": "Gate Keepers", + "ja_jp": "ゲートキーパーズ" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "14040", + "slug": "hanako-e8b5973b-be52-4990-b28d-a624ee08c30d", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/14040/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Hanako" + } + }, + "media": { + "id": "1156", + "slug": "ghost-stories", + "posterImage": { + "original": { + "height": 500, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1156/original.jpg?1597697543", + "width": 352 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1156/tiny.jpg?1597697543", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1156/small.jpg?1597697543", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1156/medium.jpg?1597697543", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1156/large.jpg?1597697543", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Ghost Stories", + "localized": { + "en": "Ghost Stories", + "en_jp": "Gakkou no Kaidan", + "en_us": "Ghost Stories", + "ja_jp": "学校の怪談" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "6553", + "slug": "saber", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/6553/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Saber" + } + }, + "media": { + "id": "6906", + "slug": "fate-zero-remix", + "posterImage": { + "original": { + "height": 350, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6906/original.jpg?1597698293", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6906/tiny.jpg?1597698293", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6906/small.jpg?1597698293", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6906/medium.jpg?1597698293", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6906/large.jpg?1597698293", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Fate/Zero Remix", + "localized": { + "en_jp": "Fate/Zero Remix", + "ja_jp": "フェイト/ゼロ Remix" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "65952", + "slug": "fear", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/65952/original.jpg?1485074995", + "width": null + } + }, + "names": { + "canonical": "Fear" + } + }, + "media": { + "id": "1179", + "slug": "dt-eightron", + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1179/original.jpg?1408443370", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1179/tiny.jpg?1408443370", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1179/small.jpg?1408443370", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1179/medium.jpg?1408443370", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1179/large.jpg?1408443370", + "width": null + } + ] + }, + "titles": { + "canonical": "DT Eightron", + "localized": { + "en": "DT Eightron", + "en_jp": "DT Eightron", + "en_us": "DT Eightron", + "ja_jp": "DTエイトロン" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "31810", + "slug": "ayumi-tokita", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/31810/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Ayumi Tokita" + } + }, + "media": { + "id": "6929", + "slug": "shinryaku-ika-musume", + "posterImage": { + "original": { + "height": 500, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6929/original.jpg?1597697471", + "width": 347 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6929/tiny.jpg?1597697471", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6929/small.jpg?1597697471", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6929/medium.jpg?1597697471", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6929/large.jpg?1597697471", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Shinryaku!! Ika Musume", + "localized": { + "en_jp": "Shinryaku!! Ika Musume", + "ja_jp": "侵略!!イカ娘" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "37181", + "slug": "risa-seri", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/37181/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Risa Seri" + } + }, + "media": { + "id": "6947", + "slug": "kono-naka-ni-hitori-imouto-ga-iru", + "posterImage": { + "original": { + "height": 1280, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6947/original.jpg?1597698864", + "width": 849 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6947/tiny.jpg?1597698864", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6947/small.jpg?1597698864", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6947/medium.jpg?1597698864", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6947/large.jpg?1597698864", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Kono Naka ni Hitori, Imouto ga Iru!", + "localized": { + "en": "NAKAIMO - My Little Sister Is Among Them!", + "en_jp": "Kono Naka ni Hitori, Imouto ga Iru!", + "en_us": "NAKAIMO - My Little Sister Is Among Them!", + "ja_jp": "この中に1人、妹がいる!" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "37138", + "slug": "haruka-tanaka", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/37138/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Haruka Tanaka" + } + }, + "media": { + "id": "6941", + "slug": "tari-tari", + "posterImage": { + "original": { + "height": 1280, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/6941/original.jpg?1597697912", + "width": 909 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/6941/tiny.jpg?1597697912", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/6941/small.jpg?1597697912", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/6941/medium.jpg?1597697912", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/6941/large.jpg?1597697912", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Tari Tari", + "localized": { + "en": "Tari Tari", + "en_jp": "Tari Tari", + "en_us": "Tari Tari", + "ja_jp": "TARI TARI" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "90743", + "slug": "kyouko-miyano", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/90743/original.jpg?1485086523", + "width": null + } + }, + "names": { + "canonical": "Kyouko Miyano" + } + }, + "media": { + "id": "1204", + "slug": "a-d-police", + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1204/original.jpg?1408443433", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1204/tiny.jpg?1408443433", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1204/small.jpg?1408443433", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1204/medium.jpg?1408443433", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1204/large.jpg?1408443433", + "width": null + } + ] + }, + "titles": { + "canonical": "A.D. Police (TV)", + "localized": { + "en": "A.D. Police: To Protect and Serve", + "en_jp": "A.D. Police (TV)", + "en_us": "A.D. Police: To Protect and Serve", + "ja_jp": "アドバンスドポリス" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "24036", + "slug": "saki-tenjouin", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/24036/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Saki Tenjouin" + } + }, + "media": { + "id": "7007", + "slug": "to-love-ru-darkness", + "posterImage": { + "original": { + "height": 4102, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7007/original.jpg?1597697553", + "width": 2832 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7007/tiny.jpg?1597697553", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7007/small.jpg?1597697553", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7007/medium.jpg?1597697553", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7007/large.jpg?1597697553", + "width": 550 + } + ] + }, + "titles": { + "canonical": "To LOVE-Ru Darkness", + "localized": { + "en": "To LOVE Ru Darkness", + "en_jp": "To LOVE-Ru Darkness", + "ja_jp": "To LOVEる -とらぶる- ダークネス" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "37314", + "slug": "rita-ainsworth", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/37314/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Rita Ainsworth" + } + }, + "media": { + "id": "7023", + "slug": "sakurasou-no-pet-na-kanojo", + "posterImage": { + "original": { + "height": 1212, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7023/original.jpg?1597696828", + "width": 890 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7023/tiny.jpg?1597696828", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7023/small.jpg?1597696828", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7023/medium.jpg?1597696828", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7023/large.jpg?1597696828", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Sakurasou no Pet na Kanojo", + "localized": { + "en": "The Pet Girl of Sakurasou", + "en_jp": "Sakurasou no Pet na Kanojo", + "en_us": "The Pet Girl of Sakurasou", + "ja_jp": "さくら荘のペットな彼女" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "5983", + "slug": "lafiel-abriel", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/5983/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Lafiel Abriel" + } + }, + "media": { + "id": "1235", + "slug": "seikai-no-monshou-special", + "posterImage": { + "original": { + "height": 283, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1235/original.jpg?1597698100", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1235/tiny.jpg?1597698100", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1235/small.jpg?1597698100", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1235/medium.jpg?1597698100", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1235/large.jpg?1597698100", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Seikai no Monshou Special", + "localized": { + "en_jp": "Seikai no Monshou Special", + "ja_jp": "星界の紋章 総集編" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "35783", + "slug": "blood-leopard", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/35783/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Mihaya Kakei" + } + }, + "media": { + "id": "7050", + "slug": "accel-world-specials", + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7050/original.jpg?1408460144", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7050/tiny.jpg?1408460144", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7050/small.jpg?1408460144", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7050/medium.jpg?1408460144", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7050/large.jpg?1408460144", + "width": null + } + ] + }, + "titles": { + "canonical": "Accel World: Acchel World.", + "localized": { + "en_jp": "Accel World: Acchel World.", + "ja_jp": "あくちぇる・わーるど。" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "2931", + "slug": "chikane-himemiya", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/2931/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Chikane Himemiya" + } + }, + "media": { + "id": "121", + "slug": "kannazuki-no-miko", + "posterImage": { + "original": { + "height": 2516, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/121/original.png?1597698738", + "width": 1737 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/121/tiny.jpg?1597698738", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/121/small.jpg?1597698738", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/121/medium.jpg?1597698738", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/121/large.jpg?1597698738", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Kannazuki no Miko", + "localized": { + "en": "Destiny of the Shrine Maiden", + "en_jp": "Kannazuki no Miko", + "en_us": "Destiny of the Shrine Maiden", + "ja_jp": "神無月の巫女" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "37404", + "slug": "kay", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/37404/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Kei" + } + }, + "media": { + "id": "7087", + "slug": "girls-und-panzer", + "posterImage": { + "original": { + "height": 646, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7087/original.jpg?1597695082", + "width": 472 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7087/tiny.jpg?1597695082", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7087/small.jpg?1597695082", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7087/medium.jpg?1597695082", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7087/large.jpg?1597695082", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Girls \u0026 Panzer", + "localized": { + "en": "Girls \u0026 Panzer", + "en_jp": "Girls \u0026 Panzer", + "en_us": "Girls \u0026 Panzer", + "ja_jp": "ガールズ\u0026パンツァー" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "35783", + "slug": "blood-leopard", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/35783/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Mihaya Kakei" + } + }, + "media": { + "id": "7057", + "slug": "accel-world-ex", + "posterImage": { + "original": { + "height": 350, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7057/original.jpg?1597690745", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7057/tiny.jpg?1597690745", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7057/small.jpg?1597690745", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7057/medium.jpg?1597690745", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7057/large.jpg?1597690745", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Accel World EX", + "localized": { + "en_jp": "Accel World EX", + "ja_jp": "アクセル・ワールド EX" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "9681", + "slug": "kaori-misaka", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/9681/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Kaori Misaka" + } + }, + "media": { + "id": "7659", + "slug": "kanon", + "posterImage": { + "original": { + "height": 1504, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7659/original.jpg?1597698568", + "width": 1132 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7659/tiny.jpg?1597698568", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7659/small.jpg?1597698568", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7659/medium.jpg?1597698568", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7659/large.jpg?1597698568", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Kanon", + "localized": { + "en_jp": "Kanon", + "ja_jp": "カノン" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "2964", + "slug": "hikari-hoshino", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/2964/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Hikari Hoshino" + } + }, + "media": { + "id": "124", + "slug": "kono-minikuku-mo-utsukushii-sekai", + "posterImage": { + "original": { + "height": 273, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/124/original.jpg?1597691586", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/124/tiny.jpg?1597691586", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/124/small.jpg?1597691586", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/124/medium.jpg?1597691586", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/124/large.jpg?1597691586", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Kono Minikuku mo Utsukushii Sekai", + "localized": { + "en": "This Ugly Yet Beautiful World", + "en_jp": "Kono Minikuku mo Utsukushii Sekai", + "en_us": "This Ugly Yet Beautiful World", + "ja_jp": "この醜くも美しい世界" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "24528", + "slug": "erina-pendleton", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/24528/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Erina Pendleton" + } + }, + "media": { + "id": "7158", + "slug": "jojo-s-bizarre-adventure-2012", + "posterImage": { + "original": { + "height": 512, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7158/original.png?1597694869", + "width": 358 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7158/tiny.jpg?1597694869", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7158/small.jpg?1597694869", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7158/medium.jpg?1597694869", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7158/large.jpg?1597694869", + "width": 550 + } + ] + }, + "titles": { + "canonical": "JoJo no Kimyou na Bouken (TV)", + "localized": { + "en": "JoJo's Bizarre Adventure (2012)", + "en_jp": "JoJo no Kimyou na Bouken (TV)", + "en_us": "JoJo's Bizarre Adventure", + "ja_jp": "ジョジョの奇妙な冒険" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "15253", + "slug": "otoha-sakurano", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/15253/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Otoha Sakurano" + } + }, + "media": { + "id": "1326", + "slug": "sky-girls-ova", + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1326/original.jpg?1408443732", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1326/tiny.jpg?1408443732", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1326/small.jpg?1408443732", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1326/medium.jpg?1408443732", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1326/large.jpg?1408443732", + "width": null + } + ] + }, + "titles": { + "canonical": "Sky Girls OVA", + "localized": { + "en_jp": "Sky Girls OVA", + "ja_jp": "スカイガールズ" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "6553", + "slug": "saber", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/6553/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Saber" + } + }, + "media": { + "id": "7173", + "slug": "fate-kaleid-liner-prisma-illya", + "posterImage": { + "original": { + "height": 943, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7173/original.jpg?1597695114", + "width": 700 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7173/tiny.jpg?1597695114", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7173/small.jpg?1597695114", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7173/medium.jpg?1597695114", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7173/large.jpg?1597695114", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Fate/kaleid liner Prisma☆Illya", + "localized": { + "en": "Fate/Kaleid Liner Prisma Illya", + "en_jp": "Fate/kaleid liner Prisma☆Illya", + "en_us": "Fate/Kaleid Liner Prisma Illya", + "ja_jp": "Fate/kaleid liner プリズマ☆イリヤ" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "36114", + "slug": "akira-igarashi-bbec632e-9df3-4317-943b-1c6f9265a1a8", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/36114/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Akira Igarashi" + } + }, + "media": { + "id": "7184", + "slug": "akb0048-next-stage", + "posterImage": { + "original": { + "height": 316, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7184/original.jpg?1597691825", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7184/tiny.jpg?1597691825", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7184/small.jpg?1597691825", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7184/medium.jpg?1597691825", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7184/large.jpg?1597691825", + "width": 550 + } + ] + }, + "titles": { + "canonical": "AKB0048: Next Stage", + "localized": { + "en": "AKB0048: Next Stage", + "en_jp": "AKB0048: Next Stage", + "en_us": "AKB0048: Next Stage", + "ja_jp": "AKB0048 next stage" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "6524", + "slug": "kazumi-yoshida", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/6524/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Kazumi Yoshida" + } + }, + "media": { + "id": "1372", + "slug": "shakugan-no-shana-special-koi-to-onsen-no-kougai-gakushuu", + "posterImage": { + "original": { + "height": 326, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1372/original.jpg?1597698095", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1372/tiny.jpg?1597698095", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1372/small.jpg?1597698095", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1372/medium.jpg?1597698095", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1372/large.jpg?1597698095", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Shakugan no Shana SP: Koi to Onsen no Kougai Gakushuu!", + "localized": { + "en_jp": "Shakugan no Shana SP: Koi to Onsen no Kougai Gakushuu!", + "ja_jp": "灼眼のシャナSP 恋と温泉の校外学習!" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "9681", + "slug": "kaori-misaka", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/9681/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Kaori Misaka" + } + }, + "media": { + "id": "122", + "slug": "kanon-2006", + "posterImage": { + "original": { + "height": 1000, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/122/original.jpg?1597690611", + "width": 702 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/122/tiny.jpg?1597690611", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/122/small.jpg?1597690611", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/122/medium.jpg?1597690611", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/122/large.jpg?1597690611", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Kanon (2006)", + "localized": { + "en": "Kanon (2006)", + "en_jp": "Kanon (2006)", + "en_us": "Kanon", + "ja_jp": "カノン (2006)" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "16321", + "slug": "urara-9d087f16-782c-4e17-8aaf-839bd5f3a795", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/16321/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Urara " + } + }, + "media": { + "id": "1405", + "slug": "pokemon-diamond-pearl", + "posterImage": { + "original": { + "height": 600, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1405/original.jpg?1597698435", + "width": 425 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1405/tiny.jpg?1597698435", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1405/small.jpg?1597698435", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1405/medium.jpg?1597698435", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1405/large.jpg?1597698435", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Pokemon Diamond \u0026 Pearl", + "localized": { + "en_jp": "Pokemon Diamond \u0026 Pearl", + "ja_jp": "ポケットモンスター ダイヤモンド\u0026パール" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "6553", + "slug": "saber", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/6553/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Saber" + } + }, + "media": { + "id": "7342", + "slug": "carnival-phantasm-hibichika-special", + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7342/original.jpg?1408461040", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7342/tiny.jpg?1408461040", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7342/small.jpg?1408461040", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7342/medium.jpg?1408461040", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7342/large.jpg?1408461040", + "width": null + } + ] + }, + "titles": { + "canonical": "Carnival Phantasm: HibiChika Special", + "localized": { + "en_jp": "Carnival Phantasm: HibiChika Special", + "ja_jp": "カーニバル・ファンタズム ひびちかスペシャル" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "1556", + "slug": "ayumu-kasuga", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/1556/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Ayumu Kasuga" + } + }, + "media": { + "id": "1433", + "slug": "azumanga-web-daioh", + "posterImage": { + "original": { + "height": 150, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1433/original.jpg?1597698916", + "width": 200 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1433/tiny.jpg?1597698916", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1433/small.jpg?1597698916", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1433/medium.jpg?1597698916", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1433/large.jpg?1597698916", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Azumanga Web Daioh", + "localized": { + "en": "Azumanga Web Daioh", + "en_jp": "Azumanga Web Daioh", + "en_us": "Azumanga Web Daioh", + "ja_jp": "あずまんがWEB大王" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "16621", + "slug": "nanoca-flanka", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/16621/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Nanoca Flanka" + } + }, + "media": { + "id": "1426", + "slug": "aoi-umi-no-tristia", + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1426/original.jpg?1408443997", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1426/tiny.jpg?1408443997", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1426/small.jpg?1408443997", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1426/medium.jpg?1408443997", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1426/large.jpg?1408443997", + "width": null + } + ] + }, + "titles": { + "canonical": "Aoi Umi no Tristia", + "localized": { + "en_jp": "Aoi Umi no Tristia", + "ja_jp": "蒼い海のトリスティア" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "16753", + "slug": "sara-werec", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/16753/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Sara Werec" + } + }, + "media": { + "id": "1442", + "slug": "soukou-no-strain", + "posterImage": { + "original": { + "height": 313, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1442/original.jpg?1597697932", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1442/tiny.jpg?1597697932", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1442/small.jpg?1597697932", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1442/medium.jpg?1597697932", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1442/large.jpg?1597697932", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Soukou no Strain", + "localized": { + "en": "Strain: Strategic Armored Infantry", + "en_jp": "Soukou no Strain", + "en_us": "Strain: Strategic Armored Infantry", + "ja_jp": "奏光のストレイン" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "34746", + "slug": "hatsue-nobidome", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/34746/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Hatsue Nobidome" + } + }, + "media": { + "id": "7367", + "slug": "ro-kyu-bu-ss", + "posterImage": { + "original": { + "height": 988, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7367/original.jpg?1597698347", + "width": 710 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7367/tiny.jpg?1597698347", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7367/small.jpg?1597698347", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7367/medium.jpg?1597698347", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7367/large.jpg?1597698347", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Ro-Kyu-Bu! SS", + "localized": { + "en_jp": "Ro-Kyu-Bu! SS", + "ja_jp": "ロウきゅーぶ! SS" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "29560", + "slug": "reina-vance", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/29560/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Leina Vance" + } + }, + "media": { + "id": "7412", + "slug": "vanquished-queens", + "posterImage": { + "original": { + "height": 578, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7412/original.jpg?1597699110", + "width": 400 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7412/tiny.jpg?1597699110", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7412/small.jpg?1597699110", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7412/medium.jpg?1597699110", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7412/large.jpg?1597699110", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Vanquished Queens", + "localized": { + "en_jp": "Vanquished Queens", + "ja_jp": "ヴァンキッシュド・クイーンズ" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "38549", + "slug": "erika-kuramoto", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/38549/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Erika Kuramoto" + } + }, + "media": { + "id": "7484", + "slug": "zettai-junpaku-mahou-shoujo", + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7484/original.jpg?1409924062", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7484/tiny.jpg?1409924062", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7484/small.jpg?1409924062", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7484/medium.jpg?1409924062", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7484/large.jpg?1409924062", + "width": null + } + ] + }, + "titles": { + "canonical": "Zettai Junpaku♡Mahou Shoujo", + "localized": { + "en_jp": "Zettai Junpaku♡Mahou Shoujo", + "ja_jp": "絶対純白♡魔法少女" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "3331", + "slug": "megumi-shitow", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/3331/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Megumi Shitow" + } + }, + "media": { + "id": "143", + "slug": "rahxephon", + "posterImage": { + "original": { + "height": 719, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/143/original.jpg?1597696695", + "width": 550 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/143/tiny.jpg?1597696695", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/143/small.jpg?1597696695", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/143/medium.jpg?1597696695", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/143/large.jpg?1597696695", + "width": 550 + } + ] + }, + "titles": { + "canonical": "RahXephon", + "localized": { + "en": "RahXephon", + "en_jp": "RahXephon", + "en_us": "RahXephon", + "ja_jp": "ラーゼフォン" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "3379", + "slug": "winia-chester", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/3379/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Winia Chester" + } + }, + "media": { + "id": "145", + "slug": "scrapped-princess", + "posterImage": { + "original": { + "height": 325, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/145/original.jpg?1597690986", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/145/tiny.jpg?1597690986", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/145/small.jpg?1597690986", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/145/medium.jpg?1597690986", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/145/large.jpg?1597690986", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Scrapped Princess", + "localized": { + "en": "Scrapped Princess", + "en_jp": "Scrapped Princess", + "en_us": "Scrapped Princess", + "ja_jp": "スクラップド・プリンセス" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "54624", + "slug": "minato-shirakawa", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/54624/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Minato Shirakawa" + } + }, + "media": { + "id": "7501", + "slug": "kiniro-mosaic", + "posterImage": { + "original": { + "height": 824, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7501/original.jpg?1597697358", + "width": 580 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7501/tiny.jpg?1597697358", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7501/small.jpg?1597697358", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7501/medium.jpg?1597697358", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7501/large.jpg?1597697358", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Kiniro Mosaic", + "localized": { + "en": "KINMOZA!", + "en_jp": "Kiniro Mosaic", + "en_us": "KINMOZA!", + "ja_jp": "きんいろモザイク" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "17254", + "slug": "mysterious-girl-fc00287e-cca6-4f1f-8dcd-4d947f83cf47", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/17254/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Mysterious Girl" + } + }, + "media": { + "id": "1510", + "slug": "brave-story", + "posterImage": { + "original": { + "height": 300, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1510/original.jpg?1597691890", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1510/tiny.jpg?1597691890", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1510/small.jpg?1597691890", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1510/medium.jpg?1597691890", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1510/large.jpg?1597691890", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Brave Story", + "localized": { + "en": "Brave Story", + "en_jp": "Brave Story", + "en_us": "Brave Story", + "ja_jp": "ブレイブ・ストーリー" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "17441", + "slug": "megumi-noda", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/17441/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Megumi Noda" + } + }, + "media": { + "id": "1525", + "slug": "nodame-cantabile", + "posterImage": { + "original": { + "height": 710, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1525/original.jpg?1597696906", + "width": 490 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1525/tiny.jpg?1597696906", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1525/small.jpg?1597696906", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1525/medium.jpg?1597696906", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1525/large.jpg?1597696906", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Nodame Cantabile", + "localized": { + "en": "Nodame Cantabile", + "en_jp": "Nodame Cantabile", + "en_us": "Nodame Cantabile", + "ja_jp": "のだめカンタービレ" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "17472", + "slug": "emilia", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/17472/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Emilia" + } + }, + "media": { + "id": "1526", + "slug": "romeo-x-juliet", + "posterImage": { + "original": { + "height": 1337, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1526/original.png?1597697598", + "width": 923 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1526/tiny.jpg?1597697598", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1526/small.jpg?1597697598", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1526/medium.jpg?1597697598", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1526/large.jpg?1597697598", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Romeo x Juliet", + "localized": { + "en": "Romeo x Juliet", + "en_jp": "Romeo x Juliet", + "en_us": "Romeo x Juliet", + "ja_jp": "ロミオ×ジュリエット" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "25903", + "slug": "athena-tennos", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/25903/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Athena Tennousu" + } + }, + "media": { + "id": "7561", + "slug": "hayate-the-combat-butler-cuties", + "posterImage": { + "original": { + "height": 350, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7561/original.jpg?1597697982", + "width": 250 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7561/tiny.jpg?1597697982", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7561/small.jpg?1597697982", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7561/medium.jpg?1597697982", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7561/large.jpg?1597697982", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Hayate no Gotoku! Cuties", + "localized": { + "en": "Hayate the Combat Butler! Cuties", + "en_jp": "Hayate no Gotoku! Cuties", + "en_us": "Hayate the Combat Butler! Cuties", + "ja_jp": "ハヤテのごとく! Cuties" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "17608", + "slug": "nono-ichinose", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/17608/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Nono Ichinose" + } + }, + "media": { + "id": "1542", + "slug": "hitohira", + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1542/original.jpg?1408444291", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1542/tiny.jpg?1408444291", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1542/small.jpg?1408444291", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1542/medium.jpg?1408444291", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1542/large.jpg?1408444291", + "width": null + } + ] + }, + "titles": { + "canonical": "Hitohira", + "localized": { + "en_jp": "Hitohira", + "ja_jp": "ひとひら" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "17692", + "slug": "eufinley-tsuge", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/17692/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Eufinley Tsuge" + } + }, + "media": { + "id": "1548", + "slug": "shinkyoku-soukai-polyphonica", + "posterImage": { + "original": { + "height": 315, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1548/original.jpg?1597691951", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1548/tiny.jpg?1597691951", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1548/small.jpg?1597691951", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1548/medium.jpg?1597691951", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1548/large.jpg?1597691951", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Shinkyoku Soukai Polyphonica", + "localized": { + "en": "Polyphonica", + "en_jp": "Shinkyoku Soukai Polyphonica", + "en_us": "Polyphonica", + "ja_jp": "神曲奏界ポリフォニカ" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "4882", + "slug": "kanako-ohno", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/4882/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Kanako Oono" + } + }, + "media": { + "id": "1631", + "slug": "genshiken-ova", + "posterImage": { + "original": { + "height": 319, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1631/original.jpg?1597697383", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1631/tiny.jpg?1597697383", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1631/small.jpg?1597697383", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1631/medium.jpg?1597697383", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1631/large.jpg?1597697383", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Genshiken OVA", + "localized": { + "en_jp": "Genshiken OVA", + "ja_jp": "げんしけん OVA" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "18247", + "slug": "kaon", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/18247/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Kaon" + } + }, + "media": { + "id": "1628", + "slug": "kyoshiro-to-towa-no-sora", + "posterImage": { + "original": { + "height": 316, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1628/original.jpg?1597691895", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1628/tiny.jpg?1597691895", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1628/small.jpg?1597691895", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1628/medium.jpg?1597691895", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1628/large.jpg?1597691895", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Kyoushirou to Towa no Sora", + "localized": { + "en": "Shattered Angels", + "en_jp": "Kyoushirou to Towa no Sora", + "en_us": "Shattered Angels", + "ja_jp": "京四郎と永遠(とわ)の空" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "29560", + "slug": "reina-vance", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/29560/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Leina Vance" + } + }, + "media": { + "id": "7847", + "slug": "vanquished-queens-specials", + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7847/original.jpg?1408462617", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7847/tiny.jpg?1408462617", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7847/small.jpg?1408462617", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7847/medium.jpg?1408462617", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7847/large.jpg?1408462617", + "width": null + } + ] + }, + "titles": { + "canonical": "Vanquished Queens Specials", + "localized": { + "en_jp": "Vanquished Queens Specials", + "ja_jp": "ヴァンキッシュド・クイーンズ" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "18333", + "slug": "elena-014dc0ac-f4bf-41de-89bb-5b2dd07dea90", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/18333/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Elena" + } + }, + "media": { + "id": "1635", + "slug": "claymore", + "posterImage": { + "original": { + "height": 710, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1635/original.jpg?1597697346", + "width": 490 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1635/tiny.jpg?1597697346", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1635/small.jpg?1597697346", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1635/medium.jpg?1597697346", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1635/large.jpg?1597697346", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Claymore", + "localized": { + "en": "Claymore", + "en_jp": "Claymore", + "en_us": "Claymore", + "ja_jp": "クレイモア" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "6524", + "slug": "kazumi-yoshida", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/6524/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Kazumi Yoshida" + } + }, + "media": { + "id": "1632", + "slug": "shakugan-no-shana-movie", + "posterImage": { + "original": { + "height": 301, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1632/original.jpg?1597698014", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1632/tiny.jpg?1597698014", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1632/small.jpg?1597698014", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1632/medium.jpg?1597698014", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1632/large.jpg?1597698014", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Shakugan no Shana Movie", + "localized": { + "en": "Shakugan no Shana: The Movie", + "en_jp": "Shakugan no Shana Movie", + "en_us": "Shakugan no Shana: The Movie", + "ja_jp": "劇場版 灼眼のシャナ" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "40291", + "slug": "izumi-nase", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/40291/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Izumi Nase" + } + }, + "media": { + "id": "7714", + "slug": "kyoukai-no-kanata", + "posterImage": { + "original": { + "height": 1402, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7714/original.jpg?1597697326", + "width": 1000 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7714/tiny.jpg?1597697326", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7714/small.jpg?1597697326", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7714/medium.jpg?1597697326", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7714/large.jpg?1597697326", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Kyoukai no Kanata", + "localized": { + "en": "Beyond the Boundary", + "en_jp": "Kyoukai no Kanata", + "en_us": "Beyond the Boundary", + "ja_jp": "境界の彼方" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "58849", + "slug": "rira-mochizuki", + "image": { + "original": { + "height": null, + "name": "original", + "url": "/images/original/missing.png?1483096805", + "width": null + } + }, + "names": { + "canonical": "Rira Mochizuki" + } + }, + "media": { + "id": "9689", + "slug": "visitor", + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/9689/original.jpg?1412325332", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/9689/tiny.jpg?1412325332", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/9689/small.jpg?1412325332", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/9689/medium.jpg?1412325332", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/9689/large.jpg?1412325332", + "width": null + } + ] + }, + "titles": { + "canonical": "Visitor", + "localized": { + "en_jp": "Visitor", + "ja_jp": "(ビジター" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "13385", + "slug": "henrietta-de-tristain", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/13385/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Henrietta de Tristain" + } + }, + "media": { + "id": "1657", + "slug": "zero-no-tsukaima-futatsuki-no-kishi", + "posterImage": { + "original": { + "height": 584, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1657/original.jpg?1597697773", + "width": 432 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1657/tiny.jpg?1597697773", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1657/small.jpg?1597697773", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1657/medium.jpg?1597697773", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1657/large.jpg?1597697773", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Zero no Tsukaima: Futatsuki no Kishi", + "localized": { + "en": "The Familiar of Zero: Knight of the Twin Moons", + "en_jp": "Zero no Tsukaima: Futatsuki no Kishi", + "en_us": "The Familiar of Zero: Knight of the Twin Moons", + "ja_jp": "ゼロの使い魔 ~双月の騎士~" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "5059", + "slug": "elie", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/5059/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Elie" + } + }, + "media": { + "id": "7692", + "slug": "fairy-tail-x-rave", + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7692/original.jpg?1408462118", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7692/tiny.jpg?1408462118", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7692/small.jpg?1408462118", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7692/medium.jpg?1408462118", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7692/large.jpg?1408462118", + "width": null + } + ] + }, + "titles": { + "canonical": "Fairy Tail x Rave", + "localized": { + "en_jp": "Fairy Tail x Rave", + "ja_jp": "FAIRYTAIL×RAVE" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "178", + "slug": "natsuki-mogi", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/178/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Natsuki Mogi" + } + }, + "media": { + "id": "162", + "slug": "initial-d-first-stage", + "posterImage": { + "original": { + "height": 443, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/162/original.png?1597696621", + "width": 355 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/162/tiny.jpg?1597696621", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/162/small.jpg?1597696621", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/162/medium.jpg?1597696621", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/162/large.jpg?1597696621", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Initial D First Stage", + "localized": { + "en": "Initial D First Stage", + "en_jp": "Initial D First Stage", + "en_us": "Initial D First Stage", + "ja_jp": "頭文字〈イニシャル〉D" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "18533", + "slug": "yuki-azuma", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/18533/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Yuki Azuma" + } + }, + "media": { + "id": "1663", + "slug": "princess-nine", + "posterImage": { + "original": { + "height": 318, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1663/original.jpg?1597698062", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1663/tiny.jpg?1597698062", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1663/small.jpg?1597698062", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1663/medium.jpg?1597698062", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1663/large.jpg?1597698062", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Princess Nine: Kisaragi Joshikou Yakyuubu", + "localized": { + "en": "Princess Nine", + "en_jp": "Princess Nine: Kisaragi Joshikou Yakyuubu", + "en_us": "Princess Nine", + "ja_jp": "プリンセスナイン 如月女子高野球部" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "178", + "slug": "natsuki-mogi", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/178/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Natsuki Mogi" + } + }, + "media": { + "id": "163", + "slug": "initial-d-second-stage", + "posterImage": { + "original": { + "height": 327, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/163/original.jpg?1597697044", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/163/tiny.jpg?1597697044", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/163/small.jpg?1597697044", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/163/medium.jpg?1597697044", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/163/large.jpg?1597697044", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Initial D Second Stage", + "localized": { + "en": "Initial D Second Stage", + "en_jp": "Initial D Second Stage", + "en_us": "Initial D Second Stage", + "ja_jp": "頭文字〈イニシャル〉D SECOND STAGE" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "18650", + "slug": "sumire-nishiwa", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/18650/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Sumire Nishiwa" + } + }, + "media": { + "id": "1682", + "slug": "getsumen-to-heiki-mina", + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1682/original.jpg?1494816697", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1682/tiny.jpg?1494816697", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1682/small.jpg?1494816697", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1682/medium.jpg?1494816697", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1682/large.jpg?1494816697", + "width": null + } + ] + }, + "titles": { + "canonical": "Getsumen To Heiki Mina", + "localized": { + "en_jp": "Getsumen To Heiki Mina", + "ja_jp": "月面兎兵器ミーナ" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "37404", + "slug": "kay", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/37404/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Kei" + } + }, + "media": { + "id": "7904", + "slug": "girls-und-panzer-der-film", + "posterImage": { + "original": { + "height": 1694, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7904/original.jpg?1597696625", + "width": 1200 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7904/tiny.jpg?1597696625", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7904/small.jpg?1597696625", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7904/medium.jpg?1597696625", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7904/large.jpg?1597696625", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Girls \u0026 Panzer Movie", + "localized": { + "en": "Girls und Panzer der Film", + "en_jp": "Girls \u0026 Panzer Movie", + "en_us": "Girls und Panzer der Film", + "ja_jp": "ガールズ\u0026パンツァー 劇場版" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "18730", + "slug": "elsa-ff4fe679-fd15-40fa-8add-93fdd412acd6", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/18730/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Elsa" + } + }, + "media": { + "id": "464", + "slug": "fushigiboshi-no-futagohime-gyu", + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/464/original.jpg?1408441533", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/464/tiny.jpg?1408441533", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/464/small.jpg?1408441533", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/464/medium.jpg?1408441533", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/464/large.jpg?1408441533", + "width": null + } + ] + }, + "titles": { + "canonical": "Fushigiboshi no☆Futagohime Gyu!", + "localized": { + "en_jp": "Fushigiboshi no☆Futagohime Gyu!", + "ja_jp": "ふしぎ星の☆ふたご姫" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "7886", + "slug": "matsuri-sakuragi", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/7886/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Matsuri Sakuragi" + } + }, + "media": { + "id": "1698", + "slug": "ichigo-mashimaro-ova", + "posterImage": { + "original": { + "height": 303, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1698/original.jpg?1597697486", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1698/tiny.jpg?1597697486", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1698/small.jpg?1597697486", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1698/medium.jpg?1597697486", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1698/large.jpg?1597697486", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Ichigo Mashimaro OVA", + "localized": { + "en": "Strawberry Marshmallow OVA", + "en_jp": "Ichigo Mashimaro OVA", + "en_us": "Strawberry Marshmallow OVA", + "ja_jp": "苺ましまろ OVA" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "178", + "slug": "natsuki-mogi", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/178/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Natsuki Mogi" + } + }, + "media": { + "id": "164", + "slug": "initial-d-third-stage", + "posterImage": { + "original": { + "height": 320, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/164/original.jpg?1597697173", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/164/tiny.jpg?1597697173", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/164/small.jpg?1597697173", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/164/medium.jpg?1597697173", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/164/large.jpg?1597697173", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Initial D Third Stage", + "localized": { + "en_jp": "Initial D Third Stage", + "ja_jp": "頭文字〈イニシャル〉D THIRD STAGE" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "19043", + "slug": "manari", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/19043/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Manari" + } + }, + "media": { + "id": "1746", + "slug": "nakoruru-ano-hito-kara-no-okurimono", + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1746/original.jpg?1408444825", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1746/tiny.jpg?1408444825", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1746/small.jpg?1408444825", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1746/medium.jpg?1408444825", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1746/large.jpg?1408444825", + "width": null + } + ] + }, + "titles": { + "canonical": "Nakoruru: Ano Hito kara no Okurimono", + "localized": { + "en_jp": "Nakoruru: Ano Hito kara no Okurimono", + "ja_jp": "ナコルル ~あのひとからのおくりもの~" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "3747", + "slug": "koishi-herikawa", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/3747/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Koishi Herikawa" + } + }, + "media": { + "id": "172", + "slug": "onegai-teacher", + "posterImage": { + "original": { + "height": 710, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/172/original.jpg?1597698311", + "width": 490 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/172/tiny.jpg?1597698311", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/172/small.jpg?1597698311", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/172/medium.jpg?1597698311", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/172/large.jpg?1597698311", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Onegai☆Teacher", + "localized": { + "en": "Please Teacher!", + "en_jp": "Onegai☆Teacher", + "ja_jp": "おねがい☆ティーチャー" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "81076", + "slug": "cacao-kun", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/81076/original.jpg?1485082691", + "width": null + } + }, + "names": { + "canonical": "Cacao-kun" + } + }, + "media": { + "id": "1766", + "slug": "sore-ike-anpanman", + "posterImage": { + "original": { + "height": 225, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1766/original.jpg?1597691563", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1766/tiny.jpg?1597691563", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1766/small.jpg?1597691563", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1766/medium.jpg?1597691563", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1766/large.jpg?1597691563", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Sore Ike! Anpanman", + "localized": { + "en_jp": "Sore Ike! Anpanman", + "ja_jp": "それいけ!アンパンマン" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "3747", + "slug": "koishi-herikawa", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/3747/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Koishi Herikawa" + } + }, + "media": { + "id": "173", + "slug": "onegai-twins", + "posterImage": { + "original": { + "height": 316, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/173/original.jpg?1597691475", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/173/tiny.jpg?1597691475", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/173/small.jpg?1597691475", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/173/medium.jpg?1597691475", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/173/large.jpg?1597691475", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Onegai☆Twins", + "localized": { + "en": "Please Twins", + "en_jp": "Onegai☆Twins", + "ja_jp": "おねがい☆ツインズ" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "6051", + "slug": "hotaru", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/6051/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Hotaru" + } + }, + "media": { + "id": "1795", + "slug": "hack-legend-of-the-twilight-offline-meeting-special", + "posterImage": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1795/original.jpg?1486236324", + "width": null + }, + "views": [ + { + "height": null, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1795/tiny.jpg?1486236324", + "width": null + }, + { + "height": null, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1795/small.jpg?1486236324", + "width": null + }, + { + "height": null, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1795/medium.jpg?1486236324", + "width": null + }, + { + "height": null, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1795/large.jpg?1486236324", + "width": null + } + ] + }, + "titles": { + "canonical": ".hack//Tasogare no Udewa Densetsu: Offline de Aimashou", + "localized": { + "en": ".hack//Legend of the Twilight Offline Meeting Special", + "en_jp": ".hack//Tasogare no Udewa Densetsu: Offline de Aimashou", + "en_us": ".hack//Legend of the Twilight Offline Meeting Special", + "ja_jp": ".hack//黄昏の腕輪伝説 オフラインで会いましょう" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "26432", + "slug": "laura-stuart", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/26432/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Laura Stuart" + } + }, + "media": { + "id": "8120", + "slug": "toaru-majutsu-no-index-endymion-no-kiseki-special", + "posterImage": { + "original": { + "height": 350, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/8120/original.jpg?1597698273", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/8120/tiny.jpg?1597698273", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/8120/small.jpg?1597698273", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/8120/medium.jpg?1597698273", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/8120/large.jpg?1597698273", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Toaru Majutsu no Index Movie: Endymion no Kiseki Special", + "localized": { + "en_jp": "Toaru Majutsu no Index Movie: Endymion no Kiseki Special", + "ja_jp": "劇場版とある魔術の禁書目録たん-エンデュミオンの奇蹟-があったりなかったり" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "67421", + "slug": "kirara-chan", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/67421/original.jpg?1485077808", + "width": null + } + }, + "names": { + "canonical": "Kirara-chan" + } + }, + "media": { + "id": "1766", + "slug": "sore-ike-anpanman", + "posterImage": { + "original": { + "height": 225, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1766/original.jpg?1597691563", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1766/tiny.jpg?1597691563", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1766/small.jpg?1597691563", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1766/medium.jpg?1597691563", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1766/large.jpg?1597691563", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Sore Ike! Anpanman", + "localized": { + "en_jp": "Sore Ike! Anpanman", + "ja_jp": "それいけ!アンパンマン" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "70385", + "slug": "loco-chan", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/70385/original.jpg?1485078849", + "width": null + } + }, + "names": { + "canonical": "Loco-chan" + } + }, + "media": { + "id": "1766", + "slug": "sore-ike-anpanman", + "posterImage": { + "original": { + "height": 225, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1766/original.jpg?1597691563", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1766/tiny.jpg?1597691563", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1766/small.jpg?1597691563", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1766/medium.jpg?1597691563", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1766/large.jpg?1597691563", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Sore Ike! Anpanman", + "localized": { + "en_jp": "Sore Ike! Anpanman", + "ja_jp": "それいけ!アンパンマン" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "71640", + "slug": "pajaman", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/71640/original.jpg?1485079270", + "width": null + } + }, + "names": { + "canonical": "Pajaman" + } + }, + "media": { + "id": "1766", + "slug": "sore-ike-anpanman", + "posterImage": { + "original": { + "height": 225, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1766/original.jpg?1597691563", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1766/tiny.jpg?1597691563", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1766/small.jpg?1597691563", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1766/medium.jpg?1597691563", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1766/large.jpg?1597691563", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Sore Ike! Anpanman", + "localized": { + "en_jp": "Sore Ike! Anpanman", + "ja_jp": "それいけ!アンパンマン" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "19507", + "slug": "blanc-neige", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/19507/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Blanc Neige" + } + }, + "media": { + "id": "1830", + "slug": "shining-tears-x-wind", + "posterImage": { + "original": { + "height": 1600, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1830/original.jpg?1597692026", + "width": 1082 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1830/tiny.jpg?1597692026", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1830/small.jpg?1597692026", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1830/medium.jpg?1597692026", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1830/large.jpg?1597692026", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Shining Tears X Wind", + "localized": { + "en": "Shining Tears X Wind", + "en_jp": "Shining Tears X Wind", + "en_us": "Shining Tears X Wind", + "ja_jp": "シャイニング・ティアーズ・クロス・ウィンド" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "19518", + "slug": "clalaclan-philias", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/19518/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Clalaclan Philias" + } + }, + "media": { + "id": "1830", + "slug": "shining-tears-x-wind", + "posterImage": { + "original": { + "height": 1600, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1830/original.jpg?1597692026", + "width": 1082 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1830/tiny.jpg?1597692026", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1830/small.jpg?1597692026", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1830/medium.jpg?1597692026", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1830/large.jpg?1597692026", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Shining Tears X Wind", + "localized": { + "en": "Shining Tears X Wind", + "en_jp": "Shining Tears X Wind", + "en_us": "Shining Tears X Wind", + "ja_jp": "シャイニング・ティアーズ・クロス・ウィンド" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "3879", + "slug": "fuu-kasumi", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/3879/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Fuu Kasumi" + } + }, + "media": { + "id": "181", + "slug": "samurai-champloo", + "posterImage": { + "original": { + "height": 710, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/181/original.jpg?1597697712", + "width": 490 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/181/tiny.jpg?1597697712", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/181/small.jpg?1597697712", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/181/medium.jpg?1597697712", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/181/large.jpg?1597697712", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Samurai Champloo", + "localized": { + "en": "Samurai Champloo", + "en_jp": "Samurai Champloo", + "ja_jp": "サムライチャンプルー" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "94247", + "slug": "rikotto", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/94247/original.jpg?1485088023", + "width": null + } + }, + "names": { + "canonical": "Rikotto" + } + }, + "media": { + "id": "8108", + "slug": "parol-no-mirai-shima", + "posterImage": { + "original": { + "height": 313, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/8108/original.jpg?1597690877", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/8108/tiny.jpg?1597690877", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/8108/small.jpg?1597690877", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/8108/medium.jpg?1597690877", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/8108/large.jpg?1597690877", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Parol no Miraijima", + "localized": { + "en": "Paroru's Future Island", + "en_jp": "Parol no Miraijima", + "en_us": "Paroru's Future Island", + "ja_jp": "パロルのみらい島" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "40291", + "slug": "izumi-nase", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/40291/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Izumi Nase" + } + }, + "media": { + "id": "8088", + "slug": "kyoukai-no-kanata-mini-theater", + "posterImage": { + "original": { + "height": 710, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/8088/original.jpg?1597698735", + "width": 490 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/8088/tiny.jpg?1597698735", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/8088/small.jpg?1597698735", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/8088/medium.jpg?1597698735", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/8088/large.jpg?1597698735", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Kyoukai no Kanata: Mini Theater", + "localized": { + "en_jp": "Kyoukai no Kanata: Mini Theater", + "ja_jp": "境界の彼方 ミニ劇場" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "40432", + "slug": "komachi-takamiya", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/40432/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Komachi Takamiya" + } + }, + "media": { + "id": "8017", + "slug": "witch-craft-works", + "posterImage": { + "original": { + "height": 600, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/8017/original.jpg?1597698188", + "width": 424 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/8017/tiny.jpg?1597698188", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/8017/small.jpg?1597698188", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/8017/medium.jpg?1597698188", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/8017/large.jpg?1597698188", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Witch Craft Works", + "localized": { + "en_jp": "Witch Craft Works", + "ja_jp": "ウィッチクラフトワークス" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "40291", + "slug": "izumi-nase", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/40291/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Izumi Nase" + } + }, + "media": { + "id": "8086", + "slug": "kyoukai-no-kanata-idol-saiban-mayoi-nagara-mo-kimi-wo-sabaku-tami", + "posterImage": { + "original": { + "height": 305, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/8086/original.jpg?1597698983", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/8086/tiny.jpg?1597698983", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/8086/small.jpg?1597698983", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/8086/medium.jpg?1597698983", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/8086/large.jpg?1597698983", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Kyoukai no Kanata: Idol Saiban! Mayoi Nagara mo Kimi wo Sabaku Tami", + "localized": { + "en": "Beyond the Boundary: Idol Trial!", + "en_jp": "Kyoukai no Kanata: Idol Saiban! Mayoi Nagara mo Kimi wo Sabaku Tami", + "en_us": "Beyond the Boundary: Idol Trial!", + "ja_jp": "きょうかいのかなた アイドル裁判!~迷いながらも君を裁く民~" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "6580", + "slug": "shizuki-minagami", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/6580/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Shizuki Minagami" + } + }, + "media": { + "id": "1928", + "slug": "bokusatsu-tenshi-dokuro-chan-2", + "posterImage": { + "original": { + "height": 350, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/1928/original.jpg?1597698866", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/1928/tiny.jpg?1597698866", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/1928/small.jpg?1597698866", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/1928/medium.jpg?1597698866", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/1928/large.jpg?1597698866", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Bokusatsu Tenshi Dokuro-chan 2", + "localized": { + "en": "Bludgeoning Angel Dokuro-chan 2", + "en_jp": "Bokusatsu Tenshi Dokuro-chan 2", + "en_us": "Bludgeoning Angel Dokuro-chan 2", + "ja_jp": "撲殺天使ドクロちゃん2[セカンド]" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "MAIN", + "character": { + "id": "25628", + "slug": "liliane", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/25628/original.jpg?1483096805", + "width": null + } + }, + "names": { + "canonical": "Liliane" + } + }, + "media": { + "id": "7783", + "slug": "princess-resurrection", + "posterImage": { + "original": { + "height": 310, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/7783/original.jpg?1597698472", + "width": 225 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/7783/tiny.jpg?1597698472", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/7783/small.jpg?1597698472", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/7783/medium.jpg?1597698472", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/7783/large.jpg?1597698472", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Kaibutsu Oujo", + "localized": { + "en": "Princess Resurrection", + "en_jp": "Kaibutsu Oujo", + "en_us": "Princess Resurrection", + "ja_jp": "怪物王女" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "76050", + "slug": "ooyodo", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/76050/original.jpg?1485080864", + "width": null + } + }, + "names": { + "canonical": "Ooyodo" + } + }, + "media": { + "id": "8039", + "slug": "kantai-collection", + "posterImage": { + "original": { + "height": 850, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/8039/original.jpg?1597698611", + "width": 591 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/8039/tiny.jpg?1597698611", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/8039/small.jpg?1597698611", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/8039/medium.jpg?1597698611", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/8039/large.jpg?1597698611", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Kantai Collection: KanColle", + "localized": { + "en": "KanColle", + "en_jp": "Kantai Collection: KanColle", + "en_us": "KanColle: Kantai Collection", + "ja_jp": "艦隊これくしょん -艦これ-" + } + } + } + } + }, + { + "locale": "ja_jp", + "mediaCharacter": { + "role": "BACKGROUND", + "character": { + "id": "72415", + "slug": "kasumi-konjou", + "image": { + "original": { + "height": null, + "name": "original", + "url": "https://media.kitsu.io/characters/images/72415/original.jpg?1485079568", + "width": null + } + }, + "names": { + "canonical": "Kasumi Konjou" + } + }, + "media": { + "id": "8162", + "slug": "ryuugajou-nanana-no-maizoukin-tv", + "posterImage": { + "original": { + "height": 1200, + "name": "original", + "url": "https://media.kitsu.io/anime/poster_images/8162/original.jpg?1597698212", + "width": 930 + }, + "views": [ + { + "height": 156, + "name": "tiny", + "url": "https://media.kitsu.io/anime/poster_images/8162/tiny.jpg?1597698212", + "width": 110 + }, + { + "height": 402, + "name": "small", + "url": "https://media.kitsu.io/anime/poster_images/8162/small.jpg?1597698212", + "width": 284 + }, + { + "height": 554, + "name": "medium", + "url": "https://media.kitsu.io/anime/poster_images/8162/medium.jpg?1597698212", + "width": 390 + }, + { + "height": 780, + "name": "large", + "url": "https://media.kitsu.io/anime/poster_images/8162/large.jpg?1597698212", + "width": 550 + } + ] + }, + "titles": { + "canonical": "Ryuugajou Nanana no Maizoukin (TV)", + "localized": { + "en": "Nanana's Buried Treasure", + "en_jp": "Ryuugajou Nanana no Maizoukin (TV)", + "en_us": "Nanana's Buried Treasure", + "ja_jp": "龍ヶ嬢七々々の埋蔵金" + } + } + } + } + } + ] + } + } + } +} \ No newline at end of file diff --git a/tests/AnimeClient/test_data/Kitsu/userBeforeTransform.json b/tests/AnimeClient/test_data/Kitsu/userBeforeTransform.json new file mode 100644 index 00000000..ef46d312 --- /dev/null +++ b/tests/AnimeClient/test_data/Kitsu/userBeforeTransform.json @@ -0,0 +1,536 @@ +{ + "data": { + "findProfileBySlug": { + "about": "Web Developer, Anime Fan, Reader of VNs, and web comics.", + "avatarImage": { + "original": { + "name": "original", + "url": "https://media.kitsu.io/users/avatars/2644/original.gif?1491510751", + "width": null, + "height": null + } + }, + "bannerImage": { + "original": { + "name": "original", + "url": "https://media.kitsu.io/users/cover_images/2644/original.jpeg?1487201681", + "width": null, + "height": null + } + }, + "birthday": "1990-03-09", + "id": "2644", + "location": "Michigan, USA", + "name": "timw4mail", + "proMessage": null, + "proTier": null, + "slug": "timw4mail", + "siteLinks": { + "nodes": [ + { + "id": "5804", + "url": "https://timshomepage.net" + }, + { + "id": "4149", + "url": "https://github.com/timw4mail" + }, + { + "id": "4151", + "url": "https://twitter.com/timw4mail" + }, + { + "id": "4150", + "url": "timw4mail#9933" + }, + { + "id": "4152", + "url": "http://steamcommunity.com/id/timw4mail" + } + ] + }, + "favorites": { + "nodes": [ + { + "id": "933073", + "item": { + "__typename": "Anime", + "id": "14212", + "slug": "hataraku-saibou-tv", + "posterImage": { + "original": { + "url": "https://media.kitsu.io/anime/poster_images/14212/original.jpg?1597697195", + "height": 1050, + "width": 750 + }, + "views": [ + { + "url": "https://media.kitsu.io/anime/poster_images/14212/tiny.jpg?1597697195", + "height": 156, + "width": 110 + }, + { + "url": "https://media.kitsu.io/anime/poster_images/14212/small.jpg?1597697195", + "height": 402, + "width": 284 + }, + { + "url": "https://media.kitsu.io/anime/poster_images/14212/medium.jpg?1597697195", + "height": 554, + "width": 390 + }, + { + "url": "https://media.kitsu.io/anime/poster_images/14212/large.jpg?1597697195", + "height": 780, + "width": 550 + } + ] + }, + "titles": { + "canonical": "Hataraku Saibou", + "localized": { + "en": "Cells at Work!", + "en_jp": "Hataraku Saibou", + "ja_jp": "はたらく細胞" + } + } + } + }, + { + "id": "586217", + "item": { + "__typename": "Anime", + "id": "323", + "slug": "fate-stay-night", + "posterImage": { + "original": { + "url": "https://media.kitsu.io/anime/poster_images/323/original.jpg?1597698066", + "height": 1074, + "width": 760 + }, + "views": [ + { + "url": "https://media.kitsu.io/anime/poster_images/323/tiny.jpg?1597698066", + "height": 156, + "width": 110 + }, + { + "url": "https://media.kitsu.io/anime/poster_images/323/small.jpg?1597698066", + "height": 402, + "width": 284 + }, + { + "url": "https://media.kitsu.io/anime/poster_images/323/medium.jpg?1597698066", + "height": 554, + "width": 390 + }, + { + "url": "https://media.kitsu.io/anime/poster_images/323/large.jpg?1597698066", + "height": 780, + "width": 550 + } + ] + }, + "titles": { + "canonical": "Fate/stay night", + "localized": { + "en": "Fate/stay night", + "en_jp": "Fate/stay night", + "en_us": "Fate/stay night", + "ja_jp": "Fate/stay night" + } + } + } + }, + { + "id": "586219", + "item": { + "__typename": "Character", + "id": "6553", + "slug": "saber", + "image": { + "original": { + "url": "https://media.kitsu.io/characters/images/6553/original.jpg?1483096805" + } + }, + "names": { + "alternatives": [ + "King of Knights" + ], + "canonical": "Saber", + "canonicalLocale": null, + "localized": { + "en": "Saber", + "ja_jp": "セイバー" + } + } + } + }, + { + "id": "586218", + "item": { + "__typename": "Character", + "id": "6556", + "slug": "rin-tohsaka", + "image": { + "original": { + "url": "https://media.kitsu.io/characters/images/6556/original.jpg?1483096805" + } + }, + "names": { + "alternatives": [], + "canonical": "Rin Toosaka", + "canonicalLocale": null, + "localized": { + "en": "Rin Toosaka", + "ja_jp": "遠坂 凛" + } + } + } + }, + { + "id": "611365", + "item": { + "__typename": "Character", + "id": "32035", + "slug": "nano-shinonome", + "image": { + "original": { + "url": "https://media.kitsu.io/characters/images/32035/original.jpg?1483096805" + } + }, + "names": { + "alternatives": [], + "canonical": "Nano Shinonome", + "canonicalLocale": null, + "localized": { + "en": "Nano Shinonome", + "ja_jp": "東雲 なの" + } + } + } + }, + { + "id": "611364", + "item": { + "__typename": "Character", + "id": "32034", + "slug": "mio-naganohara", + "image": { + "original": { + "url": "https://media.kitsu.io/characters/images/32034/original.jpg?1483096805" + } + }, + "names": { + "alternatives": [], + "canonical": "Mio Naganohara", + "canonicalLocale": null, + "localized": { + "en": "Mio Naganohara", + "ja_jp": "長野原みお" + } + } + } + }, + { + "id": "607473", + "item": { + "__typename": "Anime", + "id": "310", + "slug": "tsukuyomi-moon-phase", + "posterImage": { + "original": { + "url": "https://media.kitsu.io/anime/poster_images/310/original.jpg?1597690591", + "height": 320, + "width": 225 + }, + "views": [ + { + "url": "https://media.kitsu.io/anime/poster_images/310/tiny.jpg?1597690591", + "height": 156, + "width": 110 + }, + { + "url": "https://media.kitsu.io/anime/poster_images/310/small.jpg?1597690591", + "height": 402, + "width": 284 + }, + { + "url": "https://media.kitsu.io/anime/poster_images/310/medium.jpg?1597690591", + "height": 554, + "width": 390 + }, + { + "url": "https://media.kitsu.io/anime/poster_images/310/large.jpg?1597690591", + "height": 780, + "width": 550 + } + ] + }, + "titles": { + "canonical": "Tsukuyomi: Moon Phase", + "localized": { + "en": "Tsukuyomi: Moon Phase", + "en_jp": "Tsukuyomi: Moon Phase", + "en_us": "Tsukuyomi: Moon Phase", + "ja_jp": "月詠 −MOON PHASE−" + } + } + } + }, + { + "id": "607472", + "item": { + "__typename": "Anime", + "id": "5992", + "slug": "carnival-phantasm", + "posterImage": { + "original": { + "url": "https://media.kitsu.io/anime/poster_images/5992/original.jpg?1597697878", + "height": 693, + "width": 533 + }, + "views": [ + { + "url": "https://media.kitsu.io/anime/poster_images/5992/tiny.jpg?1597697878", + "height": 156, + "width": 110 + }, + { + "url": "https://media.kitsu.io/anime/poster_images/5992/small.jpg?1597697878", + "height": 402, + "width": 284 + }, + { + "url": "https://media.kitsu.io/anime/poster_images/5992/medium.jpg?1597697878", + "height": 554, + "width": 390 + }, + { + "url": "https://media.kitsu.io/anime/poster_images/5992/large.jpg?1597697878", + "height": 780, + "width": 550 + } + ] + }, + "titles": { + "canonical": "Carnival Phantasm", + "localized": { + "en_jp": "Carnival Phantasm", + "ja_jp": "カーニバル・ファンタズム" + } + } + } + }, + { + "id": "636590", + "item": { + "__typename": "Character", + "id": "31851", + "slug": "aria-holmes-kanzaki", + "image": { + "original": { + "url": "https://media.kitsu.io/characters/images/31851/original.jpg?1483096805" + } + }, + "names": { + "alternatives": [ + "Quadra Aria" + ], + "canonical": "Aria Holmes Kanzaki", + "canonicalLocale": null, + "localized": { + "en": "Aria Holmes Kanzaki", + "ja_jp": "神崎・H・アリア" + } + } + } + }, + { + "id": "636591", + "item": { + "__typename": "Character", + "id": "25930", + "slug": "taiga-aisaka", + "image": { + "original": { + "url": "https://media.kitsu.io/characters/images/25930/original.jpg?1483096805" + } + }, + "names": { + "alternatives": [ + "Palmtop Tiger" + ], + "canonical": "Taiga Aisaka", + "canonicalLocale": null, + "localized": { + "en": "Taiga Aisaka", + "ja_jp": "逢坂 大河" + } + } + } + }, + { + "id": "636593", + "item": { + "__typename": "Character", + "id": "31625", + "slug": "victorique-de-blois", + "image": { + "original": { + "url": "https://media.kitsu.io/characters/images/31625/original.jpg?1483096805" + } + }, + "names": { + "alternatives": [ + "The Golden Fairy", + "Gray Wolf", + "Monstre Charmant" + ], + "canonical": "Victorique de Blois", + "canonicalLocale": null, + "localized": { + "en": "Victorique de Blois", + "ja_jp": "ヴィクトリカ・ド・ブロワ" + } + } + } + }, + { + "id": "636888", + "item": { + "__typename": "Manga", + "id": "21733", + "slug": "tonari-no-seki-kun", + "posterImage": { + "original": { + "url": "https://media.kitsu.io/manga/poster_images/21733/original.jpg?1496845097", + "height": null, + "width": null + }, + "views": [ + { + "url": "https://media.kitsu.io/manga/poster_images/21733/tiny.jpg?1496845097", + "height": null, + "width": null + }, + { + "url": "https://media.kitsu.io/manga/poster_images/21733/small.jpg?1496845097", + "height": null, + "width": null + }, + { + "url": "https://media.kitsu.io/manga/poster_images/21733/medium.jpg?1496845097", + "height": null, + "width": null + }, + { + "url": "https://media.kitsu.io/manga/poster_images/21733/large.jpg?1496845097", + "height": null, + "width": null + } + ] + }, + "titles": { + "canonical": "Tonari no Seki-kun", + "localized": { + "en": "My Neighbour Seki", + "en_jp": "Tonari no Seki-kun", + "en_us": "My Neighbour Seki", + "ja_jp": "となりの関くん" + } + } + } + }, + { + "id": "636892", + "item": { + "__typename": "Anime", + "id": "6062", + "slug": "nichijou", + "posterImage": { + "original": { + "url": "https://media.kitsu.io/anime/poster_images/6062/original.jpg?1597696783", + "height": 2292, + "width": 1610 + }, + "views": [ + { + "url": "https://media.kitsu.io/anime/poster_images/6062/tiny.jpg?1597696783", + "height": 156, + "width": 110 + }, + { + "url": "https://media.kitsu.io/anime/poster_images/6062/small.jpg?1597696783", + "height": 402, + "width": 284 + }, + { + "url": "https://media.kitsu.io/anime/poster_images/6062/medium.jpg?1597696783", + "height": 554, + "width": 390 + }, + { + "url": "https://media.kitsu.io/anime/poster_images/6062/large.jpg?1597696783", + "height": 780, + "width": 550 + } + ] + }, + "titles": { + "canonical": "Nichijou", + "localized": { + "en": "Nichijou - My Ordinary Life", + "en_jp": "Nichijou", + "en_us": "Nichijou - My Ordinary Life", + "ja_jp": "日常" + } + } + } + } + ] + }, + "stats": { + "animeAmountConsumed": { + "completed": 893, + "id": "2161520", + "media": 1044, + "recalculatedAt": "2018-12-25", + "time": 16953917, + "units": 14943 + }, + "mangaAmountConsumed": { + "completed": 26, + "id": "841057", + "media": 49, + "recalculatedAt": "2018-12-20", + "units": 2678 + } + }, + "url": "https://kitsu/users/timw4mail", + "waifu": { + "id": "6553", + "slug": "saber", + "image": { + "original": { + "name": "original", + "url": "https://media.kitsu.io/characters/images/6553/original.jpg?1483096805", + "width": null, + "height": null + } + }, + "names": { + "canonical": "Saber", + "alternatives": [ + "King of Knights" + ], + "localized": { + "en": "Saber", + "ja_jp": "セイバー" + } + } + }, + "waifuOrHusbando": "Waifu" + } + } +} \ No newline at end of file From 160718eaa1d5c9ca00651c84dafba30478e25c96 Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Tue, 23 Feb 2021 13:10:26 -0500 Subject: [PATCH 13/28] Fix broken tests --- composer.json | 4 +- ...TransformerTest__testAnimeTransform__1.yml | 152 +++++++++--------- tests/bootstrap.php | 6 +- 3 files changed, 79 insertions(+), 83 deletions(-) diff --git a/composer.json b/composer.json index 10d0833e..a9c8e9a0 100644 --- a/composer.json +++ b/composer.json @@ -44,7 +44,6 @@ "danielstjules/stringy": "^3.1.0", "ext-dom": "*", "ext-iconv": "*", - "ext-intl": "*", "ext-json": "*", "ext-gd": "*", "ext-pdo": "*", @@ -53,11 +52,12 @@ "laminas/laminas-httphandlerrunner": "^1.1.0", "maximebf/consolekit": "^1.0.3", "monolog/monolog": "^2.0.2", - "php": "^8.0.0", + "php": ">= 8.0.0", "psr/container": "^1.0.0", "psr/http-message": "^1.0.1", "psr/log": "^1.1.3", "robmorgan/phinx": "^0.12.4", + "symfony/polyfill-intl-idn": "^1.0.0", "symfony/var-dumper": "^5.0.7", "yosymfony/toml": "^1.0.4" }, diff --git a/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/HistoryTransformerTest__testAnimeTransform__1.yml b/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/HistoryTransformerTest__testAnimeTransform__1.yml index 71f401d5..958b8d98 100644 --- a/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/HistoryTransformerTest__testAnimeTransform__1.yml +++ b/tests/AnimeClient/API/Kitsu/Transformer/__snapshots__/HistoryTransformerTest__testAnimeTransform__1.yml @@ -4,7 +4,7 @@ coverImg: images/anime/43825.webp action: 'Watched episode 7' kind: progressed - updated: '2021-02-23T12:24:03-05:00' + updated: '2021-02-23T17:24:03+00:00' url: /anime/details/shin-chuuka-ichiban-2nd-season original: { id: '47211008', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43825', slug: shin-chuuka-ichiban-2nd-season, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43825/tiny.jpg?1609082225' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43825/small.jpg?1609082225' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43825/medium.jpg?1609082225' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43825/large.jpg?1609082225' }] }, titles: { alternatives: ['New Cooking Master Boy!'], canonical: 'Shin Chuuka Ichiban! 2nd Season', localized: { en: 'True Cooking Master Boy Season 2', en_jp: 'Shin Chuuka Ichiban! 2nd Season', ja_jp: 真・中華一番! } } }, updatedAt: '2021-02-23T17:24:03Z' } - @@ -13,7 +13,7 @@ coverImg: images/anime/43545.webp action: 'Watched episode 7' kind: progressed - updated: '2021-02-23T07:45:26-05:00' + updated: '2021-02-23T12:45:26+00:00' url: /anime/details/horimiya original: { id: '47197990', changedData: { progress: [6, 7], time_spent: [5520, 6900] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43545', slug: horimiya, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43545/tiny.jpg?1609224996' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43545/small.jpg?1609224996' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43545/medium.jpg?1609224996' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43545/large.jpg?1609224996' }] }, titles: { alternatives: { }, canonical: Horimiya, localized: { en_jp: Horimiya, ja_jp: ホリミヤ } } }, updatedAt: '2021-02-23T12:45:26Z' } - @@ -22,7 +22,7 @@ coverImg: images/anime/43818.webp action: 'Watched episode 7' kind: progressed - updated: '2021-02-23T07:20:46-05:00' + updated: '2021-02-23T12:20:46+00:00' url: /anime/details/kai-byoui-ramune original: { id: '47197145', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '43818', slug: kai-byoui-ramune, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43818/tiny.jpg?1608544506' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43818/small.jpg?1608544506' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43818/medium.jpg?1608544506' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43818/large.jpg?1608544506' }] }, titles: { alternatives: { }, canonical: 'Kai Byoui Ramune', localized: { en: 'Dr. Ramune -Mysterious Disease Specialist-', en_jp: 'Kai Byoui Ramune', ja_jp: 怪病医ラムネ } } }, updatedAt: '2021-02-23T12:20:46Z' } - @@ -31,7 +31,7 @@ coverImg: images/anime/1742.webp action: 'Watched episode 23' kind: progressed - updated: '2021-02-22T15:25:05-05:00' + updated: '2021-02-22T20:25:05+00:00' url: /anime/details/yes-precure-5 original: { id: '47150310', changedData: { progress: [24, 23], time_spent: [1992, 1968] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-22T20:25:05Z' } - @@ -40,7 +40,7 @@ coverImg: images/anime/42635.webp action: 'Watched episode 8' kind: progressed - updated: '2021-02-22T12:50:38-05:00' + updated: '2021-02-22T17:50:38+00:00' url: /anime/details/tatoeba-last-dungeon-mae-no-mura-no-shounen-ga-joban-no-machi-de-kurasu-youna-monogatari original: { id: '47142671', changedData: { progress: [7, 8] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42635', slug: tatoeba-last-dungeon-mae-no-mura-no-shounen-ga-joban-no-machi-de-kurasu-youna-monogatari, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42635/tiny.jpg?1571504181' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42635/small.jpg?1571504181' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42635/medium.jpg?1571504181' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42635/large.jpg?1571504181' }] }, titles: { alternatives: ['Suppose a Kid from the Last Dungeon Boonies Moved to a Starter Town'], canonical: 'Tatoeba Last Dungeon Mae no Mura no Shounen ga Joban no Machi de Kurasu Youna Monogatari', localized: { en_jp: 'Tatoeba Last Dungeon Mae no Mura no Shounen ga Joban no Machi de Kurasu Youna Monogatari', ja_jp: たとえばラストダンジョン前の村の少年が序盤の街で暮らすような物語 } } }, updatedAt: '2021-02-22T17:50:38Z' } - @@ -49,7 +49,7 @@ coverImg: images/anime/42323.webp action: 'Watched episode 7' kind: progressed - updated: '2021-02-22T12:27:39-05:00' + updated: '2021-02-22T17:27:39+00:00' url: /anime/details/mushoku-tensei-isekai-ittara-honki-dasu original: { id: '47141571', changedData: { progress: [6, 7], time_spent: [4320, 5760] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: 'The pervert aspect of this dampens my enjoyment. ' }, media: { __typename: Anime, id: '42323', slug: mushoku-tensei-isekai-ittara-honki-dasu, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42323/tiny.jpg?1571408000' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42323/small.jpg?1571408000' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42323/medium.jpg?1571408000' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42323/large.jpg?1571408000' }] }, titles: { alternatives: { }, canonical: 'Mushoku Tensei: Isekai Ittara Honki Dasu', localized: { en: 'Mushoku Tensei: Jobless Reincarnation', en_jp: 'Mushoku Tensei: Isekai Ittara Honki Dasu', ja_jp: '無職転生 ~異世界行ったら本気だす~' } } }, updatedAt: '2021-02-22T17:27:39Z' } - @@ -58,7 +58,7 @@ coverImg: images/anime/42650.webp action: Completed kind: updated - updated: '2021-02-21T07:47:27-05:00' + updated: '2021-02-21T12:47:27+00:00' url: /anime/details/healin-good-precure original: { id: '47057900', changedData: { status: [current] }, kind: UPDATED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42650', slug: healin-good-precure, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42650/tiny.jpg?1578070083' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42650/small.jpg?1578070083' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42650/medium.jpg?1578070083' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42650/large.jpg?1578070083' }] }, titles: { alternatives: { }, canonical: 'Healin'' Good♡Precure', localized: { en: 'Healin'' Good Pretty Cure', en_jp: 'Healin'' Good♡Precure', ja_jp: ヒーリングっど♡プリキュア } } }, updatedAt: '2021-02-21T12:47:27Z' } - @@ -67,7 +67,7 @@ coverImg: images/anime/42650.webp action: 'Watched episode 45' kind: progressed - updated: '2021-02-21T07:47:27-05:00' + updated: '2021-02-21T12:47:27+00:00' url: /anime/details/healin-good-precure original: { id: '47057899', changedData: { progress: [44, 45], time_spent: [63360, 64800] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42650', slug: healin-good-precure, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42650/tiny.jpg?1578070083' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42650/small.jpg?1578070083' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42650/medium.jpg?1578070083' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42650/large.jpg?1578070083' }] }, titles: { alternatives: { }, canonical: 'Healin'' Good♡Precure', localized: { en: 'Healin'' Good Pretty Cure', en_jp: 'Healin'' Good♡Precure', ja_jp: ヒーリングっど♡プリキュア } } }, updatedAt: '2021-02-21T12:47:27Z' } - @@ -76,16 +76,16 @@ coverImg: images/anime/1742.webp action: 'Watched episodes 23-24' kind: null - updated: '2021-02-20T18:39:13-05:00' + updated: '2021-02-20T23:39:13+00:00' url: /anime/details/yes-precure-5 - original: [{ empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 24', kind: progressed, updated: '2021-02-20T18:39:13-05:00', url: /anime/details/yes-precure-5, original: { id: '47027732', changedData: { progress: [23, 24], time_spent: [1968, 1992] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-20T23:39:13Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 23', kind: progressed, updated: '2021-02-20T18:14:59-05:00', url: /anime/details/yes-precure-5, original: { id: '47026266', changedData: { progress: [22, 23], time_spent: [1944, 1968] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-20T23:14:59Z' } }] + original: [{ empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 24', kind: progressed, updated: '2021-02-20T23:39:13+00:00', url: /anime/details/yes-precure-5, original: { id: '47027732', changedData: { progress: [23, 24], time_spent: [1968, 1992] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-20T23:39:13Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 23', kind: progressed, updated: '2021-02-20T23:14:59+00:00', url: /anime/details/yes-precure-5, original: { id: '47026266', changedData: { progress: [22, 23], time_spent: [1944, 1968] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-20T23:14:59Z' } }] - empty: false title: 'Ore dake Haireru Kakushi Dungeon' coverImg: images/anime/43301.webp action: 'Watched episode 7' kind: progressed - updated: '2021-02-20T17:42:45-05:00' + updated: '2021-02-20T22:42:45+00:00' url: /anime/details/ore-dake-haireru-kakushi-dungeon original: { id: '47024295', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43301', slug: ore-dake-haireru-kakushi-dungeon, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43301/tiny.jpg?1607696005' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43301/small.jpg?1607696005' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43301/medium.jpg?1607696005' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43301/large.jpg?1607696005' }] }, titles: { alternatives: ['Special training in the Secret Dungeon', 'Ore Dake Haireru Kakushi Dungeon: Kossori Kitaete Sekai Saikyou'], canonical: 'Ore dake Haireru Kakushi Dungeon', localized: { en: 'The Hidden Dungeon Only I Can Enter', en_jp: 'Ore dake Haireru Kakushi Dungeon', ja_jp: 俺だけ入れる隠しダンジョン } } }, updatedAt: '2021-02-20T22:42:45Z' } - @@ -94,7 +94,7 @@ coverImg: images/anime/43550.webp action: 'Watched episode 19' kind: progressed - updated: '2021-02-20T17:14:24-05:00' + updated: '2021-02-20T22:14:24+00:00' url: /anime/details/inu-to-neko-docchi-mo-katteru-to-mainichi-tanoshii original: { id: '47022910', changedData: { progress: [18, 19], time_spent: [360, 420] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43550', slug: inu-to-neko-docchi-mo-katteru-to-mainichi-tanoshii, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43550/tiny.jpg?1600679941' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43550/small.jpg?1600679941' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43550/medium.jpg?1600679941' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43550/large.jpg?1600679941' }] }, titles: { alternatives: { }, canonical: 'Inu to Neko Docchi mo Katteru to Mainichi Tanoshii', localized: { en: 'With a Dog and a Cat, Every Day is Fun', en_jp: 'Inu to Neko Docchi mo Katteru to Mainichi Tanoshii', ja_jp: 犬と猫どっちも飼ってると毎日たのしい } } }, updatedAt: '2021-02-20T22:14:24Z' } - @@ -103,7 +103,7 @@ coverImg: images/anime/43569.webp action: 'Watched episode 8' kind: progressed - updated: '2021-02-20T17:05:29-05:00' + updated: '2021-02-20T22:05:29+00:00' url: /anime/details/otona-no-bouguya-san-2nd-season original: { id: '47022451', changedData: { progress: [7, 8] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43569', slug: otona-no-bouguya-san-2nd-season, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43569/tiny.jpg?1601057792' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43569/small.jpg?1601057792' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43569/medium.jpg?1601057792' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43569/large.jpg?1601057792' }] }, titles: { alternatives: { }, canonical: 'Otona no Bouguya-san 2nd Season', localized: { en: 'Armor Shop for Ladies & Gentlemen 2nd Season', en_jp: 'Otona no Bouguya-san 2nd Season', ja_jp: 'おとなの防具屋さん 第2シリーズ' } } }, updatedAt: '2021-02-20T22:05:29Z' } - @@ -112,7 +112,7 @@ coverImg: images/anime/41463.webp action: 'Watched episode 7' kind: progressed - updated: '2021-02-20T17:00:59-05:00' + updated: '2021-02-20T22:00:59+00:00' url: /anime/details/kumo-desu-ga-nani-ka original: { id: '47022229', changedData: { progress: [6, 7], time_spent: [4320, 5760] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '41463', slug: kumo-desu-ga-nani-ka, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/41463/tiny.jpg?1593607925' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/41463/small.jpg?1593607925' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/41463/medium.jpg?1593607925' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/41463/large.jpg?1593607925' }] }, titles: { alternatives: { }, canonical: 'Kumo desu ga, Nani ka?', localized: { en: 'So I''m a Spider, So What?', en_jp: 'Kumo desu ga, Nani ka?', ja_jp: 蜘蛛ですが、なにか? } } }, updatedAt: '2021-02-20T22:00:59Z' } - @@ -121,7 +121,7 @@ coverImg: images/anime/42324.webp action: 'Watched episode 7' kind: progressed - updated: '2021-02-20T16:32:29-05:00' + updated: '2021-02-20T21:32:29+00:00' url: /anime/details/5-toubun-no-hanayome-2 original: { id: '47020824', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42324', slug: 5-toubun-no-hanayome-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42324/tiny.jpg?1597697087' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42324/small.jpg?1597697087' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42324/medium.jpg?1597697087' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42324/large.jpg?1597697087' }] }, titles: { alternatives: ['Gotoubun no Hanayome 2', 'The Five Wedded Brides 2', '5-Toubun no Hanayome 2'], canonical: '5-toubun no Hanayome ∬', localized: { en: 'The Quintessential Quintuplets 2', en_jp: '5-toubun no Hanayome ∬', ja_jp: 五等分の花嫁∬ } } }, updatedAt: '2021-02-20T21:32:29Z' } - @@ -130,7 +130,7 @@ coverImg: images/anime/43137.webp action: 'Watched episode 7' kind: progressed - updated: '2021-02-20T16:01:31-05:00' + updated: '2021-02-20T21:01:31+00:00' url: /anime/details/tenchi-souzou-design-bu original: { id: '47019073', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43137', slug: tenchi-souzou-design-bu, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43137/tiny.jpg?1611330634' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43137/small.jpg?1611330634' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43137/medium.jpg?1611330634' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43137/large.jpg?1611330634' }] }, titles: { alternatives: ['[Ten-De-Bu] What a strange animal!', Tendebu], canonical: 'Tenchi Souzou Design-bu', localized: { en: 'Heaven''s Design Team', en_jp: 'Tenchi Souzou Design-bu', ja_jp: 天地創造デザイン部 } } }, updatedAt: '2021-02-20T21:01:31Z' } - @@ -139,7 +139,7 @@ coverImg: images/anime/41976.webp action: 'Watched episode 7' kind: progressed - updated: '2021-02-20T15:27:54-05:00' + updated: '2021-02-20T20:27:54+00:00' url: /anime/details/yuru-camp-2 original: { id: '47017464', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '41976', slug: yuru-camp-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/41976/tiny.jpg?1611329947' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/41976/small.jpg?1611329947' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/41976/medium.jpg?1611329947' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/41976/large.jpg?1611329947' }] }, titles: { alternatives: { }, canonical: 'Yuru Camp△ 2', localized: { en: 'Laid-Back Camp 2', en_jp: 'Yuru Camp△ 2', ja_jp: 'ゆるキャン△ 2' } } }, updatedAt: '2021-02-20T20:27:54Z' } - @@ -148,7 +148,7 @@ coverImg: images/anime/43180.webp action: 'Watched episode 20' kind: progressed - updated: '2021-02-20T14:47:33-05:00' + updated: '2021-02-20T19:47:33+00:00' url: /anime/details/hanyou-no-yasha-hime original: { id: '47015272', changedData: { progress: [19, 20], time_spent: [4320, 5760] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: 'InuYasha universe, mostly a different cast.' }, media: { __typename: Anime, id: '43180', slug: hanyou-no-yasha-hime, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43180/tiny.jpg?1589037137' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43180/small.jpg?1589037137' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43180/medium.jpg?1589037137' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43180/large.jpg?1589037137' }] }, titles: { alternatives: ['Inuyasha: Hanyou no Yasha Hime'], canonical: 'Hanyou no Yashahime: Sengoku Otogizoushi', localized: { en: 'Yashahime: Princess Half-Demon', en_jp: 'Hanyou no Yashahime: Sengoku Otogizoushi', ja_jp: 半妖の夜叉姫 } } }, updatedAt: '2021-02-20T19:47:33Z' } - @@ -157,7 +157,7 @@ coverImg: images/anime/42621.webp action: 'Watched episode 7' kind: progressed - updated: '2021-02-20T14:23:07-05:00' + updated: '2021-02-20T19:23:07+00:00' url: /anime/details/jaku-chara-tomozaki-kun original: { id: '47013918', changedData: { progress: [6, 7], time_spent: [0, 1380] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '42621', slug: jaku-chara-tomozaki-kun, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42621/tiny.jpg?1611329334' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42621/small.jpg?1611329334' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42621/medium.jpg?1611329334' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42621/large.jpg?1611329334' }] }, titles: { alternatives: ['Bottom-tier Character Tomozaki', 'Jakusha Character Tomozaki-kun'], canonical: 'Jaku-chara Tomozaki-kun', localized: { en: 'The Low Tier Character "Tomozaki-kun"', en_jp: 'Jaku-chara Tomozaki-kun', ja_jp: 弱キャラ友崎くん } } }, updatedAt: '2021-02-20T19:23:07Z' } - @@ -166,7 +166,7 @@ coverImg: images/anime/43167.webp action: 'Watched episode 9' kind: progressed - updated: '2021-02-20T13:58:33-05:00' + updated: '2021-02-20T18:58:33+00:00' url: /anime/details/hataraku-saibou-black-tv original: { id: '47012582', changedData: { progress: [8, 9] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43167', slug: hataraku-saibou-black-tv, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43167/tiny.jpg?1611330065' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43167/small.jpg?1611330065' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43167/medium.jpg?1611330065' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43167/large.jpg?1611330065' }] }, titles: { alternatives: ['Cells at Work! Code Black'], canonical: 'Hataraku Saibou Black (TV)', localized: { en_jp: 'Hataraku Saibou Black (TV)', ja_jp: はたらく細胞BLACK } } }, updatedAt: '2021-02-20T18:58:33Z' } - @@ -175,7 +175,7 @@ coverImg: images/anime/1742.webp action: 'Watched episode 22' kind: progressed - updated: '2021-02-20T13:35:49-05:00' + updated: '2021-02-20T18:35:49+00:00' url: /anime/details/yes-precure-5 original: { id: '47011542', changedData: { progress: [21, 22], time_spent: [1920, 1944] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-20T18:35:49Z' } - @@ -184,7 +184,7 @@ coverImg: images/anime/42202.webp action: 'Watched episode 7' kind: progressed - updated: '2021-02-20T09:02:18-05:00' + updated: '2021-02-20T14:02:18+00:00' url: /anime/details/hataraku-saibou-2 original: { id: '46999511', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42202', slug: hataraku-saibou-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42202/tiny.jpg?1611329853' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42202/small.jpg?1611329853' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42202/medium.jpg?1611329853' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42202/large.jpg?1611329853' }] }, titles: { alternatives: ['Hataraku Saibou!!'], canonical: 'Hataraku Saibou!!', localized: { en: 'Cells at Work! 2', en_jp: 'Hataraku Saibou!!', ja_jp: はたらく細胞!! } } }, updatedAt: '2021-02-20T14:02:18Z' } - @@ -193,7 +193,7 @@ coverImg: images/anime/42867.webp action: 'Watched episode 6' kind: progressed - updated: '2021-02-19T07:55:58-05:00' + updated: '2021-02-19T12:55:58+00:00' url: /anime/details/dr-stone-two original: { id: '46935503', changedData: { progress: [5, 6], time_spent: [120, 144] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '42867', slug: dr-stone-two, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42867/tiny.jpg?1611329475' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42867/small.jpg?1611329475' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42867/medium.jpg?1611329475' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42867/large.jpg?1611329475' }] }, titles: { alternatives: ['Dr. Stone 2nd Season', 'Dr. Stone Second Season'], canonical: 'Dr. Stone: Stone Wars', localized: { en_jp: 'Dr. Stone: Stone Wars', ja_jp: 'ドクターストーン STONE WARS' } } }, updatedAt: '2021-02-19T12:55:58Z' } - @@ -202,25 +202,25 @@ coverImg: images/anime/1843.webp action: 'Watched episodes 12-13' kind: null - updated: '2021-02-18T12:25:49-05:00' + updated: '2021-02-18T17:25:49+00:00' url: /anime/details/mahou-no-tenshi-creamy-mami - original: [{ empty: false, title: 'Mahou no Tenshi Creamy Mami', coverImg: images/anime/1843.webp, action: 'Watched episode 13', kind: progressed, updated: '2021-02-18T12:25:49-05:00', url: /anime/details/mahou-no-tenshi-creamy-mami, original: { id: '46884733', changedData: { progress: [12, 13], time_spent: [17280, 18720] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '1843', slug: mahou-no-tenshi-creamy-mami, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096' }] }, titles: { alternatives: ['Incantevole Creamy', 'Creamy Mami', 'the Magic Angel'], canonical: 'Mahou no Tenshi Creamy Mami', localized: { en: 'Magical Angel Creamy Mami', en_jp: 'Mahou no Tenshi Creamy Mami', en_us: 'Magical Angel Creamy Mami', ja_jp: '魔法の天使 クリィミーマミ' } } }, updatedAt: '2021-02-18T17:25:49Z' } }, { empty: false, title: 'Mahou no Tenshi Creamy Mami', coverImg: images/anime/1843.webp, action: 'Watched episode 12', kind: progressed, updated: '2021-02-18T08:00:42-05:00', url: /anime/details/mahou-no-tenshi-creamy-mami, original: { id: '46872813', changedData: { progress: [11, 12], time_spent: [15840, 17280] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '1843', slug: mahou-no-tenshi-creamy-mami, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096' }] }, titles: { alternatives: ['Incantevole Creamy', 'Creamy Mami', 'the Magic Angel'], canonical: 'Mahou no Tenshi Creamy Mami', localized: { en: 'Magical Angel Creamy Mami', en_jp: 'Mahou no Tenshi Creamy Mami', en_us: 'Magical Angel Creamy Mami', ja_jp: '魔法の天使 クリィミーマミ' } } }, updatedAt: '2021-02-18T13:00:42Z' } }] + original: [{ empty: false, title: 'Mahou no Tenshi Creamy Mami', coverImg: images/anime/1843.webp, action: 'Watched episode 13', kind: progressed, updated: '2021-02-18T17:25:49+00:00', url: /anime/details/mahou-no-tenshi-creamy-mami, original: { id: '46884733', changedData: { progress: [12, 13], time_spent: [17280, 18720] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '1843', slug: mahou-no-tenshi-creamy-mami, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096' }] }, titles: { alternatives: ['Incantevole Creamy', 'Creamy Mami', 'the Magic Angel'], canonical: 'Mahou no Tenshi Creamy Mami', localized: { en: 'Magical Angel Creamy Mami', en_jp: 'Mahou no Tenshi Creamy Mami', en_us: 'Magical Angel Creamy Mami', ja_jp: '魔法の天使 クリィミーマミ' } } }, updatedAt: '2021-02-18T17:25:49Z' } }, { empty: false, title: 'Mahou no Tenshi Creamy Mami', coverImg: images/anime/1843.webp, action: 'Watched episode 12', kind: progressed, updated: '2021-02-18T13:00:42+00:00', url: /anime/details/mahou-no-tenshi-creamy-mami, original: { id: '46872813', changedData: { progress: [11, 12], time_spent: [15840, 17280] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '1843', slug: mahou-no-tenshi-creamy-mami, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096' }] }, titles: { alternatives: ['Incantevole Creamy', 'Creamy Mami', 'the Magic Angel'], canonical: 'Mahou no Tenshi Creamy Mami', localized: { en: 'Magical Angel Creamy Mami', en_jp: 'Mahou no Tenshi Creamy Mami', en_us: 'Magical Angel Creamy Mami', ja_jp: '魔法の天使 クリィミーマミ' } } }, updatedAt: '2021-02-18T13:00:42Z' } }] - empty: false title: 'Yes! Precure 5' coverImg: images/anime/1742.webp action: 'Watched episodes 20-21' kind: null - updated: '2021-02-17T20:06:18-05:00' + updated: '2021-02-18T01:06:18+00:00' url: /anime/details/yes-precure-5 - original: [{ empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 21', kind: progressed, updated: '2021-02-17T20:06:18-05:00', url: /anime/details/yes-precure-5, original: { id: '46846704', changedData: { progress: [20, 21], time_spent: [1896, 1920] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-18T01:06:18Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 20', kind: progressed, updated: '2021-02-17T19:37:32-05:00', url: /anime/details/yes-precure-5, original: { id: '46845383', changedData: { progress: [19, 20], time_spent: [1872, 1896] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-18T00:37:32Z' } }] + original: [{ empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 21', kind: progressed, updated: '2021-02-18T01:06:18+00:00', url: /anime/details/yes-precure-5, original: { id: '46846704', changedData: { progress: [20, 21], time_spent: [1896, 1920] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-18T01:06:18Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 20', kind: progressed, updated: '2021-02-18T00:37:32+00:00', url: /anime/details/yes-precure-5, original: { id: '46845383', changedData: { progress: [19, 20], time_spent: [1872, 1896] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-18T00:37:32Z' } }] - empty: false title: 'Urasekai Picnic' coverImg: images/anime/43042.webp action: 'Watched episode 7' kind: progressed - updated: '2021-02-17T19:03:44-05:00' + updated: '2021-02-18T00:03:44+00:00' url: /anime/details/urasekai-picnic original: { id: '46844029', changedData: { progress: [6, 7], time_spent: [0, 1380] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '43042', slug: urasekai-picnic, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43042/tiny.jpg?1597691180' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43042/small.jpg?1597691180' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43042/medium.jpg?1597691180' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43042/large.jpg?1597691180' }] }, titles: { alternatives: ['Ura Sekai Picnic'], canonical: 'Urasekai Picnic', localized: { en_jp: 'Urasekai Picnic', en_us: 'Otherside Picnic', ja_jp: 裏世界ピクニック } } }, updatedAt: '2021-02-18T00:03:44Z' } - @@ -229,7 +229,7 @@ coverImg: images/anime/43247.webp action: 'Watched episode 7' kind: progressed - updated: '2021-02-17T13:08:52-05:00' + updated: '2021-02-17T18:08:52+00:00' url: /anime/details/rezero-season-2-part-2 original: { id: '46824973', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43247', slug: rezero-season-2-part-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43247/tiny.jpg?1607955457' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43247/small.jpg?1607955457' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43247/medium.jpg?1607955457' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43247/large.jpg?1607955457' }] }, titles: { alternatives: ['Re:Zero - Starting Life in Another World 2 Part 2', 'Re: Life in a different world from zero 2nd Season Part 2'], canonical: 'Re:Zero kara Hajimeru Isekai Seikatsu 2nd Season Part 2', localized: { en: 'Re:ZERO -Starting Life in Another World- Season 2 Part 2', en_jp: 'Re:Zero kara Hajimeru Isekai Seikatsu 2nd Season Part 2', ja_jp: ゼロから始める異世界生活 } } }, updatedAt: '2021-02-17T18:08:52Z' } - @@ -238,7 +238,7 @@ coverImg: images/anime/43428.webp action: 'Watched episode 6' kind: progressed - updated: '2021-02-17T12:31:50-05:00' + updated: '2021-02-17T17:31:50+00:00' url: /anime/details/world-witches-hasshin-shimasu original: { id: '46823096', changedData: { progress: [5, 6] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43428', slug: world-witches-hasshin-shimasu, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43428/tiny.jpg?1597691212' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43428/small.jpg?1597691212' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43428/medium.jpg?1597691212' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43428/large.jpg?1597691212' }] }, titles: { alternatives: { }, canonical: 'World Witches Hasshin Shimasu!', localized: { en: 'World Witches Take Off!', en_jp: 'World Witches Hasshin Shimasu!', ja_jp: ワールドウィッチーズ発進しますっ! } } }, updatedAt: '2021-02-17T17:31:50Z' } - @@ -247,7 +247,7 @@ coverImg: images/anime/13209.webp action: 'Watched episode 164' kind: progressed - updated: '2021-02-17T08:15:11-05:00' + updated: '2021-02-17T13:15:11+00:00' url: /anime/details/black-clover-tv original: { id: '46811062', changedData: { progress: [163, 164], time_spent: [233040, 234470] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13209', slug: black-clover-tv, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13209/tiny.jpg?1611504643' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13209/small.jpg?1611504643' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13209/medium.jpg?1611504643' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13209/large.jpg?1611504643' }] }, titles: { alternatives: { }, canonical: 'Black Clover', localized: { en: 'Black Clover', en_jp: 'Black Clover', ja_jp: ブラッククローバー } } }, updatedAt: '2021-02-17T13:15:11Z' } - @@ -256,7 +256,7 @@ coverImg: images/anime/42196.webp action: 'Watched episode 6' kind: progressed - updated: '2021-02-17T07:49:21-05:00' + updated: '2021-02-17T12:49:21+00:00' url: /anime/details/tensei-shitara-slime-datta-ken-2 original: { id: '46809985', changedData: { progress: [5, 6] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '42196', slug: tensei-shitara-slime-datta-ken-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42196/tiny.jpg?1597691848' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42196/small.jpg?1597691848' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42196/medium.jpg?1597691848' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42196/large.jpg?1597691848' }] }, titles: { alternatives: ['TenSura 2', 'Tensei Shitara Slime Datta Ken 2nd Season Part 1'], canonical: 'Tensei shitara Slime Datta Ken 2', localized: { en: 'That Time I Got Reincarnated as a Slime 2', en_jp: 'Tensei shitara Slime Datta Ken 2', ja_jp: 転生したらスライムだった件2 } } }, updatedAt: '2021-02-17T12:49:21Z' } - @@ -265,7 +265,7 @@ coverImg: images/anime/1843.webp action: 'Watched episode 11' kind: progressed - updated: '2021-02-16T15:40:55-05:00' + updated: '2021-02-16T20:40:55+00:00' url: /anime/details/mahou-no-tenshi-creamy-mami original: { id: '46770266', changedData: { progress: [10, 11], time_spent: [14400, 15840] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '1843', slug: mahou-no-tenshi-creamy-mami, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096' }] }, titles: { alternatives: ['Incantevole Creamy', 'Creamy Mami', 'the Magic Angel'], canonical: 'Mahou no Tenshi Creamy Mami', localized: { en: 'Magical Angel Creamy Mami', en_jp: 'Mahou no Tenshi Creamy Mami', en_us: 'Magical Angel Creamy Mami', ja_jp: '魔法の天使 クリィミーマミ' } } }, updatedAt: '2021-02-16T20:40:55Z' } - @@ -274,7 +274,7 @@ coverImg: images/anime/43825.webp action: 'Watched episode 6' kind: progressed - updated: '2021-02-16T12:28:40-05:00' + updated: '2021-02-16T17:28:40+00:00' url: /anime/details/shin-chuuka-ichiban-2nd-season original: { id: '46761075', changedData: { progress: [5, 6] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43825', slug: shin-chuuka-ichiban-2nd-season, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43825/tiny.jpg?1609082225' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43825/small.jpg?1609082225' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43825/medium.jpg?1609082225' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43825/large.jpg?1609082225' }] }, titles: { alternatives: ['New Cooking Master Boy!'], canonical: 'Shin Chuuka Ichiban! 2nd Season', localized: { en: 'True Cooking Master Boy Season 2', en_jp: 'Shin Chuuka Ichiban! 2nd Season', ja_jp: 真・中華一番! } } }, updatedAt: '2021-02-16T17:28:40Z' } - @@ -283,7 +283,7 @@ coverImg: images/anime/1742.webp action: 'Watched episode 19' kind: progressed - updated: '2021-02-15T17:49:37-05:00' + updated: '2021-02-15T22:49:37+00:00' url: /anime/details/yes-precure-5 original: { id: '46716267', changedData: { progress: [18, 19], time_spent: [1848, 1872] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-02-15T22:49:37Z' } - @@ -292,7 +292,7 @@ coverImg: images/anime/43167.webp action: 'Watched episode 6' kind: progressed - updated: '2021-01-30T11:09:51-05:00' + updated: '2021-01-30T16:09:51+00:00' url: /anime/details/hataraku-saibou-black-tv original: { id: '45746341', changedData: { progress: [5, 6] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43167', slug: hataraku-saibou-black-tv, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43167/tiny.jpg?1611330065' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43167/small.jpg?1611330065' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43167/medium.jpg?1611330065' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43167/large.jpg?1611330065' }] }, titles: { alternatives: ['Cells at Work! Code Black'], canonical: 'Hataraku Saibou Black (TV)', localized: { en_jp: 'Hataraku Saibou Black (TV)', ja_jp: はたらく細胞BLACK } } }, updatedAt: '2021-01-30T16:09:51Z' } - @@ -301,7 +301,7 @@ coverImg: images/anime/42202.webp action: 'Watched episode 4' kind: progressed - updated: '2021-01-30T10:40:47-05:00' + updated: '2021-01-30T15:40:47+00:00' url: /anime/details/hataraku-saibou-2 original: { id: '45745352', changedData: { progress: [3, 4] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42202', slug: hataraku-saibou-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42202/tiny.jpg?1611329853' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42202/small.jpg?1611329853' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42202/medium.jpg?1611329853' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42202/large.jpg?1611329853' }] }, titles: { alternatives: ['Hataraku Saibou!!'], canonical: 'Hataraku Saibou!!', localized: { en: 'Cells at Work! 2', en_jp: 'Hataraku Saibou!!', ja_jp: はたらく細胞!! } } }, updatedAt: '2021-01-30T15:40:47Z' } - @@ -310,7 +310,7 @@ coverImg: images/anime/1742.webp action: 'Watched episode 9' kind: progressed - updated: '2021-01-29T13:26:49-05:00' + updated: '2021-01-29T18:26:49+00:00' url: /anime/details/yes-precure-5 original: { id: '45691191', changedData: { progress: [8, 9], time_spent: [1608, 1632] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-29T18:26:49Z' } - @@ -319,16 +319,16 @@ coverImg: images/anime/1843.webp action: 'Watched episodes 1-2' kind: null - updated: '2021-01-28T12:57:44-05:00' + updated: '2021-01-28T17:57:44+00:00' url: /anime/details/mahou-no-tenshi-creamy-mami - original: [{ empty: false, title: 'Mahou no Tenshi Creamy Mami', coverImg: images/anime/1843.webp, action: 'Watched episode 2', kind: progressed, updated: '2021-01-28T12:57:44-05:00', url: /anime/details/mahou-no-tenshi-creamy-mami, original: { id: '45636802', changedData: { progress: [1, 2], time_spent: [1440, 2880] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '1843', slug: mahou-no-tenshi-creamy-mami, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096' }] }, titles: { alternatives: ['Incantevole Creamy', 'Creamy Mami', 'the Magic Angel'], canonical: 'Mahou no Tenshi Creamy Mami', localized: { en: 'Magical Angel Creamy Mami', en_jp: 'Mahou no Tenshi Creamy Mami', en_us: 'Magical Angel Creamy Mami', ja_jp: '魔法の天使 クリィミーマミ' } } }, updatedAt: '2021-01-28T17:57:44Z' } }, { empty: false, title: 'Mahou no Tenshi Creamy Mami', coverImg: images/anime/1843.webp, action: 'Watched episode 1', kind: progressed, updated: '2021-01-28T08:19:49-05:00', url: /anime/details/mahou-no-tenshi-creamy-mami, original: { id: '45626831', changedData: { progress: [0, 1], time_spent: [0, 1440] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '1843', slug: mahou-no-tenshi-creamy-mami, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096' }] }, titles: { alternatives: ['Incantevole Creamy', 'Creamy Mami', 'the Magic Angel'], canonical: 'Mahou no Tenshi Creamy Mami', localized: { en: 'Magical Angel Creamy Mami', en_jp: 'Mahou no Tenshi Creamy Mami', en_us: 'Magical Angel Creamy Mami', ja_jp: '魔法の天使 クリィミーマミ' } } }, updatedAt: '2021-01-28T13:19:49Z' } }] + original: [{ empty: false, title: 'Mahou no Tenshi Creamy Mami', coverImg: images/anime/1843.webp, action: 'Watched episode 2', kind: progressed, updated: '2021-01-28T17:57:44+00:00', url: /anime/details/mahou-no-tenshi-creamy-mami, original: { id: '45636802', changedData: { progress: [1, 2], time_spent: [1440, 2880] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '1843', slug: mahou-no-tenshi-creamy-mami, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096' }] }, titles: { alternatives: ['Incantevole Creamy', 'Creamy Mami', 'the Magic Angel'], canonical: 'Mahou no Tenshi Creamy Mami', localized: { en: 'Magical Angel Creamy Mami', en_jp: 'Mahou no Tenshi Creamy Mami', en_us: 'Magical Angel Creamy Mami', ja_jp: '魔法の天使 クリィミーマミ' } } }, updatedAt: '2021-01-28T17:57:44Z' } }, { empty: false, title: 'Mahou no Tenshi Creamy Mami', coverImg: images/anime/1843.webp, action: 'Watched episode 1', kind: progressed, updated: '2021-01-28T13:19:49+00:00', url: /anime/details/mahou-no-tenshi-creamy-mami, original: { id: '45626831', changedData: { progress: [0, 1], time_spent: [0, 1440] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '1843', slug: mahou-no-tenshi-creamy-mami, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1843/tiny.jpg?1597698096' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1843/small.jpg?1597698096' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1843/medium.jpg?1597698096' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1843/large.jpg?1597698096' }] }, titles: { alternatives: ['Incantevole Creamy', 'Creamy Mami', 'the Magic Angel'], canonical: 'Mahou no Tenshi Creamy Mami', localized: { en: 'Magical Angel Creamy Mami', en_jp: 'Mahou no Tenshi Creamy Mami', en_us: 'Magical Angel Creamy Mami', ja_jp: '魔法の天使 クリィミーマミ' } } }, updatedAt: '2021-01-28T13:19:49Z' } }] - empty: false title: 'Urasekai Picnic' coverImg: images/anime/43042.webp action: 'Watched episode 4' kind: progressed - updated: '2021-01-28T07:49:24-05:00' + updated: '2021-01-28T12:49:24+00:00' url: /anime/details/urasekai-picnic original: { id: '45625945', changedData: { progress: [3, 4] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '43042', slug: urasekai-picnic, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43042/tiny.jpg?1597691180' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43042/small.jpg?1597691180' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43042/medium.jpg?1597691180' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43042/large.jpg?1597691180' }] }, titles: { alternatives: ['Ura Sekai Picnic'], canonical: 'Urasekai Picnic', localized: { en_jp: 'Urasekai Picnic', en_us: 'Otherside Picnic', ja_jp: 裏世界ピクニック } } }, updatedAt: '2021-01-28T12:49:24Z' } - @@ -337,7 +337,7 @@ coverImg: images/anime/42196.webp action: 'Watched episode 3' kind: progressed - updated: '2021-01-27T13:06:29-05:00' + updated: '2021-01-27T18:06:29+00:00' url: /anime/details/tensei-shitara-slime-datta-ken-2 original: { id: '45585487', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '42196', slug: tensei-shitara-slime-datta-ken-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42196/tiny.jpg?1597691848' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42196/small.jpg?1597691848' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42196/medium.jpg?1597691848' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42196/large.jpg?1597691848' }] }, titles: { alternatives: ['TenSura 2', 'Tensei Shitara Slime Datta Ken 2nd Season Part 1'], canonical: 'Tensei shitara Slime Datta Ken 2', localized: { en: 'That Time I Got Reincarnated as a Slime 2', en_jp: 'Tensei shitara Slime Datta Ken 2', ja_jp: 転生したらスライムだった件2 } } }, updatedAt: '2021-01-27T18:06:29Z' } - @@ -346,7 +346,7 @@ coverImg: images/anime/1742.webp action: 'Watched episode 8' kind: progressed - updated: '2021-01-27T07:54:31-05:00' + updated: '2021-01-27T12:54:31+00:00' url: /anime/details/yes-precure-5 original: { id: '45572019', changedData: { progress: [7, 8], time_spent: [1584, 1608] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-27T12:54:31Z' } - @@ -355,7 +355,7 @@ coverImg: images/anime/13209.webp action: 'Watched episode 161' kind: progressed - updated: '2021-01-27T07:24:48-05:00' + updated: '2021-01-27T12:24:48+00:00' url: /anime/details/black-clover-tv original: { id: '45571028', changedData: { progress: [160, 161], time_spent: [228750, 230180] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13209', slug: black-clover-tv, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13209/tiny.jpg?1611504643' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13209/small.jpg?1611504643' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13209/medium.jpg?1611504643' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13209/large.jpg?1611504643' }] }, titles: { alternatives: { }, canonical: 'Black Clover', localized: { en: 'Black Clover', en_jp: 'Black Clover', ja_jp: ブラッククローバー } } }, updatedAt: '2021-01-27T12:24:48Z' } - @@ -364,7 +364,7 @@ coverImg: images/anime/43428.webp action: 'Watched episode 3' kind: progressed - updated: '2021-01-26T13:01:38-05:00' + updated: '2021-01-26T18:01:38+00:00' url: /anime/details/world-witches-hasshin-shimasu original: { id: '45529665', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43428', slug: world-witches-hasshin-shimasu, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43428/tiny.jpg?1597691212' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43428/small.jpg?1597691212' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43428/medium.jpg?1597691212' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43428/large.jpg?1597691212' }] }, titles: { alternatives: { }, canonical: 'World Witches Hasshin Shimasu!', localized: { en: 'World Witches Take Off!', en_jp: 'World Witches Hasshin Shimasu!', ja_jp: ワールドウィッチーズ発進しますっ! } } }, updatedAt: '2021-01-26T18:01:38Z' } - @@ -373,7 +373,7 @@ coverImg: images/anime/43825.webp action: 'Watched episode 3' kind: progressed - updated: '2021-01-26T12:49:04-05:00' + updated: '2021-01-26T17:49:04+00:00' url: /anime/details/shin-chuuka-ichiban-2nd-season original: { id: '45529168', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43825', slug: shin-chuuka-ichiban-2nd-season, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43825/tiny.jpg?1609082225' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43825/small.jpg?1609082225' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43825/medium.jpg?1609082225' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43825/large.jpg?1609082225' }] }, titles: { alternatives: ['New Cooking Master Boy!'], canonical: 'Shin Chuuka Ichiban! 2nd Season', localized: { en: 'True Cooking Master Boy Season 2', en_jp: 'Shin Chuuka Ichiban! 2nd Season', ja_jp: 真・中華一番! } } }, updatedAt: '2021-01-26T17:49:04Z' } - @@ -382,7 +382,7 @@ coverImg: images/anime/42635.webp action: 'Watched episode 4' kind: progressed - updated: '2021-01-25T12:56:13-05:00' + updated: '2021-01-25T17:56:13+00:00' url: /anime/details/tatoeba-last-dungeon-mae-no-mura-no-shounen-ga-joban-no-machi-de-kurasu-youna-monogatari original: { id: '45471756', changedData: { progress: [3, 4] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42635', slug: tatoeba-last-dungeon-mae-no-mura-no-shounen-ga-joban-no-machi-de-kurasu-youna-monogatari, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42635/tiny.jpg?1571504181' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42635/small.jpg?1571504181' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42635/medium.jpg?1571504181' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42635/large.jpg?1571504181' }] }, titles: { alternatives: ['Suppose a Kid from the Last Dungeon Boonies Moved to a Starter Town'], canonical: 'Tatoeba Last Dungeon Mae no Mura no Shounen ga Joban no Machi de Kurasu Youna Monogatari', localized: { en_jp: 'Tatoeba Last Dungeon Mae no Mura no Shounen ga Joban no Machi de Kurasu Youna Monogatari', ja_jp: たとえばラストダンジョン前の村の少年が序盤の街で暮らすような物語 } } }, updatedAt: '2021-01-25T17:56:13Z' } - @@ -391,7 +391,7 @@ coverImg: images/anime/42650.webp action: 'Watched episode 41' kind: progressed - updated: '2021-01-25T12:29:55-05:00' + updated: '2021-01-25T17:29:55+00:00' url: /anime/details/healin-good-precure original: { id: '45470609', changedData: { progress: [40, 41], time_spent: [57600, 59040] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42650', slug: healin-good-precure, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42650/tiny.jpg?1578070083' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42650/small.jpg?1578070083' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42650/medium.jpg?1578070083' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42650/large.jpg?1578070083' }] }, titles: { alternatives: { }, canonical: 'Healin'' Good♡Precure', localized: { en: 'Healin'' Good Pretty Cure', en_jp: 'Healin'' Good♡Precure', ja_jp: ヒーリングっど♡プリキュア } } }, updatedAt: '2021-01-25T17:29:55Z' } - @@ -400,7 +400,7 @@ coverImg: images/anime/43818.webp action: 'Watched episode 3' kind: progressed - updated: '2021-01-25T12:05:16-05:00' + updated: '2021-01-25T17:05:16+00:00' url: /anime/details/kai-byoui-ramune original: { id: '45469463', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '43818', slug: kai-byoui-ramune, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43818/tiny.jpg?1608544506' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43818/small.jpg?1608544506' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43818/medium.jpg?1608544506' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43818/large.jpg?1608544506' }] }, titles: { alternatives: { }, canonical: 'Kai Byoui Ramune', localized: { en: 'Dr. Ramune -Mysterious Disease Specialist-', en_jp: 'Kai Byoui Ramune', ja_jp: 怪病医ラムネ } } }, updatedAt: '2021-01-25T17:05:16Z' } - @@ -409,7 +409,7 @@ coverImg: images/anime/1742.webp action: 'Watched episode 7' kind: progressed - updated: '2021-01-24T20:16:10-05:00' + updated: '2021-01-25T01:16:10+00:00' url: /anime/details/yes-precure-5 original: { id: '45433091', changedData: { progress: [6, 7], time_spent: [1560, 1584] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-25T01:16:10Z' } - @@ -418,7 +418,7 @@ coverImg: images/anime/42323.webp action: 'Watched episode 3' kind: progressed - updated: '2021-01-24T19:52:32-05:00' + updated: '2021-01-25T00:52:32+00:00' url: /anime/details/mushoku-tensei-isekai-ittara-honki-dasu original: { id: '45431671', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: 'The pervert aspect of this dampens my enjoyment. ' }, media: { __typename: Anime, id: '42323', slug: mushoku-tensei-isekai-ittara-honki-dasu, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42323/tiny.jpg?1571408000' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42323/small.jpg?1571408000' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42323/medium.jpg?1571408000' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42323/large.jpg?1571408000' }] }, titles: { alternatives: { }, canonical: 'Mushoku Tensei: Isekai Ittara Honki Dasu', localized: { en: 'Mushoku Tensei: Jobless Reincarnation', en_jp: 'Mushoku Tensei: Isekai Ittara Honki Dasu', ja_jp: '無職転生 ~異世界行ったら本気だす~' } } }, updatedAt: '2021-01-25T00:52:32Z' } - @@ -427,7 +427,7 @@ coverImg: images/anime/43545.webp action: 'Watched episode 3' kind: progressed - updated: '2021-01-24T19:26:33-05:00' + updated: '2021-01-25T00:26:33+00:00' url: /anime/details/horimiya original: { id: '45430382', changedData: { progress: [2, 3], time_spent: [0, 1380] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43545', slug: horimiya, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43545/tiny.jpg?1609224996' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43545/small.jpg?1609224996' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43545/medium.jpg?1609224996' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43545/large.jpg?1609224996' }] }, titles: { alternatives: { }, canonical: Horimiya, localized: { en_jp: Horimiya, ja_jp: ホリミヤ } } }, updatedAt: '2021-01-25T00:26:33Z' } - @@ -436,16 +436,16 @@ coverImg: images/anime/1742.webp action: 'Marathoned episodes 1-6' kind: null - updated: '2021-01-23T19:18:29-05:00' + updated: '2021-01-24T00:18:29+00:00' url: /anime/details/yes-precure-5 - original: [{ empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 6', kind: progressed, updated: '2021-01-23T19:18:29-05:00', url: /anime/details/yes-precure-5, original: { id: '45370466', changedData: { progress: [5, 6], time_spent: [1536, 1560] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-24T00:18:29Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 5', kind: progressed, updated: '2021-01-23T18:53:47-05:00', url: /anime/details/yes-precure-5, original: { id: '45369278', changedData: { progress: [4, 5], time_spent: [1512, 1536] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T23:53:47Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 4', kind: progressed, updated: '2021-01-23T18:29:37-05:00', url: /anime/details/yes-precure-5, original: { id: '45368222', changedData: { progress: [3, 4], time_spent: [1488, 1512] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T23:29:37Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 3', kind: progressed, updated: '2021-01-23T17:48:17-05:00', url: /anime/details/yes-precure-5, original: { id: '45366144', changedData: { progress: [2, 3], time_spent: [1464, 1488] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T22:48:17Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 2', kind: progressed, updated: '2021-01-23T17:25:36-05:00', url: /anime/details/yes-precure-5, original: { id: '45364651', changedData: { progress: [1, 2], time_spent: [1440, 1464] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T22:25:36Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 1', kind: progressed, updated: '2021-01-23T16:56:50-05:00', url: /anime/details/yes-precure-5, original: { id: '45363270', changedData: { progress: [0, 1], time_spent: [0, 1440] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T21:56:50Z' } }] + original: [{ empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 6', kind: progressed, updated: '2021-01-24T00:18:29+00:00', url: /anime/details/yes-precure-5, original: { id: '45370466', changedData: { progress: [5, 6], time_spent: [1536, 1560] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-24T00:18:29Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 5', kind: progressed, updated: '2021-01-23T23:53:47+00:00', url: /anime/details/yes-precure-5, original: { id: '45369278', changedData: { progress: [4, 5], time_spent: [1512, 1536] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T23:53:47Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 4', kind: progressed, updated: '2021-01-23T23:29:37+00:00', url: /anime/details/yes-precure-5, original: { id: '45368222', changedData: { progress: [3, 4], time_spent: [1488, 1512] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T23:29:37Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 3', kind: progressed, updated: '2021-01-23T22:48:17+00:00', url: /anime/details/yes-precure-5, original: { id: '45366144', changedData: { progress: [2, 3], time_spent: [1464, 1488] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T22:48:17Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 2', kind: progressed, updated: '2021-01-23T22:25:36+00:00', url: /anime/details/yes-precure-5, original: { id: '45364651', changedData: { progress: [1, 2], time_spent: [1440, 1464] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T22:25:36Z' } }, { empty: false, title: 'Yes! Precure 5', coverImg: images/anime/1742.webp, action: 'Watched episode 1', kind: progressed, updated: '2021-01-23T21:56:50+00:00', url: /anime/details/yes-precure-5, original: { id: '45363270', changedData: { progress: [0, 1], time_spent: [0, 1440] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T21:56:50Z' } }] - empty: false title: 'Yes! Precure 5' coverImg: images/anime/1742.webp action: 'Currently Watching' kind: updated - updated: '2021-01-23T16:32:39-05:00' + updated: '2021-01-23T21:32:39+00:00' url: /anime/details/yes-precure-5 original: { id: '45361701', changedData: { status: [planned] }, kind: UPDATED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1742', slug: yes-precure-5, posterImage: { views: [{ width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/tiny.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/small.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/medium.jpg?1408444815' }, { width: null, height: null, url: 'https://media.kitsu.io/anime/poster_images/1742/large.jpg?1408444815' }] }, titles: { alternatives: { }, canonical: 'Yes! Precure 5', localized: { en: 'Yes! Pretty Cure 5', en_jp: 'Yes! Precure 5', en_us: 'Yes! Pretty Cure 5', ja_jp: 'Yes! プリキュア5' } } }, updatedAt: '2021-01-23T21:32:39Z' } - @@ -454,7 +454,7 @@ coverImg: images/anime/1375.webp action: Completed kind: updated - updated: '2021-01-23T16:20:56-05:00' + updated: '2021-01-23T21:20:56+00:00' url: /anime/details/futari-wa-precure-splash-star original: { id: '45361017', changedData: { status: [current] }, kind: UPDATED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T21:20:56Z' } - @@ -463,16 +463,16 @@ coverImg: images/anime/1375.webp action: 'Marathoned episodes 45-49' kind: null - updated: '2021-01-23T16:20:56-05:00' + updated: '2021-01-23T21:20:56+00:00' url: /anime/details/futari-wa-precure-splash-star - original: [{ empty: false, title: 'Futari wa Precure: Splash☆Star', coverImg: images/anime/1375.webp, action: 'Watched episode 49', kind: progressed, updated: '2021-01-23T16:20:56-05:00', url: /anime/details/futari-wa-precure-splash-star, original: { id: '45361016', changedData: { progress: [48, 49], time_spent: [2568, 2592] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T21:20:56Z' } }, { empty: false, title: 'Futari wa Precure: Splash☆Star', coverImg: images/anime/1375.webp, action: 'Watched episode 48', kind: progressed, updated: '2021-01-23T16:00:16-05:00', url: /anime/details/futari-wa-precure-splash-star, original: { id: '45359950', changedData: { progress: [47, 48], time_spent: [2544, 2568] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T21:00:16Z' } }, { empty: false, title: 'Futari wa Precure: Splash☆Star', coverImg: images/anime/1375.webp, action: 'Watched episode 47', kind: progressed, updated: '2021-01-23T15:35:56-05:00', url: /anime/details/futari-wa-precure-splash-star, original: { id: '45358544', changedData: { progress: [46, 47], time_spent: [2520, 2544] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T20:35:56Z' } }, { empty: false, title: 'Futari wa Precure: Splash☆Star', coverImg: images/anime/1375.webp, action: 'Watched episode 46', kind: progressed, updated: '2021-01-23T13:36:34-05:00', url: /anime/details/futari-wa-precure-splash-star, original: { id: '45352462', changedData: { progress: [45, 46], time_spent: [2496, 2520] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T18:36:34Z' } }, { empty: false, title: 'Futari wa Precure: Splash☆Star', coverImg: images/anime/1375.webp, action: 'Watched episode 45', kind: progressed, updated: '2021-01-23T13:10:06-05:00', url: /anime/details/futari-wa-precure-splash-star, original: { id: '45351234', changedData: { progress: [44, 45], time_spent: [2472, 2496] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T18:10:06Z' } }] + original: [{ empty: false, title: 'Futari wa Precure: Splash☆Star', coverImg: images/anime/1375.webp, action: 'Watched episode 49', kind: progressed, updated: '2021-01-23T21:20:56+00:00', url: /anime/details/futari-wa-precure-splash-star, original: { id: '45361016', changedData: { progress: [48, 49], time_spent: [2568, 2592] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T21:20:56Z' } }, { empty: false, title: 'Futari wa Precure: Splash☆Star', coverImg: images/anime/1375.webp, action: 'Watched episode 48', kind: progressed, updated: '2021-01-23T21:00:16+00:00', url: /anime/details/futari-wa-precure-splash-star, original: { id: '45359950', changedData: { progress: [47, 48], time_spent: [2544, 2568] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T21:00:16Z' } }, { empty: false, title: 'Futari wa Precure: Splash☆Star', coverImg: images/anime/1375.webp, action: 'Watched episode 47', kind: progressed, updated: '2021-01-23T20:35:56+00:00', url: /anime/details/futari-wa-precure-splash-star, original: { id: '45358544', changedData: { progress: [46, 47], time_spent: [2520, 2544] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T20:35:56Z' } }, { empty: false, title: 'Futari wa Precure: Splash☆Star', coverImg: images/anime/1375.webp, action: 'Watched episode 46', kind: progressed, updated: '2021-01-23T18:36:34+00:00', url: /anime/details/futari-wa-precure-splash-star, original: { id: '45352462', changedData: { progress: [45, 46], time_spent: [2496, 2520] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T18:36:34Z' } }, { empty: false, title: 'Futari wa Precure: Splash☆Star', coverImg: images/anime/1375.webp, action: 'Watched episode 45', kind: progressed, updated: '2021-01-23T18:10:06+00:00', url: /anime/details/futari-wa-precure-splash-star, original: { id: '45351234', changedData: { progress: [44, 45], time_spent: [2472, 2496] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '1375', slug: futari-wa-precure-splash-star, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/1375/tiny.jpg?1603408165' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/1375/small.jpg?1603408165' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/1375/medium.jpg?1603408165' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/1375/large.jpg?1603408165' }] }, titles: { alternatives: { }, canonical: 'Futari wa Precure: Splash☆Star', localized: { en: 'Pretty Cure: Splash Star', en_jp: 'Futari wa Precure: Splash☆Star', en_us: 'Pretty Cure: Splash Star', ja_jp: 'ふたりはプリキュア Splash☆Star' } } }, updatedAt: '2021-01-23T18:10:06Z' } }] - empty: false title: 'Hanyou no Yashahime: Sengoku Otogizoushi' coverImg: images/anime/43180.webp action: 'Watched episode 16' kind: progressed - updated: '2021-01-23T12:40:53-05:00' + updated: '2021-01-23T17:40:53+00:00' url: /anime/details/hanyou-no-yasha-hime original: { id: '45350120', changedData: { progress: [15, 16] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: 'InuYasha universe, mostly a different cast.' }, media: { __typename: Anime, id: '43180', slug: hanyou-no-yasha-hime, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43180/tiny.jpg?1589037137' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43180/small.jpg?1589037137' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43180/medium.jpg?1589037137' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43180/large.jpg?1589037137' }] }, titles: { alternatives: ['Inuyasha: Hanyou no Yasha Hime'], canonical: 'Hanyou no Yashahime: Sengoku Otogizoushi', localized: { en: 'Yashahime: Princess Half-Demon', en_jp: 'Hanyou no Yashahime: Sengoku Otogizoushi', ja_jp: 半妖の夜叉姫 } } }, updatedAt: '2021-01-23T17:40:53Z' } - @@ -481,7 +481,7 @@ coverImg: images/anime/43301.webp action: 'Watched episode 3' kind: progressed - updated: '2021-01-23T12:07:59-05:00' + updated: '2021-01-23T17:07:59+00:00' url: /anime/details/ore-dake-haireru-kakushi-dungeon original: { id: '45348842', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43301', slug: ore-dake-haireru-kakushi-dungeon, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43301/tiny.jpg?1607696005' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43301/small.jpg?1607696005' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43301/medium.jpg?1607696005' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43301/large.jpg?1607696005' }] }, titles: { alternatives: ['Special training in the Secret Dungeon', 'Ore Dake Haireru Kakushi Dungeon: Kossori Kitaete Sekai Saikyou'], canonical: 'Ore dake Haireru Kakushi Dungeon', localized: { en: 'The Hidden Dungeon Only I Can Enter', en_jp: 'Ore dake Haireru Kakushi Dungeon', ja_jp: 俺だけ入れる隠しダンジョン } } }, updatedAt: '2021-01-23T17:07:59Z' } - @@ -490,7 +490,7 @@ coverImg: images/anime/43569.webp action: 'Watched episode 4' kind: progressed - updated: '2021-01-23T11:36:34-05:00' + updated: '2021-01-23T16:36:34+00:00' url: /anime/details/otona-no-bouguya-san-2nd-season original: { id: '45347598', changedData: { progress: [3, 4] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43569', slug: otona-no-bouguya-san-2nd-season, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43569/tiny.jpg?1601057792' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43569/small.jpg?1601057792' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43569/medium.jpg?1601057792' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43569/large.jpg?1601057792' }] }, titles: { alternatives: { }, canonical: 'Otona no Bouguya-san 2nd Season', localized: { en: 'Armor Shop for Ladies & Gentlemen 2nd Season', en_jp: 'Otona no Bouguya-san 2nd Season', ja_jp: 'おとなの防具屋さん 第2シリーズ' } } }, updatedAt: '2021-01-23T16:36:34Z' } - @@ -499,7 +499,7 @@ coverImg: images/anime/43550.webp action: 'Watched episode 15' kind: progressed - updated: '2021-01-23T11:36:07-05:00' + updated: '2021-01-23T16:36:07+00:00' url: /anime/details/inu-to-neko-docchi-mo-katteru-to-mainichi-tanoshii original: { id: '45347581', changedData: { progress: [14, 15], time_spent: [120, 180] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43550', slug: inu-to-neko-docchi-mo-katteru-to-mainichi-tanoshii, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43550/tiny.jpg?1600679941' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43550/small.jpg?1600679941' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43550/medium.jpg?1600679941' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43550/large.jpg?1600679941' }] }, titles: { alternatives: { }, canonical: 'Inu to Neko Docchi mo Katteru to Mainichi Tanoshii', localized: { en: 'With a Dog and a Cat, Every Day is Fun', en_jp: 'Inu to Neko Docchi mo Katteru to Mainichi Tanoshii', ja_jp: 犬と猫どっちも飼ってると毎日たのしい } } }, updatedAt: '2021-01-23T16:36:07Z' } - @@ -508,7 +508,7 @@ coverImg: images/anime/41463.webp action: 'Watched episode 3' kind: progressed - updated: '2021-01-23T11:18:43-05:00' + updated: '2021-01-23T16:18:43+00:00' url: /anime/details/kumo-desu-ga-nani-ka original: { id: '45346956', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '41463', slug: kumo-desu-ga-nani-ka, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/41463/tiny.jpg?1593607925' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/41463/small.jpg?1593607925' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/41463/medium.jpg?1593607925' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/41463/large.jpg?1593607925' }] }, titles: { alternatives: { }, canonical: 'Kumo desu ga, Nani ka?', localized: { en: 'So I''m a Spider, So What?', en_jp: 'Kumo desu ga, Nani ka?', ja_jp: 蜘蛛ですが、なにか? } } }, updatedAt: '2021-01-23T16:18:43Z' } - @@ -517,7 +517,7 @@ coverImg: images/anime/42324.webp action: 'Watched episode 3' kind: progressed - updated: '2021-01-23T10:57:01-05:00' + updated: '2021-01-23T15:57:01+00:00' url: /anime/details/5-toubun-no-hanayome-2 original: { id: '45346222', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '42324', slug: 5-toubun-no-hanayome-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42324/tiny.jpg?1597697087' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42324/small.jpg?1597697087' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42324/medium.jpg?1597697087' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42324/large.jpg?1597697087' }] }, titles: { alternatives: ['Gotoubun no Hanayome 2', 'The Five Wedded Brides 2', '5-Toubun no Hanayome 2'], canonical: '5-toubun no Hanayome ∬', localized: { en: 'The Quintessential Quintuplets 2', en_jp: '5-toubun no Hanayome ∬', ja_jp: 五等分の花嫁∬ } } }, updatedAt: '2021-01-23T15:57:01Z' } - @@ -526,7 +526,7 @@ coverImg: images/anime/43137.webp action: 'Watched episode 3' kind: progressed - updated: '2021-01-23T09:28:05-05:00' + updated: '2021-01-23T14:28:05+00:00' url: /anime/details/tenchi-souzou-design-bu original: { id: '45343004', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '43137', slug: tenchi-souzou-design-bu, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/43137/tiny.jpg?1611330634' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/43137/small.jpg?1611330634' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/43137/medium.jpg?1611330634' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/43137/large.jpg?1611330634' }] }, titles: { alternatives: ['[Ten-De-Bu] What a strange animal!', Tendebu], canonical: 'Tenchi Souzou Design-bu', localized: { en: 'Heaven''s Design Team', en_jp: 'Tenchi Souzou Design-bu', ja_jp: 天地創造デザイン部 } } }, updatedAt: '2021-01-23T14:28:05Z' } - @@ -535,7 +535,7 @@ coverImg: images/anime/41976.webp action: 'Watched episode 3' kind: progressed - updated: '2021-01-23T09:04:48-05:00' + updated: '2021-01-23T14:04:48+00:00' url: /anime/details/yuru-camp-2 original: { id: '45342210', changedData: { progress: [2, 3] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '41976', slug: yuru-camp-2, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/41976/tiny.jpg?1611329947' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/41976/small.jpg?1611329947' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/41976/medium.jpg?1611329947' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/41976/large.jpg?1611329947' }] }, titles: { alternatives: { }, canonical: 'Yuru Camp△ 2', localized: { en: 'Laid-Back Camp 2', en_jp: 'Yuru Camp△ 2', ja_jp: 'ゆるキャン△ 2' } } }, updatedAt: '2021-01-23T14:04:48Z' } - @@ -544,7 +544,7 @@ coverImg: images/anime/42867.webp action: 'Watched episode 2' kind: progressed - updated: '2021-01-23T08:27:39-05:00' + updated: '2021-01-23T13:27:39+00:00' url: /anime/details/dr-stone-two original: { id: '45341107', changedData: { progress: [1, 2], time_spent: [24, 48] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: null }, media: { __typename: Anime, id: '42867', slug: dr-stone-two, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/42867/tiny.jpg?1611329475' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/42867/small.jpg?1611329475' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/42867/medium.jpg?1611329475' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/42867/large.jpg?1611329475' }] }, titles: { alternatives: ['Dr. Stone 2nd Season', 'Dr. Stone Second Season'], canonical: 'Dr. Stone: Stone Wars', localized: { en_jp: 'Dr. Stone: Stone Wars', ja_jp: 'ドクターストーン STONE WARS' } } }, updatedAt: '2021-01-23T13:27:39Z' } - @@ -553,7 +553,7 @@ coverImg: images/anime/13265.webp action: 'Watched episode 7' kind: progressed - updated: '2018-02-24T10:05:35-05:00' + updated: '2018-02-24T15:05:35+00:00' url: /anime/details/gakuen-babysitters original: { id: '5096548', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13265', slug: gakuen-babysitters, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13265/tiny.jpg?1597692098' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13265/small.jpg?1597692098' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13265/medium.jpg?1597692098' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13265/large.jpg?1597692098' }] }, titles: { alternatives: { }, canonical: 'Gakuen Babysitters', localized: { en: 'School Babysitters', en_jp: 'Gakuen Babysitters', en_us: 'School Babysitters', ja_jp: 学園ベビーシッターズ } } }, updatedAt: '2018-02-24T15:05:35Z' } - @@ -562,7 +562,7 @@ coverImg: images/anime/13661.webp action: 'Watched episode 7' kind: progressed - updated: '2018-02-24T10:31:29-05:00' + updated: '2018-02-24T15:31:29+00:00' url: /anime/details/ryuuou-no-oshigoto original: { id: '5096816', changedData: { progress: [6, 7] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13661', slug: ryuuou-no-oshigoto, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13661/tiny.jpg?1597698518' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13661/small.jpg?1597698518' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13661/medium.jpg?1597698518' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13661/large.jpg?1597698518' }] }, titles: { alternatives: ['Ryuoh no Oshigoto'], canonical: 'Ryuuou no Oshigoto!', localized: { en: 'The Ryuo’s Work is Never Done!', en_jp: 'Ryuuou no Oshigoto!', en_us: 'The Ryuo''s Work is Never Done!', ja_jp: りゅうおうのおしごと! } } }, updatedAt: '2018-02-24T15:31:29Z' } - @@ -571,7 +571,7 @@ coverImg: images/anime/13635.webp action: 'Watched episode 7' kind: progressed - updated: '2018-02-24T10:54:16-05:00' + updated: '2018-02-24T15:54:16+00:00' url: /anime/details/karakai-jouzu-no-takagi-san original: { id: '5096938', changedData: { progress: [6, 7], time_spent: [384, 408] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13635', slug: karakai-jouzu-no-takagi-san, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13635/tiny.jpg?1597691135' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13635/small.jpg?1597691135' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13635/medium.jpg?1597691135' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13635/large.jpg?1597691135' }] }, titles: { alternatives: ['Skilled Teaser Takagi-san'], canonical: 'Karakai Jouzu no Takagi-san', localized: { en: 'Teasing Master Takagi-san', en_jp: 'Karakai Jouzu no Takagi-san', ja_jp: からかい上手の高木さん } } }, updatedAt: '2018-02-24T15:54:16Z' } - @@ -580,7 +580,7 @@ coverImg: images/anime/14152.webp action: 'Watched episode 7' kind: progressed - updated: '2018-02-24T10:56:09-05:00' + updated: '2018-02-24T15:56:09+00:00' url: /anime/details/kaijuu-girls-ultra-kaijuu-gijinka-keikaku-2nd-season original: { id: '5096963', changedData: { progress: [6, 7], time_spent: [35, 40] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '14152', slug: kaijuu-girls-ultra-kaijuu-gijinka-keikaku-2nd-season, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/14152/tiny.jpg?1597691494' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/14152/small.jpg?1597691494' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/14152/medium.jpg?1597691494' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/14152/large.jpg?1597691494' }] }, titles: { alternatives: { }, canonical: 'Kaijuu Girls: Ultra Kaijuu Gijinka Keikaku 2nd Season', localized: { en_jp: 'Kaijuu Girls: Ultra Kaijuu Gijinka Keikaku 2nd Season', ja_jp: '怪獣娘~ウルトラ怪獣擬人化計画~ 第2期' } } }, updatedAt: '2018-02-24T15:56:09Z' } - @@ -589,7 +589,7 @@ coverImg: images/anime/13209.webp action: 'Watched episode 20' kind: progressed - updated: '2018-02-24T11:36:16-05:00' + updated: '2018-02-24T16:36:16+00:00' url: /anime/details/black-clover-tv original: { id: '5097284', changedData: { progress: [19, 20], time_spent: [1344, 1368] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13209', slug: black-clover-tv, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13209/tiny.jpg?1611504643' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13209/small.jpg?1611504643' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13209/medium.jpg?1611504643' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13209/large.jpg?1611504643' }] }, titles: { alternatives: { }, canonical: 'Black Clover', localized: { en: 'Black Clover', en_jp: 'Black Clover', ja_jp: ブラッククローバー } } }, updatedAt: '2018-02-24T16:36:16Z' } - @@ -598,7 +598,7 @@ coverImg: images/anime/13615.webp action: 'Watched episode 8' kind: progressed - updated: '2018-02-24T12:02:06-05:00' + updated: '2018-02-24T17:02:06+00:00' url: /anime/details/a-place-further-than-the-universe original: { id: '5097527', changedData: { progress: [7, 8] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13615', slug: a-place-further-than-the-universe, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13615/tiny.jpg?1597696818' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13615/small.jpg?1597696818' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13615/medium.jpg?1597696818' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13615/large.jpg?1597696818' }] }, titles: { alternatives: ['Uchuu yori mo Tooi Basho', 'A Story That Leads to the Antarctica', 'Sora Yorimo Tōi Basho', Yorimoi], canonical: 'A Place Further Than the Universe', localized: { en: 'A Place Further Than the Universe', en_jp: 'Sora yori mo Tooi Basho', en_us: 'A Place Further Than The Universe', ja_jp: 宇宙よりも遠い場所 } } }, updatedAt: '2018-02-24T17:02:06Z' } - @@ -607,7 +607,7 @@ coverImg: images/anime/13237.webp action: 'Watched episode 7' kind: progressed - updated: '2018-02-24T12:38:38-05:00' + updated: '2018-02-24T17:38:38+00:00' url: /anime/details/overlord-ii original: { id: '5097839', changedData: { progress: [6, 7], time_spent: [432, 456] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13237', slug: overlord-ii, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13237/tiny.jpg?1597694945' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13237/small.jpg?1597694945' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13237/medium.jpg?1597694945' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13237/large.jpg?1597694945' }] }, titles: { alternatives: { }, canonical: 'Overlord II', localized: { en_jp: 'Overlord II', en_us: 'Overlord II', ja_jp: オーバーロードⅡ } } }, updatedAt: '2018-02-24T17:38:38Z' } - @@ -616,7 +616,7 @@ coverImg: images/anime/13885.webp action: 'Watched episode 6' kind: progressed - updated: '2018-02-24T13:10:32-05:00' + updated: '2018-02-24T18:10:32+00:00' url: /anime/details/hitori-no-shita-the-outcast-2nd-season original: { id: '5098167', changedData: { progress: [5, 6], time_spent: [96, 120] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13885', slug: hitori-no-shita-the-outcast-2nd-season, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13885/tiny.jpg?1517377133' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13885/small.jpg?1517377133' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13885/medium.jpg?1517377133' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13885/large.jpg?1517377133' }] }, titles: { alternatives: ['hitorinoshita - The Outcast'], canonical: 'Hitori no Shita: The Outcast 2nd Season', localized: { en: 'Hitori no Shita - The Outcast 2', en_jp: 'Hitori no Shita: The Outcast 2nd Season', en_us: 'Hitori no Shita - The Outcast 2', ja_jp: '一人之下 THE OUTCAST 2ndシーズン' } } }, updatedAt: '2018-02-24T18:10:32Z' } - @@ -625,6 +625,6 @@ coverImg: images/anime/13531.webp action: 'Watched episode 8' kind: progressed - updated: '2018-02-24T13:32:09-05:00' + updated: '2018-02-24T18:32:09+00:00' url: /anime/details/ramen-daisuki-koizumi-san original: { id: '5098364', changedData: { progress: [7, 8] }, kind: PROGRESSED, libraryEntry: { reconsumeCount: 0, reconsuming: false, private: false, notes: '' }, media: { __typename: Anime, id: '13531', slug: ramen-daisuki-koizumi-san, posterImage: { views: [{ width: 110, height: 156, url: 'https://media.kitsu.io/anime/poster_images/13531/tiny.jpg?1597698994' }, { width: 284, height: 402, url: 'https://media.kitsu.io/anime/poster_images/13531/small.jpg?1597698994' }, { width: 390, height: 554, url: 'https://media.kitsu.io/anime/poster_images/13531/medium.jpg?1597698994' }, { width: 550, height: 780, url: 'https://media.kitsu.io/anime/poster_images/13531/large.jpg?1597698994' }] }, titles: { alternatives: { }, canonical: 'Ramen Daisuki Koizumi-san', localized: { en: 'Ms. Koizumi Loves Ramen Noodles', en_jp: 'Ramen Daisuki Koizumi-san', en_us: 'Ms. Koizumi Loves Ramen Noodles', ja_jp: ラーメン大好き小泉さん } } }, updatedAt: '2018-02-24T18:32:09Z' } diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 27c3aabd..ce97f6d1 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -4,11 +4,7 @@ */ // Work around the silly timezone error -$timezone = ini_get('date.timezone'); -if ($timezone === '' || $timezone === FALSE) -{ - ini_set('date.timezone', 'GMT'); -} +date_default_timezone_set('UTC'); define('AC_TEST_ROOT_DIR', dirname(__DIR__) . '/'); define('SRC_DIR', AC_TEST_ROOT_DIR . 'src/'); From 52f02dc51e00b0c4afa5ba263e66985caf23859e Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Tue, 23 Feb 2021 13:15:37 -0500 Subject: [PATCH 14/28] Use correct symfony polyfill --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index a9c8e9a0..cf9027f9 100644 --- a/composer.json +++ b/composer.json @@ -57,7 +57,7 @@ "psr/http-message": "^1.0.1", "psr/log": "^1.1.3", "robmorgan/phinx": "^0.12.4", - "symfony/polyfill-intl-idn": "^1.0.0", + "symfony/polyfill-intl-icu": "^1.0.0", "symfony/var-dumper": "^5.0.7", "yosymfony/toml": "^1.0.4" }, From a08a45c3af5f9ad64f006c980a72057c1798ea7c Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Tue, 23 Feb 2021 13:33:54 -0500 Subject: [PATCH 15/28] Attempt to fix the build with the right extension --- Jenkinsfile | 6 ++++-- composer.json | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 47f58808..d873dd84 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -18,7 +18,8 @@ pipeline { } } steps { - sh 'apk add --no-cache git' + sh 'apk add --no-cache git icu-dev' + sh 'docker-php-ext-configure intl && docker-php-ext-install intl' sh 'php ./vendor/bin/phpunit --colors=never' } } @@ -30,7 +31,8 @@ pipeline { } } steps { - sh 'apk add --no-cache git' + sh 'apk add --no-cache git icu-dev' + sh 'docker-php-ext-configure intl && docker-php-ext-install intl' sh 'php ./vendor/bin/phpunit --colors=never' } } diff --git a/composer.json b/composer.json index cf9027f9..b6511b1b 100644 --- a/composer.json +++ b/composer.json @@ -43,7 +43,7 @@ "aviat/query": "^3.0.0", "danielstjules/stringy": "^3.1.0", "ext-dom": "*", - "ext-iconv": "*", + "ext-intl": "*", "ext-json": "*", "ext-gd": "*", "ext-pdo": "*", @@ -57,7 +57,8 @@ "psr/http-message": "^1.0.1", "psr/log": "^1.1.3", "robmorgan/phinx": "^0.12.4", - "symfony/polyfill-intl-icu": "^1.0.0", + "symfony/polyfill-mbstring": "^1.0.0", + "symfony/polyfill-util": "^1.0.0", "symfony/var-dumper": "^5.0.7", "yosymfony/toml": "^1.0.4" }, From 7990b3ad686e6b4192cbabf92c7dcc970c4da42a Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Tue, 23 Feb 2021 15:38:29 -0500 Subject: [PATCH 16/28] Test Type classes --- app/appConf/base_config.php | 15 ++-- app/appConf/routes.php | 8 +-- app/bootstrap.php | 10 +-- build/update_header_comments.php | 11 ++- phpstan.neon | 1 + src/AnimeClient/AnimeClient.php | 10 +-- src/AnimeClient/Types/AbstractType.php | 3 + src/AnimeClient/Types/Config.php | 12 +--- tests/AnimeClient/AnimeClientTest.php | 48 ++++++++++++- tests/AnimeClient/AnimeClientTestCase.php | 4 +- tests/AnimeClient/Types/ConfigTest.php | 53 ++++++++++++++ tests/AnimeClient/Types/ConfigTestCase.php | 72 +++++++++++++++++++ .../ConfigTest__testToString__1.txt | 3 + 13 files changed, 213 insertions(+), 37 deletions(-) create mode 100644 tests/AnimeClient/Types/ConfigTest.php create mode 100644 tests/AnimeClient/Types/ConfigTestCase.php create mode 100644 tests/AnimeClient/Types/__snapshots__/ConfigTest__testToString__1.txt diff --git a/app/appConf/base_config.php b/app/appConf/base_config.php index 612592ca..f7adccca 100644 --- a/app/appConf/base_config.php +++ b/app/appConf/base_config.php @@ -2,16 +2,16 @@ /** * Hummingbird Anime List Client * - * An API client for Kitsu and MyAnimeList to manage anime and manga watch lists + * An API client for Kitsu to manage anime and manga watch lists * - * PHP version 7 + * PHP version 8 * * @package HummingbirdAnimeClient * @author Timothy J. Warren - * @copyright 2015 - 2017 Timothy J. Warren + * @copyright 2015 - 2021 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 4.0 - * @link https://github.com/timw4mail/HummingBirdAnimeClient + * @version 5.2 + * @link https://git.timshomepage.net/timw4mail/HummingBirdAnimeClient */ use function Aviat\AnimeClient\loadConfig; @@ -21,12 +21,13 @@ use function Aviat\AnimeClient\loadConfig; // // You shouldn't generally need to change anything below this line // ---------------------------------------------------------------------------- -$APP_DIR = realpath(__DIR__ . '/../'); -$ROOT_DIR = realpath("{$APP_DIR}/../"); +$APP_DIR = dirname(__DIR__); +$ROOT_DIR = dirname($APP_DIR); $tomlConfig = loadConfig(__DIR__); return array_merge($tomlConfig, [ + 'root' => $ROOT_DIR, 'asset_dir' => "{$ROOT_DIR}/public", 'base_config_dir' => __DIR__, 'config_dir' => "{$APP_DIR}/config", diff --git a/app/appConf/routes.php b/app/appConf/routes.php index e5d5de3a..f599c439 100644 --- a/app/appConf/routes.php +++ b/app/appConf/routes.php @@ -2,15 +2,15 @@ /** * Hummingbird Anime List Client * - * An API client for Kitsu and MyAnimeList to manage anime and manga watch lists + * An API client for Kitsu to manage anime and manga watch lists * - * PHP version 7 + * PHP version 8 * * @package HummingbirdAnimeClient * @author Timothy J. Warren - * @copyright 2015 - 2018 Timothy J. Warren + * @copyright 2015 - 2021 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @version 4.0 + * @version 5.2 * @link https://git.timshomepage.net/timw4mail/HummingBirdAnimeClient */ diff --git a/app/bootstrap.php b/app/bootstrap.php index 7594652c..d9c88629 100644 --- a/app/bootstrap.php +++ b/app/bootstrap.php @@ -34,11 +34,11 @@ use Psr\SimpleCache\CacheInterface; use function Aviat\Ion\_dir; -if ( ! defined('APP_DIR')) +if ( ! defined('HB_APP_DIR')) { - define('APP_DIR', __DIR__); - define('ROOT_DIR', dirname(APP_DIR)); - define('TEMPLATE_DIR', _dir(APP_DIR, 'templates')); + define('HB_APP_DIR', __DIR__); + define('ROOT_DIR', dirname(HB_APP_DIR)); + define('TEMPLATE_DIR', _dir(HB_APP_DIR, 'templates')); } // ----------------------------------------------------------------------------- @@ -50,7 +50,7 @@ return static function (array $configArray = []): Container { // ------------------------------------------------------------------------- // Logging // ------------------------------------------------------------------------- - $LOG_DIR = _dir(APP_DIR, 'logs'); + $LOG_DIR = _dir(HB_APP_DIR, 'logs'); $appLogger = new Logger('animeclient'); $appLogger->pushHandler(new RotatingFileHandler(_dir($LOG_DIR, 'app.log'), 2, Logger::WARNING)); diff --git a/build/update_header_comments.php b/build/update_header_comments.php index e5bf9191..efc9d911 100644 --- a/build/update_header_comments.php +++ b/build/update_header_comments.php @@ -2,6 +2,7 @@ declare(strict_types=1); $file_patterns = [ + 'app/appConf/*.php', 'app/bootstrap.php', 'migrations/*.php', 'src/**/*.php', @@ -16,7 +17,7 @@ if ( ! function_exists('glob_recursive')) { // Does not support flag GLOB_BRACE - function glob_recursive($pattern, $flags = 0) + function glob_recursive(string $pattern, int $flags = 0): array { $files = glob($pattern, $flags); @@ -57,17 +58,21 @@ function get_text_to_replace(array $tokens): string return $output; } -function get_tokens($source): array +function get_tokens(string $source): array { return token_get_all($source); } -function replace_files(array $files, $template) +function replace_files(array $files, string $template): void { print_r($files); foreach ($files as $file) { $source = file_get_contents($file); + if ($source === FALSE) + { + continue; + } if (stripos($source, 'namespace') === FALSE) { diff --git a/phpstan.neon b/phpstan.neon index 5a474a6a..168c502d 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -4,6 +4,7 @@ parameters: inferPrivatePropertyTypeFromConstructor: true level: 8 paths: + - app/appConf - src - ./console - index.php diff --git a/src/AnimeClient/AnimeClient.php b/src/AnimeClient/AnimeClient.php index 1a903d89..43518e15 100644 --- a/src/AnimeClient/AnimeClient.php +++ b/src/AnimeClient/AnimeClient.php @@ -186,7 +186,7 @@ function checkFolderPermissions(ConfigInterface $config): array $errors = []; $publicDir = $config->get('asset_dir'); - $APP_DIR = _dir(dirname(__DIR__, 2), '/app'); + $APP_DIR = _dir($config->get('root'), 'app'); $pathMap = [ 'app/config' => "{$APP_DIR}/config", @@ -211,7 +211,9 @@ function checkFolderPermissions(ConfigInterface $config): array if ( ! $writable) { + // @codeCoverageIgnoreStart $errors['writable'][] = $pretty; + // @codeCoverageIgnoreEnd } } @@ -292,6 +294,7 @@ function getLocalImg (string $kitsuUrl, $webp = TRUE): string /** * Create a transparent placeholder image * + * @codeCoverageIgnore * @param string $path * @param int|null $width * @param int|null $height @@ -378,7 +381,6 @@ function colNotEmpty(array $search, string $key): bool * * @param CacheInterface $cache * @return bool - * @throws Throwable */ function clearCache(CacheInterface $cache): bool { @@ -393,9 +395,7 @@ function clearCache(CacheInterface $cache): bool $userData = array_filter((array)$userData, static fn ($value) => $value !== NULL); $cleared = $cache->clear(); - $saved = ( ! empty($userData)) - ? $cache->setMultiple($userData) - : TRUE; + $saved = ( ! empty($userData)) ? $cache->setMultiple($userData) : TRUE; return $cleared && $saved; } diff --git a/src/AnimeClient/Types/AbstractType.php b/src/AnimeClient/Types/AbstractType.php index 32766d2e..1dc3b593 100644 --- a/src/AnimeClient/Types/AbstractType.php +++ b/src/AnimeClient/Types/AbstractType.php @@ -236,6 +236,9 @@ abstract class AbstractType implements ArrayAccess, Countable { return TRUE; } + /** + * @codeCoverageIgnore + */ final protected function fromObject(mixed $parent = null): float|null|bool|int|array|string { $object = $parent ?? $this; diff --git a/src/AnimeClient/Types/Config.php b/src/AnimeClient/Types/Config.php index 9de10ffd..d7b9663c 100644 --- a/src/AnimeClient/Types/Config.php +++ b/src/AnimeClient/Types/Config.php @@ -32,6 +32,8 @@ class Config extends AbstractType { // Settings in config.toml // ------------------------------------------------------------------------ + public string $root; // Path to app root + public ?string $asset_path; // Path to public folder for urls /** @@ -62,8 +64,6 @@ class Config extends AbstractType { /** * Default list view type * 'cover_view' or 'list_view' - * - * @var string */ public ?string $default_view_type; @@ -71,21 +71,13 @@ class Config extends AbstractType { public bool $secure_urls = TRUE; - /** - * @var string|bool - */ public string|bool $show_anime_collection = FALSE; - /** - * @var string|bool - */ public string|bool $show_manga_collection = FALSE; /** * CSS theme: light, dark, or auto-switching * 'auto', 'light', or 'dark' - * - * @var string|null */ public ?string $theme = 'auto'; diff --git a/tests/AnimeClient/AnimeClientTest.php b/tests/AnimeClient/AnimeClientTest.php index f5ba4d99..fa75910d 100644 --- a/tests/AnimeClient/AnimeClientTest.php +++ b/tests/AnimeClient/AnimeClientTest.php @@ -16,9 +16,11 @@ namespace Aviat\AnimeClient\Tests; -use Amp\Http\Client\Response; - use function Aviat\AnimeClient\arrayToToml; +use function Aviat\AnimeClient\checkFolderPermissions; +use function Aviat\AnimeClient\clearCache; +use function Aviat\AnimeClient\colNotEmpty; +use function Aviat\AnimeClient\getLocalImg; use function Aviat\AnimeClient\getResponse; use function Aviat\AnimeClient\isSequentialArray; use function Aviat\AnimeClient\tomlToArray; @@ -89,4 +91,46 @@ class AnimeClientTest extends AnimeClientTestCase { $this->assertNotEmpty(getResponse('https://example.com')); } + + public function testCheckFolderPermissions(): void + { + $config = $this->container->get('config'); + $actual = checkFolderPermissions($config); + $this->assertTrue(is_array($actual)); + } + + public function testGetLocalImageEmptyUrl(): void + { + $actual = getLocalImg(''); + $this->assertEquals('images/placeholder.webp', $actual); + } + + public function testGetLocalImageBadUrl(): void + { + $actual = getLocalImg('//foo.bar'); + $this->assertEquals('images/placeholder.webp', $actual); + } + + public function testColNotEmpty(): void + { + $hasEmptyCols = [[ + 'foo' => '', + ], [ + 'foo' => '', + ]]; + + $hasNonEmptyCols = [[ + 'foo' => 'bar', + ], [ + 'foo' => 'baz', + ]]; + + $this->assertEquals(false, colNotEmpty($hasEmptyCols, 'foo')); + $this->assertEquals(true, colNotEmpty($hasNonEmptyCols, 'foo')); + } + + public function testClearCache(): void + { + $this->assertTrue(clearCache($this->container->get('cache'))); + } } \ No newline at end of file diff --git a/tests/AnimeClient/AnimeClientTestCase.php b/tests/AnimeClient/AnimeClientTestCase.php index 88a2db62..3da703f2 100644 --- a/tests/AnimeClient/AnimeClientTestCase.php +++ b/tests/AnimeClient/AnimeClientTestCase.php @@ -16,6 +16,7 @@ namespace Aviat\AnimeClient\Tests; +use Aviat\Ion\Di\ContainerInterface; use function Aviat\Ion\_dir; use Aviat\Ion\Json; @@ -59,6 +60,7 @@ class AnimeClientTestCase extends TestCase { parent::setUp(); $config_array = [ + 'root' => self::ROOT_DIR, 'asset_path' => '/assets', 'img_cache_path' => _dir(self::ROOT_DIR, 'public/images'), 'data_cache_path' => _dir(self::TEST_DATA_DIR, 'cache'), @@ -94,7 +96,7 @@ class AnimeClientTestCase extends TestCase { ]; // Set up DI container - $di = require _dir(self::ROOT_DIR, 'app', 'bootstrap.php'); + $di = require self::ROOT_DIR . '/app/bootstrap.php'; $container = $di($config_array); // Use mock session handler diff --git a/tests/AnimeClient/Types/ConfigTest.php b/tests/AnimeClient/Types/ConfigTest.php new file mode 100644 index 00000000..76ae05e6 --- /dev/null +++ b/tests/AnimeClient/Types/ConfigTest.php @@ -0,0 +1,53 @@ + + * @copyright 2015 - 2021 Timothy J. Warren + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @version 5.2 + * @link https://git.timshomepage.net/timw4mail/HummingBirdAnimeClient + */ + +namespace Aviat\AnimeClient\Tests\Types; + +use Aviat\AnimeClient\Types\Config; +use Aviat\AnimeClient\Types\UndefinedPropertyException; + +class ConfigTest extends ConfigTestCase { + public function setUp(): void + { + parent::setUp(); + + $this->testClass = Config::class; + } + + public function testSetMethods(): void + { + $type = $this->testClass::from([ + 'anilist' => [], + 'cache' => [], + 'database' => [], + ]); + + $this->assertEquals(3, $type->count()); + } + + public function testOffsetUnset(): void + { + $type = $this->testClass::from([ + 'anilist' => [], + ]); + + $this->assertTrue($type->offsetExists('anilist')); + + $type->offsetUnset('anilist'); + + $this->assertNotTrue($type->offsetExists('anilist')); + } +} \ No newline at end of file diff --git a/tests/AnimeClient/Types/ConfigTestCase.php b/tests/AnimeClient/Types/ConfigTestCase.php new file mode 100644 index 00000000..1106117f --- /dev/null +++ b/tests/AnimeClient/Types/ConfigTestCase.php @@ -0,0 +1,72 @@ + + * @copyright 2015 - 2021 Timothy J. Warren + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @version 5.2 + * @link https://git.timshomepage.net/timw4mail/HummingBirdAnimeClient + */ + +namespace Aviat\AnimeClient\Tests\Types; + +use Aviat\AnimeClient\Tests\AnimeClientTestCase; +use Aviat\AnimeClient\Types\UndefinedPropertyException; + +abstract class ConfigTestCase extends AnimeClientTestCase { + public string $testClass; + + public function testCheck(): void + { + $result = $this->testClass::check([]); + $this->assertEquals([], $result); + } + + public function testSetUndefinedProperty(): void + { + $this->expectException(UndefinedPropertyException::class); + $this->testClass::from([ + 'foobar' => 'baz', + ]); + } + + public function testToString(): void + { + $actual = $this->testClass::from([])->__toString(); + $this->assertMatchesSnapshot($actual); + } + + public function testOffsetExists(): void + { + $actual = $this->testClass::from([ + 'anilist' => [], + ])->offsetExists('anilist'); + $this->assertTrue($actual); + } + + public function testSetState(): void + { + $normal = $this->testClass::from([]); + $setState = $this->testClass::__set_state([]); + + $this->assertEquals($normal, $setState); + } + + public function testIsEmpty(): void + { + $type = $this->testClass::from([]); + $this->assertTrue($type->isEmpty()); + } + + public function testCount(): void + { + $type = $this->testClass::from([]); + $this->assertEquals(0, $type->count()); + } +} \ No newline at end of file diff --git a/tests/AnimeClient/Types/__snapshots__/ConfigTest__testToString__1.txt b/tests/AnimeClient/Types/__snapshots__/ConfigTest__testToString__1.txt new file mode 100644 index 00000000..5663ee41 --- /dev/null +++ b/tests/AnimeClient/Types/__snapshots__/ConfigTest__testToString__1.txt @@ -0,0 +1,3 @@ +Aviat\AnimeClient\Types\Config Object +( +) From 4524885a798750fae4a58b666ddfcfbbd648b598 Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Tue, 23 Feb 2021 17:08:16 -0500 Subject: [PATCH 17/28] Remove redundant docblocks from Type classes --- src/AnimeClient/Types/Anime.php | 3 -- src/AnimeClient/Types/AnimeListItem.php | 3 -- src/AnimeClient/Types/Character.php | 3 -- src/AnimeClient/Types/Config/Anilist.php | 10 +--- src/AnimeClient/Types/Config/Cache.php | 5 +- src/AnimeClient/Types/Config/Database.php | 24 +-------- src/AnimeClient/Types/FormItem.php | 6 --- src/AnimeClient/Types/FormItemData.php | 25 ++------- src/AnimeClient/Types/MangaListItem.php | 51 ++++--------------- src/AnimeClient/Types/MangaListItemDetail.php | 40 +++------------ src/AnimeClient/Types/MangaPage.php | 48 ----------------- tests/AnimeClient/Types/ConfigTest.php | 1 - 12 files changed, 29 insertions(+), 190 deletions(-) diff --git a/src/AnimeClient/Types/Anime.php b/src/AnimeClient/Types/Anime.php index 115be3c5..3dc52c48 100644 --- a/src/AnimeClient/Types/Anime.php +++ b/src/AnimeClient/Types/Anime.php @@ -34,9 +34,6 @@ class Anime extends AbstractType { public array $genres = []; - /** - * @var string - */ public string $id = ''; public array $included = []; diff --git a/src/AnimeClient/Types/AnimeListItem.php b/src/AnimeClient/Types/AnimeListItem.php index 56d41c2d..08477118 100644 --- a/src/AnimeClient/Types/AnimeListItem.php +++ b/src/AnimeClient/Types/AnimeListItem.php @@ -46,9 +46,6 @@ final class AnimeListItem extends AbstractType { public int $rewatched = 0; - /** - * @var string|int - */ public string|int $user_rating = ''; /** diff --git a/src/AnimeClient/Types/Character.php b/src/AnimeClient/Types/Character.php index e68c4259..252d3823 100644 --- a/src/AnimeClient/Types/Character.php +++ b/src/AnimeClient/Types/Character.php @@ -24,9 +24,6 @@ final class Character extends AbstractType { public ?string $description; - /** - * @var string - */ public string $id; public array $included = []; diff --git a/src/AnimeClient/Types/Config/Anilist.php b/src/AnimeClient/Types/Config/Anilist.php index b81be659..a44133ad 100644 --- a/src/AnimeClient/Types/Config/Anilist.php +++ b/src/AnimeClient/Types/Config/Anilist.php @@ -19,10 +19,7 @@ namespace Aviat\AnimeClient\Types\Config; use Aviat\AnimeClient\Types\AbstractType; class Anilist extends AbstractType { - /** - * @var bool|string - */ - public $enabled = FALSE; + public bool|string $enabled = FALSE; public ?string $client_id; @@ -30,10 +27,7 @@ class Anilist extends AbstractType { public ?string $access_token; - /** - * @var int|string|null - */ - public $access_token_expires; + public int|string|null $access_token_expires; public ?string $refresh_token; diff --git a/src/AnimeClient/Types/Config/Cache.php b/src/AnimeClient/Types/Config/Cache.php index c8286fab..46b85145 100644 --- a/src/AnimeClient/Types/Config/Cache.php +++ b/src/AnimeClient/Types/Config/Cache.php @@ -23,10 +23,7 @@ class Cache extends AbstractType { public ?string $host; - /** - * @var string|int|null - */ - public $port; + public string|int|null $port; public ?string $database; diff --git a/src/AnimeClient/Types/Config/Database.php b/src/AnimeClient/Types/Config/Database.php index 1785eebd..07813bd2 100644 --- a/src/AnimeClient/Types/Config/Database.php +++ b/src/AnimeClient/Types/Config/Database.php @@ -19,38 +19,18 @@ namespace Aviat\AnimeClient\Types\Config; use Aviat\AnimeClient\Types\AbstractType; class Database extends AbstractType { - /** - * @var string - */ + public string $type = 'sqlite'; - /** - * @var string|null - */ public ?string $host; - /** - * @var string|null - */ public ?string $user; - /** - * @var string|null - */ public ?string $pass; - /** - * @var string|int|null - */ - public $port; + public string|int|null $port; - /** - * @var string|null - */ public ?string $database; - /** - * @var string|null - */ public ?string $file; } \ No newline at end of file diff --git a/src/AnimeClient/Types/FormItem.php b/src/AnimeClient/Types/FormItem.php index 47a0eb5a..ad1919da 100644 --- a/src/AnimeClient/Types/FormItem.php +++ b/src/AnimeClient/Types/FormItem.php @@ -20,14 +20,8 @@ namespace Aviat\AnimeClient\Types; * Type representing an Anime object for display */ class FormItem extends AbstractType { - /** - * @var string|int - */ public string|int $id; - /** - * @var string|int|null - */ public string|int|null $mal_id; public ?FormItemData $data; diff --git a/src/AnimeClient/Types/FormItemData.php b/src/AnimeClient/Types/FormItemData.php index 6dba7bc8..ed4bf94e 100644 --- a/src/AnimeClient/Types/FormItemData.php +++ b/src/AnimeClient/Types/FormItemData.php @@ -24,32 +24,17 @@ class FormItemData extends AbstractType { public ?bool $private = FALSE; - /** - * @var int - */ - public $progress; + public ?int $progress; - /** - * @var int - */ - public $rating; + public ?int $rating; - /** - * @var int - */ - public $ratingTwenty; + public ?int $ratingTwenty = NULL; - /** - * @var string|int - */ - public $reconsumeCount; + public string|int $reconsumeCount; public bool $reconsuming = FALSE; - /** - * @var string - */ - public $status; + public string $status; /** * W3C Format Date string diff --git a/src/AnimeClient/Types/MangaListItem.php b/src/AnimeClient/Types/MangaListItem.php index 226e9c93..97925955 100644 --- a/src/AnimeClient/Types/MangaListItem.php +++ b/src/AnimeClient/Types/MangaListItem.php @@ -20,60 +20,31 @@ namespace Aviat\AnimeClient\Types; * Type representing an Anime object for display */ final class MangaListItem extends AbstractType { - /** - * @var string - */ - public $id; - /** - * @var string - */ - public $mal_id; + public string $id; - /** - * @var array - */ - public $chapters = [ + public ?string $mal_id; + + public array $chapters = [ 'read' => 0, 'total' => 0, ]; - /** - * @var array - */ - public $volumes = [ + public array $volumes = [ 'read' => '-', 'total' => 0, ]; - /** - * @var object - */ - public $manga; + public object $manga; - /** - * @var string - */ - public $reading_status; + public string $reading_status; - /** - * @var string - */ - public $notes; + public ?string $notes; - /** - * @var bool - */ - public $rereading; + public bool $rereading = false; - /** - * @var int - */ - public $reread; + public ?int $reread; - /** - * @var int - */ - public $user_rating; + public string|int|null $user_rating; } diff --git a/src/AnimeClient/Types/MangaListItemDetail.php b/src/AnimeClient/Types/MangaListItemDetail.php index 07a8e1bc..e8c19980 100644 --- a/src/AnimeClient/Types/MangaListItemDetail.php +++ b/src/AnimeClient/Types/MangaListItemDetail.php @@ -20,43 +20,19 @@ namespace Aviat\AnimeClient\Types; * Type representing the manga represented by the list item */ final class MangaListItemDetail extends AbstractType { - /** - * @var array - */ - public $genres; + public array $genres = []; - /** - * @var string - */ - public $id; + public string $id; - /** - * @var string - */ - public $image; + public string $image; - /** - * @var string - */ - public $slug; + public string $slug; - /** - * @var string - */ - public $title; + public string $title; - /** - * @var array - */ - public $titles; + public array $titles; - /** - * @var string - */ - public $type; + public ?string $type; - /** - * @var string - */ - public $url; + public string $url; } diff --git a/src/AnimeClient/Types/MangaPage.php b/src/AnimeClient/Types/MangaPage.php index 08972090..48969b85 100644 --- a/src/AnimeClient/Types/MangaPage.php +++ b/src/AnimeClient/Types/MangaPage.php @@ -22,74 +22,32 @@ use Aviat\AnimeClient\API\Kitsu\Enum\MangaPublishingStatus; * Type representing an Anime object for display */ final class MangaPage extends AbstractType { - /** - * @var string|null - */ public ?string $age_rating; - /** - * @var string|null - */ public ?string $age_rating_guide; - /** - * @var array - */ public array $characters; - /** - * @var int|null - */ public ?int $chapter_count; - /** - * @var string|null - */ public ?string $cover_image; - /** - * @var array - */ public array $genres; - /** - * @var array - */ public array $links; - /** - * @var string - */ public string $id; - /** - * @var string - */ public string $manga_type; - /** - * @var string - */ public string $status = MangaPublishingStatus::FINISHED; - /** - * @var array - */ public array $staff; - /** - * @var string - */ public string $synopsis; - /** - * @var string - */ public string $title; - /** - * @var array - */ public array $titles; /** @@ -97,13 +55,7 @@ final class MangaPage extends AbstractType { */ public array $titles_more; - /** - * @var string - */ public string $url; - /** - * @var int|null - */ public ?int $volume_count; } diff --git a/tests/AnimeClient/Types/ConfigTest.php b/tests/AnimeClient/Types/ConfigTest.php index 76ae05e6..da1bb73d 100644 --- a/tests/AnimeClient/Types/ConfigTest.php +++ b/tests/AnimeClient/Types/ConfigTest.php @@ -17,7 +17,6 @@ namespace Aviat\AnimeClient\Tests\Types; use Aviat\AnimeClient\Types\Config; -use Aviat\AnimeClient\Types\UndefinedPropertyException; class ConfigTest extends ConfigTestCase { public function setUp(): void From f0eacc2f93ffc7e5129c7b501fa8d1dfb2de5cdf Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Tue, 23 Feb 2021 17:08:36 -0500 Subject: [PATCH 18/28] Replace Whoops with Tracy --- composer.json | 3 +-- index.php | 17 +++-------------- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/composer.json b/composer.json index b6511b1b..7ddd1dd7 100644 --- a/composer.json +++ b/composer.json @@ -47,7 +47,6 @@ "ext-json": "*", "ext-gd": "*", "ext-pdo": "*", - "filp/whoops": "^2.1", "laminas/laminas-diactoros": "^2.5.0", "laminas/laminas-httphandlerrunner": "^1.1.0", "maximebf/consolekit": "^1.0.3", @@ -59,7 +58,7 @@ "robmorgan/phinx": "^0.12.4", "symfony/polyfill-mbstring": "^1.0.0", "symfony/polyfill-util": "^1.0.0", - "symfony/var-dumper": "^5.0.7", + "tracy/tracy": "^2.8.0", "yosymfony/toml": "^1.0.4" }, "require-dev": { diff --git a/index.php b/index.php index 598a5604..593ab1dd 100644 --- a/index.php +++ b/index.php @@ -17,9 +17,7 @@ namespace Aviat\AnimeClient; use Aviat\AnimeClient\Types\Config as ConfigType; -use Whoops\Handler; -use Whoops\Run; -use Whoops\Util; +use Tracy\Debugger; use function Aviat\Ion\_dir; setlocale(LC_CTYPE, 'en_US'); @@ -27,17 +25,8 @@ setlocale(LC_CTYPE, 'en_US'); // Load composer autoloader require_once __DIR__ . '/vendor/autoload.php'; -if (file_exists('.is-dev')) -{ - $whoops = new Run; - $whoops->pushHandler(new Handler\PrettyPageHandler); - - if (Util\Misc::isAjaxRequest()) { - $whoops->pushHandler(new Handler\JsonResponseHandler); - } - - $whoops->register(); -} +Debugger::$strictMode = true; +Debugger::enable(Debugger::DEVELOPMENT, __DIR__ . '/app/logs'); // Define base directories $APP_DIR = _dir(__DIR__, 'app'); From 0b9fbbf042e8db590bad13a1a8d0cd0c013566f6 Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Fri, 26 Feb 2021 14:42:07 -0500 Subject: [PATCH 19/28] Misc fixes --- index.php | 1 + src/AnimeClient/Controller.php | 13 +++++++++++++ src/AnimeClient/Dispatcher.php | 4 +--- src/Ion/Di/Container.php | 8 ++++---- src/Ion/Di/ContainerInterface.php | 8 ++++---- tests/AnimeClient/AnimeClientTestCase.php | 22 ++++++++++------------ tests/AnimeClient/DispatcherTest.php | 3 ++- tests/Ion/Di/ContainerTest.php | 22 +++++++++++++++------- 8 files changed, 50 insertions(+), 31 deletions(-) diff --git a/index.php b/index.php index 593ab1dd..efb78c5a 100644 --- a/index.php +++ b/index.php @@ -26,6 +26,7 @@ setlocale(LC_CTYPE, 'en_US'); require_once __DIR__ . '/vendor/autoload.php'; Debugger::$strictMode = true; +Debugger::$showBar = false; Debugger::enable(Debugger::DEVELOPMENT, __DIR__ . '/app/logs'); // Define base directories diff --git a/src/AnimeClient/Controller.php b/src/AnimeClient/Controller.php index 519d8213..71fc97ad 100644 --- a/src/AnimeClient/Controller.php +++ b/src/AnimeClient/Controller.php @@ -126,6 +126,7 @@ class Controller { /** * Set the current url in the session as the target of a future redirect * + * @codeCoverageIgnore * @param string|NULL $url * @throws ContainerException * @throws NotFoundException @@ -166,6 +167,7 @@ class Controller { * * If one is not set, redirect to default url * + * @codeCoverageIgnore * @throws InvalidArgumentException * @return void */ @@ -179,6 +181,7 @@ class Controller { /** * Check if the current user is authenticated, else error and exit + * @codeCoverageIgnore */ protected function checkAuth(): void { @@ -195,6 +198,7 @@ class Controller { /** * Get the string output of a partial template * + * @codeCoverageIgnore * @param HtmlView $view * @param string $template * @param array $data @@ -226,6 +230,7 @@ class Controller { /** * Render a template with header and footer * + * @codeCoverageIgnore * @param HtmlView $view * @param string $template * @param array $data @@ -256,6 +261,7 @@ class Controller { /** * 404 action * + * @codeCoverageIgnore * @param string $title * @param string $message * @throws InvalidArgumentException @@ -276,6 +282,7 @@ class Controller { /** * Display a generic error page * + * @codeCoverageIgnore * @param int $httpCode * @param string $title * @param string $message @@ -295,6 +302,7 @@ class Controller { /** * Redirect to the default controller/url from an empty path * + * @codeCoverageIgnore * @throws InvalidArgumentException * @return void */ @@ -308,6 +316,7 @@ class Controller { * Set a session flash variable to display a message on * next page load * + * @codeCoverageIgnore * @param string $message * @param string $type * @return void @@ -343,6 +352,7 @@ class Controller { /** * Add a message box to the page * + * @codeCoverageIgnore * @param HtmlView $view * @param string $type * @param string $message @@ -360,6 +370,7 @@ class Controller { /** * Output a template to HTML, using the provided data * + * @codeCoverageIgnore * @param string $template * @param array $data * @param HtmlView|NULL $view @@ -381,6 +392,7 @@ class Controller { /** * Output a JSON Response * + * @codeCoverageIgnore * @param mixed $data * @param int $code - the http status code * @throws DoubleRenderException @@ -397,6 +409,7 @@ class Controller { /** * Redirect to the selected page * + * @codeCoverageIgnore * @param string $url * @param int $code * @return void diff --git a/src/AnimeClient/Dispatcher.php b/src/AnimeClient/Dispatcher.php index 0be584fb..08cc5cb2 100644 --- a/src/AnimeClient/Dispatcher.php +++ b/src/AnimeClient/Dispatcher.php @@ -314,10 +314,8 @@ final class Dispatcher extends RoutingBase { /** * Get the appropriate params for the error page * passed on the failed route - * - * @return array|false */ - protected function getErrorParams() + protected function getErrorParams(): array { $logger = $this->container->getLogger(); $failure = $this->matcher->getFailedRoute(); diff --git a/src/Ion/Di/Container.php b/src/Ion/Di/Container.php index ac545d21..233eb241 100644 --- a/src/Ion/Di/Container.php +++ b/src/Ion/Di/Container.php @@ -66,7 +66,7 @@ class Container implements ContainerInterface { * * @return mixed Entry. */ - public function get($id): mixed + public function get(string $id): mixed { if ( ! \is_string($id)) { @@ -94,12 +94,12 @@ class Container implements ContainerInterface { * Get a new instance of the specified item * * @param string $id - Identifier of the entry to look for. - * @param array $args - Optional arguments for the factory callable + * @param array|null $args - Optional arguments for the factory callable * @throws NotFoundException - No entry was found for this identifier. * @throws ContainerException - Error while retrieving the entry. * @return mixed */ - public function getNew($id, array $args = NULL): mixed + public function getNew(string $id, ?array $args = NULL): mixed { if ( ! \is_string($id)) { @@ -159,7 +159,7 @@ class Container implements ContainerInterface { * @param string $id Identifier of the entry to look for. * @return boolean */ - public function has($id): bool + public function has(string $id): bool { return array_key_exists($id, $this->container); } diff --git a/src/Ion/Di/ContainerInterface.php b/src/Ion/Di/ContainerInterface.php index a5b1eb42..2cc883da 100644 --- a/src/Ion/Di/ContainerInterface.php +++ b/src/Ion/Di/ContainerInterface.php @@ -36,7 +36,7 @@ interface ContainerInterface { * @throws Exception\ContainerException Error while retrieving the entry. * @return mixed Entry. */ - public function get($id); + public function get(string $id): mixed; /** * Returns true if the container can return an entry for the given identifier. @@ -45,7 +45,7 @@ interface ContainerInterface { * @param string $id Identifier of the entry to look for. * @return boolean */ - public function has($id): bool; + public function has(string $id): bool; /** * Add a factory to the container @@ -63,7 +63,7 @@ interface ContainerInterface { * @param mixed $value * @return ContainerInterface */ - public function setInstance(string $id, $value): ContainerInterface; + public function setInstance(string $id, mixed $value): ContainerInterface; /** * Get a new instance of the specified item @@ -71,7 +71,7 @@ interface ContainerInterface { * @param string $id * @return mixed */ - public function getNew($id); + public function getNew(string $id): mixed; /** * Determine whether a logger channel is registered diff --git a/tests/AnimeClient/AnimeClientTestCase.php b/tests/AnimeClient/AnimeClientTestCase.php index 3da703f2..ec59342f 100644 --- a/tests/AnimeClient/AnimeClientTestCase.php +++ b/tests/AnimeClient/AnimeClientTestCase.php @@ -16,6 +16,7 @@ namespace Aviat\AnimeClient\Tests; +use Aviat\Ion\Di\ContainerAware; use Aviat\Ion\Di\ContainerInterface; use function Aviat\Ion\_dir; @@ -27,10 +28,16 @@ use Laminas\Diactoros\{ ServerRequestFactory }; +use const Aviat\AnimeClient\{ + SLUG_PATTERN, + DEFAULT_CONTROLLER, +}; + /** * Base class for TestCases */ class AnimeClientTestCase extends TestCase { + use ContainerAware; use MatchesSnapshots; // Test directory constants @@ -39,17 +46,10 @@ class AnimeClientTestCase extends TestCase { public const TEST_DATA_DIR = __DIR__ . '/test_data'; public const TEST_VIEW_DIR = __DIR__ . '/test_views'; - protected $container; - protected static $staticContainer; - protected static $session_handler; + protected ContainerInterface $container; public static function setUpBeforeClass(): void { - // Use mock session handler - //$session_handler = new TestSessionHandler(); - //session_set_save_handler($session_handler, TRUE); - //self::$session_handler = $session_handler; - // Remove test cache files $files = glob(_dir(self::TEST_DATA_DIR, 'cache', '*.json')); array_map('unlink', $files); @@ -90,9 +90,7 @@ class AnimeClientTestCase extends TestCase { 'file' => ':memory:', ] ], - 'routes' => [ - - ], + 'routes' => [ ], ]; // Set up DI container @@ -159,7 +157,7 @@ class AnimeClientTestCase extends TestCase { * @param array $args * @return mixed - the decoded data */ - public function getMockFileData(...$args) + public function getMockFileData(mixed ...$args): mixed { $rawData = $this->getMockFile(...$args); diff --git a/tests/AnimeClient/DispatcherTest.php b/tests/AnimeClient/DispatcherTest.php index d0a94fd5..98d04d13 100644 --- a/tests/AnimeClient/DispatcherTest.php +++ b/tests/AnimeClient/DispatcherTest.php @@ -21,13 +21,14 @@ use Aviat\AnimeClient\Controller; use Aviat\AnimeClient\Dispatcher; use Aviat\AnimeClient\UrlGenerator; use Aviat\Ion\Config; +use Aviat\Ion\Di\ContainerInterface; use Monolog\Handler\TestHandler; use Monolog\Logger; class DispatcherTest extends AnimeClientTestCase { - protected $container; + protected ContainerInterface $container; protected $router; protected $config; protected $urlGenerator; diff --git a/tests/Ion/Di/ContainerTest.php b/tests/Ion/Di/ContainerTest.php index 1f132fa0..228475c7 100644 --- a/tests/Ion/Di/ContainerTest.php +++ b/tests/Ion/Di/ContainerTest.php @@ -23,6 +23,8 @@ use Monolog\Logger; use Monolog\Handler\{TestHandler, NullHandler}; use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Di\Exception\NotFoundException; +use Throwable; +use TypeError; class FooTest { @@ -49,13 +51,11 @@ class ContainerTest extends IonTestCase { return [ 'Bad index type: number' => [ 'id' => 42, - 'exception' => ContainerException::class, - 'message' => 'Id must be a string' + 'exception' => TypeError::class, ], 'Bad index type: array' => [ 'id' => [], - 'exception' => ContainerException::class, - 'message' => 'Id must be a string' + 'exception' => TypeError::class, ], 'Non-existent id' => [ 'id' => 'foo', @@ -68,7 +68,7 @@ class ContainerTest extends IonTestCase { /** * @dataProvider dataGetWithException */ - public function testGetWithException($id, $exception, $message): void + public function testGetWithException(mixed $id, $exception, ?string $message = NULL): void { try { @@ -79,15 +79,23 @@ class ContainerTest extends IonTestCase { $this->assertInstanceOf($exception, $e); $this->assertEquals($message, $e->getMessage()); } + catch(Throwable $e) + { + $this->assertInstanceOf($exception, $e); + } } /** * @dataProvider dataGetWithException */ - public function testGetNewWithException($id, $exception, $message): void + public function testGetNewWithException(mixed $id, $exception, ?string $message = NULL): void { $this->expectException($exception); - $this->expectExceptionMessage($message); + if ($message !== NULL) + { + $this->expectExceptionMessage($message); + } + $this->container->getNew($id); } From c37943edf3e5d81cb0625e629408a180b32aa105 Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Mon, 1 Mar 2021 10:06:12 -0500 Subject: [PATCH 20/28] Update Kitsu GraphQL schema --- src/AnimeClient/API/Kitsu/schema.graphql | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/AnimeClient/API/Kitsu/schema.graphql b/src/AnimeClient/API/Kitsu/schema.graphql index b34ba5f6..16fe40de 100644 --- a/src/AnimeClient/API/Kitsu/schema.graphql +++ b/src/AnimeClient/API/Kitsu/schema.graphql @@ -1559,11 +1559,11 @@ type MediaStaffEdge { } type Mutation { - anime: AnimeMutations - episode: EpisodeMutations - libraryEntry: LibraryEntryMutations - mapping: MappingMutations - post: PostMutations + anime: AnimeMutations! + episode: EpisodeMutations! + libraryEntry: LibraryEntryMutations! + mapping: MappingMutations! + post: PostMutations! pro: ProMutations! } From eb461e2f2e04ad19902a8238af6460f78d77c2dd Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Mon, 1 Mar 2021 10:08:07 -0500 Subject: [PATCH 21/28] Coverage fix for Ion DI --- src/Ion/Di/Container.php | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/Ion/Di/Container.php b/src/Ion/Di/Container.php index 233eb241..16dca4a9 100644 --- a/src/Ion/Di/Container.php +++ b/src/Ion/Di/Container.php @@ -68,11 +68,6 @@ class Container implements ContainerInterface { */ public function get(string $id): mixed { - if ( ! \is_string($id)) - { - throw new ContainerException('Id must be a string'); - } - if ($this->has($id)) { // Return an object instance, if it already exists @@ -101,11 +96,6 @@ class Container implements ContainerInterface { */ public function getNew(string $id, ?array $args = NULL): mixed { - if ( ! \is_string($id)) - { - throw new ContainerException('Id must be a string'); - } - if ($this->has($id)) { // By default, call a factory with the Container From c624b51acde87f9cb14f6f8c72fd6557d451d191 Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Mon, 1 Mar 2021 10:08:36 -0500 Subject: [PATCH 22/28] Fix null error on updating Anime or Manga --- src/AnimeClient/Controller/Anime.php | 4 +--- src/AnimeClient/Controller/Manga.php | 8 +------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/AnimeClient/Controller/Anime.php b/src/AnimeClient/Controller/Anime.php index d56740a0..45cf24bc 100644 --- a/src/AnimeClient/Controller/Anime.php +++ b/src/AnimeClient/Controller/Anime.php @@ -228,7 +228,7 @@ final class Anime extends BaseController { $postData = $transformer->untransform($data); $fullResult = $this->model->updateLibraryItem(FormItem::from($postData)); - if ($fullResult['statusCode'] === 200 && $fullResult['body']['error'] === NULL) + if ($fullResult['statusCode'] === 200) { $this->setFlashMessage('Successfully updated.', 'success'); $this->cache->clear(); @@ -302,8 +302,6 @@ final class Anime extends BaseController { * View details of an anime * * @param string $id - * @throws ContainerException - * @throws NotFoundException * @throws InvalidArgumentException * @return void */ diff --git a/src/AnimeClient/Controller/Manga.php b/src/AnimeClient/Controller/Manga.php index 05e7719d..f52d629e 100644 --- a/src/AnimeClient/Controller/Manga.php +++ b/src/AnimeClient/Controller/Manga.php @@ -64,8 +64,6 @@ final class Manga extends Controller { * * @param string $status * @param string $view - * @throws ContainerException - * @throws NotFoundException * @throws InvalidArgumentException * @return void */ @@ -229,7 +227,7 @@ final class Manga extends Controller { $post_data = $transformer->untransform($data); $full_result = $this->model->updateLibraryItem(FormItem::from($post_data)); - if ($full_result['statusCode'] === 200 && $full_result['body']['error'] === NULL) + if ($full_result['statusCode'] === 200) { $this->setFlashMessage('Successfully updated manga.', 'success'); $this->cache->clear(); @@ -298,8 +296,6 @@ final class Manga extends Controller { * View details of an manga * * @param string $id - * @throws ContainerException - * @throws NotFoundException * @throws InvalidArgumentException * @throws Throwable * @return void @@ -331,8 +327,6 @@ final class Manga extends Controller { /** * View details of a random manga * - * @throws ContainerException - * @throws NotFoundException * @throws InvalidArgumentException * @throws Throwable * @return void From 12c9fc1b2e6e2a8f7f484abd8078e3564ce77544 Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Wed, 21 Apr 2021 19:33:51 -0400 Subject: [PATCH 23/28] Update filtering of MAL IDs for items to check to update --- src/AnimeClient/Command/SyncLists.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AnimeClient/Command/SyncLists.php b/src/AnimeClient/Command/SyncLists.php index 01964a2b..abf4c2df 100644 --- a/src/AnimeClient/Command/SyncLists.php +++ b/src/AnimeClient/Command/SyncLists.php @@ -413,7 +413,7 @@ final class SyncLists extends BaseCommand { $malIds = array_keys($anilistList); $kitsuMalIds = array_map('intval', array_column($kitsuList, 'malId')); - $missingMalIds = array_filter(array_diff($kitsuMalIds, $malIds), fn ($id) => ! in_array($id, $kitsuMalIds)); + $missingMalIds = array_filter($malIds, fn ($id) => ! in_array($id, $kitsuMalIds)); // Add items on Anilist, but not Kitsu to Kitsu foreach($missingMalIds as $mid) @@ -747,7 +747,7 @@ final class SyncLists extends BaseCommand { $responseData = Json::decode($response); $id = $itemsToUpdate[$key]['id']; - $mal_id = $itemsToUpdate[$key]['mal_id']; + $mal_id = $itemsToUpdate[$key]['mal_id'] ?? NULL; if ( ! array_key_exists('errors', $responseData)) { $verb = ($action === SyncAction::UPDATE) ? 'updated' : 'created'; From 06250b64cb41c4fc5e24f3f6cf8eb55ad4ab16f2 Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Wed, 21 Apr 2021 19:35:22 -0400 Subject: [PATCH 24/28] A few minor tweaks --- src/AnimeClient/API/Kitsu/Queries/GetUserHistory.graphql | 2 +- src/AnimeClient/Types/FormItemData.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AnimeClient/API/Kitsu/Queries/GetUserHistory.graphql b/src/AnimeClient/API/Kitsu/Queries/GetUserHistory.graphql index 06066e03..eb569d6d 100644 --- a/src/AnimeClient/API/Kitsu/Queries/GetUserHistory.graphql +++ b/src/AnimeClient/API/Kitsu/Queries/GetUserHistory.graphql @@ -1,6 +1,6 @@ query ($slug: String!) { findProfileBySlug(slug: $slug) { - libraryEvents(first: 100) { + libraryEvents(first: 100, kind: [PROGRESSED, UPDATED]) { nodes { id changedData diff --git a/src/AnimeClient/Types/FormItemData.php b/src/AnimeClient/Types/FormItemData.php index ed4bf94e..446bcb1a 100644 --- a/src/AnimeClient/Types/FormItemData.php +++ b/src/AnimeClient/Types/FormItemData.php @@ -24,7 +24,7 @@ class FormItemData extends AbstractType { public ?bool $private = FALSE; - public ?int $progress; + public ?int $progress = NULL; public ?int $rating; From 15b5640f9fd2d0a6fe391b3081471ca1d0541cb6 Mon Sep 17 00:00:00 2001 From: Timothy J Warren Date: Wed, 21 Apr 2021 20:09:03 -0400 Subject: [PATCH 25/28] We don't want our ratings to float... --- src/AnimeClient/Command/SyncLists.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AnimeClient/Command/SyncLists.php b/src/AnimeClient/Command/SyncLists.php index abf4c2df..9cb8d5cd 100644 --- a/src/AnimeClient/Command/SyncLists.php +++ b/src/AnimeClient/Command/SyncLists.php @@ -363,7 +363,7 @@ final class SyncLists extends BaseCommand { 'progress' => $listItem['progress'], // Comparision is done on 1-10 scale, // Kitsu returns 1-20 scale. - 'rating' => $listItem['rating'] / 2, + 'rating' => (int) $listItem['rating'] / 2, 'reconsumeCount' => $listItem['reconsumeCount'], 'reconsuming' => $listItem['reconsuming'], 'status' => strtolower($listItem['status']), @@ -692,7 +692,7 @@ final class SyncLists extends BaseCommand { // Anilist returns a rating between 1-100 // Kitsu expects a rating from 1-20 'rating' => (((int)$anilistItem['data']['rating']) > 0) - ? $anilistItem['data']['rating'] / 5 + ? (int) $anilistItem['data']['rating'] / 5 : 0, 'reconsumeCount' => $anilistItem['data']['reconsumeCount'], 'reconsuming' => $anilistItem['data']['reconsuming'], From ff4e1ee471928683012ebcc46f03e039f83d5b9f Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Wed, 21 Apr 2021 20:20:39 -0400 Subject: [PATCH 26/28] Even less floating, please --- src/AnimeClient/API/Kitsu/Transformer/AnimeListTransformer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AnimeClient/API/Kitsu/Transformer/AnimeListTransformer.php b/src/AnimeClient/API/Kitsu/Transformer/AnimeListTransformer.php index 847efcf2..7f1afb42 100644 --- a/src/AnimeClient/API/Kitsu/Transformer/AnimeListTransformer.php +++ b/src/AnimeClient/API/Kitsu/Transformer/AnimeListTransformer.php @@ -104,7 +104,7 @@ final class AnimeListTransformer extends AbstractTransformer { 'notes' => $item['notes'], 'rewatching' => (bool) $item['reconsuming'], 'rewatched' => (int) $item['reconsumeCount'], - 'user_rating' => $rating, + 'user_rating' => (is_string($rating)) ? $rating : (int) $rating, 'private' => $item['private'] ?? FALSE, ]); } From 5346ce7d89f5199cececd9ab92671b3ed5739143 Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Fri, 23 Apr 2021 18:58:51 -0400 Subject: [PATCH 27/28] Drastically simplify setup for bundling js files --- app/views/footer.php | 8 +- frontEndSrc/build-js.js | 68 -- frontEndSrc/js/anime-client.js | 18 +- frontEndSrc/js/base/class-list.js | 227 ---- frontEndSrc/js/events.js | 8 +- frontEndSrc/js/index.js | 4 +- frontEndSrc/js/session-check.js | 5 +- frontEndSrc/js/{anon.js => sw.js} | 6 +- frontEndSrc/package.json | 10 +- frontEndSrc/spack.config.js | 19 + frontEndSrc/yarn.lock | 1807 ++++++++++++----------------- public/es/anon.js | 463 -------- public/es/scripts.js | 768 ------------ public/js/anon.min.js | 14 - public/js/anon.min.js.map | 1 - public/js/scripts.min.js | 29 +- public/js/scripts.min.js.map | 2 +- public/js/tables.min.js | 5 +- public/js/tables.min.js.map | 2 +- 19 files changed, 774 insertions(+), 2690 deletions(-) delete mode 100644 frontEndSrc/build-js.js delete mode 100644 frontEndSrc/js/base/class-list.js rename frontEndSrc/js/{anon.js => sw.js} (85%) create mode 100644 frontEndSrc/spack.config.js delete mode 100644 public/es/anon.js delete mode 100644 public/es/scripts.js delete mode 100644 public/js/anon.min.js delete mode 100644 public/js/anon.min.js.map diff --git a/app/views/footer.php b/app/views/footer.php index 7a6cdee4..97008cc1 100644 --- a/app/views/footer.php +++ b/app/views/footer.php @@ -11,12 +11,6 @@ -isAuthenticated()): ?> - - - - - - + diff --git a/frontEndSrc/build-js.js b/frontEndSrc/build-js.js deleted file mode 100644 index 5a3c19de..00000000 --- a/frontEndSrc/build-js.js +++ /dev/null @@ -1,68 +0,0 @@ -import compiler from '@ampproject/rollup-plugin-closure-compiler'; - -const plugins = [ - compiler({ - assumeFunctionWrapper: true, - compilationLevel: 'WHITESPACE_ONLY', //'ADVANCED', - createSourceMap: true, - env: 'BROWSER', - languageIn: 'ECMASCRIPT_2018', - languageOut: 'ES3' - }) -]; - -const defaultOutput = { - format: 'iife', - sourcemap: true, -} - -const nonModules = [{ - input: './js/anon.js', - output: { - ...defaultOutput, - file: '../public/js/anon.min.js', - sourcemapFile: '../public/js/anon.min.js.map', - }, - plugins, -}, { - input: './js/index.js', - output: { - ...defaultOutput, - file: '../public/js/scripts.min.js', - sourcemapFile: '../public/js/scripts.min.js.map', - }, - plugins, -}, { - input: './js/base/sort-tables.js', - output: { - ...defaultOutput, - file: '../public/js/tables.min.js', - sourcemapFile: '../public/js/tables.min.js.map', - }, - plugins, -}]; - -const moduleOutput = { - format: 'es', - sourcemap: false, -} - -let modules = [{ - input: './js/anon.js', - output: { - ...moduleOutput, - file: '../public/es/anon.js', - }, -}, { - input: './js/index.js', - output: { - ...moduleOutput, - file: '../public/es/scripts.js', - }, -}]; - -// Return the config array for rollup -export default [ - ...nonModules, - ...modules, -]; \ No newline at end of file diff --git a/frontEndSrc/js/anime-client.js b/frontEndSrc/js/anime-client.js index da05b7c5..f4bdacbc 100644 --- a/frontEndSrc/js/anime-client.js +++ b/frontEndSrc/js/anime-client.js @@ -9,7 +9,7 @@ const matches = (elm, selector) => { return i > -1; } -export const AnimeClient = { +const AnimeClient = { /** * Placeholder function */ @@ -18,8 +18,8 @@ export const AnimeClient = { * DOM selector * * @param {string} selector - The dom selector string - * @param {object} [context] - * @return {[HTMLElement]} - array of dom elements + * @param {Element} [context] + * @return array of dom elements */ $(selector, context = null) { if (typeof selector !== 'string') { @@ -60,7 +60,7 @@ export const AnimeClient = { /** * Hide the selected element * - * @param {string|Element} sel - the selector of the element to hide + * @param {string|Element|Element[]} sel - the selector of the element to hide * @return {void} */ hide (sel) { @@ -77,7 +77,7 @@ export const AnimeClient = { /** * UnHide the selected element * - * @param {string|Element} sel - the selector of the element to hide + * @param {string|Element|Element[]} sel - the selector of the element to hide * @return {void} */ show (sel) { @@ -116,9 +116,9 @@ export const AnimeClient = { /** * Finds the closest parent element matching the passed selector * - * @param {HTMLElement} current - the current HTMLElement + * @param {Element} current - the current Element * @param {string} parentSelector - selector for the parent element - * @return {HTMLElement|null} - the parent element + * @return {Element|null} - the parent element */ closestParent (current, parentSelector) { if (Element.prototype.closest !== undefined) { @@ -204,9 +204,9 @@ function delegateEvent(sel, target, event, listener) { /** * Add an event listener * - * @param {string|HTMLElement} sel - the parent selector to bind to + * @param {string|Element} sel - the parent selector to bind to * @param {string} event - event name(s) to bind - * @param {string|HTMLElement|function} target - the element to directly bind the event to + * @param {string|Element|function} target - the element to directly bind the event to * @param {function} [listener] - event listener callback * @return {void} */ diff --git a/frontEndSrc/js/base/class-list.js b/frontEndSrc/js/base/class-list.js deleted file mode 100644 index 86875d12..00000000 --- a/frontEndSrc/js/base/class-list.js +++ /dev/null @@ -1,227 +0,0 @@ -/* - * classList.js: Cross-browser full element.classList implementation. - * 2014-07-23 - * - * By Eli Grey, http://eligrey.com - * Public Domain. - * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - */ - -/*global self, document, DOMException */ - -/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/ - -if ("document" in self) { - - // Full polyfill for browsers with no classList support - if (!("classList" in document.createElement("_"))) { - - (function(view) { - - "use strict"; - - if (!('Element' in view)) return; - - var - classListProp = "classList", - protoProp = "prototype", - elemCtrProto = view.Element[protoProp], - objCtr = Object, - strTrim = String[protoProp].trim || function() { - return this.replace(/^\s+|\s+$/g, ""); - }, - arrIndexOf = Array[protoProp].indexOf || function(item) { - var - i = 0, - len = this.length; - for (; i < len; i++) { - if (i in this && this[i] === item) { - return i; - } - } - return -1; - } - // Vendors: please allow content code to instantiate DOMExceptions - , - DOMEx = function(type, message) { - this.name = type; - this.code = DOMException[type]; - this.message = message; - }, - checkTokenAndGetIndex = function(classList, token) { - if (token === "") { - throw new DOMEx( - "SYNTAX_ERR", "An invalid or illegal string was specified" - ); - } - if (/\s/.test(token)) { - throw new DOMEx( - "INVALID_CHARACTER_ERR", "String contains an invalid character" - ); - } - return arrIndexOf.call(classList, token); - }, - ClassList = function(elem) { - var - trimmedClasses = strTrim.call(elem.getAttribute("class") || ""), - classes = trimmedClasses ? trimmedClasses.split(/\s+/) : [], - i = 0, - len = classes.length; - for (; i < len; i++) { - this.push(classes[i]); - } - this._updateClassName = function() { - elem.setAttribute("class", this.toString()); - }; - }, - classListProto = ClassList[protoProp] = [], - classListGetter = function() { - return new ClassList(this); - }; - // Most DOMException implementations don't allow calling DOMException's toString() - // on non-DOMExceptions. Error's toString() is sufficient here. - DOMEx[protoProp] = Error[protoProp]; - classListProto.item = function(i) { - return this[i] || null; - }; - classListProto.contains = function(token) { - token += ""; - return checkTokenAndGetIndex(this, token) !== -1; - }; - classListProto.add = function() { - var - tokens = arguments, - i = 0, - l = tokens.length, - token, updated = false; - do { - token = tokens[i] + ""; - if (checkTokenAndGetIndex(this, token) === -1) { - this.push(token); - updated = true; - } - } - while (++i < l); - - if (updated) { - this._updateClassName(); - } - }; - classListProto.remove = function() { - var - tokens = arguments, - i = 0, - l = tokens.length, - token, updated = false, - index; - do { - token = tokens[i] + ""; - index = checkTokenAndGetIndex(this, token); - while (index !== -1) { - this.splice(index, 1); - updated = true; - index = checkTokenAndGetIndex(this, token); - } - } - while (++i < l); - - if (updated) { - this._updateClassName(); - } - }; - classListProto.toggle = function(token, force) { - token += ""; - - var - result = this.contains(token), - method = result ? - force !== true && "remove" : - force !== false && "add"; - - if (method) { - this[method](token); - } - - if (force === true || force === false) { - return force; - } else { - return !result; - } - }; - classListProto.toString = function() { - return this.join(" "); - }; - - if (objCtr.defineProperty) { - var classListPropDesc = { - get: classListGetter, - enumerable: true, - configurable: true - }; - try { - objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); - } catch (ex) { // IE 8 doesn't support enumerable:true - if (ex.number === -0x7FF5EC54) { - classListPropDesc.enumerable = false; - objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); - } - } - } else if (objCtr[protoProp].__defineGetter__) { - elemCtrProto.__defineGetter__(classListProp, classListGetter); - } - - }(self)); - - } else { - // There is full or partial native classList support, so just check if we need - // to normalize the add/remove and toggle APIs. - - (function() { - "use strict"; - - var testElement = document.createElement("_"); - - testElement.classList.add("c1", "c2"); - - // Polyfill for IE 10/11 and Firefox <26, where classList.add and - // classList.remove exist but support only one argument at a time. - if (!testElement.classList.contains("c2")) { - var createMethod = function(method) { - var original = DOMTokenList.prototype[method]; - - DOMTokenList.prototype[method] = function(token) { - var i, len = arguments.length; - - for (i = 0; i < len; i++) { - token = arguments[i]; - original.call(this, token); - } - }; - }; - createMethod('add'); - createMethod('remove'); - } - - testElement.classList.toggle("c3", false); - - // Polyfill for IE 10 and Firefox <24, where classList.toggle does not - // support the second argument. - if (testElement.classList.contains("c3")) { - var _toggle = DOMTokenList.prototype.toggle; - - DOMTokenList.prototype.toggle = function(token, force) { - if (1 in arguments && !this.contains(token) === !force) { - return force; - } else { - return _toggle.call(this, token); - } - }; - - } - - testElement = null; - }()); - - } - -} \ No newline at end of file diff --git a/frontEndSrc/js/events.js b/frontEndSrc/js/events.js index 2a8adfab..701f47fa 100644 --- a/frontEndSrc/js/events.js +++ b/frontEndSrc/js/events.js @@ -16,7 +16,7 @@ _.on('.media-filter', 'input', filterMedia); /** * Hide the html element attached to the event * - * @param event + * @param {MouseEvent} event * @return void */ function hide (event) { @@ -26,7 +26,7 @@ function hide (event) { /** * Confirm deletion of an item * - * @param event + * @param {MouseEvent} event * @return void */ function confirmDelete (event) { @@ -52,7 +52,7 @@ function clearAPICache () { /** * Scroll to the accordion/vertical tab section just opened * - * @param event + * @param {InputEvent} event * @return void */ function scrollToSection (event) { @@ -70,7 +70,7 @@ function scrollToSection (event) { /** * Filter an anime or manga list * - * @param event + * @param {InputEvent} event * @return void */ function filterMedia (event) { diff --git a/frontEndSrc/js/index.js b/frontEndSrc/js/index.js index 9fd34d36..543ef9b0 100644 --- a/frontEndSrc/js/index.js +++ b/frontEndSrc/js/index.js @@ -1,5 +1,5 @@ -import './anon.js'; - +import './sw.js'; +import './events.js'; import './session-check.js'; import './anime.js'; import './manga.js'; diff --git a/frontEndSrc/js/session-check.js b/frontEndSrc/js/session-check.js index 6777ed5e..853fe7d5 100644 --- a/frontEndSrc/js/session-check.js +++ b/frontEndSrc/js/session-check.js @@ -1,9 +1,8 @@ import _ from './anime-client.js'; (() => { - // Var is intentional - var hidden = null; - var visibilityChange = null; + let hidden = null; + let visibilityChange = null; if (typeof document.hidden !== "undefined") { hidden = "hidden"; diff --git a/frontEndSrc/js/anon.js b/frontEndSrc/js/sw.js similarity index 85% rename from frontEndSrc/js/anon.js rename to frontEndSrc/js/sw.js index 89a7bdbc..1c294012 100644 --- a/frontEndSrc/js/anon.js +++ b/frontEndSrc/js/sw.js @@ -1,10 +1,8 @@ -import './events.js'; - +// Start the service worker, if you can if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js').then(reg => { console.log('Service worker registered', reg.scope); }).catch(error => { console.error('Failed to register service worker', error); }); -} - +} \ No newline at end of file diff --git a/frontEndSrc/package.json b/frontEndSrc/package.json index fcf8be53..9c75b424 100644 --- a/frontEndSrc/package.json +++ b/frontEndSrc/package.json @@ -3,19 +3,19 @@ "scripts": { "build": "npm run build:css && npm run build:js", "build:css": "node ./css.js", - "build:js": "rollup -c ./build-js.js", + "build:js": "spack", "watch:css": "watch 'npm run build:css' --filter=./cssfilter.js", "watch:js": "watch 'npm run build:js' ./js", "watch": "concurrently \"npm:watch:css\" \"npm:watch:js\" --kill-others" }, "devDependencies": { - "@ampproject/rollup-plugin-closure-compiler": "^0.26.0", - "concurrently": "^5.1.0", - "cssnano": "^4.1.10", + "@swc/cli": "^0.1.39", + "@swc/core": "^1.2.54", + "concurrently": "^6.0.2", + "cssnano": "^5.0.1", "postcss": "^8.2.6", "postcss-import": "^14.0.0", "postcss-preset-env": "^6.7.0", - "rollup": "^2.4.0", "watch": "^1.0.2" } } diff --git a/frontEndSrc/spack.config.js b/frontEndSrc/spack.config.js new file mode 100644 index 00000000..929087bb --- /dev/null +++ b/frontEndSrc/spack.config.js @@ -0,0 +1,19 @@ +module.exports = { + entry: { + 'scripts.min': __dirname + '/js/index.js', + 'tables.min': __dirname + '/js/base/sort-tables.js', + }, + output: { + path: '../public/js', + }, + options: { + jsc: { + target: 'es3', + loose: true, + }, + minify: true, + module: { + type: 'es6' + } + } +} \ No newline at end of file diff --git a/frontEndSrc/yarn.lock b/frontEndSrc/yarn.lock index 2f55f177..3ec9562b 100644 --- a/frontEndSrc/yarn.lock +++ b/frontEndSrc/yarn.lock @@ -2,75 +2,157 @@ # yarn lockfile v1 -"@ampproject/remapping@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-0.2.0.tgz#07290a5c0f5eac8a4c33d38aa0d15a3416db432e" - integrity sha512-a4EztS9/GOVQjX5Ol+Iz33TFhaXvYBF7aB6D8+Qz0/SCIxOm3UNRhGZiwcCuJ8/Ifc6NCogp3S48kc5hFxRpUw== +"@babel/code-frame@^7.0.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== dependencies: - "@jridgewell/resolve-uri" "1.0.0" - sourcemap-codec "1.4.8" + "@babel/highlight" "^7.12.13" -"@ampproject/rollup-plugin-closure-compiler@^0.26.0": - version "0.26.0" - resolved "https://registry.yarnpkg.com/@ampproject/rollup-plugin-closure-compiler/-/rollup-plugin-closure-compiler-0.26.0.tgz#69f8265e5fdbf3e26905eaaedc60cb5982bd6be0" - integrity sha512-wuHzGE6BDhDR0L7nUPlpQDPGiGnMw+b0B+cDPG0S5TatOmFNQva8KSNdBHan3L9RbvNyYXOXicuCrZtSoBfrBg== +"@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + +"@babel/highlight@^7.12.13": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" + integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== dependencies: - "@ampproject/remapping" "0.2.0" - acorn "7.2.0" - acorn-walk "7.1.1" - estree-walker "2.0.1" - google-closure-compiler "20200517.0.0" - magic-string "0.25.7" - uuid "8.1.0" + "@babel/helper-validator-identifier" "^7.12.11" + chalk "^2.0.0" + js-tokens "^4.0.0" "@csstools/convert-colors@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== -"@jridgewell/resolve-uri@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-1.0.0.tgz#3fdf5798f0b49e90155896f6291df186eac06c83" - integrity sha512-9oLAnygRMi8Q5QkYEU4XWK04B+nuoXoxjRvRxgjuChkLZFBja0YPSgdZ7dZtwhncLBcQe/I/E+fLuk5qxcYVJA== +"@napi-rs/triples@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@napi-rs/triples/-/triples-1.0.2.tgz#2ce4c6a78568358772008f564ee5009093d20a19" + integrity sha512-EL3SiX43m9poFSnhDx4d4fn9SSaqyO2rHsCNhETi9bWPmjXK3uPJ0QpPFtx39FEdHcz1vJmsiW41kqc0AgvtzQ== -"@types/q@^1.5.1": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" - integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== +"@node-rs/helper@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@node-rs/helper/-/helper-1.1.0.tgz#4fcbbebae3b81932d1ff3e431c7cd3886b504742" + integrity sha512-r43YnnrY5JNzDuXJdW3sBJrKzvejvFmFWbiItUEoBJsaPzOIWFMhXB7i5j4c9EMXcFfxveF4l7hT+rLmwtjrVQ== + dependencies: + "@napi-rs/triples" "^1.0.2" + tslib "^2.1.0" -acorn-walk@7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" - integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== +"@swc/cli@^0.1.39": + version "0.1.39" + resolved "https://registry.yarnpkg.com/@swc/cli/-/cli-0.1.39.tgz#fda6521807e9b16a3c1c0fc34a1c927e3df6ae29" + integrity sha512-qTI+HIjSgKUJUKZ3xGA6zAEkHryirmKrzj4zWrCg4FQnAEFGPOIx58/qRs3aURSOS3BnbVE33sqAxEN+v8qZpw== + dependencies: + commander "^7.1.0" + convert-source-map "^1.6.0" + glob "^7.1.3" + lodash "^4.17.11" + slash "3.0.0" + source-map "^0.7.3" -acorn@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.2.0.tgz#17ea7e40d7c8640ff54a694c889c26f31704effe" - integrity sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ== +"@swc/core-android-arm64@^1.2.54": + version "1.2.54" + resolved "https://registry.yarnpkg.com/@swc/core-android-arm64/-/core-android-arm64-1.2.54.tgz#3926fd2ee0d668731e6b1e7b6a18dfc3c605c6e8" + integrity sha512-nbiGQtbdLC/vzDANG91nYn7x+YZavaqv1rzD1BnDz/WeZ2XSBZD0VkPc205PAaBHBE8fTFxHOQiIorbY1lJrZg== -alphanum-sort@^1.0.0: +"@swc/core-darwin-arm64@^1.2.54": + version "1.2.54" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.2.54.tgz#352a5804a1ef4ce524667f316e18d3ecb4d64072" + integrity sha512-b+mpyZ7LAG+A2yApq4+9G7gpCtYeLRLheyj9mR8tFxEu10bGfVgIna3+lHOLyheWDpF1yv7vUMPRtkqCPkKaBA== + +"@swc/core-darwin-x64@^1.2.54": + version "1.2.54" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.2.54.tgz#558c446f9b635ec40ffb0c3b1e0acf9c9177ca8f" + integrity sha512-H3+EuNPgYR7/s4pXJO+GMede/FDJDMIqUHDqd5c3hzGfRnvyOmKDx8Cr5S1gMTwHtrz0+iS5SC6To1jYvdCDBg== + +"@swc/core-linux-arm-gnueabihf@^1.2.54": + version "1.2.54" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.2.54.tgz#7e826310de1cd5c421fd8a9f9a925fe3e7c19f1b" + integrity sha512-+Rk+q011G1IBawesJ+ZSEuwPrSpWExsY2GulzfvMqO4jW1D4jQ1BZprE+/HgwIhb4iycepXc89SNi0EedZSMjQ== + +"@swc/core-linux-arm64-gnu@^1.2.54": + version "1.2.54" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.2.54.tgz#96f34157a53e8761784b536f4b709221bb5aecd3" + integrity sha512-8Tuaw16ODhqSw8SfqtC3PHaotPpDgnRmjeNk9mGdU/HO4ccDH5WeS42cvDx1IWpphJyiT2F8gnLYQbnYZykHKg== + +"@swc/core-linux-x64-gnu@^1.2.54": + version "1.2.54" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.2.54.tgz#64b655de56f562986bd7dd38de4d13fa661cf71b" + integrity sha512-Ky06S3ReokgOeVjcx9JmgVXIiQk++vifXguCABhd3u3t0Diqbnpaqb7UkaHFr6MEXuuk2TpPJ0JQNEZUHjv0Nw== + +"@swc/core-linux-x64-musl@^1.2.54": + version "1.2.54" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.2.54.tgz#30507cdb5c142bc7d91b7e6a9ee490e491928ceb" + integrity sha512-D8F57OTlyR2C8FrlixVAsybEXwwL7ooowwWfBnmR3suZHEqaLlSO1RFyhk3FaiaLh1jN/xcYtkc+NuwvZOaLAQ== + +"@swc/core-win32-ia32-msvc@^1.2.54": + version "1.2.54" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.2.54.tgz#754ec2e6e8595521e891fa6c7db44866e3d8a13b" + integrity sha512-exZGuLPWm3jaBWz1xch6Ry/U9jp+4EPlo2pwi800SPlTPbTnJ5VfrPv9GVurpvx1R64DmleRpTDBG0nXpFdf0g== + +"@swc/core-win32-x64-msvc@^1.2.54": + version "1.2.54" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.2.54.tgz#50f8c7c2f163852c4b42f4288106477aaeff0ea0" + integrity sha512-RBtB1dzbz1ytV5LLxD9wzdGRWxBZFUapFN/RgsH1nJKZFg4kvrvsvfPU2HymNtoOWnfpYuhgapQi+ySQpUL/gg== + +"@swc/core@^1.2.54": + version "1.2.54" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.2.54.tgz#edd25e94d57c9b3c596272ac3dc9e222aeff9905" + integrity sha512-FNBpdRqtkSUV7E0i8C4iDiq29yLmOaP76GS7wuUGOT3txhvstGbr+L7PXzLc+QWczl21aS5V86MYBRg/aX5biw== + dependencies: + "@node-rs/helper" "^1.0.0" + optionalDependencies: + "@swc/core-android-arm64" "^1.2.54" + "@swc/core-darwin-arm64" "^1.2.54" + "@swc/core-darwin-x64" "^1.2.54" + "@swc/core-linux-arm-gnueabihf" "^1.2.54" + "@swc/core-linux-arm64-gnu" "^1.2.54" + "@swc/core-linux-x64-gnu" "^1.2.54" + "@swc/core-linux-x64-musl" "^1.2.54" + "@swc/core-win32-ia32-msvc" "^1.2.54" + "@swc/core-win32-x64-msvc" "^1.2.54" + +"@trysound/sax@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.1.1.tgz#3348564048e7a2d7398c935d466c0414ebb6a669" + integrity sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow== + +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +alphanum-sort@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - sprintf-js "~1.0.2" + color-convert "^2.0.1" autoprefixer@^9.6.1: version "9.8.6" @@ -86,57 +168,38 @@ autoprefixer@^9.6.1: postcss-value-parser "^4.1.0" balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -boolbase@^1.0.0, boolbase@~1.0.0: +boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.6.4: - version "4.16.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" - integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: - caniuse-lite "^1.0.30001181" - colorette "^1.2.1" - electron-to-chromium "^1.3.649" + balanced-match "^1.0.0" + concat-map "0.0.1" + +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.0, browserslist@^4.6.4: + version "4.16.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.5.tgz#952825440bca8913c62d0021334cbe928ef062ae" + integrity sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A== + dependencies: + caniuse-lite "^1.0.30001214" + colorette "^1.2.2" + electron-to-chromium "^1.3.719" escalade "^3.1.1" - node-releases "^1.1.70" + node-releases "^1.1.71" -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== caniuse-api@^3.0.0: version "3.0.0" @@ -148,12 +211,12 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001181: - version "1.0.30001187" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001187.tgz#5706942631f83baa5a0218b7dfa6ced29f845438" - integrity sha512-w7/EP1JRZ9552CyrThUnay2RkZ1DXxKe/Q2swTC4+LElLh9RRYrL1Z+27LlakB8kzY0fSmHw9mc7XYDUKAKWMA== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001214: + version "1.0.30001214" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001214.tgz#70f153c78223515c6d37a9fde6cd69250da9d872" + integrity sha512-O2/SCpuaU3eASWVaesQirZv1MSjUNOvmugaD8zNSJqw6Vv5SGwoOpA9LJs3pNPfM745nxqPvfZY3MQKY4AKHYg== -chalk@2.x, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -162,47 +225,22 @@ chalk@2.x, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== +chalk@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" + ansi-styles "^4.1.0" + supports-color "^7.1.0" -clone-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" - integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= - -clone-stats@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" - integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= - -clone@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= - -cloneable-readable@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec" - integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ== +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: - inherits "^2.0.1" - process-nextick-args "^2.0.0" - readable-stream "^2.3.5" - -coa@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" - integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== - dependencies: - "@types/q" "^1.5.1" - chalk "^2.4.1" - q "^1.1.2" + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" color-convert@^1.9.0, color-convert@^1.9.1: version "1.9.3" @@ -211,25 +249,32 @@ color-convert@^1.9.0, color-convert@^1.9.1: dependencies: color-name "1.1.3" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@^1.0.0: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.4.tgz#dd51cd25cfee953d138fe4002372cc3d0e504cb6" - integrity sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw== + version "1.5.5" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.5.tgz#65474a8f0e7439625f3d27a6a19d89fc45223014" + integrity sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" -color@^3.0.0: +color@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e" integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ== @@ -237,40 +282,53 @@ color@^3.0.0: color-convert "^1.9.1" color-string "^1.5.4" -colorette@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" - integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== +colorette@^1.2.1, colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== -concurrently@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-5.3.0.tgz#7500de6410d043c912b2da27de3202cb489b1e7b" - integrity sha512-8MhqOB6PWlBfA2vJ8a0bSFKATOdWlHiQlk11IfmQBPaHVP8oP2gsh2MObE6UR3hqDHqvaIvLTyceNW6obVuFHQ== +commander@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concurrently@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-6.0.2.tgz#4ecdfc78a72a6f626a3a5d3c2a7a81962f3663e3" + integrity sha512-u+1Q0dJG5BidgUTpz9CU16yoHTt/oApFDQ3mbvHwSDgMjU7aGqy0q8ZQyaZyaNxdwRKTD872Ux3Twc6//sWA+Q== dependencies: - chalk "^2.4.2" - date-fns "^2.0.1" - lodash "^4.17.15" - read-pkg "^4.0.1" - rxjs "^6.5.2" + chalk "^4.1.0" + date-fns "^2.16.1" + lodash "^4.17.21" + read-pkg "^5.2.0" + rxjs "^6.6.3" spawn-command "^0.0.2-1" - supports-color "^6.1.0" + supports-color "^8.1.0" tree-kill "^1.2.2" - yargs "^13.3.0" + yargs "^16.2.0" -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cosmiconfig@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== +convert-source-map@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" + safe-buffer "~5.1.1" + +cosmiconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" css-blank-pseudo@^0.1.4: version "0.1.4" @@ -279,17 +337,21 @@ css-blank-pseudo@^0.1.4: dependencies: postcss "^7.0.5" -css-color-names@0.0.4, css-color-names@^0.0.4: +css-color-names@^0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= -css-declaration-sorter@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" - integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== +css-color-names@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-1.0.1.tgz#6ff7ee81a823ad46e020fa2fd6ab40a887e2ba67" + integrity sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA== + +css-declaration-sorter@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.0.0.tgz#eb21f75860078627e9e3cc6f5535ccfcea445817" + integrity sha512-S0TE4E0ha5+tBHdLWPc5n+S8E4dFBS5xScPvgHkLNZwWvX4ISoFGhGeerLC9uS1cKA/sC+K2wHq6qEbcagT/fg== dependencies: - postcss "^7.0.1" timsort "^0.3.0" css-has-pseudo@^0.10.0: @@ -307,41 +369,29 @@ css-prefers-color-scheme@^3.1.1: dependencies: postcss "^7.0.5" -css-select-base-adapter@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" - integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== - -css-select@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" - integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== +css-select@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-3.1.2.tgz#d52cbdc6fee379fba97fb0d3925abbd18af2d9d8" + integrity sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA== dependencies: boolbase "^1.0.0" - css-what "^3.2.1" - domutils "^1.7.0" - nth-check "^1.0.2" - -css-tree@1.0.0-alpha.37: - version "1.0.0-alpha.37" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" - integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== - dependencies: - mdn-data "2.0.4" - source-map "^0.6.1" + css-what "^4.0.0" + domhandler "^4.0.0" + domutils "^2.4.3" + nth-check "^2.0.0" css-tree@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz#9ae393b5dafd7dae8a622475caec78d3d8fbd7b5" - integrity sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ== + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== dependencies: mdn-data "2.0.14" source-map "^0.6.1" -css-what@^3.2.1: - version "3.4.2" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" - integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== +css-what@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-4.0.0.tgz#35e73761cab2eeb3d3661126b23d7aa0e8432233" + integrity sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A== cssdb@^4.4.0: version "4.4.0" @@ -358,123 +408,96 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" - integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== +cssnano-preset-default@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.0.0.tgz#94c03ecc1cb47ecdc23c0aea3ca05170ebbb7e33" + integrity sha512-zsLppqF7PxY6Tk+ghVx8djf4o1jIOu2GNufqy9lMxldt7gGpSy3FQ6jn7FCd5DZWCaBa7A/1/HVh8CK3BdFSJg== dependencies: - css-declaration-sorter "^4.0.1" - cssnano-util-raw-cache "^4.0.1" - postcss "^7.0.0" - postcss-calc "^7.0.1" - postcss-colormin "^4.0.3" - postcss-convert-values "^4.0.1" - postcss-discard-comments "^4.0.2" - postcss-discard-duplicates "^4.0.2" - postcss-discard-empty "^4.0.1" - postcss-discard-overridden "^4.0.1" - postcss-merge-longhand "^4.0.11" - postcss-merge-rules "^4.0.3" - postcss-minify-font-values "^4.0.2" - postcss-minify-gradients "^4.0.2" - postcss-minify-params "^4.0.2" - postcss-minify-selectors "^4.0.2" - postcss-normalize-charset "^4.0.1" - postcss-normalize-display-values "^4.0.2" - postcss-normalize-positions "^4.0.2" - postcss-normalize-repeat-style "^4.0.2" - postcss-normalize-string "^4.0.2" - postcss-normalize-timing-functions "^4.0.2" - postcss-normalize-unicode "^4.0.1" - postcss-normalize-url "^4.0.1" - postcss-normalize-whitespace "^4.0.2" - postcss-ordered-values "^4.1.2" - postcss-reduce-initial "^4.0.3" - postcss-reduce-transforms "^4.0.2" - postcss-svgo "^4.0.2" - postcss-unique-selectors "^4.0.1" + css-declaration-sorter "6.0.0" + cssnano-utils "^2.0.0" + postcss-calc "^8.0.0" + postcss-colormin "^5.0.0" + postcss-convert-values "^5.0.0" + postcss-discard-comments "^5.0.0" + postcss-discard-duplicates "^5.0.0" + postcss-discard-empty "^5.0.0" + postcss-discard-overridden "^5.0.0" + postcss-merge-longhand "^5.0.0" + postcss-merge-rules "^5.0.0" + postcss-minify-font-values "^5.0.0" + postcss-minify-gradients "^5.0.0" + postcss-minify-params "^5.0.0" + postcss-minify-selectors "^5.0.0" + postcss-normalize-charset "^5.0.0" + postcss-normalize-display-values "^5.0.0" + postcss-normalize-positions "^5.0.0" + postcss-normalize-repeat-style "^5.0.0" + postcss-normalize-string "^5.0.0" + postcss-normalize-timing-functions "^5.0.0" + postcss-normalize-unicode "^5.0.0" + postcss-normalize-url "^5.0.0" + postcss-normalize-whitespace "^5.0.0" + postcss-ordered-values "^5.0.0" + postcss-reduce-initial "^5.0.0" + postcss-reduce-transforms "^5.0.0" + postcss-svgo "^5.0.0" + postcss-unique-selectors "^5.0.0" -cssnano-util-get-arguments@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" - integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= +cssnano-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-2.0.0.tgz#b04baaa312aa3dd5a854b7f61d76b9d94be07f74" + integrity sha512-xvxmTszdrvSyTACdPe8VU5J6p4sm3egpgw54dILvNqt5eBUv6TFjACLhSxtRuEsxYrgy8uDy269YjScO5aKbGA== -cssnano-util-get-match@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" - integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= - -cssnano-util-raw-cache@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" - integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== +cssnano@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.1.tgz#ed4822c4a9212f22f6820717859c52a6b7f9cf5c" + integrity sha512-5WubEmKcK2cqw43DUAayRBiIlTdX7iX3ZowrWDVxSVcW3hyohVnbJ4K4mbnWtJp5rfJnUwHg5H4mDAGzmuCM3g== dependencies: - postcss "^7.0.0" + cosmiconfig "^7.0.0" + cssnano-preset-default "^5.0.0" + is-resolvable "^1.1.0" -cssnano-util-same-parent@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" - integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== - -cssnano@^4.1.10: - version "4.1.10" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" - integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== - dependencies: - cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.7" - is-resolvable "^1.0.0" - postcss "^7.0.0" - -csso@^4.0.2: +csso@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== dependencies: css-tree "^1.1.2" -date-fns@^2.0.1: - version "2.17.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.17.0.tgz#afa55daea539239db0a64e236ce716ef3d681ba1" - integrity sha512-ZEhqxUtEZeGgg9eHNSOAJ8O9xqSgiJdrL0lzSSfMF54x6KXWJiOH/xntSJ9YomJPrYH/p08t6gWjGWq1SDJlSA== +date-fns@^2.16.1: + version "2.21.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.21.1.tgz#679a4ccaa584c0706ea70b3fa92262ac3009d2b0" + integrity sha512-m1WR0xGiC6j6jNFAyW4Nvh4WxAi4JF4w9jRJwSI8nBmNcyZXPcP9VUQG+6gHQXAmqaGEKDKhOqAtENDC941UkA== -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -dom-serializer@0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== +dom-serializer@^1.0.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.1.tgz#d845a1565d7c041a95e5dab62184ab41e3a519be" + integrity sha512-Pv2ZluG5ife96udGgEDovOOOA5UELkltfJpnIExPrAk1LTvecolUGn6lIaoLh86d83GiB86CjzciMd9BuRB71Q== dependencies: domelementtype "^2.0.1" + domhandler "^4.0.0" entities "^2.0.0" -domelementtype@1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== -domelementtype@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" - integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== - -domutils@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== +domhandler@^4.0.0, domhandler@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz#f9768a5f034be60a89a27c2e4d0f74eba0d8b059" + integrity sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA== dependencies: - dom-serializer "0" - domelementtype "1" + domelementtype "^2.2.0" + +domutils@^2.4.3: + version "2.6.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.6.0.tgz#2e15c04185d43fb16ae7057cb76433c6edb938b7" + integrity sha512-y0BezHuy4MDYxh6OvolXYsH+1EMGmFbwv5FKW7ovwMG6zTPWqNPq3WF9ayZssFq+UlKdffGLbOEaghNdaOm1WA== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" dot-prop@^5.2.0: version "5.3.0" @@ -483,15 +506,15 @@ dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" -electron-to-chromium@^1.3.649: - version "1.3.667" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.667.tgz#18ca4f243ec163c3e354e506ba22ef46d31d925e" - integrity sha512-Ot1pPtAVb5nd7jeVF651zmfLFilRVFomlDzwXmdlWe5jyzOGa6mVsQ06XnAurT7wWfg5VEIY+LopbAdD/bpo5w== +electron-to-chromium@^1.3.719: + version "1.3.720" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.720.tgz#f5d66df8754d993006b7b2ded15ff7738c58bd94" + integrity sha512-B6zLTxxaOFP4WZm6DrvgRk8kLFYWNhQ5TrHMC0l5WtkMXhU5UbnvWoTfeEwqOruUSlNMhVLfYak7REX6oC5Yfw== -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== entities@^2.0.0: version "2.2.0" @@ -505,52 +528,6 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.2: - version "1.17.7" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" - integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-regex "^1.1.1" - object-inspect "^1.8.0" - object-keys "^1.1.1" - object.assign "^4.1.1" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-abstract@^1.18.0-next.1: - version "1.18.0-next.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz#088101a55f0541f595e7e057199e27ddc8f3a5c2" - integrity sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-negative-zero "^2.0.1" - is-regex "^1.1.1" - object-inspect "^1.9.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.3" - string.prototype.trimstart "^1.0.3" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -561,16 +538,6 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -estree-walker@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.1.tgz#f8e030fb21cefa183b44b7ad516b747434e7a3e0" - integrity sha512-tF0hv+Yi2Ot1cwj9eYHtxC0jB9bmjacjQs6ZBTj82H8JwUywFuc+7E83NWfNMwHXZc11mjfFcVXPe9gEP4B8dg== - exec-sh@^0.2.0: version "0.2.2" resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" @@ -578,94 +545,49 @@ exec-sh@^0.2.0: dependencies: merge "^1.2.0" -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - flatten@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== -fsevents@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -get-caller-file@^2.0.1: +get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== +glob@^7.1.3: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -google-closure-compiler-java@^20200517.0.0: - version "20200517.0.0" - resolved "https://registry.yarnpkg.com/google-closure-compiler-java/-/google-closure-compiler-java-20200517.0.0.tgz#778370c22273c9085f4cf959ce063f8f112c02ac" - integrity sha512-JVZBiyyXwcYi6Yc3lO6dF2hMLJA4OzPm4/mgsem/tF1vk2HsWTnL3GTaBsPB2ENVZp0hoqsd4KgpPiG9ssNWxw== - -google-closure-compiler-js@^20200517.0.0: - version "20200517.0.0" - resolved "https://registry.yarnpkg.com/google-closure-compiler-js/-/google-closure-compiler-js-20200517.0.0.tgz#9cb0861f764073d1c4d3b7453b74073ccb1ecfb1" - integrity sha512-dz6dOUHx5nhdIqMRXacAYS8aJfLvw4IKxGg28Hq/zeeDPHlX3P3iBK20NgFDfT8zdushThymtMqChSy7C5eyfA== - -google-closure-compiler-linux@^20200517.0.0: - version "20200517.0.0" - resolved "https://registry.yarnpkg.com/google-closure-compiler-linux/-/google-closure-compiler-linux-20200517.0.0.tgz#2b9ecb634130060174aff5c52329a694ea4be68b" - integrity sha512-S5xPh6TtP+ESzZrmQLcDDqtZAsCVTbdI4VS98wQlN6IMZTd94nAnOCg9mrxQNAgop2t4sdsv/KuH0BGPUWEZ+w== - -google-closure-compiler-osx@^20200517.0.0: - version "20200517.0.0" - resolved "https://registry.yarnpkg.com/google-closure-compiler-osx/-/google-closure-compiler-osx-20200517.0.0.tgz#9394e9a2fd97e3729fc3bd2abcffff6aab2cfcaa" - integrity sha512-FWIcsKqLllLjdOBZd7azijVaObydgRd0obVNi63eUfC5MX6T4qxKumGCyor2UCNY6by2ESz+PlGqCFzFhZ6b2g== - -google-closure-compiler-windows@^20200517.0.0: - version "20200517.0.0" - resolved "https://registry.yarnpkg.com/google-closure-compiler-windows/-/google-closure-compiler-windows-20200517.0.0.tgz#c5cdde438c29458666a83358567b12072924ed6c" - integrity sha512-UXhjRGwS8deTkRla/riyVq3psscgMuw78lepEPtq5NgbumgJzY2+IQP9q+4MVOfJW58Rv0JUWKAFOnBBSZWcAQ== - -google-closure-compiler@20200517.0.0: - version "20200517.0.0" - resolved "https://registry.yarnpkg.com/google-closure-compiler/-/google-closure-compiler-20200517.0.0.tgz#6c47f99fc1be59bd4f9e23c5a8f2e66d64b54143" - integrity sha512-80W9zBS9Ajk1T5InWCfsoPohDmo5T1AAyw1rHh5+dgb/jPgwC65KhY+oJozTncf+/7tyQHJXozTARwhSlBUcMg== - dependencies: - chalk "2.x" - google-closure-compiler-java "^20200517.0.0" - google-closure-compiler-js "^20200517.0.0" - minimist "1.x" - vinyl "2.x" - vinyl-sourcemaps-apply "^0.2.0" - optionalDependencies: - google-closure-compiler-linux "^20200517.0.0" - google-closure-compiler-osx "^20200517.0.0" - google-closure-compiler-windows "^20200517.0.0" + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= -has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has@^1.0.0, has@^1.0.3: +has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== @@ -678,9 +600,9 @@ hex-color-regex@^1.1.0: integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== hsl-regex@^1.0.0: version "1.0.0" @@ -692,33 +614,36 @@ hsla-regex@^1.0.0: resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= -html-comment-regex@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" + parent-module "^1.0.0" + resolve-from "^4.0.0" indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= -inherits@^2.0.1, inherits@~2.0.3: +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== is-arrayish@^0.2.1: version "0.2.1" @@ -730,12 +655,7 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== -is-callable@^1.1.4, is-callable@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" - integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== - -is-color-stop@^1.0.0: +is-color-stop@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= @@ -754,164 +674,84 @@ is-core-module@^2.2.0: dependencies: has "^1.0.3" -is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-negative-zero@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-obj@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-regex@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" - integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== - dependencies: - call-bind "^1.0.2" - has-symbols "^1.0.1" - -is-resolvable@^1.0.0: +is-resolvable@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== -is-svg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" - integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== - dependencies: - html-comment-regex "^1.1.0" +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== - dependencies: - has-symbols "^1.0.1" +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.template@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.17.15: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== - -magic-string@0.25.7: - version "0.25.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" - integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== - dependencies: - sourcemap-codec "^1.4.4" +lodash@^4.17.11, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== mdn-data@2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== -mdn-data@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" - integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== - merge@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== -minimist@1.x, minimist@^1.2.0, minimist@^1.2.5: +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -mkdirp@~0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" +nanoid@^3.1.22: + version "3.1.22" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.22.tgz#b35f8fb7d151990a8aebd5aa5015c03cf726f844" + integrity sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ== -nanoid@^3.1.20: - version "3.1.20" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" - integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== +node-releases@^1.1.71: + version "1.1.71" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" + integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== -node-releases@^1.1.70: - version "1.1.70" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.70.tgz#66e0ed0273aa65666d7fe78febe7634875426a08" - integrity sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw== - -normalize-package-data@^2.3.2: +normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -926,109 +766,67 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= -normalize-url@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" - integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== +normalize-url@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" + integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== -nth-check@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== +nth-check@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.0.tgz#1bb4f6dac70072fc313e8c9cd1417b5074c0a125" + integrity sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q== dependencies: - boolbase "~1.0.0" + boolbase "^1.0.0" num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= -object-inspect@^1.8.0, object-inspect@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" - integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== - -object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.1, object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" + wrappy "1" -object.getownpropertydescriptors@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz#0dfda8d108074d9c563e80490c883b6661091544" - integrity sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng== +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" + callsites "^3.0.0" -object.values@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" - integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - has "^1.0.3" - -p-limit@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: + "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - postcss-attribute-case-insensitive@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" @@ -1037,12 +835,11 @@ postcss-attribute-case-insensitive@^4.0.1: postcss "^7.0.2" postcss-selector-parser "^6.0.2" -postcss-calc@^7.0.1: - version "7.0.5" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" - integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== +postcss-calc@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.0.0.tgz#a05b87aacd132740a5db09462a3612453e5df90a" + integrity sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g== dependencies: - postcss "^7.0.27" postcss-selector-parser "^6.0.2" postcss-value-parser "^4.0.2" @@ -1088,24 +885,21 @@ postcss-color-rebeccapurple@^4.0.1: postcss "^7.0.2" postcss-values-parser "^2.0.0" -postcss-colormin@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" - integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== +postcss-colormin@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.0.0.tgz#283b8934c8bdbc531e7648aeb0970107f6d06d0e" + integrity sha512-Yt84+5V6CgS/AhK7d7MA58vG8dSZ7+ytlRtWLaQhag3HXOncTfmYpuUOX4cDoXjvLfw1sHRCHMiBjYhc35CymQ== dependencies: - browserslist "^4.0.0" - color "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + browserslist "^4.16.0" + color "^3.1.1" + postcss-value-parser "^4.1.0" -postcss-convert-values@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" - integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== +postcss-convert-values@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.0.0.tgz#cd77e1d23ebe8fcf508640551eed08e232784cba" + integrity sha512-V5kmYm4xoBAjNs+eHY/6XzXJkkGeg4kwNf2ocfqhLb1WBPEa4oaSmoi1fnVO7Dkblqvus9h+AenDvhCKUCK7uQ== dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.1.0" postcss-custom-media@^7.0.8: version "7.0.8" @@ -1138,33 +932,25 @@ postcss-dir-pseudo-class@^5.0.0: postcss "^7.0.2" postcss-selector-parser "^5.0.0-rc.3" -postcss-discard-comments@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" - integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== - dependencies: - postcss "^7.0.0" +postcss-discard-comments@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.0.0.tgz#6c27310e0657c0b9e38a6175ad001b5aa28964bc" + integrity sha512-Umig6Gxs8m20RihiXY6QkePd6mp4FxkA1Dg+f/Kd6uw0gEMfKRjDeQOyFkLibexbJJGHpE3lrN/Q0R9SMrUMbQ== -postcss-discard-duplicates@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" - integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== - dependencies: - postcss "^7.0.0" +postcss-discard-duplicates@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.0.tgz#6a2c4f779e8d20da6781e90730f234f9e650c51c" + integrity sha512-vEJJ+Y3pFUnO1FyCBA6PSisGjHtnphL3V6GsNvkASq/VkP3OX5/No5RYXXLxHa2QegStNzg6HYrYdo71uR4caQ== -postcss-discard-empty@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" - integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== - dependencies: - postcss "^7.0.0" +postcss-discard-empty@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.0.0.tgz#0f0a9baee415f5f7be4ae046ba235e98626ba821" + integrity sha512-+wigy099Y1xZxG36WG5L1f2zeH1oicntkJEW4TDIqKKDO2g9XVB3OhoiHTu08rDEjLnbcab4rw0BAccwi2VjiQ== -postcss-discard-overridden@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" - integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== - dependencies: - postcss "^7.0.0" +postcss-discard-overridden@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.0.0.tgz#ac00f695a60001eda52135a11fac87376b8da9ee" + integrity sha512-hybnScTaZM2iEA6kzVQ6Spozy7kVdLw+lGw8hftLlBEzt93uzXoltkYp9u0tI8xbfhxDLTOOzHsHQCkYdmzRUg== postcss-double-position-gradients@^1.0.0: version "1.0.0" @@ -1219,20 +1005,19 @@ postcss-image-set-function@^3.0.1: postcss-values-parser "^2.0.0" postcss-import@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.0.0.tgz#3ed1dadac5a16650bde3f4cdea6633b9c3c78296" - integrity sha512-gFDDzXhqr9ELmnLHgCC3TbGfA6Dm/YMb/UN8/f7Uuq4fL7VTk2vOIj6hwINEwbokEmp123bLD7a5m+E+KIetRg== + version "14.0.1" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.0.1.tgz#6a3f8f2ce74a95fc7c72ecfe3eddfa0e9124e677" + integrity sha512-Xn2+z++vWObbEPhiiKO1a78JiyhqipyrXHBb3AHpv0ks7Cdg+GxQQJ24ODNMTanldf7197gSP3axppO9yaG0lA== dependencies: postcss-value-parser "^4.0.0" read-cache "^1.0.0" resolve "^1.1.7" postcss-initial@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz#f018563694b3c16ae8eaabe3c585ac6319637b2d" - integrity sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA== + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.4.tgz#9d32069a10531fe2ecafa0b6ac750ee0bc7efc53" + integrity sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg== dependencies: - lodash.template "^4.5.0" postcss "^7.0.2" postcss-lab-function@^2.0.1: @@ -1258,67 +1043,60 @@ postcss-media-minmax@^4.0.0: dependencies: postcss "^7.0.2" -postcss-merge-longhand@^4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" - integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== +postcss-merge-longhand@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.0.0.tgz#103dee28c55491df727f17d7b8e91e93e7a472ee" + integrity sha512-VZNFA40K8BYHzJNA6jHPdg1Nofsz/nK5Dkszrcb5IgWcLroSBZOD6I/iNQzpejSU/3XwpOiZNaYAdBV4KcvxWA== dependencies: - css-color-names "0.0.4" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - stylehacks "^4.0.0" + css-color-names "^1.0.1" + postcss-value-parser "^4.1.0" + stylehacks "^5.0.0" -postcss-merge-rules@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" - integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== +postcss-merge-rules@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.0.0.tgz#e0d0c0d45c98376f4adb49eb1f1dfe2aebfd7048" + integrity sha512-TfsXbKjNYCGfUPEXGIGPySnMiJbdS+3gcVeV8gwmJP4RajyKZHW8E0FYDL1WmggTj3hi+m+WUCAvqRpX2ut4Kg== dependencies: - browserslist "^4.0.0" + browserslist "^4.16.0" caniuse-api "^3.0.0" - cssnano-util-same-parent "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - vendors "^1.0.0" + cssnano-utils "^2.0.0" + postcss-selector-parser "^6.0.4" + vendors "^1.0.3" -postcss-minify-font-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" - integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== +postcss-minify-font-values@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.0.0.tgz#fee5d0fa192fae8757cb744870a0ad02be5f402e" + integrity sha512-zi2JhFaMOcIaNxhndX5uhsqSY1rexKDp23wV8EOmC9XERqzLbHsoRye3aYF716Zm+hkcR4loqKDt8LZlmihwAg== dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.1.0" -postcss-minify-gradients@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" - integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== +postcss-minify-gradients@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.0.0.tgz#95dbe61567a45c0cd7ab897d78fb65d5096844ed" + integrity sha512-/jPtNgs6JySMwgsE5dPOq8a2xEopWTW3RyqoB9fLqxgR+mDUNLSi7joKd+N1z7FXWgVkc4l/dEBMXHgNAaUbvg== dependencies: - cssnano-util-get-arguments "^4.0.0" - is-color-stop "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + cssnano-utils "^2.0.0" + is-color-stop "^1.1.0" + postcss-value-parser "^4.1.0" -postcss-minify-params@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" - integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== +postcss-minify-params@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.0.0.tgz#12c7f75d69b0b4827fafbd6649970a53784a9c24" + integrity sha512-KvZYIxTPBVKjdd+XgObq9A+Sfv8lMkXTpbZTsjhr42XbfWIeLaTItMlygsDWfjArEc3muUfDaUFgNSeDiJ5jug== dependencies: - alphanum-sort "^1.0.0" - browserslist "^4.0.0" - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + alphanum-sort "^1.0.2" + browserslist "^4.16.0" + cssnano-utils "^2.0.0" + postcss-value-parser "^4.1.0" uniqs "^2.0.0" -postcss-minify-selectors@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" - integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== +postcss-minify-selectors@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.0.0.tgz#d3e43d97fd0ba83ba0010950fc5acfa420f7caa9" + integrity sha512-cEM0O0eWwFIvmo6nfB0lH0vO/XFwgqIvymODbfPXZ1gTA3i76FKnb7TGUrEpiTxaXH6tgYQ6DcTHwRiRS+YQLQ== dependencies: - alphanum-sort "^1.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" + alphanum-sort "^1.0.2" + postcss-selector-parser "^3.1.2" postcss-nesting@^7.0.0: version "7.0.1" @@ -1327,95 +1105,80 @@ postcss-nesting@^7.0.0: dependencies: postcss "^7.0.2" -postcss-normalize-charset@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" - integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== - dependencies: - postcss "^7.0.0" +postcss-normalize-charset@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.0.0.tgz#59e1fe2094fb2e3371cc5b054cbc39828a41a710" + integrity sha512-pqsCkgo9KmQP0ew6DqSA+uP9YN6EfsW20pQ3JU5JoQge09Z6Too4qU0TNDsTNWuEaP8SWsMp+19l15210MsDZQ== -postcss-normalize-display-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" - integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== +postcss-normalize-display-values@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.0.tgz#4ff2d3b3b5146a366de28ec9e24131a1868f1933" + integrity sha512-t4f2d//gH1f7Ns0Jq3eNdnWuPT7TeLuISZ6RQx4j8gpl5XrhkdshdNcOnlrEK48YU6Tcb6jqK7dorME3N4oOGA== dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + cssnano-utils "^2.0.0" + postcss-value-parser "^4.1.0" -postcss-normalize-positions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" - integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== +postcss-normalize-positions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.0.0.tgz#fe1d9a8122dd385b9c6908bd2008140dea17750d" + integrity sha512-0o6/qU5ky74X/eWYj/tv4iiKCm3YqJnrhmVADpIMNXxzFZywsSQxl8F7cKs8jQEtF3VrJBgcDHTexZy1zgDoYg== dependencies: - cssnano-util-get-arguments "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.1.0" -postcss-normalize-repeat-style@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" - integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== +postcss-normalize-repeat-style@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.0.tgz#e11d88fbf63f89179c6a7391853b2fe7f46e589d" + integrity sha512-KRT14JbrXKcFMYuc4q7lh8lvv8u22wLyMrq+UpHKLtbx2H/LOjvWXYdoDxmNrrrJzomAWL+ViEXr48/IhSUJnQ== dependencies: - cssnano-util-get-arguments "^4.0.0" - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + cssnano-utils "^2.0.0" + postcss-value-parser "^4.1.0" -postcss-normalize-string@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" - integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== +postcss-normalize-string@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.0.0.tgz#2ea08ff4cb8817ce160755e9fdc7e6ef6d495002" + integrity sha512-wSO4pf7GNcDZpmelREWYADF1+XZWrAcbFLQCOqoE92ZwYgaP/RLumkUTaamEzdT2YKRZAH8eLLKGWotU/7FNPw== dependencies: - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.1.0" -postcss-normalize-timing-functions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" - integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== +postcss-normalize-timing-functions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.0.tgz#380eb1c9b179f96efc307c659a8049116f16f381" + integrity sha512-TwPaDX+wl9wO3MUm23lzGmOzGCGKnpk+rSDgzB2INpakD5dgWR3L6bJq1P1LQYzBAvz8fRIj2NWdnZdV4EV98Q== dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + cssnano-utils "^2.0.0" + postcss-value-parser "^4.1.0" -postcss-normalize-unicode@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" - integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== +postcss-normalize-unicode@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.0.tgz#aa46a89c86ae51a01cbca13e73c1ed7b0b38807e" + integrity sha512-2CpVoz/67rXU5s9tsPZDxG1YGS9OFHwoY9gsLAzrURrCxTAb0H7Vp87/62LvVPgRWTa5ZmvgmqTp2rL8tlm72A== dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + browserslist "^4.16.0" + postcss-value-parser "^4.1.0" -postcss-normalize-url@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" - integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== +postcss-normalize-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.0.0.tgz#626a4c7d30007f94466cdf245e7ed9f253f1dbd9" + integrity sha512-ICDaGFBqLgA3dlrCIRuhblLl80D13YtgEV9NJPTYJtgR72vu61KgxAHv+z/lKMs1EbwfSQa3ALjOFLSmXiE34A== dependencies: - is-absolute-url "^2.0.0" - normalize-url "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + is-absolute-url "^3.0.3" + normalize-url "^4.5.0" + postcss-value-parser "^4.1.0" -postcss-normalize-whitespace@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" - integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== +postcss-normalize-whitespace@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.0.tgz#1faf147a4f8d3d93a3c75109d120b4eefa00589b" + integrity sha512-KRnxQvQAVkJfaeXSz7JlnD9nBN9sFZF9lrk9452Q2uRoqrRSkinqifF8Iex7wZGei2DZVG/qpmDFDmRvbNAOGA== dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.1.0" -postcss-ordered-values@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" - integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== +postcss-ordered-values@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.0.0.tgz#a50f224c5f40c566b338b0663655478737dcebee" + integrity sha512-dPr+SRObiHueCIc4IUaG0aOGQmYkuNu50wQvdXTGKy+rzi2mjmPsbeDsheLk5WPb9Zyf2tp8E+I+h40cnivm6g== dependencies: - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + cssnano-utils "^2.0.0" + postcss-value-parser "^4.1.0" postcss-overflow-shorthand@^2.0.0: version "2.0.0" @@ -1490,25 +1253,21 @@ postcss-pseudo-class-any-link@^6.0.0: postcss "^7.0.2" postcss-selector-parser "^5.0.0-rc.3" -postcss-reduce-initial@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" - integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== +postcss-reduce-initial@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.0.0.tgz#c724e5513b0ae7f3d7bff16f0fc82133fb2f820a" + integrity sha512-wR6pXUaFbSMG1oCKx8pKVA+rnSXCHlca5jMrlmkmif+uig0HNUTV9oGN5kjKsM3mATQAldv2PF9Tbl2vqLFjnA== dependencies: - browserslist "^4.0.0" + browserslist "^4.16.0" caniuse-api "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" -postcss-reduce-transforms@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" - integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== +postcss-reduce-transforms@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.0.tgz#5c820f71fbd4eec82b323523642b7b2d1c7d29ef" + integrity sha512-iHdGODW4YzM3WjVecBhPQt6fpJC4lGQZxJKjkBNHpp2b8dzmvj0ogKThqya+IRodQEFzjfXgYeESkf172FH5Lw== dependencies: - cssnano-util-get-match "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + cssnano-utils "^2.0.0" + postcss-value-parser "^4.1.0" postcss-replace-overflow-wrap@^3.0.0: version "3.0.0" @@ -1533,7 +1292,7 @@ postcss-selector-not@^4.0.0: balanced-match "^1.0.0" postcss "^7.0.2" -postcss-selector-parser@^3.0.0: +postcss-selector-parser@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== @@ -1551,40 +1310,31 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-selector-parser@^6.0.2: - version "6.0.4" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" - integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + version "6.0.5" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.5.tgz#042d74e137db83e6f294712096cb413f5aa612c4" + integrity sha512-aFYPoYmXbZ1V6HZaSvat08M97A8HqO6Pjz+PiNpw/DhuRrC72XWAdp3hL6wusDCN31sSmcZyMGa2hZEuX+Xfhg== dependencies: cssesc "^3.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" util-deprecate "^1.0.2" -postcss-svgo@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" - integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== +postcss-svgo@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.0.0.tgz#c8d806e573394ab24f1e233cac5be4c199e9f1b2" + integrity sha512-M3/VS4sFI1Yp9g0bPL+xzzCNz5iLdRUztoFaugMit5a8sMfkVzzhwqbsOlD8IFFymCdJDmXmh31waYHWw1K4BA== dependencies: - is-svg "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - svgo "^1.0.0" + postcss-value-parser "^4.1.0" + svgo "^2.3.0" -postcss-unique-selectors@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" - integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== +postcss-unique-selectors@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.0.0.tgz#17856278f6c38d024defc9694d568bb09dd7f771" + integrity sha512-o9l4pF8SRn7aCMTmzb/kNv/kjV7wPZpZ8Nlb1Gq8v/Qvw969K1wanz1RVA0ehHzWe9+wHXaC2DvZlak/gdMJ5w== dependencies: - alphanum-sort "^1.0.0" - postcss "^7.0.0" + alphanum-sort "^1.0.2" + postcss-selector-parser "^6.0.2" uniqs "^2.0.0" -postcss-value-parser@^3.0.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== - postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" @@ -1599,7 +1349,7 @@ postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: indexes-of "^1.0.1" uniq "^1.0.1" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: +postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: version "7.0.35" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== @@ -1609,24 +1359,14 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2 supports-color "^6.1.0" postcss@^8.2.6: - version "8.2.6" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.6.tgz#5d69a974543b45f87e464bc4c3e392a97d6be9fe" - integrity sha512-xpB8qYxgPuly166AGlpRjUdEYtmOWx2iCwGmrv4vqZL9YPVviDVPZPRXxnXr6xPZOdxQ9lp3ZBFCRgWJ7LE3Sg== + version "8.2.12" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.12.tgz#81248a1a87e0f575cc594a99a08207fd1c4addc4" + integrity sha512-BJnGT5+0q2tzvs6oQfnY2NpEJ7rIXNfBnZtQOKCIsweeWXBXeDd5k31UgTdS3d/c02ouspufn37mTaHWkJyzMQ== dependencies: - colorette "^1.2.1" - nanoid "^3.1.20" + colorette "^1.2.2" + nanoid "^3.1.22" source-map "^0.6.1" -process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - read-cache@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" @@ -1634,52 +1374,25 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" -read-pkg@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" - integrity sha1-ljYlN48+HE1IyFhytabsfV0JMjc= +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== dependencies: - normalize-package-data "^2.3.2" - parse-json "^4.0.0" - pify "^3.0.0" - -readable-stream@^2.3.5: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -replace-ext@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a" - integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw== + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve@^1.1.7, resolve@^1.10.0: version "1.20.0" @@ -1699,40 +1412,23 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= -rollup@^2.4.0: - version "2.39.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.39.0.tgz#be4f98c9e421793a8fec82c854fb567c35e22ab6" - integrity sha512-+WR3bttcq7zE+BntH09UxaW3bQo3vItuYeLsyk4dL2tuwbeSKJuvwiawyhEnvRdRgrII0Uzk00FpctHO/zB1kw== - optionalDependencies: - fsevents "~2.3.1" - -rxjs@^6.5.2: - version "6.6.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" - integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== +rxjs@^6.6.3: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" -safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -sax@~1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - "semver@2 || 3 || 4 || 5": version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -1740,20 +1436,20 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" -source-map@^0.5.1: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= +slash@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== source-map@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -sourcemap-codec@1.4.8, sourcemap-codec@^1.4.4: - version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== +source-map@^0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== spawn-command@^0.0.2-1: version "0.0.2-1" @@ -1786,63 +1482,34 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" -string.prototype.trimend@^1.0.1, string.prototype.trimend@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" - integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" + ansi-regex "^5.0.0" -string.prototype.trimstart@^1.0.1, string.prototype.trimstart@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" - integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== +stylehacks@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.0.0.tgz#c49b0b2cf9917fe37dc030b96a4c34698b932933" + integrity sha512-QOWm6XivDLb+fqffTZP8jrmPmPITVChl2KCY2R05nsCWwLi3VGhCdVc3IVGNwd1zzTt1jPd67zIKjpQfxzQZeA== dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -stylehacks@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" - integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== - dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" + browserslist "^4.16.0" + postcss-selector-parser "^6.0.4" supports-color@^5.3.0: version "5.5.0" @@ -1858,24 +1525,32 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" -svgo@^1.0.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" - integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: - chalk "^2.4.1" - coa "^2.0.2" - css-select "^2.0.0" - css-select-base-adapter "^0.1.1" - css-tree "1.0.0-alpha.37" - csso "^4.0.2" - js-yaml "^3.13.1" - mkdirp "~0.5.1" - object.values "^1.1.0" - sax "~1.2.4" + has-flag "^4.0.0" + +supports-color@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +svgo@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.3.0.tgz#6b3af81d0cbd1e19c83f5f63cec2cb98c70b5373" + integrity sha512-fz4IKjNO6HDPgIQxu4IxwtubtbSfGEAJUq/IXyTPIkGhWck/faiiwfkvsB8LnBkKLvSoyNNIY6d13lZprJMc9Q== + dependencies: + "@trysound/sax" "0.1.1" + chalk "^4.1.0" + commander "^7.1.0" + css-select "^3.1.2" + css-tree "^1.1.2" + csso "^4.2.0" stable "^0.1.8" - unquote "~1.1.1" - util.promisify "~1.0.0" timsort@^0.3.0: version "0.3.0" @@ -1892,6 +1567,16 @@ tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" + integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + uniq@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" @@ -1902,31 +1587,11 @@ uniqs@^2.0.0: resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= - -util-deprecate@^1.0.2, util-deprecate@~1.0.1: +util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util.promisify@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" - integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.2" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.0" - -uuid@8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.1.0.tgz#6f1536eb43249f473abc6bd58ff983da1ca30d8d" - integrity sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg== - validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -1935,30 +1600,11 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -vendors@^1.0.0: +vendors@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== -vinyl-sourcemaps-apply@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" - integrity sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU= - dependencies: - source-map "^0.5.1" - -vinyl@2.x: - version "2.2.1" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.1.tgz#23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974" - integrity sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw== - dependencies: - clone "^2.1.1" - clone-buffer "^1.0.0" - clone-stats "^1.0.0" - cloneable-readable "^1.0.0" - remove-trailing-separator "^1.0.1" - replace-ext "^1.0.0" - watch@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/watch/-/watch-1.0.2.tgz#340a717bde765726fa0aa07d721e0147a551df0c" @@ -1967,45 +1613,44 @@ watch@^1.0.2: exec-sh "^0.2.0" minimist "^1.2.0" -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" -y18n@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" - integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^20.2.2: + version "20.2.7" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" + integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs@^13.3.0: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" diff --git a/public/es/anon.js b/public/es/anon.js deleted file mode 100644 index 2a208588..00000000 --- a/public/es/anon.js +++ /dev/null @@ -1,463 +0,0 @@ -// ------------------------------------------------------------------------- -// ! Base -// ------------------------------------------------------------------------- - -const matches = (elm, selector) => { - let m = (elm.document || elm.ownerDocument).querySelectorAll(selector); - let i = matches.length; - while (--i >= 0 && m.item(i) !== elm) {} return i > -1; -}; - -const AnimeClient = { - /** - * Placeholder function - */ - noop: () => {}, - /** - * DOM selector - * - * @param {string} selector - The dom selector string - * @param {object} [context] - * @return {[HTMLElement]} - array of dom elements - */ - $(selector, context = null) { - if (typeof selector !== 'string') { - return selector; - } - - context = (context !== null && context.nodeType === 1) - ? context - : document; - - let elements = []; - if (selector.match(/^#([\w]+$)/)) { - elements.push(document.getElementById(selector.split('#')[1])); - } else { - elements = [].slice.apply(context.querySelectorAll(selector)); - } - - return elements; - }, - /** - * Does the selector exist on the current page? - * - * @param {string} selector - * @returns {boolean} - */ - hasElement (selector) { - return AnimeClient.$(selector).length > 0; - }, - /** - * Scroll to the top of the Page - * - * @return {void} - */ - scrollToTop () { - const el = AnimeClient.$('header')[0]; - el.scrollIntoView(true); - }, - /** - * Hide the selected element - * - * @param {string|Element} sel - the selector of the element to hide - * @return {void} - */ - hide (sel) { - if (typeof sel === 'string') { - sel = AnimeClient.$(sel); - } - - if (Array.isArray(sel)) { - sel.forEach(el => el.setAttribute('hidden', 'hidden')); - } else { - sel.setAttribute('hidden', 'hidden'); - } - }, - /** - * UnHide the selected element - * - * @param {string|Element} sel - the selector of the element to hide - * @return {void} - */ - show (sel) { - if (typeof sel === 'string') { - sel = AnimeClient.$(sel); - } - - if (Array.isArray(sel)) { - sel.forEach(el => el.removeAttribute('hidden')); - } else { - sel.removeAttribute('hidden'); - } - }, - /** - * Display a message box - * - * @param {string} type - message type: info, error, success - * @param {string} message - the message itself - * @return {void} - */ - showMessage (type, message) { - let template = - `
- - ${message} - -
`; - - let sel = AnimeClient.$('.message'); - if (sel[0] !== undefined) { - sel[0].remove(); - } - - AnimeClient.$('header')[0].insertAdjacentHTML('beforeend', template); - }, - /** - * Finds the closest parent element matching the passed selector - * - * @param {HTMLElement} current - the current HTMLElement - * @param {string} parentSelector - selector for the parent element - * @return {HTMLElement|null} - the parent element - */ - closestParent (current, parentSelector) { - if (Element.prototype.closest !== undefined) { - return current.closest(parentSelector); - } - - while (current !== document.documentElement) { - if (matches(current, parentSelector)) { - return current; - } - - current = current.parentElement; - } - - return null; - }, - /** - * Generate a full url from a relative path - * - * @param {string} path - url path - * @return {string} - full url - */ - url (path) { - let uri = `//${document.location.host}`; - uri += (path.charAt(0) === '/') ? path : `/${path}`; - - return uri; - }, - /** - * Throttle execution of a function - * - * @see https://remysharp.com/2010/07/21/throttling-function-calls - * @see https://jsfiddle.net/jonathansampson/m7G64/ - * @param {Number} interval - the minimum throttle time in ms - * @param {Function} fn - the function to throttle - * @param {Object} [scope] - the 'this' object for the function - * @return {Function} - */ - throttle (interval, fn, scope) { - let wait = false; - return function (...args) { - const context = scope || this; - - if ( ! wait) { - fn.apply(context, args); - wait = true; - setTimeout(function() { - wait = false; - }, interval); - } - }; - }, -}; - -// ------------------------------------------------------------------------- -// ! Events -// ------------------------------------------------------------------------- - -function addEvent(sel, event, listener) { - // Recurse! - if (! event.match(/^([\w\-]+)$/)) { - event.split(' ').forEach((evt) => { - addEvent(sel, evt, listener); - }); - } - - sel.addEventListener(event, listener, false); -} - -function delegateEvent(sel, target, event, listener) { - // Attach the listener to the parent - addEvent(sel, event, (e) => { - // Get live version of the target selector - AnimeClient.$(target, sel).forEach((element) => { - if(e.target == element) { - listener.call(element, e); - e.stopPropagation(); - } - }); - }); -} - -/** - * Add an event listener - * - * @param {string|HTMLElement} sel - the parent selector to bind to - * @param {string} event - event name(s) to bind - * @param {string|HTMLElement|function} target - the element to directly bind the event to - * @param {function} [listener] - event listener callback - * @return {void} - */ -AnimeClient.on = (sel, event, target, listener) => { - if (listener === undefined) { - listener = target; - AnimeClient.$(sel).forEach((el) => { - addEvent(el, event, listener); - }); - } else { - AnimeClient.$(sel).forEach((el) => { - delegateEvent(el, target, event, listener); - }); - } -}; - -// ------------------------------------------------------------------------- -// ! Ajax -// ------------------------------------------------------------------------- - -/** - * Url encoding for non-get requests - * - * @param data - * @returns {string} - * @private - */ -function ajaxSerialize(data) { - let pairs = []; - - Object.keys(data).forEach((name) => { - let value = data[name].toString(); - - name = encodeURIComponent(name); - value = encodeURIComponent(value); - - pairs.push(`${name}=${value}`); - }); - - return pairs.join('&'); -} - -/** - * Make an ajax request - * - * Config:{ - * data: // data to send with the request - * type: // http verb of the request, defaults to GET - * success: // success callback - * error: // error callback - * } - * - * @param {string} url - the url to request - * @param {Object} config - the configuration object - * @return {XMLHttpRequest} - */ -AnimeClient.ajax = (url, config) => { - // Set some sane defaults - const defaultConfig = { - data: {}, - type: 'GET', - dataType: '', - success: AnimeClient.noop, - mimeType: 'application/x-www-form-urlencoded', - error: AnimeClient.noop - }; - - config = { - ...defaultConfig, - ...config, - }; - - let request = new XMLHttpRequest(); - let method = String(config.type).toUpperCase(); - - if (method === 'GET') { - url += (url.match(/\?/)) - ? ajaxSerialize(config.data) - : `?${ajaxSerialize(config.data)}`; - } - - request.open(method, url); - - request.onreadystatechange = () => { - if (request.readyState === 4) { - let responseText = ''; - - if (request.responseType === 'json') { - responseText = JSON.parse(request.responseText); - } else { - responseText = request.responseText; - } - - if (request.status > 299) { - config.error.call(null, request.status, responseText, request.response); - } else { - config.success.call(null, responseText, request.status); - } - } - }; - - if (config.dataType === 'json') { - config.data = JSON.stringify(config.data); - config.mimeType = 'application/json'; - } else { - config.data = ajaxSerialize(config.data); - } - - request.setRequestHeader('Content-Type', config.mimeType); - - if (method === 'GET') { - request.send(null); - } else { - request.send(config.data); - } - - return request -}; - -/** - * Do a get request - * - * @param {string} url - * @param {object|function} data - * @param {function} [callback] - * @return {XMLHttpRequest} - */ -AnimeClient.get = (url, data, callback = null) => { - if (callback === null) { - callback = data; - data = {}; - } - - return AnimeClient.ajax(url, { - data, - success: callback - }); -}; - -// ---------------------------------------------------------------------------- -// Event subscriptions -// ---------------------------------------------------------------------------- -AnimeClient.on('header', 'click', '.message', hide); -AnimeClient.on('form.js-delete', 'submit', confirmDelete); -AnimeClient.on('.js-clear-cache', 'click', clearAPICache); -AnimeClient.on('.vertical-tabs input', 'change', scrollToSection); -AnimeClient.on('.media-filter', 'input', filterMedia); - -// ---------------------------------------------------------------------------- -// Handler functions -// ---------------------------------------------------------------------------- - -/** - * Hide the html element attached to the event - * - * @param event - * @return void - */ -function hide (event) { - AnimeClient.hide(event.target); -} - -/** - * Confirm deletion of an item - * - * @param event - * @return void - */ -function confirmDelete (event) { - const proceed = confirm('Are you ABSOLUTELY SURE you want to delete this item?'); - - if (proceed === false) { - event.preventDefault(); - event.stopPropagation(); - } -} - -/** - * Clear the API cache, and show a message if the cache is cleared - * - * @return void - */ -function clearAPICache () { - AnimeClient.get('/cache_purge', () => { - AnimeClient.showMessage('success', 'Successfully purged api cache'); - }); -} - -/** - * Scroll to the accordion/vertical tab section just opened - * - * @param event - * @return void - */ -function scrollToSection (event) { - const el = event.currentTarget.parentElement; - const rect = el.getBoundingClientRect(); - - const top = rect.top + window.pageYOffset; - - window.scrollTo({ - top, - behavior: 'smooth', - }); -} - -/** - * Filter an anime or manga list - * - * @param event - * @return void - */ -function filterMedia (event) { - const rawFilter = event.target.value; - const filter = new RegExp(rawFilter, 'i'); - - // console.log('Filtering items by: ', filter); - - if (rawFilter !== '') { - // Filter the cover view - AnimeClient.$('article.media').forEach(article => { - const titleLink = AnimeClient.$('.name a', article)[0]; - const title = String(titleLink.textContent).trim(); - if ( ! filter.test(title)) { - AnimeClient.hide(article); - } else { - AnimeClient.show(article); - } - }); - - // Filter the list view - AnimeClient.$('table.media-wrap tbody tr').forEach(tr => { - const titleCell = AnimeClient.$('td.align-left', tr)[0]; - const titleLink = AnimeClient.$('a', titleCell)[0]; - const linkTitle = String(titleLink.textContent).trim(); - const textTitle = String(titleCell.textContent).trim(); - if ( ! (filter.test(linkTitle) || filter.test(textTitle))) { - AnimeClient.hide(tr); - } else { - AnimeClient.show(tr); - } - }); - } else { - AnimeClient.show('article.media'); - AnimeClient.show('table.media-wrap tbody tr'); - } -} - -if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js').then(reg => { - console.log('Service worker registered', reg.scope); - }).catch(error => { - console.error('Failed to register service worker', error); - }); -} diff --git a/public/es/scripts.js b/public/es/scripts.js deleted file mode 100644 index 97d2067d..00000000 --- a/public/es/scripts.js +++ /dev/null @@ -1,768 +0,0 @@ -// ------------------------------------------------------------------------- -// ! Base -// ------------------------------------------------------------------------- - -const matches = (elm, selector) => { - let m = (elm.document || elm.ownerDocument).querySelectorAll(selector); - let i = matches.length; - while (--i >= 0 && m.item(i) !== elm) {} return i > -1; -}; - -const AnimeClient = { - /** - * Placeholder function - */ - noop: () => {}, - /** - * DOM selector - * - * @param {string} selector - The dom selector string - * @param {object} [context] - * @return {[HTMLElement]} - array of dom elements - */ - $(selector, context = null) { - if (typeof selector !== 'string') { - return selector; - } - - context = (context !== null && context.nodeType === 1) - ? context - : document; - - let elements = []; - if (selector.match(/^#([\w]+$)/)) { - elements.push(document.getElementById(selector.split('#')[1])); - } else { - elements = [].slice.apply(context.querySelectorAll(selector)); - } - - return elements; - }, - /** - * Does the selector exist on the current page? - * - * @param {string} selector - * @returns {boolean} - */ - hasElement (selector) { - return AnimeClient.$(selector).length > 0; - }, - /** - * Scroll to the top of the Page - * - * @return {void} - */ - scrollToTop () { - const el = AnimeClient.$('header')[0]; - el.scrollIntoView(true); - }, - /** - * Hide the selected element - * - * @param {string|Element} sel - the selector of the element to hide - * @return {void} - */ - hide (sel) { - if (typeof sel === 'string') { - sel = AnimeClient.$(sel); - } - - if (Array.isArray(sel)) { - sel.forEach(el => el.setAttribute('hidden', 'hidden')); - } else { - sel.setAttribute('hidden', 'hidden'); - } - }, - /** - * UnHide the selected element - * - * @param {string|Element} sel - the selector of the element to hide - * @return {void} - */ - show (sel) { - if (typeof sel === 'string') { - sel = AnimeClient.$(sel); - } - - if (Array.isArray(sel)) { - sel.forEach(el => el.removeAttribute('hidden')); - } else { - sel.removeAttribute('hidden'); - } - }, - /** - * Display a message box - * - * @param {string} type - message type: info, error, success - * @param {string} message - the message itself - * @return {void} - */ - showMessage (type, message) { - let template = - `
- - ${message} - -
`; - - let sel = AnimeClient.$('.message'); - if (sel[0] !== undefined) { - sel[0].remove(); - } - - AnimeClient.$('header')[0].insertAdjacentHTML('beforeend', template); - }, - /** - * Finds the closest parent element matching the passed selector - * - * @param {HTMLElement} current - the current HTMLElement - * @param {string} parentSelector - selector for the parent element - * @return {HTMLElement|null} - the parent element - */ - closestParent (current, parentSelector) { - if (Element.prototype.closest !== undefined) { - return current.closest(parentSelector); - } - - while (current !== document.documentElement) { - if (matches(current, parentSelector)) { - return current; - } - - current = current.parentElement; - } - - return null; - }, - /** - * Generate a full url from a relative path - * - * @param {string} path - url path - * @return {string} - full url - */ - url (path) { - let uri = `//${document.location.host}`; - uri += (path.charAt(0) === '/') ? path : `/${path}`; - - return uri; - }, - /** - * Throttle execution of a function - * - * @see https://remysharp.com/2010/07/21/throttling-function-calls - * @see https://jsfiddle.net/jonathansampson/m7G64/ - * @param {Number} interval - the minimum throttle time in ms - * @param {Function} fn - the function to throttle - * @param {Object} [scope] - the 'this' object for the function - * @return {Function} - */ - throttle (interval, fn, scope) { - let wait = false; - return function (...args) { - const context = scope || this; - - if ( ! wait) { - fn.apply(context, args); - wait = true; - setTimeout(function() { - wait = false; - }, interval); - } - }; - }, -}; - -// ------------------------------------------------------------------------- -// ! Events -// ------------------------------------------------------------------------- - -function addEvent(sel, event, listener) { - // Recurse! - if (! event.match(/^([\w\-]+)$/)) { - event.split(' ').forEach((evt) => { - addEvent(sel, evt, listener); - }); - } - - sel.addEventListener(event, listener, false); -} - -function delegateEvent(sel, target, event, listener) { - // Attach the listener to the parent - addEvent(sel, event, (e) => { - // Get live version of the target selector - AnimeClient.$(target, sel).forEach((element) => { - if(e.target == element) { - listener.call(element, e); - e.stopPropagation(); - } - }); - }); -} - -/** - * Add an event listener - * - * @param {string|HTMLElement} sel - the parent selector to bind to - * @param {string} event - event name(s) to bind - * @param {string|HTMLElement|function} target - the element to directly bind the event to - * @param {function} [listener] - event listener callback - * @return {void} - */ -AnimeClient.on = (sel, event, target, listener) => { - if (listener === undefined) { - listener = target; - AnimeClient.$(sel).forEach((el) => { - addEvent(el, event, listener); - }); - } else { - AnimeClient.$(sel).forEach((el) => { - delegateEvent(el, target, event, listener); - }); - } -}; - -// ------------------------------------------------------------------------- -// ! Ajax -// ------------------------------------------------------------------------- - -/** - * Url encoding for non-get requests - * - * @param data - * @returns {string} - * @private - */ -function ajaxSerialize(data) { - let pairs = []; - - Object.keys(data).forEach((name) => { - let value = data[name].toString(); - - name = encodeURIComponent(name); - value = encodeURIComponent(value); - - pairs.push(`${name}=${value}`); - }); - - return pairs.join('&'); -} - -/** - * Make an ajax request - * - * Config:{ - * data: // data to send with the request - * type: // http verb of the request, defaults to GET - * success: // success callback - * error: // error callback - * } - * - * @param {string} url - the url to request - * @param {Object} config - the configuration object - * @return {XMLHttpRequest} - */ -AnimeClient.ajax = (url, config) => { - // Set some sane defaults - const defaultConfig = { - data: {}, - type: 'GET', - dataType: '', - success: AnimeClient.noop, - mimeType: 'application/x-www-form-urlencoded', - error: AnimeClient.noop - }; - - config = { - ...defaultConfig, - ...config, - }; - - let request = new XMLHttpRequest(); - let method = String(config.type).toUpperCase(); - - if (method === 'GET') { - url += (url.match(/\?/)) - ? ajaxSerialize(config.data) - : `?${ajaxSerialize(config.data)}`; - } - - request.open(method, url); - - request.onreadystatechange = () => { - if (request.readyState === 4) { - let responseText = ''; - - if (request.responseType === 'json') { - responseText = JSON.parse(request.responseText); - } else { - responseText = request.responseText; - } - - if (request.status > 299) { - config.error.call(null, request.status, responseText, request.response); - } else { - config.success.call(null, responseText, request.status); - } - } - }; - - if (config.dataType === 'json') { - config.data = JSON.stringify(config.data); - config.mimeType = 'application/json'; - } else { - config.data = ajaxSerialize(config.data); - } - - request.setRequestHeader('Content-Type', config.mimeType); - - if (method === 'GET') { - request.send(null); - } else { - request.send(config.data); - } - - return request -}; - -/** - * Do a get request - * - * @param {string} url - * @param {object|function} data - * @param {function} [callback] - * @return {XMLHttpRequest} - */ -AnimeClient.get = (url, data, callback = null) => { - if (callback === null) { - callback = data; - data = {}; - } - - return AnimeClient.ajax(url, { - data, - success: callback - }); -}; - -// ---------------------------------------------------------------------------- -// Event subscriptions -// ---------------------------------------------------------------------------- -AnimeClient.on('header', 'click', '.message', hide); -AnimeClient.on('form.js-delete', 'submit', confirmDelete); -AnimeClient.on('.js-clear-cache', 'click', clearAPICache); -AnimeClient.on('.vertical-tabs input', 'change', scrollToSection); -AnimeClient.on('.media-filter', 'input', filterMedia); - -// ---------------------------------------------------------------------------- -// Handler functions -// ---------------------------------------------------------------------------- - -/** - * Hide the html element attached to the event - * - * @param event - * @return void - */ -function hide (event) { - AnimeClient.hide(event.target); -} - -/** - * Confirm deletion of an item - * - * @param event - * @return void - */ -function confirmDelete (event) { - const proceed = confirm('Are you ABSOLUTELY SURE you want to delete this item?'); - - if (proceed === false) { - event.preventDefault(); - event.stopPropagation(); - } -} - -/** - * Clear the API cache, and show a message if the cache is cleared - * - * @return void - */ -function clearAPICache () { - AnimeClient.get('/cache_purge', () => { - AnimeClient.showMessage('success', 'Successfully purged api cache'); - }); -} - -/** - * Scroll to the accordion/vertical tab section just opened - * - * @param event - * @return void - */ -function scrollToSection (event) { - const el = event.currentTarget.parentElement; - const rect = el.getBoundingClientRect(); - - const top = rect.top + window.pageYOffset; - - window.scrollTo({ - top, - behavior: 'smooth', - }); -} - -/** - * Filter an anime or manga list - * - * @param event - * @return void - */ -function filterMedia (event) { - const rawFilter = event.target.value; - const filter = new RegExp(rawFilter, 'i'); - - // console.log('Filtering items by: ', filter); - - if (rawFilter !== '') { - // Filter the cover view - AnimeClient.$('article.media').forEach(article => { - const titleLink = AnimeClient.$('.name a', article)[0]; - const title = String(titleLink.textContent).trim(); - if ( ! filter.test(title)) { - AnimeClient.hide(article); - } else { - AnimeClient.show(article); - } - }); - - // Filter the list view - AnimeClient.$('table.media-wrap tbody tr').forEach(tr => { - const titleCell = AnimeClient.$('td.align-left', tr)[0]; - const titleLink = AnimeClient.$('a', titleCell)[0]; - const linkTitle = String(titleLink.textContent).trim(); - const textTitle = String(titleCell.textContent).trim(); - if ( ! (filter.test(linkTitle) || filter.test(textTitle))) { - AnimeClient.hide(tr); - } else { - AnimeClient.show(tr); - } - }); - } else { - AnimeClient.show('article.media'); - AnimeClient.show('table.media-wrap tbody tr'); - } -} - -if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js').then(reg => { - console.log('Service worker registered', reg.scope); - }).catch(error => { - console.error('Failed to register service worker', error); - }); -} - -(() => { - // Var is intentional - var hidden = null; - var visibilityChange = null; - - if (typeof document.hidden !== "undefined") { - hidden = "hidden"; - visibilityChange = "visibilitychange"; - } else if (typeof document.msHidden !== "undefined") { - hidden = "msHidden"; - visibilityChange = "msvisibilitychange"; - } else if (typeof document.webkitHidden !== "undefined") { - hidden = "webkitHidden"; - visibilityChange = "webkitvisibilitychange"; - } - - function handleVisibilityChange() { - // Check the user's session to see if they are currently logged-in - // when the page becomes visible - if ( ! document[hidden]) { - AnimeClient.get('/heartbeat', (beat) => { - const status = JSON.parse(beat); - - // If the session is expired, immediately reload so that - // you can't attempt to do an action that requires authentication - if (status.hasAuth !== true) { - document.removeEventListener(visibilityChange, handleVisibilityChange, false); - location.reload(); - } - }); - } - } - - if (hidden === null) { - console.info('Page visibility API not supported, JS session check will not work'); - } else { - document.addEventListener(visibilityChange, handleVisibilityChange, false); - } -})(); - -// Click on hidden MAL checkbox so -// that MAL id is passed -AnimeClient.on('main', 'change', '.big-check', (e) => { - const id = e.target.id; - document.getElementById(`mal_${id}`).checked = true; -}); - -function renderAnimeSearchResults (data) { - return data.map(item => { - const titles = item.titles.join('
'); - - return ` - - `; - }).join(''); -} - -function renderMangaSearchResults (data) { - return data.map(item => { - const titles = item.titles.join('
'); - return ` - - `; - }).join(''); -} - -const search = (query) => { - // Show the loader - AnimeClient.show('.cssload-loader'); - - // Do the api search - return AnimeClient.get(AnimeClient.url('/anime-collection/search'), { query }, (searchResults, status) => { - searchResults = JSON.parse(searchResults); - - // Hide the loader - AnimeClient.hide('.cssload-loader'); - - // Show the results - AnimeClient.$('#series-list')[ 0 ].innerHTML = renderAnimeSearchResults(searchResults); - }); -}; - -if (AnimeClient.hasElement('.anime #search')) { - let prevRequest = null; - - AnimeClient.on('#search', 'input', AnimeClient.throttle(250, (e) => { - const query = encodeURIComponent(e.target.value); - if (query === '') { - return; - } - - if (prevRequest !== null) { - prevRequest.abort(); - } - - prevRequest = search(query); - })); -} - -// Action to increment episode count -AnimeClient.on('body.anime.list', 'click', '.plus-one', (e) => { - let parentSel = AnimeClient.closestParent(e.target, 'article'); - let watchedCount = parseInt(AnimeClient.$('.completed_number', parentSel)[ 0 ].textContent, 10) || 0; - let totalCount = parseInt(AnimeClient.$('.total_number', parentSel)[ 0 ].textContent, 10); - let title = AnimeClient.$('.name a', parentSel)[ 0 ].textContent; - - // Setup the update data - let data = { - id: parentSel.dataset.kitsuId, - mal_id: parentSel.dataset.malId, - data: { - progress: watchedCount + 1 - } - }; - - // If the episode count is 0, and incremented, - // change status to currently watching - if (isNaN(watchedCount) || watchedCount === 0) { - data.data.status = 'CURRENT'; - } - - // If you increment at the last episode, mark as completed - if ((!isNaN(watchedCount)) && (watchedCount + 1) === totalCount) { - data.data.status = 'COMPLETED'; - } - - AnimeClient.show('#loading-shadow'); - - // okay, lets actually make some changes! - AnimeClient.ajax(AnimeClient.url('/anime/increment'), { - data, - dataType: 'json', - type: 'POST', - success: (res) => { - const resData = JSON.parse(res); - - if (resData.error) { - AnimeClient.hide('#loading-shadow'); - AnimeClient.showMessage('error', `Failed to update ${title}. `); - AnimeClient.scrollToTop(); - return; - } - - if (resData.data.libraryEntry.update.libraryEntry.status === 'COMPLETED') { - AnimeClient.hide(parentSel); - } - - AnimeClient.hide('#loading-shadow'); - - AnimeClient.showMessage('success', `Successfully updated ${title}`); - AnimeClient.$('.completed_number', parentSel)[ 0 ].textContent = ++watchedCount; - AnimeClient.scrollToTop(); - }, - error: () => { - AnimeClient.hide('#loading-shadow'); - AnimeClient.showMessage('error', `Failed to update ${title}. `); - AnimeClient.scrollToTop(); - } - }); -}); - -const search$1 = (query) => { - AnimeClient.show('.cssload-loader'); - return AnimeClient.get(AnimeClient.url('/manga/search'), { query }, (searchResults, status) => { - searchResults = JSON.parse(searchResults); - AnimeClient.hide('.cssload-loader'); - AnimeClient.$('#series-list')[ 0 ].innerHTML = renderMangaSearchResults(searchResults); - }); -}; - -if (AnimeClient.hasElement('.manga #search')) { - let prevRequest = null; - - AnimeClient.on('#search', 'input', AnimeClient.throttle(250, (e) => { - let query = encodeURIComponent(e.target.value); - if (query === '') { - return; - } - - if (prevRequest !== null) { - prevRequest.abort(); - } - - prevRequest = search$1(query); - })); -} - -/** - * Javascript for editing manga, if logged in - */ -AnimeClient.on('.manga.list', 'click', '.edit-buttons button', (e) => { - let thisSel = e.target; - let parentSel = AnimeClient.closestParent(e.target, 'article'); - let type = thisSel.classList.contains('plus-one-chapter') ? 'chapter' : 'volume'; - let completed = parseInt(AnimeClient.$(`.${type}s_read`, parentSel)[ 0 ].textContent, 10) || 0; - let total = parseInt(AnimeClient.$(`.${type}_count`, parentSel)[ 0 ].textContent, 10); - let mangaName = AnimeClient.$('.name', parentSel)[ 0 ].textContent; - - if (isNaN(completed)) { - completed = 0; - } - - // Setup the update data - let data = { - id: parentSel.dataset.kitsuId, - mal_id: parentSel.dataset.malId, - data: { - progress: completed - } - }; - - // If the episode count is 0, and incremented, - // change status to currently reading - if (isNaN(completed) || completed === 0) { - data.data.status = 'CURRENT'; - } - - // If you increment at the last chapter, mark as completed - if ((!isNaN(completed)) && (completed + 1) === total) { - data.data.status = 'COMPLETED'; - } - - // Update the total count - data.data.progress = ++completed; - - AnimeClient.show('#loading-shadow'); - - AnimeClient.ajax(AnimeClient.url('/manga/increment'), { - data, - dataType: 'json', - type: 'POST', - mimeType: 'application/json', - success: (res) => { - const resData = JSON.parse(res); - if (resData.error) { - AnimeClient.hide('#loading-shadow'); - AnimeClient.showMessage('error', `Failed to update ${mangaName}. `); - AnimeClient.scrollToTop(); - return; - } - - if (String(data.data.status).toUpperCase() === 'COMPLETED') { - AnimeClient.hide(parentSel); - } - - AnimeClient.hide('#loading-shadow'); - - AnimeClient.$(`.${type}s_read`, parentSel)[ 0 ].textContent = String(completed); - AnimeClient.showMessage('success', `Successfully updated ${mangaName}`); - AnimeClient.scrollToTop(); - }, - error: () => { - AnimeClient.hide('#loading-shadow'); - AnimeClient.showMessage('error', `Failed to update ${mangaName}`); - AnimeClient.scrollToTop(); - } - }); -}); diff --git a/public/js/anon.min.js b/public/js/anon.min.js deleted file mode 100644 index d20e8d77..00000000 --- a/public/js/anon.min.js +++ /dev/null @@ -1,14 +0,0 @@ -(function(){var matches=function(elm,selector){var m=(elm.document||elm.ownerDocument).querySelectorAll(selector);var i=matches.length;while(--i>=0&&m.item(i)!==elm);return i>-1};var AnimeClient={noop:function(){},$:function(selector,context){context=context===undefined?null:context;if(typeof selector!=="string")return selector;context=context!==null&&context.nodeType===1?context:document;var elements=[];if(selector.match(/^#([\w]+$)/))elements.push(document.getElementById(selector.split("#")[1])); -else elements=[].slice.apply(context.querySelectorAll(selector));return elements},hasElement:function(selector){return AnimeClient.$(selector).length>0},scrollToTop:function(){var el=AnimeClient.$("header")[0];el.scrollIntoView(true)},hide:function(sel){if(typeof sel==="string")sel=AnimeClient.$(sel);if(Array.isArray(sel))sel.forEach(function(el){return el.setAttribute("hidden","hidden")});else sel.setAttribute("hidden","hidden")},show:function(sel){if(typeof sel==="string")sel=AnimeClient.$(sel); -if(Array.isArray(sel))sel.forEach(function(el){return el.removeAttribute("hidden")});else sel.removeAttribute("hidden")},showMessage:function(type,message){var template="
\n\t\t\t\t\n\t\t\t\t"+message+"\n\t\t\t\t\n\t\t\t
";var sel=AnimeClient.$(".message");if(sel[0]!==undefined)sel[0].remove();AnimeClient.$("header")[0].insertAdjacentHTML("beforeend",template)},closestParent:function(current,parentSelector){if(Element.prototype.closest!== -undefined)return current.closest(parentSelector);while(current!==document.documentElement){if(matches(current,parentSelector))return current;current=current.parentElement}return null},url:function(path){var uri="//"+document.location.host;uri+=path.charAt(0)==="/"?path:"/"+path;return uri},throttle:function(interval,fn,scope){var wait=false;return function(args){var $jscomp$restParams=[];for(var $jscomp$restIndex=0;$jscomp$restIndex299)config.error.call(null,request.status,responseText,request.response);else config.success.call(null,responseText,request.status)}};if(config.dataType==="json"){config.data=JSON.stringify(config.data);config.mimeType="application/json"}else config.data=ajaxSerialize(config.data);request.setRequestHeader("Content-Type",config.mimeType);if(method=== -"GET")request.send(null);else request.send(config.data);return request};AnimeClient.get=function(url,data,callback){callback=callback===undefined?null:callback;if(callback===null){callback=data;data={}}return AnimeClient.ajax(url,{data:data,success:callback})};AnimeClient.on("header","click",".message",hide);AnimeClient.on("form.js-delete","submit",confirmDelete);AnimeClient.on(".js-clear-cache","click",clearAPICache);AnimeClient.on(".vertical-tabs input","change",scrollToSection);AnimeClient.on(".media-filter", -"input",filterMedia);function hide(event){AnimeClient.hide(event.target)}function confirmDelete(event){var proceed=confirm("Are you ABSOLUTELY SURE you want to delete this item?");if(proceed===false){event.preventDefault();event.stopPropagation()}}function clearAPICache(){AnimeClient.get("/cache_purge",function(){AnimeClient.showMessage("success","Successfully purged api cache")})}function scrollToSection(event){var el=event.currentTarget.parentElement;var rect=el.getBoundingClientRect();var top= -rect.top+window.pageYOffset;window.scrollTo({top:top,behavior:"smooth"})}function filterMedia(event){var rawFilter=event.target.value;var filter=new RegExp(rawFilter,"i");if(rawFilter!==""){AnimeClient.$("article.media").forEach(function(article){var titleLink=AnimeClient.$(".name a",article)[0];var title=String(titleLink.textContent).trim();if(!filter.test(title))AnimeClient.hide(article);else AnimeClient.show(article)});AnimeClient.$("table.media-wrap tbody tr").forEach(function(tr){var titleCell= -AnimeClient.$("td.align-left",tr)[0];var titleLink=AnimeClient.$("a",titleCell)[0];var linkTitle=String(titleLink.textContent).trim();var textTitle=String(titleCell.textContent).trim();if(!(filter.test(linkTitle)||filter.test(textTitle)))AnimeClient.hide(tr);else AnimeClient.show(tr)})}else{AnimeClient.show("article.media");AnimeClient.show("table.media-wrap tbody tr")}}if("serviceWorker"in navigator)navigator.serviceWorker.register("/sw.js").then(function(reg){console.log("Service worker registered", -reg.scope)})["catch"](function(error){console.error("Failed to register service worker",error)})})() -//# sourceMappingURL=anon.min.js.map diff --git a/public/js/anon.min.js.map b/public/js/anon.min.js.map deleted file mode 100644 index 96a93182..00000000 --- a/public/js/anon.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"anon.min.js.map","sources":["../../frontEndSrc/js/anime-client.js","../../frontEndSrc/js/events.js","../../frontEndSrc/js/anon.js"],"sourcesContent":["// -------------------------------------------------------------------------\n// ! Base\n// -------------------------------------------------------------------------\n\nconst matches = (elm, selector) => {\n\tlet m = (elm.document || elm.ownerDocument).querySelectorAll(selector);\n\tlet i = matches.length;\n\twhile (--i >= 0 && m.item(i) !== elm) {};\n\treturn i > -1;\n}\n\nexport const AnimeClient = {\n\t/**\n\t * Placeholder function\n\t */\n\tnoop: () => {},\n\t/**\n\t * DOM selector\n\t *\n\t * @param {string} selector - The dom selector string\n\t * @param {object} [context]\n\t * @return {[HTMLElement]} - array of dom elements\n\t */\n\t$(selector, context = null) {\n\t\tif (typeof selector !== 'string') {\n\t\t\treturn selector;\n\t\t}\n\n\t\tcontext = (context !== null && context.nodeType === 1)\n\t\t\t? context\n\t\t\t: document;\n\n\t\tlet elements = [];\n\t\tif (selector.match(/^#([\\w]+$)/)) {\n\t\t\telements.push(document.getElementById(selector.split('#')[1]));\n\t\t} else {\n\t\t\telements = [].slice.apply(context.querySelectorAll(selector));\n\t\t}\n\n\t\treturn elements;\n\t},\n\t/**\n\t * Does the selector exist on the current page?\n\t *\n\t * @param {string} selector\n\t * @returns {boolean}\n\t */\n\thasElement (selector) {\n\t\treturn AnimeClient.$(selector).length > 0;\n\t},\n\t/**\n\t * Scroll to the top of the Page\n\t *\n\t * @return {void}\n\t */\n\tscrollToTop () {\n\t\tconst el = AnimeClient.$('header')[0];\n\t\tel.scrollIntoView(true);\n\t},\n\t/**\n\t * Hide the selected element\n\t *\n\t * @param {string|Element} sel - the selector of the element to hide\n\t * @return {void}\n\t */\n\thide (sel) {\n\t\tif (typeof sel === 'string') {\n\t\t\tsel = AnimeClient.$(sel);\n\t\t}\n\n\t\tif (Array.isArray(sel)) {\n\t\t\tsel.forEach(el => el.setAttribute('hidden', 'hidden'));\n\t\t} else {\n\t\t\tsel.setAttribute('hidden', 'hidden');\n\t\t}\n\t},\n\t/**\n\t * UnHide the selected element\n\t *\n\t * @param {string|Element} sel - the selector of the element to hide\n\t * @return {void}\n\t */\n\tshow (sel) {\n\t\tif (typeof sel === 'string') {\n\t\t\tsel = AnimeClient.$(sel);\n\t\t}\n\n\t\tif (Array.isArray(sel)) {\n\t\t\tsel.forEach(el => el.removeAttribute('hidden'));\n\t\t} else {\n\t\t\tsel.removeAttribute('hidden');\n\t\t}\n\t},\n\t/**\n\t * Display a message box\n\t *\n\t * @param {string} type - message type: info, error, success\n\t * @param {string} message - the message itself\n\t * @return {void}\n\t */\n\tshowMessage (type, message) {\n\t\tlet template =\n\t\t\t`
\n\t\t\t\t\n\t\t\t\t${message}\n\t\t\t\t\n\t\t\t
`;\n\n\t\tlet sel = AnimeClient.$('.message');\n\t\tif (sel[0] !== undefined) {\n\t\t\tsel[0].remove();\n\t\t}\n\n\t\tAnimeClient.$('header')[0].insertAdjacentHTML('beforeend', template);\n\t},\n\t/**\n\t * Finds the closest parent element matching the passed selector\n\t *\n\t * @param {HTMLElement} current - the current HTMLElement\n\t * @param {string} parentSelector - selector for the parent element\n\t * @return {HTMLElement|null} - the parent element\n\t */\n\tclosestParent (current, parentSelector) {\n\t\tif (Element.prototype.closest !== undefined) {\n\t\t\treturn current.closest(parentSelector);\n\t\t}\n\n\t\twhile (current !== document.documentElement) {\n\t\t\tif (matches(current, parentSelector)) {\n\t\t\t\treturn current;\n\t\t\t}\n\n\t\t\tcurrent = current.parentElement;\n\t\t}\n\n\t\treturn null;\n\t},\n\t/**\n\t * Generate a full url from a relative path\n\t *\n\t * @param {string} path - url path\n\t * @return {string} - full url\n\t */\n\turl (path) {\n\t\tlet uri = `//${document.location.host}`;\n\t\turi += (path.charAt(0) === '/') ? path : `/${path}`;\n\n\t\treturn uri;\n\t},\n\t/**\n\t * Throttle execution of a function\n\t *\n\t * @see https://remysharp.com/2010/07/21/throttling-function-calls\n\t * @see https://jsfiddle.net/jonathansampson/m7G64/\n\t * @param {Number} interval - the minimum throttle time in ms\n\t * @param {Function} fn - the function to throttle\n\t * @param {Object} [scope] - the 'this' object for the function\n\t * @return {Function}\n\t */\n\tthrottle (interval, fn, scope) {\n\t\tlet wait = false;\n\t\treturn function (...args) {\n\t\t\tconst context = scope || this;\n\n\t\t\tif ( ! wait) {\n\t\t\t\tfn.apply(context, args);\n\t\t\t\twait = true;\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\twait = false;\n\t\t\t\t}, interval);\n\t\t\t}\n\t\t};\n\t},\n};\n\n// -------------------------------------------------------------------------\n// ! Events\n// -------------------------------------------------------------------------\n\nfunction addEvent(sel, event, listener) {\n\t// Recurse!\n\tif (! event.match(/^([\\w\\-]+)$/)) {\n\t\tevent.split(' ').forEach((evt) => {\n\t\t\taddEvent(sel, evt, listener);\n\t\t});\n\t}\n\n\tsel.addEventListener(event, listener, false);\n}\n\nfunction delegateEvent(sel, target, event, listener) {\n\t// Attach the listener to the parent\n\taddEvent(sel, event, (e) => {\n\t\t// Get live version of the target selector\n\t\tAnimeClient.$(target, sel).forEach((element) => {\n\t\t\tif(e.target == element) {\n\t\t\t\tlistener.call(element, e);\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Add an event listener\n *\n * @param {string|HTMLElement} sel - the parent selector to bind to\n * @param {string} event - event name(s) to bind\n * @param {string|HTMLElement|function} target - the element to directly bind the event to\n * @param {function} [listener] - event listener callback\n * @return {void}\n */\nAnimeClient.on = (sel, event, target, listener) => {\n\tif (listener === undefined) {\n\t\tlistener = target;\n\t\tAnimeClient.$(sel).forEach((el) => {\n\t\t\taddEvent(el, event, listener);\n\t\t});\n\t} else {\n\t\tAnimeClient.$(sel).forEach((el) => {\n\t\t\tdelegateEvent(el, target, event, listener);\n\t\t});\n\t}\n};\n\n// -------------------------------------------------------------------------\n// ! Ajax\n// -------------------------------------------------------------------------\n\n/**\n * Url encoding for non-get requests\n *\n * @param data\n * @returns {string}\n * @private\n */\nfunction ajaxSerialize(data) {\n\tlet pairs = [];\n\n\tObject.keys(data).forEach((name) => {\n\t\tlet value = data[name].toString();\n\n\t\tname = encodeURIComponent(name);\n\t\tvalue = encodeURIComponent(value);\n\n\t\tpairs.push(`${name}=${value}`);\n\t});\n\n\treturn pairs.join('&');\n}\n\n/**\n * Make an ajax request\n *\n * Config:{\n * \tdata: // data to send with the request\n * \ttype: // http verb of the request, defaults to GET\n * \tsuccess: // success callback\n * \terror: // error callback\n * }\n *\n * @param {string} url - the url to request\n * @param {Object} config - the configuration object\n * @return {XMLHttpRequest}\n */\nAnimeClient.ajax = (url, config) => {\n\t// Set some sane defaults\n\tconst defaultConfig = {\n\t\tdata: {},\n\t\ttype: 'GET',\n\t\tdataType: '',\n\t\tsuccess: AnimeClient.noop,\n\t\tmimeType: 'application/x-www-form-urlencoded',\n\t\terror: AnimeClient.noop\n\t}\n\n\tconfig = {\n\t\t...defaultConfig,\n\t\t...config,\n\t}\n\n\tlet request = new XMLHttpRequest();\n\tlet method = String(config.type).toUpperCase();\n\n\tif (method === 'GET') {\n\t\turl += (url.match(/\\?/))\n\t\t\t? ajaxSerialize(config.data)\n\t\t\t: `?${ajaxSerialize(config.data)}`;\n\t}\n\n\trequest.open(method, url);\n\n\trequest.onreadystatechange = () => {\n\t\tif (request.readyState === 4) {\n\t\t\tlet responseText = '';\n\n\t\t\tif (request.responseType === 'json') {\n\t\t\t\tresponseText = JSON.parse(request.responseText);\n\t\t\t} else {\n\t\t\t\tresponseText = request.responseText;\n\t\t\t}\n\n\t\t\tif (request.status > 299) {\n\t\t\t\tconfig.error.call(null, request.status, responseText, request.response);\n\t\t\t} else {\n\t\t\t\tconfig.success.call(null, responseText, request.status);\n\t\t\t}\n\t\t}\n\t};\n\n\tif (config.dataType === 'json') {\n\t\tconfig.data = JSON.stringify(config.data);\n\t\tconfig.mimeType = 'application/json';\n\t} else {\n\t\tconfig.data = ajaxSerialize(config.data);\n\t}\n\n\trequest.setRequestHeader('Content-Type', config.mimeType);\n\n\tif (method === 'GET') {\n\t\trequest.send(null);\n\t} else {\n\t\trequest.send(config.data);\n\t}\n\n\treturn request\n};\n\n/**\n * Do a get request\n *\n * @param {string} url\n * @param {object|function} data\n * @param {function} [callback]\n * @return {XMLHttpRequest}\n */\nAnimeClient.get = (url, data, callback = null) => {\n\tif (callback === null) {\n\t\tcallback = data;\n\t\tdata = {};\n\t}\n\n\treturn AnimeClient.ajax(url, {\n\t\tdata,\n\t\tsuccess: callback\n\t});\n};\n\n// -------------------------------------------------------------------------\n// Export\n// -------------------------------------------------------------------------\n\nexport default AnimeClient;","import _ from './anime-client.js';\n\n// ----------------------------------------------------------------------------\n// Event subscriptions\n// ----------------------------------------------------------------------------\n_.on('header', 'click', '.message', hide);\n_.on('form.js-delete', 'submit', confirmDelete);\n_.on('.js-clear-cache', 'click', clearAPICache);\n_.on('.vertical-tabs input', 'change', scrollToSection);\n_.on('.media-filter', 'input', filterMedia);\n\n// ----------------------------------------------------------------------------\n// Handler functions\n// ----------------------------------------------------------------------------\n\n/**\n * Hide the html element attached to the event\n *\n * @param event\n * @return void\n */\nfunction hide (event) {\n\t_.hide(event.target)\n}\n\n/**\n * Confirm deletion of an item\n *\n * @param event\n * @return void\n */\nfunction confirmDelete (event) {\n\tconst proceed = confirm('Are you ABSOLUTELY SURE you want to delete this item?');\n\n\tif (proceed === false) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t}\n}\n\n/**\n * Clear the API cache, and show a message if the cache is cleared\n *\n * @return void\n */\nfunction clearAPICache () {\n\t_.get('/cache_purge', () => {\n\t\t_.showMessage('success', 'Successfully purged api cache');\n\t});\n}\n\n/**\n * Scroll to the accordion/vertical tab section just opened\n *\n * @param event\n * @return void\n */\nfunction scrollToSection (event) {\n\tconst el = event.currentTarget.parentElement;\n\tconst rect = el.getBoundingClientRect();\n\n\tconst top = rect.top + window.pageYOffset;\n\n\twindow.scrollTo({\n\t\ttop,\n\t\tbehavior: 'smooth',\n\t});\n}\n\n/**\n * Filter an anime or manga list\n *\n * @param event\n * @return void\n */\nfunction filterMedia (event) {\n\tconst rawFilter = event.target.value;\n\tconst filter = new RegExp(rawFilter, 'i');\n\n\t// console.log('Filtering items by: ', filter);\n\n\tif (rawFilter !== '') {\n\t\t// Filter the cover view\n\t\t_.$('article.media').forEach(article => {\n\t\t\tconst titleLink = _.$('.name a', article)[0];\n\t\t\tconst title = String(titleLink.textContent).trim();\n\t\t\tif ( ! filter.test(title)) {\n\t\t\t\t_.hide(article);\n\t\t\t} else {\n\t\t\t\t_.show(article);\n\t\t\t}\n\t\t});\n\n\t\t// Filter the list view\n\t\t_.$('table.media-wrap tbody tr').forEach(tr => {\n\t\t\tconst titleCell = _.$('td.align-left', tr)[0];\n\t\t\tconst titleLink = _.$('a', titleCell)[0];\n\t\t\tconst linkTitle = String(titleLink.textContent).trim();\n\t\t\tconst textTitle = String(titleCell.textContent).trim();\n\t\t\tif ( ! (filter.test(linkTitle) || filter.test(textTitle))) {\n\t\t\t\t_.hide(tr);\n\t\t\t} else {\n\t\t\t\t_.show(tr);\n\t\t\t}\n\t\t});\n\t} else {\n\t\t_.show('article.media');\n\t\t_.show('table.media-wrap tbody tr');\n\t}\n}\n","import './events.js';\n\nif ('serviceWorker' in navigator) {\n\tnavigator.serviceWorker.register('/sw.js').then(reg => {\n\t\tconsole.log('Service worker registered', reg.scope);\n\t}).catch(error => {\n\t\tconsole.error('Failed to register service worker', error);\n\t});\n}\n\n"],"names":["selector","m","querySelectorAll","elm","document","ownerDocument","i","matches","length","item","noop","$","context","nodeType","elements","match","push","getElementById","split","slice","apply","hasElement","AnimeClient","scrollToTop","el","scrollIntoView","hide","sel","Array","isArray","forEach","setAttribute","show","removeAttribute","showMessage","type","message","template","undefined","remove","insertAdjacentHTML","closestParent","current","parentSelector","Element","prototype","closest","documentElement","parentElement","url","path","uri","location","host","charAt","throttle","interval","fn","scope","wait","args","setTimeout","addEvent","event","listener","evt","addEventListener","delegateEvent","target","e","element","call","stopPropagation","on","AnimeClient.on","ajaxSerialize","data","pairs","Object","keys","name","value","toString","encodeURIComponent","join","ajax","AnimeClient.ajax","config","dataType","success","mimeType","error","defaultConfig","request","XMLHttpRequest","method","String","toUpperCase","open","onreadystatechange","request.onreadystatechange","readyState","responseText","responseType","JSON","parse","status","response","stringify","setRequestHeader","send","get","AnimeClient.get","callback","confirmDelete","clearAPICache","scrollToSection","filterMedia","_","proceed","preventDefault","window","scrollTo","top","behavior","rawFilter","article","filter","test","title","tr","titleCell","linkTitle","textTitle","navigator","serviceWorker","register","then","reg","console","log","catch"],"mappings":"YAIA,yBAAoBA,UACnB,IAAIC,EAAIC,CAACC,GAAAC,SAADF,EAAiBC,GAAAE,cAAjBH,kBAAA,CAAqDF,QAArD,CACR,KAAIM,EAAIC,OAAAC,OACR,OAAO,EAAEF,CAAT,EAAc,CAAd,EAAmBL,CAAAQ,KAAA,CAAOH,CAAP,CAAnB,GAAiCH,GAAjC,EACA,MAAOG,EAAP,CAAW,GAGL,kBAINI,KAAMA,QAAA,EAAM,GAQZ,EAAAC,QAAC,CAACX,QAAD,CAAWY,OAAX,CAA2B,CAAhBA,OAAA,CAAAA,OAAA,GAAA,SAAA,CAAU,IAAV,CAAAA,OACX,IAAI,MAAOZ,SAAX,GAAwB,QAAxB,CACC,MAAOA,SAGRY,QAAA,CAAWA,OAAD,GAAa,IAAb,EAAqBA,OAAAC,SAArB,GAA0C,CAA1C,CACPD,OADO,CAEPR,QAEH,KAAIU,SAAW,EACf,IAAId,QAAAe,MAAA,CAAe,YAAf,CAAJ,CACCD,QAAAE,KAAA,CAAcZ,QAAAa,eAAA,CAAwBjB,QAAAkB,MAAA,CAAe,GAAf,CAAA,CAAoB,CAApB,CAAxB,CAAd,CADD;IAGCJ,SAAA,CAAW,EAAAK,MAAAC,MAAA,CAAeR,OAAAV,iBAAA,CAAyBF,QAAzB,CAAf,CAGZ,OAAOc,SAhBoB,EAwB5B,WAAAO,QAAW,CAACrB,QAAD,CAAW,CACrB,MAAOsB,YAAAX,EAAA,CAAcX,QAAd,CAAAQ,OAAP,CAAwC,CADnB,EAQtB,YAAAe,QAAY,EAAG,CACd,IAAMC,GAAKF,WAAAX,EAAA,CAAc,QAAd,CAAA,CAAwB,CAAxB,CACXa,GAAAC,eAAA,CAAkB,IAAlB,CAFc,EAUf,KAAAC,QAAK,CAACC,GAAD,CAAM,CACV,GAAI,MAAOA,IAAX,GAAmB,QAAnB,CACCA,GAAA,CAAML,WAAAX,EAAA,CAAcgB,GAAd,CAGP,IAAIC,KAAAC,QAAA,CAAcF,GAAd,CAAJ,CACCA,GAAAG,QAAA,CAAY,QAAA,CAAAN,EAAA,CAAM,CAAA,MAAAA,GAAAO,aAAA,CAAgB,QAAhB,CAA0B,QAA1B,CAAA,CAAlB,CADD,KAGCJ,IAAAI,aAAA,CAAiB,QAAjB,CAA2B,QAA3B,CARS,EAiBX,KAAAC,QAAK,CAACL,GAAD,CAAM,CACV,GAAI,MAAOA,IAAX,GAAmB,QAAnB,CACCA,GAAA,CAAML,WAAAX,EAAA,CAAcgB,GAAd,CAGP;GAAIC,KAAAC,QAAA,CAAcF,GAAd,CAAJ,CACCA,GAAAG,QAAA,CAAY,QAAA,CAAAN,EAAA,CAAM,CAAA,MAAAA,GAAAS,gBAAA,CAAmB,QAAnB,CAAA,CAAlB,CADD,KAGCN,IAAAM,gBAAA,CAAoB,QAApB,CARS,EAkBX,YAAAC,QAAY,CAACC,IAAD,CAAOC,OAAP,CAAgB,CAC3B,IAAIC,SACH,sBADGA,CACoBF,IADpBE,CACH,kDADGA,CAGAD,OAHAC,CACH,qDAMD,KAAIV,IAAML,WAAAX,EAAA,CAAc,UAAd,CACV,IAAIgB,GAAA,CAAI,CAAJ,CAAJ,GAAeW,SAAf,CACCX,GAAA,CAAI,CAAJ,CAAAY,OAAA,EAGDjB,YAAAX,EAAA,CAAc,QAAd,CAAA,CAAwB,CAAxB,CAAA6B,mBAAA,CAA8C,WAA9C,CAA2DH,QAA3D,CAb2B,EAsB5B,cAAAI,QAAc,CAACC,OAAD,CAAUC,cAAV,CAA0B,CACvC,GAAIC,OAAAC,UAAAC,QAAJ;AAAkCR,SAAlC,CACC,MAAOI,QAAAI,QAAA,CAAgBH,cAAhB,CAGR,OAAOD,OAAP,GAAmBtC,QAAA2C,gBAAnB,CAA6C,CAC5C,GAAIxC,OAAA,CAAQmC,OAAR,CAAiBC,cAAjB,CAAJ,CACC,MAAOD,QAGRA,QAAA,CAAUA,OAAAM,cALkC,CAQ7C,MAAO,KAbgC,EAqBxC,IAAAC,QAAI,CAACC,IAAD,CAAO,CACV,IAAIC,IAAM,IAANA,CAAW/C,QAAAgD,SAAAC,KACfF,IAAA,EAAQD,IAAAI,OAAA,CAAY,CAAZ,CAAD,GAAoB,GAApB,CAA2BJ,IAA3B,CAAkC,GAAlC,CAAsCA,IAE7C,OAAOC,IAJG,EAgBX,SAAAI,QAAS,CAACC,QAAD,CAAWC,EAAX,CAAeC,KAAf,CAAsB,CAC9B,IAAIC,KAAO,KACX,OAAO,UAAaC,KAAM,CAAT,IAAS,mBAAT,EAAA,KAAA,IAAA,kBAAA,CAAA,CAAA,iBAAA,CAAA,SAAA,OAAA,CAAA,EAAA,iBAAA,CAAS,kBAAT,CAAA,iBAAA;AAAA,CAAA,CAAA,CAAA,SAAA,CAAA,iBAAA,CAAS,EAAA,IAAA,OAAA,kBACzB,KAAMhD,QAAU8C,KAAV9C,EAAmB,IAEzB,IAAK,CAAE+C,IAAP,CAAa,CACZF,EAAArC,MAAA,CAASR,OAAT,CAAkBgD,MAAlB,CACAD,KAAA,CAAO,IACPE,WAAA,CAAW,UAAW,CACrBF,IAAA,CAAO,KADc,CAAtB,CAEGH,QAFH,CAHY,CAHY,CAAA,CAFI,EAoBhCM,SAASA,SAAQ,CAACnC,GAAD,CAAMoC,KAAN,CAAaC,QAAb,CAAuB,CAEvC,GAAI,CAAED,KAAAhD,MAAA,CAAY,aAAZ,CAAN,CACCgD,KAAA7C,MAAA,CAAY,GAAZ,CAAAY,QAAA,CAAyB,QAAA,CAACmC,GAAD,CAAS,CACjCH,QAAA,CAASnC,GAAT,CAAcsC,GAAd,CAAmBD,QAAnB,CADiC,CAAlC,CAKDrC,IAAAuC,iBAAA,CAAqBH,KAArB,CAA4BC,QAA5B,CAAsC,KAAtC,CARuC,CAWxCG,QAASA,cAAa,CAACxC,GAAD,CAAMyC,MAAN,CAAcL,KAAd,CAAqBC,QAArB,CAA+B,CAEpDF,QAAA,CAASnC,GAAT,CAAcoC,KAAd,CAAqB,QAAA,CAACM,CAAD,CAAO,CAE3B/C,WAAAX,EAAA,CAAcyD,MAAd,CAAsBzC,GAAtB,CAAAG,QAAA,CAAmC,QAAA,CAACwC,OAAD,CAAa,CAC/C,GAAGD,CAAAD,OAAH;AAAeE,OAAf,CAAwB,CACvBN,QAAAO,KAAA,CAAcD,OAAd,CAAuBD,CAAvB,CACAA,EAAAG,gBAAA,EAFuB,CADuB,CAAhD,CAF2B,CAA5B,CAFoD,CAsBrDlD,WAAAmD,GAAA,CAAiBC,QAAA,CAAC/C,GAAD,CAAMoC,KAAN,CAAaK,MAAb,CAAqBJ,QAArB,CAAkC,CAClD,GAAIA,QAAJ,GAAiB1B,SAAjB,CAA4B,CAC3B0B,QAAA,CAAWI,MACX9C,YAAAX,EAAA,CAAcgB,GAAd,CAAAG,QAAA,CAA2B,QAAA,CAACN,EAAD,CAAQ,CAClCsC,QAAA,CAAStC,EAAT,CAAauC,KAAb,CAAoBC,QAApB,CADkC,CAAnC,CAF2B,CAA5B,IAMC1C,YAAAX,EAAA,CAAcgB,GAAd,CAAAG,QAAA,CAA2B,QAAA,CAACN,EAAD,CAAQ,CAClC2C,aAAA,CAAc3C,EAAd,CAAkB4C,MAAlB,CAA0BL,KAA1B,CAAiCC,QAAjC,CADkC,CAAnC,CAPiD,CAwBnDW,SAASA,cAAa,CAACC,IAAD,CAAO,CAC5B,IAAIC,MAAQ,EAEZC,OAAAC,KAAA,CAAYH,IAAZ,CAAA9C,QAAA,CAA0B,QAAA,CAACkD,IAAD,CAAU,CACnC,IAAIC,MAAQL,IAAA,CAAKI,IAAL,CAAAE,SAAA,EAEZF,KAAA,CAAOG,kBAAA,CAAmBH,IAAnB,CACPC,MAAA,CAAQE,kBAAA,CAAmBF,KAAnB,CAERJ,MAAA7D,KAAA,CAAcgE,IAAd;AAAW,GAAX,CAAsBC,KAAtB,CANmC,CAApC,CASA,OAAOJ,MAAAO,KAAA,CAAW,GAAX,CAZqB,CA6B7B9D,WAAA+D,KAAA,CAAmBC,QAAA,CAACrC,GAAD,CAAMsC,MAAN,CAAiB,CAEnC,mBACCX,KAAM,GACNzC,KAAM,MACNqD,SAAU,GACVC,QAASnE,WAAAZ,MACTgF,SAAU,oCACVC,MAAOrE,WAAAZ,MAGR6E,OAAA,CAAS,MAAA,OAAA,CAAA,EAAA,CACLK,aADK,CAELL,MAFK,CAKT,KAAIM,QAAU,IAAIC,cAClB,KAAIC,OAASC,MAAA,CAAOT,MAAApD,KAAP,CAAA8D,YAAA,EAEb,IAAIF,MAAJ,GAAe,KAAf,CACC9C,GAAA,EAAQA,GAAAlC,MAAA,CAAU,IAAV,CAAD,CACJ4D,aAAA,CAAcY,MAAAX,KAAd,CADI,CAEJ,GAFI,CAEAD,aAAA,CAAcY,MAAAX,KAAd,CAGRiB,QAAAK,KAAA,CAAaH,MAAb,CAAqB9C,GAArB,CAEA4C,QAAAM,mBAAA,CAA6BC,QAAA,EAAM,CAClC,GAAIP,OAAAQ,WAAJ;AAA2B,CAA3B,CAA8B,CAC7B,IAAIC,aAAe,EAEnB,IAAIT,OAAAU,aAAJ,GAA6B,MAA7B,CACCD,YAAA,CAAeE,IAAAC,MAAA,CAAWZ,OAAAS,aAAX,CADhB,KAGCA,aAAA,CAAeT,OAAAS,aAGhB,IAAIT,OAAAa,OAAJ,CAAqB,GAArB,CACCnB,MAAAI,MAAApB,KAAA,CAAkB,IAAlB,CAAwBsB,OAAAa,OAAxB,CAAwCJ,YAAxC,CAAsDT,OAAAc,SAAtD,CADD,KAGCpB,OAAAE,QAAAlB,KAAA,CAAoB,IAApB,CAA0B+B,YAA1B,CAAwCT,OAAAa,OAAxC,CAZ4B,CADI,CAkBnC,IAAInB,MAAAC,SAAJ,GAAwB,MAAxB,CAAgC,CAC/BD,MAAAX,KAAA,CAAc4B,IAAAI,UAAA,CAAerB,MAAAX,KAAf,CACdW,OAAAG,SAAA,CAAkB,kBAFa,CAAhC,IAICH,OAAAX,KAAA,CAAcD,aAAA,CAAcY,MAAAX,KAAd,CAGfiB,QAAAgB,iBAAA,CAAyB,cAAzB,CAAyCtB,MAAAG,SAAzC,CAEA,IAAIK,MAAJ;AAAe,KAAf,CACCF,OAAAiB,KAAA,CAAa,IAAb,CADD,KAGCjB,QAAAiB,KAAA,CAAavB,MAAAX,KAAb,CAGD,OAAOiB,QA5D4B,CAuEpCvE,YAAAyF,IAAA,CAAkBC,QAAA,CAAC/D,GAAD,CAAM2B,IAAN,CAAYqC,QAAZ,CAAgC,CAApBA,QAAA,CAAAA,QAAA,GAAA,SAAA,CAAW,IAAX,CAAAA,QAC7B,IAAIA,QAAJ,GAAiB,IAAjB,CAAuB,CACtBA,QAAA,CAAWrC,IACXA,KAAA,CAAO,EAFe,CAKvB,MAAOtD,YAAA+D,KAAA,CAAiBpC,GAAjB,CAAsB,CAC5B2B,KAAAA,IAD4B,CAE5Ba,QAASwB,QAFmB,CAAtB,CAN0C,iBC3U7C,SAAU,QAAS,WAAYvF,qBAC/B,iBAAkB,SAAUwF,8BAC5B,kBAAmB,QAASC,8BAC5B,uBAAwB,SAAUC,gCAClC;AAAiB,QAASC,YAY/B3F,SAASA,MAAMqC,MAAO,CACrBuD,WAAAA,KAAAA,CAAOvD,KAAAK,OAAPkD,CADqB,CAUtBJ,QAASA,eAAenD,MAAO,CAC9B,4EAEA,IAAIwD,OAAJ,GAAgB,KAAhB,CAAuB,CACtBxD,KAAAyD,eAAA,EACAzD,MAAAS,gBAAA,EAFsB,CAHO,CAc/B2C,QAASA,gBAAiB,CACzBG,WAAAA,IAAAA,CAAM,cAANA,CAAsB,QAAA,EAAM,CAC3BA,WAAAA,YAAAA,CAAc,SAAdA,CAAyB,+BAAzBA,CAD2B,CAA5BA,CADyB,CAY1BF,QAASA,iBAAiBrD,MAAO,CAChC,wCACA,oCAEA;2BAEA0D,OAAAC,SAAA,CAAgB,CACfC,IAAAA,GADe,CAEfC,SAAU,QAFK,CAAhB,CANgC,CAkBjCP,QAASA,aAAatD,MAAO,CAC5B,gCACA,iCAAmC,IAInC,IAAI8D,SAAJ,GAAkB,EAAlB,CAAsB,CAErBP,WAAAA,EAAAA,CAAI,eAAJA,CAAAA,QAAAA,CAA6B,QAAA,CAAAQ,OAAA,CAAW,CACvC,4BAAoB,UAAWA,SAAS,EACxC,+CACA,IAAK,CAAEC,MAAAC,KAAA,CAAYC,KAAZ,CAAP,CACCX,WAAAA,KAAAA,CAAOQ,OAAPR,CADD,KAGCA,YAAAA,KAAAA,CAAOQ,OAAPR,CANsC,CAAxCA,CAWAA,YAAAA,EAAAA,CAAI,2BAAJA,CAAAA,QAAAA,CAAyC,QAAA,CAAAY,EAAA,CAAM,CAC9C;cAAoB,gBAAiBA,IAAI,EACzC,6BAAoB,IAAKC,WAAW,EACpC,mDACA,mDACA,IAAK,EAAGJ,MAAAC,KAAA,CAAYI,SAAZ,CAAH,EAA6BL,MAAAC,KAAA,CAAYK,SAAZ,CAA7B,CAAL,CACCf,WAAAA,KAAAA,CAAOY,EAAPZ,CADD,KAGCA,YAAAA,KAAAA,CAAOY,EAAPZ,CAR6C,CAA/CA,CAbqB,CAAtB,IAwBO,CACNA,WAAAA,KAAAA,CAAO,eAAPA,CACAA,YAAAA,KAAAA,CAAO,2BAAPA,CAFM,CA9BqB,CCzE7B,GAAI,eAAJ,EAAuBgB,UAAvB,CACCA,SAAAC,cAAAC,SAAA,CAAiC,QAAjC,CAAAC,KAAA,CAAgD,QAAA,CAAAC,GAAA,CAAO,CACtDC,OAAAC,IAAA,CAAY,2BAAZ;AAAyCF,GAAAhF,MAAzC,CADsD,CAAvD,CAAAmF,CAEG,OAFHA,CAAA,CAES,QAAA,CAAAlD,KAAA,CAAS,CACjBgD,OAAAhD,MAAA,CAAc,mCAAd,CAAmDA,KAAnD,CADiB,CAFlB;"} \ No newline at end of file diff --git a/public/js/scripts.min.js b/public/js/scripts.min.js index da5acd91..841e04d0 100644 --- a/public/js/scripts.min.js +++ b/public/js/scripts.min.js @@ -1,28 +1 @@ -(function(){var matches=function(elm,selector){var m=(elm.document||elm.ownerDocument).querySelectorAll(selector);var i=matches.length;while(--i>=0&&m.item(i)!==elm);return i>-1};var AnimeClient={noop:function(){},$:function(selector,context){context=context===undefined?null:context;if(typeof selector!=="string")return selector;context=context!==null&&context.nodeType===1?context:document;var elements=[];if(selector.match(/^#([\w]+$)/))elements.push(document.getElementById(selector.split("#")[1])); -else elements=[].slice.apply(context.querySelectorAll(selector));return elements},hasElement:function(selector){return AnimeClient.$(selector).length>0},scrollToTop:function(){var el=AnimeClient.$("header")[0];el.scrollIntoView(true)},hide:function(sel){if(typeof sel==="string")sel=AnimeClient.$(sel);if(Array.isArray(sel))sel.forEach(function(el){return el.setAttribute("hidden","hidden")});else sel.setAttribute("hidden","hidden")},show:function(sel){if(typeof sel==="string")sel=AnimeClient.$(sel); -if(Array.isArray(sel))sel.forEach(function(el){return el.removeAttribute("hidden")});else sel.removeAttribute("hidden")},showMessage:function(type,message){var template="
\n\t\t\t\t\n\t\t\t\t"+message+"\n\t\t\t\t\n\t\t\t
";var sel=AnimeClient.$(".message");if(sel[0]!==undefined)sel[0].remove();AnimeClient.$("header")[0].insertAdjacentHTML("beforeend",template)},closestParent:function(current,parentSelector){if(Element.prototype.closest!== -undefined)return current.closest(parentSelector);while(current!==document.documentElement){if(matches(current,parentSelector))return current;current=current.parentElement}return null},url:function(path){var uri="//"+document.location.host;uri+=path.charAt(0)==="/"?path:"/"+path;return uri},throttle:function(interval,fn,scope){var wait=false;return function(args){var $jscomp$restParams=[];for(var $jscomp$restIndex=0;$jscomp$restIndex299)config.error.call(null,request.status,responseText,request.response);else config.success.call(null,responseText,request.status)}};if(config.dataType==="json"){config.data=JSON.stringify(config.data);config.mimeType="application/json"}else config.data=ajaxSerialize(config.data);request.setRequestHeader("Content-Type",config.mimeType);if(method=== -"GET")request.send(null);else request.send(config.data);return request};AnimeClient.get=function(url,data,callback){callback=callback===undefined?null:callback;if(callback===null){callback=data;data={}}return AnimeClient.ajax(url,{data:data,success:callback})};AnimeClient.on("header","click",".message",hide);AnimeClient.on("form.js-delete","submit",confirmDelete);AnimeClient.on(".js-clear-cache","click",clearAPICache);AnimeClient.on(".vertical-tabs input","change",scrollToSection);AnimeClient.on(".media-filter", -"input",filterMedia);function hide(event){AnimeClient.hide(event.target)}function confirmDelete(event){var proceed=confirm("Are you ABSOLUTELY SURE you want to delete this item?");if(proceed===false){event.preventDefault();event.stopPropagation()}}function clearAPICache(){AnimeClient.get("/cache_purge",function(){AnimeClient.showMessage("success","Successfully purged api cache")})}function scrollToSection(event){var el=event.currentTarget.parentElement;var rect=el.getBoundingClientRect();var top= -rect.top+window.pageYOffset;window.scrollTo({top:top,behavior:"smooth"})}function filterMedia(event){var rawFilter=event.target.value;var filter=new RegExp(rawFilter,"i");if(rawFilter!==""){AnimeClient.$("article.media").forEach(function(article){var titleLink=AnimeClient.$(".name a",article)[0];var title=String(titleLink.textContent).trim();if(!filter.test(title))AnimeClient.hide(article);else AnimeClient.show(article)});AnimeClient.$("table.media-wrap tbody tr").forEach(function(tr){var titleCell= -AnimeClient.$("td.align-left",tr)[0];var titleLink=AnimeClient.$("a",titleCell)[0];var linkTitle=String(titleLink.textContent).trim();var textTitle=String(titleCell.textContent).trim();if(!(filter.test(linkTitle)||filter.test(textTitle)))AnimeClient.hide(tr);else AnimeClient.show(tr)})}else{AnimeClient.show("article.media");AnimeClient.show("table.media-wrap tbody tr")}}if("serviceWorker"in navigator)navigator.serviceWorker.register("/sw.js").then(function(reg){console.log("Service worker registered", -reg.scope)})["catch"](function(error){console.error("Failed to register service worker",error)});(function(){var hidden=null;var visibilityChange=null;if(typeof document.hidden!=="undefined"){hidden="hidden";visibilityChange="visibilitychange"}else if(typeof document.msHidden!=="undefined"){hidden="msHidden";visibilityChange="msvisibilitychange"}else if(typeof document.webkitHidden!=="undefined"){hidden="webkitHidden";visibilityChange="webkitvisibilitychange"}function handleVisibilityChange(){if(!document[hidden])AnimeClient.get("/heartbeat", -function(beat){var status=JSON.parse(beat);if(status.hasAuth!==true){document.removeEventListener(visibilityChange,handleVisibilityChange,false);location.reload()}})}if(hidden===null)console.info("Page visibility API not supported, JS session check will not work");else document.addEventListener(visibilityChange,handleVisibilityChange,false)})();AnimeClient.on("main","change",".big-check",function(e){var id=e.target.id;document.getElementById("mal_"+id).checked=true});function renderAnimeSearchResults(data){return data.map(function(item){var titles= -item.titles.join("
");return'\n\t\t\t\n\t\t'}).join("")} -function renderMangaSearchResults(data){return data.map(function(item){var titles=item.titles.join("
");return'\n\t\t\t\n\t\t'}).join("")}var search=function(query){AnimeClient.show(".cssload-loader");return AnimeClient.get(AnimeClient.url("/anime-collection/search"),{query:query},function(searchResults,status){searchResults=JSON.parse(searchResults);AnimeClient.hide(".cssload-loader");AnimeClient.$("#series-list")[0].innerHTML=renderAnimeSearchResults(searchResults)})};if(AnimeClient.hasElement(".anime #search")){var prevRequest= -null;AnimeClient.on("#search","input",AnimeClient.throttle(250,function(e){var query=encodeURIComponent(e.target.value);if(query==="")return;if(prevRequest!==null)prevRequest.abort();prevRequest=search(query)}))}AnimeClient.on("body.anime.list","click",".plus-one",function(e){var parentSel=AnimeClient.closestParent(e.target,"article");var watchedCount=parseInt(AnimeClient.$(".completed_number",parentSel)[0].textContent,10)||0;var totalCount=parseInt(AnimeClient.$(".total_number",parentSel)[0].textContent, -10);var title=AnimeClient.$(".name a",parentSel)[0].textContent;var data={id:parentSel.dataset.kitsuId,mal_id:parentSel.dataset.malId,data:{progress:watchedCount+1}};if(isNaN(watchedCount)||watchedCount===0)data.data.status="CURRENT";if(!isNaN(watchedCount)&&watchedCount+1===totalCount)data.data.status="COMPLETED";AnimeClient.show("#loading-shadow");AnimeClient.ajax(AnimeClient.url("/anime/increment"),{data:data,dataType:"json",type:"POST",success:function(res){var resData=JSON.parse(res);if(resData.error){AnimeClient.hide("#loading-shadow"); -AnimeClient.showMessage("error","Failed to update "+title+". ");AnimeClient.scrollToTop();return}if(resData.data.libraryEntry.update.libraryEntry.status==="COMPLETED")AnimeClient.hide(parentSel);AnimeClient.hide("#loading-shadow");AnimeClient.showMessage("success","Successfully updated "+title);AnimeClient.$(".completed_number",parentSel)[0].textContent=++watchedCount;AnimeClient.scrollToTop()},error:function(){AnimeClient.hide("#loading-shadow");AnimeClient.showMessage("error","Failed to update "+ -title+". ");AnimeClient.scrollToTop()}})});var search$1=function(query){AnimeClient.show(".cssload-loader");return AnimeClient.get(AnimeClient.url("/manga/search"),{query:query},function(searchResults,status){searchResults=JSON.parse(searchResults);AnimeClient.hide(".cssload-loader");AnimeClient.$("#series-list")[0].innerHTML=renderMangaSearchResults(searchResults)})};if(AnimeClient.hasElement(".manga #search")){var prevRequest$1=null;AnimeClient.on("#search","input",AnimeClient.throttle(250,function(e){var query= -encodeURIComponent(e.target.value);if(query==="")return;if(prevRequest$1!==null)prevRequest$1.abort();prevRequest$1=search$1(query)}))}AnimeClient.on(".manga.list","click",".edit-buttons button",function(e){var thisSel=e.target;var parentSel=AnimeClient.closestParent(e.target,"article");var type=thisSel.classList.contains("plus-one-chapter")?"chapter":"volume";var completed=parseInt(AnimeClient.$("."+type+"s_read",parentSel)[0].textContent,10)||0;var total=parseInt(AnimeClient.$("."+type+"_count", -parentSel)[0].textContent,10);var mangaName=AnimeClient.$(".name",parentSel)[0].textContent;if(isNaN(completed))completed=0;var data={id:parentSel.dataset.kitsuId,mal_id:parentSel.dataset.malId,data:{progress:completed}};if(isNaN(completed)||completed===0)data.data.status="CURRENT";if(!isNaN(completed)&&completed+1===total)data.data.status="COMPLETED";data.data.progress=++completed;AnimeClient.show("#loading-shadow");AnimeClient.ajax(AnimeClient.url("/manga/increment"),{data:data,dataType:"json", -type:"POST",mimeType:"application/json",success:function(res){var resData=JSON.parse(res);if(resData.error){AnimeClient.hide("#loading-shadow");AnimeClient.showMessage("error","Failed to update "+mangaName+". ");AnimeClient.scrollToTop();return}if(String(data.data.status).toUpperCase()==="COMPLETED")AnimeClient.hide(parentSel);AnimeClient.hide("#loading-shadow");AnimeClient.$("."+type+"s_read",parentSel)[0].textContent=String(completed);AnimeClient.showMessage("success","Successfully updated "+mangaName); -AnimeClient.scrollToTop()},error:function(){AnimeClient.hide("#loading-shadow");AnimeClient.showMessage("error","Failed to update "+mangaName);AnimeClient.scrollToTop()}})})})() -//# sourceMappingURL=scripts.min.js.map +function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}function _objectSpread(target){for(var i=1;i=0&&m.item(i)!==elm);return i>-1;};var AnimeClient={noop:function(){},$:function(selector,param){var context=param=== void 0?null:param;if(typeof selector!=='string')return selector;context=context!==null&&context.nodeType===1?context:document;var elements=[];if(selector.match(/^#([\w]+$)/))elements.push(document.getElementById(selector.split('#')[1]));else elements=[].slice.apply(context.querySelectorAll(selector));return elements;},hasElement:function(selector){return AnimeClient["$"](selector).length>0;},scrollToTop:function(){var el=AnimeClient["$"]('header')[0];el.scrollIntoView(true);},hide:function(sel){if(typeof sel==='string')sel=AnimeClient["$"](sel);if(Array.isArray(sel))sel.forEach(function(el){return el.setAttribute('hidden','hidden');});else sel.setAttribute('hidden','hidden');},show:function(sel){if(typeof sel==='string')sel=AnimeClient["$"](sel);if(Array.isArray(sel))sel.forEach(function(el){return el.removeAttribute('hidden');});else sel.removeAttribute('hidden');},showMessage:function(type,message){var template="
\n\t\t\t\t\n\t\t\t\t").concat(message,"\n\t\t\t\t\n\t\t\t
");var sel=AnimeClient["$"]('.message');if(sel[0]!==undefined)sel[0].remove();AnimeClient["$"]('header')[0].insertAdjacentHTML('beforeend',template);},closestParent:function(current,parentSelector){if(Element.prototype.closest!==undefined)return current.closest(parentSelector);while(current!==document.documentElement){if(matches(current,parentSelector))return current;current=current.parentElement;}return null;},url:function(path){var uri="//".concat(document.location.host);uri+=path.charAt(0)==='/'?path:"/".concat(path);return uri;},throttle:function(interval,fn,scope){var wait=false;return function(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}var context=scope||this;if(!wait){fn.apply(context,args);wait=true;setTimeout(function(){wait=false;},interval);}};}};function addEvent(sel,event,listener){if(!event.match(/^([\w\-]+)$/))event.split(' ').forEach(function(evt){addEvent(sel,evt,listener);});sel.addEventListener(event,listener,false);}function delegateEvent(sel,target,event,listener){addEvent(sel,event,function(e){AnimeClient["$"](target,sel).forEach(function(element){if(e.target==element){listener.call(element,e);e.stopPropagation();}});});}AnimeClient.on=function(sel,event,target,listener){if(listener===undefined){listener=target;AnimeClient["$"](sel).forEach(function(el){addEvent(el,event,listener);});}else AnimeClient["$"](sel).forEach(function(el){delegateEvent(el,target,event,listener);});};function ajaxSerialize(data){var pairs=[];Object.keys(data).forEach(function(name){var value=data[name].toString();name=encodeURIComponent(name);value=encodeURIComponent(value);pairs.push("".concat(name,"=").concat(value));});return pairs.join('&');}AnimeClient.ajax=function(url,config){var defaultConfig={data:{},type:'GET',dataType:'',success:AnimeClient.noop,mimeType:'application/x-www-form-urlencoded',error:AnimeClient.noop};config=_objectSpread({},defaultConfig,config);var request=new XMLHttpRequest();var method=String(config.type).toUpperCase();if(method==='GET')url+=url.match(/\?/)?ajaxSerialize(config.data):"?".concat(ajaxSerialize(config.data));request.open(method,url);request.onreadystatechange=function(){if(request.readyState===4){var responseText='';if(request.responseType==='json')responseText=JSON.parse(request.responseText);else responseText=request.responseText;if(request.status>299)config.error.call(null,request.status,responseText,request.response);else config.success.call(null,responseText,request.status);}};if(config.dataType==='json'){config.data=JSON.stringify(config.data);config.mimeType='application/json';}else config.data=ajaxSerialize(config.data);request.setRequestHeader('Content-Type',config.mimeType);if(method==='GET')request.send(null);else request.send(config.data);return request;};AnimeClient.get=function(url,data,param){var callback=param=== void 0?null:param;if(callback===null){callback=data;data={};}return AnimeClient.ajax(url,{data:data,success:callback});};AnimeClient.on('header','click','.message',hide);AnimeClient.on('form.js-delete','submit',confirmDelete);AnimeClient.on('.js-clear-cache','click',clearAPICache);AnimeClient.on('.vertical-tabs input','change',scrollToSection);AnimeClient.on('.media-filter','input',filterMedia);function hide(event){AnimeClient.hide(event.target);}function confirmDelete(event){var proceed=confirm('Are you ABSOLUTELY SURE you want to delete this item?');if(proceed===false){event.preventDefault();event.stopPropagation();}}function clearAPICache(){AnimeClient.get('/cache_purge',function(){AnimeClient.showMessage('success','Successfully purged api cache');});}function scrollToSection(event){var el=event.currentTarget.parentElement;var rect=el.getBoundingClientRect();var top=rect.top+window.pageYOffset;window.scrollTo({top:top,behavior:'smooth'});}function filterMedia(event){var rawFilter=event.target.value;var filter=new RegExp(rawFilter,'i');if(rawFilter!==''){AnimeClient["$"]('article.media').forEach(function(article){var titleLink=AnimeClient["$"]('.name a',article)[0];var title=String(titleLink.textContent).trim();if(!filter.test(title))AnimeClient.hide(article);else AnimeClient.show(article);});AnimeClient["$"]('table.media-wrap tbody tr').forEach(function(tr){var titleCell=AnimeClient["$"]('td.align-left',tr)[0];var titleLink=AnimeClient["$"]('a',titleCell)[0];var linkTitle=String(titleLink.textContent).trim();var textTitle=String(titleCell.textContent).trim();if(!(filter.test(linkTitle)||filter.test(textTitle)))AnimeClient.hide(tr);else AnimeClient.show(tr);});}else{AnimeClient.show('article.media');AnimeClient.show('table.media-wrap tbody tr');}}(function(){var hidden=null;var visibilityChange=null;if(typeof document.hidden!=="undefined"){hidden="hidden";visibilityChange="visibilitychange";}else if(typeof document.msHidden!=="undefined"){hidden="msHidden";visibilityChange="msvisibilitychange";}else if(typeof document.webkitHidden!=="undefined"){hidden="webkitHidden";visibilityChange="webkitvisibilitychange";}function handleVisibilityChange(){if(!document[hidden])AnimeClient.get('/heartbeat',function(beat){var status=JSON.parse(beat);if(status.hasAuth!==true){document.removeEventListener(visibilityChange,handleVisibilityChange,false);location.reload();}});}if(hidden===null)console.info('Page visibility API not supported, JS session check will not work');else document.addEventListener(visibilityChange,handleVisibilityChange,false);})();AnimeClient.on('main','change','.big-check',function(e){var id=e.target.id;document.getElementById("mal_".concat(id)).checked=true;});function renderAnimeSearchResults(data){return data.map(function(item){var titles=item.titles.join('
');return "\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tInfo Page\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t");}).join('');}function renderMangaSearchResults(data){return data.map(function(item){var titles=item.titles.join('
');return "\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tInfo Page\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t");}).join('');}var search=function(query){AnimeClient.show('.cssload-loader');return AnimeClient.get(AnimeClient.url('/anime-collection/search'),{query:query},function(searchResults,status){searchResults=JSON.parse(searchResults);AnimeClient.hide('.cssload-loader');AnimeClient["$"]('#series-list')[0].innerHTML=renderAnimeSearchResults(searchResults);});};if(AnimeClient.hasElement('.anime #search')){var prevRequest=null;AnimeClient.on('#search','input',AnimeClient.throttle(250,function(e){var query=encodeURIComponent(e.target.value);if(query==='')return;if(prevRequest!==null)prevRequest.abort();prevRequest=search(query);}));}AnimeClient.on('body.anime.list','click','.plus-one',function(e){var parentSel=AnimeClient.closestParent(e.target,'article');var watchedCount=parseInt(AnimeClient["$"]('.completed_number',parentSel)[0].textContent,10)||0;var totalCount=parseInt(AnimeClient["$"]('.total_number',parentSel)[0].textContent,10);var title=AnimeClient["$"]('.name a',parentSel)[0].textContent;var data={id:parentSel.dataset.kitsuId,mal_id:parentSel.dataset.malId,data:{progress:watchedCount+1}};if(isNaN(watchedCount)||watchedCount===0)data.data.status='CURRENT';if(!isNaN(watchedCount)&&watchedCount+1===totalCount)data.data.status='COMPLETED';AnimeClient.show('#loading-shadow');AnimeClient.ajax(AnimeClient.url('/anime/increment'),{data:data,dataType:'json',type:'POST',success:function(res){var resData=JSON.parse(res);if(resData.error){AnimeClient.hide('#loading-shadow');AnimeClient.showMessage('error',"Failed to update ".concat(title,". "));AnimeClient.scrollToTop();return;}if(resData.data.libraryEntry.update.libraryEntry.status==='COMPLETED')AnimeClient.hide(parentSel);AnimeClient.hide('#loading-shadow');AnimeClient.showMessage('success',"Successfully updated ".concat(title));AnimeClient["$"]('.completed_number',parentSel)[0].textContent=++watchedCount;AnimeClient.scrollToTop();},error:function(){AnimeClient.hide('#loading-shadow');AnimeClient.showMessage('error',"Failed to update ".concat(title,". "));AnimeClient.scrollToTop();}});});var search1=function(query){AnimeClient.show('.cssload-loader');return AnimeClient.get(AnimeClient.url('/manga/search'),{query:query},function(searchResults,status){searchResults=JSON.parse(searchResults);AnimeClient.hide('.cssload-loader');AnimeClient["$"]('#series-list')[0].innerHTML=renderMangaSearchResults(searchResults);});};if(AnimeClient.hasElement('.manga #search')){var prevRequest=null;AnimeClient.on('#search','input',AnimeClient.throttle(250,function(e){var query=encodeURIComponent(e.target.value);if(query==='')return;if(prevRequest!==null)prevRequest.abort();prevRequest=search1(query);}));}AnimeClient.on('.manga.list','click','.edit-buttons button',function(e){var thisSel=e.target;var parentSel=AnimeClient.closestParent(e.target,'article');var type=thisSel.classList.contains('plus-one-chapter')?'chapter':'volume';var completed=parseInt(AnimeClient["$"](".".concat(type,"s_read"),parentSel)[0].textContent,10)||0;var total=parseInt(AnimeClient["$"](".".concat(type,"_count"),parentSel)[0].textContent,10);var mangaName=AnimeClient["$"]('.name',parentSel)[0].textContent;if(isNaN(completed))completed=0;var data={id:parentSel.dataset.kitsuId,mal_id:parentSel.dataset.malId,data:{progress:completed}};if(isNaN(completed)||completed===0)data.data.status='CURRENT';if(!isNaN(completed)&&completed+1===total)data.data.status='COMPLETED';data.data.progress=++completed;AnimeClient.show('#loading-shadow');AnimeClient.ajax(AnimeClient.url('/manga/increment'),{data:data,dataType:'json',type:'POST',mimeType:'application/json',success:function(res){var resData=JSON.parse(res);if(resData.error){AnimeClient.hide('#loading-shadow');AnimeClient.showMessage('error',"Failed to update ".concat(mangaName,". "));AnimeClient.scrollToTop();return;}if(String(data.data.status).toUpperCase()==='COMPLETED')AnimeClient.hide(parentSel);AnimeClient.hide('#loading-shadow');AnimeClient["$"](".".concat(type,"s_read"),parentSel)[0].textContent=String(completed);AnimeClient.showMessage('success',"Successfully updated ".concat(mangaName));AnimeClient.scrollToTop();},error:function(){AnimeClient.hide('#loading-shadow');AnimeClient.showMessage('error',"Failed to update ".concat(mangaName));AnimeClient.scrollToTop();}});}); \ No newline at end of file diff --git a/public/js/scripts.min.js.map b/public/js/scripts.min.js.map index b4448c15..14880485 100644 --- a/public/js/scripts.min.js.map +++ b/public/js/scripts.min.js.map @@ -1 +1 @@ -{"version":3,"file":"scripts.min.js.map","sources":["../../frontEndSrc/js/anime-client.js","../../frontEndSrc/js/events.js","../../frontEndSrc/js/anon.js","../../frontEndSrc/js/session-check.js","../../frontEndSrc/js/template-helpers.js","../../frontEndSrc/js/anime.js","../../frontEndSrc/js/manga.js"],"sourcesContent":["// -------------------------------------------------------------------------\n// ! Base\n// -------------------------------------------------------------------------\n\nconst matches = (elm, selector) => {\n\tlet m = (elm.document || elm.ownerDocument).querySelectorAll(selector);\n\tlet i = matches.length;\n\twhile (--i >= 0 && m.item(i) !== elm) {};\n\treturn i > -1;\n}\n\nexport const AnimeClient = {\n\t/**\n\t * Placeholder function\n\t */\n\tnoop: () => {},\n\t/**\n\t * DOM selector\n\t *\n\t * @param {string} selector - The dom selector string\n\t * @param {object} [context]\n\t * @return {[HTMLElement]} - array of dom elements\n\t */\n\t$(selector, context = null) {\n\t\tif (typeof selector !== 'string') {\n\t\t\treturn selector;\n\t\t}\n\n\t\tcontext = (context !== null && context.nodeType === 1)\n\t\t\t? context\n\t\t\t: document;\n\n\t\tlet elements = [];\n\t\tif (selector.match(/^#([\\w]+$)/)) {\n\t\t\telements.push(document.getElementById(selector.split('#')[1]));\n\t\t} else {\n\t\t\telements = [].slice.apply(context.querySelectorAll(selector));\n\t\t}\n\n\t\treturn elements;\n\t},\n\t/**\n\t * Does the selector exist on the current page?\n\t *\n\t * @param {string} selector\n\t * @returns {boolean}\n\t */\n\thasElement (selector) {\n\t\treturn AnimeClient.$(selector).length > 0;\n\t},\n\t/**\n\t * Scroll to the top of the Page\n\t *\n\t * @return {void}\n\t */\n\tscrollToTop () {\n\t\tconst el = AnimeClient.$('header')[0];\n\t\tel.scrollIntoView(true);\n\t},\n\t/**\n\t * Hide the selected element\n\t *\n\t * @param {string|Element} sel - the selector of the element to hide\n\t * @return {void}\n\t */\n\thide (sel) {\n\t\tif (typeof sel === 'string') {\n\t\t\tsel = AnimeClient.$(sel);\n\t\t}\n\n\t\tif (Array.isArray(sel)) {\n\t\t\tsel.forEach(el => el.setAttribute('hidden', 'hidden'));\n\t\t} else {\n\t\t\tsel.setAttribute('hidden', 'hidden');\n\t\t}\n\t},\n\t/**\n\t * UnHide the selected element\n\t *\n\t * @param {string|Element} sel - the selector of the element to hide\n\t * @return {void}\n\t */\n\tshow (sel) {\n\t\tif (typeof sel === 'string') {\n\t\t\tsel = AnimeClient.$(sel);\n\t\t}\n\n\t\tif (Array.isArray(sel)) {\n\t\t\tsel.forEach(el => el.removeAttribute('hidden'));\n\t\t} else {\n\t\t\tsel.removeAttribute('hidden');\n\t\t}\n\t},\n\t/**\n\t * Display a message box\n\t *\n\t * @param {string} type - message type: info, error, success\n\t * @param {string} message - the message itself\n\t * @return {void}\n\t */\n\tshowMessage (type, message) {\n\t\tlet template =\n\t\t\t`
\n\t\t\t\t\n\t\t\t\t${message}\n\t\t\t\t\n\t\t\t
`;\n\n\t\tlet sel = AnimeClient.$('.message');\n\t\tif (sel[0] !== undefined) {\n\t\t\tsel[0].remove();\n\t\t}\n\n\t\tAnimeClient.$('header')[0].insertAdjacentHTML('beforeend', template);\n\t},\n\t/**\n\t * Finds the closest parent element matching the passed selector\n\t *\n\t * @param {HTMLElement} current - the current HTMLElement\n\t * @param {string} parentSelector - selector for the parent element\n\t * @return {HTMLElement|null} - the parent element\n\t */\n\tclosestParent (current, parentSelector) {\n\t\tif (Element.prototype.closest !== undefined) {\n\t\t\treturn current.closest(parentSelector);\n\t\t}\n\n\t\twhile (current !== document.documentElement) {\n\t\t\tif (matches(current, parentSelector)) {\n\t\t\t\treturn current;\n\t\t\t}\n\n\t\t\tcurrent = current.parentElement;\n\t\t}\n\n\t\treturn null;\n\t},\n\t/**\n\t * Generate a full url from a relative path\n\t *\n\t * @param {string} path - url path\n\t * @return {string} - full url\n\t */\n\turl (path) {\n\t\tlet uri = `//${document.location.host}`;\n\t\turi += (path.charAt(0) === '/') ? path : `/${path}`;\n\n\t\treturn uri;\n\t},\n\t/**\n\t * Throttle execution of a function\n\t *\n\t * @see https://remysharp.com/2010/07/21/throttling-function-calls\n\t * @see https://jsfiddle.net/jonathansampson/m7G64/\n\t * @param {Number} interval - the minimum throttle time in ms\n\t * @param {Function} fn - the function to throttle\n\t * @param {Object} [scope] - the 'this' object for the function\n\t * @return {Function}\n\t */\n\tthrottle (interval, fn, scope) {\n\t\tlet wait = false;\n\t\treturn function (...args) {\n\t\t\tconst context = scope || this;\n\n\t\t\tif ( ! wait) {\n\t\t\t\tfn.apply(context, args);\n\t\t\t\twait = true;\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\twait = false;\n\t\t\t\t}, interval);\n\t\t\t}\n\t\t};\n\t},\n};\n\n// -------------------------------------------------------------------------\n// ! Events\n// -------------------------------------------------------------------------\n\nfunction addEvent(sel, event, listener) {\n\t// Recurse!\n\tif (! event.match(/^([\\w\\-]+)$/)) {\n\t\tevent.split(' ').forEach((evt) => {\n\t\t\taddEvent(sel, evt, listener);\n\t\t});\n\t}\n\n\tsel.addEventListener(event, listener, false);\n}\n\nfunction delegateEvent(sel, target, event, listener) {\n\t// Attach the listener to the parent\n\taddEvent(sel, event, (e) => {\n\t\t// Get live version of the target selector\n\t\tAnimeClient.$(target, sel).forEach((element) => {\n\t\t\tif(e.target == element) {\n\t\t\t\tlistener.call(element, e);\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Add an event listener\n *\n * @param {string|HTMLElement} sel - the parent selector to bind to\n * @param {string} event - event name(s) to bind\n * @param {string|HTMLElement|function} target - the element to directly bind the event to\n * @param {function} [listener] - event listener callback\n * @return {void}\n */\nAnimeClient.on = (sel, event, target, listener) => {\n\tif (listener === undefined) {\n\t\tlistener = target;\n\t\tAnimeClient.$(sel).forEach((el) => {\n\t\t\taddEvent(el, event, listener);\n\t\t});\n\t} else {\n\t\tAnimeClient.$(sel).forEach((el) => {\n\t\t\tdelegateEvent(el, target, event, listener);\n\t\t});\n\t}\n};\n\n// -------------------------------------------------------------------------\n// ! Ajax\n// -------------------------------------------------------------------------\n\n/**\n * Url encoding for non-get requests\n *\n * @param data\n * @returns {string}\n * @private\n */\nfunction ajaxSerialize(data) {\n\tlet pairs = [];\n\n\tObject.keys(data).forEach((name) => {\n\t\tlet value = data[name].toString();\n\n\t\tname = encodeURIComponent(name);\n\t\tvalue = encodeURIComponent(value);\n\n\t\tpairs.push(`${name}=${value}`);\n\t});\n\n\treturn pairs.join('&');\n}\n\n/**\n * Make an ajax request\n *\n * Config:{\n * \tdata: // data to send with the request\n * \ttype: // http verb of the request, defaults to GET\n * \tsuccess: // success callback\n * \terror: // error callback\n * }\n *\n * @param {string} url - the url to request\n * @param {Object} config - the configuration object\n * @return {XMLHttpRequest}\n */\nAnimeClient.ajax = (url, config) => {\n\t// Set some sane defaults\n\tconst defaultConfig = {\n\t\tdata: {},\n\t\ttype: 'GET',\n\t\tdataType: '',\n\t\tsuccess: AnimeClient.noop,\n\t\tmimeType: 'application/x-www-form-urlencoded',\n\t\terror: AnimeClient.noop\n\t}\n\n\tconfig = {\n\t\t...defaultConfig,\n\t\t...config,\n\t}\n\n\tlet request = new XMLHttpRequest();\n\tlet method = String(config.type).toUpperCase();\n\n\tif (method === 'GET') {\n\t\turl += (url.match(/\\?/))\n\t\t\t? ajaxSerialize(config.data)\n\t\t\t: `?${ajaxSerialize(config.data)}`;\n\t}\n\n\trequest.open(method, url);\n\n\trequest.onreadystatechange = () => {\n\t\tif (request.readyState === 4) {\n\t\t\tlet responseText = '';\n\n\t\t\tif (request.responseType === 'json') {\n\t\t\t\tresponseText = JSON.parse(request.responseText);\n\t\t\t} else {\n\t\t\t\tresponseText = request.responseText;\n\t\t\t}\n\n\t\t\tif (request.status > 299) {\n\t\t\t\tconfig.error.call(null, request.status, responseText, request.response);\n\t\t\t} else {\n\t\t\t\tconfig.success.call(null, responseText, request.status);\n\t\t\t}\n\t\t}\n\t};\n\n\tif (config.dataType === 'json') {\n\t\tconfig.data = JSON.stringify(config.data);\n\t\tconfig.mimeType = 'application/json';\n\t} else {\n\t\tconfig.data = ajaxSerialize(config.data);\n\t}\n\n\trequest.setRequestHeader('Content-Type', config.mimeType);\n\n\tif (method === 'GET') {\n\t\trequest.send(null);\n\t} else {\n\t\trequest.send(config.data);\n\t}\n\n\treturn request\n};\n\n/**\n * Do a get request\n *\n * @param {string} url\n * @param {object|function} data\n * @param {function} [callback]\n * @return {XMLHttpRequest}\n */\nAnimeClient.get = (url, data, callback = null) => {\n\tif (callback === null) {\n\t\tcallback = data;\n\t\tdata = {};\n\t}\n\n\treturn AnimeClient.ajax(url, {\n\t\tdata,\n\t\tsuccess: callback\n\t});\n};\n\n// -------------------------------------------------------------------------\n// Export\n// -------------------------------------------------------------------------\n\nexport default AnimeClient;","import _ from './anime-client.js';\n\n// ----------------------------------------------------------------------------\n// Event subscriptions\n// ----------------------------------------------------------------------------\n_.on('header', 'click', '.message', hide);\n_.on('form.js-delete', 'submit', confirmDelete);\n_.on('.js-clear-cache', 'click', clearAPICache);\n_.on('.vertical-tabs input', 'change', scrollToSection);\n_.on('.media-filter', 'input', filterMedia);\n\n// ----------------------------------------------------------------------------\n// Handler functions\n// ----------------------------------------------------------------------------\n\n/**\n * Hide the html element attached to the event\n *\n * @param event\n * @return void\n */\nfunction hide (event) {\n\t_.hide(event.target)\n}\n\n/**\n * Confirm deletion of an item\n *\n * @param event\n * @return void\n */\nfunction confirmDelete (event) {\n\tconst proceed = confirm('Are you ABSOLUTELY SURE you want to delete this item?');\n\n\tif (proceed === false) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t}\n}\n\n/**\n * Clear the API cache, and show a message if the cache is cleared\n *\n * @return void\n */\nfunction clearAPICache () {\n\t_.get('/cache_purge', () => {\n\t\t_.showMessage('success', 'Successfully purged api cache');\n\t});\n}\n\n/**\n * Scroll to the accordion/vertical tab section just opened\n *\n * @param event\n * @return void\n */\nfunction scrollToSection (event) {\n\tconst el = event.currentTarget.parentElement;\n\tconst rect = el.getBoundingClientRect();\n\n\tconst top = rect.top + window.pageYOffset;\n\n\twindow.scrollTo({\n\t\ttop,\n\t\tbehavior: 'smooth',\n\t});\n}\n\n/**\n * Filter an anime or manga list\n *\n * @param event\n * @return void\n */\nfunction filterMedia (event) {\n\tconst rawFilter = event.target.value;\n\tconst filter = new RegExp(rawFilter, 'i');\n\n\t// console.log('Filtering items by: ', filter);\n\n\tif (rawFilter !== '') {\n\t\t// Filter the cover view\n\t\t_.$('article.media').forEach(article => {\n\t\t\tconst titleLink = _.$('.name a', article)[0];\n\t\t\tconst title = String(titleLink.textContent).trim();\n\t\t\tif ( ! filter.test(title)) {\n\t\t\t\t_.hide(article);\n\t\t\t} else {\n\t\t\t\t_.show(article);\n\t\t\t}\n\t\t});\n\n\t\t// Filter the list view\n\t\t_.$('table.media-wrap tbody tr').forEach(tr => {\n\t\t\tconst titleCell = _.$('td.align-left', tr)[0];\n\t\t\tconst titleLink = _.$('a', titleCell)[0];\n\t\t\tconst linkTitle = String(titleLink.textContent).trim();\n\t\t\tconst textTitle = String(titleCell.textContent).trim();\n\t\t\tif ( ! (filter.test(linkTitle) || filter.test(textTitle))) {\n\t\t\t\t_.hide(tr);\n\t\t\t} else {\n\t\t\t\t_.show(tr);\n\t\t\t}\n\t\t});\n\t} else {\n\t\t_.show('article.media');\n\t\t_.show('table.media-wrap tbody tr');\n\t}\n}\n","import './events.js';\n\nif ('serviceWorker' in navigator) {\n\tnavigator.serviceWorker.register('/sw.js').then(reg => {\n\t\tconsole.log('Service worker registered', reg.scope);\n\t}).catch(error => {\n\t\tconsole.error('Failed to register service worker', error);\n\t});\n}\n\n","import _ from './anime-client.js';\n\n(() => {\n\t// Var is intentional\n\tvar hidden = null;\n\tvar visibilityChange = null;\n\n\tif (typeof document.hidden !== \"undefined\") {\n\t\thidden = \"hidden\";\n\t\tvisibilityChange = \"visibilitychange\";\n\t} else if (typeof document.msHidden !== \"undefined\") {\n\t\thidden = \"msHidden\";\n\t\tvisibilityChange = \"msvisibilitychange\";\n\t} else if (typeof document.webkitHidden !== \"undefined\") {\n\t\thidden = \"webkitHidden\";\n\t\tvisibilityChange = \"webkitvisibilitychange\";\n\t}\n\n\tfunction handleVisibilityChange() {\n\t\t// Check the user's session to see if they are currently logged-in\n\t\t// when the page becomes visible\n\t\tif ( ! document[hidden]) {\n\t\t\t_.get('/heartbeat', (beat) => {\n\t\t\t\tconst status = JSON.parse(beat)\n\n\t\t\t\t// If the session is expired, immediately reload so that\n\t\t\t\t// you can't attempt to do an action that requires authentication\n\t\t\t\tif (status.hasAuth !== true) {\n\t\t\t\t\tdocument.removeEventListener(visibilityChange, handleVisibilityChange, false);\n\t\t\t\t\tlocation.reload();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tif (hidden === null) {\n\t\tconsole.info('Page visibility API not supported, JS session check will not work');\n\t} else {\n\t\tdocument.addEventListener(visibilityChange, handleVisibilityChange, false);\n\t}\n})();","import _ from './anime-client.js';\n\n// Click on hidden MAL checkbox so\n// that MAL id is passed\n_.on('main', 'change', '.big-check', (e) => {\n\tconst id = e.target.id;\n\tdocument.getElementById(`mal_${id}`).checked = true;\n});\n\nexport function renderAnimeSearchResults (data) {\n\treturn data.map(item => {\n\t\tconst titles = item.titles.join('
');\n\n\t\treturn `\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tInfo Page\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t`;\n\t}).join('');\n}\n\nexport function renderMangaSearchResults (data) {\n\treturn data.map(item => {\n\t\tconst titles = item.titles.join('
');\n\t\treturn `\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tInfo Page\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t`;\n\t}).join('');\n}","import _ from './anime-client.js'\nimport { renderAnimeSearchResults } from './template-helpers.js'\n\nconst search = (query) => {\n\t// Show the loader\n\t_.show('.cssload-loader');\n\n\t// Do the api search\n\treturn _.get(_.url('/anime-collection/search'), { query }, (searchResults, status) => {\n\t\tsearchResults = JSON.parse(searchResults);\n\n\t\t// Hide the loader\n\t\t_.hide('.cssload-loader');\n\n\t\t// Show the results\n\t\t_.$('#series-list')[ 0 ].innerHTML = renderAnimeSearchResults(searchResults);\n\t});\n};\n\nif (_.hasElement('.anime #search')) {\n\tlet prevRequest = null;\n\n\t_.on('#search', 'input', _.throttle(250, (e) => {\n\t\tconst query = encodeURIComponent(e.target.value);\n\t\tif (query === '') {\n\t\t\treturn;\n\t\t}\n\n\t\tif (prevRequest !== null) {\n\t\t\tprevRequest.abort();\n\t\t}\n\n\t\tprevRequest = search(query);\n\t}));\n}\n\n// Action to increment episode count\n_.on('body.anime.list', 'click', '.plus-one', (e) => {\n\tlet parentSel = _.closestParent(e.target, 'article');\n\tlet watchedCount = parseInt(_.$('.completed_number', parentSel)[ 0 ].textContent, 10) || 0;\n\tlet totalCount = parseInt(_.$('.total_number', parentSel)[ 0 ].textContent, 10);\n\tlet title = _.$('.name a', parentSel)[ 0 ].textContent;\n\n\t// Setup the update data\n\tlet data = {\n\t\tid: parentSel.dataset.kitsuId,\n\t\tmal_id: parentSel.dataset.malId,\n\t\tdata: {\n\t\t\tprogress: watchedCount + 1\n\t\t}\n\t};\n\n\t// If the episode count is 0, and incremented,\n\t// change status to currently watching\n\tif (isNaN(watchedCount) || watchedCount === 0) {\n\t\tdata.data.status = 'CURRENT';\n\t}\n\n\t// If you increment at the last episode, mark as completed\n\tif ((!isNaN(watchedCount)) && (watchedCount + 1) === totalCount) {\n\t\tdata.data.status = 'COMPLETED';\n\t}\n\n\t_.show('#loading-shadow');\n\n\t// okay, lets actually make some changes!\n\t_.ajax(_.url('/anime/increment'), {\n\t\tdata,\n\t\tdataType: 'json',\n\t\ttype: 'POST',\n\t\tsuccess: (res) => {\n\t\t\tconst resData = JSON.parse(res);\n\n\t\t\tif (resData.error) {\n\t\t\t\t_.hide('#loading-shadow');\n\t\t\t\t_.showMessage('error', `Failed to update ${title}. `);\n\t\t\t\t_.scrollToTop();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (resData.data.libraryEntry.update.libraryEntry.status === 'COMPLETED') {\n\t\t\t\t_.hide(parentSel);\n\t\t\t}\n\n\t\t\t_.hide('#loading-shadow');\n\n\t\t\t_.showMessage('success', `Successfully updated ${title}`);\n\t\t\t_.$('.completed_number', parentSel)[ 0 ].textContent = ++watchedCount;\n\t\t\t_.scrollToTop();\n\t\t},\n\t\terror: () => {\n\t\t\t_.hide('#loading-shadow');\n\t\t\t_.showMessage('error', `Failed to update ${title}. `);\n\t\t\t_.scrollToTop();\n\t\t}\n\t});\n});","import _ from './anime-client.js'\nimport { renderMangaSearchResults } from './template-helpers.js'\n\nconst search = (query) => {\n\t_.show('.cssload-loader');\n\treturn _.get(_.url('/manga/search'), { query }, (searchResults, status) => {\n\t\tsearchResults = JSON.parse(searchResults);\n\t\t_.hide('.cssload-loader');\n\t\t_.$('#series-list')[ 0 ].innerHTML = renderMangaSearchResults(searchResults);\n\t});\n};\n\nif (_.hasElement('.manga #search')) {\n\tlet prevRequest = null\n\n\t_.on('#search', 'input', _.throttle(250, (e) => {\n\t\tlet query = encodeURIComponent(e.target.value);\n\t\tif (query === '') {\n\t\t\treturn;\n\t\t}\n\n\t\tif (prevRequest !== null) {\n\t\t\tprevRequest.abort();\n\t\t}\n\n\t\tprevRequest = search(query);\n\t}));\n}\n\n/**\n * Javascript for editing manga, if logged in\n */\n_.on('.manga.list', 'click', '.edit-buttons button', (e) => {\n\tlet thisSel = e.target;\n\tlet parentSel = _.closestParent(e.target, 'article');\n\tlet type = thisSel.classList.contains('plus-one-chapter') ? 'chapter' : 'volume';\n\tlet completed = parseInt(_.$(`.${type}s_read`, parentSel)[ 0 ].textContent, 10) || 0;\n\tlet total = parseInt(_.$(`.${type}_count`, parentSel)[ 0 ].textContent, 10);\n\tlet mangaName = _.$('.name', parentSel)[ 0 ].textContent;\n\n\tif (isNaN(completed)) {\n\t\tcompleted = 0;\n\t}\n\n\t// Setup the update data\n\tlet data = {\n\t\tid: parentSel.dataset.kitsuId,\n\t\tmal_id: parentSel.dataset.malId,\n\t\tdata: {\n\t\t\tprogress: completed\n\t\t}\n\t};\n\n\t// If the episode count is 0, and incremented,\n\t// change status to currently reading\n\tif (isNaN(completed) || completed === 0) {\n\t\tdata.data.status = 'CURRENT';\n\t}\n\n\t// If you increment at the last chapter, mark as completed\n\tif ((!isNaN(completed)) && (completed + 1) === total) {\n\t\tdata.data.status = 'COMPLETED';\n\t}\n\n\t// Update the total count\n\tdata.data.progress = ++completed;\n\n\t_.show('#loading-shadow');\n\n\t_.ajax(_.url('/manga/increment'), {\n\t\tdata,\n\t\tdataType: 'json',\n\t\ttype: 'POST',\n\t\tmimeType: 'application/json',\n\t\tsuccess: (res) => {\n\t\t\tconst resData = JSON.parse(res)\n\t\t\tif (resData.error) {\n\t\t\t\t_.hide('#loading-shadow');\n\t\t\t\t_.showMessage('error', `Failed to update ${mangaName}. `);\n\t\t\t\t_.scrollToTop();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (String(data.data.status).toUpperCase() === 'COMPLETED') {\n\t\t\t\t_.hide(parentSel);\n\t\t\t}\n\n\t\t\t_.hide('#loading-shadow');\n\n\t\t\t_.$(`.${type}s_read`, parentSel)[ 0 ].textContent = String(completed);\n\t\t\t_.showMessage('success', `Successfully updated ${mangaName}`);\n\t\t\t_.scrollToTop();\n\t\t},\n\t\terror: () => {\n\t\t\t_.hide('#loading-shadow');\n\t\t\t_.showMessage('error', `Failed to update ${mangaName}`);\n\t\t\t_.scrollToTop();\n\t\t}\n\t});\n});"],"names":["selector","m","querySelectorAll","elm","document","ownerDocument","i","matches","length","item","noop","$","context","nodeType","elements","match","push","getElementById","split","slice","apply","hasElement","AnimeClient","scrollToTop","el","scrollIntoView","hide","sel","Array","isArray","forEach","setAttribute","show","removeAttribute","showMessage","type","message","template","undefined","remove","insertAdjacentHTML","closestParent","current","parentSelector","Element","prototype","closest","documentElement","parentElement","url","path","uri","location","host","charAt","throttle","interval","fn","scope","wait","args","setTimeout","addEvent","event","listener","evt","addEventListener","delegateEvent","target","e","element","call","stopPropagation","on","AnimeClient.on","ajaxSerialize","data","pairs","Object","keys","name","value","toString","encodeURIComponent","join","ajax","AnimeClient.ajax","config","dataType","success","mimeType","error","defaultConfig","request","XMLHttpRequest","method","String","toUpperCase","open","onreadystatechange","request.onreadystatechange","readyState","responseText","responseType","JSON","parse","status","response","stringify","setRequestHeader","send","get","AnimeClient.get","callback","confirmDelete","clearAPICache","scrollToSection","filterMedia","_","proceed","preventDefault","window","scrollTo","top","behavior","rawFilter","article","filter","test","title","tr","titleCell","linkTitle","textTitle","navigator","serviceWorker","register","then","reg","console","log","catch","hidden","visibilityChange","msHidden","webkitHidden","handleVisibilityChange","beat","hasAuth","removeEventListener","reload","info","id","checked","renderAnimeSearchResults","map","slug","mal_id","canonicalTitle","titles","renderMangaSearchResults","query","searchResults","prevRequest","abort","search","parentSel","watchedCount","parseInt","totalCount","dataset","kitsuId","malId","progress","isNaN","res","resData","libraryEntry","update","thisSel","classList","contains","completed","total","mangaName"],"mappings":"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"} \ No newline at end of file +{"version":3,"sources":["/var/www/htdocs/github.timshomepage.net/animeclient/frontEndSrc/js/sw.js","/var/www/htdocs/github.timshomepage.net/animeclient/frontEndSrc/js/anime-client.js","/var/www/htdocs/github.timshomepage.net/animeclient/frontEndSrc/js/events.js","/var/www/htdocs/github.timshomepage.net/animeclient/frontEndSrc/js/session-check.js","/var/www/htdocs/github.timshomepage.net/animeclient/frontEndSrc/js/template-helpers.js","/var/www/htdocs/github.timshomepage.net/animeclient/frontEndSrc/js/anime.js","/var/www/htdocs/github.timshomepage.net/animeclient/frontEndSrc/js/manga.js"],"sourcesContent":["// Start the service worker, if you can\nif ('serviceWorker' in navigator) {\n\tnavigator.serviceWorker.register('/sw.js').then(reg => {\n\t\tconsole.log('Service worker registered', reg.scope);\n\t}).catch(error => {\n\t\tconsole.error('Failed to register service worker', error);\n\t});\n}","// -------------------------------------------------------------------------\n// ! Base\n// -------------------------------------------------------------------------\n\nconst matches = (elm, selector) => {\n\tlet m = (elm.document || elm.ownerDocument).querySelectorAll(selector);\n\tlet i = matches.length;\n\twhile (--i >= 0 && m.item(i) !== elm) {};\n\treturn i > -1;\n}\n\nconst AnimeClient = {\n\t/**\n\t * Placeholder function\n\t */\n\tnoop: () => {},\n\t/**\n\t * DOM selector\n\t *\n\t * @param {string} selector - The dom selector string\n\t * @param {Element} [context]\n\t * @return array of dom elements\n\t */\n\t$(selector, context = null) {\n\t\tif (typeof selector !== 'string') {\n\t\t\treturn selector;\n\t\t}\n\n\t\tcontext = (context !== null && context.nodeType === 1)\n\t\t\t? context\n\t\t\t: document;\n\n\t\tlet elements = [];\n\t\tif (selector.match(/^#([\\w]+$)/)) {\n\t\t\telements.push(document.getElementById(selector.split('#')[1]));\n\t\t} else {\n\t\t\telements = [].slice.apply(context.querySelectorAll(selector));\n\t\t}\n\n\t\treturn elements;\n\t},\n\t/**\n\t * Does the selector exist on the current page?\n\t *\n\t * @param {string} selector\n\t * @returns {boolean}\n\t */\n\thasElement (selector) {\n\t\treturn AnimeClient.$(selector).length > 0;\n\t},\n\t/**\n\t * Scroll to the top of the Page\n\t *\n\t * @return {void}\n\t */\n\tscrollToTop () {\n\t\tconst el = AnimeClient.$('header')[0];\n\t\tel.scrollIntoView(true);\n\t},\n\t/**\n\t * Hide the selected element\n\t *\n\t * @param {string|Element|Element[]} sel - the selector of the element to hide\n\t * @return {void}\n\t */\n\thide (sel) {\n\t\tif (typeof sel === 'string') {\n\t\t\tsel = AnimeClient.$(sel);\n\t\t}\n\n\t\tif (Array.isArray(sel)) {\n\t\t\tsel.forEach(el => el.setAttribute('hidden', 'hidden'));\n\t\t} else {\n\t\t\tsel.setAttribute('hidden', 'hidden');\n\t\t}\n\t},\n\t/**\n\t * UnHide the selected element\n\t *\n\t * @param {string|Element|Element[]} sel - the selector of the element to hide\n\t * @return {void}\n\t */\n\tshow (sel) {\n\t\tif (typeof sel === 'string') {\n\t\t\tsel = AnimeClient.$(sel);\n\t\t}\n\n\t\tif (Array.isArray(sel)) {\n\t\t\tsel.forEach(el => el.removeAttribute('hidden'));\n\t\t} else {\n\t\t\tsel.removeAttribute('hidden');\n\t\t}\n\t},\n\t/**\n\t * Display a message box\n\t *\n\t * @param {string} type - message type: info, error, success\n\t * @param {string} message - the message itself\n\t * @return {void}\n\t */\n\tshowMessage (type, message) {\n\t\tlet template =\n\t\t\t`
\n\t\t\t\t\n\t\t\t\t${message}\n\t\t\t\t\n\t\t\t
`;\n\n\t\tlet sel = AnimeClient.$('.message');\n\t\tif (sel[0] !== undefined) {\n\t\t\tsel[0].remove();\n\t\t}\n\n\t\tAnimeClient.$('header')[0].insertAdjacentHTML('beforeend', template);\n\t},\n\t/**\n\t * Finds the closest parent element matching the passed selector\n\t *\n\t * @param {Element} current - the current Element\n\t * @param {string} parentSelector - selector for the parent element\n\t * @return {Element|null} - the parent element\n\t */\n\tclosestParent (current, parentSelector) {\n\t\tif (Element.prototype.closest !== undefined) {\n\t\t\treturn current.closest(parentSelector);\n\t\t}\n\n\t\twhile (current !== document.documentElement) {\n\t\t\tif (matches(current, parentSelector)) {\n\t\t\t\treturn current;\n\t\t\t}\n\n\t\t\tcurrent = current.parentElement;\n\t\t}\n\n\t\treturn null;\n\t},\n\t/**\n\t * Generate a full url from a relative path\n\t *\n\t * @param {string} path - url path\n\t * @return {string} - full url\n\t */\n\turl (path) {\n\t\tlet uri = `//${document.location.host}`;\n\t\turi += (path.charAt(0) === '/') ? path : `/${path}`;\n\n\t\treturn uri;\n\t},\n\t/**\n\t * Throttle execution of a function\n\t *\n\t * @see https://remysharp.com/2010/07/21/throttling-function-calls\n\t * @see https://jsfiddle.net/jonathansampson/m7G64/\n\t * @param {Number} interval - the minimum throttle time in ms\n\t * @param {Function} fn - the function to throttle\n\t * @param {Object} [scope] - the 'this' object for the function\n\t * @return {Function}\n\t */\n\tthrottle (interval, fn, scope) {\n\t\tlet wait = false;\n\t\treturn function (...args) {\n\t\t\tconst context = scope || this;\n\n\t\t\tif ( ! wait) {\n\t\t\t\tfn.apply(context, args);\n\t\t\t\twait = true;\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\twait = false;\n\t\t\t\t}, interval);\n\t\t\t}\n\t\t};\n\t},\n};\n\n// -------------------------------------------------------------------------\n// ! Events\n// -------------------------------------------------------------------------\n\nfunction addEvent(sel, event, listener) {\n\t// Recurse!\n\tif (! event.match(/^([\\w\\-]+)$/)) {\n\t\tevent.split(' ').forEach((evt) => {\n\t\t\taddEvent(sel, evt, listener);\n\t\t});\n\t}\n\n\tsel.addEventListener(event, listener, false);\n}\n\nfunction delegateEvent(sel, target, event, listener) {\n\t// Attach the listener to the parent\n\taddEvent(sel, event, (e) => {\n\t\t// Get live version of the target selector\n\t\tAnimeClient.$(target, sel).forEach((element) => {\n\t\t\tif(e.target == element) {\n\t\t\t\tlistener.call(element, e);\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Add an event listener\n *\n * @param {string|Element} sel - the parent selector to bind to\n * @param {string} event - event name(s) to bind\n * @param {string|Element|function} target - the element to directly bind the event to\n * @param {function} [listener] - event listener callback\n * @return {void}\n */\nAnimeClient.on = (sel, event, target, listener) => {\n\tif (listener === undefined) {\n\t\tlistener = target;\n\t\tAnimeClient.$(sel).forEach((el) => {\n\t\t\taddEvent(el, event, listener);\n\t\t});\n\t} else {\n\t\tAnimeClient.$(sel).forEach((el) => {\n\t\t\tdelegateEvent(el, target, event, listener);\n\t\t});\n\t}\n};\n\n// -------------------------------------------------------------------------\n// ! Ajax\n// -------------------------------------------------------------------------\n\n/**\n * Url encoding for non-get requests\n *\n * @param data\n * @returns {string}\n * @private\n */\nfunction ajaxSerialize(data) {\n\tlet pairs = [];\n\n\tObject.keys(data).forEach((name) => {\n\t\tlet value = data[name].toString();\n\n\t\tname = encodeURIComponent(name);\n\t\tvalue = encodeURIComponent(value);\n\n\t\tpairs.push(`${name}=${value}`);\n\t});\n\n\treturn pairs.join('&');\n}\n\n/**\n * Make an ajax request\n *\n * Config:{\n * \tdata: // data to send with the request\n * \ttype: // http verb of the request, defaults to GET\n * \tsuccess: // success callback\n * \terror: // error callback\n * }\n *\n * @param {string} url - the url to request\n * @param {Object} config - the configuration object\n * @return {XMLHttpRequest}\n */\nAnimeClient.ajax = (url, config) => {\n\t// Set some sane defaults\n\tconst defaultConfig = {\n\t\tdata: {},\n\t\ttype: 'GET',\n\t\tdataType: '',\n\t\tsuccess: AnimeClient.noop,\n\t\tmimeType: 'application/x-www-form-urlencoded',\n\t\terror: AnimeClient.noop\n\t}\n\n\tconfig = {\n\t\t...defaultConfig,\n\t\t...config,\n\t}\n\n\tlet request = new XMLHttpRequest();\n\tlet method = String(config.type).toUpperCase();\n\n\tif (method === 'GET') {\n\t\turl += (url.match(/\\?/))\n\t\t\t? ajaxSerialize(config.data)\n\t\t\t: `?${ajaxSerialize(config.data)}`;\n\t}\n\n\trequest.open(method, url);\n\n\trequest.onreadystatechange = () => {\n\t\tif (request.readyState === 4) {\n\t\t\tlet responseText = '';\n\n\t\t\tif (request.responseType === 'json') {\n\t\t\t\tresponseText = JSON.parse(request.responseText);\n\t\t\t} else {\n\t\t\t\tresponseText = request.responseText;\n\t\t\t}\n\n\t\t\tif (request.status > 299) {\n\t\t\t\tconfig.error.call(null, request.status, responseText, request.response);\n\t\t\t} else {\n\t\t\t\tconfig.success.call(null, responseText, request.status);\n\t\t\t}\n\t\t}\n\t};\n\n\tif (config.dataType === 'json') {\n\t\tconfig.data = JSON.stringify(config.data);\n\t\tconfig.mimeType = 'application/json';\n\t} else {\n\t\tconfig.data = ajaxSerialize(config.data);\n\t}\n\n\trequest.setRequestHeader('Content-Type', config.mimeType);\n\n\tif (method === 'GET') {\n\t\trequest.send(null);\n\t} else {\n\t\trequest.send(config.data);\n\t}\n\n\treturn request\n};\n\n/**\n * Do a get request\n *\n * @param {string} url\n * @param {object|function} data\n * @param {function} [callback]\n * @return {XMLHttpRequest}\n */\nAnimeClient.get = (url, data, callback = null) => {\n\tif (callback === null) {\n\t\tcallback = data;\n\t\tdata = {};\n\t}\n\n\treturn AnimeClient.ajax(url, {\n\t\tdata,\n\t\tsuccess: callback\n\t});\n};\n\n// -------------------------------------------------------------------------\n// Export\n// -------------------------------------------------------------------------\n\nexport default AnimeClient;","import _ from './anime-client.js';\n\n// ----------------------------------------------------------------------------\n// Event subscriptions\n// ----------------------------------------------------------------------------\n_.on('header', 'click', '.message', hide);\n_.on('form.js-delete', 'submit', confirmDelete);\n_.on('.js-clear-cache', 'click', clearAPICache);\n_.on('.vertical-tabs input', 'change', scrollToSection);\n_.on('.media-filter', 'input', filterMedia);\n\n// ----------------------------------------------------------------------------\n// Handler functions\n// ----------------------------------------------------------------------------\n\n/**\n * Hide the html element attached to the event\n *\n * @param {MouseEvent} event\n * @return void\n */\nfunction hide (event) {\n\t_.hide(event.target)\n}\n\n/**\n * Confirm deletion of an item\n *\n * @param {MouseEvent} event\n * @return void\n */\nfunction confirmDelete (event) {\n\tconst proceed = confirm('Are you ABSOLUTELY SURE you want to delete this item?');\n\n\tif (proceed === false) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t}\n}\n\n/**\n * Clear the API cache, and show a message if the cache is cleared\n *\n * @return void\n */\nfunction clearAPICache () {\n\t_.get('/cache_purge', () => {\n\t\t_.showMessage('success', 'Successfully purged api cache');\n\t});\n}\n\n/**\n * Scroll to the accordion/vertical tab section just opened\n *\n * @param {InputEvent} event\n * @return void\n */\nfunction scrollToSection (event) {\n\tconst el = event.currentTarget.parentElement;\n\tconst rect = el.getBoundingClientRect();\n\n\tconst top = rect.top + window.pageYOffset;\n\n\twindow.scrollTo({\n\t\ttop,\n\t\tbehavior: 'smooth',\n\t});\n}\n\n/**\n * Filter an anime or manga list\n *\n * @param {InputEvent} event\n * @return void\n */\nfunction filterMedia (event) {\n\tconst rawFilter = event.target.value;\n\tconst filter = new RegExp(rawFilter, 'i');\n\n\t// console.log('Filtering items by: ', filter);\n\n\tif (rawFilter !== '') {\n\t\t// Filter the cover view\n\t\t_.$('article.media').forEach(article => {\n\t\t\tconst titleLink = _.$('.name a', article)[0];\n\t\t\tconst title = String(titleLink.textContent).trim();\n\t\t\tif ( ! filter.test(title)) {\n\t\t\t\t_.hide(article);\n\t\t\t} else {\n\t\t\t\t_.show(article);\n\t\t\t}\n\t\t});\n\n\t\t// Filter the list view\n\t\t_.$('table.media-wrap tbody tr').forEach(tr => {\n\t\t\tconst titleCell = _.$('td.align-left', tr)[0];\n\t\t\tconst titleLink = _.$('a', titleCell)[0];\n\t\t\tconst linkTitle = String(titleLink.textContent).trim();\n\t\t\tconst textTitle = String(titleCell.textContent).trim();\n\t\t\tif ( ! (filter.test(linkTitle) || filter.test(textTitle))) {\n\t\t\t\t_.hide(tr);\n\t\t\t} else {\n\t\t\t\t_.show(tr);\n\t\t\t}\n\t\t});\n\t} else {\n\t\t_.show('article.media');\n\t\t_.show('table.media-wrap tbody tr');\n\t}\n}\n","import _ from './anime-client.js';\n\n(() => {\n\tlet hidden = null;\n\tlet visibilityChange = null;\n\n\tif (typeof document.hidden !== \"undefined\") {\n\t\thidden = \"hidden\";\n\t\tvisibilityChange = \"visibilitychange\";\n\t} else if (typeof document.msHidden !== \"undefined\") {\n\t\thidden = \"msHidden\";\n\t\tvisibilityChange = \"msvisibilitychange\";\n\t} else if (typeof document.webkitHidden !== \"undefined\") {\n\t\thidden = \"webkitHidden\";\n\t\tvisibilityChange = \"webkitvisibilitychange\";\n\t}\n\n\tfunction handleVisibilityChange() {\n\t\t// Check the user's session to see if they are currently logged-in\n\t\t// when the page becomes visible\n\t\tif ( ! document[hidden]) {\n\t\t\t_.get('/heartbeat', (beat) => {\n\t\t\t\tconst status = JSON.parse(beat)\n\n\t\t\t\t// If the session is expired, immediately reload so that\n\t\t\t\t// you can't attempt to do an action that requires authentication\n\t\t\t\tif (status.hasAuth !== true) {\n\t\t\t\t\tdocument.removeEventListener(visibilityChange, handleVisibilityChange, false);\n\t\t\t\t\tlocation.reload();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tif (hidden === null) {\n\t\tconsole.info('Page visibility API not supported, JS session check will not work');\n\t} else {\n\t\tdocument.addEventListener(visibilityChange, handleVisibilityChange, false);\n\t}\n})();","import _ from './anime-client.js';\n\n// Click on hidden MAL checkbox so\n// that MAL id is passed\n_.on('main', 'change', '.big-check', (e) => {\n\tconst id = e.target.id;\n\tdocument.getElementById(`mal_${id}`).checked = true;\n});\n\nexport function renderAnimeSearchResults (data) {\n\treturn data.map(item => {\n\t\tconst titles = item.titles.join('
');\n\n\t\treturn `\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tInfo Page\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t`;\n\t}).join('');\n}\n\nexport function renderMangaSearchResults (data) {\n\treturn data.map(item => {\n\t\tconst titles = item.titles.join('
');\n\t\treturn `\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tInfo Page\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t`;\n\t}).join('');\n}","import _ from './anime-client.js'\nimport { renderAnimeSearchResults } from './template-helpers.js'\n\nconst search = (query) => {\n\t// Show the loader\n\t_.show('.cssload-loader');\n\n\t// Do the api search\n\treturn _.get(_.url('/anime-collection/search'), { query }, (searchResults, status) => {\n\t\tsearchResults = JSON.parse(searchResults);\n\n\t\t// Hide the loader\n\t\t_.hide('.cssload-loader');\n\n\t\t// Show the results\n\t\t_.$('#series-list')[ 0 ].innerHTML = renderAnimeSearchResults(searchResults);\n\t});\n};\n\nif (_.hasElement('.anime #search')) {\n\tlet prevRequest = null;\n\n\t_.on('#search', 'input', _.throttle(250, (e) => {\n\t\tconst query = encodeURIComponent(e.target.value);\n\t\tif (query === '') {\n\t\t\treturn;\n\t\t}\n\n\t\tif (prevRequest !== null) {\n\t\t\tprevRequest.abort();\n\t\t}\n\n\t\tprevRequest = search(query);\n\t}));\n}\n\n// Action to increment episode count\n_.on('body.anime.list', 'click', '.plus-one', (e) => {\n\tlet parentSel = _.closestParent(e.target, 'article');\n\tlet watchedCount = parseInt(_.$('.completed_number', parentSel)[ 0 ].textContent, 10) || 0;\n\tlet totalCount = parseInt(_.$('.total_number', parentSel)[ 0 ].textContent, 10);\n\tlet title = _.$('.name a', parentSel)[ 0 ].textContent;\n\n\t// Setup the update data\n\tlet data = {\n\t\tid: parentSel.dataset.kitsuId,\n\t\tmal_id: parentSel.dataset.malId,\n\t\tdata: {\n\t\t\tprogress: watchedCount + 1\n\t\t}\n\t};\n\n\t// If the episode count is 0, and incremented,\n\t// change status to currently watching\n\tif (isNaN(watchedCount) || watchedCount === 0) {\n\t\tdata.data.status = 'CURRENT';\n\t}\n\n\t// If you increment at the last episode, mark as completed\n\tif ((!isNaN(watchedCount)) && (watchedCount + 1) === totalCount) {\n\t\tdata.data.status = 'COMPLETED';\n\t}\n\n\t_.show('#loading-shadow');\n\n\t// okay, lets actually make some changes!\n\t_.ajax(_.url('/anime/increment'), {\n\t\tdata,\n\t\tdataType: 'json',\n\t\ttype: 'POST',\n\t\tsuccess: (res) => {\n\t\t\tconst resData = JSON.parse(res);\n\n\t\t\tif (resData.error) {\n\t\t\t\t_.hide('#loading-shadow');\n\t\t\t\t_.showMessage('error', `Failed to update ${title}. `);\n\t\t\t\t_.scrollToTop();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (resData.data.libraryEntry.update.libraryEntry.status === 'COMPLETED') {\n\t\t\t\t_.hide(parentSel);\n\t\t\t}\n\n\t\t\t_.hide('#loading-shadow');\n\n\t\t\t_.showMessage('success', `Successfully updated ${title}`);\n\t\t\t_.$('.completed_number', parentSel)[ 0 ].textContent = ++watchedCount;\n\t\t\t_.scrollToTop();\n\t\t},\n\t\terror: () => {\n\t\t\t_.hide('#loading-shadow');\n\t\t\t_.showMessage('error', `Failed to update ${title}. `);\n\t\t\t_.scrollToTop();\n\t\t}\n\t});\n});","import _ from './anime-client.js'\nimport { renderMangaSearchResults } from './template-helpers.js'\n\nconst search = (query) => {\n\t_.show('.cssload-loader');\n\treturn _.get(_.url('/manga/search'), { query }, (searchResults, status) => {\n\t\tsearchResults = JSON.parse(searchResults);\n\t\t_.hide('.cssload-loader');\n\t\t_.$('#series-list')[ 0 ].innerHTML = renderMangaSearchResults(searchResults);\n\t});\n};\n\nif (_.hasElement('.manga #search')) {\n\tlet prevRequest = null\n\n\t_.on('#search', 'input', _.throttle(250, (e) => {\n\t\tlet query = encodeURIComponent(e.target.value);\n\t\tif (query === '') {\n\t\t\treturn;\n\t\t}\n\n\t\tif (prevRequest !== null) {\n\t\t\tprevRequest.abort();\n\t\t}\n\n\t\tprevRequest = search(query);\n\t}));\n}\n\n/**\n * Javascript for editing manga, if logged in\n */\n_.on('.manga.list', 'click', '.edit-buttons button', (e) => {\n\tlet thisSel = e.target;\n\tlet parentSel = _.closestParent(e.target, 'article');\n\tlet type = thisSel.classList.contains('plus-one-chapter') ? 'chapter' : 'volume';\n\tlet completed = parseInt(_.$(`.${type}s_read`, parentSel)[ 0 ].textContent, 10) || 0;\n\tlet total = parseInt(_.$(`.${type}_count`, parentSel)[ 0 ].textContent, 10);\n\tlet mangaName = _.$('.name', parentSel)[ 0 ].textContent;\n\n\tif (isNaN(completed)) {\n\t\tcompleted = 0;\n\t}\n\n\t// Setup the update data\n\tlet data = {\n\t\tid: parentSel.dataset.kitsuId,\n\t\tmal_id: parentSel.dataset.malId,\n\t\tdata: {\n\t\t\tprogress: completed\n\t\t}\n\t};\n\n\t// If the episode count is 0, and incremented,\n\t// change status to currently reading\n\tif (isNaN(completed) || completed === 0) {\n\t\tdata.data.status = 'CURRENT';\n\t}\n\n\t// If you increment at the last chapter, mark as completed\n\tif ((!isNaN(completed)) && (completed + 1) === total) {\n\t\tdata.data.status = 'COMPLETED';\n\t}\n\n\t// Update the total count\n\tdata.data.progress = ++completed;\n\n\t_.show('#loading-shadow');\n\n\t_.ajax(_.url('/manga/increment'), {\n\t\tdata,\n\t\tdataType: 'json',\n\t\ttype: 'POST',\n\t\tmimeType: 'application/json',\n\t\tsuccess: (res) => {\n\t\t\tconst resData = JSON.parse(res)\n\t\t\tif (resData.error) {\n\t\t\t\t_.hide('#loading-shadow');\n\t\t\t\t_.showMessage('error', `Failed to update ${mangaName}. `);\n\t\t\t\t_.scrollToTop();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (String(data.data.status).toUpperCase() === 'COMPLETED') {\n\t\t\t\t_.hide(parentSel);\n\t\t\t}\n\n\t\t\t_.hide('#loading-shadow');\n\n\t\t\t_.$(`.${type}s_read`, parentSel)[ 0 ].textContent = String(completed);\n\t\t\t_.showMessage('success', `Successfully updated ${mangaName}`);\n\t\t\t_.scrollToTop();\n\t\t},\n\t\terror: () => {\n\t\t\t_.hide('#loading-shadow');\n\t\t\t_.showMessage('error', `Failed to update ${mangaName}`);\n\t\t\t_.scrollToTop();\n\t\t}\n\t});\n});"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/public/js/tables.min.js b/public/js/tables.min.js index 253a31ed..2a1dee18 100644 --- a/public/js/tables.min.js +++ b/public/js/tables.min.js @@ -1,4 +1 @@ -(function(){var LightTableSorter=function(){var th=null;var cellIndex=null;var order="";var text=function(row){return row.cells.item(cellIndex).textContent.toLowerCase()};var sort=function(a,b){var textA=text(a);var textB=text(b);var n=parseInt(textA,10);if(n){textA=n;textB=parseInt(textB,10)}if(textA>textB)return 1;if(textAtextB)return 1;if(textA {\n\tlet th = null;\n\tlet cellIndex = null;\n\tlet order = '';\n\tconst text = (row) => row.cells.item(cellIndex).textContent.toLowerCase();\n\tconst sort = (a, b) => {\n\t\tlet textA = text(a);\n\t\tlet textB = text(b);\n\t\tconst n = parseInt(textA, 10);\n\t\tif (n) {\n\t\t\ttextA = n;\n\t\t\ttextB = parseInt(textB, 10);\n\t\t}\n\t\tif (textA > textB) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (textA < textB) {\n\t\t\treturn -1;\n\t\t}\n\t\treturn 0;\n\t};\n\tconst toggle = () => {\n\t\tconst c = order !== 'sorting-asc' ? 'sorting-asc' : 'sorting-desc';\n\t\tth.className = (th.className.replace(order, '') + ' ' + c).trim();\n\t\treturn order = c;\n\t};\n\tconst reset = () => {\n\t\tth.classList.remove('sorting-asc', 'sorting-desc');\n\t\tth.classList.add('sorting');\n\t\treturn order = '';\n\t};\n\tconst onClickEvent = (e) => {\n\t\tif (th && (cellIndex !== e.target.cellIndex)) {\n\t\t\treset();\n\t\t}\n\t\tth = e.target;\n\t\tif (th.nodeName.toLowerCase() === 'th') {\n\t\t\tcellIndex = th.cellIndex;\n\t\t\tconst tbody = th.offsetParent.getElementsByTagName('tbody')[0];\n\t\t\tlet rows = Array.from(tbody.rows);\n\t\t\tif (rows) {\n\t\t\t\trows.sort(sort);\n\t\t\t\tif (order === 'sorting-asc') {\n\t\t\t\t\trows.reverse();\n\t\t\t\t}\n\t\t\t\ttoggle();\n\t\t\t\ttbody.innerHtml = '';\n\n\t\t\t\trows.forEach(row => {\n\t\t\t\t\ttbody.appendChild(row);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t};\n\treturn {\n\t\tinit: () => {\n\t\t\tlet ths = document.getElementsByTagName('th');\n\t\t\tlet results = [];\n\t\t\tfor (let i = 0, len = ths.length; i < len; i++) {\n\t\t\t\tlet th = ths[i];\n\t\t\t\tth.classList.add('sorting');\n\t\t\t\tresults.push(th.onclick = onClickEvent);\n\t\t\t}\n\t\t\treturn results;\n\t\t}\n\t};\n})();\n\nLightTableSorter.init();"],"names":["th","cellIndex","order","text","row","cells","item","textContent","toLowerCase","sort","a","b","textA","textB","n","parseInt","toggle","c","className","trim","replace","reset","classList","remove","add","onClickEvent","e","target","nodeName","tbody","offsetParent","getElementsByTagName","rows","Array","from","reverse","innerHtml","forEach","appendChild","init","ths","document","results","i","len","length","push","onclick","LightTableSorter"],"mappings":"YAAA,gCACC,IAAIA,GAAK,IACT,KAAIC,UAAY,IAChB,KAAIC,MAAQ,EACZ,KAAMC,KAAOA,QAAA,CAACC,GAAD,CAAS,CAAA,MAAAA,IAAAC,MAAAC,KAAA,CAAeL,SAAf,CAAAM,YAAAC,YAAA,EAAA,CACtB,KAAMC,KAAOA,QAAA,CAACC,CAAD,CAAIC,CAAJ,CAAU,CACtB,IAAIC,MAAQT,IAAA,CAAKO,CAAL,CACZ,KAAIG,MAAQV,IAAA,CAAKQ,CAAL,CACZ,KAAMG,EAAIC,QAAA,CAASH,KAAT,CAAgB,EAAhB,CACV,IAAIE,CAAJ,CAAO,CACNF,KAAA,CAAQE,CACRD,MAAA,CAAQE,QAAA,CAASF,KAAT,CAAgB,EAAhB,CAFF,CAIP,GAAID,KAAJ,CAAYC,KAAZ,CACC,MAAO,EAER,IAAID,KAAJ,CAAYC,KAAZ,CACC,MAAO,EAER,OAAO,EAde,CAgBvB,KAAMG,OAASA,QAAA,EAAM,CACpB,IAAMC,EAAIf,KAAA,GAAU,aAAV,CAA0B,aAA1B,CAA0C,cACpDF,GAAAkB,UAAA,CAAeC,CAACnB,EAAAkB,UAAAE,QAAA,CAAqBlB,KAArB,CAA4B,EAA5B,CAADiB,CAAmC,GAAnCA,CAAyCF,CAAzCE,MAAA,EACf,OAAOjB,MAAP;AAAee,CAHK,CAKrB,KAAMI,MAAQA,QAAA,EAAM,CACnBrB,EAAAsB,UAAAC,OAAA,CAAoB,aAApB,CAAmC,cAAnC,CACAvB,GAAAsB,UAAAE,IAAA,CAAiB,SAAjB,CACA,OAAOtB,MAAP,CAAe,EAHI,CAKpB,KAAMuB,aAAeA,QAAA,CAACC,CAAD,CAAO,CAC3B,GAAI1B,EAAJ,EAAWC,SAAX,GAAyByB,CAAAC,OAAA1B,UAAzB,CACCoB,KAAA,EAEDrB,GAAA,CAAK0B,CAAAC,OACL,IAAI3B,EAAA4B,SAAApB,YAAA,EAAJ,GAAkC,IAAlC,CAAwC,CACvCP,SAAA,CAAYD,EAAAC,UACZ,KAAM4B,MAAQ7B,EAAA8B,aAAAC,qBAAA,CAAqC,OAArC,CAAA,CAA8C,CAA9C,CACd,KAAIC,KAAOC,KAAAC,KAAA,CAAWL,KAAAG,KAAX,CACX,IAAIA,IAAJ,CAAU,CACTA,IAAAvB,KAAA,CAAUA,IAAV,CACA,IAAIP,KAAJ,GAAc,aAAd,CACC8B,IAAAG,QAAA,EAEDnB,OAAA,EACAa,MAAAO,UAAA,CAAkB,EAElBJ,KAAAK,QAAA,CAAa,QAAA,CAAAjC,GAAA,CAAO,CACnByB,KAAAS,YAAA,CAAkBlC,GAAlB,CADmB,CAApB,CARS,CAJ6B,CALb,CAuB5B;MAAO,CACNmC,KAAMA,QAAA,EAAM,CACX,IAAIC,IAAMC,QAAAV,qBAAA,CAA8B,IAA9B,CACV,KAAIW,QAAU,EACd,KAAK,IAAIC,EAAI,CAAR,CAAWC,IAAMJ,GAAAK,OAAtB,CAAkCF,CAAlC,CAAsCC,GAAtC,CAA2CD,CAAA,EAA3C,CAAgD,CAC/C,IAAI3C,KAAKwC,GAAA,CAAIG,CAAJ,CACT3C,KAAAsB,UAAAE,IAAA,CAAiB,SAAjB,CACAkB,QAAAI,KAAA,CAAa9C,IAAA+C,QAAb,CAA0BtB,YAA1B,CAH+C,CAKhD,MAAOiB,QARI,CADN,IAcRM,iBAAAT,KAAA;"} \ No newline at end of file +{"version":3,"sources":["/var/www/htdocs/github.timshomepage.net/animeclient/frontEndSrc/js/base/sort-tables.js"],"sourcesContent":["const LightTableSorter = (() => {\n\tlet th = null;\n\tlet cellIndex = null;\n\tlet order = '';\n\tconst text = (row) => row.cells.item(cellIndex).textContent.toLowerCase();\n\tconst sort = (a, b) => {\n\t\tlet textA = text(a);\n\t\tlet textB = text(b);\n\t\tconst n = parseInt(textA, 10);\n\t\tif (n) {\n\t\t\ttextA = n;\n\t\t\ttextB = parseInt(textB, 10);\n\t\t}\n\t\tif (textA > textB) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (textA < textB) {\n\t\t\treturn -1;\n\t\t}\n\t\treturn 0;\n\t};\n\tconst toggle = () => {\n\t\tconst c = order !== 'sorting-asc' ? 'sorting-asc' : 'sorting-desc';\n\t\tth.className = (th.className.replace(order, '') + ' ' + c).trim();\n\t\treturn order = c;\n\t};\n\tconst reset = () => {\n\t\tth.classList.remove('sorting-asc', 'sorting-desc');\n\t\tth.classList.add('sorting');\n\t\treturn order = '';\n\t};\n\tconst onClickEvent = (e) => {\n\t\tif (th && (cellIndex !== e.target.cellIndex)) {\n\t\t\treset();\n\t\t}\n\t\tth = e.target;\n\t\tif (th.nodeName.toLowerCase() === 'th') {\n\t\t\tcellIndex = th.cellIndex;\n\t\t\tconst tbody = th.offsetParent.getElementsByTagName('tbody')[0];\n\t\t\tlet rows = Array.from(tbody.rows);\n\t\t\tif (rows) {\n\t\t\t\trows.sort(sort);\n\t\t\t\tif (order === 'sorting-asc') {\n\t\t\t\t\trows.reverse();\n\t\t\t\t}\n\t\t\t\ttoggle();\n\t\t\t\ttbody.innerHtml = '';\n\n\t\t\t\trows.forEach(row => {\n\t\t\t\t\ttbody.appendChild(row);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t};\n\treturn {\n\t\tinit: () => {\n\t\t\tlet ths = document.getElementsByTagName('th');\n\t\t\tlet results = [];\n\t\t\tfor (let i = 0, len = ths.length; i < len; i++) {\n\t\t\t\tlet th = ths[i];\n\t\t\t\tth.classList.add('sorting');\n\t\t\t\tresults.push(th.onclick = onClickEvent);\n\t\t\t}\n\t\t\treturn results;\n\t\t}\n\t};\n})();\n\nLightTableSorter.init();"],"names":[],"mappings":"IAAM,gBAAgB,gBACjB,EAAE,CAAG,IAAI,KACT,SAAS,CAAG,IAAI,KAChB,KAAK,QACH,IAAI,UAAI,GAAG,SAAK,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,WAAW,SACjE,IAAI,UAAI,CAAC,CAAE,CAAC,MACb,KAAK,CAAG,IAAI,CAAC,CAAC,MACd,KAAK,CAAG,IAAI,CAAC,CAAC,MACZ,CAAC,CAAG,QAAQ,CAAC,KAAK,CAAE,EAAE,KACxB,CAAC,EACJ,KAAK,CAAG,CAAC,CACT,KAAK,CAAG,QAAQ,CAAC,KAAK,CAAE,EAAE,MAEvB,KAAK,CAAG,KAAK,QACT,CAAC,IAEL,KAAK,CAAG,KAAK,QACT,EAAE,QAEH,CAAC,OAEH,MAAM,gBACL,CAAC,CAAG,KAAK,IAAK,WAAa,GAAG,WAAa,GAAG,YAAc,EAClE,EAAE,CAAC,SAAS,EAAI,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,MAAQ,CAAG,EAAG,CAAC,EAAE,IAAI,UACxD,KAAK,CAAG,CAAC,OAEX,KAAK,YACV,EAAE,CAAC,SAAS,CAAC,MAAM,EAAC,WAAa,GAAE,YAAc,GACjD,EAAE,CAAC,SAAS,CAAC,GAAG,EAAC,OAAS,UACnB,KAAK,UAEP,YAAY,UAAI,CAAC,KAClB,EAAE,EAAK,SAAS,GAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAC1C,KAAK,GAEN,EAAE,CAAG,CAAC,CAAC,MAAM,IACT,EAAE,CAAC,QAAQ,CAAC,WAAW,MAAO,EAAI,GACrC,SAAS,CAAG,EAAE,CAAC,SAAS,KAClB,KAAK,CAAG,EAAE,CAAC,YAAY,CAAC,oBAAoB,EAAC,KAAO,GAAE,CAAC,MACzD,IAAI,CAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAC5B,IAAI,EACP,IAAI,CAAC,IAAI,CAAC,IAAI,KACV,KAAK,IAAK,WAAa,EAC1B,IAAI,CAAC,OAAO,GAEb,MAAM,GACN,KAAK,CAAC,SAAS,IAEf,IAAI,CAAC,OAAO,UAAC,GAAG,EACf,KAAK,CAAC,WAAW,CAAC,GAAG,iBAMxB,IAAI,gBACC,GAAG,CAAG,QAAQ,CAAC,oBAAoB,EAAC,EAAI,OACxC,OAAO,YACF,CAAC,CAAG,CAAC,CAAE,GAAG,CAAG,GAAG,CAAC,MAAM,CAAE,CAAC,CAAG,GAAG,CAAE,CAAC,QACvC,GAAE,CAAG,GAAG,CAAC,CAAC,EACd,GAAE,CAAC,SAAS,CAAC,GAAG,EAAC,OAAS,GAC1B,OAAO,CAAC,IAAI,CAAC,GAAE,CAAC,OAAO,CAAG,YAAY,UAEhC,OAAO,QAKjB,gBAAgB,CAAC,IAAI"} \ No newline at end of file From 4293a501ed6d20a29536f8fe5c14c24ec02fe5aa Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Fri, 23 Apr 2021 19:00:44 -0400 Subject: [PATCH 28/28] Update GraphQL reference schemas --- src/AnimeClient/API/Anilist/schema.graphql | 95 ++++++++++++++++++++-- src/AnimeClient/API/Kitsu/schema.graphql | 91 ++++++++++++++++++--- 2 files changed, 170 insertions(+), 16 deletions(-) diff --git a/src/AnimeClient/API/Anilist/schema.graphql b/src/AnimeClient/API/Anilist/schema.graphql index dd0295bb..a153ba61 100644 --- a/src/AnimeClient/API/Anilist/schema.graphql +++ b/src/AnimeClient/API/Anilist/schema.graphql @@ -187,7 +187,7 @@ type AiringProgression { watching: Int } -"Media Airing Schedule" +"Media Airing Schedule. NOTE: We only aim to guarantee that FUTURE airing data is present and accurate." type AiringSchedule { "The time the episode airs at" airingAt: Int! @@ -225,6 +225,10 @@ type AniChartUser { "A character that features in an anime or manga" type Character { + "The character's age. Note this is a string, not an int, it may contain further text and additional ages." + age: String + "The character's birth date" + dateOfBirth: FuzzyDate "A general description of the character" description( "Return the string in pre-parsed html instead of markdown" @@ -232,12 +236,16 @@ type Character { ): String "The amount of user's who have favourited the character" favourites: Int + "The character's gender. Usually Male, Female, or Non-binary but can be any string." + gender: String "The id of the character" id: Int! "Character images" image: CharacterImage "If the character is marked as favourite by the currently authenticated user" isFavourite: Boolean! + "If the character is blocked from being added to favourites" + isFavouriteBlocked: Boolean! "Media that includes the character" media( onList: Boolean, @@ -272,9 +280,13 @@ type CharacterEdge { id: Int "The media the character is in" media: [Media] + "Media specific character name" + name: String node: Character "The characters role in the media" role: CharacterRole + "The voice actors of the character with role date" + voiceActorRoles(language: StaffLanguage, sort: [StaffSort]): [StaffRoleType] "The voice actors of the character" voiceActors(language: StaffLanguage, sort: [StaffSort]): [Staff] } @@ -290,12 +302,16 @@ type CharacterImage { type CharacterName { "Other names the character might be referred to as" alternative: [String] + "Other names the character might be referred to as but are spoilers" + alternativeSpoiler: [String] "The character's given name" first: String - "The character's full name" + "The character's first and last name" full: String "The character's surname" last: String + "The character's middle name" + middle: String "The character's full name in their native language" native: String } @@ -544,6 +560,8 @@ type InternalPage { id_not: Int, "Filter by character id" id_not_in: [Int], + "Filter by character by if its their birthday today" + isBirthday: Boolean, "Filter by search query" search: String, "The order the results will be returned in" @@ -880,6 +898,8 @@ type InternalPage { id_not: Int, "Filter by the staff id" id_not_in: [Int], + "Filter by staff by if its their birthday today" + isBirthday: Boolean, "Filter by search query" search: String, "The order the results will be returned in" @@ -1155,10 +1175,14 @@ type Media { type MediaCharacter { "The characters in the media voiced by the parent actor" character: Character + "Media specific character name" + characterName: String + dubGroup: String "The id of the connection" id: Int "The characters role in the media" role: CharacterRole + roleNotes: String "The voice actor of the character" voiceActor: Staff } @@ -1183,10 +1207,14 @@ type MediaCoverImage { "Media connection edge" type MediaEdge { + "Media specific character name" + characterName: String "The characters role in the media" characterRole: CharacterRole "The characters in the media voiced by the parent actor" characters: [Character] + "Used for grouping roles where multiple dubs exist for the same language. Either dubbing company name or language variant." + dubGroup: String "The order the media should be displayed from the users favourites" favouriteOrder: Int "The id of the connection" @@ -1199,8 +1227,12 @@ type MediaEdge { "Provide 2 to use new version 2 of relation enum" version: Int ): MediaRelation + "Notes regarding the VA's role for the character" + roleNotes: String "The role of the staff member in the production of the media" staffRole: String + "The voice actors of the character with role date" + voiceActorRoles(language: StaffLanguage, sort: [StaffSort]): [StaffRoleType] "The voice actors of the character" voiceActors(language: StaffLanguage, sort: [StaffSort]): [Staff] } @@ -1391,12 +1423,15 @@ type MediaSubmissionComparison { type MediaSubmissionEdge { character: Character + characterName: String characterRole: CharacterRole characterSubmission: Character + dubGroup: String "The id of the direct submission" id: Int isMain: Boolean media: Media + roleNotes: String staff: Staff staffRole: String staffSubmission: Staff @@ -1817,6 +1852,8 @@ type Mutation { UpdateUser( "User's about/bio text" about: String, + "Minutes between activity for them to be merged together. 0 is Never, Above 2 weeks (20160 mins) is Always." + activityMergeTime: Int, "If the user should get notifications when a show they are watching aires" airingNotifications: Boolean, "The user's anime list options" @@ -1963,6 +2000,8 @@ type Page { id_not: Int, "Filter by character id" id_not_in: [Int], + "Filter by character by if its their birthday today" + isBirthday: Boolean, "Filter by search query" search: String, "The order the results will be returned in" @@ -2275,6 +2314,8 @@ type Page { id_not: Int, "Filter by the staff id" id_not_in: [Int], + "Filter by staff by if its their birthday today" + isBirthday: Boolean, "Filter by search query" search: String, "The order the results will be returned in" @@ -2472,6 +2513,8 @@ type Query { id_not: Int, "Filter by character id" id_not_in: [Int], + "Filter by character by if its their birthday today" + isBirthday: Boolean, "Filter by search query" search: String, "The order the results will be returned in" @@ -2857,6 +2900,8 @@ type Query { id_not: Int, "Filter by the staff id" id_not_in: [Int], + "Filter by staff by if its their birthday today" + isBirthday: Boolean, "Filter by search query" search: String, "The order the results will be returned in" @@ -3132,6 +3177,8 @@ type SiteTrendEdge { "Voice actors or production staff" type Staff { + "The person's age in years" + age: Int "Media the actor voiced characters in. (Same data as characters with media as node instead of characters)" characterMedia( onList: Boolean, @@ -3149,6 +3196,8 @@ type Staff { perPage: Int, sort: [CharacterSort] ): CharacterConnection + dateOfBirth: FuzzyDate + dateOfDeath: FuzzyDate "A general description of the staff member" description( "Return the string in pre-parsed html instead of markdown" @@ -3156,18 +3205,28 @@ type Staff { ): String "The amount of user's who have favourited the staff member" favourites: Int + "The staff's gender. Usually Male, Female, or Non-binary but can be any string." + gender: String + "The persons birthplace or hometown" + homeTown: String "The id of the staff member" id: Int! "The staff images" image: StaffImage "If the staff member is marked as favourite by the currently authenticated user" isFavourite: Boolean! - "The primary language of the staff member" - language: StaffLanguage + "If the staff member is blocked from being added to favourites" + isFavouriteBlocked: Boolean! + "The primary language the staff member dub's in" + language: StaffLanguage @deprecated(reason : "Replaced with languageV2") + "The primary language of the staff member. Current values: Japanese, English, Korean, Italian, Spanish, Portuguese, French, German, Hebrew, Hungarian, Chinese, Arabic, Filipino, Catalan" + languageV2: String "Notes for site moderators" modNotes: String "The names of the staff member" name: StaffName + "The person's primary occupations" + primaryOccupations: [String] "The url for the staff page on the AniList website" siteUrl: String "Staff member that the submission is referencing" @@ -3189,6 +3248,8 @@ type Staff { "Submitter for the submission" submitter: User updatedAt: Int @deprecated(reason : "No data available") + "[startYear, endYear] (If the 2nd value is not present staff is still active)" + yearsActive: [Int] } type StaffConnection { @@ -3222,14 +3283,26 @@ type StaffName { alternative: [String] "The person's given name" first: String - "The person's full name" + "The person's first and last name" full: String "The person's surname" last: String + "The person's middle name" + middle: String "The person's full name in their native language" native: String } +"Voice actor role for a character" +type StaffRoleType { + "Used for grouping roles where multiple dubs exist for the same language. Either dubbing company name or language variant." + dubGroup: String + "Notes regarding the VA's role for the character" + roleNotes: String + "The voice actors of the character" + voiceActor: Staff +} + "User's staff statistics" type StaffStats { amount: Int @@ -3679,6 +3752,8 @@ type UserModData { "A user's general options" type UserOptions { + "Minutes between activity for them to be merged together. 0 is Never, Above 2 weeks (20160 mins) is Always." + activityMergeTime: Int "Whether the user receives notifications when a show they are watching aires" airingNotifications: Boolean "Whether the user has enabled viewing of 18+ content" @@ -3871,6 +3946,8 @@ enum CharacterSort { FAVOURITES_DESC ID ID_DESC + "Order manually decided by moderators" + RELEVANCE ROLE ROLE_DESC SEARCH_MATCH @@ -4251,6 +4328,8 @@ enum StaffSort { ID_DESC LANGUAGE LANGUAGE_DESC + "Order manually decided by moderators" + RELEVANCE ROLE ROLE_DESC SEARCH_MATCH @@ -4363,10 +4442,14 @@ input AniChartHighlightInput { input CharacterNameInput { "Other names the character might be referred by" alternative: [String] + "Other names the character might be referred to as but are spoilers" + alternativeSpoiler: [String] "The character's given name" first: String "The character's surname" last: String + "The character's middle name" + middle: String "The character's full name in their native language" native: String } @@ -4433,6 +4516,8 @@ input StaffNameInput { first: String "The person's surname" last: String + "The person's middle name" + middle: String "The person's full name in their native language" native: String } diff --git a/src/AnimeClient/API/Kitsu/schema.graphql b/src/AnimeClient/API/Kitsu/schema.graphql index 16fe40de..49c62187 100644 --- a/src/AnimeClient/API/Kitsu/schema.graphql +++ b/src/AnimeClient/API/Kitsu/schema.graphql @@ -117,6 +117,8 @@ interface Media { ): MappingConnection! "The time of the next release of this media" nextRelease: ISO8601DateTime + "The country in which the media was primarily produced" + originalLocale: String "The poster image of this media" posterImage: Image! "The companies which helped to produce this media" @@ -318,6 +320,8 @@ type Anime implements Episodic & Media & WithTimestamps { ): MappingConnection! "The time of the next release of this media" nextRelease: ISO8601DateTime + "The country in which the media was primarily produced" + originalLocale: String "The poster image of this media" posterImage: Image! "The companies which helped to produce this media" @@ -648,7 +652,7 @@ type Comment implements WithTimestamps { contentFormatted: String! createdAt: ISO8601DateTime! id: ID! - "Users who liked this comment." + "Users who liked this comment" likes( "Returns the elements in the list that come after the specified cursor." after: String, @@ -657,13 +661,14 @@ type Comment implements WithTimestamps { "Returns the first _n_ elements from the list." first: Int, "Returns the last _n_ elements from the list." - last: Int + last: Int, + sort: [CommentLikeSortOption] ): ProfileConnection! "The parent comment if this comment was a reply to another." parent: Comment "The post that this comment is attached to." post: Post! - "All replies to a specific comment." + "Replies to this comment" replies( "Returns the elements in the list that come after the specified cursor." after: String, @@ -672,7 +677,8 @@ type Comment implements WithTimestamps { "Returns the first _n_ elements from the list." first: Int, "Returns the last _n_ elements from the list." - last: Int + last: Int, + sort: [CommentSortOption] ): CommentConnection! updatedAt: ISO8601DateTime! } @@ -1197,6 +1203,8 @@ type Manga implements Media & WithTimestamps { ): MappingConnection! "The time of the next release of this media" nextRelease: ISO8601DateTime + "The country in which the media was primarily produced" + originalLocale: String "The poster image of this media" posterImage: Image! "The companies which helped to produce this media" @@ -1624,7 +1632,7 @@ type Person implements WithTimestamps { type Post implements WithTimestamps { "The user who created this post." author: Profile! - "All comments related to this post." + "All comments on this post" comments( "Returns the elements in the list that come after the specified cursor." after: String, @@ -1633,7 +1641,8 @@ type Post implements WithTimestamps { "Returns the first _n_ elements from the list." first: Int, "Returns the last _n_ elements from the list." - last: Int + last: Int, + sort: [CommentSortOption] ): CommentConnection! "Unmodified content." content: String! @@ -1656,7 +1665,7 @@ type Post implements WithTimestamps { isNsfw: Boolean! "If this post spoils the tagged media." isSpoiler: Boolean! - "Users that have liked this post." + "Users that have liked this post" likes( "Returns the elements in the list that come after the specified cursor." after: String, @@ -1665,7 +1674,8 @@ type Post implements WithTimestamps { "Returns the first _n_ elements from the list." first: Int, "Returns the last _n_ elements from the list." - last: Int + last: Int, + sort: [PostLikeSortOption] ): ProfileConnection! "When this post was locked." lockedAt: ISO8601DateTime @@ -1816,7 +1826,8 @@ type Profile implements WithTimestamps { "Returns the first _n_ elements from the list." first: Int, "Returns the last _n_ elements from the list." - last: Int + last: Int, + sort: [FollowSortOption] ): ProfileConnection! "People the user is following" following( @@ -1827,7 +1838,8 @@ type Profile implements WithTimestamps { "Returns the first _n_ elements from the list." first: Int, "Returns the last _n_ elements from the list." - last: Int + last: Int, + sort: [FollowSortOption] ): ProfileConnection! "What the user identifies as" gender: String @@ -1872,7 +1884,8 @@ type Profile implements WithTimestamps { "Returns the first _n_ elements from the list." first: Int, "Returns the last _n_ elements from the list." - last: Int + last: Int, + sort: [PostSortOption] ): PostConnection! "The message this user has submitted to the Hall of Fame" proMessage: String @@ -2438,6 +2451,23 @@ enum CharacterRoleEnum { RECURRING } +enum CommentLikeSortEnum { + CREATED_AT + FOLLOWING +} + +enum CommentSortEnum { + CREATED_AT + FOLLOWING + LIKES_COUNT +} + +enum FollowSortEnum { + CREATED_AT + FOLLOWING_FOLLOWED + FOLLOWING_FOLLOWER +} + enum LibraryEntryStatusEnum { "The user completed this media." COMPLETED @@ -2528,6 +2558,15 @@ enum MediaTypeEnum { MANGA } +enum PostLikeSortEnum { + CREATED_AT + FOLLOWING +} + +enum PostSortEnum { + CREATED_AT +} + enum ProTierEnum { "Aozora Pro (only hides ads)" AO_PRO @deprecated(reason : "No longer for sale") @@ -2592,6 +2631,11 @@ enum SitePermissionEnum { DATABASE_MOD } +enum SortDirection { + ASCENDING + DESCENDING +} + enum TitleLanguagePreferenceEnum { "Prefer the most commonly-used title for media" CANONICAL @@ -2632,6 +2676,16 @@ input AnimeUpdateInput { youtubeTrailerVideoId: String } +input CommentLikeSortOption { + direction: SortDirection! + on: CommentLikeSortEnum! +} + +input CommentSortOption { + direction: SortDirection! + on: CommentSortEnum! +} + input EpisodeCreateInput { description: Map length: Int @@ -2653,6 +2707,11 @@ input EpisodeUpdateInput { titles: TitlesListInput } +input FollowSortOption { + direction: SortDirection! + on: FollowSortEnum! +} + input GenericDeleteInput { id: ID! } @@ -2742,6 +2801,16 @@ input MappingUpdateInput { itemType: MappingItemEnum } +input PostLikeSortOption { + direction: SortDirection! + on: PostLikeSortEnum! +} + +input PostSortOption { + direction: SortDirection! + on: PostSortEnum! +} + input TitlesListInput { alternatives: [String!] canonical: String