From 545d8a3473823f0a86cad3c177dbbb4ebb794a75 Mon Sep 17 00:00:00 2001 From: Factiven Date: Mon, 17 Apr 2023 13:33:37 +0700 Subject: Snapshot Moopa v3.2 --- build.css | 1 - components/hero/content.js | 4 +- components/hero/searchAni.js | 64 - components/hero/trending.js | 120 -- components/loadingScreen.js | 35 - components/media/chisato.js | 83 -- components/media/sticker.js | 34 - components/navbar.js | 163 ++- components/test/dataAni.js | 2520 ---------------------------------------- components/test/player.js | 11 - components/underConst.js | 22 - components/videoPlayer.js | 7 +- lib/useAnilist.js | 49 +- package-lock.json | 268 +---- package.json | 9 +- pages/about.js | 3 - pages/anime/[...id].js | 166 ++- pages/anime/watch/[...info].js | 76 +- pages/api/get-media.js | 78 ++ pages/api/get-user.js | 4 +- pages/api/getUser.js | 20 - pages/index.js | 371 +++--- pages/profile/[user].js | 366 ++++++ pages/search.js | 110 +- pages/test.js | 236 ---- pages/testing.js | 76 +- queries/GET_ADVANCE_SEARCH.js | 0 queries/GET_MEDIA.js | 26 - queries/index.js | 3 +- styles/globals.css | 19 +- tailwind.config.js | 6 +- 31 files changed, 1080 insertions(+), 3870 deletions(-) delete mode 100644 build.css delete mode 100644 components/hero/searchAni.js delete mode 100644 components/hero/trending.js delete mode 100644 components/loadingScreen.js delete mode 100644 components/media/chisato.js delete mode 100644 components/media/sticker.js delete mode 100644 components/test/dataAni.js delete mode 100644 components/test/player.js delete mode 100644 components/underConst.js create mode 100644 pages/api/get-media.js delete mode 100644 pages/api/getUser.js create mode 100644 pages/profile/[user].js delete mode 100644 pages/test.js delete mode 100644 queries/GET_ADVANCE_SEARCH.js delete mode 100644 queries/GET_MEDIA.js diff --git a/build.css b/build.css deleted file mode 100644 index 63c977c..0000000 --- a/build.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v3.3.1 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*{scrollbar-color:auto;scrollbar-width:auto}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.pointer-events-none{pointer-events:none}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.-right-11{right:-2.75rem}.-right-12{right:-3rem}.-right-14{right:-3.5rem}.bottom-0{bottom:0}.bottom-10{bottom:2.5rem}.bottom-12{bottom:3rem}.bottom-2{bottom:.5rem}.bottom-9{bottom:2.25rem}.bottom-\[25px\]{bottom:25px}.bottom-\[30px\]{bottom:30px}.left-0{left:0}.left-2{left:.5rem}.left-\[105px\]{left:105px}.right-20{right:5rem}.right-\[15px\]{right:15px}.right-\[20px\]{right:20px}.top-0{top:0}.top-11{top:2.75rem}.top-\[-100\%\]{top:-100%}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[100\]{z-index:100}.col-start-2{grid-column-start:2}.row-start-1{grid-row-start:1}.row-start-2{grid-row-start:2}.m-10{margin:2.5rem}.mx-\[1rem\]{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.my-5{margin-top:1.25rem;margin-bottom:1.25rem}.my-\[10rem\]{margin-top:10rem;margin-bottom:10rem}.my-\[5rem\]{margin-top:5rem;margin-bottom:5rem}.mb-5{margin-bottom:1.25rem}.mb-\[6rem\]{margin-bottom:6rem}.ml-5{margin-left:1.25rem}.mr-5{margin-right:1.25rem}.mr-\[20rem\]{margin-right:20rem}.mt-10{margin-top:2.5rem}.mt-16{margin-top:4rem}.line-clamp-1{-webkit-line-clamp:1}.line-clamp-1,.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical}.line-clamp-2{-webkit-line-clamp:2}.line-clamp-5{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:5}.inline-block{display:inline-block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.aspect-\[9\/13\]{aspect-ratio:9/13}.aspect-video{aspect-ratio:16/9}.h-1{height:.25rem}.h-16{height:4rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-\[100px\]{height:100px}.h-\[110px\]{height:110px}.h-\[116px\]{height:116px}.h-\[126px\]{height:126px}.h-\[140px\]{height:140px}.h-\[175px\]{height:175px}.h-\[1px\]{height:1px}.h-\[200px\]{height:200px}.h-\[230px\]{height:230px}.h-\[240px\]{height:240px}.h-\[260px\]{height:260px}.h-\[290px\]{height:290px}.h-\[300px\]{height:300px}.h-\[313px\]{height:313px}.h-\[358px\]{height:358px}.h-\[35px\]{height:35px}.h-\[42px\]{height:42px}.h-\[45px\]{height:45px}.h-\[46px\]{height:46px}.h-\[50px\]{height:50px}.h-\[51px\]{height:51px}.h-\[540px\]{height:540px}.h-\[640px\]{height:640px}.h-\[66px\]{height:66px}.h-\[698px\]{height:698px}.h-\[800px\]{height:800px}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.min-h-screen{min-height:100vh}.w-16{width:4rem}.w-5{width:1.25rem}.w-52{width:13rem}.w-6{width:1.5rem}.w-\[100px\]{width:100px}.w-\[115px\]{width:115px}.w-\[140px\]{width:140px}.w-\[168px\]{width:168px}.w-\[195px\]{width:195px}.w-\[1px\]{width:1px}.w-\[200px\]{width:200px}.w-\[228px\]{width:228px}.w-\[230px\]{width:230px}.w-\[255px\]{width:255px}.w-\[297px\]{width:297px}.w-\[2px\]{width:2px}.w-\[40\%\]{width:40%}.w-\[50px\]{width:50px}.w-\[61\.5px\]{width:61.5px}.w-\[70\%\]{width:70%}.w-\[75\%\]{width:75%}.w-\[77\%\]{width:77%}.w-\[78\%\]{width:78%}.w-\[85\%\]{width:85%}.w-\[90\%\]{width:90%}.w-\[90px\]{width:90px}.w-auto{width:auto}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-screen{width:100vw}.min-w-\[20\%\]{min-width:20%}.min-w-\[80\%\]{min-width:80%}.flex-none{flex:none}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.translate-y-16{--tw-translate-y:4rem}.scale-100,.translate-y-16{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}.scale-110,.scale-150{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-150{--tw-scale-x:1.5;--tw-scale-y:1.5}.scale-75{--tw-scale-x:.75;--tw-scale-y:.75}.scale-75,.scale-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.scale-95,.scale-\[1\.5\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-\[1\.5\]{--tw-scale-x:1.5;--tw-scale-y:1.5}.scale-\[75\%\]{--tw-scale-x:75%;--tw-scale-y:75%}.scale-\[75\%\],.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-flow-dense{grid-auto-flow:dense}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-start{place-items:start}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-items-center{justify-items:center}.gap-0{gap:0}.gap-1{gap:.25rem}.gap-10{gap:2.5rem}.gap-14{gap:3.5rem}.gap-2{gap:.5rem}.gap-20{gap:5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-7{gap:1.75rem}.gap-8{gap:2rem}.gap-\[0\.69rem\]{gap:.69rem}.gap-\[1\.5px\]{gap:1.5px}.gap-y-12{row-gap:3rem}.gap-y-\[0\.7rem\]{row-gap:.7rem}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem*var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-scroll{overflow:scroll}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.overflow-y-clip{overflow-y:clip}.overflow-x-scroll{overflow-x:scroll}.overflow-y-scroll{overflow-y:scroll}.scroll-smooth{scroll-behavior:smooth}.whitespace-nowrap{white-space:nowrap}.rounded-\[10px\]{border-radius:10px}.rounded-\[20px\]{border-radius:20px}.rounded-\[8px\]{border-radius:8px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-b-\[10px\]{border-bottom-right-radius:10px;border-bottom-left-radius:10px}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.rounded-tl-xl{border-top-left-radius:.75rem}.rounded-tr-xl{border-top-right-radius:.75rem}.bg-\[\#101925\]{--tw-bg-opacity:1;background-color:rgb(16 25 37/var(--tw-bg-opacity))}.bg-\[\#121212\]{--tw-bg-opacity:1;background-color:rgb(18 18 18/var(--tw-bg-opacity))}.bg-\[\#141519\]{--tw-bg-opacity:1;background-color:rgb(20 21 25/var(--tw-bg-opacity))}.bg-\[\#171717\]{--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity))}.bg-\[\#18191c\]{--tw-bg-opacity:1;background-color:rgb(24 25 28/var(--tw-bg-opacity))}.bg-\[\#1e2023\]{--tw-bg-opacity:1;background-color:rgb(30 32 35/var(--tw-bg-opacity))}.bg-\[\#212121\]{--tw-bg-opacity:1;background-color:rgb(33 33 33/var(--tw-bg-opacity))}.bg-\[\#26272B\]{--tw-bg-opacity:1;background-color:rgb(38 39 43/var(--tw-bg-opacity))}.bg-\[\#282828\]{--tw-bg-opacity:1;background-color:rgb(40 40 40/var(--tw-bg-opacity))}.bg-\[\#3B3C41\]{--tw-bg-opacity:1;background-color:rgb(59 60 65/var(--tw-bg-opacity))}.bg-\[\#3b3b3b\]{--tw-bg-opacity:1;background-color:rgb(59 59 59/var(--tw-bg-opacity))}.bg-\[\#F9F9F9\]{--tw-bg-opacity:1;background-color:rgb(249 249 249/var(--tw-bg-opacity))}.bg-\[\#dadada50\]{background-color:#dadada50}.bg-\[\#ff8a57\]{--tw-bg-opacity:1;background-color:rgb(255 138 87/var(--tw-bg-opacity))}.bg-\[\#ff94378f\]{background-color:#ff94378f}.bg-\[\#ff9537\]{--tw-bg-opacity:1;background-color:rgb(255 149 55/var(--tw-bg-opacity))}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity))}.bg-image{--tw-bg-opacity:1;background-color:rgb(59 60 65/var(--tw-bg-opacity))}.bg-secondary{--tw-bg-opacity:1;background-color:rgb(32 32 32/var(--tw-bg-opacity))}.bg-slate-400{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity))}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-opacity-40{--tw-bg-opacity:0.4}.bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.from-\[\#121212\]{--tw-gradient-from:#121212 var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:#12121200 var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-\[\#141519\]{--tw-gradient-from:#141519 var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:#14151900 var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-transparent{--tw-gradient-to:#0000 var(--tw-gradient-to-position);--tw-gradient-to-position: }.bg-cover{background-size:cover}.bg-center{background-position:50%}.fill-\[\#4CFFFF\]{fill:#4cffff}.fill-\[\#585858\]{fill:#585858}.fill-\[\#8BA0B2\]{fill:#8ba0b2}.fill-\[\#ffffff8d\]{fill:#ffffff8d}.fill-black{fill:#000}.fill-orange-500{fill:#f97316}.fill-white{fill:#fff}.object-cover{-o-object-fit:cover;object-fit:cover}.object-\[center_top\]{-o-object-position:center top;object-position:center top}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.px-\[30px\]{padding-left:30px;padding-right:30px}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-\[3px\]{padding-top:3px;padding-bottom:3px}.pb-10{padding-bottom:2.5rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-5{padding-bottom:1.25rem}.pb-52{padding-bottom:13rem}.pb-56{padding-bottom:14rem}.pb-\[30px\]{padding-bottom:30px}.pl-1{padding-left:.25rem}.pl-4{padding-left:1rem}.pl-\[1px\]{padding-left:1px}.pl-\[7\.5rem\]{padding-left:7.5rem}.pr-5{padding-right:1.25rem}.pt-10{padding-top:2.5rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-7{padding-top:1.75rem}.pt-\[10rem\]{padding-top:10rem}.pt-\[1px\]{padding-top:1px}.pt-\[2px\]{padding-top:2px}.pt-\[8rem\]{padding-top:8rem}.pt-nav{padding-top:5.3rem}.text-center{text-align:center}.text-start{text-align:start}.font-karla{font-family:Karla,sans-serif}.font-outfit{font-family:Outfit,sans-serif}.font-rama{font-family:Ramabhadra,sans-serif}.font-roboto{font-family:Roboto,sans-serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-6xl{font-size:3.75rem;line-height:1}.text-\[0\.81rem\]{font-size:.81rem}.text-\[11px\]{font-size:11px}.text-\[14px\]{font-size:14px}.text-\[2\.56rem\]{font-size:2.56rem}.text-\[20px\]{font-size:20px}.text-\[23px\]{font-size:23px}.text-\[24px\]{font-size:24px}.text-\[30px\]{font-size:30px}.text-\[3rem\]{font-size:3rem}.text-\[40px\]{font-size:40px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-extralight{font-weight:200}.font-light{font-weight:300}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-thin{font-weight:100}.italic{font-style:italic}.text-\[\#404040\]{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity))}.text-\[\#414141\]{--tw-text-opacity:1;color:rgb(65 65 65/var(--tw-text-opacity))}.text-\[\#5d5d5d\]{--tw-text-opacity:1;color:rgb(93 93 93/var(--tw-text-opacity))}.text-\[\#616161\]{--tw-text-opacity:1;color:rgb(97 97 97/var(--tw-text-opacity))}.text-\[\#7a7a7a\]{--tw-text-opacity:1;color:rgb(122 122 122/var(--tw-text-opacity))}.text-\[\#878787\]{--tw-text-opacity:1;color:rgb(135 135 135/var(--tw-text-opacity))}.text-\[\#8B8B8B\]{--tw-text-opacity:1;color:rgb(139 139 139/var(--tw-text-opacity))}.text-\[\#8BA0B2\]{--tw-text-opacity:1;color:rgb(139 160 178/var(--tw-text-opacity))}.text-\[\#8f8f8f\]{--tw-text-opacity:1;color:rgb(143 143 143/var(--tw-text-opacity))}.text-\[\#CCCCCC\]{--tw-text-opacity:1;color:rgb(204 204 204/var(--tw-text-opacity))}.text-\[\#FF7F57\]{--tw-text-opacity:1;color:rgb(255 127 87/var(--tw-text-opacity))}.text-\[\#b1b1b1\]{--tw-text-opacity:1;color:rgb(177 177 177/var(--tw-text-opacity))}.text-\[\#cdcdcd\]{--tw-text-opacity:1;color:rgb(205 205 205/var(--tw-text-opacity))}.text-\[\#ff7f57\]{--tw-text-opacity:1;color:rgb(255 127 87/var(--tw-text-opacity))}.text-\[\#ffffff89\]{color:#ffffff89}.text-\[\#ffffff\]{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-\[\#ffffffa5\]{color:#ffffffa5}.text-action{--tw-text-opacity:1;color:rgb(255 127 87/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.text-slate-200{--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.bg-blend-overlay{background-blend-mode:overlay}.mix-blend-darken{mix-blend-mode:darken}.shadow-\[4px_0px_5px_0px_rgba\(0\2c 0\2c 0\2c 0\.3\)\]{--tw-shadow:4px 0px 5px 0px #0000004d;--tw-shadow-colored:4px 0px 5px 0px var(--tw-shadow-color)}.shadow-\[4px_0px_5px_0px_rgba\(0\2c 0\2c 0\2c 0\.3\)\],.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-menu{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-menu{--tw-shadow:0 0 10px 0px #ff6b001a;--tw-shadow-colored:0 0 10px 0px var(--tw-shadow-color)}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-0,.ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-\[\#FF7F57\]{--tw-ring-opacity:1;--tw-ring-color:rgb(255 127 87/var(--tw-ring-opacity))}.ring-\[\#ff8a57\]{--tw-ring-opacity:1;--tw-ring-color:rgb(255 138 87/var(--tw-ring-opacity))}.ring-action{--tw-ring-opacity:1;--tw-ring-color:rgb(255 127 87/var(--tw-ring-opacity))}.ring-white{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity))}.brightness-75{--tw-brightness:brightness(.75)}.brightness-75,.brightness-90{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.brightness-90{--tw-brightness:brightness(.9)}.brightness-\[30\%\]{--tw-brightness:brightness(30%)}.brightness-\[30\%\],.drop-shadow-2xl{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-2xl{--tw-drop-shadow:drop-shadow(0 25px 25px #00000026)}.drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px #0000000d)}.drop-shadow-sm,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-1000{transition-duration:1s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.scrollbar.overflow-x-hidden{overflow-x:hidden}.scrollbar.overflow-y-hidden{overflow-y:hidden}.scrollbar-thin{--scrollbar-track:initial;--scrollbar-thumb:initial;--scrollbar-corner:initial;--scrollbar-track-hover:var(--scrollbar-track);--scrollbar-thumb-hover:var(--scrollbar-thumb);--scrollbar-corner-hover:var(--scrollbar-corner);--scrollbar-track-active:var(--scrollbar-track-hover);--scrollbar-thumb-active:var(--scrollbar-thumb-hover);--scrollbar-corner-active:var(--scrollbar-corner-hover);scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track);overflow:overlay}.scrollbar-thin.overflow-x-hidden{overflow-x:hidden}.scrollbar-thin.overflow-y-hidden{overflow-y:hidden}.scrollbar-thin::-webkit-scrollbar-track{background-color:var(--scrollbar-track)}.scrollbar-thin::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb)}.scrollbar-thin::-webkit-scrollbar-corner{background-color:var(--scrollbar-corner)}.scrollbar-thin::-webkit-scrollbar-track:hover{background-color:var(--scrollbar-track-hover)}.scrollbar-thin::-webkit-scrollbar-thumb:hover{background-color:var(--scrollbar-thumb-hover)}.scrollbar-thin::-webkit-scrollbar-corner:hover{background-color:var(--scrollbar-corner-hover)}.scrollbar-thin::-webkit-scrollbar-track:active{background-color:var(--scrollbar-track-active)}.scrollbar-thin::-webkit-scrollbar-thumb:active{background-color:var(--scrollbar-thumb-active)}.scrollbar-thin::-webkit-scrollbar-corner:active{background-color:var(--scrollbar-corner-active)}.scrollbar-thin{scrollbar-width:thin}.scrollbar-thin::-webkit-scrollbar{width:8px;height:8px}.scrollbar-thumb-\[\#1b1c21\]{--scrollbar-thumb:#1b1c21!important}.scrollbar-thumb-\[\#313131\]{--scrollbar-thumb:#313131!important}.scrollbar-thumb-slate-800{--scrollbar-thumb:#1e293b!important}.scrollbar-thumb-rounded-full::-webkit-scrollbar-thumb{border-radius:9999px}.scrollbar-thumb-rounded-md::-webkit-scrollbar-thumb{border-radius:.375rem}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.scrollbar-hide::-webkit-scrollbar{display:none}.group:hover .group-hover\:fill-cyan-700{fill:#0e7490}.group:hover .group-hover\:text-cyan-700{--tw-text-opacity:1;color:rgb(14 116 144/var(--tw-text-opacity))}.hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}.hover\:scale-105:hover,.hover\:scale-\[1\.02\]:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-\[1\.02\]:hover{--tw-scale-x:1.02;--tw-scale-y:1.02}.hover\:overflow-y-scroll:hover{overflow-y:scroll}.hover\:bg-\[\#2F3136\]:hover{--tw-bg-opacity:1;background-color:rgb(47 49 54/var(--tw-bg-opacity))}.hover\:bg-\[\#2d303a\]:hover{--tw-bg-opacity:1;background-color:rgb(45 48 58/var(--tw-bg-opacity))}.hover\:text-cyan-500:hover{--tw-text-opacity:1;color:rgb(6 182 212/var(--tw-text-opacity))}.hover\:text-orange-600:hover{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:ring-1:hover{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.hover\:ring-1:hover,.hover\:ring-4:hover{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.hover\:ring-4:hover{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.hover\:scrollbar-thumb-\[\#212329\]{--scrollbar-thumb-hover:#212329!important}.hover\:scrollbar-thumb-\[\#2e2f37\]{--scrollbar-thumb-hover:#2e2f37!important}.hover\:scrollbar-thumb-slate-600{--scrollbar-thumb-hover:#475569!important}:is(.dark .dark\:bg-\[\#111111\]){--tw-bg-opacity:1;background-color:rgb(17 17 17/var(--tw-bg-opacity))}:is(.dark .dark\:bg-\[\#121212\]){--tw-bg-opacity:1;background-color:rgb(18 18 18/var(--tw-bg-opacity))}:is(.dark .dark\:bg-\[\#181818\]){--tw-bg-opacity:1;background-color:rgb(24 24 24/var(--tw-bg-opacity))}:is(.dark .dark\:bg-black){--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity))}:is(.dark .dark\:bg-white){--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}:is(.dark .dark\:fill-black){fill:#000}:is(.dark .dark\:fill-white){fill:#fff}:is(.dark .dark\:text-gray-200){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .dark\:text-red-400){--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}:is(.dark .dark\:brightness-95){--tw-brightness:brightness(.95);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}@media (min-width:475px){.xs\:h-\[215px\]{height:215px}.xs\:w-\[140px\]{width:140px}.xs\:w-\[280px\]{width:280px}}@media (min-width:768px){.md\:fixed{position:fixed}.md\:top-0{top:0}.md\:mx-0{margin-left:0;margin-right:0}.md\:mx-\[94px\]{margin-left:94px;margin-right:94px}.md\:mx-auto{margin-left:auto;margin-right:auto}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-16{height:4rem}.md\:h-\[14rem\]{height:14rem}.md\:h-\[250px\]{height:250px}.md\:h-\[662px\]{height:662px}.md\:h-\[720px\]{height:720px}.md\:h-\[760px\]{height:760px}.md\:h-full{height:100%}.md\:w-52{width:13rem}.md\:w-\[460px\]{width:460px}.md\:w-\[55\%\]{width:55%}.md\:w-\[70\%\]{width:70%}.md\:w-\[80\%\]{width:80%}.md\:w-\[820px\]{width:820px}.md\:w-\[85\%\]{width:85%}.md\:w-full{width:100%}.md\:translate-y-0{--tw-translate-y:0px}.md\:translate-y-0,.md\:translate-y-\[-100\%\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md\:translate-y-\[-100\%\]{--tw-translate-y:-100%}.md\:scale-100{--tw-scale-x:1;--tw-scale-y:1}.md\:scale-100,.md\:scale-125{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md\:scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}.md\:scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.md\:scale-90,.md\:scale-\[85\%\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md\:scale-\[85\%\]{--tw-scale-x:85%;--tw-scale-y:85%}.md\:flex-row{flex-direction:row}.md\:flex-col{flex-direction:column}.md\:items-end{align-items:flex-end}.md\:items-center{align-items:center}.md\:justify-center{justify-content:center}.md\:justify-between{justify-content:space-between}.md\:gap-16{gap:4rem}.md\:gap-\[5\.94rem\]{gap:5.94rem}.md\:gap-\[9\.06rem\]{gap:9.06rem}.md\:gap-y-\[3\.88rem\]{row-gap:3.88rem}.md\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.md\:rounded-md{border-radius:.375rem}.md\:bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity))}.md\:fill-black{fill:#000}.md\:p-2{padding:.5rem}.md\:px-0{padding-left:0;padding-right:0}.md\:py-0{padding-top:0}.md\:pb-0,.md\:py-0{padding-bottom:0}.md\:pb-48{padding-bottom:12rem}.md\:pt-0{padding-top:0}.md\:pt-5{padding-top:1.25rem}.md\:pt-7{padding-top:1.75rem}.md\:text-4xl{font-size:2.25rem;line-height:2.5rem}.md\:text-5xl{font-size:3rem;line-height:1}.md\:text-\[24px\]{font-size:24px}.md\:text-\[45px\]{font-size:45px}.md\:shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:ring-\[0\.5px\]{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(0.5px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:ring-orange-500{--tw-ring-opacity:1;--tw-ring-color:rgb(249 115 22/var(--tw-ring-opacity))}.md\:transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.md\:hover\:bg-orange-500:hover{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity))}}@media (min-width:1024px){.lg\:bottom-10{bottom:2.5rem}.lg\:right-10{right:2.5rem}.lg\:col-start-3{grid-column-start:3}.lg\:mx-52{margin-left:13rem;margin-right:13rem}.lg\:mr-0{margin-right:0}.lg\:mt-\[5rem\]{margin-top:5rem}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:h-\[10rem\]{height:10rem}.lg\:h-\[290px\]{height:290px}.lg\:h-\[313px\]{height:313px}.lg\:h-\[46px\]{height:46px}.lg\:w-\[209px\]{width:209px}.lg\:w-\[228px\]{width:228px}.lg\:w-\[297px\]{width:297px}.lg\:w-\[30\%\]{width:30%}.lg\:w-\[33\%\]{width:33%}.lg\:w-\[64\%\]{width:64%}.lg\:w-\[67\%\]{width:67%}.lg\:w-\[73px\]{width:73px}.lg\:w-\[80\%\]{width:80%}.lg\:w-\[85\%\]{width:85%}.lg\:w-\[87\%\]{width:87%}.lg\:w-auto{width:auto}.lg\:w-full{width:100%}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:flex-col{flex-direction:column}.lg\:items-start{align-items:flex-start}.lg\:items-end{align-items:flex-end}.lg\:items-center{align-items:center}.lg\:justify-end{justify-content:flex-end}.lg\:gap-0{gap:0}.lg\:gap-10{gap:2.5rem}.lg\:gap-14{gap:3.5rem}.lg\:gap-2{gap:.5rem}.lg\:gap-5{gap:1.25rem}.lg\:gap-7{gap:1.75rem}.lg\:gap-y-24{row-gap:6rem}.lg\:bg-transparent{background-color:initial}.lg\:p-0{padding:0}.lg\:p-3{padding:.75rem}.lg\:px-0{padding-left:0;padding-right:0}.lg\:px-10{padding-left:2.5rem;padding-right:2.5rem}.lg\:px-4{padding-left:1rem;padding-right:1rem}.lg\:px-5{padding-left:1.25rem;padding-right:1.25rem}.lg\:pb-16{padding-bottom:4rem}.lg\:pb-5{padding-bottom:1.25rem}.lg\:pl-0{padding-left:0}.lg\:pt-10{padding-top:2.5rem}.lg\:pt-7{padding-top:1.75rem}.lg\:pt-nav{padding-top:5.3rem}.lg\:text-center{text-align:center}.lg\:text-2xl{font-size:1.5rem;line-height:2rem}.lg\:text-\[15px\]{font-size:15px}.lg\:text-\[20px\]{font-size:20px}.lg\:text-\[27px\]{font-size:27px}}@media (min-width:1280px){.xl\:mx-28{margin-left:7rem;margin-right:7rem}.xl\:w-\[38rem\]{width:38rem}.xl\:scale-100{--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.xl\:flex-row{flex-direction:row}.xl\:gap-16{gap:4rem}.xl\:gap-20{gap:5rem}.xl\:px-20{padding-left:5rem;padding-right:5rem}.xl\:px-\[40px\]{padding-left:40px;padding-right:40px}.xl\:py-10{padding-top:2.5rem;padding-bottom:2.5rem}.xl\:pb-\[40px\]{padding-bottom:40px}.xl\:pt-\[5px\]{padding-top:5px}} \ No newline at end of file diff --git a/components/hero/content.js b/components/hero/content.js index 96f49fd..348e1ab 100644 --- a/components/hero/content.js +++ b/components/hero/content.js @@ -35,7 +35,7 @@ export default function Content({ ids, section, data }) { @@ -85,7 +85,7 @@ export default function Content({ ids, section, data }) { diff --git a/components/hero/searchAni.js b/components/hero/searchAni.js deleted file mode 100644 index 390165a..0000000 --- a/components/hero/searchAni.js +++ /dev/null @@ -1,64 +0,0 @@ -import React from "react"; -import { useQuery, gql } from "@apollo/client"; -import Link from "next/link"; - -const SearchAni = ({ searchQuery }) => { - const ANIME_QUERY = gql` - query ( - $id: Int - $page: Int - $perPage: Int - $search: String - $sort: [MediaSort] - ) { - Page(page: $page, perPage: $perPage) { - pageInfo { - total - currentPage - lastPage - hasNextPage - perPage - } - media(id: $id, search: $search, sort: $sort, type: ANIME) { - id - idMal - title { - romaji - english - } - coverImage { - large - } - } - } - } - `; - - // use useQuery hook to execute query and get data - const { loading, error, data } = useQuery(ANIME_QUERY, { - variables: { - search: searchQuery, - page: 1, - perPage: 5, - sort: "TRENDING_DESC", - }, - }); - - // render component - if (loading) return

Loading...

; - if (error) return

Error :(

; - - const { media } = data.Page; - - // const cleanDescription = description.replace(/
/g, '').replace(/\n/g, ' '); - - return ( -
-
- {media.map((anime) => {})} -
-
- ); -}; - -export default SearchAni; diff --git a/components/hero/trending.js b/components/hero/trending.js deleted file mode 100644 index 24a6804..0000000 --- a/components/hero/trending.js +++ /dev/null @@ -1,120 +0,0 @@ -import React from "react"; -import { useQuery, gql } from "@apollo/client"; -import { MdChevronLeft, MdChevronRight } from "react-icons/md"; -import Link from "next/link"; -import Image from "next/image"; - -const Trending = () => { - const ANIME_QUERY = gql` - query ( - $id: Int - $page: Int - $perPage: Int - $search: String - $sort: [MediaSort] - ) { - Page(page: $page, perPage: $perPage) { - pageInfo { - total - currentPage - lastPage - hasNextPage - perPage - } - media(id: $id, search: $search, sort: $sort, type: ANIME) { - id - idMal - title { - romaji - english - } - coverImage { - large - } - description - bannerImage - type - popularity - averageScore - } - } - } - `; - - // use useQuery hook to execute query and get data - const { loading, error, data } = useQuery(ANIME_QUERY, { - variables: { - page: 1, - perPage: 15, - sort: "TRENDING_DESC", - }, - }); - - // render component - if (loading) return

; - if (error) return

Error :(

; - - const { media } = data.Page; - - const slideLeft = () => { - var slider = document.getElementById("slider"); - slider.scrollLeft = slider.scrollLeft - 500; - }; - const slideRight = () => { - var slider = document.getElementById("slider"); - slider.scrollLeft = slider.scrollLeft + 500; - }; - - return ( -
- -
- {media.map((anime) => { - const url = encodeURIComponent( - anime.title.english || anime.title.romaji - ); - - return ( -
- - {anime.title.romaji - } - className="z-20 h-[230px] w-[168px] object-cover p-2 duration-300 ease-in-out hover:scale-105 lg:h-[290px] lg:w-[209px]" - /> - -
- ); - })} -
- -
- ); -}; - -export default Trending; diff --git a/components/loadingScreen.js b/components/loadingScreen.js deleted file mode 100644 index 5b5621c..0000000 --- a/components/loadingScreen.js +++ /dev/null @@ -1,35 +0,0 @@ -import React from "react"; -import Typewriter from "typewriter-effect"; - -const LoadingScreen = () => { - return ( -
-
- qiqi -
- - { - typewriter - .typeString("Please wait...") - .pauseFor(1500) - .deleteAll() - .start(); - }} - /> - -
-
-
- ); -}; - -export default LoadingScreen; diff --git a/components/media/chisato.js b/components/media/chisato.js deleted file mode 100644 index 5fbbb0e..0000000 --- a/components/media/chisato.js +++ /dev/null @@ -1,83 +0,0 @@ -function Chisato(props) { - return ( -
- - - - - - - - - - - - - - - - - - - - - - - -
- ); -} - -export default Chisato; diff --git a/components/media/sticker.js b/components/media/sticker.js deleted file mode 100644 index fdd0590..0000000 --- a/components/media/sticker.js +++ /dev/null @@ -1,34 +0,0 @@ -import React from "react"; - -function StickerWIP() { - return ( - - - - - - - - - - ); -} - -export default StickerWIP; diff --git a/components/navbar.js b/components/navbar.js index 6bc5504..162c57e 100644 --- a/components/navbar.js +++ b/components/navbar.js @@ -30,7 +30,7 @@ function Navbar(props) { return (
-
+
moopa
@@ -38,7 +38,7 @@ function Navbar(props) { {!isVisible && (
search + {session ? ( + + ) : ( + + )}
+
+ + Profile + + +
{/* My List */} )} diff --git a/components/test/dataAni.js b/components/test/dataAni.js deleted file mode 100644 index 528be47..0000000 --- a/components/test/dataAni.js +++ /dev/null @@ -1,2520 +0,0 @@ -export const AniData = { - id: "125367", - title: { - romaji: "Kaguya-sama wa Kokurasetai: Ultra Romantic", - english: "Kaguya-sama: Love is War -Ultra Romantic-", - native: "かぐや様は告らせたい-ウルトラロマンティック-", - }, - malId: 43608, - synonyms: [ - "Kaguya-sama: Love is War Season 3", - "辉夜大小姐想让我告白~天才们的恋爱头脑战~ 3", - "辉夜大小姐想让我告白~天才们的恋爱头脑战~ 第三季", - "Kaguya-sama wa Kokurasetai: Tensai-tachi no Renai Zunousen 3", - "สารภาพรักกับคุณคางุยะซะดี ๆ ~สงครามประสาทความรักของเหล่าอัจฉริยะ~ ภาค 3", - "สารภาพรักกับคุณคางุยะ ซะดี ๆ -อุลตร้า โรแมนติก-", - "Kaguya-sama wa Kokurasetai 3rd Season", - "Kaguya-sama: Cuộc Chiến Tỏ Tình - Ultra Romantic", - "Госпожа Кагуя: в любви как на войне. Ультраромантика", - "Nona Kaguya Ingin Ditembak: Ultra Romantic", - "Кагуя хочет, чтобы ей признались: война любви и разума гениев 3", - ], - isLicensed: true, - isAdult: false, - countryOfOrigin: "JP", - trailer: { - id: "RN4FFgHpAZo", - site: "youtube", - thumbnail: "https://i.ytimg.com/vi/RN4FFgHpAZo/hqdefault.jpg", - }, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx125367-bl5vGalMH2cC.png", - popularity: 159108, - color: "#d6f1a1", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/125367-hGPJLSNfprO3.jpg", - description: - "The elite members of Shuchiin Academy's student council continue their competitive day-to-day antics. Council president Miyuki Shirogane clashes daily against vice-president Kaguya Shinomiya, each fighting tooth and nail to trick the other into confessing their romantic love. Kaguya struggles within the strict confines of her wealthy, uptight family, rebelling against her cold default demeanor as she warms to Shirogane and the rest of her friends.
\n
\nMeanwhile, council treasurer Yuu Ishigami suffers under the weight of his hopeless crush on Tsubame Koyasu, a popular upperclassman who helps to instill a new confidence in him. Miko Iino, the newest student council member, grows closer to the rule-breaking Ishigami while striving to overcome her own authoritarian moral code.
\n
\nAs love further blooms at Shuchiin Academy, the student council officers drag their outsider friends into increasingly comedic conflicts.
\n
\n(Source: MAL Rewrite)
\n
\nNotes:
\n- The 10-minute-long trailer is not added to the site, but the staff for it have been credited in this entry.
\n- The first episode had an advanced screening on April 2, in both New York & Los Angeles.
", - status: "Completed", - releaseDate: 2022, - startDate: { - year: 2022, - month: 4, - day: 9, - }, - endDate: { - year: 2022, - month: 6, - day: 25, - }, - totalEpisodes: 13, - currentEpisode: 13, - rating: 90, - duration: 24, - genres: ["Comedy", "Psychological", "Romance", "Slice of Life"], - season: "SPRING", - studios: ["A-1 Pictures"], - subOrDub: "sub", - type: "TV", - recommendations: [ - { - id: 14813, - malId: 14813, - title: { - romaji: "Yahari Ore no Seishun Love Come wa Machigatteiru.", - english: "My Teen Romantic Comedy SNAFU", - native: "やはり俺の青春ラブコメはまちがっている。", - userPreferred: "Yahari Ore no Seishun Love Come wa Machigatteiru.", - }, - status: "Completed", - episodes: 13, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/nx14813-BC8aanHK9fju.jpg", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/14813-urImBxyWJUEw.jpg", - rating: 78, - type: "TV", - }, - { - id: 100922, - malId: 37105, - title: { - romaji: "Grand Blue", - english: "Grand Blue Dreaming", - native: "ぐらんぶる", - userPreferred: "Grand Blue", - }, - status: "Completed", - episodes: 12, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx100922-ltoQa6rosUyP.png", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/100922-ef1bBJCUCfxk.jpg", - rating: 82, - type: "TV", - }, - { - id: 103572, - malId: 38101, - title: { - romaji: "Go-toubun no Hanayome", - english: "The Quintessential Quintuplets", - native: "五等分の花嫁", - userPreferred: "Go-toubun no Hanayome", - }, - status: "Completed", - episodes: 12, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx103572-2MXV30htoCSh.png", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/103572-qRtBguYOOR2j.jpg", - rating: 76, - type: "TV", - }, - { - id: 124080, - malId: 42897, - title: { - romaji: "Horimiya", - english: "Horimiya", - native: "ホリミヤ", - userPreferred: "Horimiya", - }, - status: "Completed", - episodes: 13, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx124080-h8EPH92nyRfS.jpg", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/124080-ARyLAHHgikRq.jpg", - rating: 81, - type: "TV", - }, - { - id: 107067, - malId: 38992, - title: { - romaji: "Rikei ga Koi ni Ochita no de Shoumei shitemita.", - english: "Science Fell in Love, So I Tried to Prove It", - native: "理系が恋に落ちたので証明してみた。", - userPreferred: "Rikei ga Koi ni Ochita no de Shoumei shitemita.", - }, - status: "Completed", - episodes: 12, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx107067-UOEanLoeuvYh.png", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/107067-QWr4Ity7NZbx.jpg", - rating: 72, - type: "ONA", - }, - { - id: 125124, - malId: 43470, - title: { - romaji: - "Rikei ga Koi ni Ochita no de Shoumei shitemita. r=1-sinθ (Heart)", - english: "Science Fell in Love, So I Tried to Prove It r=1-sinθ", - native: "理系が恋に落ちたので証明してみた。r=1-sinθ(ハート)", - userPreferred: - "Rikei ga Koi ni Ochita no de Shoumei shitemita. r=1-sinθ (Heart)", - }, - status: "Completed", - episodes: 12, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx125124-FHz4ND4kJzqu.jpg", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx125124-FHz4ND4kJzqu.jpg", - rating: 71, - type: "TV", - }, - { - id: 133965, - malId: 48926, - title: { - romaji: "Komi-san wa, Komyushou desu.", - english: "Komi Can’t Communicate", - native: "古見さんは、コミュ症です。", - userPreferred: "Komi-san wa, Komyushou desu.", - }, - status: "Completed", - episodes: 12, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx133965-9TZBS4m4yvED.png", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/133965-spTi0WE7jR0r.jpg", - rating: 79, - type: "TV", - }, - { - id: 5081, - malId: 5081, - title: { - romaji: "Bakemonogatari", - english: "Bakemonogatari", - native: "化物語", - userPreferred: "Bakemonogatari", - }, - status: "Completed", - episodes: 15, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx5081-mzWo8ZayqhES.jpg", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/n5081-0Zcn5GOFYHMc.jpg", - rating: 82, - type: "TV", - }, - { - id: 101921, - malId: 37999, - title: { - romaji: "Kaguya-sama wa Kokurasetai: Tensaitachi no Renai Zunousen", - english: "Kaguya-sama: Love is War", - native: "かぐや様は告らせたい~天才たちの恋愛頭脳戦~", - userPreferred: - "Kaguya-sama wa Kokurasetai: Tensaitachi no Renai Zunousen", - }, - status: "Completed", - episodes: 12, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx101921-VvdGQy1ZySYf.jpg", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/101921-GgvvFhlNhzlF.jpg", - rating: 83, - type: "TV", - }, - { - id: 140960, - malId: 50265, - title: { - romaji: "SPY×FAMILY", - english: "SPY x FAMILY", - native: "SPY×FAMILY", - userPreferred: "SPY×FAMILY", - }, - status: "Completed", - episodes: 12, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx140960-vN39AmOWrVB5.jpg", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/140960-Z7xSvkRxHKfj.jpg", - rating: 86, - type: "TV", - }, - { - id: 127911, - malId: 45613, - title: { - romaji: "Kawaii dake ja Nai Shikimori-san", - english: "Shikimori's Not Just a Cutie", - native: "可愛いだけじゃない式守さん", - userPreferred: "Kawaii dake ja Nai Shikimori-san", - }, - status: "Completed", - episodes: 12, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx127911-cQVL0dhldFwn.jpg", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/127911-YRSP7vuUy801.jpg", - rating: 68, - type: "TV", - }, - { - id: 21804, - malId: 33255, - title: { - romaji: "Saiki Kusuo no Ψ-nan", - english: "The Disastrous Life of Saiki K.", - native: "斉木楠雄のΨ難", - userPreferred: "Saiki Kusuo no Ψ-nan", - }, - status: "Completed", - episodes: 120, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx21804-AAjWfz9JY1EO.jpg", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/21804-QaKs5bDSGX6W.jpg", - rating: 83, - type: "TV_SHORT", - }, - { - id: 20574, - malId: 21877, - title: { - romaji: "Hi Score Girl", - english: "Hi Score Girl", - native: "ハイスコアガール", - userPreferred: "Hi Score Girl", - }, - status: "Completed", - episodes: 12, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx20574-cUPxastH5vAm.jpg", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/20574-wSZyxGOlW4Io.jpg", - rating: 75, - type: "TV", - }, - { - id: 142984, - malId: 50631, - title: { - romaji: "Komi-san wa, Komyushou desu. 2", - english: "Komi Can't Communicate Part 2", - native: "古見さんは、コミュ症です。2", - userPreferred: "Komi-san wa, Komyushou desu. 2", - }, - status: "Completed", - episodes: 12, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx142984-nv2MWVWZ1yYH.jpg", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx142984-nv2MWVWZ1yYH.jpg", - rating: 80, - type: "TV", - }, - { - id: 101291, - malId: 37450, - title: { - romaji: "Seishun Buta Yarou wa Bunny Girl Senpai no Yume wo Minai", - english: "Rascal Does Not Dream of Bunny Girl Senpai", - native: "青春ブタ野郎はバニーガール先輩の夢を見ない", - userPreferred: - "Seishun Buta Yarou wa Bunny Girl Senpai no Yume wo Minai", - }, - status: "Completed", - episodes: 13, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx101291-L71WpAkZPtgm.jpg", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/n101291-fqIUvQ6apEtD.jpg", - rating: 81, - type: "TV", - }, - { - id: 116267, - malId: 41389, - title: { - romaji: "Tonikaku Kawaii", - english: "TONIKAWA: Over The Moon For You", - native: "トニカクカワイイ", - userPreferred: "Tonikaku Kawaii", - }, - status: "Completed", - episodes: 12, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx116267-CSAkFXN2Zsai.jpg", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/116267-xQRslGT0tMTS.jpg", - rating: 77, - type: "TV", - }, - { - id: 8726, - malId: 8726, - title: { - romaji: "Soredemo Machi wa Mawatteiru", - english: "And Yet The Town Moves", - native: "それでも町は廻っている", - userPreferred: "Soredemo Machi wa Mawatteiru", - }, - status: "Completed", - episodes: 12, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx8726-PX1AiBJxOzyo.png", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/8726-JZ9aVlxAQERm.jpg", - rating: 73, - type: "TV", - }, - { - id: 132010, - malId: 48643, - title: { - romaji: "Koi wa Sekai Seifuku no Ato de", - english: "Love After World Domination", - native: "恋は世界征服のあとで", - userPreferred: "Koi wa Sekai Seifuku no Ato de", - }, - status: "Completed", - episodes: 12, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx132010-s0o3Rg0XvDXl.jpg", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/132010-6KV20Q2umOrA.jpg", - rating: 74, - type: "TV", - }, - { - id: 6045, - malId: 6045, - title: { - romaji: "Kimi ni Todoke", - english: "Kimi ni Todoke: From Me to You", - native: "君に届け", - userPreferred: "Kimi ni Todoke", - }, - status: "Completed", - episodes: 25, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx6045-txJOukR5Qve4.jpg", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/n6045-HmG3MtJalXIH.jpg", - rating: 78, - type: "TV", - }, - { - id: 138424, - malId: 49721, - title: { - romaji: "Karakai Jouzu no Takagi-san 3", - english: "Teasing Master Takagi-san Season 3", - native: "からかい上手の高木さん3", - userPreferred: "Karakai Jouzu no Takagi-san 3", - }, - status: "Completed", - episodes: 12, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx138424-97Nz1P7M3O2d.png", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/138424-DGPPFxUinNmt.jpg", - rating: 83, - type: "TV", - }, - { - id: 24, - malId: 24, - title: { - romaji: "School Rumble", - english: "School Rumble", - native: "スクールランブル", - userPreferred: "School Rumble", - }, - status: "Completed", - episodes: 26, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx24-InbFkgWGvqIK.png", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/24-THD6AYmlVPIb.jpg", - rating: 76, - type: "TV", - }, - { - id: 20755, - malId: 24833, - title: { - romaji: "Ansatsu Kyoushitsu", - english: "Assassination Classroom", - native: "暗殺教室", - userPreferred: "Ansatsu Kyoushitsu", - }, - status: "Completed", - episodes: 22, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx20755-q0b3Ok1cAbPd.jpg", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/20755-D4ipww9U8YkC.jpg", - rating: 79, - type: "TV", - }, - ], - characters: [ - { - id: 121101, - role: "MAIN", - name: { - first: "Miyuki", - last: "Shirogane", - full: "Miyuki Shirogane", - native: "白銀御行", - userPreferred: "Miyuki Shirogane", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b121101-Q8HzKP15At2d.png", - voiceActors: [ - { - id: 112635, - language: "Japanese", - name: { - first: "Makoto", - last: "Furukawa", - full: "Makoto Furukawa", - native: "古川慎", - userPreferred: "Makoto Furukawa", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n112635-ORlGvRvgf5Nq.png", - }, - { - id: 119609, - language: "English", - name: { - first: "Clifford", - last: "Chapin", - full: "Clifford Chapin", - native: null, - userPreferred: "Clifford Chapin", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n119609-0LGmxEBb7PS9.jpg", - }, - { - id: 100486, - language: "Spanish", - name: { - first: "Enzo", - last: "Fortuny", - full: "Enzo Fortuny", - native: "Enzo Favio Fortuny Romero", - userPreferred: "Enzo Fortuny", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n100486-0Sv0euaLpbyh.jpg", - }, - { - id: 179920, - language: "Portuguese", - name: { - first: "Rodolfo", - last: "Novaes", - full: "Rodolfo Novaes", - native: "Rodolfo Novaes da Silva", - userPreferred: "Rodolfo Novaes", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n179920-jyB8tIATM41H.jpg", - }, - { - id: 275100, - language: "French", - name: { - first: "Martin", - last: "Faliu", - full: "Martin Faliu", - native: null, - userPreferred: "Martin Faliu", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n275100-1MsTZ135RcJG.jpg", - }, - { - id: 105706, - language: "German", - name: { - first: "Dirk", - last: "Petrick", - full: "Dirk Petrick", - native: null, - userPreferred: "Dirk Petrick", - }, - image: "https://s4.anilist.co/file/anilistcdn/staff/large/10706.jpg", - }, - ], - }, - { - id: 120649, - role: "MAIN", - name: { - first: "Kaguya", - last: "Shinomiya", - full: "Kaguya Shinomiya", - native: "四宮かぐや", - userPreferred: "Kaguya Shinomiya", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b120649-JMKQgPmVq6d3.png", - voiceActors: [ - { - id: 123268, - language: "Japanese", - name: { - first: "Aoi", - last: "Koga", - full: "Aoi Koga", - native: "古賀葵", - userPreferred: "Aoi Koga", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n123268-zIZLjZ5Xfbk4.png", - }, - { - id: 104091, - language: "English", - name: { - first: "Alexis", - last: "Tipton", - full: "Alexis Tipton", - native: null, - userPreferred: "Alexis Tipton", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n104091-OZpJbFWFwnvV.jpg", - }, - { - id: 181976, - language: "Spanish", - name: { - first: "Jessica", - last: "Ángeles", - full: "Jessica Ángeles", - native: "Jessica Iveth Ángeles Ramírez", - userPreferred: "Jessica Ángeles", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n181976-1USsTdPqcj9G.png", - }, - { - id: 213538, - language: "Portuguese", - name: { - first: "Marcella", - last: "Almeida", - full: "Marcella Almeida", - native: null, - userPreferred: "Marcella Almeida", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n213538-ywfbYAlZ12o4.png", - }, - { - id: 216176, - language: "French", - name: { - first: "Emmylou", - last: "Homs", - full: "Emmylou Homs", - native: null, - userPreferred: "Emmylou Homs", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n216176-wk4Ts4Kv2fY5.jpg", - }, - { - id: 140948, - language: "German", - name: { - first: "Amelie", - last: "Plaas-Link", - full: "Amelie Plaas-Link", - native: null, - userPreferred: "Amelie Plaas-Link", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n140948-GiZ70lD0b6hY.png", - }, - ], - }, - { - id: 121103, - role: "MAIN", - name: { - first: "Chika", - last: "Fujiwara", - full: "Chika Fujiwara", - native: "藤原千花", - userPreferred: "Chika Fujiwara", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b121103-UGLxT8utLPnq.png", - voiceActors: [ - { - id: 121961, - language: "Japanese", - name: { - first: "Konomi", - last: "Kohara", - full: "Konomi Kohara", - native: "小原好美", - userPreferred: "Konomi Kohara", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n121961-TaMewK1taQm6.png", - }, - { - id: 101729, - language: "English", - name: { - first: "Jad", - last: "Saxton", - full: "Jad Saxton", - native: null, - userPreferred: "Jad Saxton", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n101729-tga5Umgm17Mj.jpg", - }, - { - id: 189432, - language: "Spanish", - name: { - first: "Elizabeth", - last: "Infante", - full: "Elizabeth Infante", - native: "Elizabeth Paola Infante", - userPreferred: "Elizabeth Infante", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n189432-Ll0v4D0jfSFA.png", - }, - { - id: 176945, - language: "Portuguese", - name: { - first: "Amanda", - last: "Tavares", - full: "Amanda Tavares", - native: null, - userPreferred: "Amanda Tavares", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n176945-j0SIOVCvG28s.jpg", - }, - { - id: 165978, - language: "French", - name: { - first: "Clara", - last: "Soares", - full: "Clara Soares", - native: null, - userPreferred: "Clara Soares", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n165978-BhMLANgEZpeB.jpg", - }, - { - id: 101117, - language: "German", - name: { - first: "Rieke", - last: "Werner", - full: "Rieke Werner", - native: null, - userPreferred: "Rieke Werner", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n101117-Owts3TGv6QZn.png", - }, - ], - }, - { - id: 121102, - role: "MAIN", - name: { - first: "Yuu", - last: "Ishigami", - full: "Yuu Ishigami", - native: "石上優", - userPreferred: "Yuu Ishigami", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b121102-tiQFxnSEIAwm.png", - voiceActors: [ - { - id: 123450, - language: "Japanese", - name: { - first: "Ryouta", - last: "Suzuki", - full: "Ryouta Suzuki", - native: "鈴木崚汰", - userPreferred: "Ryouta Suzuki", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n123450-Hmi5iu3KDHwc.png", - }, - { - id: 111641, - language: "English", - name: { - first: "Austin", - last: "Tindle", - full: "Austin Tindle", - native: null, - userPreferred: "Austin Tindle", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n111641-DbiOaZhYsNsi.jpg", - }, - { - id: 182229, - language: "Spanish", - name: { - first: "Alejandro", - last: "Orozco", - full: "Alejandro Orozco", - native: "Alejandro Orozco Antúnez", - userPreferred: "Alejandro Orozco", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n182229-45duKmz9Eupa.png", - }, - { - id: 240596, - language: "Portuguese", - name: { - first: "Fernando", - last: "Peiter", - full: "Fernando Peiter", - native: null, - userPreferred: "Fernando Peiter", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n240596-CNEuKRCS5pa2.png", - }, - { - id: 163980, - language: "French", - name: { - first: "Hervé", - last: "Grull", - full: "Hervé Grull", - native: null, - userPreferred: "Hervé Grull", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n163980-ekmHy5Zxtjhu.jpg", - }, - { - id: 140228, - language: "German", - name: { - first: "Amadeus", - last: "Strobl", - full: "Amadeus Strobl", - native: null, - userPreferred: "Amadeus Strobl", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n140228-QkcDFuPKFd9t.jpg", - }, - ], - }, - { - id: 125886, - role: "MAIN", - name: { - first: "Miko", - last: "Iino", - full: "Miko Iino", - native: "伊井野ミコ", - userPreferred: "Miko Iino", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b125886-TQbmqAaSgBLS.png", - voiceActors: [ - { - id: 119518, - language: "Japanese", - name: { - first: "Miyu", - last: "Tomita", - full: "Miyu Tomita", - native: "富田美憂", - userPreferred: "Miyu Tomita", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n119518-vZN7TPy12iuu.png", - }, - { - id: 127741, - language: "English", - name: { - first: "Madeleine", - last: "Morris", - full: "Madeleine Morris", - native: null, - userPreferred: "Madeleine Morris", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n127741-YLXfUKNBsclt.jpg", - }, - { - id: 202438, - language: "Spanish", - name: { - first: "Desireé", - last: "González", - full: "Desireé González", - native: null, - userPreferred: "Desireé González", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n202438-Ov4z4EIy8W0T.png", - }, - { - id: 198676, - language: "Portuguese", - name: { - first: "Letícia", - last: "Ida", - full: "Letícia Ida", - native: null, - userPreferred: "Letícia Ida", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n198676-lKn9p7esuO0e.png", - }, - { - id: 100681, - language: "French", - name: { - first: "Isabelle", - last: "Volpe", - full: "Isabelle Volpe", - native: null, - userPreferred: "Isabelle Volpe", - }, - image: "https://s4.anilist.co/file/anilistcdn/staff/large/5681.jpg", - }, - { - id: 263264, - language: "German", - name: { - first: "Paulina", - last: "Bachmann", - full: "Paulina Bachmann", - native: null, - userPreferred: "Paulina Bachmann", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n263264-8ulFSH0bZ1zE.jpg", - }, - ], - }, - { - id: 121104, - role: "SUPPORTING", - name: { - first: "Ai", - last: "Hayasaka", - full: "Ai Hayasaka", - native: "早坂愛", - userPreferred: "Ai Hayasaka", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b121104-7TYRl3EEsDYU.png", - voiceActors: [ - { - id: 116543, - language: "Japanese", - name: { - first: "Yumiri", - last: "Hanamori", - full: "Yumiri Hanamori", - native: "花守ゆみり", - userPreferred: "Yumiri Hanamori", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n116543-nDWFpolRN9dM.png", - }, - { - id: 112793, - language: "English", - name: { - first: "Amanda", - last: "Lee", - full: "Amanda Lee", - native: null, - userPreferred: "Amanda Lee", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n112793-WnHttTnbLSed.png", - }, - { - id: 182192, - language: "Spanish", - name: { - first: "Leyla", - last: "Rangel", - full: "Leyla Rangel", - native: "Leyla Sofía Rangel García", - userPreferred: "Leyla Rangel", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n182192-JCVBbGHC63TL.png", - }, - { - id: 141355, - language: "Portuguese", - name: { - first: "Jéssica", - last: "Cardia", - full: "Jéssica Cardia", - native: null, - userPreferred: "Jéssica Cardia", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n141355-hPmrP1OIf3yq.png", - }, - { - id: 275102, - language: "French", - name: { - first: "Lilly", - last: "Caruso", - full: "Lilly Caruso", - native: null, - userPreferred: "Lilly Caruso", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n275102-qnlETNPatNb6.jpg", - }, - { - id: 140015, - language: "German", - name: { - first: "Magdalena", - last: "Höfner", - full: "Magdalena Höfner", - native: null, - userPreferred: "Magdalena Höfner", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n140015-1f0nUXbpUdyl.png", - }, - ], - }, - { - id: 134329, - role: "SUPPORTING", - name: { - first: "Moeha", - last: "Fujiwara", - full: "Moeha Fujiwara", - native: "藤原萌葉", - userPreferred: "Moeha Fujiwara", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b134329-cRdrf5BqmIVk.png", - voiceActors: [ - { - id: 118663, - language: "Japanese", - name: { - first: "Ari", - last: "Ozawa", - full: "Ari Ozawa", - native: "小澤亜李", - userPreferred: "Ari Ozawa", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n118663-fFzQqJDtYNdA.png", - }, - { - id: 253702, - language: "Spanish", - name: { - first: "Marisol", - last: "Hamed", - full: "Marisol Hamed", - native: "Marisol Valdez Hamed", - userPreferred: "Marisol Hamed", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n253702-Imyptqbsby2h.png", - }, - { - id: 175610, - language: "Portuguese", - name: { - first: "Nica", - last: "Nogueira", - full: "Nica Nogueira", - native: null, - userPreferred: "Nica Nogueira", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg", - }, - { - id: 273360, - language: "French", - name: { - first: "Anna", - last: "Lauzeray-Gishi", - full: "Anna Lauzeray-Gishi", - native: null, - userPreferred: "Anna Lauzeray-Gishi", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n273360-hD3tunfOx1Yc.jpg", - }, - { - id: 140013, - language: "German", - name: { - first: "Betty", - last: "Förster", - full: "Betty Förster", - native: null, - userPreferred: "Betty Förster", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n140013-tNbAHQyEVeWr.png", - }, - ], - }, - { - id: 126986, - role: "SUPPORTING", - name: { - first: "Erika", - last: "Kose", - full: "Erika Kose", - native: "巨瀬工リカ", - userPreferred: "Erika Kose", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b126986-Pcspig2orfPq.png", - voiceActors: [ - { - id: 118939, - language: "Japanese", - name: { - first: "Ayaka", - last: "Asai", - full: "Ayaka Asai", - native: "朝井彩加", - userPreferred: "Ayaka Asai", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n118939-6W4V2P4JL6QH.png", - }, - { - id: 285541, - language: "Spanish", - name: { - first: "Stephanie", - last: "Filigrana", - full: "Stephanie Filigrana", - native: null, - userPreferred: "Stephanie Filigrana", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n285541-4reGe3QxUidB.png", - }, - { - id: 248720, - language: "Portuguese", - name: { - first: "Mariana", - last: "Neves", - full: "Mariana Neves", - native: null, - userPreferred: "Mariana Neves", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n248720-BIspGY5vppaP.png", - }, - { - id: 143592, - language: "German", - name: { - first: "Lana Finn", - last: "Marti", - full: "Lana Finn Marti", - native: null, - userPreferred: "Lana Finn Marti", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg", - }, - ], - }, - { - id: 212389, - role: "SUPPORTING", - name: { - first: "Zen Seito Kaichou", - last: null, - full: "Zen Seito Kaichou", - native: "生前徒会長", - userPreferred: "Zen Seito Kaichou", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b212389-M0QAzDPJvn7Z.jpg", - voiceActors: [ - { - id: 105989, - language: "Japanese", - name: { - first: "Nobunaga", - last: "Shimazaki", - full: "Nobunaga Shimazaki", - native: "島崎信長", - userPreferred: "Nobunaga Shimazaki", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n105989-96etzH1dLNug.jpg", - }, - { - id: 182219, - language: "Spanish", - name: { - first: "Alan", - last: "Bravo", - full: "Alan Bravo", - native: null, - userPreferred: "Alan Bravo", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n182219-dgUxanIweWBY.png", - }, - { - id: 198591, - language: "Portuguese", - name: { - first: "Guilherme", - last: "de Barros", - full: "Guilherme de Barros", - native: null, - userPreferred: "Guilherme de Barros", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n198591-SUn0HtX1Nxoa.jpg", - }, - ], - }, - { - id: 134326, - role: "SUPPORTING", - name: { - first: "Tsubame", - last: "Koyasu", - full: "Tsubame Koyasu", - native: "子安つばめ", - userPreferred: "Tsubame Koyasu", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b134326-GOZE06QSlJSb.png", - voiceActors: [ - { - id: 102322, - language: "Japanese", - name: { - first: "Haruka", - last: "Fukuhara", - full: "Haruka Fukuhara", - native: "福原遥", - userPreferred: "Haruka Fukuhara", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n102322-GkjxD99Pt3rT.png", - }, - { - id: 182631, - language: "Spanish", - name: { - first: "Erika", - last: "Langarica", - full: "Erika Langarica", - native: null, - userPreferred: "Erika Langarica", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n182631-ybXCM5pXa7Mu.png", - }, - { - id: 197182, - language: "Portuguese", - name: { - first: "Mari", - last: "Haruno", - full: "Mari Haruno", - native: null, - userPreferred: "Mari Haruno", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n197182-mDKkEWvcDi9j.jpg", - }, - { - id: 140888, - language: "German", - name: { - first: "Jamie Lee", - last: "Blank", - full: "Jamie Lee Blank", - native: null, - userPreferred: "Jamie Lee Blank", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n140888-wXPdKjB8tGV4.png", - }, - ], - }, - { - id: 134892, - role: "SUPPORTING", - name: { - first: "Adolphe", - last: "Pescarolo", - full: "Adolphe Pescarolo", - native: "アドルフ・ペスカローロ", - userPreferred: "Adolphe Pescarolo", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b134892-HSzCDOQagDJv.jpg", - voiceActors: [ - { - id: 111959, - language: "Japanese", - name: { - first: "Itaru", - last: "Yamamoto", - full: "Itaru Yamamoto", - native: "山本格", - userPreferred: "Itaru Yamamoto", - }, - image: "https://s4.anilist.co/file/anilistcdn/staff/large/16959.jpg", - }, - { - id: 96339, - language: "English", - name: { - first: "Jeremy", - last: "Inman", - full: "Jeremy Inman", - native: null, - userPreferred: "Jeremy Inman", - }, - image: "https://s4.anilist.co/file/anilistcdn/staff/large/1339.jpg", - }, - { - id: 189453, - language: "Spanish", - name: { - first: "Raúl", - last: "Anaya", - full: "Raúl Anaya", - native: "Raúl Alberto Anaya Lunas", - userPreferred: "Raúl Anaya", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n189453-frceR3XuFqLw.png", - }, - { - id: 182488, - language: "Portuguese", - name: { - first: "Hélio", - last: "Ribeiro", - full: "Hélio Ribeiro", - native: null, - userPreferred: "Hélio Ribeiro", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n182488-iJuYz3JIxLQZ.jpg", - }, - { - id: 152984, - language: "French", - name: { - first: "Stéphane", - last: "Marais", - full: "Stéphane Marais", - native: null, - userPreferred: "Stéphane Marais", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n152984-kHa9e7APEpMC.jpg", - }, - { - id: 265392, - language: "German", - name: { - first: "Harald", - last: "Effenberg", - full: "Harald Effenberg", - native: null, - userPreferred: "Harald Effenberg", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n265392-UnHzM3HLl5nE.jpg", - }, - ], - }, - { - id: 212390, - role: "SUPPORTING", - name: { - first: "Momo", - last: "Ryuuju", - full: "Momo Ryuuju", - native: "龍珠桃", - userPreferred: "Momo Ryuuju", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b212390-cCppoJIBYxyA.jpg", - voiceActors: [ - { - id: 95869, - language: "Japanese", - name: { - first: "Saori", - last: "Hayami", - full: "Saori Hayami", - native: "早見沙織", - userPreferred: "Saori Hayami", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n95869-qCQ0EaWpq1QT.png", - }, - { - id: 297131, - language: "Japanese", - name: { - first: "Sisi", - last: "Forster", - full: "Sisi Forster", - native: null, - userPreferred: "Sisi Forster", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg", - }, - { - id: 182233, - language: "Spanish", - name: { - first: "Carla", - last: "Castañeda", - full: "Carla Castañeda", - native: "Carla Castañeda Mendoza", - userPreferred: "Carla Castañeda", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n182233-mB72AFLGmKTK.jpg", - }, - { - id: 301905, - language: "Portuguese", - name: { - first: "Flávia", - last: "Damiani", - full: "Flávia Damiani", - native: null, - userPreferred: "Flávia Damiani", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n301905-1hedyhqBrEso.jpg", - }, - ], - }, - { - id: 275597, - role: "SUPPORTING", - name: { - first: "J", - last: "Suzuki", - full: "J Suzuki", - native: "鈴木J", - userPreferred: "J Suzuki", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b275597-64W2GeSpgN5P.jpg", - voiceActors: [ - { - id: 101623, - language: "Japanese", - name: { - first: "Takeshi", - last: "Maruyama", - full: "Takeshi Maruyama", - native: "丸山壮史", - userPreferred: "Takeshi Maruyama", - }, - image: "https://s4.anilist.co/file/anilistcdn/staff/large/6623.jpg", - }, - { - id: 199860, - language: "Portuguese", - name: { - first: "Alex", - last: "Morales", - full: "Alex Morales", - native: null, - userPreferred: "Alex Morales", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n199860-TLVz6bpXfnVF.jpg", - }, - { - id: 218042, - language: "German", - name: { - first: "Axel", - last: "Strothmann", - full: "Axel Strothmann", - native: null, - userPreferred: "Axel Strothmann", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg", - }, - ], - }, - { - id: 134327, - role: "SUPPORTING", - name: { - first: "Tsubasa", - last: "Tanuma ", - full: "Tsubasa Tanuma ", - native: "田沼翼", - userPreferred: "Tsubasa Tanuma ", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b134327-5tqYKvBaqRe2.png", - voiceActors: [ - { - id: 119833, - language: "Japanese", - name: { - first: "Taku", - last: "Yashiro", - full: "Taku Yashiro", - native: "八代拓", - userPreferred: "Taku Yashiro", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n119833-0SP13A92YLm4.jpg", - }, - { - id: 127809, - language: "English", - name: { - first: "Brandon", - last: "McInnis", - full: "Brandon McInnis", - native: "Brandon McInnis", - userPreferred: "Brandon McInnis", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n127809-uLM2ITKWUSCl.png", - }, - { - id: 184120, - language: "Spanish", - name: { - first: "Diego", - last: "Becerril", - full: "Diego Becerril", - native: null, - userPreferred: "Diego Becerril", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n184120-eNsy8lrRiqge.png", - }, - { - id: 254219, - language: "Portuguese", - name: { - first: "Rafael", - last: "Rheda", - full: "Rafael Rheda", - native: null, - userPreferred: "Rafael Rheda", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg", - }, - { - id: 187297, - language: "German", - name: { - first: "Ben", - last: "Hadad", - full: "Ben Hadad", - native: null, - userPreferred: "Ben Hadad", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg", - }, - ], - }, - { - id: 275116, - role: "SUPPORTING", - name: { - first: "Nao", - last: "Hayasaka", - full: "Nao Hayasaka", - native: "早坂奈央", - userPreferred: "Nao Hayasaka", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b275116-SOfw5qLMI0FM.png", - voiceActors: [ - { - id: 108551, - language: "Japanese", - name: { - first: "Toa", - last: "Yukinari", - full: "Toa Yukinari", - native: "行成とあ", - userPreferred: "Toa Yukinari", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n108551-R4Ro9eFab55G.png", - }, - { - id: 207635, - language: "Spanish", - name: { - first: "América", - last: "Torres", - full: "América Torres", - native: null, - userPreferred: "América Torres", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n207635-YSaMMoab1MGq.png", - }, - { - id: 250114, - language: "Portuguese", - name: { - first: "Lia", - last: "Antunes", - full: "Lia Antunes", - native: null, - userPreferred: "Lia Antunes", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg", - }, - { - id: 195911, - language: "German", - name: { - first: "Franziska", - last: "Endres", - full: "Franziska Endres", - native: null, - userPreferred: "Franziska Endres", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg", - }, - ], - }, - { - id: 176219, - role: "SUPPORTING", - name: { - first: "Kozue", - last: "Makihara ", - full: "Kozue Makihara ", - native: "槇原こずえ", - userPreferred: "Kozue Makihara ", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b176219-5XhyzA12lms2.jpg", - voiceActors: [ - { - id: 119383, - language: "Japanese", - name: { - first: "Marika", - last: "Kouno", - full: "Marika Kouno", - native: "高野麻里佳", - userPreferred: "Marika Kouno", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n119383-En92dXrTlJTY.png", - }, - { - id: 189430, - language: "Spanish", - name: { - first: "Azul", - last: "Valadez", - full: "Azul Valadez", - native: "Azucena Valadez Romero", - userPreferred: "Azul Valadez", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n189430-Mkuq464GJSnL.jpg", - }, - { - id: 285678, - language: "Portuguese", - name: { - first: "Juju", - last: "Bac", - full: "Juju Bac", - native: null, - userPreferred: "Juju Bac", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg", - }, - { - id: 261231, - language: "German", - name: { - first: "Liza", - last: "Simmerlein", - full: "Liza Simmerlein", - native: null, - userPreferred: "Liza Simmerlein", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg", - }, - ], - }, - { - id: 176218, - role: "SUPPORTING", - name: { - first: "Kazeno", - last: null, - full: "Kazeno", - native: "風野", - userPreferred: "Kazeno", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b176218-x0TQnRrxS2Zs.jpg", - voiceActors: [ - { - id: 107705, - language: "Japanese", - name: { - first: "Taishi", - last: "Murata", - full: "Taishi Murata", - native: "村田太志", - userPreferred: "Taishi Murata", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n107705-lVfYRzWY5AFW.jpg", - }, - { - id: 184139, - language: "Spanish", - name: { - first: "Roberto", - last: "Salguero", - full: "Roberto Salguero", - native: null, - userPreferred: "Roberto Salguero", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n184139-i79eTGoEkKqd.jpg", - }, - { - id: 210886, - language: "Portuguese", - name: { - first: "Rex", - last: "Nunes", - full: "Rex Nunes", - native: "Reginaldo Nunes da Silva", - userPreferred: "Rex Nunes", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n210886-jUX57eQqlZpx.jpg", - }, - { - id: 142856, - language: "German", - name: { - first: "Daniel", - last: "Gärtner", - full: "Daniel Gärtner", - native: null, - userPreferred: "Daniel Gärtner", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg", - }, - ], - }, - { - id: 157369, - role: "SUPPORTING", - name: { - first: "Rei", - last: "Onodera", - full: "Rei Onodera", - native: "小野寺麗", - userPreferred: "Rei Onodera", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b157369-9o1jZCEZMyYb.png", - voiceActors: [ - { - id: 119154, - language: "Japanese", - name: { - first: "Yuuki", - last: "Takada", - full: "Yuuki Takada", - native: "高田憂希", - userPreferred: "Yuuki Takada", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n119154-x2un4m4ECxn4.png", - }, - { - id: 254396, - language: "Portuguese", - name: { - first: "Melina", - last: "Valente", - full: "Melina Valente", - native: null, - userPreferred: "Melina Valente", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg", - }, - { - id: 275099, - language: "French", - name: { - first: "Kahina", - last: "Tagherset", - full: "Kahina Tagherset", - native: null, - userPreferred: "Kahina Tagherset", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n275099-CV0vPZH23Law.jpg", - }, - ], - }, - { - id: 134893, - role: "SUPPORTING", - name: { - first: "Shirogane no Chichi", - last: null, - full: "Shirogane no Chichi", - native: "白銀の父", - userPreferred: "Shirogane no Chichi", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b134893-1dpk1sQ1pGRR.jpg", - voiceActors: [ - { - id: 95160, - language: "Japanese", - name: { - first: "Takehito", - last: "Koyasu", - full: "Takehito Koyasu", - native: "子安武人", - userPreferred: "Takehito Koyasu", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n95160-jWevcH7BmfE1.jpg", - }, - { - id: 182222, - language: "Spanish", - name: { - first: "Rafael", - last: "Pacheco", - full: "Rafael Pacheco", - native: null, - userPreferred: "Rafael Pacheco", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n182222-0Fz9qcwIYdVr.jpg", - }, - { - id: 241781, - language: "Portuguese", - name: { - first: "Adriano", - last: "Paixão", - full: "Adriano Paixão", - native: null, - userPreferred: "Adriano Paixão", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg", - }, - { - id: 165698, - language: "German", - name: { - first: "Nico", - last: "Nothnagel", - full: "Nico Nothnagel", - native: null, - userPreferred: "Nico Nothnagel", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg", - }, - ], - }, - { - id: 176220, - role: "SUPPORTING", - name: { - first: "", - last: "Terashima", - full: "Terashima", - native: "寺島", - userPreferred: "Terashima", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b176220-ybbcG8hZSgUO.png", - voiceActors: [ - { - id: 125577, - language: "Japanese", - name: { - first: "Rina", - last: "Honizumi", - full: "Rina Honizumi", - native: "本泉莉奈", - userPreferred: "Rina Honizumi", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n125577-f48HE13krNVR.jpg", - }, - { - id: 257285, - language: "Portuguese", - name: { - first: "Gabriela", - last: "Stampacchio", - full: "Gabriela Stampacchio", - native: null, - userPreferred: "Gabriela Stampacchio", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg", - }, - ], - }, - { - id: 134331, - role: "SUPPORTING", - name: { - first: "Kobachi", - last: "Osaragi", - full: "Kobachi Osaragi", - native: "大仏こばち", - userPreferred: "Kobachi Osaragi", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b134331-pGWnRI42SZAl.png", - voiceActors: [ - { - id: 100250, - language: "Japanese", - name: { - first: "Rina", - last: "Hidaka", - full: "Rina Hidaka", - native: "日高里菜", - userPreferred: "Rina Hidaka", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n100250-JhNN2vxQ311M.png", - }, - { - id: 184295, - language: "Spanish", - name: { - first: "Jocelyn", - last: "Robles", - full: "Jocelyn Robles", - native: "Jocelyn Robles Guillén", - userPreferred: "Jocelyn Robles", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n184295-SGIBinFSleRp.png", - }, - { - id: 262684, - language: "Portuguese", - name: { - first: "Vanessa", - last: "Scorsoni", - full: "Vanessa Scorsoni", - native: null, - userPreferred: "Vanessa Scorsoni", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg", - }, - { - id: 275101, - language: "French", - name: { - first: "Isabelle", - last: "Desplantes", - full: "Isabelle Desplantes", - native: null, - userPreferred: "Isabelle Desplantes", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n275101-ggiPg7JGL3A0.jpg", - }, - { - id: 290589, - language: "German", - name: { - first: "Peggy-Sue", - last: "Emmler", - full: "Peggy-Sue Emmler", - native: null, - userPreferred: "Peggy-Sue Emmler", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg", - }, - ], - }, - { - id: 134328, - role: "SUPPORTING", - name: { - first: "Maki", - last: "Shijo", - full: "Maki Shijo", - native: "四条眞妃", - userPreferred: "Maki Shijo", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b134328-s3cEgqb5MEbh.png", - voiceActors: [ - { - id: 124390, - language: "Japanese", - name: { - first: "Kana", - last: "Ichinose", - full: "Kana Ichinose", - native: "市ノ瀬加那", - userPreferred: "Kana Ichinose", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n124390-eFIxDGxC7Vy8.png", - }, - { - id: 217017, - language: "English", - name: { - first: "Hope", - last: "Endrenyi", - full: "Hope Endrenyi", - native: null, - userPreferred: "Hope Endrenyi", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n217017-uyEcKBtmPYAc.jpg", - }, - { - id: 226232, - language: "Spanish", - name: { - first: "Susana", - last: "Cohe", - full: "Susana Cohe", - native: "Susana Cortés Hernández", - userPreferred: "Susana Cohe", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n226232-FYSd01DLJ5Qy.png", - }, - { - id: 254216, - language: "Portuguese", - name: { - first: "Colombina", - last: "Rivas", - full: "Colombina Rivas", - native: null, - userPreferred: "Colombina Rivas", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg", - }, - { - id: 277477, - language: "German", - name: { - first: "Ness", - last: "Gerung", - full: "Ness Gerung", - native: null, - userPreferred: "Ness Gerung", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg", - }, - ], - }, - { - id: 177065, - role: "SUPPORTING", - name: { - first: "Daichi", - last: "Fujiwara", - full: "Daichi Fujiwara", - native: "藤原大地", - userPreferred: "Daichi Fujiwara", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b177065-CV1Ok4h74srn.jpg", - voiceActors: [ - { - id: 102664, - language: "Japanese", - name: { - first: "Hirohiko", - last: "Kakegawa", - full: "Hirohiko Kakegawa", - native: "掛川裕彦", - userPreferred: "Hirohiko Kakegawa", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n102664-hDenVljsoR8F.png", - }, - { - id: 111673, - language: "Spanish", - name: { - first: "Manuel", - last: "Campuzano", - full: "Manuel Campuzano", - native: "Manuel Campuzano Márquez", - userPreferred: "Manuel Campuzano", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n111673-WnvtApo3SNny.png", - }, - { - id: 254976, - language: "Portuguese", - name: { - first: "Reinaldo", - last: "Rodriguez", - full: "Reinaldo Rodriguez", - native: null, - userPreferred: "Reinaldo Rodriguez", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n254976-XSajLo3G3TXu.jpg", - }, - ], - }, - { - id: 276519, - role: "SUPPORTING", - name: { - first: "Masaru", - last: "Kobayashi", - full: "Masaru Kobayashi", - native: "小林マサル", - userPreferred: "Masaru Kobayashi", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b276519-dha4odF2TNMN.jpg", - voiceActors: [ - { - id: 119871, - language: "Japanese", - name: { - first: "Kouhei", - last: "Amasaki", - full: "Kouhei Amasaki", - native: "天崎滉平", - userPreferred: "Kouhei Amasaki", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n119871-jbrrS09NU0CO.png", - }, - { - id: 116839, - language: "Spanish", - name: { - first: "Miguel Ángel", - last: "Ruiz", - full: "Miguel Ángel Ruiz", - native: null, - userPreferred: "Miguel Ángel Ruiz", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n116839-9EnQTp30Vy4R.png", - }, - { - id: 193392, - language: "Portuguese", - name: { - first: "Dudu", - last: "Fevereiro", - full: "Dudu Fevereiro", - native: null, - userPreferred: "Dudu Fevereiro", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/default.jpg", - }, - ], - }, - { - id: 126144, - role: "SUPPORTING", - name: { - first: "Kei", - last: "Shirogane", - full: "Kei Shirogane", - native: "白銀圭", - userPreferred: "Kei Shirogane", - }, - image: - "https://s4.anilist.co/file/anilistcdn/character/large/b126144-4fc2sYUVFKOJ.png", - voiceActors: [ - { - id: 126963, - language: "Japanese", - name: { - first: "Sayumi", - last: "Suzushiro", - full: "Sayumi Suzushiro", - native: "鈴代紗弓", - userPreferred: "Sayumi Suzushiro", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n126963-0LMbvLzSSADw.jpg", - }, - { - id: 129302, - language: "English", - name: { - first: "Heather", - last: "Walker", - full: "Heather Walker", - native: null, - userPreferred: "Heather Walker", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n129302-wNSfYBozMHlY.jpg", - }, - { - id: 201444, - language: "Spanish", - name: { - first: "Amanda", - last: "Hinojosa", - full: "Amanda Hinojosa", - native: null, - userPreferred: "Amanda Hinojosa", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n201444-UuM4e0e04Wk0.png", - }, - { - id: 199070, - language: "Portuguese", - name: { - first: "Nathalia", - last: "Guillen", - full: "Nathalia Guillen", - native: null, - userPreferred: "Nathalia Guillen", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n199070-yBeJgzjLB8Q1.png", - }, - { - id: 274233, - language: "French", - name: { - first: "Clotilde", - last: "Verry", - full: "Clotilde Verry", - native: null, - userPreferred: "Clotilde Verry", - }, - image: - "https://s4.anilist.co/file/anilistcdn/staff/large/n274233-WXiPUGxyei2M.jpg", - }, - { - id: 110555, - language: "German", - name: { - first: "Josephine", - last: "Schmidt", - full: "Josephine Schmidt", - native: null, - userPreferred: "Josephine Schmidt", - }, - image: "https://s4.anilist.co/file/anilistcdn/staff/large/15555.jpg", - }, - ], - }, - ], - relations: [ - { - id: 86635, - relationType: "ADAPTATION", - malId: 90125, - title: { - romaji: "Kaguya-sama wa Kokurasetai: Tensaitachi no Renai Zunousen", - english: "Kaguya-sama: Love is War", - native: "かぐや様は告らせたい~天才たちの恋愛頭脳戦~", - userPreferred: - "Kaguya-sama wa Kokurasetai: Tensaitachi no Renai Zunousen", - }, - status: "Completed", - episodes: null, - image: - "https://s4.anilist.co/file/anilistcdn/media/manga/cover/large/bx86635-EdaLQmsn86Fy.png", - color: "#d61a35", - type: "MANGA", - cover: - "https://s4.anilist.co/file/anilistcdn/media/manga/banner/86635-5lYiOxKzZYZh.jpg", - rating: 88, - }, - { - id: 112641, - relationType: "PREQUEL", - malId: 40591, - title: { - romaji: "Kaguya-sama wa Kokurasetai?: Tensaitachi no Renai Zunousen", - english: "Kaguya-sama: Love is War?", - native: "かぐや様は告らせたい?~天才たちの恋愛頭脳戦~", - userPreferred: - "Kaguya-sama wa Kokurasetai?: Tensaitachi no Renai Zunousen", - }, - status: "Completed", - episodes: 12, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx112641-zoGC8d6FaPXU.jpg", - color: "#DAD797", - type: "TV", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/112641-mKZe0zng0ndV.jpg", - rating: 86, - }, - { - id: 151384, - relationType: "SEQUEL", - malId: 52198, - title: { - romaji: "Kaguya-sama wa Kokurasetai: First Kiss wa Owaranai", - english: "Kaguya-sama: Love is War -The First Kiss That Never Ends-", - native: "かぐや様は告らせたい -ファーストキッスは終わらない-", - userPreferred: "Kaguya-sama wa Kokurasetai: First Kiss wa Owaranai", - }, - status: "Completed", - episodes: 4, - image: - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx151384-gv0q8wOE6D58.jpg", - color: "#e45d78", - type: "TV", - cover: - "https://s4.anilist.co/file/anilistcdn/media/anime/banner/151384-JybfIpHr2gx6.jpg", - rating: 90, - }, - ], - mappings: { - mal: 43608, - anidb: 15806, - kitsu: 43691, - anilist: 125367, - thetvdb: 354198, - anisearch: 15681, - livechart: 10191, - "notify.moe": "tgrxrLtMR", - "anime-planet": "kaguya-sama-love-is-war-ultra-romantic", - }, - episodes: [ - { - id: "kaguya-sama-wa-kokurasetai-ultra-romantic-episode-1", - title: - "Miko Iino Wants to Be Soothed / Kaguya Doesn’t Realize / Chika Fujiwara Wants to Battle", - description: - "After finally making her long awaited smartphone debut, Kaguya restlessly contemplates over how to respond to Shirogane's LINE message. As Hayasaka watches over, she realizes that Kaguya is not aware of the \"read receipt\" function. If Kaguya lies by responding that she just read the message, she runs the risk of exposing the truth that she had been obsessively staring at Shirogane's message with glee. Weighing out her options to best serve her mistress, Hayasaka decides to explain LINE's functions when suddenly a new problem emerges.", - number: 1, - image: - "https://artworks.thetvdb.com/banners/v4/episode/7689771/screencap/624b2c2cd5d87.jpg", - airDate: "2022-04-09T00:00:00.000Z", - }, - { - id: "kaguya-sama-wa-kokurasetai-ultra-romantic-episode-2", - title: - "Miyuki Shirogane Wants to Mediate / Kaguya Wants to Distract Him / Kaguya Preemptively Strikes", - description: - "Kaguya makes a big fuss when she learns that Shirogane was invited to a karaoke group date and orders Hayasaka to remove him from the venue. Dissatisfied with such treatment yet unable to refuse her mistress' instructions, Hayasaka joins the party as Shirogane's acquaintance Smithee A. Herthaka and plans to ruin the atmosphere by airing out that Shirogane once dumped her. And although she manages to get Shirogane out, a rebellious spirit against Kaguya has begun to grow...", - number: 2, - image: - "https://artworks.thetvdb.com/banners/v4/episode/9090730/screencap/6253f296e7a1f.jpg", - airDate: "2022-04-16T00:00:00.000Z", - }, - { - id: "kaguya-sama-wa-kokurasetai-ultra-romantic-episode-3", - title: - "Nagisa Kashiwagi Wants to Kill / Maki Shijo Wants to Take Action / Miyuki Shirogane Wants to Be Believed", - description: - "Shirogane accidentally steps on Maki Shijo, a female student who had collapsed on campus, and takes care of her in the student council room. Apparently, she has suffered from the sorrows of love. When Maki discusses her situation with him, her expression changes from high-spirited, to anxious, to explosively angry, to tearful. After witnessing such an intense range of human emotion, for some reason Shirogane was struck by a strong sense of déjà vu. What on earth was this feeling?", - number: 3, - image: - "https://artworks.thetvdb.com/banners/v4/episode/9090731/screencap/625d2c24dd9ab.jpg", - airDate: "2022-04-23T00:00:00.000Z", - }, - { - id: "kaguya-sama-wa-kokurasetai-ultra-romantic-episode-4", - title: - 'Kaguya Shinomiya\'s Impossible Demand: "A Cowrie a Swallow Gave Birth To" Part 1 / Yu Ishigami Wants to Prove Himself Worthy / Chika Fujiwara Wants to Stay Over', - description: - "After their second semester final exams end, there are plans for a sleepover at Kaguya's house. But Shirogane and the others are unable to come, leaving Fujiwara as the only one who can join. While barley glancing at an upset Kaguya, Fujiwara gets excited about the totally hot butler Mr. Herthaka without realizing it's Hayasaka dressed as a man. That night as the girl talk unfolds at the pajama party, a sleep-deprived Kaguya takes on a strange mood before anyone can notice. With that energy, she calls Shirogane and ends up asking outrageous questions.", - number: 4, - image: - "https://artworks.thetvdb.com/banners/v4/episode/9090732/screencap/62668cf1b31e7.jpg", - airDate: "2022-04-30T00:00:00.000Z", - }, - { - id: "kaguya-sama-wa-kokurasetai-ultra-romantic-episode-5", - title: - "Chika Fujiwara Wants to Beat a Rhythm / Ai Hayasaka Wants to Talk / Maki Shijo Wants Some Help", - description: - "Shirogane couldn't tell Ms. Herthaka that sometimes humans need to expose their weaknesses and endeavors to practice rapping which should be able to convey that. But his rapping skills are catastrophic. Fujiwara, who previously taught him singing and dancing, tags along for practice. But she's a total amateur when it comes to rap that she's on the level where she's convinced it's all simple-minded puns. So Fujiwara begins special training. With the advice from Shirogane who has overflowing knowledge on rap music, she rapidly improves... But something is still missing!", - number: 5, - image: - "https://artworks.thetvdb.com/banners/v4/episode/9090733/screencap/626fb02caaf90.jpg", - airDate: "2022-05-07T00:00:00.000Z", - }, - { - id: "kaguya-sama-wa-kokurasetai-ultra-romantic-episode-6", - title: - "The Student Council Wants to Move Forward / Miyuki Shirogane Wants to Make Her Confess, Part 2 / Miyuki Shirogane Wants to Make Her Confess, Part 3", - description: - "Parent-Teacher Conferences to determine each student's future begin at Shuchiin Academy. One wishes to continue in the academy's university, one is considering taking exams for a different university – both will declare their future plans. Fujiwara, who is joined by her father, jokes around and expresses her desire to go to a university outside of the academy. Meanwhile, Kaguya's father didn't show up, but she informs them just as her parents instructed – that she will continue to Shuchiin's university. While Maki, Hayasaka, and the others each discuss their dreams, last but not least is Shirogane who is taking the exam. In a clear and confident tone, he declares the road he must proceed. And that answer is...!", - number: 6, - image: - "https://artworks.thetvdb.com/banners/v4/episode/9090734/screencap/627ccc3d55ab1.jpg", - airDate: "2022-05-14T00:00:00.000Z", - }, - { - id: "kaguya-sama-wa-kokurasetai-ultra-romantic-episode-7", - title: - "Miko Iino Can't Love, Part 1 / Students Wish to Discuss the Culture Festival / Miyuki Shirogane Wants to Blow It Up", - description: - "While all the classes were consumed in preparation for Shuchiin Academy's Hoshin Culture Festival, Shirogane and those from Class 2-B were working hard at making balloon art. As Fujiwara delicately puts finishing touches on a cute balloon bear, the clumsy Shirogane keeps popping them no matter how many times he tries. The sound of balloons popping echoes sadly in the classroom. But Fujiwara, who has joined Shirogane's special training many times up until now, hardens her heart and decides not to help this time. To overcome this without the help of others, Shirogane heads to the student council room for practice. However, Kaguya is in the room...", - number: 7, - image: - "https://artworks.thetvdb.com/banners/v4/episode/9090735/screencap/6282238070200.jpg", - airDate: "2022-05-21T00:00:00.000Z", - }, - { - id: "kaguya-sama-wa-kokurasetai-ultra-romantic-episode-8", - title: - "Kei Shirogane Wants to Show Off / About Kaguya Shinomiya, Part 2 / Kaguya Wants to Confess", - description: - "Kaguya learns about the romantic legend that giving a heart-shaped gift at the Culture Festival brings eternal love. She wonders if there is a way she can give Shirogane a heart-shaped gift without getting caught. But her plans are full of errors, and she panics. She becomes sick of herself as a cowardly person who can only come up with negative ideas. There, Shirogane, exhausted from preparing for the Culture Festival, shows up. As Kaguya sees Shirogane doing his best for everyone as the student council president, she...", - number: 8, - image: - "https://artworks.thetvdb.com/banners/v4/episode/9090736/screencap/628b6093331e6.jpg", - airDate: "2022-05-28T00:00:00.000Z", - }, - { - id: "kaguya-sama-wa-kokurasetai-ultra-romantic-episode-9", - title: - "Spring of First Year / Kaguya's Culture Festival / Yu Ishigami's Culture Festival", - description: - "One week after enrolling in Shuchiin Academy as a special scholarship student, Shirogane had already regretted that he had come to a school he should not have. The students around him were elites born into famous families. Shirogane, who is from a modest household and enrolled from a school outside of Shuchiin's track, couldn't even find a friend to eat with, so he quietly kills time away from the cafeteria. Just as Shirogane's miserable emotions explode, an upperclassman with a student cap appears in front of him. A shining golden fourragere lays across his chest as proof of student council president. And he says that he's come to recruit Shirogane into the student council.", - number: 9, - image: - "https://artworks.thetvdb.com/banners/v4/episode/9090737/screencap/6294a898e73cb.jpg", - airDate: "2022-06-04T00:00:00.000Z", - }, - { - id: "kaguya-sama-wa-kokurasetai-ultra-romantic-episode-10", - title: - "Kozue Makihara Wants to Have Fun / Chika Fujiwara Wants to Unmask / Miyuki Shirogane's Culture Festival", - description: - 'Ishigami, who succeeded in inviting Tsubame on a Culture Festival date, browses around campus exhibits in an attempt to shorten the distance between the two. In the end, it didn\'t go as well as hoped. But when he tried to express his everyday feelings of gratitude for the upperclassman he feels indebted to, it caused an unexpected uproar. Shirogane was astonished after witnessing the unexpected event. Gripped by the fear that his secretly planned "Make Shinomiya Confess Plan" will be ruined, he sinks into despair after thinking too hard about every detail.', - number: 10, - image: - "https://artworks.thetvdb.com/banners/v4/episode/9090738/screencap/629dd17cc3013.jpg", - airDate: "2022-06-11T00:00:00.000Z", - }, - { - id: "kaguya-sama-wa-kokurasetai-ultra-romantic-episode-11", - title: - "Miyuki Shirogane Wants to Make Her Confess, Part 4 / Tsubame Koyasu Wants to Say No / Miyuki Shirogane Wants to Make Her Confess, Part 5", - description: - "Invited to walk around the culture festival together by Shirogane, Kaguya is unable to hide her surprise at this sudden plot twist. She lightly joked that maybe he was affected by the festival's atmosphere, but Shirogane never dropped his serious expression. Compelled by such intensity, Kaguya decided to walk around the school together. Everyone around them gossips that they are on a date as Kaguya blushes. But while they enjoy visiting a love fortune-teller, food shops and live music, Kaguya feels true happiness. From the depths of her heart, she wishes that each day could continue just like this.", - number: 11, - image: - "https://artworks.thetvdb.com/banners/v4/episode/9090739/screencap/62a75222075ba.jpg", - airDate: "2022-06-18T00:00:00.000Z", - }, - { - id: "kaguya-sama-wa-kokurasetai-ultra-romantic-episode-12", - title: - "Kaguya Wants to Confess, Part 2 / Kaguya Wants to Confess, Part 3 / Dual Confessions, Part 1", - description: - "The moment the culture festival reached its finale, the jewel object made by Shirogane was stolen by a phantom thief who calls himself Arsène. Kaguya and the others headed to the roof where the phantom thief keeps appearing, but there was no one there. Fujiwara, who transformed into a genius detective, struggles to solve the mystery behind the calling card and uncover the thief's true identity. But Kaguya, left behind at the scene of the crime, had begun to figure out the criminal. The problem is the location. Kaguya traced the phantom thief's line of thinking and headed to where he is now...", - number: 12, - image: - "https://artworks.thetvdb.com/banners/v4/episode/9090740/screencap/62b5f3872085a.jpg", - airDate: "2022-06-25T00:00:00.000Z", - }, - { - id: "kaguya-sama-wa-kokurasetai-ultra-romantic-episode-13", - title: "Dual Confessions, Part 2 / The Shuchiin Afterparty", - description: - "Shroud in a cape and dressed in the guise of the phantom thief Arsène, Shirogane waited for Kaguya's arrival atop the clock tower roof overlooking Shuchiin. When asked why he would do such a thing, Shirogane answered that there was something he wanted to show Kaguya. The festival's afterparty has already begun as the sun set over this school and the students could be seen encircling and enjoying the bonfire. While the emotions that could not be expressed with words mingled between Shirogane and Kaguya's hearts... Shirogane carried out his ultra-romantic operation!!", - number: 13, - image: - "https://artworks.thetvdb.com/banners/v4/episode/9231033/screencap/62b5f41750c72.jpg", - airDate: "2022-06-25T00:00:00.000Z", - }, - ], -}; diff --git a/components/test/player.js b/components/test/player.js deleted file mode 100644 index 3f650bd..0000000 --- a/components/test/player.js +++ /dev/null @@ -1,11 +0,0 @@ -import "vidstack/styles/base.css"; - -import { MediaOutlet, MediaPlayer } from "@vidstack/react"; - -export default function StackPlayer() { - return ( - - - - ); -} diff --git a/components/underConst.js b/components/underConst.js deleted file mode 100644 index a6d9e80..0000000 --- a/components/underConst.js +++ /dev/null @@ -1,22 +0,0 @@ -import Footer from "./footer"; -import StickerWIP from "./media/sticker"; -import Navbar from "./navbar"; - -function UnderConstruction() { - return ( - <> -
-
-
- -
-

- {"> Sabar yahhh, pagenya masih dibikin..."} {":)"} -

-
-
- - ); -} - -export default UnderConstruction; diff --git a/components/videoPlayer.js b/components/videoPlayer.js index 092f53a..c0d551d 100644 --- a/components/videoPlayer.js +++ b/components/videoPlayer.js @@ -10,6 +10,7 @@ export default function VideoPlayer({ progress, session, aniId, + stats, }) { const [url, setUrl] = useState(); const [source, setSource] = useState([]); @@ -61,7 +62,7 @@ export default function VideoPlayer({ option={{ url: `${url}`, quality: [source], - // autoplay: true, + autoplay: true, screenshot: true, type: "m3u8", }} @@ -88,7 +89,7 @@ export default function VideoPlayer({ if (percentage >= 0.9) { // use >= instead of > - markProgress(aniId, progress); + markProgress(aniId, progress, stats); } else { return; } @@ -117,7 +118,7 @@ export default function VideoPlayer({ }, }); - console.log(res.status); + // console.log(res.status); const title = titles; const prevDataStr = localStorage.getItem("lastPlayed") || "[]"; diff --git a/lib/useAnilist.js b/lib/useAnilist.js index 71882c0..acae54f 100644 --- a/lib/useAnilist.js +++ b/lib/useAnilist.js @@ -1,14 +1,14 @@ import { useState, useEffect } from "react"; -export function useAniList(session) { +export function useAniList(session, stats) { const [media, setMedia] = useState([]); // const [aniAdvanceSearch, setAniAdvanceSearch] = useState([]); // Queries const queryMedia = ` - query ($username: String) { - MediaListCollection(userName: $username, type: ANIME) { + query ($username: String, $status: MediaListStatus) { + MediaListCollection(userName: $username, type: ANIME, status: $status) { lists { status name @@ -44,7 +44,7 @@ export function useAniList(session) { lastPage hasNextPage } - media (search: $search, type: $type, status: $status, season: $season, seasonYear: $year, genre_in: $genres, tag_in: $tags, sort: $sort) { + media (search: $search, type: $type, status: $status, season: $season, seasonYear: $year, genre_in: $genres, tag_in: $tags, sort: $sort, isAdult: false) { id title { userPreferred @@ -77,8 +77,8 @@ export function useAniList(session) { `; const progressWatched = ` - mutation($mediaId: Int, $progress: Int) { - SaveMediaListEntry(mediaId: $mediaId, progress: $progress, status: CURRENT) { + mutation($mediaId: Int, $progress: Int, $status: MediaListStatus) { + SaveMediaListEntry(mediaId: $mediaId, progress: $progress, status: $status) { id mediaId progress @@ -89,6 +89,8 @@ export function useAniList(session) { const username = session?.user?.name; const accessToken = session?.user?.token; + let statuss = stats || null; + // console.log(session); useEffect(() => { async function fetchData() { @@ -100,9 +102,37 @@ export function useAniList(session) { "Content-Type": "application/json", }, body: JSON.stringify({ - query: queryMedia, + query: ` + query ($username: String, $status: MediaListStatus) { + MediaListCollection(userName: $username, type: ANIME, status: $status) { + lists { + status + name + entries { + id + mediaId + status + progress + score + media { + id + title { + english + romaji + } + episodes + coverImage { + large + } + } + } + } + } + } + `, variables: { username: username, + status: statuss?.stats, }, }), }); @@ -139,7 +169,7 @@ export function useAniList(session) { } } - async function markProgress(mediaId, progress) { + async function markProgress(mediaId, progress, stats) { if (!accessToken) return; const response = await fetch("https://graphql.anilist.co/", { method: "POST", @@ -152,11 +182,12 @@ export function useAniList(session) { variables: { mediaId: mediaId, progress: progress, + status: stats, }, }), }); if (response.ok) { - console.log("Progress Updated"); + // console.log(`Progress Updated: ${progress}`); } else if (response.status === 401) { console.log("Unauthorized"); } else if (response.status === 400) { diff --git a/package-lock.json b/package-lock.json index 8893601..b8170b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,12 +12,9 @@ "@consumet/extensions": "github:consumet/consumet.ts", "@next-auth/mongodb-adapter": "^1.1.1", "@next/font": "13.0.7", - "@vidstack/react": "^0.4.3", "artplayer": "^4.6.2", "axios": "^1.2.2", "closest-match": "^1.3.3", - "crypto": "^1.0.1", - "disqus-react": "^1.1.5", "framer-motion": "^8.5.0", "gql": "^1.1.2", "graphql": "^15.8.0", @@ -34,9 +31,7 @@ "react-icons": "^4.7.1", "react-loading-skeleton": "^3.2.0", "request": "^2.88.2", - "tailwind-scrollbar-hide": "^1.1.7", - "typewriter-effect": "^2.19.0", - "vidstack": "^0.4.3" + "tailwind-scrollbar-hide": "^1.1.7" }, "devDependencies": { "autoprefixer": "^10.4.13", @@ -2785,11 +2780,6 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, - "node_modules/@maverick-js/signals": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/@maverick-js/signals/-/signals-5.9.1.tgz", - "integrity": "sha512-/iq6pyYUcN9VDOv3KyOsrSJRuImOZOSJuDA/hS3zWseg4BkW7LWn08cr4gMM2FSNi06758T1P34nJG+UbCAm4A==" - }, "node_modules/@motionone/animation": { "version": "10.15.1", "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.15.1.tgz", @@ -3250,23 +3240,6 @@ "resolved": "https://registry.npmjs.org/@types/nprogress/-/nprogress-0.2.0.tgz", "integrity": "sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==" }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "peer": true - }, - "node_modules/@types/react": { - "version": "18.0.26", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", - "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", - "peer": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -3275,12 +3248,6 @@ "@types/node": "*" } }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "peer": true - }, "node_modules/@types/trusted-types": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", @@ -3300,21 +3267,6 @@ "@types/webidl-conversions": "*" } }, - "node_modules/@vidstack/react": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@vidstack/react/-/react-0.4.3.tgz", - "integrity": "sha512-zQyGaq93cQrecarANVKg/nXf2LfaGEkixZVzlmbWkA4+5JvDEduLyC0EKUAmK3qk22Z0VpvyY3iupW3DnCgvNg==", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@types/react": "^18.0.0", - "maverick.js": "^0.32.3", - "media-icons": "^0.4.2", - "react": "^18.0.0", - "vidstack": "0.4.3" - } - }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -4187,12 +4139,6 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, - "node_modules/crypto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", - "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", - "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in." - }, "node_modules/crypto-js": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", @@ -4244,12 +4190,6 @@ "node": ">=4" } }, - "node_modules/csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", - "peer": true - }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -4384,15 +4324,6 @@ "node": ">=8" } }, - "node_modules/disqus-react": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/disqus-react/-/disqus-react-1.1.5.tgz", - "integrity": "sha512-9fdG5m6c3wJzlCDLaMheuUagMVj3s5qgUSXdekpCsvzYOKG21AiuOoqyDzA0oXrpPnYzgpnsvPYqZ+i0hJPGZw==", - "peerDependencies": { - "react": "^15.6.1 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^15.6.1 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", @@ -6041,45 +5972,6 @@ "semver": "bin/semver.js" } }, - "node_modules/maverick.js": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/maverick.js/-/maverick.js-0.32.3.tgz", - "integrity": "sha512-2jzhv6nmK5mw6gEuoq5MeEGUBEhF5keZxi3w7/2oIB4NSvfCBBSOyKH9fBagpvAAOtT5ySgVAJlivg9vUBdJsQ==", - "dependencies": { - "@maverick-js/signals": "^5.9.1", - "type-fest": "^2.17.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/maverick.js/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/media-captions": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/media-captions/-/media-captions-0.0.7.tgz", - "integrity": "sha512-FUz0sVnMrhNHL3AmmDMKs3SUYnjxQ5Yg4N7ijJUTojAOqd4KYjPqSj2+dGBwAuU7gJsU5TgKziggsXU17EGPOw==", - "engines": { - "node": ">=16" - } - }, - "node_modules/media-icons": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/media-icons/-/media-icons-0.4.2.tgz", - "integrity": "sha512-jrxoQzxsZFyzt6P3CoGZWa6FVKoR/Ii1plbVjtyTSyQGpeVWkJ++0oBAwGOv/F9mWRxmGkaQ04uEIKTFouRG1w==", - "engines": { - "node": ">=16" - } - }, "node_modules/memory-pager": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", @@ -6910,14 +6802,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dependencies": { - "performance-now": "^2.1.0" - } - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -7947,19 +7831,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typewriter-effect": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/typewriter-effect/-/typewriter-effect-2.19.0.tgz", - "integrity": "sha512-rhUX1ukmAXNFWUnMFx8CDU1uLWJQ7pRYzDU7WfHJRq43i6SmWSP9vFiUsOGfXINodUAgZiJ5xnzwLciHxZDGDg==", - "dependencies": { - "prop-types": "^15.6.2", - "raf": "^3.4.0" - }, - "peerDependencies": { - "react": "^17.x || ^18.x", - "react-dom": "^17.x || ^18.x" - } - }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -8097,31 +7968,6 @@ "extsprintf": "^1.2.0" } }, - "node_modules/vidstack": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/vidstack/-/vidstack-0.4.3.tgz", - "integrity": "sha512-9Q61GCyoc4v3rSk3vni38qRbddDtKQr2UukiZQt3UYS2mN6yuX8Ln46CQqo0/6A8r8grqYJG9Xow8XDYeQFp7Q==", - "dependencies": { - "maverick.js": "^0.32.3", - "media-captions": "^0.0.7", - "media-icons": "^0.4.2", - "type-fest": "^3.5.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/vidstack/node_modules/type-fest": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.8.0.tgz", - "integrity": "sha512-FVNSzGQz9Th+/9R6Lvv7WIAkstylfHN2/JYxkyhhmKFYh9At2DST8t6L6Lref9eYO8PXFTfG9Sg1Agg0K3vq3Q==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -10645,11 +10491,6 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, - "@maverick-js/signals": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/@maverick-js/signals/-/signals-5.9.1.tgz", - "integrity": "sha512-/iq6pyYUcN9VDOv3KyOsrSJRuImOZOSJuDA/hS3zWseg4BkW7LWn08cr4gMM2FSNi06758T1P34nJG+UbCAm4A==" - }, "@motionone/animation": { "version": "10.15.1", "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.15.1.tgz", @@ -10952,23 +10793,6 @@ "resolved": "https://registry.npmjs.org/@types/nprogress/-/nprogress-0.2.0.tgz", "integrity": "sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==" }, - "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "peer": true - }, - "@types/react": { - "version": "18.0.26", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", - "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", - "peer": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -10977,12 +10801,6 @@ "@types/node": "*" } }, - "@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "peer": true - }, "@types/trusted-types": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", @@ -11002,12 +10820,6 @@ "@types/webidl-conversions": "*" } }, - "@vidstack/react": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@vidstack/react/-/react-0.4.3.tgz", - "integrity": "sha512-zQyGaq93cQrecarANVKg/nXf2LfaGEkixZVzlmbWkA4+5JvDEduLyC0EKUAmK3qk22Z0VpvyY3iupW3DnCgvNg==", - "requires": {} - }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -11668,11 +11480,6 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, - "crypto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", - "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==" - }, "crypto-js": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", @@ -11706,12 +11513,6 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, - "csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", - "peer": true - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -11809,12 +11610,6 @@ "path-type": "^4.0.0" } }, - "disqus-react": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/disqus-react/-/disqus-react-1.1.5.tgz", - "integrity": "sha512-9fdG5m6c3wJzlCDLaMheuUagMVj3s5qgUSXdekpCsvzYOKG21AiuOoqyDzA0oXrpPnYzgpnsvPYqZ+i0hJPGZw==", - "requires": {} - }, "dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", @@ -13001,32 +12796,6 @@ } } }, - "maverick.js": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/maverick.js/-/maverick.js-0.32.3.tgz", - "integrity": "sha512-2jzhv6nmK5mw6gEuoq5MeEGUBEhF5keZxi3w7/2oIB4NSvfCBBSOyKH9fBagpvAAOtT5ySgVAJlivg9vUBdJsQ==", - "requires": { - "@maverick-js/signals": "^5.9.1", - "type-fest": "^2.17.0" - }, - "dependencies": { - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" - } - } - }, - "media-captions": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/media-captions/-/media-captions-0.0.7.tgz", - "integrity": "sha512-FUz0sVnMrhNHL3AmmDMKs3SUYnjxQ5Yg4N7ijJUTojAOqd4KYjPqSj2+dGBwAuU7gJsU5TgKziggsXU17EGPOw==" - }, - "media-icons": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/media-icons/-/media-icons-0.4.2.tgz", - "integrity": "sha512-jrxoQzxsZFyzt6P3CoGZWa6FVKoR/Ii1plbVjtyTSyQGpeVWkJ++0oBAwGOv/F9mWRxmGkaQ04uEIKTFouRG1w==" - }, "memory-pager": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", @@ -13575,14 +13344,6 @@ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "requires": { - "performance-now": "^2.1.0" - } - }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -14320,15 +14081,6 @@ "is-typed-array": "^1.1.9" } }, - "typewriter-effect": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/typewriter-effect/-/typewriter-effect-2.19.0.tgz", - "integrity": "sha512-rhUX1ukmAXNFWUnMFx8CDU1uLWJQ7pRYzDU7WfHJRq43i6SmWSP9vFiUsOGfXINodUAgZiJ5xnzwLciHxZDGDg==", - "requires": { - "prop-types": "^15.6.2", - "raf": "^3.4.0" - } - }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -14419,24 +14171,6 @@ "extsprintf": "^1.2.0" } }, - "vidstack": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/vidstack/-/vidstack-0.4.3.tgz", - "integrity": "sha512-9Q61GCyoc4v3rSk3vni38qRbddDtKQr2UukiZQt3UYS2mN6yuX8Ln46CQqo0/6A8r8grqYJG9Xow8XDYeQFp7Q==", - "requires": { - "maverick.js": "^0.32.3", - "media-captions": "^0.0.7", - "media-icons": "^0.4.2", - "type-fest": "^3.5.0" - }, - "dependencies": { - "type-fest": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.8.0.tgz", - "integrity": "sha512-FVNSzGQz9Th+/9R6Lvv7WIAkstylfHN2/JYxkyhhmKFYh9At2DST8t6L6Lref9eYO8PXFTfG9Sg1Agg0K3vq3Q==" - } - } - }, "watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", diff --git a/package.json b/package.json index 5ba87ef..516a066 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "moopa", - "version": "3.1.6", + "version": "3.2.0", "private": true, "scripts": { "dev": "next dev", @@ -14,12 +14,9 @@ "@consumet/extensions": "github:consumet/consumet.ts", "@next-auth/mongodb-adapter": "^1.1.1", "@next/font": "13.0.7", - "@vidstack/react": "^0.4.3", "artplayer": "^4.6.2", "axios": "^1.2.2", "closest-match": "^1.3.3", - "crypto": "^1.0.1", - "disqus-react": "^1.1.5", "framer-motion": "^8.5.0", "gql": "^1.1.2", "graphql": "^15.8.0", @@ -36,9 +33,7 @@ "react-icons": "^4.7.1", "react-loading-skeleton": "^3.2.0", "request": "^2.88.2", - "tailwind-scrollbar-hide": "^1.1.7", - "typewriter-effect": "^2.19.0", - "vidstack": "^0.4.3" + "tailwind-scrollbar-hide": "^1.1.7" }, "devDependencies": { "autoprefixer": "^10.4.13", diff --git a/pages/about.js b/pages/about.js index 24f04f3..7255401 100644 --- a/pages/about.js +++ b/pages/about.js @@ -1,10 +1,7 @@ import Head from "next/head"; import Layout from "../components/layout"; -import UnderConstruction from "../components/underConst"; export default function About() { - const clientId = process.env.ANILIST_CLIENT_ID; - return ( <> diff --git a/pages/anime/[...id].js b/pages/anime/[...id].js index 81e5706..01ed629 100644 --- a/pages/anime/[...id].js +++ b/pages/anime/[...id].js @@ -1,3 +1,5 @@ +const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || "http://localhost:3000"; + import React, { useEffect, useState } from "react"; import { META } from "@consumet/extensions"; @@ -8,28 +10,26 @@ import Head from "next/head"; import { closestMatch } from "closest-match"; import Content from "../../components/hero/content"; -import { useSession } from "next-auth/react"; +import { getServerSession } from "next-auth/next"; +import { authOptions } from "../api/auth/[...nextauth]"; export default function Himitsu({ info, - slicedDesc, color, episodeList, episode1, - judul, subIndo, epIndo, + sessions, + progress, + status, + lastPlayed, }) { - const [isLoading, setIsloading] = useState(false); const [showText, setShowtext] = useState(false); const [load, setLoad] = useState(true); const [Lang, setLang] = useState(true); const [showAll, setShowAll] = useState(false); - const { data: session } = useSession(); - - const [lastPlayed, setLastPlayed] = useState(null); - const [user, setUser] = useState(null); const episode = episodeList; const epi1 = episode1; @@ -44,21 +44,6 @@ export default function Himitsu({ } useEffect(() => { - async function userData() { - setLoad(false); - if (!session) return; - setLoad(true); - const res = await fetch(`/api/get-user?userName=${session?.user.name}`); - const data = await res.json(); - setLastPlayed( - data?.recentWatch.filter( - (item) => item.title.romaji === info.title.romaji - )[0]?.episode - ); - setUser(data); - setLoad(false); - } - function getBrightness(color) { const rgb = color.match(/\d+/g); return (299 * rgb[0] + 587 * rgb[1] + 114 * rgb[2]) / 1000; @@ -80,12 +65,8 @@ export default function Himitsu({ setTextColor(element); }); - userData(); - }, [color, session]); - - if (!info) { - return; - } + setLoad(false); + }, [color, sessions, info.id]); let episodeIndo = null; if (epIndo < 17) { @@ -95,11 +76,11 @@ export default function Himitsu({ } async function handleUpdate(data) { - if (!session) return; + if (!sessions) return; const res = await fetch("/api/update-user", { method: "POST", body: JSON.stringify({ - name: session?.user.name, + name: sessions?.user.name, newData: { recentWatch: data, }, @@ -111,6 +92,8 @@ export default function Himitsu({ console.log(res.status); } + // console.log(lastPlayed); + return ( <> @@ -127,12 +110,10 @@ export default function Himitsu({ - {isLoading ? ( -

Loading cuy sabar...

- ) : info ? ( + {info ? (
@@ -141,6 +122,7 @@ export default function Himitsu({ {info.image && ( <>
-

- {judul} +

+ {info.title.romaji || info.title.english}

@@ -278,7 +260,7 @@ export default function Himitsu({

-
+ />
-
+

Episodes

+ {status && ( + <> +
+ {status} + + status + +
+ + )}
-
+
{load ? (

Loading...

) : episode && Lang ? ( @@ -421,9 +414,8 @@ export default function Himitsu({ const item = lastPlayed?.find( (item) => item.id === episode.id ); - console.log(item); return ( -
+
handleUpdate({ @@ -444,14 +436,18 @@ export default function Himitsu({ item ? `${item.time}` : "" }`} className={`text-start text-xl ${ - item ? "text-[#414141]" : "text-white" + episode.number <= progress + ? "text-[#5f5f5f]" + : "text-white" }`} >

Episode {episode.number}

{episode.title && (

"{episode.title}" @@ -531,11 +527,13 @@ export default function Himitsu({ ); } -export const getServerSideProps = async (context) => { +export async function getServerSideProps(context) { context.res.setHeader( "Cache-Control", "public, s-maxage=10, stale-while-revalidate=59" ); + const session = await getServerSession(context.req, context.res, authOptions); + const { id } = context.query; if (!id) { return { @@ -552,6 +550,12 @@ export const getServerSideProps = async (context) => { provider.fetchEpisodesListById(id[0]), ]); + if (!info) { + return { + notFound: true, + }; + } + let episodeList = episodes; if (episodes.length === 0) { const res = await fetch( @@ -608,16 +612,58 @@ export const getServerSideProps = async (context) => { epis = dataInf.episode; } - const desc = info.description.slice(0, 150) + "..."; + let progress = null; + let status = null; + let lastPlayed = null; + + if (session) { + const res = await fetch(`${baseUrl}/api/get-media`, { + method: "POST", + body: JSON.stringify({ + username: session?.user.name, + }), + headers: { + "Content-Type": "application/json", + }, + }); + + const resp = await fetch( + `${baseUrl}/api/get-user?userName=${session?.user.name}` + ); + const data = await resp.json(); + + lastPlayed = data?.recentWatch.filter( + (item) => item.title.romaji === info.title.romaji + )[0]?.episode; + + const prog = await res.json(); + + const gat = prog.lists.map((item) => item.entries); + const git = gat.map((item) => + item.find((item) => item.media.id === parseInt(info.id)) + ); + const gut = git?.find((item) => item?.media.id === parseInt(info.id)); + + if (gut) { + progress = gut?.progress; + if (gut.status === "CURRENT") { + status = "Watching"; + } else if (gut.status === "PLANNING") { + status = "Planned to watch"; + } else if (gut.status === "COMPLETED") { + status = "Completed"; + } else if (gut.status === "DROPPED") { + status = "Dropped"; + } else if (gut.status === "PAUSED") { + status = "Paused"; + } + } + } + const color = { backgroundColor: `${info.color}` }; const epi1 = episodes.filter((epi) => epi.number === 1); const title = info.title?.userPreferred || "No Title"; - const MAX = 20; - - const oriJ = info.title?.english || info.title.romaji || info.title.native; - const judul = oriJ.length > MAX ? `${oriJ.substring(0, MAX)}...` : oriJ; - return { props: { info: { @@ -627,13 +673,15 @@ export const getServerSideProps = async (context) => { userPreferred: title, }, }, - slicedDesc: desc, color, episodeList, episode1: epi1, - judul, subIndo: slug, epIndo: epis, + sessions: session, + progress: progress || null, + status: status, + lastPlayed: lastPlayed || null, }, }; -}; +} diff --git a/pages/anime/watch/[...info].js b/pages/anime/watch/[...info].js index 552102c..756e0c1 100644 --- a/pages/anime/watch/[...info].js +++ b/pages/anime/watch/[...info].js @@ -1,3 +1,5 @@ +const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || "http://localhost:3000"; + import Layout from "../../../components/layout"; // import { data } from "../../../lib/testData"; // import { aniData } from "../../../lib/infoData"; @@ -11,26 +13,30 @@ import Modal from "../../../components/modal"; import { useNotification } from "../../../lib/useNotify"; -import { useSession, signIn, signOut } from "next-auth/react"; +import { signIn, signOut } from "next-auth/react"; +import { getServerSession } from "next-auth/next"; +import { authOptions } from "../../api/auth/[...nextauth]"; + import AniList from "../../../components/media/aniList"; -import { AnimatePresence, motion as m } from "framer-motion"; -import Navbar from "../../../components/navbar"; import { Navigasi } from "../.."; -export default function Info({ info }) { - const { data: session, status } = useSession(); +export default function Info({ info, sessions, statusWatch }) { const title = info.aniData.title.romaji || info.aniData.title.english; const data = info.aniData; const fallback = info.epiFallback; const { Notification: NotificationComponent, show } = useNotification(); - // console.log(session); - - const playingEpisode = data.episodes + let playingEpisode = data.episodes .filter((item) => item.id == info.id) .map((item) => item.number); + if (playingEpisode == 0) { + playingEpisode = fallback + .filter((item) => item.id == info.id) + .map((item) => item.number); + } + const [open, setOpen] = useState(false); const [aniStatus, setAniStatus] = useState(""); const [aniProgress, setAniProgress] = useState(parseInt(playingEpisode)); @@ -56,12 +62,6 @@ export default function Info({ info }) { .filter((item) => item.id == info.id) .map((item) => item.title); - if (status === "loading") { - return

Loading...

; - } - - console.log(); - return ( <> @@ -78,7 +78,7 @@ export default function Info({ info }) {

Save this Anime to Your List

- {!session && ( + {!sessions && (
)} - {session && ( + {sessions && ( <>
@@ -378,6 +379,8 @@ export default function Info({ info }) { } export async function getServerSideProps(context) { + const session = await getServerSession(context.req, context.res, authOptions); + const { info } = context.query; if (!info) { return { @@ -418,6 +421,43 @@ export async function getServerSideProps(context) { } } + const playingEpisode = aniData.episodes + .filter((item) => item.id == id) + .map((item) => item.number); + + const resp = await fetch(`${baseUrl}/api/get-media`, { + method: "POST", + body: JSON.stringify({ + username: session?.user.name, + }), + headers: { + "Content-Type": "application/json", + }, + }); + + const prog = await resp.json(); + + const gat = prog?.lists.map((item) => item.entries); + const git = gat?.map((item) => + item.find((item) => item.media.id === parseInt(aniId)) + ); + const gut = git?.find((item) => item?.media.id === parseInt(aniId)); + + let statusWatch = "CURRENT"; + + if (gut?.status === "COMPLETED") { + statusWatch = "REPEATING"; + } else if ( + gut?.status === "REPEATING" && + gut?.media?.episodes === parseInt(playingEpisode) + ) { + statusWatch = "COMPLETED"; + } else if (gut?.status === "REPEATING") { + statusWatch = "REPEATING"; + } else if (aniData.totalEpisodes === parseInt(playingEpisode)) { + statusWatch = "COMPLETED"; + } + return { props: { info: { @@ -427,6 +467,8 @@ export async function getServerSideProps(context) { aniData, epiFallback, }, + sessions: session, + statusWatch: statusWatch, }, }; } diff --git a/pages/api/get-media.js b/pages/api/get-media.js new file mode 100644 index 0000000..7c45d03 --- /dev/null +++ b/pages/api/get-media.js @@ -0,0 +1,78 @@ +// pages/api/anime-media-list.js + +export default async function handler(req, res) { + const { username, status } = req.body; + + try { + const response = await fetch("https://graphql.anilist.co/", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + query: ` + query ($username: String, $status: MediaListStatus) { + MediaListCollection(userName: $username, type: ANIME, status: $status, sort: SCORE_DESC) { + user { + id + name + about (asHtml: true) + createdAt + avatar { + large + } + statistics { + anime { + count + episodesWatched + meanScore + minutesWatched + } + } + bannerImage + mediaListOptions { + animeList { + sectionOrder + } + } + } + lists { + status + name + entries { + id + mediaId + status + progress + score + media { + id + status + title { + english + romaji + } + episodes + coverImage { + large + } + } + } + } + } + } + `, + variables: { + username, + status, + }, + }), + }); + + const data = await response.json(); + res.status(200).json(data.data.MediaListCollection); + } catch (error) { + console.error(error); + res.status(500).json({ message: "Internal server error" }); + } +} diff --git a/pages/api/get-user.js b/pages/api/get-user.js index 7df10a6..36bc974 100644 --- a/pages/api/get-user.js +++ b/pages/api/get-user.js @@ -7,7 +7,9 @@ export async function getUser(userName) { const collection = db.collection("users"); const user = await collection.findOne({ name: userName }); - user._id = String(user._id); + if (user && user._id) { + user._id = String(user._id); + } return user; } diff --git a/pages/api/getUser.js b/pages/api/getUser.js deleted file mode 100644 index 7df10a6..0000000 --- a/pages/api/getUser.js +++ /dev/null @@ -1,20 +0,0 @@ -import clientPromise from "../../lib/mongodb"; - -export async function getUser(userName) { - const client = await clientPromise; - const db = client.db("authbase"); - - const collection = db.collection("users"); - const user = await collection.findOne({ name: userName }); - - user._id = String(user._id); - - return user; -} - -export default async function handler(req, res) { - const { userName } = req.query; - const user = await getUser(userName); - - res.status(200).json(user); -} diff --git a/pages/index.js b/pages/index.js index a9aca07..f0b6ce4 100644 --- a/pages/index.js +++ b/pages/index.js @@ -10,11 +10,13 @@ import { useRouter } from "next/router"; import { motion } from "framer-motion"; -import { useSession, signIn } from "next-auth/react"; +import { useSession, signIn, signOut } from "next-auth/react"; import { useAniList } from "../lib/useAnilist"; +import { getServerSession } from "next-auth/next"; +import { authOptions } from "./api/auth/[...nextauth]"; export function Navigasi() { - const { data: session, status } = useSession(); + const { data: sessions, status } = useSession(); const router = useRouter(); @@ -54,7 +56,7 @@ export function Navigasi() {
  • Loading...
  • ) : ( <> - {!session && ( + {!sessions && (
  • )} - {session && ( + {sessions && (
  • - {/*
    imagine
    */} - My List + {/*
    imagine
    */} + + My List +
  • )} @@ -93,15 +97,14 @@ export function Navigasi() { ); } -export default function Home({ detail, populars }) { - const { data: session, status } = useSession(); - const { media } = useAniList(session); +export default function Home({ detail, populars, sessions }) { + const { media } = useAniList(sessions, { stats: "CURRENT" }); const [isVisible, setIsVisible] = useState(false); - const [recently, setRecently] = useState(null); const [plan, setPlan] = useState(null); const [user, setUser] = useState(null); const [array, setArray] = useState([]); + const [fade, setFade] = useState(false); const popular = populars?.data; const data = detail.data[0]; @@ -109,42 +112,48 @@ export default function Home({ detail, populars }) { const handleShowClick = () => { setIsVisible(true); + setFade(true); }; const handleHideClick = () => { setIsVisible(false); + setFade(false); }; - // const reversed = user?.recentWatch.reverse(); - // console.log(plan); - useEffect(() => { async function userData() { - if (!session) return; - const res = await fetch(`/api/get-user?userName=${session?.user.name}`); + if (!sessions) return; + const res = await fetch(`/api/get-user?userName=${sessions?.user.name}`); const data = await res.json(); const getMedia = - media.filter((item) => item.status === "PAUSED")[0] || null; + media.filter((item) => item.status === "CURRENT")[0] || null; const plan = getMedia?.entries .map(({ media }) => media) .filter((media) => media); - setPlan(plan); - setArray(data?.recentWatch.reverse()); - setUser(data); - } - function fetchData() { - const recent = JSON.parse(localStorage.getItem("recentWatch")); - if (recent) { - setRecently(recent); + const get = media.flatMap((item) => item.entries); + const newArray = []; + + get.forEach((item) => { + if (!newArray.some((element) => element.id === item.id)) { + newArray.push(item); + } + }); + + const getlog = newArray + .map(({ media }) => media) + .filter((media) => media); + + if (plan) { + setPlan(plan.reverse()); } + + setArray(data?.recentWatch?.reverse()); + setUser(data); } userData(); - fetchData(); - }, [session]); - - // console.log(user?.recentWatch.reverse()); + }, [sessions, media]); return ( <> @@ -172,7 +181,7 @@ export default function Home({ detail, populars }) { {!isVisible && ( )} +
    - {/* Mobile Menu */} -
    - {isVisible && ( -
    - )} - {session && ( - user avatar - )} - - )} - {isVisible && ( -
    -
    - + + -
    + + search + + + {sessions ? ( + - -
    - + )}
    - )} -
    + +
    + )}
    @@ -389,10 +402,19 @@ export default function Home({ detail, populars }) {
    - {session && ( -
    -
    - {greeting}, {session?.user.name} + {sessions && ( +
    +
    + {greeting},

    {sessions?.user.name}

    +
    )} @@ -405,7 +427,7 @@ export default function Home({ detail, populars }) { transition={{ duration: 0.5, staggerChildren: 0.2 }} // Add staggerChildren prop > {/* SECTION 1 */} - {session && user?.recentWatch && ( + {sessions && user?.recentWatch && ( )} - {session && plan && ( + {sessions && plan && ( @@ -478,7 +500,9 @@ export default function Home({ detail, populars }) { ); } -export async function getServerSideProps({ req, res }) { +export async function getServerSideProps(context) { + const session = await getServerSession(context.req, context.res, authOptions); + const trendingDetail = await aniListData({ sort: "TRENDING_DESC", page: 1, @@ -494,6 +518,7 @@ export async function getServerSideProps({ req, res }) { genre: genreDetail.props, detail: trendingDetail.props, populars: popularDetail.props, + sessions: session, }, }; } @@ -508,7 +533,7 @@ function getGreeting() { greeting = "Good afternoon"; } else if (time >= 18 && time < 22) { greeting = "Good evening"; - } else if (time >= 22 && time < 5) { + } else if (time >= 22 || time < 5) { greeting = "Good night"; } diff --git a/pages/profile/[user].js b/pages/profile/[user].js new file mode 100644 index 0000000..b40c41a --- /dev/null +++ b/pages/profile/[user].js @@ -0,0 +1,366 @@ +const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || "http://localhost:3000"; + +import { getServerSession } from "next-auth"; +import { authOptions } from "../api/auth/[...nextauth]"; +import Navbar from "../../components/navbar"; +import Image from "next/image"; +import Link from "next/link"; +import Head from "next/head"; +import { useState } from "react"; + +export default function MyList({ media, sessions, user, time }) { + const [listFilter, setListFilter] = useState("all"); + const [visible, setVisible] = useState(false); + + const filterMedia = (status) => { + if (status === "all") { + return media; + } + return media.filter((m) => m.name === status); + }; + // console.log(media); + return ( + <> + + My Lists + + +
    +
    +
    + user avatar + {user.bannerImage ? ( + image + ) : ( +
    + )} +

    {user.name}

    +
    +
    +
    + Created At : + +
    + {sessions && user.name === sessions?.user.name ? ( + + + + + Edit Profile + + ) : null} +
    +
    +
    + {user.about ? ( +
    + ) : ( + "No description created." + )} +
    +
    + +
    +
    +

    + {user.statistics.anime.episodesWatched} +

    +

    Total Episodes

    +
    +
    +

    + {user.statistics.anime.count} +

    +

    Total Anime

    +
    + {time?.days ? ( +
    +

    {time.days}

    +

    Days Watched

    +
    + ) : ( +
    +

    {time.hours}

    +

    hours

    +
    + )} +
    + {media.length !== 0 && ( +
    +
    +
    +

    Lists Filter

    + + + +
    +
    setVisible(!visible)} + > + + + +
    +
    +
      +
    • setListFilter("all")} + className={`p-2 cursor-pointer hover:text-action ${ + listFilter === "all" && "bg-secondary text-action" + }`} + > +

      + Show All +

      +
    • + {media.map((item) => ( +
    • setListFilter(item.name)} + className={`cursor-pointer hover:text-action flex gap-2 p-2 duration-200 ${ + item.name === listFilter && "bg-secondary text-action" + }`} + > +

      {item.name}

      +
      + ({item.entries.length}) +
      +
    • + ))} +
    +
    + )} +
    + +
    + {media.length !== 0 ? ( + filterMedia(listFilter).map((item, index) => ( +
    +

    {item.name}

    + + + + + + + + + + {item.entries.map((item, index) => ( + + + + + + ))} + +
    + Title + ScoreProgress
    +
    + {item.media.status === "RELEASING" ? ( + + ) : item.media.status === "NOT_YET_RELEASED" ? ( + + ) : ( + + )} + Cover Image +
    + {item.media.id} +
    + + {item.media.title.romaji} + +
    +
    + {item.score === 0 ? null : item.score} + + {item.progress === item.media.episodes + ? item.progress + : item.media.episodes === null + ? item.progress + : `${item.progress}/${item.media.episodes}`} +
    +
    + )) + ) : ( +
    + {user.name === sessions?.user.name ? ( +

    + Oops!

    Looks like you haven't watch anything yet. +

    + ) : ( +

    + Oops!

    It looks like this user haven't watch anything + yet. +

    + )} + + + + + Start Watching + +
    + )} +
    +
    + + ); +} + +export async function getServerSideProps(context) { + const session = await getServerSession(context.req, context.res, authOptions); + const query = context.query; + + const res = await fetch(`${baseUrl}/api/get-media`, { + method: "POST", + body: JSON.stringify({ + username: query.user, + }), + headers: { + "Content-Type": "application/json", + }, + }); + + const get = await res.json(); + const sectionOrder = get?.user.mediaListOptions.animeList.sectionOrder; + + if (!sectionOrder) { + return { + notFound: true, + }; + } + + const prog = get.lists; + + function getIndex(status) { + const index = sectionOrder.indexOf(status); + return index === -1 ? sectionOrder.length : index; + } + + prog.sort((a, b) => getIndex(a.name) - getIndex(b.name)); + + const user = get.user; + + const time = convertMinutesToDays(user.statistics.anime.minutesWatched); + + return { + props: { + media: prog, + sessions: session, + user: user, + time: time, + }, + }; +} + +function UnixTimeConverter({ unixTime }) { + const date = new Date(unixTime * 1000); // multiply by 1000 to convert to milliseconds + const formattedDate = date.toISOString().slice(0, 10); // format date to YYYY-MM-DD + + return

    {formattedDate}

    ; +} + +function convertMinutesToDays(minutes) { + const hours = minutes / 60; + const days = hours / 24; + + if (days >= 1) { + return days % 1 === 0 + ? { days: `${parseInt(days)}` } + : { days: `${days.toFixed(1)}` }; + } else { + return hours % 1 === 0 + ? { hours: `${parseInt(hours)}` } + : { hours: `${hours.toFixed(1)}` }; + } +} diff --git a/pages/search.js b/pages/search.js index e398e9e..99b12d7 100644 --- a/pages/search.js +++ b/pages/search.js @@ -62,16 +62,11 @@ const sorts = [ export default function Card() { const router = useRouter(); - // const { genres } = router.query; - // console.log(genres); const { aniAdvanceSearch } = useAniList(); const [data, setData] = useState(); const [loading, setLoading] = useState(true); - // const [selectedGenre, setSelectedGenre] = useState(null); - // const [selectedType, setSelectedType] = useState(type[0]); - // const [selectedSort, setSelectedSort] = useState(null); const { hasil } = router.query; @@ -85,7 +80,6 @@ export default function Card() { const [isVisible, setIsVisible] = useState(false); - // const [query, setQuery] = useState(hasil || null); const inputRef = useRef(null); async function advance() { @@ -107,32 +101,15 @@ export default function Card() { advance(); }, [search, type, seasonYear, season, genres, perPage, sort]); - // useEffect(() => { - // async function fetchData() { - // setLoading(true); - // try { - // const res = await fetch( - // `https://api.moopa.my.id/meta/anilist/advanced-search?${ - // query ? `query=${query}&` : "" - // }${selectedGenre ? `genres=["${selectedGenre}"]&` : ""}${ - // selectedType ? `type=${selectedType}&` : "" - // }${selectedSort ? `sort=["${selectedSort}"]` : ""}` - // ); - // const data = await res.json(); - // setData(data); - // setLoading(false); - // } catch (e) { - // console.error(e); - // } - // } - // fetchData(); - // }, [query, selectedGenre, selectedType, selectedSort]); - const handleKeyDown = async (event) => { if (event.key === "Enter") { event.preventDefault(); const inputValue = event.target.value; - setQuery(inputValue); + if (inputValue === "") { + setQuery(null); + } else { + setQuery(inputValue); + } } }; @@ -193,7 +170,7 @@ export default function Card() { className="w-[297px] h-[46px] bg-secondary rounded-[10px] flex items-center text-center" onChange={(e) => setSelectedSort(e.target.value)} > - + {sorts.map((option) => ( - {sort.map((option) => ( + + {sorts.map((option) => ( @@ -317,55 +294,16 @@ export default function Card() { {loading ? ( <> -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    + {[1, 2, 4, 5, 6, 7, 8].map((item) => ( +
    + + +
    + ))}
    ) : data && data.media.length === 0 ? ( @@ -390,7 +328,6 @@ export default function Card() { className="" >
    -

    +

    + {anime.status === "RELEASING" ? ( + + ) : anime.status === "NOT_YET_RELEASED" ? ( + + ) : null} {anime.title.userPreferred}

    diff --git a/pages/test.js b/pages/test.js deleted file mode 100644 index 0db3a17..0000000 --- a/pages/test.js +++ /dev/null @@ -1,236 +0,0 @@ -import { signIn, signOut, useSession } from "next-auth/react"; -import { useEffect, useState } from "react"; -import { useQuery } from "@apollo/client"; -import { GET_MEDIA } from "../queries"; -import StackPlayer from "../components/test/player"; -import Modal from "../components/modal"; - -import { AniData as data } from "../components/test/dataAni"; -import Image from "next/image"; -import { client } from "../lib/apolloClient"; -import Link from "next/link"; -import { useAniList } from "../lib/useAnilist"; - -export default function AniTest() { - const { data: session, status } = useSession(); - const { media, aniAdvanceSearch, markComplete } = useAniList(session); - const [advanceSearch, setAdvanceSearch] = useState(); - - const [search, setSearch] = useState(); - const [type, setType] = useState("ANIME"); - const [seasonYear, setSeasonYear] = useState(); - const [season, setSeason] = useState(); - const [genres, setGenres] = useState(); - const [perPage, setPerPage] = useState(25); - const [sort, setSort] = useState(["POPULARITY_DESC"]); - - // async function handleUpdateMediaEntry(entryId, status, progress, score) { - // try { - // const updatedEntry = await updateMediaEntry( - // entryId, - // status, - // progress, - // score - // ); - // console.log(updatedEntry); - // } catch (error) { - // console.error(error); - // } - // } - - // const userId = session?.user?.id; - // const MediaList = ({ userId }) => { - // const { data, loading, error } = useQuery(GET_MEDIA, { - // variables: { page: 1, userId, type: "ANIME", status: "COMPLETED" }, - // }); - - // if (loading) return

    Loading...

    ; - // if (error) return

    Error :(

    ; - - // const { mediaList } = data.Page; - // console.log(mediaList); - // }; - - // const [open, setOpen] = useState(false); - - async function markAsComplete(id) { - const response = await markComplete(id); - console.log(response); - } - - async function advance() { - const data = await aniAdvanceSearch( - search, - type, - seasonYear, - season, - genres, - perPage, - sort - ); - setAdvanceSearch(data); - } - - useEffect(() => { - advance(); - }, [search, type, seasonYear, season, genres, perPage, sort]); - - if (status === "loading") { - return
    Loading...
    ; - } - - const astatus = "COMPLETED"; - - // const { data } = aniAdvanceSearch({ - // search: "naruto", - // }); - - // console.log(advanceSearch); - - return ( - //
    - // - //
    - <> - {/* - setOpen(false)}> -
    -
    - iamge -
    -
    Episode 6
    -
    test
    -
    -
    */} - {!session && ( - - )} - {session && ( -
    - - -
    - )} - {media?.length > 0 && ( -
    - {media.map((item, index) => { - return ( -
    -

    {item.name}

    -
    - {item.entries.map((items, index) => { - return ( -
    -
    -
    - image deez nuts -
    -
    -

    - {items.media.title.romaji} -

    -

    - Episodes {items.progress} - {items.media.episodes} -

    - {item.name === "Watching" && ( - - )} -
    -
    -
    - ); - })} -
    -
    - ); - })} - {/*

    Paused

    -
    - {media[1].entries.map((item, index) => { - return ( -
    -
    -
    - image deez nuts -
    -
    -

    - {item.media.title.romaji} -

    -

    - Episodes {item.progress} - {item.media.episodes} -

    -
    -
    -
    - ); - })} -
    -

    Dropped

    -
    - {media[2].entries.map((item, index) => { - return ( -
    -
    -
    - image deez nuts -
    -
    -

    - {item.media.title.romaji} -

    -

    - Episodes {item.progress} - {item.media.episodes} -

    -
    -
    -
    - ); - })} -
    */} -
    - )} - Home - - ); -} diff --git a/pages/testing.js b/pages/testing.js index 7540093..e951635 100644 --- a/pages/testing.js +++ b/pages/testing.js @@ -1,18 +1,34 @@ import { signIn, signOut, useSession } from "next-auth/react"; +import { getServerSession } from "next-auth/next"; +import { authOptions } from "./api/auth/[...nextauth]"; +const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || "http://localhost:3000"; -export default function Testing() { +export default function Testing({ sesi, data, progress, statusWatch }) { const { data: session, status } = useSession(); + // console.log(progress); async function handleUpdate() { - const lastPlayed = { - id: "apahisya", - time: 812989929, - }; - const res = await fetch("/api/watched-episode", { + // const data = ; + const res = await fetch("/api/update-user", { method: "POST", body: JSON.stringify({ - username: session?.user.name, - id: 150672, - newData: lastPlayed, + name: session?.user.name, + newData: { + recentWatch: { + id: parseInt(9280220), + title: { + romaji: "something title here", + }, + description: + "lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quod.", + coverImage: { + extraLarge: "this should be an image url", + }, + episode: { + id: "first-id-yeah", + time: 12344, + }, + }, + }, }), headers: { "Content-Type": "application/json", @@ -23,7 +39,7 @@ export default function Testing() { console.log(res.status); } - console.log(session); + console.log(statusWatch); return (
    @@ -34,3 +50,43 @@ export default function Testing() {
    ); } + +export async function getServerSideProps(context) { + const session = await getServerSession(context.req, context.res, authOptions); + + const res = await fetch(`${baseUrl}/api/get-media`, { + method: "POST", + body: JSON.stringify({ + username: session?.user.name, + }), + headers: { + "Content-Type": "application/json", + }, + }); + + const prog = await res.json(); + + const gat = prog.lists.map((item) => item.entries); + const git = gat.map((item) => item.find((item) => item.media.id === 130003)); + const gut = git.find((item) => item?.media.id === 130003); + + let progress = null; + let statusWatch = "CURRENT"; + + if (gut?.status === "COMPLETED") { + statusWatch = "REPEATING"; + } + + if (gut) { + progress = gut?.progress; + } + + return { + props: { + sesi: session, + data: gut || null, + progress: progress, + statusWatch: statusWatch, + }, + }; +} diff --git a/queries/GET_ADVANCE_SEARCH.js b/queries/GET_ADVANCE_SEARCH.js deleted file mode 100644 index e69de29..0000000 diff --git a/queries/GET_MEDIA.js b/queries/GET_MEDIA.js deleted file mode 100644 index 8c42a00..0000000 --- a/queries/GET_MEDIA.js +++ /dev/null @@ -1,26 +0,0 @@ -import { gql } from "@apollo/client"; - -export default gql` - query ($page: Int, $userId: Int, $type: MediaType, $status: MediaListStatus) { - Page(page: $page, perPage: 100) { - pageInfo { - hasNextPage - } - mediaList(type: $type, userId: $userId) { - status - score(format: POINT_100) - media { - siteUrl - id - coverImage { - large - extraLarge - } - title { - userPreferred - } - } - } - } - } -`; diff --git a/queries/index.js b/queries/index.js index 79cb903..c93e39f 100644 --- a/queries/index.js +++ b/queries/index.js @@ -1,4 +1,3 @@ import GET_CURRENT_USER from "./GET_CURRENT_USER"; -import GET_MEDIA from "./GET_MEDIA"; -export { GET_CURRENT_USER, GET_MEDIA }; +export { GET_CURRENT_USER }; diff --git a/styles/globals.css b/styles/globals.css index f4be0b0..426e3eb 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -14,7 +14,7 @@ } body { - @apply bg-[#131313] scrollbar-hide; + @apply bg-primary scrollbar-hide; } @layer components { @@ -126,3 +126,20 @@ button { height: 100%; z-index: -1; } + +.dot { + height: 8px; + width: 8px; + border-radius: 50%; + display: inline-block; +} + +.dots { + height: 10px; + width: 10px; + border-radius: 50%; + display: inline-block; + margin-right: 10px; + margin-left: 2px; + margin-bottom: 1px; +} diff --git a/tailwind.config.js b/tailwind.config.js index 44e8646..2112082 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -45,10 +45,11 @@ module.exports = { }, colors: { primary: "#141519", - secondary: "#22252E", + secondary: "#232329", action: "#FF7F57", image: "#3B3C41", txt: "#dbdcdd", + tersier: "#0c0d10", }, }, fontFamily: { @@ -75,8 +76,5 @@ module.exports = { nocompatible: true, }), require("tailwind-scrollbar-hide"), - require("vidstack/tailwind.cjs")({ - prefix: "media", // paused:... -> media-paused:... - }), ], }; -- cgit v1.2.3