home-atom 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/.vite/manifest.json +33 -33
- package/dist/client/_next/static/chunks/{app-top-nav-Dh0jEt8u.js → app-top-nav-Co7RIixU.js} +1 -1
- package/dist/client/_next/static/chunks/{index-hn3AiVww.js → index-BUxxgh38.js} +3 -3
- package/dist/client/_next/static/chunks/{layout-segment-context-DRM8YCgm.js → layout-segment-context-D_cL7vkY.js} +1 -1
- package/dist/client/_next/static/chunks/manage-profiles-modal-CWi3qgd4.js +1 -0
- package/dist/client/_next/static/chunks/netflix-browser-BrXQctI5.js +2 -0
- package/dist/client/_next/static/chunks/playback-activity-66FeikYZ.js +1 -0
- package/dist/client/_next/static/chunks/playback-activity-track-switcher-BzvHiv7c.js +1 -0
- package/dist/client/_next/static/chunks/{step-forward-CV8I5pPb.js → provider-registry-CWHfJn3B.js} +1 -1
- package/dist/client/_next/static/chunks/spotify-app-CJimeMR0.js +1 -0
- package/dist/client/_next/static/chunks/storefront-CCeanBPs.js +1 -0
- package/dist/client/_next/static/css/index.8o3Y-jts.css +1 -0
- package/dist/client/_next/static/css/layout.D2NsWbhP.css +1 -0
- package/dist/client/_next/static/css/layout.D4D5fsiD.css +1 -0
- package/dist/client/_next/static/css/manage-profiles-modal.BOKESpxI.css +1 -0
- package/dist/client/vinext-client-entry-manifest.json +1 -1
- package/dist/server/BUILD_ID +1 -1
- package/dist/server/__vite_rsc_assets_manifest.js +35 -35
- package/dist/server/_next/static/{app-page-cache-DcrtN14Y.js → app-page-cache-CQaSjBaF.js} +1 -1
- package/dist/server/_next/static/{app-page-cache-render-DoCquoNb.js → app-page-cache-render-Dty3aMiv.js} +1 -1
- package/dist/server/_next/static/{app-route-handler-dispatch-Be2YIqVp.js → app-route-handler-dispatch-DCSrhGNV.js} +1 -1
- package/dist/server/_next/static/{cache-headers-BQ-QuzWN.js → cache-headers-lY59goLh.js} +1 -1
- package/dist/server/_next/static/css/index.8o3Y-jts.css +1 -0
- package/dist/server/_next/static/css/layout.D2NsWbhP.css +1 -0
- package/dist/server/_next/static/css/layout.D4D5fsiD.css +1 -0
- package/dist/server/_next/static/database-D79CeUrn.js +161 -0
- package/dist/server/_next/static/{db-BE1J0NNS.js → db-x8J3Vuoa.js} +1 -1
- package/dist/server/_next/static/{downloader-DgnjNL5T.js → downloader-0G-gq1D-.js} +3 -3
- package/dist/server/_next/static/episode-sync-Ct5CeY25.js +1 -0
- package/dist/server/_next/static/{isr-decision-D1zHgPSI.js → isr-decision-BOA4L6nr.js} +1 -1
- package/dist/server/_next/static/netflix-page-Cpp2PgD1.js +1 -0
- package/dist/server/_next/static/{page-Cs-erYTy.js → page-BvzzZVuW.js} +1 -1
- package/dist/server/_next/static/{page-DlBGATQp.js → page-C27wjUYW.js} +1 -1
- package/dist/server/_next/static/{page-DlRXyzSQ.js → page-Rnpx_OjW.js} +1 -1
- package/dist/server/_next/static/{providers-B3YELr_F.js → providers-DwLUa_U_.js} +13 -13
- package/dist/server/_next/static/{providers-CMBIwNGs.js → providers-_uOQh6hB.js} +1 -1
- package/dist/server/_next/static/{request-profile-B1yGQ0l6.js → request-profile-ClcH0i0T.js} +1 -1
- package/dist/server/_next/static/route-4xkmbpc4.js +1 -0
- package/dist/server/_next/static/{route-CeVsDcbj2.js → route-B0L_rsrg2.js} +1 -1
- package/dist/server/_next/static/{route-xtz48fti.js → route-B6q-wR2F.js} +1 -1
- package/dist/server/_next/static/{route-DXTJyFWD.js → route-B6zrlXB5.js} +1 -1
- package/dist/server/_next/static/{route-CNNiXZoM2.js → route-B99Pvusz2.js} +1 -1
- package/dist/server/_next/static/route-B9YeBtG6.js +1 -0
- package/dist/server/_next/static/route-BHbJ9hFI2.js +1 -0
- package/dist/server/_next/static/{route-mzLdjDCs2.js → route-BR3Y_0V42.js} +1 -1
- package/dist/server/_next/static/{route-Cim7D4XQ.js → route-BaGo5TEW.js} +1 -1
- package/dist/server/_next/static/{route-DslPFTAK.js → route-BczKcyvV.js} +1 -1
- package/dist/server/_next/static/{route-B0WNLJZp.js → route-BiSvZr_s.js} +1 -1
- package/dist/server/_next/static/{route-Dbs39TkC.js → route-Bj7s6WXI.js} +1 -1
- package/dist/server/_next/static/{route-vD15s2A8.js → route-CGH08Y8C.js} +1 -1
- package/dist/server/_next/static/{route-CkH7Cg-p.js → route-CJmc17Dq.js} +1 -1
- package/dist/server/_next/static/{route-C74RA7va.js → route-CLvr0Ue3.js} +1 -1
- package/dist/server/_next/static/route-CUaIuP8a.js +1 -0
- package/dist/server/_next/static/{route-BPcAdbz_.js → route-CcrNbScT.js} +1 -1
- package/dist/server/_next/static/route-CiOFTfyw2.js +1 -0
- package/dist/server/_next/static/route-Cn7l9eYT.js +1 -0
- package/dist/server/_next/static/route-CnKXQb5r2.js +1 -0
- package/dist/server/_next/static/{route-CVPPmUto.js → route-D93PQ3NI2.js} +1 -1
- package/dist/server/_next/static/{route-D_G2SOlz.js → route-D9ZD1_5T.js} +1 -1
- package/dist/server/_next/static/{route-DAyF4BHS.js → route-DWPhX9kT2.js} +1 -1
- package/dist/server/_next/static/route-DihT2xS82.js +1 -0
- package/dist/server/_next/static/route-Dn-sYYEs.js +1 -0
- package/dist/server/_next/static/route-DpzLCx1V.js +1 -0
- package/dist/server/_next/static/route-Dswz7MvP2.js +1 -0
- package/dist/server/_next/static/route-Dwk0kt8B.js +1 -0
- package/dist/server/_next/static/route-DxLQx9eD.js +1 -0
- package/dist/server/_next/static/{route-zazqen-A2.js → route-FwNLcs2r2.js} +1 -1
- package/dist/server/_next/static/route-GmbSJZjk2.js +1 -0
- package/dist/server/_next/static/route-iUxcDN2r.js +1 -0
- package/dist/server/_next/static/{route-UWQN8uYr.js → route-j61HPczh.js} +1 -1
- package/dist/server/_next/static/{route-CHJzaQu2.js → route-qJ1EJhxJ.js} +1 -1
- package/dist/server/_next/static/{route-BWk9YK7r.js → route-sNW0pw7C.js} +1 -1
- package/dist/server/_next/static/{seed-cache-oCd9Lfdw.js → seed-cache-DsYPqBld.js} +1 -1
- package/dist/server/_next/static/{server-CS40XqUP.js → server-DwVU6UyP.js} +1 -1
- package/dist/server/_next/static/storage-fxaUbjG1.js +322 -0
- package/dist/server/_next/static/streamer-DUAWx_Tm.js +2 -0
- package/dist/server/_next/static/{subtitles-DYBlMnha.js → subtitles-4c0GFlaW.js} +1 -1
- package/dist/server/_next/static/{title-progress-CQBrSxvN.js → title-progress-BTypVYBz.js} +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/prerendered-routes/404.html +2 -2
- package/dist/server/prerendered-routes/index.html +2 -2
- package/dist/server/prerendered-routes/index.rsc +2 -2
- package/dist/server/ssr/__vite_rsc_assets_manifest.js +35 -35
- package/dist/server/ssr/_next/static/css/refresh-cw.BOKESpxI.css +1 -0
- package/dist/server/ssr/_next/static/minimize-gPI5ytrc.js +1 -0
- package/dist/server/ssr/_next/static/netflix-browser-CXJEizJ6.js +2 -0
- package/dist/server/ssr/_next/static/{pin-BQre-tQY.js → pin-DiZl7z2n.js} +1 -1
- package/dist/server/ssr/_next/static/playback-activity-AIsC-eO5.js +1 -0
- package/dist/server/ssr/_next/static/refresh-cw-DNvHlOAy.js +1 -0
- package/dist/server/ssr/_next/static/spotify-app-xyDH0rho.js +1 -0
- package/dist/server/ssr/_next/static/storefront-DMeL08z3.js +1 -0
- package/dist/server/ssr/index.js +1 -1
- package/dist/server/ssr/vinext-client-assets.js +1 -1
- package/dist/server/ssr/vinext-server.json +1 -1
- package/dist/server/vinext-client-assets.js +1 -1
- package/dist/server/vinext-prerender-paths.json +1 -1
- package/dist/server/vinext-prerender.json +16 -1
- package/dist/server/vinext-server.json +1 -1
- package/package.json +4 -2
- package/dist/client/_next/static/chunks/manage-profiles-modal-Doi6QM4e.js +0 -1
- package/dist/client/_next/static/chunks/netflix-browser-L_Vb9wXK.js +0 -2
- package/dist/client/_next/static/chunks/playback-activity-Dug3BRYr.js +0 -1
- package/dist/client/_next/static/chunks/playback-activity-track-switcher-CbO6kl8K.js +0 -1
- package/dist/client/_next/static/chunks/spotify-app-f93K4FG_.js +0 -1
- package/dist/client/_next/static/chunks/storefront-C_nmcuvH.js +0 -1
- package/dist/client/_next/static/css/index.BGXy8e6j.css +0 -1
- package/dist/client/_next/static/css/layout.AKSLtSR6.css +0 -1
- package/dist/client/_next/static/css/layout.D8T68cCD.css +0 -1
- package/dist/client/_next/static/css/manage-profiles-modal.BAVyxRRR.css +0 -1
- package/dist/server/_next/static/css/index.BGXy8e6j.css +0 -1
- package/dist/server/_next/static/css/layout.AKSLtSR6.css +0 -1
- package/dist/server/_next/static/css/layout.D8T68cCD.css +0 -1
- package/dist/server/_next/static/database-BNnYfHmT.js +0 -114
- package/dist/server/_next/static/netflix-page-BRbORN1F.js +0 -1
- package/dist/server/_next/static/route-96DdgJBs.js +0 -1
- package/dist/server/_next/static/route-BBmE0xf12.js +0 -1
- package/dist/server/_next/static/route-BdG5ojMj2.js +0 -1
- package/dist/server/_next/static/route-BovNctFc.js +0 -1
- package/dist/server/_next/static/route-C2LuSjoh.js +0 -1
- package/dist/server/_next/static/route-CCUsQ7AG.js +0 -1
- package/dist/server/_next/static/route-CN6VdJwN.js +0 -1
- package/dist/server/_next/static/route-CjUCKwSj2.js +0 -1
- package/dist/server/_next/static/route-Cn40NftM.js +0 -1
- package/dist/server/_next/static/route-DWAMZHLa.js +0 -1
- package/dist/server/_next/static/route-DiT9UYUd.js +0 -1
- package/dist/server/_next/static/route-jMq6H_yh.js +0 -1
- package/dist/server/_next/static/storage-D1zF0J_t.js +0 -288
- package/dist/server/_next/static/streamer-B1PRR-dj.js +0 -2
- package/dist/server/ssr/_next/static/css/refresh-cw.BAVyxRRR.css +0 -1
- package/dist/server/ssr/_next/static/minimize-C9JLgte-.js +0 -1
- package/dist/server/ssr/_next/static/netflix-browser-CMAehdwi.js +0 -2
- package/dist/server/ssr/_next/static/playback-activity-D5TYX2Ae.js +0 -1
- package/dist/server/ssr/_next/static/refresh-cw-CWdWHjqY.js +0 -1
- package/dist/server/ssr/_next/static/spotify-app-CE-RaTjZ.js +0 -1
- package/dist/server/ssr/_next/static/storefront-C5NNzPMa.js +0 -1
- /package/dist/client/_next/static/{e1ce9af7-d770-43d6-845a-511443f19971 → 7c810a6d-59fd-41d6-b465-cf61efaea04f}/_buildManifest.js +0 -0
- /package/dist/client/_next/static/{e1ce9af7-d770-43d6-845a-511443f19971 → 7c810a6d-59fd-41d6-b465-cf61efaea04f}/_ssgManifest.js +0 -0
- /package/dist/server/_next/static/{layout-Ds3pFa6r.js → layout-D1iejeee.js} +0 -0
- /package/dist/server/_next/static/{layout-ClEWbCcj.js → layout-DpOw0OgX.js} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--netflix-red:#e50914;--netflix-red-dark:#b20710;--background:#141414;--background-deep:#050505;--surface:#181818;--surface-raised:#2f2f2f;--text:#fff;--text-muted:#b3b3b3;--text-dim:#777;--page-padding:clamp(1rem, 4vw, 3.75rem);--header-height:4.25rem;--app-top-nav-height:2.25rem;--ease-out:cubic-bezier(.2, .8, .2, 1)}*{box-sizing:border-box}html{background:var(--background);--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;scroll-behavior:smooth}body{background:var(--background);color:var(--text);-webkit-font-smoothing:antialiased;margin:0;font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;overflow-x:hidden}.visually-hidden{clip:rect(0, 0, 0, 0)!important;white-space:nowrap!important;border:0!important;width:1px!important;height:1px!important;padding:0!important;position:absolute!important;overflow:hidden!important}button,input{font:inherit}button,a{-webkit-tap-highlight-color:transparent}button{color:inherit}a{color:inherit;text-decoration:none}button:focus-visible{outline-offset:3px;outline:2px solid #fff}a:focus-visible{outline-offset:3px;outline:2px solid #fff}input:focus-visible{outline-offset:3px;outline:2px solid #fff}[role=button]:focus-visible{outline-offset:3px;outline:2px solid #fff}.site-shell{background:radial-gradient(circle at 80% 35%, #590b1014, transparent 24rem), var(--background);min-height:100vh;overflow:clip}.app-top-nav-offset{padding-top:var(--app-top-nav-height)}.top-nav{z-index:80;top:var(--app-top-nav-height);height:calc(var(--header-height) + env(safe-area-inset-top));padding:env(safe-area-inset-top) var(--page-padding) 0;background:linear-gradient(#000000db 0%,#00000073 52%,#0000 100%);justify-content:space-between;align-items:center;gap:2rem;transition:background-color .22s,box-shadow .22s;display:flex;position:fixed;left:0;right:0}.top-nav--solid{background:#141414f7;box-shadow:0 .5rem 1.75rem #0000002e}.top-nav--search{box-shadow:none;background:#0c0c0c;gap:1.5rem;padding-inline:clamp(1rem,1.65vw,1.75rem)}.top-nav--search .nav-start{gap:clamp(1.5rem,2.4vw,2.6rem)}.top-nav--search .nav-end{flex:1}.top-nav--search .nav-end>.nav-popover-wrap{display:none}.nav-start,.nav-end{align-items:center;min-width:0;display:flex}.nav-start{gap:clamp(1.5rem,2.7vw,3rem)}.nav-end{justify-content:flex-end;gap:clamp(.75rem,1.25vw,1.4rem)}.netflix-wordmark{color:var(--netflix-red);letter-spacing:-.085em;text-shadow:0 0 1px #ffffff26;transform-origin:0;font-size:clamp(1.5rem,2.25vw,2rem);font-weight:950;line-height:1;transform:scaleX(.92)}.primary-nav{align-items:center;gap:clamp(.85rem,1.35vw,1.35rem);display:flex}.primary-nav a{color:#e5e5e5;white-space:nowrap;font-size:clamp(.75rem,.9vw,.9rem);font-weight:400;transition:color .18s}.primary-nav a:hover{color:var(--text-muted)}.primary-nav a.active{color:#fff;font-weight:650}.icon-button{cursor:pointer;background:0 0;border:0;place-items:center;width:2.75rem;height:2.75rem;padding:0;display:grid}.icon-button svg{stroke-width:2px;width:1.35rem;height:1.35rem}.mobile-menu-button{display:none}.kids-link{font-size:.85rem}.search-box{width:2.75rem;height:2.35rem;transition:width .26s var(--ease-out), border-color .18s ease, background .18s ease;background:0 0;border:1px solid #0000;justify-content:flex-start;align-items:center;display:flex;overflow:hidden}.search-box--open{background:#000000d1;border-color:#ffffffd1;width:min(17rem,28vw)}.search-box .search-trigger{flex:0 0 2.75rem}.search-box input{color:#fff;background:0 0;border:0;outline:0;width:100%;min-width:0;height:100%;padding:0 .7rem 0 .15rem;font-size:.82rem}.search-box input::placeholder{color:#a7a7a7}.search-clear{color:#989898;cursor:pointer;background:#3b3b3b;border:0;border-radius:50%;flex:0 0 1.45rem;place-items:center;width:1.45rem;height:1.45rem;margin-right:.65rem;padding:0;display:grid}.search-clear:hover{color:#d0d0d0;background:#505050}.search-clear svg{stroke-width:3px;width:.92rem;height:.92rem}.top-nav--search .search-box--open{background:#181818;border-color:#5c5c5c;border-radius:999px;width:min(25rem,32vw);height:3.5rem;margin-left:auto}.top-nav--search .search-box .search-trigger{flex-basis:3rem}.top-nav--search .search-box input{padding:0 .45rem 0 0;font-size:1rem}.nav-popover-wrap,.download-button,.notification-button{position:relative}.download-badge{background:var(--netflix-red);color:#fff;border:1.5px solid #141414;border-radius:999px;place-items:center;min-width:1.05rem;height:1.05rem;padding:0 .22rem;font-size:.58rem;font-weight:800;line-height:1;display:grid;position:absolute;top:.05rem;right:0}.notification-badge{background:var(--netflix-red);color:#fff;border:1.5px solid #141414;border-radius:999px;place-items:center;min-width:1.05rem;height:1.05rem;padding:0 .22rem;font-size:.58rem;font-weight:800;line-height:1;display:grid;position:absolute;bottom:.1rem;right:.1rem}.profile-trigger{cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;gap:.6rem;min-width:2.75rem;min-height:2.75rem;padding:0;display:flex}.profile-trigger>svg{fill:#fff;width:.75rem;height:.75rem;transition:transform .18s}.profile-trigger>svg.rotate{transform:rotate(180deg)}.profile-avatar{background:linear-gradient(155deg,#ffffff47,#0000 35%),#1565c0;border-radius:.25rem;width:2rem;height:2rem;display:block;position:relative;overflow:hidden;box-shadow:inset 0 -.3rem #00000026}.profile-avatar span:first-child,.profile-avatar span:nth-child(2){background:#fff;border-radius:50%;width:.28rem;height:.36rem;position:absolute;top:.7rem}.profile-avatar span:first-child{left:.46rem}.profile-avatar span:nth-child(2){right:.46rem}.profile-avatar span:last-child{border-bottom:.16rem solid #fff;border-radius:0 0 50% 50%;height:.35rem;position:absolute;bottom:.38rem;left:.45rem;right:.45rem}.nav-popover{width:15rem;animation:popover-in .16s var(--ease-out);background:#000000f0;border:1px solid #ffffff24;position:absolute;top:calc(100% + 1.05rem);right:-.1rem;box-shadow:0 1rem 2.5rem #00000073}.popover-caret{background:#000000f0;border-top:1px solid #fff3;border-left:1px solid #fff3;width:.85rem;height:.85rem;position:absolute;top:-.48rem;right:1rem;transform:rotate(45deg)}.profile-popover{width:14rem;padding:.65rem 0}.profile-popover a,.profile-popover button{width:100%;min-height:2.5rem;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;gap:.75rem;padding:.35rem .8rem;font-size:.82rem;display:flex}.profile-popover a:hover,.profile-popover button:hover{text-decoration:underline}.profile-popover a>svg,.profile-popover button>svg{color:#b3b3b3;width:1.4rem}.profile-popover .profile-active-check{color:#46d369;width:1rem;margin-left:auto}.profile-signout{border-top:1px solid #fff3;justify-content:center;margin-top:.45rem}.mini-avatar{border-radius:.2rem;flex:none;place-items:center;width:2rem;height:2rem;font-weight:800;display:grid}.profile-option[aria-current=true]{background:#ffffff14}.mini-avatar--blue{background:#1565c0}.mini-avatar--red{background:#f05b47}.notification-popover{width:min(25rem,88vw);right:-.5rem}.sources-popover{border-radius:.35rem;width:min(24rem,92vw);padding:.8rem;right:-2.8rem}.access-popover.netflix-access-popover{--access-top:calc(100% + 1.05rem);--access-right:-2.8rem}.access-popover.netflix-access-popover .access-caret{right:3.75rem}.downloads-popover{border-radius:.35rem;width:min(25rem,100vw - 2rem);max-height:min(35rem,76vh);right:-2.8rem;overflow:hidden}.downloads-heading{background:#171717;align-items:center;gap:.75rem;padding:1rem;display:flex}.downloads-heading>span{color:#ff3943;background:#e509142b;border-radius:50%;flex:none;place-items:center;width:2.5rem;height:2.5rem;display:grid}.downloads-heading>span svg{width:1.2rem}.downloads-heading>div,.download-copy{flex-direction:column;flex:1;min-width:0;display:flex}.downloads-heading b{font-size:.95rem}.downloads-heading small{color:var(--text-muted);font-size:.72rem}.download-list{overscroll-behavior:contain;max-height:min(28rem,76vh - 4.5rem);overflow-y:auto}.download-item{background:#141414fa;border-top:1px solid #303030;grid-template-columns:6.25rem minmax(0,1fr);align-items:center;gap:.75rem;min-height:5.25rem;padding:.8rem;display:grid}.download-thumb{aspect-ratio:16/9;cursor:pointer;background-color:#292929;background-position:50%;background-size:cover;border:0;border-radius:.2rem;width:100%;padding:0;display:block;position:relative;overflow:hidden}.download-thumb:before{content:"";opacity:0;background:#0000006b;transition:opacity .16s;position:absolute;inset:0}.download-thumb-play{color:#fff;opacity:0;border:2px solid #ffffffeb;border-radius:50%;place-items:center;width:2rem;height:2rem;transition:opacity .16s,transform .16s;display:grid;position:absolute;inset:50% auto auto 50%;transform:translate(-50%,-50%)scale(.82)}.download-thumb-play svg{width:.9rem;height:.9rem}.download-thumb:hover:before,.download-thumb:hover .download-thumb-play{opacity:1}.download-thumb:focus-visible:before{opacity:1}.download-thumb:focus-visible .download-thumb-play{opacity:1}:is(.download-thumb:hover .download-thumb-play,.download-thumb:focus-visible .download-thumb-play){transform:translate(-50%,-50%)scale(1)}.download-copy>div:first-child{justify-content:space-between;align-items:center;gap:.5rem;min-width:0;display:flex}.download-copy b,.download-copy small,.download-copy em{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.download-copy b{font-size:.82rem}.download-copy small,.download-copy em{color:#b3b3b3;font-size:.7rem;line-height:1.35}.download-copy em{color:#ff777d;margin-top:.3rem;font-style:normal}.download-status-icon{color:#ddd;border-radius:50%;flex:none;place-items:center;width:1.25rem;height:1.25rem;display:grid}.download-status-icon svg{width:.95rem}.download-item--ready .download-status-icon{color:#08180d;background:#46d369}.download-item--failed .download-status-icon{color:#fff;background:#e50914}.download-progress{background:#4a4a4a;border-radius:999px;height:.22rem;margin-top:.5rem;overflow:hidden}.download-progress span{border-radius:inherit;background:var(--netflix-red);height:100%;transition:width .24s;display:block}.download-item--ready .download-progress span{background:#46d369}.download-item--failed .download-progress span{background:#ff5f66}.downloads-empty{color:#ddd;text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:.4rem;min-height:12rem;padding:2rem;display:flex}.downloads-empty>svg{color:#777;width:2rem;margin-bottom:.35rem}.downloads-empty b{font-size:.86rem}.downloads-empty small{color:var(--text-muted);font-size:.72rem}.sources-heading,.provider-list article,.download-state{align-items:center;display:flex}.sources-heading{gap:.75rem;padding:.35rem .35rem .85rem}.sources-heading>span,.add-movie-icon{color:#ff3943;background:#e509142b;border-radius:50%;place-items:center;width:2.5rem;height:2.5rem;display:grid}.sources-heading svg,.add-movie-icon svg{width:1.2rem}.sources-heading div,.provider-copy{flex-direction:column;flex:1;min-width:0;display:flex}.sources-heading b{font-size:.95rem}.sources-heading small,.provider-copy small{color:var(--text-muted);font-size:.7rem}.provider-list{border-top:1px solid #303030}.provider-list article{background:#00000003;border-bottom:1px solid #303030;gap:.55rem;min-height:4.65rem;padding:.65rem .35rem .65rem 0;transition:background .12s,box-shadow .12s;position:relative}.provider-row--dragging{z-index:1;box-shadow:0 0 0 1px #ffffff38;background:#252525!important}.provider-drag-handle{color:#7d7d7d;cursor:grab;touch-action:none;background:0 0;border:0;flex:none;place-items:center;width:1.55rem;height:2.7rem;padding:0;display:grid}:is(.provider-drag-handle:hover,.provider-drag-handle:focus-visible,.provider-row--dragging .provider-drag-handle){color:#fff}.provider-drag-handle:focus-visible{outline-offset:-2px;border-radius:.2rem;outline:2px solid #fff}.provider-row--dragging .provider-drag-handle{cursor:grabbing}.provider-drag-handle svg{pointer-events:none;width:1.15rem}.provider-mark{background:linear-gradient(145deg,#e50914,#76070d);border-radius:.3rem;flex:none;place-items:center;width:2rem;height:2rem;font-weight:850;display:grid}.provider-copy b{font-size:.82rem}.provider-copy a{color:#ddd;text-overflow:ellipsis;white-space:nowrap;width:max-content;max-width:100%;font-size:.73rem;overflow:hidden}.provider-copy a:hover{text-decoration:underline}.provider-copy small{text-overflow:ellipsis;white-space:nowrap;margin-top:.12rem;overflow:hidden}.provider-sync{color:#fff;cursor:pointer;background:#252525;border:1px solid #525252;border-radius:50%;flex:none;place-items:center;width:2.2rem;height:2.2rem;padding:0;display:grid}.provider-sync:hover:not(:disabled){background:#333;border-color:#fff}.provider-sync:disabled{color:#999;cursor:wait}.provider-sync svg{width:1rem}.source-message{color:#b8b8b8;margin:.7rem .35rem 0;font-size:.72rem;line-height:1.4}.add-movie-button{color:#111;cursor:pointer;background:#fff;border:0;border-radius:.25rem;justify-content:center;align-items:center;gap:.5rem;width:100%;margin-top:.75rem;padding:.72rem .8rem;font-weight:750;display:flex}.add-movie-button:hover{background:#dcdcdc}.add-movie-button svg{width:1rem}.spin{animation:.9s linear infinite source-spin}.notification-popover article,.notification-item{width:100%;min-height:6rem;color:inherit;cursor:pointer;font:inherit;text-align:left;background:#141414f5;border:0;border-bottom:1px solid #ffffff1f;grid-template-columns:6.5rem 1fr;gap:.75rem;padding:.75rem;display:grid}.notification-popover article:hover,.notification-item:hover{background:#252525}.notification-item.is-unread{border-left:.2rem solid var(--netflix-red)}.notification-empty{color:var(--text-muted);text-align:center;background:#141414f5;margin:0;padding:1.4rem 1rem;font-size:.82rem}.notification-popover article>span:last-child,.notification-item>span:last-child{flex-direction:column;justify-content:center;min-width:0;display:flex}.notification-popover b{font-size:.85rem}.notification-thumb:empty{background-color:#2b2b2b;min-height:4.4rem}.notification-popover small,.notification-popover em{color:var(--text-muted);font-size:.76rem;font-style:normal;line-height:1.4}.notification-popover em{color:var(--text-dim);margin-top:.35rem}.notification-thumb{background-position:50%;background-size:cover;border-radius:.2rem;width:100%;display:block}.notification-thumb--one{background-image:linear-gradient(140deg,#0000,#000000b8),url(https://images.unsplash.com/photo-1485846234645-a62644f84728?auto=format&fit=crop&w=500&q=75)}.notification-thumb--two{background-image:linear-gradient(140deg,#0000,#000000b8),url(https://images.unsplash.com/photo-1489599849927-2ee91cede3ba?auto=format&fit=crop&w=500&q=75)}.hero{--hero-image:none;--hero-accent:#b20710;isolation:isolate;background:#090909;height:clamp(39rem,82vh,54rem);min-height:39rem;position:relative;overflow:hidden}.hero-backdrop{z-index:-3;background-image:var(--hero-image);background-position:62% 22%;background-size:cover;animation:18s ease-in-out infinite alternate hero-breathe;position:absolute;inset:0;transform:scale(1.015)}.hero--paused .hero-backdrop{animation-play-state:paused}.hero-vignette{z-index:-2;background:linear-gradient(90deg, #000000e8 0%, #000000b8 25%, #0000002e 56%, transparent 72%), linear-gradient(0deg, var(--background) 0%, #141414e0 5%, transparent 35%), linear-gradient(180deg, #00000073, transparent 20%);position:absolute;inset:0}.hero:after{z-index:-1;background:var(--hero-accent);content:"";filter:blur(10rem);opacity:.09;border-radius:50%;width:42rem;height:42rem;position:absolute;bottom:-19rem;right:-16rem}.hero-content{z-index:2;top:clamp(8.5rem,18vh,12rem);left:var(--page-padding);width:min(38rem,43vw);position:absolute}.netflix-series{color:#ffffffe0;letter-spacing:.34em;align-items:center;gap:.5rem;margin:0 0 .8rem;font-size:.86rem;font-weight:750;display:flex}.netflix-series span{color:var(--netflix-red);letter-spacing:-.1em;font-size:1.8rem;font-weight:950}.hero-content h1{letter-spacing:-.06em;text-wrap:balance;text-shadow:0 .15rem 1.2rem #0000006b;max-width:9ch;margin:0 0 1rem;font-family:Georgia,Times New Roman,serif;font-size:clamp(3rem,6vw,6rem);font-style:italic;font-weight:800;line-height:.86}.hero-title-logo{object-fit:contain;object-position:left bottom;filter:drop-shadow(0 .15rem .9rem #00000057);width:min(33rem,90%);max-height:11.5rem;margin:0 0 1rem;display:block}.hero-rank{align-items:center;gap:.75rem;margin:1.2rem 0 .8rem;font-size:clamp(1rem,1.35vw,1.35rem);font-weight:750;display:flex}.hero-rank span{background:var(--netflix-red);letter-spacing:-.05em;text-align:center;border-radius:.15rem;place-items:center;width:2.25rem;height:2.25rem;font-size:.68rem;font-weight:900;line-height:.7;display:grid}.hero-description{color:#fffffff0;text-shadow:0 .1rem .6rem #000000b3;-webkit-line-clamp:3;-webkit-box-orient:vertical;max-width:36rem;margin:0 0 1.55rem;font-size:clamp(.95rem,1.32vw,1.25rem);font-weight:420;line-height:1.42;display:-webkit-box;overflow:hidden}.hero-actions,.modal-actions{align-items:center;gap:.75rem;display:flex}.button{cursor:pointer;border:0;border-radius:.3rem;justify-content:center;align-items:center;gap:.65rem;min-width:7.25rem;min-height:3rem;padding:.6rem 1.6rem;font-size:clamp(.92rem,1.15vw,1.08rem);font-weight:750;transition:background .16s,transform .16s;display:inline-flex}.button:active{transform:scale(.97)}.button svg{stroke-width:2.7px;width:1.65rem;height:1.65rem}.button--primary{color:#000;background:#fff}.button--primary:hover{background:#ffffffc7}.button--secondary{color:#fff;background:#6d6d6ec7}.button--secondary:hover{background:#6d6d6e8c}.hero-side-controls{z-index:3;align-items:center;gap:.9rem;display:flex;position:absolute;bottom:clamp(10rem,20vh,14rem);right:0}.round-button{cursor:pointer;background:#18181857;border:1.5px solid #ffffffc7;border-radius:50%;place-items:center;width:2.75rem;height:2.75rem;padding:0;transition:background .16s,border-color .16s,transform .16s;display:grid}.round-button:hover{background:#ffffff24;border-color:#fff;transform:scale(1.06)}.round-button.is-active,.card-controls button.is-active{color:#46d369;border-color:#46d369}.round-button.track-button.is-active{border-color:var(--netflix-red);color:var(--netflix-red)}.round-button svg{width:1.25rem;height:1.25rem}.maturity-badge{background:#3333339e;border-left:.2rem solid #fff;min-width:7rem;padding:.55rem 2.8rem .55rem .95rem;font-size:1rem}.hero-scroll-cue{z-index:4;color:#ffffff9e;animation:2s ease-in-out infinite scroll-cue;position:absolute;bottom:7rem;left:50%}.catalog{z-index:10;margin-top:clamp(-9rem,-11vw,-6rem);padding-bottom:1rem;scroll-margin-top:5rem;position:relative}.my-list-anchor{scroll-margin-top:5rem}.my-list-empty{min-height:10rem;margin:0 var(--page-padding) 3.5rem;background:linear-gradient(115deg,#ffffff0f,#0000 55%),#191919;border:1px solid #ffffff1f;border-radius:.35rem;grid-template-columns:auto 1fr;align-items:center;gap:1.2rem;padding:1.5rem;display:none}.my-list-anchor:target .my-list-empty{display:grid}.my-list-empty>span{border:1.5px solid #777;border-radius:50%;place-items:center;width:3rem;height:3rem;display:grid}.my-list-empty h2{margin:0 0 .3rem;font-size:clamp(1rem,1.45vw,1.35rem)}.my-list-empty p{color:var(--text-muted);margin:0;font-size:.88rem}.title-row{margin-bottom:clamp(-4rem,-3.6vw,-2.5rem);scroll-margin-top:6rem;position:relative}.row-heading{z-index:6;height:2rem;padding:0 var(--page-padding);align-items:center;gap:.7rem;display:flex;position:relative}.row-heading h2{letter-spacing:-.025em;margin:0;font-size:clamp(1.05rem,1.55vw,1.55rem);font-weight:720}.explore-link{color:#54b9c5;opacity:0;white-space:nowrap;cursor:pointer;background:0 0;border:0;align-items:center;gap:.15rem;max-width:0;padding:0;font-size:.75rem;font-weight:700;transition:max-width .24s,opacity .2s;display:flex;overflow:hidden}.title-row:hover .explore-link{opacity:1;max-width:7rem}.explore-link:focus-visible{opacity:1;max-width:7rem}.explore-link svg{width:1rem}.rail-shell{z-index:5;position:relative}.title-rail{padding:2.3rem var(--page-padding) 8rem;overscroll-behavior-inline:contain;grid-auto-columns:calc((100vw - (2 * var(--page-padding)) - 2.5rem) / 6);scroll-padding-inline:var(--page-padding);scroll-snap-type:x proximity;scrollbar-width:none;grid-auto-flow:column;gap:.5rem;display:grid;overflow-x:auto}.title-rail:has(.card-episode-strip){padding-bottom:11rem}.title-rail::-webkit-scrollbar{display:none}.title-card{z-index:1;aspect-ratio:16/9;scroll-snap-align:start;transform-origin:50%;min-width:0;transition:transform .22s var(--ease-out), z-index 0s .22s;cursor:pointer;position:relative}.title-card:first-child{transform-origin:0}.title-card:last-child{transform-origin:100%}.card-visual{background:linear-gradient(125deg,#262626,#101010);border-radius:.25rem;width:100%;height:100%;position:relative;overflow:hidden;box-shadow:0 .15rem .35rem #00000047}.card-visual img{object-fit:cover;width:100%;height:100%;transition:transform 1.2s var(--ease-out);display:block}.card-image-shade{opacity:.3;background:linear-gradient(#0000 60%,#0000009e);transition:opacity .2s;position:absolute;inset:0}.card-title-fallback{opacity:0;text-overflow:ellipsis;text-shadow:0 .1rem .35rem #000;white-space:nowrap;font-size:clamp(.65rem,.82vw,.82rem);font-weight:750;transition:opacity .18s;position:absolute;bottom:.55rem;left:.6rem;right:.6rem;overflow:hidden}.card-visual img:not([src]),.card-visual img[src=""]{opacity:0}.card-visual:has(img[src=""]) .card-title-fallback{opacity:1}.card-n{color:var(--netflix-red);letter-spacing:-.08em;text-shadow:0 1px .3rem #000c;font-size:1.05rem;font-weight:950;line-height:.8;position:absolute;top:.35rem;left:.45rem}.card-n small{color:#fff;letter-spacing:.19em;margin:.16rem 0 0 -.05rem;font-size:.27rem;display:block}.new-season{background:var(--netflix-red);text-transform:uppercase;border-radius:.12rem;padding:.15rem .35rem;font-size:.54rem;font-weight:800;position:absolute;bottom:.4rem;right:.45rem}.new-episode-label{z-index:2;color:#fff;white-space:nowrap;background:#000000d1;border-radius:.22rem;align-items:baseline;gap:.35rem;width:max-content;max-width:calc(100% - .9rem);padding:.38rem .55rem;font-size:clamp(.68rem,.9vw,.9rem);line-height:1.2;display:flex;position:absolute;bottom:.4rem;left:.45rem;right:.45rem;overflow:hidden;box-shadow:0 .08rem .3rem #00000080}.new-episode-label strong{color:#fff;flex:none;font-weight:850}.new-episode-label small{color:#ddd;min-width:0;font-size:inherit;text-overflow:ellipsis;overflow:hidden}.progress-track{z-index:4;background:#808080b8;height:.22rem;position:absolute;bottom:.42rem;left:10%;right:10%}.progress-track span{background:var(--netflix-red);height:100%;display:block}.resume-checkpoint{z-index:4;color:#fff;letter-spacing:.02em;text-align:right;text-overflow:ellipsis;text-shadow:0 .08rem .3rem #000;white-space:nowrap;font-size:clamp(.48rem,.65vw,.66rem);font-weight:750;position:absolute;bottom:.78rem;left:10%;right:10%;overflow:hidden}.card-details{z-index:0;background:var(--surface);opacity:0;pointer-events:none;min-height:6.7rem;transition:opacity .15s ease, transform .18s var(--ease-out);border-radius:0 0 .25rem .25rem;padding:.65rem;position:absolute;top:calc(100% - .2rem);left:0;right:0;transform:translateY(-.5rem);box-shadow:0 .65rem 1.3rem #000000a6}.card-controls{align-items:center;gap:.35rem;display:flex}.card-controls button{cursor:pointer;background:#242424;border:1.5px solid #8f8f8f;border-radius:50%;place-items:center;width:1.8rem;height:1.8rem;padding:0;display:grid}.card-controls button:hover{border-color:#fff}.card-controls button:first-child{color:#000;background:#fff;border-color:#fff}.card-controls svg{stroke-width:2.4px;width:.9rem;height:.9rem}.card-controls .card-more-button{margin-left:auto}.card-meta{white-space:nowrap;align-items:center;gap:.45rem;margin-top:.55rem;font-size:clamp(.55rem,.68vw,.7rem);display:flex}.card-meta strong,.modal-meta strong{color:#46d369}.mini-maturity{border:1px solid #7b7b7b;padding:.08rem .25rem}.quality-badge{color:#ddd;border:1px solid #777;border-radius:.12rem;padding:.04rem .2rem;font-size:.58rem}.card-details p{text-overflow:ellipsis;white-space:nowrap;margin:.5rem 0 0;font-size:clamp(.52rem,.63vw,.65rem);overflow:hidden}.title-card:has(.card-episode-strip) .card-details{min-height:9.4rem}.card-episode-strip{overscroll-behavior-inline:contain;scrollbar-width:none;grid-auto-columns:calc(33.3333% - .186667rem);grid-auto-flow:column;gap:.28rem;height:2.45rem;margin-top:.55rem;display:grid;overflow-x:auto}.card-episode-strip::-webkit-scrollbar{display:none}.card-episode-strip button{cursor:pointer;background:#333;border:0;border-radius:.15rem;min-width:0;padding:0;position:relative;overflow:hidden}.card-episode-strip button:hover{outline:1px solid #fff}.card-episode-strip img{object-fit:cover;width:100%;height:100%;display:block}.card-episode-strip button>span{color:#fff;background:#000000d1;border-radius:999px;place-items:center;min-width:.85rem;height:.85rem;padding:0 .15rem;font-size:.5rem;font-weight:800;display:grid;position:absolute;bottom:.12rem;right:.18rem}.rail-control{z-index:25;width:var(--page-padding);opacity:0;cursor:pointer;background:#14141499;border:0;place-items:center;min-width:2.5rem;padding:0;transition:opacity .18s,background .18s;display:grid;position:absolute;top:2.3rem;bottom:8rem}.rail-control:hover{background:#141414d1}.rail-control svg{stroke-width:2.3px;width:clamp(1.5rem,2.5vw,2.6rem);height:clamp(1.5rem,2.5vw,2.6rem);transition:transform .18s}.rail-control:hover svg{transform:scale(1.24)}.rail-control--left{left:0}.rail-control--right{right:0}.rail-shell:hover .rail-control{opacity:1}.rail-control:focus-visible{opacity:1}.title-card--ranked{aspect-ratio:auto;grid-template-columns:42% 58%;display:grid}.title-card--ranked .rank-number{z-index:0;color:#080808;letter-spacing:-.09em;text-align:right;-webkit-text-stroke:clamp(1px, .12vw, 2px) #777;align-self:stretch;font-family:Impact,Haettenschweiler,Arial Narrow Bold,sans-serif;font-size:clamp(6rem,10vw,11rem);font-weight:950;line-height:.83;transform:translate(.08em)}.title-card--ranked .card-visual{z-index:1;aspect-ratio:2/3;align-self:center;height:auto}.title-card--ranked .card-details{left:38%}.title-row--ranked .title-rail{grid-auto-columns:calc((100vw - (2 * var(--page-padding)) - 2rem) / 5)}.title-row--originals .title-rail{grid-auto-columns:calc((100vw - (2 * var(--page-padding)) - 2.5rem) / 6.25)}.title-card--portrait{aspect-ratio:2/3}.title-card--portrait .card-visual{box-shadow:0 .25rem .8rem #00000080}@media (hover:hover) and (pointer:fine) and (min-width:701px){.rail-shell:has(.title-card:hover,.title-card:focus-within,.title-card:focus-visible){z-index:30}:is(.title-card:hover,.title-card:focus-within,.title-card:focus-visible){z-index:20;transition-delay:.28s,0s;transform:scale(1.2)}:is(.title-card:hover .card-details,.title-card:focus-within .card-details,.title-card:focus-visible .card-details){z-index:2;opacity:1;pointer-events:auto;transition-delay:.28s;transform:translateY(0)}:is(.title-card:hover .card-visual,.title-card:focus-within .card-visual,.title-card:focus-visible .card-visual){border-radius:.25rem .25rem 0 0}:is(.title-card:hover .card-visual img,.title-card:focus-within .card-visual img,.title-card:focus-visible .card-visual img){transform:scale(1.035)}.title-card:hover .card-image-shade,.title-card:focus-within .card-image-shade{opacity:.55}}.netflix-search-page{width:100%;min-height:100svh;padding:calc(var(--header-height) + var(--app-top-nav-height) + 2.25rem) clamp(1rem, 1.65vw, 1.75rem) 3rem;background:#121212;margin:0;animation:.22s search-in;overflow-x:hidden}.netflix-search-notice{color:#f2b8b5;background:#89181c47;border-radius:.35rem;margin:-1.2rem 0 .85rem;padding:.6rem .8rem;font-size:.82rem}.netflix-search-grid{grid-template-columns:repeat(auto-fill,minmax(min(17rem,100%),1fr));gap:1.25rem .5rem;display:grid}.netflix-search-card{cursor:pointer;text-align:left;min-width:0;transition:transform .18s var(--ease-out);background:0 0;border:0;gap:.55rem;padding:0;display:grid}.netflix-search-card:hover{z-index:2;transform:scale(1.025)}.netflix-search-card:disabled{cursor:wait;opacity:.72}.netflix-search-card:disabled:hover{transform:none}.netflix-search-artwork{aspect-ratio:16/9;background:#252525;border-radius:.65rem;display:block;position:relative;overflow:hidden}.netflix-search-artwork img{object-fit:cover;width:100%;height:100%;display:block}.netflix-search-title{color:#f5f5f5;-webkit-line-clamp:2;-webkit-box-orient:vertical;min-width:0;min-height:2.4em;padding-inline:.1rem;font-size:.92rem;font-weight:600;line-height:1.3;display:-webkit-box;overflow:hidden}.netflix-search-loader{z-index:2;color:#fff;background:#000000b8;border-radius:50%;width:2rem;height:2rem;margin:-1rem 0 0 -1rem;padding:.35rem;position:absolute;top:50%;left:50%}.empty-search{min-height:55vh;color:var(--text-muted);text-align:center;place-content:center;display:grid}.empty-search svg{color:#555;width:3.5rem;height:3.5rem;margin:0 auto 1rem}.empty-search h2{color:#fff;margin:0 0 .6rem}.empty-search p{margin:0}.modal-backdrop{z-index:100;-webkit-backdrop-filter:blur(.25rem);backdrop-filter:blur(.25rem);background:#000000c2;place-items:start center;padding:2.5rem 1rem;animation:.18s modal-backdrop-in;display:grid;position:fixed;inset:0;overflow-y:auto}.details-modal{background:var(--surface);width:min(53rem,94vw);animation:modal-in .22s var(--ease-out);border-radius:.45rem;position:relative;overflow:hidden;box-shadow:0 1.5rem 5rem #000000bf}.modal-close{z-index:5;cursor:pointer;background:#181818;border:0;border-radius:50%;place-items:center;width:2.25rem;height:2.25rem;padding:0;display:grid;position:absolute;top:1rem;right:1rem}.modal-close svg{width:1.35rem}.modal-hero{--modal-image:none;background-image:linear-gradient(0deg, var(--surface) 0%, transparent 42%), linear-gradient(90deg, #0000009e, transparent 58%), var(--modal-image);background-position:50%;background-size:cover;height:min(31rem,56vw);min-height:20rem;position:relative}.modal-hero-content{position:absolute;bottom:2.25rem;left:3.2rem;right:3.2rem}.modal-hero-content h2{letter-spacing:-.06em;text-shadow:0 .15rem .8rem #000;max-width:11ch;margin:0 0 1.2rem;font-family:Georgia,Times New Roman,serif;font-size:clamp(2.4rem,5vw,4.5rem);font-style:italic;line-height:.95}.modal-actions .button{min-height:2.75rem}.modal-actions .round-button{background:#2a2a2abf}.modal-body{grid-template-columns:minmax(0,1.65fr) minmax(12rem,.85fr);gap:2.5rem;padding:.6rem 3.2rem 2.5rem;display:grid}.modal-meta{flex-wrap:wrap;align-items:center;gap:.65rem;margin-bottom:.75rem;font-size:.92rem;display:flex}.modal-maturity{border:1px solid #777;margin-bottom:.7rem;padding:.15rem .45rem;font-size:.78rem;display:inline-block}.modal-synopsis{margin:0;font-size:1rem;line-height:1.55}.modal-facts{color:var(--text-muted);margin:0;font-size:.82rem;line-height:1.55}.modal-facts div{margin-bottom:.75rem}.modal-facts dt,.modal-facts dd{margin:0;display:inline}.modal-facts dt{color:#777}.modal-facts dd{color:#ddd}.episode-panel{border-top:1px solid #333;padding:1.5rem 3.2rem 3rem}.episode-panel-header{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.75rem;margin-bottom:1.25rem;display:flex}.episode-panel h3{margin:0;font-size:1.5rem}.episode-panel-tools{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:.85rem;display:flex}.episode-panel-tools>span{font-weight:700}.episode-sort-button{color:#fff;cursor:pointer;background:#2a2a2abf;border:1px solid #4a4a4a;border-radius:999px;align-items:center;gap:.4rem;padding:.4rem .75rem;font-size:.82rem;font-weight:600;transition:background .16s,border-color .16s;display:inline-flex}.episode-sort-button:hover{background:#3a3a3a;border-color:#6d6d6d}.episode-sort-button svg{width:1.05rem;height:1.05rem}.episode-card-list{overscroll-behavior:contain;scrollbar-color:#565656 transparent;scrollbar-width:thin;border-radius:.25rem;max-height:min(34rem,58vh);display:grid;overflow-y:auto}.episode-card-list::-webkit-scrollbar{width:.4rem}.episode-card-list::-webkit-scrollbar-track{background:0 0}.episode-card-list::-webkit-scrollbar-thumb{background:#565656;border-radius:999px}.episode-card{text-align:left;cursor:pointer;background:#2a2a2a;border:0;border-bottom:1px solid #404040;border-radius:0;grid-template-columns:2rem 9rem 1fr;align-items:center;gap:1rem;width:100%;padding:1rem;display:grid}.episode-card:first-child{border-radius:.25rem .25rem 0 0}.episode-card:last-child{border-radius:0 0 .25rem .25rem}.episode-card:hover{background:#363636}.episode-number{color:var(--text-muted);text-align:center;font-size:1.4rem}.episode-image{aspect-ratio:16/9;background-position:50%;background-size:cover;border-radius:.2rem;place-items:center;display:grid}.episode-image svg{opacity:0;background:#00000073;border:1px solid #fff;border-radius:50%;width:2rem;height:2rem;padding:.45rem;transition:opacity .16s}.episode-card:hover .episode-image svg{opacity:1}.episode-copy{grid-template-columns:1fr auto;gap:.35rem 1rem;display:grid}.episode-copy small{color:#ddd}.episode-copy em{color:var(--text-muted);grid-column:1/-1;font-size:.78rem;font-style:normal}.add-movie-backdrop{z-index:140}.manage-profiles-backdrop{z-index:150}.manage-profiles-modal{background:radial-gradient(circle at 90% 0,#e5091429,#0000 18rem),#181818;border:1px solid #3f3f3f;border-radius:.65rem;width:min(45rem,100vw - 2rem);padding:2.5rem;position:relative;box-shadow:0 1.5rem 5rem #000000b8}.manage-profiles-modal>header{align-items:center;gap:.9rem;margin-bottom:1.5rem;display:flex}.manage-profiles-icon{background:var(--netflix-red);border-radius:.45rem;flex:none;place-items:center;width:2.8rem;height:2.8rem;display:grid}.manage-profiles-icon svg{width:1.35rem}.manage-profiles-modal h2{margin:0 0 .25rem;font-size:1.75rem}.manage-profiles-modal header p{color:#aaa;margin:0;font-size:.82rem}.profile-manager-list{border:1px solid #3b3b3b;border-radius:.4rem;display:grid;overflow:hidden}.profile-manager-row{background:#232323;border-bottom:1px solid #383838;grid-template-columns:auto 1fr auto auto;align-items:center;gap:.75rem;min-height:4.8rem;padding:.8rem;display:grid}.profile-manager-row:last-child{border-bottom:0}.manager-avatar{border-radius:.35rem;flex:none;place-items:center;width:3rem;height:3rem;font-size:1.2rem;font-weight:850;display:grid;box-shadow:inset 0 -.35rem #00000021}.profile-manager-name{flex-direction:column;gap:.18rem;min-width:0;display:flex}.profile-manager-name b{text-overflow:ellipsis;overflow:hidden}.profile-manager-name small{color:#999;font-size:.7rem}.manager-icon-button{cursor:pointer;background:0 0;border:1px solid #565656;border-radius:50%;place-items:center;width:2.35rem;height:2.35rem;padding:0;display:grid}.manager-icon-button:hover{background:#343434;border-color:#fff}.manager-icon-button svg{width:1rem}.manager-icon-button--danger{color:#ff8d92}.manager-icon-button:disabled{opacity:.3;cursor:not-allowed}.profile-editor{background:#292929;border-bottom:1px solid #383838;grid-template-columns:auto minmax(0,1fr) auto;align-items:start;gap:1rem;padding:1rem;display:grid}.profile-editor-fields{gap:.4rem;min-width:0;display:grid}.profile-editor-fields>label,.add-profile-form label{font-size:.72rem;font-weight:750}.profile-editor input[type=text],.profile-editor-fields>input,.add-profile-form>div>input{color:#fff;background:#181818;border:1px solid #686868;border-radius:.25rem;outline:0;width:100%;height:2.6rem;padding:0 .75rem}.profile-editor input:focus,.add-profile-form input:focus{border-color:#fff}.profile-editor-actions{align-self:center;gap:.45rem;display:flex}.manager-button{color:#fff;cursor:pointer;background:#303030;border:1px solid #5a5a5a;border-radius:.25rem;justify-content:center;align-items:center;gap:.4rem;min-height:2.45rem;padding:.45rem .8rem;font-size:.75rem;font-weight:750;display:inline-flex}.manager-button svg{width:1rem}.manager-button--primary{border-color:var(--netflix-red);background:var(--netflix-red)}.manager-button--quiet{background:0 0}.manager-button--danger{background:#8f2026;border-color:#8f2026}.manager-button:disabled{opacity:.55;cursor:wait}.profile-color-picker{border:0;min-width:0;margin:.25rem 0 0;padding:0}.profile-color-picker legend{color:#aaa;margin-bottom:.35rem;font-size:.67rem}.profile-color-picker>div{flex-wrap:wrap;gap:.42rem;display:flex}.profile-color-picker label{cursor:pointer;display:block}.profile-color-picker input{opacity:0;width:1px;height:1px;position:absolute}.profile-color-picker span{border:2px solid #0000;border-radius:50%;width:1.45rem;height:1.45rem;display:block;box-shadow:0 0 0 1px #5c5c5c}.profile-color-picker input:checked+span{border-color:#fff;box-shadow:0 0 0 2px #fff}.profile-delete-confirm{background:#75272b2b;border:1px solid #75272b;border-radius:.35rem;grid-template-columns:1fr auto auto;align-items:center;gap:.55rem;margin-top:.8rem;padding:.8rem;display:grid}.profile-delete-confirm>span{flex-direction:column;gap:.2rem;display:flex}.profile-delete-confirm small{color:#aaa;font-size:.7rem}.add-profile-form{grid-template-columns:minmax(10rem,1fr) 1fr auto;align-items:end;gap:1rem;margin-top:1.25rem;display:grid}.add-profile-form>div:first-child{gap:.4rem;display:grid}.add-movie-modal{background:radial-gradient(circle at 85% 0,#e509142e,#0000 14rem),#181818;border:1px solid #3f3f3f;border-radius:.65rem;width:min(34rem,100vw - 2rem);padding:2.6rem;position:relative;box-shadow:0 1.5rem 5rem #000000b8}.add-movie-modal h2{margin:1rem 0 .35rem;font-size:1.7rem}.add-movie-modal>p{color:#b7b7b7;margin:0 0 1.6rem;font-size:.88rem;line-height:1.6}.add-movie-modal form,.add-movie-modal label{flex-direction:column;display:flex}.add-movie-modal label{margin-bottom:.45rem;font-size:.78rem;font-weight:700}.add-movie-modal input{color:#fff;background:#282828;border:1px solid #696969;border-radius:.25rem;outline:0;width:100%;height:3rem;padding:0 .85rem}.add-movie-modal input:focus{border-color:#fff}.add-movie-modal form>small{color:#858585;margin-top:.45rem;font-size:.7rem}.add-movie-modal .offline-option{cursor:pointer;background:#ffffff09;border:1px solid #454545;border-radius:.3rem;grid-template-columns:auto 1fr;align-items:center;gap:.75rem;margin:1.1rem 0 0;padding:.8rem;display:grid}.add-movie-modal .offline-option input{width:1.05rem;height:1.05rem;accent-color:var(--netflix-red);margin:0}.offline-option span{flex-direction:column;gap:.18rem;min-width:0;display:flex}.offline-option b{font-size:.78rem}.offline-option small{color:#999;font-size:.68rem;font-weight:400}.form-error{color:#ff777d;margin:.8rem 0 0;font-size:.78rem}.add-movie-actions{justify-content:flex-end;gap:.65rem;margin-top:1.5rem;display:flex}.add-movie-actions .button{min-width:8.5rem}.add-movie-actions .button:disabled,.modal-actions .button:disabled{opacity:.58;cursor:wait}.download-state{background:#222;border:1px solid #3e3e3e;border-radius:.3rem;gap:.65rem;margin-bottom:1rem;padding:.75rem}.download-state>svg{color:#f2c94c;width:1.25rem}.download-state--ready>svg{color:#46d369}.download-state--failed>svg{color:#ff5f66}.download-state span{flex-direction:column;min-width:0;display:flex}.download-state b{font-size:.8rem}.download-state small{color:#aaa;font-size:.7rem}.player{--player-image:none;z-index:120;overscroll-behavior:none;color:#fff;isolation:isolate;background:#000;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;position:fixed;inset:0;overflow:hidden}.player--idle,.player--idle *{cursor:none!important}.player-topbar,.player-bottom,.player-noise,.big-play{transition:opacity .4s}.player--idle .player-topbar,.player--idle .player-bottom,.player--idle .player-noise,.player--idle .big-play{opacity:0;pointer-events:none}.player--local:before{display:none}.player-video,.player-embed{z-index:1;background:#000;border:0;width:100%;height:100%;position:absolute;inset:0}.player-video{object-fit:contain;cursor:pointer}.player-embed{width:min(100%,177.778vh);height:min(100%,56.25vw + 1px);inset:50% auto auto 50%;transform:translate(-50%,-50%)}.player-stream-status{z-index:8;color:#fff;text-align:center;background:#141414e6;border-radius:.3rem;align-items:center;gap:.7rem;max-width:min(30rem,100vw - 3rem);padding:.85rem 1.1rem;font-size:.9rem;display:flex;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:0 .75rem 2rem #0000007a}.player-stream-status svg{flex:none;width:1.2rem}.player-stream-status--error{color:#ffd3d5;border:1px solid #ff5f669e}.player-cinematic-bars{display:none}.player--local .player-noise{pointer-events:none}.player:before{z-index:0;background-image:linear-gradient(90deg, #0003, transparent 35%), var(--player-image);content:"";filter:saturate(.92)contrast(1.03);background-position:50%;background-size:cover;transition:filter .22s;animation:18s ease-in-out infinite alternate player-pan;position:absolute;inset:-2%}.player--paused:before{filter:saturate(.6)brightness(.72);animation-play-state:paused}.player-noise{z-index:2;pointer-events:none;background:linear-gradient(#000000d1 0,#00000047 18%,#0000 42% 100%);position:absolute;inset:0}.player-topbar{z-index:8;top:max(.45rem, env(safe-area-inset-top));pointer-events:none;justify-content:space-between;align-items:center;height:3.5rem;display:flex;position:absolute;left:1.45rem;right:1.45rem}.player-topbar-start{flex:auto;align-items:center;min-width:0;display:flex}.player-topbar-start>.player-back{flex:none}.player-embed-program{color:#fff;text-shadow:0 .08rem .2rem #000000e6;flex-direction:column;flex:auto;min-width:0;margin-left:.35rem;line-height:1.15;display:flex}.player-embed-program strong,.player-embed-program span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.player-embed-program strong{font-size:clamp(.9rem,1.15vw,1.25rem);font-weight:650}.player-embed-program span{color:#d2d2d2;margin-top:.2rem;font-size:clamp(.7rem,.85vw,.9rem);font-weight:500}.player-icon-button{color:#fff;cursor:pointer;filter:drop-shadow(0 .08rem .16rem #000c);pointer-events:auto;background:0 0;border:0;place-items:center;width:3.5rem;height:3.5rem;padding:0;display:grid}.player-icon-button svg{stroke-width:2.2px;width:2.8rem;height:2.8rem}.player-icon-button:disabled{opacity:.38;cursor:not-allowed}.player-report svg{width:2.8rem;height:2.8rem}.player-topbar-actions{flex:none;align-items:center;gap:.35rem;display:flex}.player-server-control{pointer-events:auto;position:relative}.player-server-trigger.is-active,.player-topbar-episodes.is-active{background:#ffffff29;border-radius:.25rem}.player-server-trigger svg,.player-topbar-episodes svg,.player-topbar-next svg{width:2.45rem;height:2.45rem}.player-server-menu{z-index:14;color:#fff;transform-origin:calc(100% - 1.75rem) 0;background:#202020fa;border:1px solid #ffffff1f;border-radius:.3rem;width:min(18rem,100vw - 1rem);animation:.14s ease-out subtitle-menu-in;position:absolute;top:calc(100% + .35rem);left:auto;right:0;overflow:hidden;box-shadow:0 .9rem 2.6rem #000000a8}.player-server-menu h2{margin:0;padding:1rem 1.1rem .6rem;font-size:1.1rem;font-weight:650}.player-server-options{flex-direction:column;padding:0 0 .55rem;display:flex}.player-server-options button{color:#c7c7c7;text-align:left;cursor:pointer;background:0 0;border:0;grid-template-columns:1.45rem minmax(0,1fr) 1.25rem;align-items:center;gap:.65rem;min-height:3rem;padding:.6rem 1rem;display:grid}:is(.player-server-options button:hover,.player-server-options button:focus-visible){color:#fff;background:#3a3a3a;outline:none}.player-server-options button[aria-selected=true]{color:#fff;font-weight:700}.player-server-options button svg{width:1.25rem;height:1.25rem}.player-server-options button svg:last-child{color:#46d369}.player-popover-wrap{pointer-events:auto;position:relative}.access-popover.player-access-popover{--access-mobile-top:calc(3.35rem + env(safe-area-inset-top));--access-top:calc(100% + .35rem);--access-right:-.35rem;max-height:calc(100vh - 6rem);overflow-y:auto}.access-popover.player-access-popover .access-caret{display:none}.player-subtitles{z-index:5;width:max-content;max-width:min(100% - 4rem,70rem);color:var(--player-subtitle-color,#fff);font-family:var(--player-subtitle-font-family,inherit);font-size:clamp(1.125rem, var(--player-subtitle-font-size,2rem), 4rem);text-align:center;text-shadow:-2px -2px 1px #000,2px -2px 1px #000,-2px 2px 1px #000,2px 2px 1px #000,0 0 .35rem #000;cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;outline:none;flex-direction:column;align-items:center;padding:.45rem 1rem;font-weight:750;line-height:1.3;display:flex;position:absolute;transform:translate(-50%,-50%)}.player-subtitles:focus-visible{outline-offset:.2rem;border-radius:.25rem;outline:.15rem solid #ffffffe6}.player-subtitles--dragging{cursor:grabbing}.player-subtitles span{background:var(--player-subtitle-bg,transparent);border-radius:.15rem;max-width:48ch;padding:.05em .25em;display:block}.player-episodes{z-index:7;background:#262626;border-radius:.2rem 0 0 .2rem;width:min(39.6vw,47.5rem);min-width:34rem;position:absolute;top:clamp(6.4rem,12.3vh,7.4rem);bottom:5.75rem;right:0;overflow:hidden}.player-episodes--embed{bottom:max(1rem, env(safe-area-inset-bottom))}.player-episodes-header{justify-content:space-between;align-items:center;gap:1rem;height:4.4rem;padding:0 1.4rem;display:flex}.player-episodes h2{color:#fff;letter-spacing:-.02em;align-items:center;margin:0;font-size:clamp(1.5rem,1.65vw,2rem);font-weight:600;display:flex}.player-episode-list{scrollbar-color:#414141 transparent;scrollbar-width:thin;height:calc(100% - 4.4rem);overflow-y:auto}.player-episode-list::-webkit-scrollbar{width:.4rem}.player-episode-list::-webkit-scrollbar-track{background:0 0}.player-episode-list::-webkit-scrollbar-thumb{background:#414141;border-radius:999px}.player-episode{color:#fff;text-align:left;cursor:pointer;background:0 0;border:.18rem solid #0000;width:calc(100% - .65rem);min-height:5.3rem;padding:0;display:block}.player-episode:hover{background:#303030}.player-episode--active{background:#131313;border-color:#fff;min-height:15rem}.player-episode--active:hover{background:#131313}.player-episode-heading{grid-template-columns:1.7rem minmax(0,1fr) minmax(5rem,8.25rem);align-items:center;column-gap:.35rem;height:5rem;padding:0 1.6rem 0 2.6rem;font-size:clamp(1rem,1.08vw,1.3rem);display:grid}.player-episode--active .player-episode-heading{height:4.15rem}.player-episode-heading>span{font-weight:500}.player-episode-heading strong{text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.player-episode-heading>i{background:gray;width:100%;height:.12rem;display:block}.player-episode-details{grid-template-columns:minmax(12.5rem,15.6rem) minmax(0,1fr);align-items:start;gap:1.9rem;padding:0 1.55rem 1.45rem 1.7rem;display:grid}.player-episode-thumbnail{aspect-ratio:16/9;background-position:50%;background-size:cover;place-items:center;display:grid;position:relative;overflow:hidden}.player-now-playing{color:#fff;white-space:nowrap;text-shadow:0 .1rem .25rem #000;align-items:center;gap:.45rem;font-size:clamp(.82rem,1.03vw,1.25rem);font-weight:500;display:flex}.player-playing-bars{align-items:center;gap:.12rem;height:1.15rem;display:flex}.player-playing-bars i{background:#fff;border-radius:999px;width:.13rem;animation:.65s ease-in-out infinite alternate player-bars}.player-playing-bars i:first-child,.player-playing-bars i:nth-child(3){height:.7rem}.player-playing-bars i:nth-child(2){height:1rem;animation-delay:-220ms}.player-playing-bars i:nth-child(4){height:.5rem;animation-delay:-380ms}.player-episode-synopsis{color:#fff;-webkit-line-clamp:5;-webkit-box-orient:vertical;font-size:clamp(.95rem,1.08vw,1.3rem);font-style:normal;font-weight:400;line-height:1.27;display:-webkit-box;overflow:hidden}.big-play{z-index:8;cursor:pointer;background:#00000061;border:.15rem solid #fff;border-radius:50%;place-items:center;width:5rem;height:5rem;display:grid;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.big-play svg{width:2.2rem;height:2.2rem}.player-notice{z-index:10;background:#262626f5;border-radius:.2rem;padding:.7rem 1rem;font-size:.9rem;position:absolute;top:5rem;left:50%;transform:translate(-50%);box-shadow:0 .5rem 1.5rem #00000059}.player-bottom{z-index:9;right:1.7rem;bottom:max(2.5rem, env(safe-area-inset-bottom));position:absolute;left:1.25rem}.player-timeline-row{align-items:center;gap:1.15rem;height:1.1rem;margin-bottom:1.95rem;display:flex}.player-timeline-row>time{color:#fff;font-variant-numeric:tabular-nums;text-align:right;flex:none;min-width:2.7rem;font-size:1rem;line-height:1}.player-timeline-wrap{--seek-preview-position:0%;--seek-preview-width:clamp(10rem, 17vw, 14rem);width:100%;min-width:0;position:relative}.player-seek-preview{z-index:2;bottom:calc(100% + .6rem);left:clamp(calc(var(--seek-preview-width) / 2), var(--seek-preview-position), calc(100% - (var(--seek-preview-width) / 2)));width:var(--seek-preview-width);opacity:0;pointer-events:none;flex-direction:column;align-items:center;gap:.45rem;transition:opacity .12s,transform .12s;display:flex;position:absolute;transform:translate(-50%)translateY(.35rem)}.player-timeline-wrap--previewing .player-seek-preview{opacity:1;transform:translate(-50%)}.player-seek-preview img,.player-seek-preview-frame{aspect-ratio:16/9;object-fit:cover;background:#181818;border-radius:.18rem;width:100%;display:block;box-shadow:0 .5rem 1.4rem #000000b8}.player-seek-preview time{color:#fff;font-variant-numeric:tabular-nums;text-align:center;background:#1c1c1cf5;border-radius:999px;min-width:auto;padding:.35rem .65rem;font-size:.9rem;font-weight:600;line-height:1;box-shadow:0 .2rem .6rem #0000008c}.player-timeline{--player-progress:57%;--player-buffered:61%;-webkit-appearance:none;appearance:none;cursor:pointer;background:0 0;width:100%;min-width:0;height:1rem;margin:0;padding:0}.player-timeline::-webkit-slider-runnable-track{background:linear-gradient(to right, red 0 var(--player-progress), #d3d3d3 var(--player-progress) var(--player-buffered), gray var(--player-buffered) 100%);height:.25rem}.player-timeline::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background:red;border:0;border-radius:50%;width:1rem;height:1rem;margin-top:-.375rem;box-shadow:0 0 0 .05rem red}.player-timeline::-moz-range-track{background:linear-gradient(to right, red 0 var(--player-progress), #d3d3d3 var(--player-progress) var(--player-buffered), gray var(--player-buffered) 100%);border:0;height:.25rem}.player-timeline::-moz-range-thumb{background:red;border:0;border-radius:50%;width:1rem;height:1rem}.player-controls{align-items:center;min-width:0;display:flex}.player-controls-left,.player-controls-right{flex:none;align-items:center;gap:2.125rem;display:flex}.player-subtitle-control{flex:none;place-items:center;width:3rem;height:3rem;display:grid;position:relative}.player-control-button{color:#fff;cursor:pointer;filter:drop-shadow(0 .08rem .14rem #000000d9);background:0 0;border:0;place-items:center;width:3rem;height:3rem;padding:0;transition:opacity .12s,transform .14s;display:grid;position:relative}.player-control-button:hover{transform:scale(1.08)}.player-control-button:disabled{opacity:.38;cursor:not-allowed;transform:none}.player-control-button:active{transform:scale(.96)}.player-control-button.is-active{color:#fff}.player-control-button>svg{stroke-width:2px;width:2.45rem;height:2.45rem}.player-subtitle-menu{z-index:14;color:#fff;text-align:left;transform-origin:calc(100% - 7.5rem) 100%;background:#242424;border:1px solid #ffffff17;border-radius:.22rem;flex-direction:column;width:min(23rem,100vw - 2rem);max-height:min(70vh,38rem);animation:.14s ease-out subtitle-menu-in;display:flex;position:absolute;bottom:calc(100% + 1.1rem);right:-6.2rem;overflow:hidden;box-shadow:0 .9rem 2.6rem #000000a8}.player-subtitle-menu h2{letter-spacing:-.02em;margin:0;padding:1.25rem 1.3rem .75rem;font-size:1.45rem;font-weight:650}.player-subtitle-options{scrollbar-color:#565656 transparent;scrollbar-width:thin;min-height:0;padding:.25rem 0 .65rem;overflow-y:auto}.player-subtitle-options::-webkit-scrollbar{width:.38rem}.player-subtitle-options::-webkit-scrollbar-thumb{background:#565656;border-radius:999px}.player-subtitle-options button{color:#bdbdbd;width:100%;min-height:3.1rem;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;grid-template-columns:1.65rem minmax(0,1fr);align-items:center;gap:.35rem;padding:.65rem 1.3rem .65rem 1.05rem;font-size:1.1rem;display:grid}:is(.player-subtitle-options button:hover,.player-subtitle-options button:focus-visible){color:#fff;background:#303030;outline:none}.player-subtitle-options button[aria-selected=true]{color:#fff}.player-subtitle-check{place-items:center;width:1.35rem;height:1.35rem;display:grid}.player-subtitle-check svg{stroke-width:2px;width:1.3rem;height:1.3rem}.player-subtitle-settings{z-index:1;background:#242424;border-top:1px solid #515151;flex:none;padding:1rem 1.3rem 1.15rem;position:relative}.player-subtitle-setting-heading{justify-content:space-between;align-items:center;gap:1rem;font-size:.95rem;font-weight:600;display:flex}.player-subtitle-setting-heading output{color:#bdbdbd;font-variant-numeric:tabular-nums;font-size:.82rem;font-weight:500}.player-subtitle-size-control{grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:.8rem;margin-top:.75rem;display:grid}.player-subtitle-size-control>span:first-child{font-size:.8rem}.player-subtitle-size-control>span:last-child{font-size:1.25rem;font-weight:600}.player-subtitle-size-control input{accent-color:#fff;cursor:pointer;width:100%}.player-subtitle-position-setting{justify-content:space-between;align-items:center;gap:.8rem;margin-top:.8rem;display:flex}.player-subtitle-position-setting p{color:#aaa;margin:0;font-size:.75rem;line-height:1.3}.player-subtitle-position-setting button{color:#eee;min-height:2rem;font:inherit;cursor:pointer;background:0 0;border:1px solid #777;border-radius:.15rem;flex:none;padding:.35rem .65rem;font-size:.72rem}:is(.player-subtitle-position-setting button:hover,.player-subtitle-position-setting button:focus-visible){color:#111;background:#fff;border-color:#fff;outline:none}.player-subtitle-color-setting{justify-content:space-between;align-items:center;gap:.7rem;margin-top:.65rem;display:flex}.player-subtitle-color-setting label{color:#ccc;margin:0;font-size:.75rem}.player-subtitle-color-setting input[type=color]{cursor:pointer;background:0 0;border:1px solid #666;border-radius:.15rem;width:2rem;height:1.5rem;padding:0}.player-subtitle-color-setting select{color:#eee;min-height:1.6rem;font:inherit;cursor:pointer;background:#2a2a2a;border:1px solid #666;border-radius:.15rem;padding:.2rem .4rem;font-size:.72rem}:is(.player-subtitle-color-setting select:hover,.player-subtitle-color-setting select:focus-visible){border-color:#fff;outline:none}.player-controls-left>button:first-child svg{fill:currentColor;stroke-width:1.4px}.player-program{color:#fff;white-space:nowrap;flex:1;justify-content:center;align-items:baseline;gap:1rem;min-width:0;padding:0 1.5rem;font-size:clamp(.9rem,1.05vw,1.25rem);display:flex}.player-program strong{text-overflow:ellipsis;font-weight:500;overflow:hidden}.player-program span{flex:none;font-weight:400}.player-ten-second span{font-size:.73rem;font-weight:700;position:absolute;top:50%;left:50%;transform:translate(-50%,-48%)}.player-ten-second svg{stroke-width:1.75px;width:2.55rem;height:2.55rem}.player-episodes-trigger svg{transform:scale(1.24)}.player-speed span{color:#000;background:#fff;border-radius:.18rem;padding:.1rem .22rem;font-size:.58rem;font-weight:800;position:absolute;bottom:-.12rem;right:-.35rem}@keyframes subtitle-menu-in{0%{opacity:0;transform:translateY(.35rem)scale(.98)}}@keyframes player-bars{to{height:.25rem}}.player-timeline-marker{z-index:3;pointer-events:none;border-radius:.08rem;width:.38rem;height:.85rem;position:absolute;top:50%;transform:translate(-50%,-50%)}.player-timeline-marker--intro{background:#ffd600;box-shadow:0 0 .35rem #ffd60073}.player-timeline-marker--outro{background:#00e5ff;box-shadow:0 0 .35rem #00e5ff73}.player-marker-control{z-index:4;flex-direction:column;align-items:center;display:flex;position:absolute;bottom:calc(100% + .35rem);transform:translate(-50%)}.player-marker-trigger{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);color:#fff;cursor:pointer;background:#ffffff26;border:0;border-radius:50%;place-items:center;width:2rem;height:2rem;padding:0;transition:background .14s,transform .14s;animation:.2s ease-out marker-trigger-in;display:grid}.player-marker-trigger:hover{background:#ffffff4d;transform:scale(1.15)}.player-marker-trigger svg{stroke-width:2.2px;width:1.15rem;height:1.15rem}@keyframes marker-trigger-in{0%{opacity:0;transform:scale(.6)}}.player-marker-menu{z-index:14;-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);transform-origin:50% 100%;background:#181818f5;border:1px solid #ffffff1f;border-radius:.5rem;flex-direction:column;width:max-content;min-width:13rem;animation:.16s ease-out marker-menu-in;display:flex;position:absolute;bottom:calc(100% + .65rem);left:50%;overflow:hidden;transform:translate(-50%);box-shadow:0 .8rem 2.4rem #000000b3,0 0 0 1px #ffffff0d}@keyframes marker-menu-in{0%{opacity:0;transform:translate(-50%)translateY(.4rem)scale(.96)}}.player-marker-menu button{color:#e0e0e0;width:100%;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;grid-template-columns:1.4rem minmax(0,1fr) auto;align-items:center;gap:.6rem;padding:.75rem 1.1rem;font-size:.95rem;font-weight:500;transition:background 80ms,color 80ms;display:grid}.player-marker-menu button:first-child{border-radius:.5rem .5rem 0 0}.player-marker-menu button:last-child{border-radius:0 0 .5rem .5rem}.player-marker-menu button+button{border-top:1px solid #ffffff14}.player-marker-menu button:hover{color:#fff;background:#ffffff1a}.player-marker-menu button svg{stroke-width:2px;color:#bbb;width:1.25rem;height:1.25rem}.player-marker-menu button:hover svg{color:#fff}.player-marker-menu button small{color:gray;font-variant-numeric:tabular-nums;font-size:.72rem;font-weight:400}.player-marker-menu-remove{color:#f07070!important}.player-marker-menu-remove:hover{color:#ff6b6b!important;background:#f050501f!important}.player-marker-menu-remove svg{color:#f07070!important}.player-marker-menu-remove:hover svg{color:#ff6b6b!important}.player-skip-intro{z-index:10;color:#fff;font:inherit;letter-spacing:.04em;cursor:pointer;background:#000000a6;border:1.5px solid #ffffffb3;border-radius:.18rem;padding:.65rem 1.6rem;font-size:clamp(1rem,1.2vw,1.3rem);font-weight:600;transition:background .12s,border-color .12s;animation:.3s ease-out skip-intro-in;position:absolute;bottom:18%;right:6%}.player-skip-intro:hover{background:#fff3;border-color:#fff}@keyframes skip-intro-in{0%{opacity:0;transform:translate(1rem)}}.player-next-episode-prompt{z-index:10;color:#141414;font:inherit;letter-spacing:.02em;cursor:pointer;background:#fff;border:0;border-radius:.22rem;align-items:center;gap:.45rem;padding:.55rem 1.5rem .55rem 1rem;font-size:clamp(.95rem,1.15vw,1.25rem);font-weight:700;transition:background .1s;animation:.35s ease-out next-episode-in;display:flex;position:absolute;bottom:18%;right:6%}.player-next-episode-prompt:hover{background:#ffffffd9}.player-next-episode-prompt svg{stroke-width:1.5px;width:1.35rem;height:1.35rem}@keyframes next-episode-in{0%{opacity:0;transform:translate(1rem)}}.site-footer{max-width:68rem;padding:0 var(--page-padding) 3rem;color:gray;margin:3rem auto 0;font-size:.78rem}.social-links{align-items:center;gap:1.4rem;margin-bottom:1.5rem;display:flex}.social-links a{color:#fff;place-items:center;width:1.6rem;height:1.6rem;font-size:1.4rem;font-weight:700;display:grid}.footer-links{grid-template-columns:repeat(4,1fr);gap:1rem 2rem;display:grid}.footer-links a:hover{text-decoration:underline}.service-code{color:gray;background:0 0;border:1px solid gray;margin:1.8rem 0 .5rem;padding:.45rem;font-size:.75rem;display:inline-block}@keyframes hero-breathe{0%{transform:scale(1.015)}to{transform:scale(1.055)}}@keyframes player-pan{0%{transform:scale(1.02)translate(-.5%)}to{transform:scale(1.08)translate(1.5%)}}@keyframes source-spin{to{transform:rotate(360deg)}}@keyframes scroll-cue{0%,to{opacity:.35;transform:translateY(0)}50%{opacity:.75;transform:translateY(.45rem)}}@keyframes popover-in{0%{opacity:0;transform:translateY(-.35rem)}}@keyframes search-in{0%{opacity:0}}@keyframes modal-backdrop-in{0%{opacity:0}}@keyframes modal-in{0%{opacity:0;transform:scale(.96)translateY(1rem)}}@media (max-height:900px){.catalog{margin-top:0}}@media (max-width:1199px){.title-rail{grid-auto-columns:calc((100vw - (2 * var(--page-padding)) - 2rem) / 5)}.title-row--ranked .title-rail{grid-auto-columns:calc((100vw - (2 * var(--page-padding)) - 1.5rem) / 4)}.title-row--originals .title-rail{grid-auto-columns:calc((100vw - (2 * var(--page-padding)) - 2rem) / 5.2)}}@media (max-width:960px){:root{--page-padding:clamp(1.1rem, 3vw, 2rem)}.primary-nav{top:calc(100% - .2rem);left:var(--page-padding);background:#000000f0;border-top:2px solid #fff;flex-direction:column;align-items:stretch;gap:0;width:14rem;padding:.85rem 0;display:none;position:absolute;box-shadow:0 1.2rem 2.5rem #0000006b}.primary-nav:before{content:"";background:#fff;width:.8rem;height:.8rem;position:absolute;top:-.48rem;left:1rem;transform:rotate(45deg)}.primary-nav--open{display:flex}.primary-nav a{z-index:1;text-align:center;background:#000000f5;padding:.75rem 1.15rem;position:relative}.primary-nav a:hover{background:#1e1e1e}.mobile-menu-button{display:grid}.nav-start{gap:.8rem}.hero-content{width:min(32rem,55vw)}.title-rail{grid-auto-columns:calc((100vw - (2 * var(--page-padding)) - 1.5rem) / 4)}.title-row--ranked .title-rail{grid-auto-columns:calc((100vw - (2 * var(--page-padding)) - 1rem) / 3.2)}.title-row--originals .title-rail{grid-auto-columns:calc((100vw - (2 * var(--page-padding)) - 1.5rem) / 4.2)}.netflix-search-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.player-episodes{width:min(55vw,47.5rem);min-width:30rem}.player-controls-left,.player-controls-right{gap:.75rem}.player-control-button,.player-subtitle-control{width:2.6rem;height:2.6rem}.player-control-button>svg{width:2.1rem;height:2.1rem}.player-program{padding-inline:.65rem;font-size:.86rem}}@media (max-width:700px){:root{--header-height:3.5rem;--page-padding:1rem}.top-nav{gap:.5rem}.nav-start{gap:.4rem}.nav-end{gap:.2rem}.nav-end>.nav-popover-wrap>.icon-button,.search-box,.search-box .search-trigger{width:2.25rem}.search-box .search-trigger{flex-basis:2.25rem}.netflix-wordmark{font-size:1.35rem}.kids-link,.notification-button,.profile-trigger>svg{display:none}.profile-avatar{width:1.85rem;height:1.85rem}.profile-popover{right:-.25rem}.access-popover.netflix-access-popover{--access-mobile-top:calc(var(--app-top-nav-height) + var(--header-height) + env(safe-area-inset-top) + .35rem)}.sources-popover,.downloads-popover{top:calc(var(--app-top-nav-height) + var(--header-height) + env(safe-area-inset-top) + .35rem);width:auto;position:fixed;left:1rem;right:1rem}.sources-popover .popover-caret,.downloads-popover .popover-caret{display:none}.search-box--open{z-index:10;top:calc(var(--header-height) + env(safe-area-inset-top));background:#141414;border:1px solid #333;border-left:0;border-right:0;width:100%;height:3.2rem;position:fixed;left:0;right:0}.search-box--open .search-trigger{margin-left:.5rem}.search-box--open input{font-size:1rem}.top-nav--search .search-box--open{top:calc(var(--header-height) + env(safe-area-inset-top) + .4rem);right:var(--page-padding);left:var(--page-padding);background:#181818;border:1px solid #5c5c5c;border-radius:999px;width:auto;height:2.75rem}.hero{height:max(36rem,72svh);min-height:36rem}.hero-backdrop{background-position:66%}.hero-vignette{background:linear-gradient(90deg, #000000c7, #00000040 75%), linear-gradient(0deg, var(--background) 0%, #141414d1 16%, transparent 58%), linear-gradient(180deg, #00000094, transparent 25%)}.hero-content{top:auto;right:var(--page-padding);width:auto;bottom:6rem}.netflix-series{margin-bottom:.4rem;font-size:.62rem}.netflix-series span{font-size:1.35rem}.hero-content h1{max-width:8ch;font-size:clamp(2.8rem,13vw,4.5rem)}.hero-title-logo{width:min(22rem,82%);max-height:7rem}.hero-rank{margin:.7rem 0 .65rem;font-size:.95rem}.hero-rank span{width:1.9rem;height:1.9rem;font-size:.56rem}.hero-description{-webkit-line-clamp:2;max-width:29rem;margin-bottom:1.1rem;font-size:.88rem;line-height:1.35}.button{min-width:6.6rem;min-height:2.75rem;padding:.5rem 1rem;font-size:.86rem}.button svg{width:1.25rem}.hero-side-controls{bottom:3.25rem;right:0}.hero-side-controls .round-button{display:none}.maturity-badge{min-width:4.7rem;padding:.35rem 1.6rem .35rem .65rem;font-size:.74rem}.hero-scroll-cue{display:none}.catalog{margin-top:0}.title-row{margin-bottom:1.5rem}.row-heading{height:1.6rem}.row-heading h2{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:1.05rem;overflow:hidden}.explore-link,.rail-control{display:none}.title-rail{grid-auto-columns:calc((100vw - (2 * var(--page-padding)) - .6rem) / 2.25);scroll-snap-type:x mandatory;gap:.4rem;padding-top:1.6rem;padding-bottom:0}.title-rail:has(.card-episode-strip){padding-bottom:0}.title-row--ranked .title-rail{grid-auto-columns:calc((100vw - (2 * var(--page-padding)) - .4rem) / 1.85)}.title-row--originals .title-rail{grid-auto-columns:calc((100vw - (2 * var(--page-padding)) - .8rem) / 3.15)}.title-card{transition:none}.title-card--ranked .rank-number{font-size:8rem}.card-title-fallback{font-size:.68rem}.new-season{display:none}.netflix-search-page{padding-top:calc((2 * var(--header-height)) + var(--app-top-nav-height) + 1.2rem)}.netflix-search-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:1.5rem .4rem}.modal-backdrop{place-items:stretch stretch;padding:0}.details-modal{border-radius:0;width:100%;min-height:100svh}.manage-profiles-modal{width:100%;min-height:100svh;padding:4.5rem 1rem max(2rem, env(safe-area-inset-bottom));border:0;border-radius:0}.profile-editor{grid-template-columns:auto minmax(0,1fr)}.profile-editor-actions{grid-column:1/-1;justify-content:flex-end}.profile-delete-confirm,.add-profile-form{grid-template-columns:1fr}.profile-delete-confirm .manager-button{width:100%}.modal-close{top:max(.8rem, env(safe-area-inset-top));position:fixed;right:.8rem}.modal-hero{height:60vw;min-height:18rem}.modal-hero-content{bottom:1.4rem;left:1.2rem;right:1.2rem}.modal-hero-content h2{max-width:8ch;font-size:2.5rem}.modal-body{grid-template-columns:1fr;gap:1.5rem;padding:.6rem 1.2rem 2rem}.episode-panel{padding:1.5rem 1.2rem max(2rem, env(safe-area-inset-bottom))}.episode-panel-header{flex-direction:column;align-items:flex-start}.episode-panel-tools{justify-content:space-between;width:100%}.episode-card-list{max-height:65svh}.episode-card{grid-template-columns:1.2rem 7rem minmax(0,1fr);gap:.65rem;padding:.75rem}.episode-copy em{display:none}.episode-copy{min-width:0}.player-topbar{top:max(.2rem, env(safe-area-inset-top));height:3rem;left:.4rem;right:.4rem}.player-server-menu{top:calc(3.55rem + env(safe-area-inset-top));transform-origin:calc(100% - 10.5rem) 0;width:auto;position:fixed;left:.5rem;right:.5rem}.player-icon-button{width:3rem;height:3rem}.player-icon-button svg,.player-report svg{width:2rem;height:2rem}.player-episodes{border-radius:0;width:100%;min-width:0;top:4.25rem;bottom:4.8rem}.player-episodes--embed{bottom:max(.5rem, env(safe-area-inset-bottom))}.player-episodes-header{height:3.5rem;padding-inline:1rem}.player-episodes h2{font-size:1.35rem}.player-episode-list{height:calc(100% - 3.5rem)}.player-episode{width:calc(100% - .35rem);min-height:4rem}.player-episode--active{min-height:12rem}.player-episode-heading,.player-episode--active .player-episode-heading{grid-template-columns:1.35rem minmax(0,1fr) minmax(3.5rem,6rem);height:3.9rem;padding:0 .85rem;font-size:.9rem}.player-episode-details{grid-template-columns:minmax(8rem,12rem) minmax(0,1fr);gap:.8rem;padding:0 .8rem .85rem}.player-episode-synopsis{-webkit-line-clamp:5;font-size:.78rem}.player-now-playing{font-size:.72rem}.player-subtitles{width:max-content;max-width:calc(100% - 1.5rem);padding-inline:.5rem}.big-play{width:4rem;height:4rem}.player-bottom{right:.75rem;bottom:max(1.15rem, env(safe-area-inset-bottom));left:.75rem}.player-timeline-row{gap:.6rem;height:.8rem;margin-bottom:.7rem}.player-timeline-row>time{min-width:2rem;font-size:.72rem}.player-timeline-wrap{--seek-preview-width:min(9rem, 45vw)}.player-seek-preview{gap:.3rem;bottom:calc(100% + .45rem)}.player-seek-preview time{padding:.28rem .52rem;font-size:.72rem}.player-controls{justify-content:space-between}.player-controls-left,.player-controls-right{gap:.15rem}.player-control-button,.player-subtitle-control{width:2rem;height:2rem}.player-control-button>svg{width:1.65rem;height:1.65rem}.player-ten-second span{font-size:.5rem}.player-program{display:none}.player-speed span{font-size:.48rem;right:-.2rem}.player-subtitle-menu{width:min(23rem,100vw - 1.5rem);max-height:min(68vh,32rem);right:-4rem}.player-subtitle-menu h2{padding:1rem 1rem .55rem;font-size:1.2rem}.player-subtitle-options button{min-height:2.7rem;padding:.5rem 1rem .5rem .75rem;font-size:.95rem}.player-subtitle-settings{padding:.8rem 1rem .9rem}.player-subtitle-position-setting{flex-direction:column;align-items:flex-start}.player-subtitle-position-setting button{align-self:flex-end}.footer-links{grid-template-columns:repeat(2,1fr)}}@media (max-width:380px){.mobile-menu-button{width:1.8rem}.mobile-menu-button svg{width:1.15rem}.netflix-wordmark{font-size:1.15rem}.hero-actions{gap:.45rem}.button{min-width:6rem;padding-inline:.75rem}.episode-card{grid-template-columns:1rem 6rem 1fr}.player-bottom{left:.45rem;right:.45rem}.player-control-button,.player-subtitle-control{width:1.85rem;height:1.85rem}.player-control-button>svg{width:1.5rem;height:1.5rem}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import{a as e,c as t,i as n,n as r,o as i,r as a,s as o,t as s}from"./storage-fxaUbjG1.js";var c=[{id:`phimhdcss`,name:`PhimHDC`,baseUrl:`https://phimhdcss.com/`,hosts:[`phimhdcss.com`,`www.phimhdcss.com`,`phimhdcss.net`,`www.phimhdcss.net`],accentColor:`#7a171d`},{id:`fsharetv`,name:`FshareTV`,baseUrl:`https://fsharetv.com/`,hosts:[`fsharetv.com`,`www.fsharetv.com`],accentColor:`#235b76`},{id:`hh3d`,name:`HH3D`,baseUrl:`https://hh3d.com/`,hosts:[`hh3d.com`,`www.hh3d.com`],accentColor:`#d97706`},{id:`hhpanda`,name:`HHPanda`,baseUrl:`https://hhpanda.st/`,hosts:[`hhpanda.st`,`www.hhpanda.st`],accentColor:`#e11d48`}],l=75e3;function u(e,t){switch(t.type){case`set-paused`:case`seek-relative`:case`seek-to`:case`set-muted`:case`set-volume`:return!0;case`previous-track`:case`next-track`:case`switch-track`:case`switch-playlist`:return e.service===`spotify`;case`next-episode`:case`select-episode`:case`switch-title`:case`set-captions`:case`set-subtitle-font-size`:case`set-subtitle-font-color`:case`set-subtitle-background`:case`reset-subtitle-position`:return e.service!==`spotify`}}function d(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function f(e){return typeof e==`string`&&e.trim().length>0}function p(e){return typeof e==`number`&&Number.isFinite(e)}function m(e){return p(e)&&e>=0}function h(e){return Number.isInteger(e)&&typeof e==`number`&&e>0}function g(e){return p(e)&&e>=0&&e<=1}function _(e){return d(e)&&h(e.season)&&h(e.number)&&f(e.title)}function ee(e){return d(e)&&typeof e.available==`boolean`&&typeof e.captionsOn==`boolean`&&p(e.fontSize)&&e.fontSize>=18&&e.fontSize<=64&&f(e.fontColor)&&f(e.backgroundColor)}function te(e){return d(e)&&f(e.sessionId)&&f(e.profileId)&&f(e.titleId)&&f(e.title)&&f(e.artwork)&&m(e.currentTime)&&m(e.duration)&&typeof e.paused==`boolean`&&typeof e.muted==`boolean`&&g(e.volume)&&m(e.updatedAt)?e.service===`spotify`?f(e.artist)&&f(e.album)&&(e.provider===void 0||f(e.provider)):(e.service===void 0||e.service===`netflix`)&&h(e.seasonNumber)&&h(e.episodeNumber)&&f(e.episodeTitle)&&Array.isArray(e.episodes)&&e.episodes.every(_)&&ee(e.subtitles):!1}function ne(e){if(!d(e)||typeof e.type!=`string`)return!1;switch(e.type){case`set-paused`:return typeof e.paused==`boolean`;case`seek-relative`:return p(e.seconds);case`seek-to`:return m(e.seconds);case`set-muted`:return typeof e.muted==`boolean`;case`set-volume`:return g(e.volume);case`previous-track`:case`next-track`:case`next-episode`:case`reset-subtitle-position`:return!0;case`select-episode`:return h(e.episodeNumber);case`switch-track`:return f(e.trackId);case`switch-playlist`:return f(e.playlistId);case`switch-title`:return f(e.titleId);case`set-captions`:return typeof e.enabled==`boolean`;case`set-subtitle-font-size`:return p(e.fontSize)&&e.fontSize>=18&&e.fontSize<=64;case`set-subtitle-font-color`:return f(e.color);case`set-subtitle-background`:return f(e.background);default:return!1}}function v(e){if(!d(e)||typeof e.kind!=`string`)return!1;switch(e.kind){case`announce`:return te(e.activity);case`command`:return f(e.sessionId)&&ne(e.command);default:return!1}}function y(e){try{return v(e)}catch{return!1}}function b(e){return e??a().id}function x(t){return e(b(t))}function S(e){return e===`asc`||e===`desc`}function re(e){return{titleId:e.title_id,seasonNumber:e.season_number,episodeNumber:e.episode_number,positionSeconds:e.position_seconds,durationSeconds:e.duration_seconds,completed:!!e.completed,updatedAt:e.updated_at}}function C(){return i()}function w(e){return n(e)??void 0}function T(){return a()}function ie(e){return o(e)}function ae(e,t){return s(e,t)}function oe(e,n){return t(e,n)}function se(e){r(e)}var ce={fontSize:32,positionX:50,positionY:78,fontColor:`#ffffff`,backgroundColor:`rgba(0,0,0,0.75)`,fontFamily:`default`,captionsOn:!1,updatedAt:new Date().toISOString()};function le(e){return e?{fontSize:e.font_size,positionX:e.position_x,positionY:e.position_y,fontColor:e.font_color,backgroundColor:e.background_color,fontFamily:e.font_family,captionsOn:!!e.captions_on,updatedAt:e.updated_at}:{...ce}}function E(e){return le(x(e).prepare(`SELECT profile_id, font_size, position_x, position_y,
|
|
2
|
+
font_color, background_color, font_family, captions_on,
|
|
3
|
+
updated_at
|
|
4
|
+
FROM netflix_subtitle_preferences WHERE profile_id = ?`).get(e))}function ue(e,t){if(!w(e))throw Error(`Profile not found.`);let n=E(e),r=t.fontSize??n.fontSize,i=t.positionX??n.positionX,a=t.positionY??n.positionY,o=t.fontColor??n.fontColor,s=t.backgroundColor??n.backgroundColor,c=t.fontFamily??n.fontFamily,l=t.captionsOn??n.captionsOn,u=new Date().toISOString();return x(e).prepare(`INSERT INTO netflix_subtitle_preferences (
|
|
5
|
+
profile_id, font_size, position_x, position_y,
|
|
6
|
+
font_color, background_color, font_family, captions_on, updated_at
|
|
7
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
8
|
+
ON CONFLICT(profile_id) DO UPDATE SET
|
|
9
|
+
font_size = excluded.font_size,
|
|
10
|
+
position_x = excluded.position_x,
|
|
11
|
+
position_y = excluded.position_y,
|
|
12
|
+
font_color = excluded.font_color,
|
|
13
|
+
background_color = excluded.background_color,
|
|
14
|
+
font_family = excluded.font_family,
|
|
15
|
+
captions_on = excluded.captions_on,
|
|
16
|
+
updated_at = excluded.updated_at`).run(e,r,i,a,o,s,c,Number(l),u),{fontSize:r,positionX:i,positionY:a,fontColor:o,backgroundColor:s,fontFamily:c,captionsOn:l,updatedAt:u}}function D(e){if(!w(e))throw Error(`Profile not found.`);let t=x(e),n=t.prepare(`SELECT title_id, in_my_list, liked, episode_sort
|
|
17
|
+
FROM netflix_profile_title_state WHERE profile_id = ?`).all(e),r=t.prepare(`SELECT title_id, season_number, episode_number, position_seconds,
|
|
18
|
+
duration_seconds, completed, updated_at
|
|
19
|
+
FROM netflix_watch_progress
|
|
20
|
+
WHERE profile_id = ?
|
|
21
|
+
ORDER BY updated_at DESC`).all(e).map(re),i={};for(let e of n)S(e.episode_sort)&&e.episode_sort!==`asc`&&(i[e.title_id]=e.episode_sort);return{myList:n.filter(e=>e.in_my_list).map(e=>e.title_id),likedTitles:n.filter(e=>e.liked).map(e=>e.title_id),episodeSort:i,trackedTitles:M(e).map(e=>e.titleId),newEpisodes:L(e),progress:r,subtitlePreferences:E(e)}}function de(e,t,n){if(!w(e))throw Error(`Profile not found.`);let r=x(e),i=r.prepare(`SELECT in_my_list, liked, episode_sort FROM netflix_profile_title_state
|
|
22
|
+
WHERE profile_id = ? AND title_id = ?`).get(e,t),a=n.inMyList===void 0?!!i?.in_my_list:n.inMyList,o=n.liked===void 0?!!i?.liked:n.liked,s=n.episodeSort??(S(i?.episode_sort)?i.episode_sort:`asc`);return!a&&!o&&s===`asc`?r.prepare(`DELETE FROM netflix_profile_title_state
|
|
23
|
+
WHERE profile_id = ? AND title_id = ?`).run(e,t):r.prepare(`INSERT INTO netflix_profile_title_state (
|
|
24
|
+
profile_id, title_id, in_my_list, liked, episode_sort, updated_at
|
|
25
|
+
) VALUES (?, ?, ?, ?, ?, ?)
|
|
26
|
+
ON CONFLICT(profile_id, title_id) DO UPDATE SET
|
|
27
|
+
in_my_list = excluded.in_my_list,
|
|
28
|
+
liked = excluded.liked,
|
|
29
|
+
episode_sort = excluded.episode_sort,
|
|
30
|
+
updated_at = excluded.updated_at`).run(e,t,Number(a),Number(o),s,new Date().toISOString()),D(e)}function fe(e,t){if(!w(e))throw Error(`Profile not found.`);let n=Math.max(0,t.positionSeconds),r=Math.max(0,t.durationSeconds),i=!!t.completed||r>0&&n/r>=.95,a=new Date().toISOString();return x(e).prepare(`INSERT INTO netflix_watch_progress (
|
|
31
|
+
profile_id, title_id, season_number, episode_number,
|
|
32
|
+
position_seconds, duration_seconds, completed, updated_at
|
|
33
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
34
|
+
ON CONFLICT(profile_id, title_id) DO UPDATE SET
|
|
35
|
+
season_number = excluded.season_number,
|
|
36
|
+
episode_number = excluded.episode_number,
|
|
37
|
+
position_seconds = excluded.position_seconds,
|
|
38
|
+
duration_seconds = excluded.duration_seconds,
|
|
39
|
+
completed = excluded.completed,
|
|
40
|
+
updated_at = excluded.updated_at`).run(e,t.titleId,t.seasonNumber,t.episodeNumber,n,r,Number(i),a),i||k(e,t.titleId),{titleId:t.titleId,seasonNumber:t.seasonNumber,episodeNumber:t.episodeNumber,positionSeconds:n,durationSeconds:r,completed:i,updatedAt:a}}function pe(e){return{titleId:e.title_id,trackedAt:e.tracked_at,lastEpisodeNumber:e.last_episode_number,lastEpisodeCount:e.last_episode_count,lastCheckedAt:e.last_checked_at,lastNewEpisodeAt:e.last_new_episode_at}}function O(e,t){let n=x(t).prepare(`SELECT media_type, source_url, episodes FROM netflix_movies WHERE id = ?`).get(e);if(!n)return;let r=Z(n.episodes);return{mediaType:n.media_type,sourceUrl:n.source_url,count:r.length,highestNumber:r.reduce((e,t)=>Math.max(e,t.episode),0)}}function me(e,t){let n=O(e,t);return n?.sourceUrl?n.mediaType===`series`||n.count>0:!1}function k(e,t){if(!me(t,e))return;let n=O(t,e),r=new Date().toISOString();x(e).prepare(`INSERT INTO netflix_episode_tracking (
|
|
41
|
+
profile_id, title_id, tracking_enabled, tracked_at,
|
|
42
|
+
last_episode_number, last_episode_count, updated_at
|
|
43
|
+
) VALUES (?, ?, 1, ?, ?, ?, ?)
|
|
44
|
+
ON CONFLICT(profile_id, title_id) DO NOTHING`).run(e,t,r,n?.highestNumber??0,n?.count??0,r)}var A=`netflix-episode-tracking-backfill-v1`;function j(e){let t=x(e);if(t.prepare(`SELECT 1 FROM schema_migrations WHERE id = ?`).get(A))return;let n=t.prepare(`SELECT title_id FROM netflix_watch_progress
|
|
45
|
+
WHERE profile_id = ? AND completed = 0 AND position_seconds >= 1`).all(e);for(let t of n)k(e,t.title_id);t.prepare(`INSERT OR IGNORE INTO schema_migrations (id, applied_at) VALUES (?, ?)`).run(A,new Date().toISOString())}function M(e){return x(e).prepare(`SELECT title_id, tracking_enabled, tracked_at, last_episode_number,
|
|
46
|
+
last_episode_count, last_checked_at, last_new_episode_at
|
|
47
|
+
FROM netflix_episode_tracking
|
|
48
|
+
WHERE profile_id = ? AND tracking_enabled = 1
|
|
49
|
+
ORDER BY tracked_at DESC`).all(e).map(pe)}function N(e,t,n){if(!w(e))throw Error(`Profile not found.`);let r=x(e),i=new Date().toISOString();if(!n)return r.prepare(`INSERT INTO netflix_episode_tracking (
|
|
50
|
+
profile_id, title_id, tracking_enabled, tracked_at, updated_at
|
|
51
|
+
) VALUES (?, ?, 0, ?, ?)
|
|
52
|
+
ON CONFLICT(profile_id, title_id) DO UPDATE SET
|
|
53
|
+
tracking_enabled = 0,
|
|
54
|
+
updated_at = excluded.updated_at`).run(e,t,i,i),D(e);let a=O(t,e);return r.prepare(`INSERT INTO netflix_episode_tracking (
|
|
55
|
+
profile_id, title_id, tracking_enabled, tracked_at,
|
|
56
|
+
last_episode_number, last_episode_count, updated_at
|
|
57
|
+
) VALUES (?, ?, 1, ?, ?, ?, ?)
|
|
58
|
+
ON CONFLICT(profile_id, title_id) DO UPDATE SET
|
|
59
|
+
tracking_enabled = 1,
|
|
60
|
+
tracked_at = excluded.tracked_at,
|
|
61
|
+
last_episode_number = excluded.last_episode_number,
|
|
62
|
+
last_episode_count = excluded.last_episode_count,
|
|
63
|
+
updated_at = excluded.updated_at`).run(e,t,i,a?.highestNumber??0,a?.count??0,i),D(e)}function P(e,t){x(e).prepare(`DELETE FROM netflix_episode_tracking
|
|
64
|
+
WHERE profile_id = ? AND title_id = ?`).run(e,t)}function F(e,t,n){let r=new Date().toISOString();x(e).prepare(`UPDATE netflix_episode_tracking SET
|
|
65
|
+
last_episode_number = ?,
|
|
66
|
+
last_episode_count = ?,
|
|
67
|
+
last_checked_at = ?,
|
|
68
|
+
last_new_episode_at = CASE WHEN ? = 1 THEN ? ELSE last_new_episode_at END,
|
|
69
|
+
tracked_at = CASE WHEN ? = 1 THEN ? ELSE tracked_at END,
|
|
70
|
+
updated_at = ?
|
|
71
|
+
WHERE profile_id = ? AND title_id = ?`).run(n.lastEpisodeNumber,n.lastEpisodeCount,r,Number(n.foundNewEpisode),r,Number(n.foundNewEpisode),r,r,e,t)}function I(e,t,n){if(!n.length)return;let r=x(e),i=new Date().toISOString(),a=r.prepare(`INSERT INTO netflix_new_episodes (
|
|
72
|
+
profile_id, title_id, season_number, episode_number,
|
|
73
|
+
episode_title, discovered_at, seen
|
|
74
|
+
) VALUES (?, ?, ?, ?, ?, ?, 0)
|
|
75
|
+
ON CONFLICT(profile_id, title_id, season_number, episode_number)
|
|
76
|
+
DO NOTHING`);r.transaction(()=>{for(let r of n)a.run(e,t,r.season,r.episode,r.title,i)})()}function L(e){return x(e).prepare(`SELECT alert.title_id, alert.season_number, alert.episode_number,
|
|
77
|
+
alert.episode_title, alert.discovered_at, alert.seen,
|
|
78
|
+
movie.title AS title_name, movie.backdrop_image
|
|
79
|
+
FROM netflix_new_episodes AS alert
|
|
80
|
+
LEFT JOIN netflix_movies AS movie ON movie.id = alert.title_id
|
|
81
|
+
WHERE alert.profile_id = ?
|
|
82
|
+
ORDER BY alert.discovered_at DESC,
|
|
83
|
+
alert.season_number DESC,
|
|
84
|
+
alert.episode_number DESC
|
|
85
|
+
LIMIT 60`).all(e).map(e=>({titleId:e.title_id,titleName:e.title_name??e.title_id,artwork:e.backdrop_image??``,seasonNumber:e.season_number,episodeNumber:e.episode_number,episodeTitle:e.episode_title,discoveredAt:e.discovered_at,seen:!!e.seen}))}function R(e){if(!w(e))throw Error(`Profile not found.`);return x(e).prepare(`UPDATE netflix_new_episodes SET seen = 1 WHERE profile_id = ? AND seen = 0`).run(e),D(e)}function z(e,t){if(!w(e))throw Error(`Profile not found.`);return x(e).prepare(`DELETE FROM netflix_new_episodes WHERE profile_id = ? AND title_id = ?`).run(e,t),D(e)}var he=10*6e4,ge=100;function B(e=Date.now()){if(!Number.isFinite(e))throw Error(`Playback activity timestamp is invalid.`);return Math.max(0,Math.floor(e))}function V(e,t,n=128){if(!e||e!==e.trim()||e.length>n)throw Error(`${t} is invalid.`)}function H(e){try{let t={kind:`announce`,activity:{...JSON.parse(e.snapshot_json),sessionId:e.session_id,updatedAt:e.updated_at_ms}};return y(t)&&t.kind===`announce`?t.activity:void 0}catch{return}}function _e(e){try{let t={kind:`command`,sessionId:e.session_id,command:JSON.parse(e.command_json)};return y(t)&&t.kind===`command`?{id:e.id,sessionId:e.session_id,command:t.command,createdAt:e.created_at_ms}:void 0}catch{return}}function U(e,t){if(t)return t;for(let t of C())if(x(t.id).prepare(`SELECT 1 FROM playback_activity_sessions
|
|
86
|
+
WHERE session_id = ?`).get(e))return t.id}function W(e=Date.now(),t){let n=x(b(t)),r=B(e),i=r-l,a=r-he;return n.transaction(()=>{let e=n.prepare(`DELETE FROM playback_activity_commands
|
|
87
|
+
WHERE created_at_ms < ?`).run(a).changes;return{staleSessions:n.prepare(`DELETE FROM playback_activity_sessions
|
|
88
|
+
WHERE updated_at_ms < ?`).run(i).changes,oldCommands:e}})()}function ve(e,t=Date.now()){let n={kind:`announce`,activity:e};if(!y(n)||n.kind!==`announce`)throw Error(`Playback activity is invalid.`);if(V(e.sessionId,`Session ID`),V(e.profileId,`Profile ID`),V(e.titleId,`Title ID`,256),!w(e.profileId))throw Error(`Profile not found.`);let r=B(t),i={...e,updatedAt:r};return W(r,e.profileId),x(e.profileId).prepare(`INSERT INTO playback_activity_sessions (
|
|
89
|
+
session_id, profile_id, title_id, snapshot_json, updated_at_ms
|
|
90
|
+
) VALUES (?, ?, ?, ?, ?)
|
|
91
|
+
ON CONFLICT(session_id) DO UPDATE SET
|
|
92
|
+
profile_id = excluded.profile_id,
|
|
93
|
+
title_id = excluded.title_id,
|
|
94
|
+
snapshot_json = excluded.snapshot_json,
|
|
95
|
+
updated_at_ms = excluded.updated_at_ms`).run(i.sessionId,i.profileId,i.titleId,JSON.stringify(i),r),i}function ye(e,t=Date.now()){e!==void 0&&V(e,`Profile ID`);let n=b(e),r=x(n),i=B(t);W(i,n);let a=i-l,o=e?r.prepare(`SELECT session_id, snapshot_json, updated_at_ms
|
|
96
|
+
FROM playback_activity_sessions
|
|
97
|
+
WHERE profile_id = ? AND updated_at_ms >= ?
|
|
98
|
+
ORDER BY updated_at_ms DESC, session_id`).all(e,a):r.prepare(`SELECT session_id, snapshot_json, updated_at_ms
|
|
99
|
+
FROM playback_activity_sessions
|
|
100
|
+
WHERE updated_at_ms >= ?
|
|
101
|
+
ORDER BY updated_at_ms DESC, session_id`).all(a),s=[];for(let e of o){let t=H(e);t&&s.push(t)}return s}function be(e,t){V(e,`Session ID`),t!==void 0&&V(t,`Profile ID`);let n=U(e,t);return n?!!x(n).prepare(`DELETE FROM playback_activity_sessions
|
|
102
|
+
WHERE session_id = ?`).run(e).changes:!1}function xe(e,t,n=Date.now(),r){let i={kind:`command`,sessionId:e,command:t};if(!y(i)||i.kind!==`command`)throw Error(`Playback command is invalid.`);V(e,`Session ID`),r!==void 0&&V(r,`Profile ID`);let a=U(e,r);if(!a)throw Error(`Playback session not found.`);let o=B(n);W(o,a);let s=x(a);return s.transaction(()=>{let n=s.prepare(`SELECT session_id, snapshot_json, updated_at_ms
|
|
103
|
+
FROM playback_activity_sessions
|
|
104
|
+
WHERE session_id = ?`).get(e);if(!n)throw Error(`Playback session not found.`);let r=H(n);if(!r)throw Error(`Playback session is invalid.`);if(!u(r,t))throw Error(`Playback command is not supported for this session.`);let i=s.prepare(`INSERT INTO playback_activity_commands (
|
|
105
|
+
session_id, command_json, created_at_ms
|
|
106
|
+
) VALUES (?, ?, ?)`).run(e,JSON.stringify(t),o);return{id:Number(i.lastInsertRowid),sessionId:e,command:t,createdAt:o}})()}function Se(e,t,n=Date.now(),r){if(V(e,`Session ID`),r!==void 0&&V(r,`Profile ID`),!Number.isSafeInteger(t)||t<0)throw Error(`The command cursor must be a non-negative numeric ID.`);let i=U(e,r);if(!i)throw Error(`Playback session not found.`);W(B(n),i);let a=x(i);if(!a.prepare(`SELECT session_id FROM playback_activity_sessions
|
|
107
|
+
WHERE session_id = ?`).get(e))throw Error(`Playback session not found.`);let o=a.prepare(`SELECT id, session_id, command_json, created_at_ms
|
|
108
|
+
FROM playback_activity_commands
|
|
109
|
+
WHERE session_id = ? AND id > ?
|
|
110
|
+
ORDER BY id
|
|
111
|
+
LIMIT ?`).all(e,t,ge),s=[];for(let e of o){let t=_e(e);t&&s.push(t)}return{commands:s,cursor:o.length?o[o.length-1].id:t}}function G(e){let t=new Set(c.map(e=>e.id));return x(e).prepare(`SELECT id, name, base_url, priority, last_synced_at,
|
|
112
|
+
sync_status, last_error
|
|
113
|
+
FROM netflix_providers ORDER BY priority, rowid`).all().filter(e=>t.has(String(e.id))).map(e=>({id:e.id,name:String(e.name),baseUrl:String(e.base_url),priority:Number(e.priority),lastSyncedAt:e.last_synced_at??null,syncStatus:e.sync_status,lastError:e.last_error??null}))}function Ce(e,t){let n=x(t),r=G(t),i=new Set(r.map(e=>e.id)),a=new Set(e);if(e.length!==r.length||a.size!==e.length||e.some(e=>!i.has(e)))throw Error(`Provider order must include every source exactly once.`);let o=n.prepare(`UPDATE netflix_providers SET priority = ? WHERE id = ?`);return n.transaction(()=>{e.forEach((e,t)=>o.run(t,e))}).immediate(),G(t)}function we(e,t,n,r){x(r).prepare(`UPDATE netflix_providers
|
|
114
|
+
SET sync_status = ?, last_error = ?,
|
|
115
|
+
last_synced_at = CASE WHEN ? = 'idle' THEN ? ELSE last_synced_at END
|
|
116
|
+
WHERE id = ?`).run(t,n??null,t,new Date().toISOString(),e)}function K(e){try{let t=JSON.parse(e||`[]`);return Array.isArray(t)?t:[]}catch{return[]}}function q(e){try{let t=JSON.parse(e||`[]`);return Array.isArray(t)?t:[]}catch{return[]}}function Te(e,t){let n=K(e);return t?.length?n.length?t.map(e=>{let t=n.find(t=>t.id===e.id||t.episode===e.episode);if(!t)return e;let r=t.id===e.id&&t.watchUrl===e.watchUrl;return{...e,title:t.title||e.title,duration:t.duration||e.duration,synopsis:t.synopsis||e.synopsis,image:t.image||e.image,subtitles:e.subtitles?.length?e.subtitles:r?t.subtitles:void 0}}):t:n}function Ee(e,t=`metadata`,n){let r=b(n),i=new Date().toISOString(),a=Y(e.sourceUrl,r),o=Te(a?.episodes,e.episodes),s=e.subtitles?.length?e.subtitles:a&&a.watch_url===e.watchUrl?q(a.subtitles):[];return x(r).prepare(`INSERT INTO netflix_movies (
|
|
117
|
+
id, provider_id, source_url, watch_url, title, original_title, synopsis,
|
|
118
|
+
year, maturity_rating, duration, match_score, genres, cast, director,
|
|
119
|
+
subtitles, episodes, media_type, poster_image, backdrop_image,
|
|
120
|
+
accent_color, download_status, download_progress, created_at, updated_at
|
|
121
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
122
|
+
ON CONFLICT(source_url) DO UPDATE SET
|
|
123
|
+
watch_url = excluded.watch_url,
|
|
124
|
+
title = excluded.title,
|
|
125
|
+
original_title = excluded.original_title,
|
|
126
|
+
synopsis = excluded.synopsis,
|
|
127
|
+
year = excluded.year,
|
|
128
|
+
maturity_rating = excluded.maturity_rating,
|
|
129
|
+
duration = excluded.duration,
|
|
130
|
+
match_score = excluded.match_score,
|
|
131
|
+
genres = excluded.genres,
|
|
132
|
+
cast = excluded.cast,
|
|
133
|
+
director = excluded.director,
|
|
134
|
+
subtitles = excluded.subtitles,
|
|
135
|
+
episodes = excluded.episodes,
|
|
136
|
+
media_type = excluded.media_type,
|
|
137
|
+
poster_image = excluded.poster_image,
|
|
138
|
+
backdrop_image = excluded.backdrop_image,
|
|
139
|
+
accent_color = excluded.accent_color,
|
|
140
|
+
download_status = CASE
|
|
141
|
+
WHEN netflix_movies.download_status IN ('ready', 'queued', 'downloading')
|
|
142
|
+
THEN netflix_movies.download_status
|
|
143
|
+
ELSE excluded.download_status
|
|
144
|
+
END,
|
|
145
|
+
updated_at = excluded.updated_at`).run(e.id,e.providerId,e.sourceUrl,e.watchUrl??null,e.title,e.originalTitle??null,e.synopsis,e.year,e.maturityRating,e.duration,e.match,JSON.stringify(e.genres),JSON.stringify(e.cast),e.director??null,JSON.stringify(s),JSON.stringify(o),e.mediaType,e.posterImage,e.backdropImage,e.accentColor,t,0,i,i),J(e.id,r)??Y(e.sourceUrl,r)}function De(e,t,n){let r=x(n);r.transaction(()=>{let n=r.prepare(`SELECT episodes, subtitles FROM netflix_movies WHERE id = ?`).get(e);if(!n)return;let i=K(n.episodes);if(t.episode){let e=i.findIndex(e=>e.id===t.episode.id||e.episode===t.episode.episode);e>=0?i[e]={...i[e],...t.episode}:i.push(t.episode)}r.prepare(`UPDATE netflix_movies
|
|
146
|
+
SET episodes = ?, subtitles = ?
|
|
147
|
+
WHERE id = ?`).run(JSON.stringify(i),JSON.stringify(t.subtitles??q(n.subtitles)),e)})()}function Oe(e,t,n){x(n).prepare(`UPDATE netflix_movies SET
|
|
148
|
+
download_status = ?,
|
|
149
|
+
download_progress = COALESCE(?, download_progress),
|
|
150
|
+
download_error = ?,
|
|
151
|
+
playback_path = COALESCE(?, playback_path),
|
|
152
|
+
playback_kind = COALESCE(?, playback_kind),
|
|
153
|
+
updated_at = ?
|
|
154
|
+
WHERE id = ?`).run(t.status,t.progress??null,t.error??null,t.playbackPath??null,t.playbackKind??null,new Date().toISOString(),e)}function J(e,t){return x(t).prepare(`SELECT * FROM netflix_movies WHERE id = ?`).get(e)}function Y(e,t){return x(t).prepare(`SELECT * FROM netflix_movies WHERE source_url = ?`).get(e)}function X(e){try{return JSON.parse(e)}catch{return[]}}function Z(e){try{return JSON.parse(e)}catch{return[]}}function ke(e){try{return JSON.parse(e)}catch{return[]}}function Q(e){return{id:e.id,title:e.title,originalTitle:e.original_title??void 0,synopsis:e.synopsis,year:e.year,maturityRating:e.maturity_rating,duration:e.duration,match:e.match_score,genres:X(e.genres),cast:X(e.cast),subtitles:ke(e.subtitles),episodes:Z(e.episodes),director:e.director??void 0,mediaType:e.media_type===`series`?`series`:`movie`,isHD:!0,isNew:!0,posterImage:e.poster_image,backdropImage:e.backdrop_image,accentColor:e.accent_color,sourceProvider:e.provider_id,sourceUrl:e.source_url,downloadStatus:e.download_status,downloadProgress:e.download_progress,downloadError:e.download_error??void 0,canStream:!!e.watch_url,playbackPath:e.playback_path??void 0,playbackKind:e.playback_kind}}function Ae(e){return x(e).prepare(`SELECT * FROM netflix_movies ORDER BY updated_at DESC LIMIT 160`).all().map(Q)}function $(e){return{titleId:e.title_id,markerType:e.marker_type,timeSeconds:e.time_seconds,updatedAt:e.updated_at}}function je(e,t){return x(t).prepare(`SELECT title_id, marker_type, time_seconds, updated_at
|
|
155
|
+
FROM netflix_title_markers WHERE title_id = ?`).all(e).map($)}function Me(e,t,n,r){if(!e)throw Error(`Title ID is required.`);if(t!==`intro`&&t!==`outro`)throw Error(`Marker type must be 'intro' or 'outro'.`);if(!Number.isFinite(n)||n<0)throw Error(`Time must be a non-negative number.`);let i=new Date().toISOString();return x(r).prepare(`INSERT INTO netflix_title_markers (
|
|
156
|
+
title_id, marker_type, time_seconds, updated_at
|
|
157
|
+
) VALUES (?, ?, ?, ?)
|
|
158
|
+
ON CONFLICT(title_id, marker_type) DO UPDATE SET
|
|
159
|
+
time_seconds = excluded.time_seconds,
|
|
160
|
+
updated_at = excluded.updated_at`).run(e,t,n,i),{titleId:e,markerType:t,timeSeconds:n,updatedAt:i}}function Ne(e,t,n){return!!x(n).prepare(`DELETE FROM netflix_title_markers
|
|
161
|
+
WHERE title_id = ? AND marker_type = ?`).run(e,t).changes}export{de as A,Se as C,Me as D,ue as E,oe as F,Ee as I,ve as L,we as M,N,fe as O,Oe as P,y as R,F as S,Q as T,L as _,Ne as a,M as b,be as c,J as d,D as f,Ae as g,S as h,se as i,Ce as j,ie as k,xe as l,je as m,De as n,P as o,G as p,ae as r,z as s,j as t,T as u,ye as v,I as w,R as x,C as y,c as z};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as e}from"./storage-
|
|
1
|
+
import{a as e}from"./storage-fxaUbjG1.js";import t from"node:path";import{mkdirSync as n}from"node:fs";function r(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function i(e,t,n=!0){return typeof e==`string`&&e.length<=t&&(!n||e.trim().length>0)}function a(e){if(!(!r(e)||!i(e.from,100)||!i(e.to,100)||!i(e.accent,100)||!i(e.glyph,20)))return{from:e.from,to:e.to,accent:e.accent,glyph:e.glyph}}function o(e,t){if(e!=null)return i(e,t)?e:null}function s(e){if(!r(e))return null;if(e.kind===`track`&&r(e.track)){let t=e.track,n=o(t.imageUrl,8192),r=o(t.provider,200),s=a(t.palette);return!i(t.id,256)||!i(t.title,500)||!i(t.artist,500)||!i(t.album,500)||typeof t.durationSec!=`number`||!Number.isFinite(t.durationSec)||t.durationSec<0||t.durationSec>86400||n===null||r===null?null:{kind:`track`,track:{id:t.id,title:t.title,artist:t.artist,album:t.album,durationSec:t.durationSec,...n?{imageUrl:n}:{},...r?{provider:r}:{},...s?{palette:s}:{}}}}if(e.kind===`playlist`&&r(e.playlist)){let t=e.playlist,n=o(t.imageUrl,8192),r=o(t.provider,200),s=a(t.palette);return!i(t.id,256)||!i(t.title,500)||!i(t.description,2e3,!1)||!i(t.curator,500)||typeof t.trackCount!=`number`||!Number.isSafeInteger(t.trackCount)||t.trackCount<0||t.trackCount>1e5||n===null||r===null?null:{kind:`playlist`,playlist:{id:t.id,title:t.title,description:t.description,curator:t.curator,trackCount:t.trackCount,...n?{imageUrl:n}:{},...r?{provider:r}:{},...s?{palette:s}:{}}}}return null}var c=process.env.HOME_ATOM_SPOTIFY_DATA_DIR?.trim(),l=c?t.resolve(c):t.join(process.cwd(),`data`),u=t.join(l,`music`);n(u,{recursive:!0});function d(e,t=``){return typeof e==`string`?e:t}function f(e){return typeof e==`string`?e:null}function p(e,t=0){return typeof e==`number`?e:t}function m(e){return{id:d(e.id),name:d(e.name),homeUrl:d(e.home_url),syncStatus:d(e.sync_status,`idle`),lastSyncedAt:f(e.last_synced_at),itemCount:p(e.item_count),error:f(e.last_error)}}function h(t){return e(t).prepare(`SELECT p.*,
|
|
2
2
|
(SELECT COUNT(*) FROM spotify_homepage_items h
|
|
3
3
|
WHERE h.provider_id = p.id)
|
|
4
4
|
AS item_count
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{P as e,d as t,u as n}from"./database-D79CeUrn.js";import{i as r,n as i,u as a}from"./providers-DwLUa_U_.js";import o from"node:path";import{createWriteStream as s,existsSync as c,mkdirSync as l,writeFileSync as u}from"node:fs";import{tmpdir as d}from"node:os";import{spawn as f}from"node:child_process";import{createHash as p}from"node:crypto";import{Readable as m,Transform as h}from"node:stream";import{createServer as g}from"node:http";import{pipeline as _}from"node:stream/promises";var v=new Set,y=process.env.NETFLIX_ATOM_DATA_DIR||o.join(process.cwd(),[`da`,`ta`].join(``));function b(e){return p(`sha256`).update(e).digest(`hex`).slice(0,24)}function x(e){let t=[...e.matchAll(/data-link=["']([^"']+)["']/g),...e.matchAll(/(?:file|source)\s*:\s*["'](https?:\/\/[^"']+)["']/g)].map(e=>e[1].replace(/\\\//g,`/`)),n=e.match(/const\s+_0xS\s*=\s*["']([^"']+)["']/)?.[1],r=e.match(/JSON\.parse\(atob\(["']([A-Za-z0-9+/=]+)["']\)\)/)?.[1];if(!n||!r)return[...new Set(t)];try{let e=JSON.parse(Buffer.from(r,`base64`).toString(`utf8`));for(let r of Object.values(e)){if(!Array.isArray(r))continue;let e=r.join(``).split(``).reverse().join(``).replace(n,``),i=Buffer.from(e,`base64`).toString(`utf8`);i&&t.push(i)}}catch{}return[...new Set(t)]}function S(e){return x(e)[0]||``}function C(){return[process.env.CHROME_PATH,`/Applications/Google Chrome.app/Contents/MacOS/Google Chrome`,`/usr/bin/google-chrome`,`/usr/bin/chromium`,`/usr/bin/chromium-browser`].filter(Boolean).find(c)}async function w(e,t,n){let r=C();if(!r)throw Error(`Google Chrome or Chromium is required to decode this provider's protected playlist.`);let a=await i(e),s=a.match(/[,;]([\w$]+)=\{async\s+["']decryptM3U8["']\s*\(/)?.[1],c=a.match(/\},([\w$]+)=\{async\s+["']getStreamURL["']\s*\(/);if(!s||!c)throw Error(`The provider changed its player format. Please try again later.`);let u=a.replace(c[0],`};window.__netflixAtomDecryptor=${s};const ${c[1]}={async 'getStreamURL'(`);return new Promise((e,i)=>{let a=!1,s,c=(t,n)=>{a||(a=!0,s?.kill(`SIGTERM`),p.closeAllConnections?.(),p.close(),t?i(t):e(n||``))},p=g(async(e,r)=>{if(e.url===`/`){r.setHeader(`content-type`,`text/html; charset=utf-8`),r.end(`<!doctype html><html><body>
|
|
2
2
|
<script>
|
|
3
3
|
window.videoHash = ${JSON.stringify(n)};
|
|
4
4
|
window.streamURL = "";
|
|
@@ -17,5 +17,5 @@ import{C as e,c as t,s as n}from"./database-BNnYfHmT.js";import{i as r,n as i,u
|
|
|
17
17
|
}
|
|
18
18
|
});
|
|
19
19
|
<\/script>
|
|
20
|
-
</body></html>`);return}if(e.url===`/player.js`){r.setHeader(`content-type`,`application/javascript`),r.end(u);return}if(e.url===`/encrypted`){r.setHeader(`content-type`,`text/plain`),r.end(t);return}if(e.url===`/result`&&e.method===`POST`){let t=[];for await(let n of e)t.push(Buffer.from(n));let n=Buffer.concat(t).toString(`utf8`);r.end(`ok`),n===`NULL`||n.startsWith(`ERROR `)?c(Error(n.startsWith(`ERROR `)?`The provider playlist could not be decoded: ${n.slice(6)}`:`The provider playlist could not be decoded.`)):c(void 0,n);return}r.statusCode=404,r.end()});p.listen(0,`127.0.0.1`,()=>{let e=p.address();if(!e||typeof e==`string`){c(Error(`Could not start the local playlist decoder.`));return}let t=o.join(d(),`netflix-atom-chrome-${process.pid}-${Date.now()}`);l(t,{recursive:!0}),s=f(r,[`--headless=new`,`--disable-gpu`,`--no-sandbox`,`--mute-audio`,`--user-data-dir=${t}`,`http://127.0.0.1:${e.port}/`],{stdio:`ignore`}),s.once(`error`,e=>c(e))}),setTimeout(()=>c(Error(`The provider playlist decoder timed out.`)),45e3).unref()})}async function T(e,t,n){if(!e.includes(`/player/assets/scripts.php`))return null;let i=new URL(t).pathname.match(/\/(?:video|embed)\/([a-zA-Z0-9_-]{16,})(?:\/|$)/)?.[1]||e.match(/FirePlayer\(\s*["']([^"']+)["']/)?.[1];if(!i)return null;let a=new URL(`/player/index.php`,t);a.searchParams.set(`data`,i),a.searchParams.set(`do`,`getVideo`);let o=await fetch(a,{method:`POST`,headers:{...r(t,a.toString()),"content-type":`application/x-www-form-urlencoded; charset=UTF-8`,"x-requested-with":`XMLHttpRequest`},body:new URLSearchParams({hash:i,r:n}),signal:AbortSignal.timeout(3e4)});if(!o.ok)throw Error(`The FirePlayer API returned HTTP ${o.status}.`);let s;try{s=JSON.parse(await o.text())}catch{throw Error(`The FirePlayer API returned an invalid response.`)}let c=[...new Set([s.videoSource,s.securedLink].filter(e=>!!e))];if(!c.length)throw Error(`The FirePlayer API did not expose a media source.`);let l;for(let e of c){let n=new URL(e,t).toString();if(/\.(?:mp4|mkv|webm)(?:$|\?)/i.test(n))return{kind:`file`,url:n,referer:t};try{let e=await fetch(n,{headers:r(t,n),signal:AbortSignal.timeout(3e4)});if(!e.ok)throw Error(`The FirePlayer playlist returned HTTP ${e.status}.`);let i=await e.text();if(!i.trimStart().startsWith(`#EXTM3U`))throw Error(`The FirePlayer media source is not a valid HLS playlist.`);return{kind:`hls`,playlist:i,baseUrl:n,referer:t}}catch(e){l=e instanceof Error?e:Error(`The FirePlayer playlist could not be loaded.`)}}throw l??Error(`The FirePlayer playlist could not be loaded.`)}async function E(e,t){let n=new URL(e,t).toString(),o=new URL(n).searchParams.get(`link`);if(o&&(n=new URL(o,n).toString()),n=new URL(n,t).toString(),/\.(?:mp4|mkv|webm)(?:$|\?)/i.test(n))return{kind:`file`,url:n,referer:t};if(/\.(?:m3u8|txt)(?:$|\?)/i.test(n)&&!n.includes(`/embed`)){let e=await fetch(n,{headers:r(t,n),signal:AbortSignal.timeout(3e4)});if(!e.ok)throw Error(`The media playlist returned HTTP ${e.status}.`);return{kind:`hls`,playlist:await e.text(),baseUrl:n,referer:t}}let s=await i(n,t),c=a(s),l=await T(s,n,t);if(l)return l;let u=c(`#player[data-obf]`).attr(`data-obf`);if(!u){let e=c(`iframe[src]`).first().attr(`src`)||s.match(/https?:\/\/[^"' ]+\.(?:m3u8|mp4)(?:\?[^"' ]*)?/i)?.[0];if(e&&e!==n)return
|
|
21
|
-
`)),{path:`${d}/index.m3u8`,kind:`hls`}}async function
|
|
20
|
+
</body></html>`);return}if(e.url===`/player.js`){r.setHeader(`content-type`,`application/javascript`),r.end(u);return}if(e.url===`/encrypted`){r.setHeader(`content-type`,`text/plain`),r.end(t);return}if(e.url===`/result`&&e.method===`POST`){let t=[];for await(let n of e)t.push(Buffer.from(n));let n=Buffer.concat(t).toString(`utf8`);r.end(`ok`),n===`NULL`||n.startsWith(`ERROR `)?c(Error(n.startsWith(`ERROR `)?`The provider playlist could not be decoded: ${n.slice(6)}`:`The provider playlist could not be decoded.`)):c(void 0,n);return}r.statusCode=404,r.end()});p.listen(0,`127.0.0.1`,()=>{let e=p.address();if(!e||typeof e==`string`){c(Error(`Could not start the local playlist decoder.`));return}let t=o.join(d(),`netflix-atom-chrome-${process.pid}-${Date.now()}`);l(t,{recursive:!0}),s=f(r,[`--headless=new`,`--disable-gpu`,`--no-sandbox`,`--mute-audio`,`--user-data-dir=${t}`,`http://127.0.0.1:${e.port}/`],{stdio:`ignore`}),s.once(`error`,e=>c(e))}),setTimeout(()=>c(Error(`The provider playlist decoder timed out.`)),45e3).unref()})}async function T(e,t,n){if(!e.includes(`/player/assets/scripts.php`))return null;let i=new URL(t).pathname.match(/\/(?:video|embed)\/([a-zA-Z0-9_-]{16,})(?:\/|$)/)?.[1]||e.match(/FirePlayer\(\s*["']([^"']+)["']/)?.[1];if(!i)return null;let a=new URL(`/player/index.php`,t);a.searchParams.set(`data`,i),a.searchParams.set(`do`,`getVideo`);let o=await fetch(a,{method:`POST`,headers:{...r(t,a.toString()),"content-type":`application/x-www-form-urlencoded; charset=UTF-8`,"x-requested-with":`XMLHttpRequest`},body:new URLSearchParams({hash:i,r:n}),signal:AbortSignal.timeout(3e4)});if(!o.ok)throw Error(`The FirePlayer API returned HTTP ${o.status}.`);let s;try{s=JSON.parse(await o.text())}catch{throw Error(`The FirePlayer API returned an invalid response.`)}let c=[...new Set([s.videoSource,s.securedLink].filter(e=>!!e))];if(!c.length)throw Error(`The FirePlayer API did not expose a media source.`);let l;for(let e of c){let n=new URL(e,t).toString();if(/\.(?:mp4|mkv|webm)(?:$|\?)/i.test(n))return{kind:`file`,url:n,referer:t};try{let e=await fetch(n,{headers:r(t,n),signal:AbortSignal.timeout(3e4)});if(!e.ok)throw Error(`The FirePlayer playlist returned HTTP ${e.status}.`);let i=await e.text();if(!i.trimStart().startsWith(`#EXTM3U`))throw Error(`The FirePlayer media source is not a valid HLS playlist.`);return{kind:`hls`,playlist:i,baseUrl:n,referer:t}}catch(e){l=e instanceof Error?e:Error(`The FirePlayer playlist could not be loaded.`)}}throw l??Error(`The FirePlayer playlist could not be loaded.`)}async function E(e,t){let n=new URL(e,t).toString(),o=new URL(n).searchParams.get(`link`);if(o&&(n=new URL(o,n).toString()),n=new URL(n,t).toString(),/\.(?:mp4|mkv|webm)(?:$|\?)/i.test(n))return{kind:`file`,url:n,referer:t};if(/\.(?:m3u8|txt)(?:$|\?)/i.test(n)&&!n.includes(`/embed`)){let e=await fetch(n,{headers:r(t,n),signal:AbortSignal.timeout(3e4)});if(!e.ok)throw Error(`The media playlist returned HTTP ${e.status}.`);return{kind:`hls`,playlist:await e.text(),baseUrl:n,referer:t}}let s=await i(n,t),c=a(s),l=await T(s,n,t);if(l)return l;let u=c(`#player[data-obf]`).attr(`data-obf`);if(!u){let e=c(`iframe[src]`).first().attr(`src`)||s.match(/https?:\/\/[^"' ]+\.(?:m3u8|mp4)(?:\?[^"' ]*)?/i)?.[0];if(e&&e!==n)return k(new URL(e,n).toString());throw Error(`The embedded provider player did not expose a media source.`)}let d=JSON.parse(Buffer.from(u,`base64`).toString(`utf8`)),f=new URL(`/${d.sUb}?d=1`,n).toString(),p=await fetch(f,{headers:r(n,f),signal:AbortSignal.timeout(3e4)});if(!p.ok)throw Error(`The encrypted playlist returned HTTP ${p.status}.`);let m=await p.text();if(m.trimStart().startsWith(`#EXTM3U`)&&!m.includes(`#ENC-AESGCM`))return{kind:`hls`,playlist:m,baseUrl:f,referer:n};let h=c(`script[src]`).map((e,t)=>c(t).attr(`src`)||``).get().find(e=>{try{return new URL(e,n).pathname.endsWith(`/player.js`)}catch{return!1}});return{kind:`hls`,playlist:await w(new URL(h||`/player.js`,n).toString(),m,d.hD),baseUrl:f,referer:n}}async function D(e,t){let n=new URL(t).hostname;if(n!==`hh3d.com`&&n!==`www.hh3d.com`)return null;let o=a(e)(`[data-link]`).first().attr(`data-link`);if(!o)return null;let s=new URL(o,t).toString(),c=a(await i(s))(`#player[data-obf]`).attr(`data-obf`);if(!c)return null;let l=``;try{let e=JSON.parse(Buffer.from(c,`base64`).toString(`utf8`));l=typeof e.pU==`string`?e.pU.trim():``}catch{throw Error(`HH3D returned invalid player metadata.`)}if(!l)throw Error(`HH3D did not expose a playable stream.`);let u=new URL(l,s).toString(),d=await fetch(u,{headers:r(s,u),signal:AbortSignal.timeout(3e4)});if(!d.ok)throw Error(`The HH3D playlist returned HTTP ${d.status}.`);let f=await d.text();if(!f.trimStart().startsWith(`#EXTM3U`))throw Error(`HH3D returned an invalid media playlist.`);return{kind:`hls`,playlist:f,baseUrl:u,referer:s}}async function O(e,t,n){let i=new URL(t).hostname;if(i!==`hhpanda.st`&&i!==`www.hhpanda.st`)return null;let o=a(e),s=new URL(t).pathname,c=o(`.halim-episode.active a[data-post-id]`).first().get(0)||o(`.halim-episode a[data-post-id]`).toArray().find(e=>{let n=o(e).attr(`href`);return n?new URL(n,t).pathname===s:!1})||o(`.halim-episode a[data-post-id]`).first().get(0);if(!c)return null;let l=o(c),u=l.attr(`data-post-id`)?.trim(),d=l.attr(`data-ep`)?.trim(),f=l.attr(`data-sv`)?.trim(),p=[...new Map(o(`#halim-ajax-list-server .get-eps[data-type]`).toArray().flatMap(e=>{let t=o(e),n=t.attr(`data-type`)?.trim();return n?[[n,{id:n,label:t.text().replace(/\s+/g,` `).trim()||n}]]:[]})).values()],m=p.find(e=>/4\s*k/i.test(e.label))||p[0],h=p.find(e=>e.id===n)||m,g=h?.id||`pro`;if(!u||!d||!f)return null;let _=new URL(`/player/player.php`,t);_.search=new URLSearchParams({action:`dox_ajax_player`,post_id:u,chapter_st:d,type:g,sv:f}).toString();let v=await fetch(_,{cache:`no-store`,headers:{...r(t,_.toString()),"x-requested-with":`XMLHttpRequest`},signal:AbortSignal.timeout(3e4)});if(!v.ok)throw Error(`The HHPanda player returned HTTP ${v.status}.`);let y=a(await v.text())(`iframe[src]`).first().attr(`src`);if(!y)throw Error(`HHPanda did not expose a player.`);let b=new URL(y,_).toString(),x=new URL(b);if(x.protocol!==`https:`||x.hostname!==`streamfree.vip`&&x.hostname!==`www.streamfree.vip`)throw Error(`HHPanda returned an unsupported player.`);return{kind:`embed`,url:b,referer:t,servers:p,server:h?.id}}async function k(e,t,n){let r=t??await i(e),o=await D(r,e);if(o)return o;let s=await O(r,e,n);if(s)return s;let c=a(r),l=x(r),u=c(`iframe[src]`).first().attr(`src`)||c(`video source[src]`).first().attr(`src`);if(u&&l.push(u),!l.length)throw Error(`No playable source was found on the movie page.`);let d;for(let t of[...new Set(l)])try{return await E(t,e)}catch(e){d=e instanceof Error?e:Error(`The provider media source could not be loaded.`)}throw d??Error(`The provider media source could not be loaded.`)}async function A(t,n,i,a,c,l){let u=await fetch(n,{headers:r(i,n),signal:AbortSignal.timeout(3e4)});if(!u.ok||!u.body)throw Error(`The movie file returned HTTP ${u.status}.`);let d=new URL(n).pathname.match(/\.(mp4|webm|mkv)$/i)?.[1]||`mp4`,f=o.join(a,`movie.${d}`),p=Number(u.headers.get(`content-length`)||0),g=0,v=0,y=new h({transform(n,r,i){if(g+=n.length,p){let n=Math.min(99,Math.round(g/p*100));n>=v+2&&(v=n,e(t,{status:`downloading`,progress:n},c))}i(null,n)}});return await _(m.fromWeb(u.body),y,s(f)),{path:`${l}/movie.${d}`,kind:`file`}}async function j(e,t,n){if(!e.includes(`#EXT-X-STREAM-INF`))return{playlist:e,baseUrl:t};let i=e.split(/\r?\n/),a=[];i.forEach((e,n)=>{if(!e.startsWith(`#EXT-X-STREAM-INF`))return;let r=Number(e.match(/BANDWIDTH=(\d+)/)?.[1]||0),o=i.slice(n+1).find(e=>e&&!e.startsWith(`#`));o&&a.push({bandwidth:r,url:new URL(o,t).toString()})});let o=a.sort((e,t)=>t.bandwidth-e.bandwidth)[0];if(!o)throw Error(`The HLS master playlist has no variants.`);let s=await fetch(o.url,{headers:r(n,o.url),signal:AbortSignal.timeout(3e4)});if(!s.ok)throw Error(`The HLS variant returned HTTP ${s.status}.`);return{playlist:await s.text(),baseUrl:o.url}}async function M(e,t){let n;for(let i=1;i<=3;i+=1)try{let n=await fetch(e,{headers:r(t,e),signal:AbortSignal.timeout(3e4)});if(!n.ok)throw Error(`Media segment returned HTTP ${n.status}.`);return Buffer.from(await n.arrayBuffer())}catch(e){n=e instanceof Error?e:Error(`Media segment download failed.`),i<3&&await new Promise(e=>setTimeout(e,i*500))}throw n??Error(`Media segment download failed.`)}async function N(t,n,r,i,a,s,d){let{playlist:f,baseUrl:p}=await j(n,r,i),m=f.split(/\r?\n/),h=m.map((e,t)=>({line:e.trim(),index:t})).filter(e=>e.line&&!e.line.startsWith(`#`));if(!h.length)throw Error(`The HLS playlist contains no media segments.`);let g=o.join(a,`segments`);l(g,{recursive:!0});let _=[...m],v=0,y=0,b=Array.from({length:Math.min(6,h.length)},async()=>{for(;y<h.length;){let n=h[y++],r=new URL(n.line,p).toString(),a=`${String(n.index).padStart(6,`0`)}.ts`;_[n.index]=`segments/${a}`;let l=o.join(g,a);c(l)||u(l,await M(r,i)),v+=1,(v%5==0||v===h.length)&&e(t,{status:`downloading`,progress:Math.min(99,Math.round(v/h.length*100))},s)}});return await Promise.all(b),u(o.join(a,`index.m3u8`),_.join(`
|
|
21
|
+
`)),{path:`${d}/index.m3u8`,kind:`hls`}}async function P(n,r){let i=t(n,r);if(!i?.watch_url)throw Error(`This movie has no watch page.`);let a=b(r),s=b(n),c=o.join(y,`movies`,a,s),u=`/api/netflix/media/${a}/${s}`;l(c,{recursive:!0}),e(n,{status:`downloading`,progress:1,error:null},r);let d=await k(i.watch_url);if(d.kind===`embed`)throw Error(`This provider supports streaming but not offline downloads.`);let f=d.kind===`file`?await A(n,d.url,d.referer,c,r,u):await N(n,d.playlist,d.baseUrl,d.referer,c,r,u);e(n,{status:`ready`,progress:100,playbackPath:f.path,playbackKind:f.kind,error:null},r)}function F(t,r){let i=r??n().id,a=`${i}:${t}`;v.has(a)||(v.add(a),P(t,i).catch(n=>{e(t,{status:`failed`,progress:0,error:n instanceof Error?n.message:`Movie download failed.`},i)}).finally(()=>v.delete(a)))}function I(e,t){let n=o.resolve(y,`movies`,e),r=o.resolve(n,t);return!r.startsWith(`${n}${o.sep}`)&&r!==n?null:c(r)?r:null}export{k as i,I as n,F as r,S as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{I as e,S as t,T as n,b as r,d as i,o as a,t as o,w as s}from"./database-D79CeUrn.js";import{o as c}from"./storage-fxaUbjG1.js";import{a as l}from"./providers-DwLUa_U_.js";var u=60*6e4,d=14400*6e4,f=750,p=globalThis,m=p.homeAtomEpisodeSyncStateV1??{timer:null,running:!1,lastSummary:null};p.homeAtomEpisodeSyncStateV1=m;function h(e){return`${e.season}:${e.episode}`}function g(e,t){if(!e)return!1;let n=Date.parse(e);return!Number.isNaN(n)&&t-n>=d}async function _(r,o,c,l){let{titleId:u}=o,d=i(u,r);if(!d?.source_url)return a(r,u),{profileId:r,titleId:u,newEpisodes:0,untracked:!0};let f=n(d).episodes??[],p=new Set(f.map(h)),m=[];try{let t=await l(d.source_url);e(t,d.download_status,r),m=t.episodes??[]}catch(e){return{profileId:r,titleId:u,newEpisodes:0,untracked:!1,error:e instanceof Error?e.message:`Episode sync failed.`}}let _=m.filter(e=>!p.has(h(e))),v=m.length?m:f;_.length&&s(r,u,_.map(e=>({season:e.season,episode:e.episode,title:e.title}))),t(r,u,{lastEpisodeNumber:v.reduce((e,t)=>Math.max(e,t.episode),0),lastEpisodeCount:v.length,foundNewEpisode:_.length>0});let y=_.length===0&&g(o.lastNewEpisodeAt??o.trackedAt,c);return y&&a(r,u),{profileId:r,titleId:u,newEpisodes:_.length,untracked:y}}async function v(e,t={}){let n=t.scrape??l,i=t.requestDelayMs??f,a=new Date().toISOString(),s=Date.now(),u=e?[e]:c().map(e=>e.id),d=[];for(let e of u){let t;try{o(e),t=r(e)}catch{continue}for(let[r,a]of t.entries())r>0&&i>0&&await new Promise(e=>setTimeout(e,i)),d.push(await _(e,a,s,n))}let p={startedAt:a,finishedAt:new Date().toISOString(),checked:d.length,newEpisodes:d.reduce((e,t)=>e+t.newEpisodes,0),untracked:d.filter(e=>e.untracked).length,results:d};return m.lastSummary=p,p}async function y(e,t={}){if(m.running)return null;m.running=!0;try{return await v(e,t)}finally{m.running=!1}}function b(){return m.lastSummary}function x(){if(m.timer)return;let e=setInterval(()=>{y().catch(()=>{})},u);e.unref?.(),m.timer=e}export{y as i,x as n,b as r,u as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e,n as t,o as n,s as r}from"./cache-headers-
|
|
1
|
+
import{i as e,n as t,o as n,s as r}from"./cache-headers-lY59goLh.js";function i(e){return{effectiveRevalidate:e.cacheControlMeta?.revalidate??e.revalidateSeconds,effectiveExpire:e.cacheControlMeta===void 0?void 0:e.cacheControlMeta.expire??e.expireSeconds}}function a(r,i,a,o){if(i===`app-route`){if(a===0)return t;if(a===1/0)return e}return n(r,a,o)}function o(e){if(e.cacheState===`MISS`)return{disposition:`MISS`,scheduleRegeneration:!1,cacheControl:``};let{effectiveRevalidate:t,effectiveExpire:n}=i(e);return e.cacheState===`HIT`?{disposition:`HIT`,scheduleRegeneration:!1,cacheControl:a(`HIT`,e.kind,t,n)}:{disposition:`STALE`,scheduleRegeneration:!0,cacheControl:a(`STALE`,e.kind,t,n)}}function s(n,i){return n===0?t:n===1/0?e:r(n,i)}export{o as n,s as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./framework~index~layout~layout~page~page~page~layout~page~app-page-cache-render~app-page-cac~nvd6h53m-ydvR7YSg.js";import{P as t}from"../../index.js";import{f as n,g as r,p as i,t as a,u as o,y as s}from"./database-D79CeUrn.js";import{n as c,r as l}from"./catalog-BS93IoWO.js";import{n as u}from"./episode-sync-Ct5CeY25.js";var d=t(()=>{throw Error(`Unexpectedly client reference export 'NetflixBrowser' is called on server`)},`278c117307e7`,`NetflixBrowser`),f=e();function p({initialSearchOpen:e=!1,initialSearchQuery:t=``}){let p=o();return u(),a(p.id),(0,f.jsx)(d,{featured:l,rows:c,initialImportedTitles:r(p.id),initialProviders:i(p.id),initialProfiles:s(),initialActiveProfile:p,initialProfileLibrary:n(p.id),initialSearchOpen:e,initialSearchQuery:t})}export{p as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./framework~index~layout~layout~page~page~page~layout~page~app-page-cache-render~app-page-cac~nvd6h53m-ydvR7YSg.js";import{t}from"./netflix-page-
|
|
1
|
+
import{t as e}from"./framework~index~layout~layout~page~page~page~layout~page~app-page-cache-render~app-page-cac~nvd6h53m-ydvR7YSg.js";import{t}from"./netflix-page-Cpp2PgD1.js";var n=e(),r=`force-dynamic`,i=`nodejs`;async function a({searchParams:e}){let{q:r}=await e;return(0,n.jsx)(t,{initialSearchOpen:!0,initialSearchQuery:Array.isArray(r)?r[0]??``:r??``})}export{a as default,r as dynamic,i as runtime};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./framework~index~layout~layout~page~page~page~layout~page~app-page-cache-render~app-page-cac~nvd6h53m-ydvR7YSg.js";import{P as t}from"../../index.js";import{
|
|
1
|
+
import{t as e}from"./framework~index~layout~layout~page~page~page~layout~page~app-page-cache-render~app-page-cac~nvd6h53m-ydvR7YSg.js";import{P as t}from"../../index.js";import{u as n,y as r}from"./database-D79CeUrn.js";var i=t(()=>{throw Error(`Unexpectedly client reference export 'SpotifyApp' is called on server`)},`6fda1fc439ba`,`SpotifyApp`),a=e(),o=`nodejs`,s=`force-dynamic`;function c(){return(0,a.jsx)(i,{initialProfiles:r(),initialActiveProfile:n()})}export{c as default,s as dynamic,o as runtime};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./framework~index~layout~layout~page~page~page~layout~page~app-page-cache-render~app-page-cac~nvd6h53m-ydvR7YSg.js";import{t}from"./netflix-page-
|
|
1
|
+
import{t as e}from"./framework~index~layout~layout~page~page~page~layout~page~app-page-cache-render~app-page-cac~nvd6h53m-ydvR7YSg.js";import{t}from"./netflix-page-Cpp2PgD1.js";var n=e(),r=`force-dynamic`,i=`nodejs`;function a(){return(0,n.jsx)(t,{})}export{a as default,r as dynamic,i as runtime};
|