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
|
@@ -1,288 +0,0 @@
|
|
|
1
|
-
import e from"node:path";import{closeSync as t,existsSync as n,fsyncSync as r,lstatSync as i,mkdirSync as a,openSync as o,readFileSync as s,readdirSync as c,realpathSync as l,renameSync as u,rmSync as d,statSync as f,writeFileSync as p}from"node:fs";import{createHash as m,randomUUID as h}from"node:crypto";import g from"better-sqlite3";var _=process.env.HOME_ATOM_PROFILE_DATA_ROOT?.trim()||process.env.HOME_ATOM_PROFILE_DATA_DIR?.trim(),v=e.resolve(e.join(process.cwd(),[`da`,`ta`].join(``))),y=_?e.resolve(_):e.join(v,`home-atom-profile`),ee=process.env.HOME_ATOM_NETFLIX_DATA_DIR?.trim()?e.resolve(process.env.HOME_ATOM_NETFLIX_DATA_DIR.trim()):v,te=process.env.HOME_ATOM_SPOTIFY_DATA_DIR?.trim()?e.resolve(process.env.HOME_ATOM_SPOTIFY_DATA_DIR.trim()):v,ne=e.join(ee,`netflix-atom.sqlite`),re=e.join(te,`spotify-atom.sqlite`),b=e.join(y,`profiles.json`),x=e.join(y,`.profiles.lock`),S=e.join(x,`owner`),C=e.join(y,`.profiles-lock-recovery`),w=`database`,ie=`home-atom.sqlite`,T=1,ae=1,oe=6e4,se=6e4,ce=500,le=new Int32Array(new SharedArrayBuffer(4)),ue=[{id:`phimhdcss`,name:`PhimHDC`,baseUrl:`https://phimhdcss.com/`},{id:`fsharetv`,name:`FshareTV`,baseUrl:`https://fsharetv.com/`}],de=[{id:`zing-mp3`,name:`Zing MP3`,homeUrl:`https://zingmp3.vn/`},{id:`nhac-cua-tui`,name:`NhacCuaTui`,homeUrl:`https://www.nhaccuatui.com/`},{id:`tiktok`,name:`TikTok`,homeUrl:`https://www.tiktok.com/`},{id:`youtube`,name:`YouTube`,homeUrl:`https://www.youtube.com/`}],fe=globalThis,E=fe.homeAtomProfileStorageStateV1??{connections:new Map,initializedRoots:new Set};fe.homeAtomProfileStorageStateV1=E;var pe=`
|
|
2
|
-
CREATE TABLE IF NOT EXISTS schema_migrations (
|
|
3
|
-
id TEXT PRIMARY KEY,
|
|
4
|
-
applied_at TEXT NOT NULL
|
|
5
|
-
);
|
|
6
|
-
|
|
7
|
-
CREATE TABLE IF NOT EXISTS profiles (
|
|
8
|
-
id TEXT PRIMARY KEY,
|
|
9
|
-
name TEXT NOT NULL COLLATE NOCASE UNIQUE,
|
|
10
|
-
avatar_color TEXT NOT NULL,
|
|
11
|
-
created_at TEXT NOT NULL,
|
|
12
|
-
updated_at TEXT NOT NULL
|
|
13
|
-
);
|
|
14
|
-
|
|
15
|
-
CREATE TABLE IF NOT EXISTS netflix_providers (
|
|
16
|
-
id TEXT PRIMARY KEY,
|
|
17
|
-
name TEXT NOT NULL,
|
|
18
|
-
base_url TEXT NOT NULL,
|
|
19
|
-
last_synced_at TEXT,
|
|
20
|
-
sync_status TEXT NOT NULL DEFAULT 'idle',
|
|
21
|
-
last_error TEXT
|
|
22
|
-
);
|
|
23
|
-
|
|
24
|
-
CREATE TABLE IF NOT EXISTS netflix_movies (
|
|
25
|
-
id TEXT PRIMARY KEY,
|
|
26
|
-
provider_id TEXT NOT NULL,
|
|
27
|
-
source_url TEXT NOT NULL UNIQUE,
|
|
28
|
-
watch_url TEXT,
|
|
29
|
-
title TEXT NOT NULL,
|
|
30
|
-
original_title TEXT,
|
|
31
|
-
synopsis TEXT NOT NULL,
|
|
32
|
-
year INTEGER NOT NULL,
|
|
33
|
-
maturity_rating TEXT NOT NULL,
|
|
34
|
-
duration TEXT NOT NULL,
|
|
35
|
-
match_score INTEGER NOT NULL,
|
|
36
|
-
genres TEXT NOT NULL,
|
|
37
|
-
cast TEXT NOT NULL,
|
|
38
|
-
director TEXT,
|
|
39
|
-
subtitles TEXT NOT NULL DEFAULT '[]',
|
|
40
|
-
episodes TEXT NOT NULL DEFAULT '[]',
|
|
41
|
-
media_type TEXT NOT NULL,
|
|
42
|
-
poster_image TEXT NOT NULL,
|
|
43
|
-
backdrop_image TEXT NOT NULL,
|
|
44
|
-
accent_color TEXT NOT NULL,
|
|
45
|
-
playback_path TEXT,
|
|
46
|
-
playback_kind TEXT,
|
|
47
|
-
download_status TEXT NOT NULL DEFAULT 'metadata',
|
|
48
|
-
download_progress INTEGER NOT NULL DEFAULT 0,
|
|
49
|
-
download_error TEXT,
|
|
50
|
-
created_at TEXT NOT NULL,
|
|
51
|
-
updated_at TEXT NOT NULL
|
|
52
|
-
);
|
|
53
|
-
|
|
54
|
-
CREATE TABLE IF NOT EXISTS netflix_profile_title_state (
|
|
55
|
-
profile_id TEXT NOT NULL,
|
|
56
|
-
title_id TEXT NOT NULL,
|
|
57
|
-
in_my_list INTEGER NOT NULL DEFAULT 0,
|
|
58
|
-
liked INTEGER NOT NULL DEFAULT 0,
|
|
59
|
-
updated_at TEXT NOT NULL,
|
|
60
|
-
PRIMARY KEY (profile_id, title_id),
|
|
61
|
-
FOREIGN KEY (profile_id) REFERENCES profiles(id) ON DELETE CASCADE
|
|
62
|
-
);
|
|
63
|
-
|
|
64
|
-
CREATE TABLE IF NOT EXISTS netflix_watch_progress (
|
|
65
|
-
profile_id TEXT NOT NULL,
|
|
66
|
-
title_id TEXT NOT NULL,
|
|
67
|
-
season_number INTEGER NOT NULL DEFAULT 1,
|
|
68
|
-
episode_number INTEGER NOT NULL DEFAULT 1,
|
|
69
|
-
position_seconds REAL NOT NULL DEFAULT 0,
|
|
70
|
-
duration_seconds REAL NOT NULL DEFAULT 0,
|
|
71
|
-
completed INTEGER NOT NULL DEFAULT 0,
|
|
72
|
-
updated_at TEXT NOT NULL,
|
|
73
|
-
PRIMARY KEY (profile_id, title_id),
|
|
74
|
-
FOREIGN KEY (profile_id) REFERENCES profiles(id) ON DELETE CASCADE
|
|
75
|
-
);
|
|
76
|
-
|
|
77
|
-
CREATE TABLE IF NOT EXISTS netflix_subtitle_preferences (
|
|
78
|
-
profile_id TEXT PRIMARY KEY,
|
|
79
|
-
font_size INTEGER NOT NULL DEFAULT 32,
|
|
80
|
-
position_x REAL NOT NULL DEFAULT 50,
|
|
81
|
-
position_y REAL NOT NULL DEFAULT 78,
|
|
82
|
-
font_color TEXT NOT NULL DEFAULT '#ffffff',
|
|
83
|
-
background_color TEXT NOT NULL DEFAULT 'rgba(0,0,0,0.75)',
|
|
84
|
-
font_family TEXT NOT NULL DEFAULT 'default',
|
|
85
|
-
captions_on INTEGER NOT NULL DEFAULT 0,
|
|
86
|
-
updated_at TEXT NOT NULL,
|
|
87
|
-
FOREIGN KEY (profile_id) REFERENCES profiles(id) ON DELETE CASCADE
|
|
88
|
-
);
|
|
89
|
-
|
|
90
|
-
CREATE TABLE IF NOT EXISTS playback_activity_sessions (
|
|
91
|
-
session_id TEXT PRIMARY KEY,
|
|
92
|
-
profile_id TEXT NOT NULL,
|
|
93
|
-
title_id TEXT NOT NULL,
|
|
94
|
-
snapshot_json TEXT NOT NULL,
|
|
95
|
-
updated_at_ms INTEGER NOT NULL,
|
|
96
|
-
FOREIGN KEY (profile_id) REFERENCES profiles(id) ON DELETE CASCADE
|
|
97
|
-
);
|
|
98
|
-
|
|
99
|
-
CREATE TABLE IF NOT EXISTS playback_activity_commands (
|
|
100
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
101
|
-
session_id TEXT NOT NULL,
|
|
102
|
-
command_json TEXT NOT NULL,
|
|
103
|
-
created_at_ms INTEGER NOT NULL,
|
|
104
|
-
FOREIGN KEY (session_id)
|
|
105
|
-
REFERENCES playback_activity_sessions(session_id) ON DELETE CASCADE
|
|
106
|
-
);
|
|
107
|
-
|
|
108
|
-
CREATE TABLE IF NOT EXISTS spotify_providers (
|
|
109
|
-
id TEXT PRIMARY KEY,
|
|
110
|
-
name TEXT NOT NULL,
|
|
111
|
-
home_url TEXT NOT NULL,
|
|
112
|
-
sync_status TEXT NOT NULL DEFAULT 'idle',
|
|
113
|
-
last_synced_at TEXT,
|
|
114
|
-
last_error TEXT,
|
|
115
|
-
created_at TEXT NOT NULL,
|
|
116
|
-
updated_at TEXT NOT NULL
|
|
117
|
-
);
|
|
118
|
-
|
|
119
|
-
CREATE TABLE IF NOT EXISTS spotify_homepage_items (
|
|
120
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
121
|
-
provider_id TEXT NOT NULL
|
|
122
|
-
REFERENCES spotify_providers(id) ON DELETE CASCADE,
|
|
123
|
-
external_id TEXT NOT NULL,
|
|
124
|
-
kind TEXT NOT NULL,
|
|
125
|
-
title TEXT NOT NULL,
|
|
126
|
-
subtitle TEXT NOT NULL DEFAULT '',
|
|
127
|
-
image_url TEXT,
|
|
128
|
-
source_url TEXT,
|
|
129
|
-
position INTEGER NOT NULL,
|
|
130
|
-
payload_json TEXT,
|
|
131
|
-
synced_at TEXT NOT NULL,
|
|
132
|
-
UNIQUE(provider_id, external_id)
|
|
133
|
-
);
|
|
134
|
-
|
|
135
|
-
CREATE TABLE IF NOT EXISTS spotify_tracks (
|
|
136
|
-
id TEXT PRIMARY KEY,
|
|
137
|
-
provider_id TEXT NOT NULL REFERENCES spotify_providers(id),
|
|
138
|
-
external_id TEXT NOT NULL,
|
|
139
|
-
source_url TEXT NOT NULL UNIQUE,
|
|
140
|
-
title TEXT NOT NULL,
|
|
141
|
-
artist TEXT NOT NULL,
|
|
142
|
-
album TEXT NOT NULL DEFAULT '',
|
|
143
|
-
duration_sec INTEGER NOT NULL DEFAULT 0,
|
|
144
|
-
image_url TEXT,
|
|
145
|
-
audio_path TEXT,
|
|
146
|
-
audio_mime TEXT,
|
|
147
|
-
audio_bytes INTEGER,
|
|
148
|
-
download_status TEXT NOT NULL DEFAULT 'queued',
|
|
149
|
-
created_at TEXT NOT NULL,
|
|
150
|
-
updated_at TEXT NOT NULL,
|
|
151
|
-
UNIQUE(provider_id, external_id)
|
|
152
|
-
);
|
|
153
|
-
|
|
154
|
-
CREATE TABLE IF NOT EXISTS spotify_downloads (
|
|
155
|
-
id TEXT PRIMARY KEY,
|
|
156
|
-
source_url TEXT NOT NULL,
|
|
157
|
-
provider_id TEXT NOT NULL REFERENCES spotify_providers(id),
|
|
158
|
-
track_id TEXT REFERENCES spotify_tracks(id),
|
|
159
|
-
status TEXT NOT NULL,
|
|
160
|
-
progress INTEGER NOT NULL DEFAULT 0,
|
|
161
|
-
bytes_downloaded INTEGER NOT NULL DEFAULT 0,
|
|
162
|
-
total_bytes INTEGER,
|
|
163
|
-
error TEXT,
|
|
164
|
-
created_at TEXT NOT NULL,
|
|
165
|
-
updated_at TEXT NOT NULL
|
|
166
|
-
);
|
|
167
|
-
|
|
168
|
-
CREATE TABLE IF NOT EXISTS spotify_music_playlists (
|
|
169
|
-
id TEXT PRIMARY KEY,
|
|
170
|
-
provider_id TEXT NOT NULL REFERENCES spotify_providers(id),
|
|
171
|
-
external_id TEXT NOT NULL,
|
|
172
|
-
source_url TEXT NOT NULL UNIQUE,
|
|
173
|
-
title TEXT NOT NULL,
|
|
174
|
-
description TEXT NOT NULL DEFAULT '',
|
|
175
|
-
curator TEXT NOT NULL DEFAULT '',
|
|
176
|
-
image_url TEXT,
|
|
177
|
-
created_at TEXT NOT NULL,
|
|
178
|
-
updated_at TEXT NOT NULL,
|
|
179
|
-
UNIQUE(provider_id, external_id)
|
|
180
|
-
);
|
|
181
|
-
|
|
182
|
-
CREATE TABLE IF NOT EXISTS spotify_music_playlist_tracks (
|
|
183
|
-
playlist_id TEXT NOT NULL
|
|
184
|
-
REFERENCES spotify_music_playlists(id) ON DELETE CASCADE,
|
|
185
|
-
track_id TEXT NOT NULL REFERENCES spotify_tracks(id) ON DELETE CASCADE,
|
|
186
|
-
position INTEGER NOT NULL,
|
|
187
|
-
PRIMARY KEY(playlist_id, position)
|
|
188
|
-
);
|
|
189
|
-
|
|
190
|
-
CREATE TABLE IF NOT EXISTS spotify_recently_played (
|
|
191
|
-
kind TEXT NOT NULL CHECK(kind IN ('track', 'playlist')),
|
|
192
|
-
item_id TEXT NOT NULL,
|
|
193
|
-
item_json TEXT NOT NULL,
|
|
194
|
-
played_at_ms INTEGER NOT NULL,
|
|
195
|
-
PRIMARY KEY(kind, item_id)
|
|
196
|
-
);
|
|
197
|
-
|
|
198
|
-
CREATE TABLE IF NOT EXISTS netflix_title_markers (
|
|
199
|
-
title_id TEXT NOT NULL,
|
|
200
|
-
marker_type TEXT NOT NULL CHECK(marker_type IN ('intro', 'outro')),
|
|
201
|
-
time_seconds REAL NOT NULL DEFAULT 0,
|
|
202
|
-
updated_at TEXT NOT NULL,
|
|
203
|
-
PRIMARY KEY (title_id, marker_type)
|
|
204
|
-
);
|
|
205
|
-
|
|
206
|
-
CREATE INDEX IF NOT EXISTS netflix_watch_progress_profile_updated
|
|
207
|
-
ON netflix_watch_progress (profile_id, updated_at DESC);
|
|
208
|
-
CREATE INDEX IF NOT EXISTS playback_activity_profile_updated
|
|
209
|
-
ON playback_activity_sessions (profile_id, updated_at_ms DESC);
|
|
210
|
-
CREATE INDEX IF NOT EXISTS playback_activity_commands_session_id
|
|
211
|
-
ON playback_activity_commands (session_id, id);
|
|
212
|
-
CREATE INDEX IF NOT EXISTS playback_activity_commands_created
|
|
213
|
-
ON playback_activity_commands (created_at_ms);
|
|
214
|
-
CREATE INDEX IF NOT EXISTS spotify_homepage_items_provider_position
|
|
215
|
-
ON spotify_homepage_items(provider_id, position);
|
|
216
|
-
CREATE INDEX IF NOT EXISTS spotify_downloads_created_at
|
|
217
|
-
ON spotify_downloads(created_at DESC);
|
|
218
|
-
CREATE INDEX IF NOT EXISTS spotify_music_playlist_tracks_track
|
|
219
|
-
ON spotify_music_playlist_tracks(track_id);
|
|
220
|
-
CREATE INDEX IF NOT EXISTS spotify_recently_played_at
|
|
221
|
-
ON spotify_recently_played(played_at_ms DESC);
|
|
222
|
-
`,me=[[`id`,``],[`name`,``],[`base_url`,``],[`last_synced_at`,null],[`sync_status`,`idle`],[`last_error`,null]],he=[[`id`,``],[`provider_id`,``],[`source_url`,``],[`watch_url`,null],[`title`,``],[`original_title`,null],[`synopsis`,``],[`year`,0],[`maturity_rating`,`NR`],[`duration`,`Available`],[`match_score`,0],[`genres`,`[]`],[`cast`,`[]`],[`director`,null],[`subtitles`,`[]`],[`episodes`,`[]`],[`media_type`,`movie`],[`poster_image`,``],[`backdrop_image`,``],[`accent_color`,`#111111`],[`playback_path`,null],[`playback_kind`,null],[`download_status`,`metadata`],[`download_progress`,0],[`download_error`,null],[`created_at`,``],[`updated_at`,``]],ge=[[`profile_id`,``],[`title_id`,``],[`in_my_list`,0],[`liked`,0],[`updated_at`,``]],_e=[[`profile_id`,``],[`title_id`,``],[`season_number`,1],[`episode_number`,1],[`position_seconds`,0],[`duration_seconds`,0],[`completed`,0],[`updated_at`,``]],ve=[[`profile_id`,``],[`font_size`,32],[`position_x`,50],[`position_y`,78],[`font_color`,`#ffffff`],[`background_color`,`rgba(0,0,0,0.75)`],[`font_family`,`default`],[`captions_on`,0],[`updated_at`,``]],ye=[[`session_id`,``],[`profile_id`,``],[`title_id`,``],[`snapshot_json`,`{}`],[`updated_at_ms`,0]],be=[[`id`,0],[`session_id`,``],[`command_json`,`{}`],[`created_at_ms`,0]],xe=[[`id`,``],[`name`,``],[`home_url`,``],[`sync_status`,`idle`],[`last_synced_at`,null],[`last_error`,null],[`created_at`,``],[`updated_at`,``]],Se=[[`id`,0],[`provider_id`,``],[`external_id`,``],[`kind`,``],[`title`,``],[`subtitle`,``],[`image_url`,null],[`source_url`,null],[`position`,0],[`payload_json`,null],[`synced_at`,``]],Ce=[[`id`,``],[`provider_id`,``],[`external_id`,``],[`source_url`,``],[`title`,``],[`artist`,``],[`album`,``],[`duration_sec`,0],[`image_url`,null],[`audio_path`,null],[`audio_mime`,null],[`audio_bytes`,null],[`download_status`,`queued`],[`created_at`,``],[`updated_at`,``]],we=[[`id`,``],[`source_url`,``],[`provider_id`,``],[`track_id`,null],[`status`,`queued`],[`progress`,0],[`bytes_downloaded`,0],[`total_bytes`,null],[`error`,null],[`created_at`,``],[`updated_at`,``]],Te=[[`id`,``],[`provider_id`,``],[`external_id`,``],[`source_url`,``],[`title`,``],[`description`,``],[`curator`,``],[`image_url`,null],[`created_at`,``],[`updated_at`,``]],Ee=[[`playlist_id`,``],[`track_id`,``],[`position`,0]];function D(e){return`${y}\u0000${e}`}function O(e){return{id:e.id,name:e.name,avatarColor:e.avatarColor,createdAt:e.createdAt,updatedAt:e.updatedAt}}function k(e){return e.normalize(`NFKC`).trim().toLocaleLowerCase()}function A(e,t){let n=e.trim(),r=t.trim();if(!n||n.length>30)throw Error(`Profile name must be between 1 and 30 characters.`);if(!/^#[0-9a-f]{6}$/i.test(r))throw Error(`Choose a valid avatar color.`);return{name:n,avatarColor:r}}function De(e){return e.normalize(`NFKD`).replace(/\p{Mark}/gu,``).toLocaleLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``).slice(0,48).replace(/-+$/g,``)||`profile`}function j(e,t,r){let i=De(e),a=e=>r.has(e)||n(N(e));if(!a(i))return i;let o=m(`sha256`).update(t).digest(`hex`).slice(0,8),s=`${i.slice(0,39).replace(/-+$/g,``)}-${o}`;if(!a(s))return s;let c=2;for(;a(`${s}-${c}`);)c+=1;return`${s}-${c}`}function M(e){if(!/^[a-z0-9](?:[a-z0-9-]{0,62})$/.test(e)||e===`.`||e===`..`)throw Error(`Profile storage key is invalid.`)}function N(...t){let n=e.resolve(y),r=e.resolve(n,...t);if(r===n||!r.startsWith(`${n}${e.sep}`))throw Error(`Profile storage path escapes the profile data root.`);return r}function P(e){return M(e.storageKey),N(e.storageKey)}function F(e){return N(e.storageKey,w)}function I(e){return N(e.storageKey,w,ie)}function L(e){if(!n(e))return;let t=i(e);if(t.isSymbolicLink()||!t.isDirectory())throw Error(`Unsafe profile storage directory: ${e}`)}function Oe(e){a(y,{recursive:!0});let t=P(e),r=F(e);L(t),n(t)||a(t,{recursive:!1}),L(r),n(r)||a(r,{recursive:!1});let o=I(e);if(n(o)&&i(o).isSymbolicLink())throw Error(`Profile database cannot be a symbolic link.`)}function ke(e){a(y,{recursive:!0});let t=P(e),n=F(e);a(t,{recursive:!1});try{a(n,{recursive:!1})}catch(e){throw d(t,{recursive:!0,force:!0}),e}}function R(e){if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`Profile manifest is invalid.`);let t=e;if(t.version!==T||typeof t.activeProfileId!=`string`||!Array.isArray(t.profiles)||t.profiles.length===0)throw Error(`Profile manifest is invalid.`);let n=new Set,r=new Set,i=new Set,a=t.profiles.map(e=>{if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`Profile manifest contains an invalid profile.`);let t=e;if(typeof t.id!=`string`||!t.id||typeof t.name!=`string`||!t.name.trim()||typeof t.avatarColor!=`string`||!/^#[0-9a-f]{6}$/i.test(t.avatarColor)||typeof t.createdAt!=`string`||!t.createdAt||typeof t.updatedAt!=`string`||!t.updatedAt||typeof t.storageKey!=`string`||typeof t.legacyBootstrap!=`boolean`)throw Error(`Profile manifest contains an invalid profile.`);M(t.storageKey);let a=k(t.name);if(n.has(t.id)||r.has(a)||i.has(t.storageKey))throw Error(`Profile manifest contains duplicate profiles.`);return n.add(t.id),r.add(a),i.add(t.storageKey),t});if(!n.has(t.activeProfileId))throw Error(`Profile manifest active profile is invalid.`);return{version:T,activeProfileId:t.activeProfileId,profiles:a}}function Ae(e){let t=e.indexOf(`:`),n=Number(t===-1?e:e.slice(0,t));return Number.isSafeInteger(n)&&n>0?n:void 0}function je(e){try{return process.kill(e,0),!0}catch(e){return e instanceof Error&&`code`in e&&e.code===`EPERM`}}function Me(){a(C,{recursive:!0});let t=`${String(process.pid).padStart(10,`0`)}-${h()}`,r=e.join(C,t);p(r,``,{flag:`wx`,mode:384});try{let r=Date.now();for(let t of c(C,{withFileTypes:!0})){if(!t.isFile())continue;let n=e.join(C,t.name),i=Number(t.name.slice(0,10));try{(!Number.isSafeInteger(i)||!je(i)||r-f(n).mtimeMs>se)&&d(n,{force:!0})}catch{}}if(c(C).filter(e=>/^\d{10}-/.test(e)).sort()[0]!==t)return!1;let i=``,a=0;try{i=s(S,`utf8`),a=r-f(x).mtimeMs}catch{try{a=r-f(x).mtimeMs}catch{return!0}}let o=Ae(i);if(o!==void 0&&je(o)||o===void 0&&a<ce)return!1;let l=``;try{l=s(S,`utf8`)}catch{}if(l!==i)return!1;let p=N(`.profiles-lock-abandoned-${h()}`);try{u(x,p)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return!0;throw e}let m=``;try{m=s(e.join(p,`owner`),`utf8`)}catch{}return m===i?(d(p,{recursive:!0,force:!0}),!0):(n(x)||u(p,x),!1)}finally{d(r,{force:!0})}}function z(e){a(y,{recursive:!0});let t=Date.now()+oe,n=`${process.pid}:${h()}`;for(;;)try{a(x,{recursive:!1});try{p(S,n,{encoding:`utf8`,flag:`wx`,mode:384})}catch(e){throw d(x,{recursive:!0,force:!0}),e}break}catch(e){if(!(e instanceof Error)||!(`code`in e)||e.code!==`EEXIST`)throw e;if(Me())continue;if(Date.now()>=t)throw Error(`Timed out waiting for the profile registry lock.`);Atomics.wait(le,0,0,25)}try{return e()}finally{try{s(S,`utf8`)===n&&d(x,{recursive:!0,force:!0})}catch{}}}function B(e){let n=R(e);a(y,{recursive:!0});let i=N(`.profiles-${process.pid}-${h()}.tmp`),s;try{s=o(i,`wx`,384),p(s,`${JSON.stringify(n,null,2)}\n`,`utf8`),r(s),t(s),s=void 0,u(i,b);let e;try{e=o(y,`r`),r(e)}catch{}finally{e!==void 0&&t(e)}}catch(e){throw s!==void 0&&t(s),d(i,{force:!0}),e}}function V(){return R(JSON.parse(s(b,`utf8`)))}function H(e,t){return!!e.prepare(`SELECT 1 FROM sqlite_master
|
|
223
|
-
WHERE type = 'table' AND name = ?`).get(t)}function U(e){if(!n(e))return;let t=new g(e,{readonly:!0,fileMustExist:!0});return t.pragma(`query_only = ON`),t.pragma(`busy_timeout = 5000`),t}function W(e,t,n=``){return typeof e[t]==`string`?e[t]:n}function Ne(){let e=new Date().toISOString(),t=[{id:`adam`,name:`Adam`,avatarColor:`#1565c0`,createdAt:e,updatedAt:e},{id:`eva`,name:`Eva`,avatarColor:`#f05b47`,createdAt:e,updatedAt:e}],n=U(ne);if(!n)return{profiles:t,activeProfileId:t[0].id};try{if(!H(n,`profiles`))return{profiles:t,activeProfileId:t[0].id};let r=n.prepare(`SELECT * FROM profiles`).all().flatMap(t=>{let n=W(t,`id`).trim(),r=W(t,`name`).trim();if(!n||!r)return[];let i=W(t,`avatar_color`),a=W(t,`created_at`).trim()||e,o=W(t,`updated_at`).trim()||a;return[{id:n,name:r,avatarColor:/^#[0-9a-f]{6}$/i.test(i)?i:`#1565c0`,createdAt:a,updatedAt:o}]}).sort((e,t)=>e.createdAt.localeCompare(t.createdAt)||e.name.localeCompare(t.name));if(!r.length)return{profiles:t,activeProfileId:t[0].id};let i=r[0].id;if(H(n,`app_settings`)){let e=n.prepare(`SELECT value FROM app_settings
|
|
224
|
-
WHERE key = 'active_profile_id'`).get(),t=e?W(e,`value`).trim():``;r.some(e=>e.id===t)&&(i=t)}return{profiles:r,activeProfileId:i}}finally{n.close()}}function Pe(){let e=Ne(),t=new Set,n=e.profiles.map(e=>{let n=j(e.name,e.id,t);return t.add(n),{...e,storageKey:n,legacyBootstrap:!0}});return{version:T,activeProfileId:e.activeProfileId,profiles:n}}function Fe(e,t,n){let r=e[t];return r===null||typeof r==`string`||typeof r==`number`||typeof r==`bigint`||Buffer.isBuffer(r)?r:n}function G(e,t,n,r,i,a=[]){let o=e.prepare(n).all(...a);if(!o.length)return;let s=i.map(([e])=>e),c=s.map(()=>`?`).join(`, `),l=t.prepare(`INSERT OR IGNORE INTO ${r}
|
|
225
|
-
(${s.join(`, `)}) VALUES (${c})`);for(let e of o)l.run(...i.map(([t,n])=>Fe(e,t,n)))}function K(e,t){return!!e.prepare(`SELECT 1 FROM schema_migrations WHERE id = ?`).get(t)}function q(e,t){e.prepare(`INSERT OR IGNORE INTO schema_migrations (id, applied_at)
|
|
226
|
-
VALUES (?, ?)`).run(t,new Date().toISOString())}function Ie(e,t){let n=`legacy-netflix-v1`;if(K(e,n))return;let r=U(ne);if(r){r.exec(`BEGIN`);try{if(!H(r,`providers`)||!H(r,`movies`))return;e.transaction(()=>{K(e,n)||(H(r,`providers`)&&G(r,e,`SELECT * FROM providers`,`netflix_providers`,me),H(r,`movies`)&&G(r,e,`SELECT * FROM movies`,`netflix_movies`,he),H(r,`profile_title_state`)&&G(r,e,`SELECT * FROM profile_title_state WHERE profile_id = ?`,`netflix_profile_title_state`,ge,[t]),H(r,`watch_progress`)&&G(r,e,`SELECT * FROM watch_progress WHERE profile_id = ?`,`netflix_watch_progress`,_e,[t]),H(r,`subtitle_preferences`)&&G(r,e,`SELECT * FROM subtitle_preferences WHERE profile_id = ?`,`netflix_subtitle_preferences`,ve,[t]),H(r,`playback_activity_sessions`)&&G(r,e,`SELECT * FROM playback_activity_sessions WHERE profile_id = ?`,`playback_activity_sessions`,ye,[t]),H(r,`playback_activity_sessions`)&&H(r,`playback_activity_commands`)&&G(r,e,`SELECT commands.*
|
|
227
|
-
FROM playback_activity_commands commands
|
|
228
|
-
JOIN playback_activity_sessions sessions
|
|
229
|
-
ON sessions.session_id = commands.session_id
|
|
230
|
-
WHERE sessions.profile_id = ?`,`playback_activity_commands`,be,[t]),q(e,n))}).immediate()}finally{r.inTransaction&&r.exec(`ROLLBACK`),r.close()}}}function Le(e){let t=`legacy-spotify-v1`;if(K(e,t))return;let n=U(re);if(n){n.exec(`BEGIN`);try{if(!H(n,`providers`)||!H(n,`tracks`)||!H(n,`downloads`))return;e.transaction(()=>{K(e,t)||(H(n,`providers`)&&G(n,e,`SELECT * FROM providers`,`spotify_providers`,xe),H(n,`homepage_items`)&&G(n,e,`SELECT * FROM homepage_items`,`spotify_homepage_items`,Se),H(n,`tracks`)&&G(n,e,`SELECT * FROM tracks`,`spotify_tracks`,Ce),H(n,`music_playlists`)&&G(n,e,`SELECT * FROM music_playlists`,`spotify_music_playlists`,Te),H(n,`music_playlist_tracks`)&&G(n,e,`SELECT * FROM music_playlist_tracks`,`spotify_music_playlist_tracks`,Ee),H(n,`downloads`)&&G(n,e,`SELECT * FROM downloads`,`spotify_downloads`,we),q(e,t))}).immediate()}finally{n.inTransaction&&n.exec(`ROLLBACK`),n.close()}}}function Re(e){let t=e.prepare(`
|
|
231
|
-
INSERT INTO netflix_providers (id, name, base_url)
|
|
232
|
-
VALUES (?, ?, ?)
|
|
233
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
234
|
-
name = excluded.name,
|
|
235
|
-
base_url = excluded.base_url
|
|
236
|
-
`);for(let e of ue)t.run(e.id,e.name,e.baseUrl);let n=new Date().toISOString(),r=e.prepare(`
|
|
237
|
-
INSERT INTO spotify_providers (
|
|
238
|
-
id, name, home_url, created_at, updated_at
|
|
239
|
-
) VALUES (?, ?, ?, ?, ?)
|
|
240
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
241
|
-
name = excluded.name,
|
|
242
|
-
home_url = excluded.home_url
|
|
243
|
-
`);for(let e of de)r.run(e.id,e.name,e.homeUrl,n,n)}function ze(e){let t=new Date().toISOString();e.prepare(`UPDATE netflix_movies
|
|
244
|
-
SET download_status = 'failed',
|
|
245
|
-
download_progress = 0,
|
|
246
|
-
download_error = COALESCE(
|
|
247
|
-
download_error,
|
|
248
|
-
'Download was interrupted by a server restart.'
|
|
249
|
-
),
|
|
250
|
-
updated_at = ?
|
|
251
|
-
WHERE download_status IN ('queued', 'downloading')`).run(t),e.prepare(`UPDATE netflix_providers
|
|
252
|
-
SET sync_status = 'error',
|
|
253
|
-
last_error = COALESCE(
|
|
254
|
-
last_error,
|
|
255
|
-
'Synchronization was interrupted by a server restart.'
|
|
256
|
-
)
|
|
257
|
-
WHERE sync_status = 'syncing'`).run()}function Be(e){let t=new Date().toISOString();e.prepare(`UPDATE spotify_downloads
|
|
258
|
-
SET status = 'failed',
|
|
259
|
-
error = COALESCE(
|
|
260
|
-
error,
|
|
261
|
-
'Download was interrupted by a server restart.'
|
|
262
|
-
),
|
|
263
|
-
updated_at = ?
|
|
264
|
-
WHERE status IN ('queued', 'fetching', 'downloading')`).run(t),e.prepare(`UPDATE spotify_tracks
|
|
265
|
-
SET download_status = 'failed', updated_at = ?
|
|
266
|
-
WHERE download_status IN ('queued', 'fetching', 'downloading')`).run(t),e.prepare(`UPDATE spotify_providers
|
|
267
|
-
SET sync_status = 'error',
|
|
268
|
-
last_error = COALESCE(
|
|
269
|
-
last_error,
|
|
270
|
-
'Synchronization was interrupted by a server restart.'
|
|
271
|
-
),
|
|
272
|
-
updated_at = ?
|
|
273
|
-
WHERE sync_status = 'syncing'`).run(t)}function Ve(e,t){e.pragma(`busy_timeout = 5000`),e.pragma(`foreign_keys = ON`),e.pragma(`journal_mode = WAL`),e.exec(pe),e.pragma(`user_version = ${ae}`),e.prepare(`INSERT INTO profiles (
|
|
274
|
-
id, name, avatar_color, created_at, updated_at
|
|
275
|
-
) VALUES (?, ?, ?, ?, ?)
|
|
276
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
277
|
-
name = excluded.name,
|
|
278
|
-
avatar_color = excluded.avatar_color,
|
|
279
|
-
created_at = excluded.created_at,
|
|
280
|
-
updated_at = excluded.updated_at`).run(t.id,t.name,t.avatarColor,t.createdAt,t.updatedAt),Re(e),q(e,`merged-schema-v1`),t.legacyBootstrap&&(Ie(e,t.id),Le(e)),ze(e),Be(e),e.exec(`
|
|
281
|
-
CREATE UNIQUE INDEX IF NOT EXISTS spotify_downloads_one_active_source
|
|
282
|
-
ON spotify_downloads(provider_id, source_url)
|
|
283
|
-
WHERE status IN ('queued', 'fetching', 'downloading');
|
|
284
|
-
`)}function J(e){let t=D(e.id),n=I(e),r=E.connections.get(t);if(r?.database.open){if(r.databasePath!==n)throw Error(`Profile database path changed unexpectedly.`);return r.database}E.connections.delete(t),Oe(e);let i=new g(n);try{Ve(i,e)}catch(e){throw i.close(),e}return E.connections.set(t,{database:i,databasePath:n}),i}function He(){E.initializedRoots.has(y)||(a(y,{recursive:!0}),z(()=>{n(b)||B(Pe());let e=V();for(let t of e.profiles)J(t)}),E.initializedRoots.add(y))}function Y(){return He(),V()}function X(e){return He(),z(()=>e(V()))}function Z(e){return Y().profiles.find(t=>t.id===e)}function Q(e){return[...e].sort((e,t)=>e.createdAt.localeCompare(t.createdAt)||e.name.localeCompare(t.name))}function Ue(){return Q(Y().profiles).map(O)}function We(e){let t=Z(e);return t?O(t):void 0}function $(){let e=Y(),t=e.profiles.find(t=>t.id===e.activeProfileId);if(!t)throw Error(`At least one profile is required.`);return O(t)}function Ge(e){return X(t=>{let n=t.profiles.find(t=>t.id===e);if(!n)throw Error(`Profile not found.`);return B({...t,activeProfileId:e}),O(n)})}function Ke(e,t){let r=A(e,t);return X(e=>{if(e.profiles.some(e=>k(e.name)===k(r.name)))throw Error(`UNIQUE constraint failed: profiles.name`);let t=new Date().toISOString(),i=h(),a=new Set(e.profiles.map(e=>e.storageKey)),o={id:i,name:r.name,avatarColor:r.avatarColor,createdAt:t,updatedAt:t,storageKey:j(r.name,i,a),legacyBootstrap:!1},s=!1;try{return ke(o),s=!0,J(o),B({...e,profiles:[...e.profiles,o]}),O(o)}catch(e){let t=D(o.id),r=E.connections.get(t);r?.database.open&&r.database.close(),E.connections.delete(t);let i=P(o);throw s&&n(i)&&(L(i),d(i,{recursive:!0,force:!1})),e}})}function qe(e,t){let n=A(t.name,t.avatarColor);return X(t=>{let r=t.profiles.findIndex(t=>t.id===e);if(r<0)throw Error(`Profile not found.`);if(t.profiles.some(t=>t.id!==e&&k(t.name)===k(n.name)))throw Error(`UNIQUE constraint failed: profiles.name`);let i=t.profiles[r],a={...i,name:n.name,avatarColor:n.avatarColor,updatedAt:new Date().toISOString()},o=J(i);o.prepare(`UPDATE profiles
|
|
285
|
-
SET name = ?, avatar_color = ?, updated_at = ?
|
|
286
|
-
WHERE id = ?`).run(a.name,a.avatarColor,a.updatedAt,e);let s=[...t.profiles];s[r]=a;try{B({...t,profiles:s})}catch(t){throw o.prepare(`UPDATE profiles
|
|
287
|
-
SET name = ?, avatar_color = ?, updated_at = ?
|
|
288
|
-
WHERE id = ?`).run(i.name,i.avatarColor,i.updatedAt,e),t}return O(a)})}function Je(e){if(!Z(e))throw Error(`Profile not found.`);let t=D(e),n=E.connections.get(t);if(!n||(E.connections.delete(t),!n.database.open))return;let r;try{n.database.pragma(`wal_checkpoint(TRUNCATE)`)}catch(e){r=e}finally{n.database.close()}if(r)throw r}function Ye(t){L(t);let n=l(y),r=l(t);if(e.dirname(r)!==n)throw Error(`Refusing to delete a profile outside the data root.`)}function Xe(e){return X(t=>{let r=t.profiles.find(t=>t.id===e);if(!r)throw Error(`Profile not found.`);if(t.profiles.length===1)throw Error(`You must keep at least one profile.`);Je(e);let i=P(r),a=t.profiles.filter(t=>t.id!==e),o=t.activeProfileId===e?Q(a)[0].id:t.activeProfileId;B({...t,activeProfileId:o,profiles:a});let s;try{n(i)&&(Ye(i),s=N(`.deleted-${r.storageKey}-${h()}`),u(i,s))}catch(e){try{B(t)}catch(t){throw AggregateError([e,t],`Profile data could not be deleted and its registry could not be restored.`)}throw e}if(s)try{d(s,{recursive:!0,force:!1})}catch{}})}function Ze(e){let t=e??$().id,n=Z(t);if(!n)throw Error(`Profile not found.`);return E.connections.get(D(t))?.database.open?J(n):z(()=>{let e=V().profiles.find(e=>e.id===t);if(!e)throw Error(`Profile not found.`);return J(e)})}export{Ze as a,qe as c,We as i,Xe as n,Ue as o,$ as r,Ge as s,Ke as t};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{c as e,s as t,t as n}from"./database-BNnYfHmT.js";import{i as r,n as i,r as a}from"./providers-B3YELr_F.js";import{i as o}from"./downloader-DgnjNL5T.js";import{r as s}from"./subtitles-DYBlMnha.js";import{randomUUID as c}from"node:crypto";var l=globalThis,u=l.homeAtomNetflixStreams??={sessions:new Map},d=7200*1e3,f=32;function p(){let e=Date.now();for(let[t,n]of u.sessions)e-n.lastAccessedAt>d&&u.sessions.delete(t);if(u.sessions.size<=f)return;let t=[...u.sessions.values()].sort((e,t)=>e.lastAccessedAt-t.lastAccessedAt);for(let e of t.slice(0,u.sessions.size-f))u.sessions.delete(e.id)}function m(e,t){return`/api/netflix/stream/${encodeURIComponent(e.movieId)}/${encodeURIComponent(e.id)}/${t}`}function h(e,t,n){let r=new URL(t,n).toString(),i=e.resourceTokens.get(r);if(i)return m(e,`resource/${i}`);let a=c();return e.resources.set(a,r),e.resourceTokens.set(r,a),m(e,`resource/${a}`)}function g(e,t,n){return e.split(/\r?\n/).map(e=>{let r=e.trim();return r?r.startsWith(`#`)?e.replace(/\bURI=(["'])(.*?)\1/g,(e,r,i)=>`URI=${r}${h(n,i,t)}${r}`):h(n,r,t):e}).join(`
|
|
2
|
-
`)}function _(e,t){p();let n=u.sessions.get(t);return!n||n.movieId!==e?null:(n.lastAccessedAt=Date.now(),n)}function v(e,t,n){return new Response(g(e,t,n),{headers:{"cache-control":`no-store`,"content-type":`application/vnd.apple.mpegurl`}})}function y(e){let t=new Headers;for(let n of[`accept-ranges`,`content-length`,`content-range`,`content-type`,`etag`,`last-modified`]){let r=e.headers.get(n);r&&t.set(n,r)}return t.set(`cache-control`,`private, max-age=3600`),t}async function b(e,t){let n;for(let r=0;r<3;r+=1){if(n=await fetch(e,{headers:t,redirect:`follow`,signal:AbortSignal.timeout(6e4)}),n.ok||n.status===206||!(n.status===404||n.status===408||n.status===425||n.status===429||n.status>=500)||r===2)return n;await n.body?.cancel(),await new Promise(e=>setTimeout(e,300*2**r))}return n}async function x(r,l,d){p();let f=d??t().id,h=e(r,f);if(!h?.watch_url)throw Error(`This title does not have a playable provider page.`);let g=h.watch_url,_;if(l){let e=[];try{e=JSON.parse(h.episodes)}catch{}if(_=e.find(e=>e.episode===l),!_?.watchUrl)throw Error(`Episode ${l} is not available for this title.`);_.id||(_={..._,id:`episode-${l}`}),g=_.watchUrl}let v=[];if(!_)try{v=JSON.parse(h.subtitles)}catch{}let y=await i(g,h.source_url),b=_?.id||`movie`,x=_?.subtitles?.length?[..._.subtitles]:v,[S,C]=await Promise.all([o(g,y),x.length?Promise.resolve(x):s(r,b,g,y,f)]),w=_&&h.provider_id===`phimhdcss`?{...a(_,y),subtitles:C}:_?{..._,subtitles:C}:void 0;try{n(r,w?{episode:w}:{subtitles:C},f)}catch{}let T=Date.now(),E={id:c(),profileId:f,movieId:r,kind:S.kind,referer:S.referer,resources:new Map,resourceTokens:new Map,createdAt:T,lastAccessedAt:T,...S.kind===`file`?{rootUrl:S.url}:{initialPlaylist:S.playlist,initialBaseUrl:S.baseUrl}};return u.sessions.set(E.id,E),{kind:E.kind,episode:l,episodeMetadata:w,subtitles:C,path:m(E,E.kind===`hls`?`index.m3u8`:`media`)}}async function S(e,t,n){let[i,a,o]=n,s=_(t,i);if(!s)return Response.json({error:`This stream expired. Close the player and try again.`},{status:404});if(a===`index.m3u8`&&s.kind===`hls`&&s.initialPlaylist&&s.initialBaseUrl)return v(s.initialPlaylist,s.initialBaseUrl,s);let c=a===`media`&&s.kind===`file`?s.rootUrl:a===`resource`&&o?s.resources.get(o):void 0;if(!c)return Response.json({error:`Stream resource not found.`},{status:404});let l={...r(s.referer,c)},u=e.headers.get(`range`);u&&(l.range=u);let d=await b(c,l);if(!d.ok&&d.status!==206)return Response.json({error:`The provider stream returned HTTP ${d.status}.`},{status:502});let f=d.headers.get(`content-type`)?.toLowerCase()||``,p=new URL(c).pathname.toLowerCase();if(f.includes(`mpegurl`)||p.endsWith(`.m3u8`)||p.endsWith(`.txt`)){let e=await d.text();if(e.trimStart().startsWith(`#EXTM3U`))return v(e,d.url||c,s);let t=y(d);return t.delete(`content-length`),new Response(e,{status:d.status,headers:t})}return new Response(d.body,{status:d.status,headers:y(d)})}export{S as n,x as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._backdrop_ttlmb_1{z-index:150;color:#fff;-webkit-backdrop-filter:blur(.25rem);backdrop-filter:blur(.25rem);background:#000000c2;place-items:start center;padding:2.5rem 1rem;animation:.18s _backdrop-in_ttlmb_1;display:grid;position:fixed;inset:0;overflow-y:auto}._modal_ttlmb_15{--profile-manager-red:#e50914;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;animation:.22s cubic-bezier(.16,1,.3,1) _modal-in_ttlmb_1;position:relative;box-shadow:0 1.5rem 5rem #000000b8}._close_ttlmb_29{z-index:5;color:#fff;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}._close_ttlmb_29:hover{background:#303030}._close_ttlmb_29:focus-visible{outline-offset:2px;outline:2px solid #fff}._close_ttlmb_29 svg{width:1.35rem}._header_ttlmb_59{align-items:center;gap:.9rem;margin-bottom:1.5rem;display:flex}._icon_ttlmb_66{background:var(--profile-manager-red);border-radius:.45rem;flex:none;place-items:center;width:2.8rem;height:2.8rem;display:grid}._icon_ttlmb_66 svg{width:1.35rem}._header_ttlmb_59 h2{margin:0 0 .25rem;font-size:1.75rem}._header_ttlmb_59 p{color:#aaa;margin:0;font-size:.82rem}._list_ttlmb_91{border:1px solid #3b3b3b;border-radius:.4rem;display:grid;overflow:hidden}._row_ttlmb_98{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}._row_ttlmb_98:last-child{border-bottom:0}._avatar_ttlmb_113{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}._name_ttlmb_125{flex-direction:column;gap:.18rem;min-width:0;display:flex}._name_ttlmb_125 b{text-overflow:ellipsis;overflow:hidden}._name_ttlmb_125 small{color:#999;font-size:.7rem}._iconButton_ttlmb_142{color:#fff;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}._iconButton_ttlmb_142:hover{background:#343434;border-color:#fff}:is(._iconButton_ttlmb_142:focus-visible,._button_ttlmb_161:focus-visible){outline-offset:2px;outline:2px solid #fff}._iconButton_ttlmb_142 svg{width:1rem}._iconButtonDanger_ttlmb_170{color:#ff8d92}._iconButton_ttlmb_142:disabled{opacity:.3;cursor:not-allowed}._editor_ttlmb_179{background:#292929;border-bottom:1px solid #383838;grid-template-columns:auto minmax(0,1fr) auto;align-items:start;gap:1rem;padding:1rem;display:grid}._editorFields_ttlmb_189{gap:.4rem;min-width:0;display:grid}._editorFields_ttlmb_189>label,._addForm_ttlmb_196 label{font-size:.72rem;font-weight:750}._editorFields_ttlmb_189>input,._addForm_ttlmb_196>div>input{color:#fff;background:#181818;border:1px solid #686868;border-radius:.25rem;outline:0;width:100%;height:2.6rem;padding:0 .75rem}._editorFields_ttlmb_189>input:focus,._addForm_ttlmb_196 input:focus{border-color:#fff}._editorActions_ttlmb_218{align-self:center;gap:.45rem;display:flex}._button_ttlmb_161{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}._button_ttlmb_161 svg{width:1rem}._buttonPrimary_ttlmb_244{border-color:var(--profile-manager-red);background:var(--profile-manager-red)}._buttonQuiet_ttlmb_249{background:0 0}._buttonDanger_ttlmb_253{background:#8f2026;border-color:#8f2026}._button_ttlmb_161:disabled{opacity:.55;cursor:wait}._colorPicker_ttlmb_263{border:0;min-width:0;margin:.25rem 0 0;padding:0}._colorPicker_ttlmb_263 legend{color:#aaa;margin-bottom:.35rem;font-size:.67rem}._colorPicker_ttlmb_263>div{flex-wrap:wrap;gap:.42rem;display:flex}._colorPicker_ttlmb_263 label{cursor:pointer;display:block}._colorPicker_ttlmb_263 input{opacity:0;width:1px;height:1px;position:absolute}._colorPicker_ttlmb_263 span{border:2px solid #0000;border-radius:50%;width:1.45rem;height:1.45rem;display:block;box-shadow:0 0 0 1px #5c5c5c}._colorPicker_ttlmb_263 input:focus-visible+span{outline-offset:2px;outline:2px solid #fff}._colorPicker_ttlmb_263 input:checked+span{border-color:#fff;box-shadow:0 0 0 2px #fff}._deleteConfirm_ttlmb_313{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}._deleteConfirm_ttlmb_313>span{flex-direction:column;gap:.2rem;display:flex}._deleteConfirm_ttlmb_313 small{color:#aaa;font-size:.7rem}._addForm_ttlmb_196{grid-template-columns:minmax(10rem,1fr) 1fr auto;align-items:end;gap:1rem;margin-top:1.25rem;display:grid}._addForm_ttlmb_196>div:first-child{gap:.4rem;display:grid}._error_ttlmb_349{color:#ff777d;margin:.8rem 0 0;font-size:.78rem}._spin_ttlmb_355{animation:.9s linear infinite _spin_ttlmb_355}@keyframes _backdrop-in_ttlmb_1{0%{opacity:0}}@keyframes _modal-in_ttlmb_1{0%{opacity:0;transform:scale(.96)translateY(1rem)}}@keyframes _spin_ttlmb_355{to{transform:rotate(360deg)}}@media (max-width:700px){._backdrop_ttlmb_1{place-items:stretch stretch;padding:0}._modal_ttlmb_15{width:100%;min-height:100svh;padding:4.5rem 1rem max(2rem, env(safe-area-inset-bottom));border:0;border-radius:0}._editor_ttlmb_179{grid-template-columns:auto minmax(0,1fr)}._editorActions_ttlmb_218{grid-column:1/-1;justify-content:flex-end}._deleteConfirm_ttlmb_313,._addForm_ttlmb_196{grid-template-columns:1fr}._deleteConfirm_ttlmb_313 ._button_ttlmb_161{width:100%}._close_ttlmb_29{top:max(.8rem, env(safe-area-inset-top));position:fixed;right:.8rem}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./chevron-left-CkBJG8E2.js";var t=e(`arrow-left`,[[`path`,{d:`m12 19-7-7 7-7`,key:`1l729n`}],[`path`,{d:`M19 12H5`,key:`x3x0zl`}]]),n=e(`circle-question-mark`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3`,key:`1u773s`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),r=e(`captions`,[[`rect`,{width:`18`,height:`14`,x:`3`,y:`5`,rx:`2`,ry:`2`,key:`12ruh7`}],[`path`,{d:`M7 15h4M15 15h2M7 11h2M13 11h4`,key:`1ueiar`}]]),i=e(`list-video`,[[`path`,{d:`M21 5H3`,key:`1fi0y6`}],[`path`,{d:`M10 12H3`,key:`1ulcyk`}],[`path`,{d:`M10 19H3`,key:`108z41`}],[`path`,{d:`M15 12.003a1 1 0 0 1 1.517-.859l4.997 2.997a1 1 0 0 1 0 1.718l-4.997 2.997a1 1 0 0 1-1.517-.86z`,key:`ms4nik`}]]),a=e(`rotate-ccw`,[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`1357e3`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}]]),o=e(`rotate-cw`,[[`path`,{d:`M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8`,key:`1p45f6`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}]]),s=e(`step-forward`,[[`path`,{d:`M10.029 4.285A2 2 0 0 0 7 6v12a2 2 0 0 0 3.029 1.715l9.997-5.998a2 2 0 0 0 .003-3.432z`,key:`1ystz2`}],[`path`,{d:`M3 4v16`,key:`1ph11n`}]]),c=e(`maximize`,[[`path`,{d:`M8 3H5a2 2 0 0 0-2 2v3`,key:`1dcmit`}],[`path`,{d:`M21 8V5a2 2 0 0 0-2-2h-3`,key:`1e4gt3`}],[`path`,{d:`M3 16v3a2 2 0 0 0 2 2h3`,key:`wsl5sc`}],[`path`,{d:`M16 21h3a2 2 0 0 0 2-2v-3`,key:`18trek`}]]),l=e(`minimize`,[[`path`,{d:`M8 3v3a2 2 0 0 1-2 2H3`,key:`hohbtr`}],[`path`,{d:`M21 8h-3a2 2 0 0 1-2-2V3`,key:`5jw1f3`}],[`path`,{d:`M3 16h3a2 2 0 0 1 2 2v3`,key:`198tvr`}],[`path`,{d:`M16 21v-3a2 2 0 0 1 2-2h3`,key:`ph8mxp`}]]);export{a,n as c,o as i,t as l,c as n,i as o,s as r,r as s,l as t};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e,t}from"./chevron-left-CkBJG8E2.js";import{a as n,c as r,i,l as a,n as o,o as s,r as c,s as l,t as u}from"./minimize-C9JLgte-.js";import{a as d,c as f,d as p,f as m,h,i as g,l as _,m as v,n as ee,o as te,p as y,r as ne,s as b,t as x,u as S}from"./refresh-cw-CWdWHjqY.js";import{a as re,c as C,i as ie,l as ae,n as oe,o as w,r as se,s as ce,t as le,u as T}from"./playback-activity-D5TYX2Ae.js";import{Fragment as ue,jsx as E,jsxs as D}from"react/jsx-runtime";import O,{useCallback as k,useEffect as A,useMemo as de,useRef as j,useState as M}from"react";var fe=e(`copy`,[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`,key:`17jyea`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,key:`zix9uf`}]]),pe=e(`flag`,[[`path`,{d:`M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528`,key:`1jaruq`}]]),me=e(`gauge`,[[`path`,{d:`m12 14 4-4`,key:`9kzdfg`}],[`path`,{d:`M3.34 19a10 10 0 1 1 17.32 0`,key:`19p75a`}]]),he=e(`info`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 16v-4`,key:`1dtifu`}],[`path`,{d:`M12 8h.01`,key:`e9boi3`}]]),N=e(`log-out`,[[`path`,{d:`m16 17 5-5-5-5`,key:`1bji2h`}],[`path`,{d:`M21 12H9`,key:`dn1m92`}],[`path`,{d:`M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4`,key:`1uf3rs`}]]),ge=e(`menu`,[[`path`,{d:`M4 5h16`,key:`1tepv9`}],[`path`,{d:`M4 12h16`,key:`1lakjw`}],[`path`,{d:`M4 19h16`,key:`1djgab`}]]),_e=e(`settings`,[[`path`,{d:`M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915`,key:`1i5ecw`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),ve=e(`thumbs-up`,[[`path`,{d:`M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88Z`,key:`emmmcr`}],[`path`,{d:`M7 10v12`,key:`1qc93n`}]]),P=e(`wifi`,[[`path`,{d:`M12 20h.01`,key:`zekei9`}],[`path`,{d:`M2 8.82a15 15 0 0 1 20 0`,key:`dnpr2z`}],[`path`,{d:`M5 12.859a10 10 0 0 1 14 0`,key:`1x1e6c`}],[`path`,{d:`M8.5 16.429a5 5 0 0 1 7 0`,key:`1bycff`}]]),ye=Object.defineProperty,be=Object.getOwnPropertySymbols,xe=Object.prototype.hasOwnProperty,Se=Object.prototype.propertyIsEnumerable,Ce=(e,t,n)=>t in e?ye(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,we=(e,t)=>{for(var n in t||={})xe.call(t,n)&&Ce(e,n,t[n]);if(be)for(var n of be(t))Se.call(t,n)&&Ce(e,n,t[n]);return e},Te=(e,t)=>{var n={};for(var r in e)xe.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&be)for(var r of be(e))t.indexOf(r)<0&&Se.call(e,r)&&(n[r]=e[r]);return n},F;(e=>{let t=class t{constructor(e,n,r,a){if(this.version=e,this.errorCorrectionLevel=n,this.modules=[],this.isFunction=[],e<t.MIN_VERSION||e>t.MAX_VERSION)throw RangeError(`Version value out of range`);if(a<-1||a>7)throw RangeError(`Mask value out of range`);this.size=e*4+17;let o=[];for(let e=0;e<this.size;e++)o.push(!1);for(let e=0;e<this.size;e++)this.modules.push(o.slice()),this.isFunction.push(o.slice());this.drawFunctionPatterns();let s=this.addEccAndInterleave(r);if(this.drawCodewords(s),a==-1){let e=1e9;for(let t=0;t<8;t++){this.applyMask(t),this.drawFormatBits(t);let n=this.getPenaltyScore();n<e&&(a=t,e=n),this.applyMask(t)}}i(0<=a&&a<=7),this.mask=a,this.applyMask(a),this.drawFormatBits(a),this.isFunction=[]}static encodeText(n,r){let i=e.QrSegment.makeSegments(n);return t.encodeSegments(i,r)}static encodeBinary(n,r){let i=e.QrSegment.makeBytes(n);return t.encodeSegments([i],r)}static encodeSegments(e,r,a=1,s=40,c=-1,l=!0){if(!(t.MIN_VERSION<=a&&a<=s&&s<=t.MAX_VERSION)||c<-1||c>7)throw RangeError(`Invalid value`);let u,d;for(u=a;;u++){let n=t.getNumDataCodewords(u,r)*8,i=o.getTotalBits(e,u);if(i<=n){d=i;break}if(u>=s)throw RangeError(`Data too long`)}for(let e of[t.Ecc.MEDIUM,t.Ecc.QUARTILE,t.Ecc.HIGH])l&&d<=t.getNumDataCodewords(u,e)*8&&(r=e);let f=[];for(let t of e){n(t.mode.modeBits,4,f),n(t.numChars,t.mode.numCharCountBits(u),f);for(let e of t.getData())f.push(e)}i(f.length==d);let p=t.getNumDataCodewords(u,r)*8;i(f.length<=p),n(0,Math.min(4,p-f.length),f),n(0,(8-f.length%8)%8,f),i(f.length%8==0);for(let e=236;f.length<p;e^=253)n(e,8,f);let m=[];for(;m.length*8<f.length;)m.push(0);return f.forEach((e,t)=>m[t>>>3]|=e<<7-(t&7)),new t(u,r,m,c)}getModule(e,t){return 0<=e&&e<this.size&&0<=t&&t<this.size&&this.modules[t][e]}getModules(){return this.modules}drawFunctionPatterns(){for(let e=0;e<this.size;e++)this.setFunctionModule(6,e,e%2==0),this.setFunctionModule(e,6,e%2==0);this.drawFinderPattern(3,3),this.drawFinderPattern(this.size-4,3),this.drawFinderPattern(3,this.size-4);let e=this.getAlignmentPatternPositions(),t=e.length;for(let n=0;n<t;n++)for(let r=0;r<t;r++)n==0&&r==0||n==0&&r==t-1||n==t-1&&r==0||this.drawAlignmentPattern(e[n],e[r]);this.drawFormatBits(0),this.drawVersion()}drawFormatBits(e){let t=this.errorCorrectionLevel.formatBits<<3|e,n=t;for(let e=0;e<10;e++)n=n<<1^(n>>>9)*1335;let a=(t<<10|n)^21522;i(a>>>15==0);for(let e=0;e<=5;e++)this.setFunctionModule(8,e,r(a,e));this.setFunctionModule(8,7,r(a,6)),this.setFunctionModule(8,8,r(a,7)),this.setFunctionModule(7,8,r(a,8));for(let e=9;e<15;e++)this.setFunctionModule(14-e,8,r(a,e));for(let e=0;e<8;e++)this.setFunctionModule(this.size-1-e,8,r(a,e));for(let e=8;e<15;e++)this.setFunctionModule(8,this.size-15+e,r(a,e));this.setFunctionModule(8,this.size-8,!0)}drawVersion(){if(this.version<7)return;let e=this.version;for(let t=0;t<12;t++)e=e<<1^(e>>>11)*7973;let t=this.version<<12|e;i(t>>>18==0);for(let e=0;e<18;e++){let n=r(t,e),i=this.size-11+e%3,a=Math.floor(e/3);this.setFunctionModule(i,a,n),this.setFunctionModule(a,i,n)}}drawFinderPattern(e,t){for(let n=-4;n<=4;n++)for(let r=-4;r<=4;r++){let i=Math.max(Math.abs(r),Math.abs(n)),a=e+r,o=t+n;0<=a&&a<this.size&&0<=o&&o<this.size&&this.setFunctionModule(a,o,i!=2&&i!=4)}}drawAlignmentPattern(e,t){for(let n=-2;n<=2;n++)for(let r=-2;r<=2;r++)this.setFunctionModule(e+r,t+n,Math.max(Math.abs(r),Math.abs(n))!=1)}setFunctionModule(e,t,n){this.modules[t][e]=n,this.isFunction[t][e]=!0}addEccAndInterleave(e){let n=this.version,r=this.errorCorrectionLevel;if(e.length!=t.getNumDataCodewords(n,r))throw RangeError(`Invalid argument`);let a=t.NUM_ERROR_CORRECTION_BLOCKS[r.ordinal][n],o=t.ECC_CODEWORDS_PER_BLOCK[r.ordinal][n],s=Math.floor(t.getNumRawDataModules(n)/8),c=a-s%a,l=Math.floor(s/a),u=[],d=t.reedSolomonComputeDivisor(o);for(let n=0,r=0;n<a;n++){let i=e.slice(r,r+l-o+(n<c?0:1));r+=i.length;let a=t.reedSolomonComputeRemainder(i,d);n<c&&i.push(0),u.push(i.concat(a))}let f=[];for(let e=0;e<u[0].length;e++)u.forEach((t,n)=>{(e!=l-o||n>=c)&&f.push(t[e])});return i(f.length==s),f}drawCodewords(e){if(e.length!=Math.floor(t.getNumRawDataModules(this.version)/8))throw RangeError(`Invalid argument`);let n=0;for(let t=this.size-1;t>=1;t-=2){t==6&&(t=5);for(let i=0;i<this.size;i++)for(let a=0;a<2;a++){let o=t-a,s=t+1&2?i:this.size-1-i;!this.isFunction[s][o]&&n<e.length*8&&(this.modules[s][o]=r(e[n>>>3],7-(n&7)),n++)}}i(n==e.length*8)}applyMask(e){if(e<0||e>7)throw RangeError(`Mask value out of range`);for(let t=0;t<this.size;t++)for(let n=0;n<this.size;n++){let r;switch(e){case 0:r=(n+t)%2==0;break;case 1:r=t%2==0;break;case 2:r=n%3==0;break;case 3:r=(n+t)%3==0;break;case 4:r=(Math.floor(n/3)+Math.floor(t/2))%2==0;break;case 5:r=n*t%2+n*t%3==0;break;case 6:r=(n*t%2+n*t%3)%2==0;break;case 7:r=((n+t)%2+n*t%3)%2==0;break;default:throw Error(`Unreachable`)}!this.isFunction[t][n]&&r&&(this.modules[t][n]=!this.modules[t][n])}}getPenaltyScore(){let e=0;for(let n=0;n<this.size;n++){let r=!1,i=0,a=[0,0,0,0,0,0,0];for(let o=0;o<this.size;o++)this.modules[n][o]==r?(i++,i==5?e+=t.PENALTY_N1:i>5&&e++):(this.finderPenaltyAddHistory(i,a),r||(e+=this.finderPenaltyCountPatterns(a)*t.PENALTY_N3),r=this.modules[n][o],i=1);e+=this.finderPenaltyTerminateAndCount(r,i,a)*t.PENALTY_N3}for(let n=0;n<this.size;n++){let r=!1,i=0,a=[0,0,0,0,0,0,0];for(let o=0;o<this.size;o++)this.modules[o][n]==r?(i++,i==5?e+=t.PENALTY_N1:i>5&&e++):(this.finderPenaltyAddHistory(i,a),r||(e+=this.finderPenaltyCountPatterns(a)*t.PENALTY_N3),r=this.modules[o][n],i=1);e+=this.finderPenaltyTerminateAndCount(r,i,a)*t.PENALTY_N3}for(let n=0;n<this.size-1;n++)for(let r=0;r<this.size-1;r++){let i=this.modules[n][r];i==this.modules[n][r+1]&&i==this.modules[n+1][r]&&i==this.modules[n+1][r+1]&&(e+=t.PENALTY_N2)}let n=0;for(let e of this.modules)n=e.reduce((e,t)=>e+ +!!t,n);let r=this.size*this.size,a=Math.ceil(Math.abs(n*20-r*10)/r)-1;return i(0<=a&&a<=9),e+=a*t.PENALTY_N4,i(0<=e&&e<=2568888),e}getAlignmentPatternPositions(){if(this.version==1)return[];{let e=Math.floor(this.version/7)+2,t=this.version==32?26:Math.ceil((this.version*4+4)/(e*2-2))*2,n=[6];for(let r=this.size-7;n.length<e;r-=t)n.splice(1,0,r);return n}}static getNumRawDataModules(e){if(e<t.MIN_VERSION||e>t.MAX_VERSION)throw RangeError(`Version number out of range`);let n=(16*e+128)*e+64;if(e>=2){let t=Math.floor(e/7)+2;n-=(25*t-10)*t-55,e>=7&&(n-=36)}return i(208<=n&&n<=29648),n}static getNumDataCodewords(e,n){return Math.floor(t.getNumRawDataModules(e)/8)-t.ECC_CODEWORDS_PER_BLOCK[n.ordinal][e]*t.NUM_ERROR_CORRECTION_BLOCKS[n.ordinal][e]}static reedSolomonComputeDivisor(e){if(e<1||e>255)throw RangeError(`Degree out of range`);let n=[];for(let t=0;t<e-1;t++)n.push(0);n.push(1);let r=1;for(let i=0;i<e;i++){for(let e=0;e<n.length;e++)n[e]=t.reedSolomonMultiply(n[e],r),e+1<n.length&&(n[e]^=n[e+1]);r=t.reedSolomonMultiply(r,2)}return n}static reedSolomonComputeRemainder(e,n){let r=n.map(e=>0);for(let i of e){let e=i^r.shift();r.push(0),n.forEach((n,i)=>r[i]^=t.reedSolomonMultiply(n,e))}return r}static reedSolomonMultiply(e,t){if(e>>>8||t>>>8)throw RangeError(`Byte out of range`);let n=0;for(let r=7;r>=0;r--)n=n<<1^(n>>>7)*285,n^=(t>>>r&1)*e;return i(n>>>8==0),n}finderPenaltyCountPatterns(e){let t=e[1];i(t<=this.size*3);let n=t>0&&e[2]==t&&e[3]==t*3&&e[4]==t&&e[5]==t;return(n&&e[0]>=t*4&&e[6]>=t?1:0)+(n&&e[6]>=t*4&&e[0]>=t?1:0)}finderPenaltyTerminateAndCount(e,t,n){return e&&(this.finderPenaltyAddHistory(t,n),t=0),t+=this.size,this.finderPenaltyAddHistory(t,n),this.finderPenaltyCountPatterns(n)}finderPenaltyAddHistory(e,t){t[0]==0&&(e+=this.size),t.pop(),t.unshift(e)}};t.MIN_VERSION=1,t.MAX_VERSION=40,t.PENALTY_N1=3,t.PENALTY_N2=3,t.PENALTY_N3=40,t.PENALTY_N4=10,t.ECC_CODEWORDS_PER_BLOCK=[[-1,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,10,16,26,18,24,16,18,22,22,26,30,22,22,24,24,28,28,26,26,26,26,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28],[-1,13,22,18,26,18,24,18,22,20,24,28,26,24,20,30,24,28,28,26,30,28,30,30,30,30,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,17,28,22,16,22,28,26,26,24,28,24,28,22,24,24,30,28,28,26,28,30,24,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30]],t.NUM_ERROR_CORRECTION_BLOCKS=[[-1,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25],[-1,1,1,1,2,2,4,4,4,5,5,5,8,9,9,10,10,11,13,14,16,17,17,18,20,21,23,25,26,28,29,31,33,35,37,38,40,43,45,47,49],[-1,1,1,2,2,4,4,6,6,8,8,8,10,12,16,12,17,16,18,21,20,23,23,25,27,29,34,34,35,38,40,43,45,48,51,53,56,59,62,65,68],[-1,1,1,2,4,4,4,5,6,8,8,11,11,16,16,18,16,19,21,25,25,25,34,30,32,35,37,40,42,45,48,51,54,57,60,63,66,70,74,77,81]],e.QrCode=t;function n(e,t,n){if(t<0||t>31||e>>>t)throw RangeError(`Value out of range`);for(let r=t-1;r>=0;r--)n.push(e>>>r&1)}function r(e,t){return(e>>>t&1)!=0}function i(e){if(!e)throw Error(`Assertion error`)}let a=class e{constructor(e,t,n){if(this.mode=e,this.numChars=t,this.bitData=n,t<0)throw RangeError(`Invalid argument`);this.bitData=n.slice()}static makeBytes(t){let r=[];for(let e of t)n(e,8,r);return new e(e.Mode.BYTE,t.length,r)}static makeNumeric(t){if(!e.isNumeric(t))throw RangeError(`String contains non-numeric characters`);let r=[];for(let e=0;e<t.length;){let i=Math.min(t.length-e,3);n(parseInt(t.substring(e,e+i),10),i*3+1,r),e+=i}return new e(e.Mode.NUMERIC,t.length,r)}static makeAlphanumeric(t){if(!e.isAlphanumeric(t))throw RangeError(`String contains unencodable characters in alphanumeric mode`);let r=[],i;for(i=0;i+2<=t.length;i+=2){let a=e.ALPHANUMERIC_CHARSET.indexOf(t.charAt(i))*45;a+=e.ALPHANUMERIC_CHARSET.indexOf(t.charAt(i+1)),n(a,11,r)}return i<t.length&&n(e.ALPHANUMERIC_CHARSET.indexOf(t.charAt(i)),6,r),new e(e.Mode.ALPHANUMERIC,t.length,r)}static makeSegments(t){return t==``?[]:e.isNumeric(t)?[e.makeNumeric(t)]:e.isAlphanumeric(t)?[e.makeAlphanumeric(t)]:[e.makeBytes(e.toUtf8ByteArray(t))]}static makeEci(t){let r=[];if(t<0)throw RangeError(`ECI assignment value out of range`);if(t<128)n(t,8,r);else if(t<16384)n(2,2,r),n(t,14,r);else if(t<1e6)n(6,3,r),n(t,21,r);else throw RangeError(`ECI assignment value out of range`);return new e(e.Mode.ECI,0,r)}static isNumeric(t){return e.NUMERIC_REGEX.test(t)}static isAlphanumeric(t){return e.ALPHANUMERIC_REGEX.test(t)}getData(){return this.bitData.slice()}static getTotalBits(e,t){let n=0;for(let r of e){let e=r.mode.numCharCountBits(t);if(r.numChars>=1<<e)return 1/0;n+=4+e+r.bitData.length}return n}static toUtf8ByteArray(e){e=encodeURI(e);let t=[];for(let n=0;n<e.length;n++)e.charAt(n)==`%`?(t.push(parseInt(e.substring(n+1,n+3),16)),n+=2):t.push(e.charCodeAt(n));return t}};a.NUMERIC_REGEX=/^[0-9]*$/,a.ALPHANUMERIC_REGEX=/^[A-Z0-9 $%*+.\/:-]*$/,a.ALPHANUMERIC_CHARSET=`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:`;let o=a;e.QrSegment=a})(F||={}),(e=>{(e=>{let t=class{constructor(e,t){this.ordinal=e,this.formatBits=t}};t.LOW=new t(0,1),t.MEDIUM=new t(1,0),t.QUARTILE=new t(2,3),t.HIGH=new t(3,2),e.Ecc=t})(e.QrCode||={})})(F||={}),(e=>{(e=>{let t=class{constructor(e,t){this.modeBits=e,this.numBitsCharCount=t}numCharCountBits(e){return this.numBitsCharCount[Math.floor((e+7)/17)]}};t.NUMERIC=new t(1,[10,12,14]),t.ALPHANUMERIC=new t(2,[9,11,13]),t.BYTE=new t(4,[8,16,16]),t.KANJI=new t(8,[8,10,12]),t.ECI=new t(7,[0,0,0]),e.Mode=t})(e.QrSegment||={})})(F||={});var I=F,L={L:I.QrCode.Ecc.LOW,M:I.QrCode.Ecc.MEDIUM,Q:I.QrCode.Ecc.QUARTILE,H:I.QrCode.Ecc.HIGH},Ee=128,De=`L`,Oe=`#FFFFFF`,R=`#000000`,ke=!1,Ae=1,z=4,B=0,V=.1;function H(e,t=0){let n=[];return e.forEach(function(e,r){let i=null;e.forEach(function(a,o){if(!a&&i!==null){n.push(`M${i+t} ${r+t}h${o-i}v1H${i+t}z`),i=null;return}if(o===e.length-1){if(!a)return;i===null?n.push(`M${o+t},${r+t} h1v1H${o+t}z`):n.push(`M${i+t},${r+t} h${o+1-i}v1H${i+t}z`);return}a&&i===null&&(i=o)})}),n.join(``)}function U(e,t){return e.slice().map((e,n)=>n<t.y||n>=t.y+t.h?e:e.map((e,n)=>n<t.x||n>=t.x+t.w?e:!1))}function W(e,t,n,r){if(r==null)return null;let i=e.length+n*2,a=Math.floor(t*V),o=i/t,s=(r.width||a)*o,c=(r.height||a)*o,l=r.x==null?e.length/2-s/2:r.x*o,u=r.y==null?e.length/2-c/2:r.y*o,d=r.opacity==null?1:r.opacity,f=null;if(r.excavate){let e=Math.floor(l),t=Math.floor(u);f={x:e,y:t,w:Math.ceil(s+l-e),h:Math.ceil(c+u-t)}}let p=r.crossOrigin;return{x:l,y:u,h:c,w:s,excavation:f,opacity:d,crossOrigin:p}}function je(e,t){return t==null?e?z:B:Math.max(Math.floor(t),0)}function Me({value:e,level:t,minVersion:n,includeMargin:r,marginSize:i,imageSettings:a,size:o,boostLevel:s}){let c=O.useMemo(()=>{let r=(Array.isArray(e)?e:[e]).reduce((e,t)=>(e.push(...I.QrSegment.makeSegments(t)),e),[]);return I.QrCode.encodeSegments(r,L[t],n,void 0,void 0,s)},[e,t,n,s]),{cells:l,margin:u,numCells:d,calculatedImageSettings:f}=O.useMemo(()=>{let e=c.getModules(),t=je(r,i);return{cells:e,margin:t,numCells:e.length+t*2,calculatedImageSettings:W(e,o,t,a)}},[c,o,a,r,i]);return{qrcode:c,margin:u,cells:l,numCells:d,calculatedImageSettings:f}}var G=function(){try{new Path2D().addPath(new Path2D)}catch{return!1}return!0}(),K=O.forwardRef(function(e,t){let n=e,{value:r,size:i=Ee,level:a=De,bgColor:o=Oe,fgColor:s=R,includeMargin:c=ke,minVersion:l=Ae,boostLevel:u,marginSize:d,imageSettings:f}=n,p=Te(n,[`value`,`size`,`level`,`bgColor`,`fgColor`,`includeMargin`,`minVersion`,`boostLevel`,`marginSize`,`imageSettings`]),{style:m}=p,h=Te(p,[`style`]),g=f?.src,_=O.useRef(null),v=O.useRef(null),ee=O.useCallback(e=>{_.current=e,typeof t==`function`?t(e):t&&(t.current=e)},[t]),[te,y]=O.useState(!1),{margin:ne,cells:b,numCells:x,calculatedImageSettings:S}=Me({value:r,level:a,minVersion:l,boostLevel:u,includeMargin:c,marginSize:d,imageSettings:f,size:i});O.useEffect(()=>{if(_.current!=null){let e=_.current,t=e.getContext(`2d`);if(!t)return;let n=b,r=v.current,a=S!=null&&r!==null&&r.complete&&r.naturalHeight!==0&&r.naturalWidth!==0;a&&S.excavation!=null&&(n=U(b,S.excavation));let c=window.devicePixelRatio||1;e.height=e.width=i*c;let l=i/x*c;t.scale(l,l),t.fillStyle=o,t.fillRect(0,0,x,x),t.fillStyle=s,G?t.fill(new Path2D(H(n,ne))):b.forEach(function(e,n){e.forEach(function(e,r){e&&t.fillRect(r+ne,n+ne,1,1)})}),S&&(t.globalAlpha=S.opacity),a&&t.drawImage(r,S.x+ne,S.y+ne,S.w,S.h)}}),O.useEffect(()=>{y(!1)},[g]);let re=we({height:i,width:i},m),C=null;return g!=null&&(C=O.createElement(`img`,{src:g,key:g,style:{display:`none`},onLoad:()=>{y(!0)},ref:v,crossOrigin:S?.crossOrigin})),O.createElement(O.Fragment,null,O.createElement(`canvas`,we({style:re,height:i,width:i,ref:ee,role:`img`},h)),C)});K.displayName=`QRCodeCanvas`;var Ne=O.forwardRef(function(e,t){let n=e,{value:r,size:i=Ee,level:a=De,bgColor:o=Oe,fgColor:s=R,includeMargin:c=ke,minVersion:l=Ae,boostLevel:u,title:d,marginSize:f,imageSettings:p}=n,m=Te(n,[`value`,`size`,`level`,`bgColor`,`fgColor`,`includeMargin`,`minVersion`,`boostLevel`,`title`,`marginSize`,`imageSettings`]),{margin:h,cells:g,numCells:_,calculatedImageSettings:v}=Me({value:r,level:a,minVersion:l,boostLevel:u,includeMargin:c,marginSize:f,imageSettings:p,size:i}),ee=g,te=null;p!=null&&v!=null&&(v.excavation!=null&&(ee=U(g,v.excavation)),te=O.createElement(`image`,{href:p.src,height:v.h,width:v.w,x:v.x+h,y:v.y+h,preserveAspectRatio:`none`,opacity:v.opacity,crossOrigin:v.crossOrigin}));let y=H(ee,h);return O.createElement(`svg`,we({height:i,width:i,viewBox:`0 0 ${_} ${_}`,ref:t,role:`img`},m),!!d&&O.createElement(`title`,null,d),O.createElement(`path`,{fill:o,d:`M0,0 h${_}v${_}H0z`,shapeRendering:`crispEdges`}),O.createElement(`path`,{fill:s,d:y,shapeRendering:`crispEdges`}),te)});Ne.displayName=`QRCodeSVG`;function Pe(e){return e.normalize(`NFD`).replace(/\p{M}/gu,``).toLowerCase().replace(/\b(?:19|20)\d{2}\b/g,` `).replace(/&/g,` and `).replace(/[^a-z0-9]+/g,` `).trim()}function Fe(e){return Array.from(new Set([e.title,e.originalTitle].filter(e=>!!e?.trim()).map(Pe).filter(Boolean))).map(t=>`${t}:${e.year}`)}function Ie(e){return e.sourceProvider===`phimhdcss`?0:e.sourceProvider?2:1}function Le(e){let t=e.map((e,t)=>({movie:e,index:t})).sort((e,t)=>Ie(e.movie)-Ie(t.movie)||e.index-t.index),n=new Set,r=new Set,i=[];for(let{movie:e}of t){if(e.sourceUrl&&r.has(e.sourceUrl))continue;let t=Fe(e);if(!t.some(e=>n.has(e))){i.push(e),e.sourceUrl&&r.add(e.sourceUrl);for(let e of t)n.add(e)}}return i}function Re(e,t){let n=t.trim().toLocaleLowerCase();return n?[e.title,e.originalTitle??``,e.synopsis,e.genres.join(` `),e.cast.join(` `),e.creators?.join(` `)??``,e.director??``].join(` `).toLocaleLowerCase().includes(n):!1}var ze={myList:[],likedTitles:[],progress:[],subtitlePreferences:{fontSize:32,positionX:50,positionY:78,fontColor:`#ffffff`,backgroundColor:`rgba(0,0,0,0.75)`,fontFamily:`default`,captionsOn:!1,updatedAt:``}},Be=[{label:`Home`,href:`/netflix`},{label:`Series`,href:`/netflix#netflix-originals`},{label:`Films`,href:`/netflix#movie-night`},{label:`New & Popular`,href:`/netflix#top-10`},{label:`My List`,href:`/netflix#my-list`},{label:`Browse by language`,href:`/netflix#footer`}];function Ve(e){return e?`/netflix/search?q=${encodeURIComponent(e)}`:`/netflix/search`}function q(){let e=j(null);return A(()=>{let t=document.activeElement,n=()=>Array.from(e.current?.querySelectorAll(`button, a[href], input, select, textarea, [tabindex]:not([tabindex="-1"])`)??[]).filter(e=>!e.hasAttribute(`disabled`)),r=window.requestAnimationFrame(()=>n()[0]?.focus()),i=t=>{if(t.key!==`Tab`)return;let r=n();if(!r.length)return;let i=r[0],a=r[r.length-1];t.shiftKey&&document.activeElement===i?(t.preventDefault(),a.focus()):(!t.shiftKey&&document.activeElement===a||document.activeElement&&!e.current?.contains(document.activeElement))&&(t.preventDefault(),i.focus())};return document.addEventListener(`keydown`,i),()=>{window.cancelAnimationFrame(r),document.removeEventListener(`keydown`,i),t?.isConnected&&t.focus()}},[]),e}function He({featured:e,rows:t,initialImportedTitles:n,initialProviders:r,initialProfiles:i,initialActiveProfile:a,initialProfileLibrary:o,initialSearchOpen:s=!1,initialSearchQuery:c=``}){let[l,u]=M(!1),[d,f]=M(!1),[p,m]=M(!1),[h,g]=M(!1),[_,v]=M(s),[ee,y]=M(!1),[ne,x]=M(!1),[S,re]=M(!1),[C,ie]=M(!1),[ae,oe]=M(r),[w,se]=M(n),[ce,le]=M(i),[T,O]=M(a),[fe,pe]=M(o),[me,he]=M(``),[N,ge]=M(c),[_e,ve]=M([]),[P,ye]=M(``),[be,xe]=M(`idle`),[Se,Ce]=M(``),[we,Te]=M(null),[F,I]=M(null),[L,Ee]=M(null),[De,Oe]=M(!1),[R,ke]=M(new Set(o.myList)),[Ae,z]=M(new Set(o.likedTitles)),B=j(null),V=j(s),H=j(c),U=j({version:0,controller:null}),W=j(a.id),je=j(0),Me=j(0),G=k(e=>{W.current!==e&&(W.current=e,je.current+=1,U.current.version+=1,U.current.controller?.abort(),U.current.controller=null,oe([]),se([]),pe(ze),ke(new Set),z(new Set),I(null),Ee(null),he(``))},[]),K=k(()=>{U.current.version+=1,U.current.controller?.abort(),U.current.controller=null},[]),Ne=k(()=>{K(),Ee(null)},[K]);A(()=>()=>{K()},[K]);let Pe=k((e,t,n)=>{let r=e?Ve(t):`/netflix`;`${window.location.pathname}${window.location.search}${window.location.hash}`!==r&&(n===`push`?window.history.pushState(null,``,r):window.history.replaceState(null,``,r))},[]),Fe=k(e=>{let t=V.current;if(V.current=e,v(e),e){t||Pe(!0,H.current,`push`);return}H.current=``,ge(``),t&&Pe(!1,``,`push`)},[Pe]),Ie=k(e=>{H.current=e,ge(e),V.current&&Pe(!0,e,`replace`)},[Pe]),Be=de(()=>{let n=[e,...w,...t.flatMap(e=>e.items)];return Array.from(new Map(n.map(e=>[e.id,e])).values())},[e,w,t]),q=de(()=>{let e=new Map(fe.progress.map(e=>[e.titleId,e]));return Be.map(t=>{let n=e.get(t.id);return!n||n.completed||n.positionSeconds<1?{...t,progress:void 0,resumeSeason:void 0,resumeEpisode:void 0,resumePositionSeconds:void 0,resumeDurationSeconds:void 0,resumeUpdatedAt:void 0}:{...t,progress:n.durationSeconds>0?Math.min(100,n.positionSeconds/n.durationSeconds*100):0,resumeSeason:n.seasonNumber,resumeEpisode:n.episodeNumber,resumePositionSeconds:n.positionSeconds,resumeDurationSeconds:n.durationSeconds,resumeUpdatedAt:n.updatedAt}})},[Be,fe.progress]),He=de(()=>new Map(q.map(e=>[e.id,e])),[q]),We=de(()=>{let e=N.trim();return e?q.filter(t=>Re(t,e)):[]},[q,N]),Ge=N.trim(),Ke=Ge.length>=2&&P===Ge?_e:[],qe=Ge.length<2?`idle`:P===Ge?be:`loading`,Je=P===Ge?Se:``,Ye=Le([...We,...Ke]),$e=de(()=>q.filter(e=>R.has(e.id)),[R,q]),J=de(()=>{let e=new Map(fe.progress.map(e=>[e.titleId,e]));return q.filter(t=>{let n=e.get(t.id);return!!(n&&!n.completed&&n.positionSeconds>=1&&(n.durationSeconds<=0||n.positionSeconds/n.durationSeconds<.95))}).sort((t,n)=>{let r=e.get(t.id)?.updatedAt??``;return(e.get(n.id)?.updatedAt??``).localeCompare(r)})},[fe.progress,q]);A(()=>{let e=()=>u(window.scrollY>24);return e(),window.addEventListener(`scroll`,e,{passive:!0}),()=>window.removeEventListener(`scroll`,e)},[]),A(()=>{let e=()=>{let e=window.location.pathname.replace(/\/+$/,``)===`/netflix/search`,t=e?new URLSearchParams(window.location.search).get(`q`)??``:``;V.current=e,H.current=t,v(e),ge(t)};return window.addEventListener(`popstate`,e),()=>window.removeEventListener(`popstate`,e)},[]),A(()=>{_&&(window.scrollTo(0,0),B.current?.focus())},[_]),A(()=>{let e=N.trim();if(!_||e.length<2)return;let t=new AbortController,n=window.setTimeout(()=>{ye(e),ve([]),xe(`loading`),Ce(``),fetch(`/api/netflix/search?q=${encodeURIComponent(e)}`,{cache:`no-store`,signal:t.signal}).then(async e=>{let t=await e.json();if(!e.ok)throw Error(t.error||`Provider search failed.`);ve(t.titles??[]),xe(`ready`),t.failedProviders?.length&&Ce(`Some providers could not be searched: ${t.failedProviders.join(`, `)}.`)}).catch(e=>{t.signal.aborted||(xe(`error`),Ce(e instanceof Error?e.message:`Provider search failed.`))})},350);return()=>{window.clearTimeout(n),t.abort()}},[_,N]),A(()=>{let e=e=>{e.key===`Escape`&&(L?Ne():F?I(null):C?ie(!1):S?re(!1):_&&N?Ie(``):_?Fe(!1):(y(!1),x(!1),f(!1),m(!1),g(!1)))};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[S,Ne,C,L,_,N,F,Fe,Ie]);let nt=k(async e=>{let t=++je.current,n=await fetch(`/api/netflix/library?profileId=${encodeURIComponent(e)}`,{cache:`no-store`});if(!n.ok)return;let r=await n.json();W.current!==e||t!==je.current||(oe(r.providers),se(r.titles))},[]),rt=k(async e=>{let t=T.id,n=q.find(t=>t.id===e.id||e.sourceUrl&&t.sourceUrl===e.sourceUrl);if(n||!e.sourceProvider||!e.sourceUrl){Fe(!1),I(n??e);return}Te(e.id),Ce(``);try{let n=await fetch(`/api/netflix/movies/import`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({url:e.sourceUrl,mode:`stream`,profileId:t})}),r=await n.json();if(!n.ok||!r.title)throw Error(r.error||`Movie details could not be loaded.`);if(W.current!==t)return;se(e=>[r.title,...e.filter(e=>e.id!==r.title.id&&e.sourceUrl!==r.title.sourceUrl)]),Fe(!1),I(r.title)}catch(e){Ce(e instanceof Error?e.message:`Movie details could not be loaded.`)}finally{Te(null)}},[T.id,q,Fe]);A(()=>{let e=T.id,t=window.setTimeout(()=>void nt(e),0);return()=>window.clearTimeout(t)},[T.id,nt]),A(()=>{if(!w.some(e=>e.downloadStatus===`queued`||e.downloadStatus===`downloading`))return;let e=T.id,t=window.setInterval(()=>void nt(e),3e3);return()=>window.clearInterval(t)},[T.id,w,nt]),A(()=>(document.body.style.overflow=F||L||S?`hidden`:``,()=>{document.body.style.overflow=``}),[S,L,F]);let it=k(e=>{pe(e),ke(new Set(e.myList)),z(new Set(e.likedTitles))},[]),at=k(async e=>{let t=await fetch(`/api/netflix/profiles/${encodeURIComponent(e)}/library`,{cache:`no-store`});if(!t.ok)throw Error(`Profile library could not be loaded.`);let n=await t.json();W.current===e&&it(n)},[it]),ot=k(async e=>{let t=++Me.current,n=await fetch(`/api/netflix/profiles/${encodeURIComponent(e.id)}/select`,{method:`POST`});if(!n.ok)return;let r=await n.json();t===Me.current&&(G(r.activeProfile.id),O(r.activeProfile),it(r.library),m(!1),I(null),K(),Ee(null))},[it,G,K]),st=k(async(e,t)=>{let n=T.id!==t.id;n&&G(t.id),le(e),O(t),n&&await at(t.id)},[T.id,G,at]),Y=e=>{let t=T.id,n=!R.has(e.id);ke(t=>{let r=new Set(t);return n?r.add(e.id):r.delete(e.id),r}),fetch(`/api/netflix/profiles/${encodeURIComponent(t)}/library`,{method:`PATCH`,headers:{"content-type":`application/json`},body:JSON.stringify({titleId:e.id,inMyList:n})}).then(async e=>{if(!e.ok)throw Error();W.current===t&&it(await e.json())}).catch(()=>void at(t))},ct=e=>{let t=T.id,n=!Ae.has(e.id);z(t=>{let r=new Set(t);return n?r.add(e.id):r.delete(e.id),r}),fetch(`/api/netflix/profiles/${encodeURIComponent(t)}/library`,{method:`PATCH`,headers:{"content-type":`application/json`},body:JSON.stringify({titleId:e.id,liked:n})}).then(async e=>{if(!e.ok)throw Error();W.current===t&&it(await e.json())}).catch(()=>void at(t))},ut=(e,t)=>{if(K(),e.sourceProvider&&!e.playbackPath&&!e.canStream){I(e);return}let n=t??e.resumeEpisode,r=e.episodes?.find(e=>e.episode===n)||(e.episode?.episode===n?e.episode:void 0)||(n?{season:e.resumeSeason??e.episode?.season??1,episode:n,title:`Episode ${n}`,duration:e.resumeDurationSeconds?`${Math.max(1,Math.round(e.resumeDurationSeconds/60))}m`:`45m`}:e.episode||e.episodes?.[0]),i=t===void 0||t===e.resumeEpisode;I(null),Ee(r?{...e,episode:r,resumePositionSeconds:i?e.resumePositionSeconds:void 0,resumeDurationSeconds:i?e.resumeDurationSeconds:void 0}:e)},Z=k(async e=>{let t=U.current;t.version+=1;let n=t.version;t.controller?.abort();let r=new AbortController;t.controller=r;try{let t=await fetch(`/api/netflix/titles/${encodeURIComponent(e)}?profileId=${encodeURIComponent(T.id)}`,{cache:`no-store`,signal:r.signal}),i=await t.json();if(!t.ok||!i.title)throw Error(i.error||`The requested movie was not found.`);if(r.signal.aborted||n!==U.current.version)return;let a=i.title;if(a.sourceProvider&&!a.playbackPath&&!a.canStream)throw Error(`The requested movie is not available to stream.`);a.sourceProvider&&se(e=>[a,...e.filter(e=>e.id!==a.id)]);let o=a.resumeEpisode??a.episode?.episode,s=a.episodes?.find(e=>e.episode===o)||(a.episode?.episode===o?a.episode:void 0)||(o?{season:a.resumeSeason??a.episode?.season??1,episode:o,title:`Episode ${o}`,duration:a.resumeDurationSeconds?`${Math.max(1,Math.round(a.resumeDurationSeconds/60))}m`:`45m`}:a.episode||a.episodes?.[0]);I(null),Ee(s?{...a,episode:s}:a)}catch(e){if(r.signal.aborted||n!==U.current.version)return;throw e}finally{U.current.controller===r&&(U.current.controller=null)}},[T.id]),dt=k(e=>{pe(t=>({...t,progress:[e,...t.progress.filter(t=>t.titleId!==e.titleId)]}))},[]);return D(`main`,{className:`site-shell`,children:[E(Ue,{isScrolled:l,mobileMenuOpen:d,setMobileMenuOpen:f,searchOpen:_,setSearchOpen:Fe,searchQuery:N,setSearchQuery:Ie,searchInputRef:B,profileOpen:p,setProfileOpen:m,notificationsOpen:h,setNotificationsOpen:g,sourcesOpen:ee,setSourcesOpen:y,downloadsOpen:ne,setDownloadsOpen:x,downloads:w.map(e=>He.get(e.id)??e),onPlay:e=>{x(!1),ut(e)},providers:ae,syncMessage:me,onSync:async e=>{let t=T.id;oe(t=>t.map(t=>t.id===e?{...t,syncStatus:`syncing`,lastError:null}:t)),he(`Syncing provider homepage…`);let n=await fetch(`/api/netflix/providers/${e}/sync?profileId=${encodeURIComponent(t)}`,{method:`POST`}),r=await n.json();W.current===t&&(he(n.ok?`${r.count??0} titles synced to SQLite.`:r.error||`Provider sync failed.`),await nt(t))},onAddMovie:()=>{y(!1),x(!1),re(!0)},profiles:ce,activeProfile:T,onSelectProfile:ot,onManageProfiles:()=>{m(!1),ie(!0)}}),_?E(et,{query:N,results:Ye,providerStatus:qe,error:Je,resolvingTitleId:we,onSelect:e=>void rt(e)}):D(ue,{children:[E(Ze,{title:He.get(e.id)??e,previewPaused:De,setPreviewPaused:Oe,onPlay:()=>ut(He.get(e.id)??e),onMoreInfo:()=>I(He.get(e.id)??e)}),D(`section`,{className:`catalog`,"aria-label":`Netflix catalog`,children:[w.length>0&&E(Qe,{row:{id:`provider-library`,title:`Your Provider Library`,kind:`standard`,items:w.map(e=>He.get(e.id)??e)},rowIndex:-2,myList:R,likedTitles:Ae,onSelect:I,onPlay:ut,onToggleMyList:Y,onToggleLike:ct}),J.length>0&&E(Qe,{row:{id:`continue-watching`,title:`Continue Watching for ${T.name}`,kind:`continue-watching`,items:J},rowIndex:-3,myList:R,likedTitles:Ae,onSelect:I,onPlay:ut,onToggleMyList:Y,onToggleLike:ct}),E(`div`,{className:`my-list-anchor`,id:`my-list`,children:$e.length>0?E(Qe,{row:{id:`my-list-row`,title:`My List`,kind:`standard`,items:$e},rowIndex:-1,myList:R,likedTitles:Ae,onSelect:I,onPlay:ut,onToggleMyList:Y,onToggleLike:ct}):D(`div`,{className:`my-list-empty`,children:[E(`span`,{"aria-hidden":`true`,children:E(b,{})}),D(`div`,{children:[E(`h2`,{children:`Your list is ready for something great`}),E(`p`,{children:`Use the plus button on any title to save it here for later.`})]})]})}),t.map((e,t)=>E(Qe,{row:{...e,items:e.items.map(e=>He.get(e.id)??e)},rowIndex:t,myList:R,likedTitles:Ae,onSelect:I,onPlay:ut,onToggleMyList:Y,onToggleLike:ct},e.id))]}),E(X,{})]}),F&&E(tt,{title:F,isInMyList:R.has(F.id),isLiked:Ae.has(F.id),onClose:()=>I(null),onPlay:e=>ut(F,e),onToggleMyList:()=>Y(F),onToggleLike:()=>ct(F)}),L&&E(lt,{title:L,profileId:T.id,subtitlePreferences:fe.subtitlePreferences,onProgressChange:dt,onSubtitlePreferencesChange:e=>pe(t=>({...t,subtitlePreferences:e})),onSwitchTitle:Z,onClose:Ne},L.id),C&&E(te,{profiles:ce,activeProfile:T,onClose:()=>ie(!1),onProfilesChanged:st}),S&&E(Xe,{profileId:T.id,onClose:()=>re(!1),onImported:async()=>{re(!1),he(`Title and episode metadata added to your library.`),await nt(T.id)}})]})}function Ue({isScrolled:e,mobileMenuOpen:t,setMobileMenuOpen:n,searchOpen:r,setSearchOpen:i,searchQuery:a,setSearchQuery:o,searchInputRef:s,profileOpen:c,setProfileOpen:l,notificationsOpen:u,setNotificationsOpen:d,sourcesOpen:f,setSourcesOpen:h,downloadsOpen:g,setDownloadsOpen:_,downloads:v,onPlay:ee,providers:te,syncMessage:y,onSync:ne,onAddMovie:b,profiles:x,activeProfile:re,onSelectProfile:ie,onManageProfiles:oe}){let[w,se]=M(!1);return D(`header`,{className:`top-nav${e?` top-nav--solid`:``}${r?` top-nav--search`:``}`,children:[D(`div`,{className:`nav-start`,children:[E(`button`,{className:`icon-button mobile-menu-button`,"aria-label":t?`Close navigation`:`Open navigation`,onClick:()=>{se(!1),n(!t)},children:E(t?p:ge,{})}),E(`a`,{className:`netflix-wordmark`,href:`/netflix`,"aria-label":`Netflix home`,children:`NETFLIX`}),E(`nav`,{className:`primary-nav${t?` primary-nav--open`:``}`,"aria-label":`Primary navigation`,children:Be.map((e,t)=>E(`a`,{className:t===0?`active`:``,href:e.href,onClick:()=>n(!1),children:e.label},e.label))})]}),D(`div`,{className:`nav-end`,children:[D(`div`,{className:`nav-popover-wrap`,children:[E(`button`,{className:`icon-button access-button`,"aria-label":`Access Home Atom`,"aria-expanded":w,"aria-controls":`access-popover`,onClick:()=>{se(!w),h(!1),_(!1),l(!1),d(!1),i(!1)},children:E(P,{})}),w&&E(Ge,{})]}),D(`div`,{className:`nav-popover-wrap`,children:[E(`button`,{className:`icon-button source-button`,"aria-label":`Movie sources`,"aria-expanded":f,onClick:()=>{se(!1),h(!f),_(!1),l(!1),d(!1),i(!1)},children:E(ae,{})}),f&&E(Ke,{providers:te,message:y,onSync:ne,onAddMovie:b})]}),D(`div`,{className:`nav-popover-wrap`,children:[D(`button`,{className:`icon-button download-button`,"aria-label":`Downloads`,"aria-expanded":g,onClick:()=>{se(!1),_(!g),h(!1),l(!1),d(!1),i(!1)},children:[E(C,{}),v.some(e=>e.downloadStatus===`queued`||e.downloadStatus===`downloading`)&&E(`span`,{className:`download-badge`,"aria-hidden":`true`,children:v.filter(e=>e.downloadStatus===`queued`||e.downloadStatus===`downloading`).length})]}),g&&E(qe,{titles:v,onPlay:ee})]}),D(`div`,{className:`search-box${r?` search-box--open`:``}`,children:[E(`button`,{className:`icon-button search-trigger`,"aria-label":r?`Focus search`:`Search`,onClick:()=>{se(!1),h(!1),_(!1),l(!1),d(!1),r?s.current?.focus():i(!0)},children:E(m,{})}),E(`input`,{ref:s,tabIndex:r?0:-1,"aria-label":`Search for titles, people, and genres`,placeholder:`Titles, people, genres`,value:a,onChange:e=>o(e.target.value)}),r&&E(`button`,{className:`search-clear`,"aria-label":a?`Clear search`:`Close search`,onClick:()=>{a?o(``):i(!1)},children:E(p,{})})]}),D(`div`,{className:`nav-popover-wrap`,children:[D(`button`,{className:`icon-button notification-button`,"aria-label":`Notifications`,"aria-expanded":u,onClick:()=>{se(!1),h(!1),_(!1),d(!u),l(!1)},children:[E(T,{}),E(`span`,{className:`notification-dot`})]}),u&&E(Je,{})]}),D(`div`,{className:`nav-popover-wrap`,children:[D(`button`,{className:`profile-trigger`,"aria-label":`Open profile menu`,"aria-expanded":c,onClick:()=>{se(!1),h(!1),_(!1),l(!c),d(!1)},children:[D(`span`,{className:`profile-avatar`,"aria-hidden":`true`,style:{backgroundColor:re.avatarColor},children:[E(`span`,{}),E(`span`,{}),E(`span`,{})]}),E(S,{className:c?`rotate`:``})]}),c&&E(Ye,{profiles:x,activeProfile:re,onSelectProfile:ie,onManageProfiles:oe})]})]})]})}function We(e){let t=document.createElement(`textarea`);t.value=e,t.setAttribute(`readonly`,``),t.style.position=`fixed`,t.style.opacity=`0`,document.body.append(t),t.select();let n=document.execCommand(`copy`);if(t.remove(),!n)throw Error(`Copy is not available.`)}function Ge(){let[e,t]=M(`lan`),[n,r]=M(null),[i,a]=M(``),[o,s]=M(!1),c=j(null);A(()=>{let e=new AbortController,t=`${window.location.pathname}${window.location.search}`;return fetch(`/api/access?path=${encodeURIComponent(t)}`,{cache:`no-store`,signal:e.signal}).then(async e=>{let t=await e.json();if(!e.ok)throw Error(t.error||`Could not detect network addresses.`);r(t)}).catch(t=>{e.signal.aborted||a(t instanceof Error?t.message:`Could not detect network addresses.`)}),()=>{e.abort(),c.current&&clearTimeout(c.current)}},[]);let l=n?.[e]??null,u=e===`lan`?`LAN`:`VPN (Tailscale)`,d=async()=>{if(l){try{navigator.clipboard?.writeText?await navigator.clipboard.writeText(l.url):We(l.url)}catch{We(l.url)}s(!0),c.current&&clearTimeout(c.current),c.current=setTimeout(()=>s(!1),1800)}};return D(`div`,{className:`nav-popover access-popover`,id:`access-popover`,role:`dialog`,"aria-label":`Access Home Atom from another device`,children:[E(`div`,{className:`popover-caret`}),D(`div`,{className:`access-heading`,children:[E(`span`,{children:E(P,{})}),D(`div`,{children:[E(`b`,{children:`Open on another device`}),E(`small`,{children:`Scan or copy an address on the same network`})]})]}),E(`div`,{className:`access-tabs`,role:`tablist`,"aria-label":`Network`,children:[[`lan`,`LAN`],[`vpn`,`VPN (Tailscale)`]].map(([n,r])=>E(`button`,{type:`button`,role:`tab`,"aria-selected":e===n,"aria-controls":`access-tab-panel`,onClick:()=>{t(n),s(!1)},children:r},n))}),E(`div`,{className:`access-tab-panel`,id:`access-tab-panel`,role:`tabpanel`,children:!n&&!i?D(`div`,{className:`access-loading`,role:`status`,children:[E(f,{className:`spin`}),`Detecting `,u,` address…`]}):i?D(`div`,{className:`access-unavailable`,role:`alert`,children:[E(P,{}),E(`b`,{children:`Network address unavailable`}),E(`small`,{children:i})]}):l?D(ue,{children:[D(`div`,{className:`access-url-row`,children:[D(`a`,{href:l.url,target:`_blank`,rel:`noreferrer`,title:l.url,children:[E(`span`,{children:l.url}),E(ce,{"aria-hidden":`true`})]}),D(`button`,{type:`button`,"aria-label":`Copy ${u} URL`,onClick:()=>void d(),children:[E(o?h:fe,{}),E(`span`,{children:o?`Copied`:`Copy`})]})]}),E(`div`,{className:`access-qr`,children:E(Ne,{value:l.url,size:184,level:`M`,marginSize:3,title:`${u} access QR code`})}),E(`p`,{children:`Scan with your phone or tablet to open Home Atom.`})]}):D(`div`,{className:`access-unavailable`,role:`status`,children:[E(P,{}),D(`b`,{children:[u,` address not found`]}),E(`small`,{children:e===`lan`?`Connect the server to your local network and try again.`:`Start Tailscale on the server, then reopen this panel.`})]})})]})}function Ke({providers:e,message:t,onSync:n,onAddMovie:r}){return D(`div`,{className:`nav-popover sources-popover`,children:[E(`div`,{className:`popover-caret`}),D(`div`,{className:`sources-heading`,children:[E(`span`,{children:E(ae,{})}),D(`div`,{children:[E(`b`,{children:`Content sources`}),E(`small`,{children:`Sync homepage metadata to SQLite`})]})]}),E(`div`,{className:`provider-list`,children:e.map(e=>D(`article`,{children:[E(`span`,{className:`provider-mark`,children:e.name.slice(0,1).toUpperCase()}),D(`span`,{className:`provider-copy`,children:[E(`b`,{children:e.name}),E(`a`,{href:e.baseUrl,target:`_blank`,rel:`noreferrer`,children:new URL(e.baseUrl).hostname}),E(`small`,{children:e.lastError||(e.lastSyncedAt?`Synced ${new Date(e.lastSyncedAt).toLocaleString()}`:`Not synced yet`)})]}),E(`button`,{className:`provider-sync`,"aria-label":`Sync ${e.name}`,title:`Sync ${e.name}`,disabled:e.syncStatus===`syncing`,onClick:()=>void n(e.id),children:e.syncStatus===`syncing`?E(f,{className:`spin`}):E(x,{})})]},e.id))}),t&&E(`p`,{className:`source-message`,role:`status`,children:t}),D(`button`,{className:`add-movie-button`,onClick:r,children:[E(b,{}),` Add movie from link`]})]})}function qe({titles:e,onPlay:t}){let n=e.filter(e=>e.sourceProvider&&e.downloadStatus&&e.downloadStatus!==`metadata`).sort((e,t)=>{let n=new Set([`queued`,`downloading`]);return Number(n.has(t.downloadStatus??``))-Number(n.has(e.downloadStatus??``))}),r=n.filter(e=>e.downloadStatus===`queued`||e.downloadStatus===`downloading`).length;return D(`div`,{className:`nav-popover downloads-popover`,children:[E(`div`,{className:`popover-caret`}),D(`div`,{className:`downloads-heading`,children:[E(`span`,{children:E(C,{})}),D(`div`,{children:[E(`b`,{children:`Downloads`}),E(`small`,{children:r>0?`${r} ${r===1?`movie`:`movies`} downloading`:n.length>0?`All downloads are up to date`:`No movies added yet`})]})]}),n.length>0?E(`div`,{className:`download-list`,"aria-live":`polite`,children:n.map(e=>{let n=Math.min(100,Math.max(0,e.downloadProgress??0)),r=e.downloadStatus===`queued`||e.downloadStatus===`downloading`,i=e.downloadStatus===`ready`?`Ready to play`:e.downloadStatus===`failed`?`Download failed`:e.downloadStatus===`queued`?`Waiting to download`:`Downloading — ${n}%`;return D(`article`,{className:`download-item download-item--${e.downloadStatus}`,children:[E(`button`,{type:`button`,className:`download-thumb`,"aria-label":`Play ${e.title}`,onClick:()=>t(e),style:{backgroundImage:`linear-gradient(90deg, transparent, rgba(0, 0, 0, 0.2)), url("${e.backdropImage}")`},children:E(`span`,{className:`download-thumb-play`,"aria-hidden":`true`,children:E(y,{fill:`currentColor`})})}),D(`div`,{className:`download-copy`,children:[D(`div`,{children:[E(`b`,{children:e.title}),E(`span`,{className:`download-status-icon`,"aria-hidden":`true`,children:e.downloadStatus===`ready`?E(h,{}):e.downloadStatus===`failed`?E(p,{}):E(f,{className:r?`spin`:``})})]}),E(`small`,{children:i}),E(`div`,{className:`download-progress`,role:`progressbar`,"aria-label":`${e.title} download progress`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":n,children:E(`span`,{style:{width:`${n}%`}})}),e.downloadError&&E(`em`,{title:e.downloadError,children:e.downloadError})]})]},e.id)})}):D(`div`,{className:`downloads-empty`,children:[E(C,{}),E(`b`,{children:`Your downloads will appear here`}),E(`small`,{children:`Add a movie from the Sources menu to get started.`})]})]})}function Je(){return D(`div`,{className:`nav-popover notification-popover`,children:[E(`div`,{className:`popover-caret`}),D(`article`,{children:[E(`span`,{className:`notification-thumb notification-thumb--one`}),D(`span`,{children:[E(`b`,{children:`New Arrival`}),E(`small`,{children:`What We Watched is now available.`}),E(`em`,{children:`2 days ago`})]})]}),D(`article`,{children:[E(`span`,{className:`notification-thumb notification-thumb--two`}),D(`span`,{children:[E(`b`,{children:`Top picks for you`}),E(`small`,{children:`Explore this week's most watched.`}),E(`em`,{children:`5 days ago`})]})]})]})}function Ye({profiles:e,activeProfile:t,onSelectProfile:n,onManageProfiles:i}){return D(`div`,{className:`nav-popover profile-popover`,children:[E(`div`,{className:`popover-caret`}),e.map(e=>D(`button`,{type:`button`,className:`profile-option`,"aria-current":e.id===t.id?`true`:void 0,onClick:()=>void n(e),children:[E(`span`,{className:`mini-avatar`,style:{backgroundColor:e.avatarColor},children:e.name.slice(0,1).toUpperCase()}),E(`span`,{children:e.name}),e.id===t.id&&E(h,{className:`profile-active-check`,"aria-label":`Active profile`})]},e.id)),D(`button`,{type:`button`,onClick:i,children:[E(_,{}),`Manage profile`]}),D(`a`,{href:`#account`,children:[E(_e,{}),`Account`]}),D(`a`,{href:`#help`,children:[E(r,{}),`Help Center`]}),D(`a`,{className:`profile-signout`,href:`#signout`,children:[E(N,{}),`Sign out of Netflix`]})]})}function Xe({profileId:e,onClose:t,onImported:n}){let r=q(),[i,a]=M(``),[o,s]=M(!1),[c,l]=M(!1),[u,d]=M(``);return E(`div`,{className:`modal-backdrop add-movie-backdrop`,onMouseDown:t,children:D(`article`,{ref:r,className:`add-movie-modal`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`add-movie-title`,onMouseDown:e=>e.stopPropagation(),children:[E(`button`,{className:`modal-close`,"aria-label":`Close`,onClick:t,children:E(p,{})}),E(`span`,{className:`add-movie-icon`,children:E(w,{})}),E(`h2`,{id:`add-movie-title`,children:`Add a movie`}),E(`p`,{children:`Paste a supported movie page. Metadata is stored in SQLite and the video can stream directly from its provider.`}),D(`form`,{onSubmit:async t=>{t.preventDefault(),l(!0),d(``);try{let t=await fetch(`/api/netflix/movies/import`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({url:i,mode:o?`download`:`stream`,profileId:e})}),r=await t.json();if(!t.ok)throw Error(r.error||`Movie import failed.`);await n()}catch(e){d(e instanceof Error?e.message:`Movie import failed.`),l(!1)}},children:[E(`label`,{htmlFor:`movie-url`,children:`Movie link`}),E(`input`,{id:`movie-url`,type:`url`,required:!0,autoFocus:!0,placeholder:`https://phimhdcss.com/linh-hao-truy-sat-22642`,value:i,onChange:e=>a(e.target.value)}),E(`small`,{children:`Supported: phimhdcss.com, phimhdcss.net, and fsharetv.com`}),D(`label`,{className:`offline-option`,children:[E(`input`,{type:`checkbox`,checked:o,onChange:e=>s(e.currentTarget.checked)}),D(`span`,{children:[E(`b`,{children:`Save an offline copy`}),E(`small`,{children:`Optional. Downloads the media and subtitles into the local data folder.`})]})]}),u&&E(`p`,{className:`form-error`,role:`alert`,children:u}),D(`div`,{className:`add-movie-actions`,children:[E(`button`,{type:`button`,className:`button button--secondary`,onClick:t,children:`Cancel`}),D(`button`,{type:`submit`,className:`button button--primary`,disabled:c,children:[c?E(f,{className:`spin`}):o?E(C,{}):E(y,{fill:`currentColor`}),c?`Fetching movie…`:o?`Add & download`:`Add & stream`]})]})]})]})})}function Ze({title:e,previewPaused:t,setPreviewPaused:n,onPlay:r,onMoreInfo:i}){let a={"--hero-image":`url("${e.backdropImage}")`,"--hero-accent":e.accentColor};return D(`section`,{className:`hero${t?` hero--paused`:``}`,id:`top`,style:a,children:[E(`div`,{className:`hero-backdrop`}),E(`div`,{className:`hero-vignette`}),D(`div`,{className:`hero-content`,children:[D(`p`,{className:`netflix-series`,children:[E(`span`,{children:`N`}),` SERIES`]}),e.logoImage?D(ue,{children:[E(`h1`,{className:`visually-hidden`,children:e.title}),E(`img`,{className:`hero-title-logo`,src:e.logoImage,alt:``,"aria-hidden":`true`})]}):E(`h1`,{children:e.title}),D(`p`,{className:`hero-rank`,children:[D(`span`,{children:[`TOP`,E(`br`,{}),`10`]}),`#`,e.rank??1,` in TV Shows Today`]}),E(`p`,{className:`hero-description`,children:e.synopsis}),D(`div`,{className:`hero-actions`,children:[D(`button`,{className:`button button--primary`,onClick:r,children:[E(y,{fill:`currentColor`}),` Play`]}),D(`button`,{className:`button button--secondary`,onClick:i,children:[E(he,{}),` More Info`]})]})]}),D(`div`,{className:`hero-side-controls`,children:[E(`button`,{className:`round-button`,"aria-label":t?`Resume preview motion`:`Pause preview motion`,onClick:()=>n(!t),children:E(t?y:d,{fill:`currentColor`})}),E(`span`,{className:`maturity-badge`,children:e.maturityRating})]}),E(`div`,{className:`hero-scroll-cue`,children:E(S,{})})]})}function Qe({row:e,rowIndex:n,myList:r,likedTitles:i,onSelect:a,onPlay:o,onToggleMyList:s,onToggleLike:c}){let l=j(null),u=e=>{let t=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches?`auto`:`smooth`;l.current?.scrollBy({left:e*l.current.clientWidth*.82,behavior:t})};return D(`section`,{className:`title-row title-row--${e.kind}`,id:n===0?`new-popular`:e.id,"aria-labelledby":`${e.id}-heading`,children:[D(`div`,{className:`row-heading`,children:[E(`h2`,{id:`${e.id}-heading`,children:e.title}),D(`button`,{className:`explore-link`,onClick:()=>l.current?.scrollTo({left:l.current.scrollWidth,behavior:window.matchMedia(`(prefers-reduced-motion: reduce)`).matches?`auto`:`smooth`}),children:[`Explore All `,E(v,{})]})]}),D(`div`,{className:`rail-shell`,children:[E(`button`,{className:`rail-control rail-control--left`,"aria-label":`Scroll ${e.title} left`,onClick:()=>u(-1),children:E(t,{})}),E(`div`,{className:`title-rail`,ref:l,children:e.items.map((t,n)=>E($e,{title:t,index:n,kind:e.kind,isInMyList:r.has(t.id),isLiked:i.has(t.id),onSelect:()=>a(t),onPlay:()=>o(t),onPlayEpisode:e=>o(t,e),onToggleMyList:()=>s(t),onToggleLike:()=>c(t)},`${e.id}-${t.id}`))}),E(`button`,{className:`rail-control rail-control--right`,"aria-label":`Scroll ${e.title} right`,onClick:()=>u(1),children:E(v,{})})]})]})}function $e({title:e,index:t,kind:n,isInMyList:r,isLiked:i,onSelect:a,onPlay:o,onPlayEpisode:s,onToggleMyList:c,onToggleLike:l}){let u=n===`ranked`,d=n===`originals`,f=n===`continue-watching`,p=d||u?e.posterImage:e.backdropImage,m=Math.min(100,Math.max(0,e.progress??0)),g=f?o:a;return D(`div`,{className:`title-card${u?` title-card--ranked`:``}${d?` title-card--portrait`:``}`,tabIndex:0,role:`button`,"aria-label":f?`Resume ${e.title}`:`Open details for ${e.title}`,onClick:g,onKeyDown:e=>{e.target===e.currentTarget&&(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),g())},children:[u&&E(`span`,{className:`rank-number`,"aria-hidden":`true`,children:e.rank??t+1}),D(`div`,{className:`card-visual`,children:[E(`img`,{src:p,alt:``,loading:`lazy`}),E(`div`,{className:`card-image-shade`}),e.isOriginal&&D(`span`,{className:`card-n`,children:[`N`,E(`small`,{children:e.mediaType===`movie`?`FILM`:`SERIES`})]}),e.isNew&&E(`span`,{className:`new-season`,children:`New`}),E(`span`,{className:`card-title-fallback`,children:e.title})]}),n===`continue-watching`&&D(ue,{children:[E(`span`,{className:`resume-checkpoint`,children:e.resumeEpisode?`E${e.resumeEpisode} · ${Y(e.resumePositionSeconds??0)}`:Y(e.resumePositionSeconds??0)}),E(`div`,{className:`progress-track`,role:`progressbar`,"aria-label":`${e.title} watch progress`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":m,children:E(`span`,{style:{width:`${m}%`}})})]}),D(`div`,{className:`card-details`,onClick:e=>e.stopPropagation(),children:[D(`div`,{className:`card-controls`,children:[E(`button`,{"aria-label":`Play ${e.title}`,onClick:o,children:E(y,{fill:`currentColor`})}),E(`button`,{"aria-label":r?`Remove from My List`:`Add to My List`,onClick:c,children:E(r?h:b,{})}),E(`button`,{className:i?`is-active`:``,"aria-label":i?`Remove rating`:`I like this`,"aria-pressed":i,onClick:l,children:E(ve,{fill:i?`currentColor`:`none`})}),E(`button`,{className:`card-more-button`,"aria-label":`More information about ${e.title}`,onClick:a,children:E(S,{})})]}),D(`div`,{className:`card-meta`,children:[D(`strong`,{children:[e.match,`% Match`]}),E(`span`,{className:`mini-maturity`,children:e.maturityRating}),E(`span`,{children:e.duration}),e.isHD&&E(`span`,{className:`quality-badge`,children:`HD`})]}),E(`p`,{children:e.genres.slice(0,3).join(` • `)}),e.episodes?.length?E(`div`,{className:`card-episode-strip`,"aria-label":`${e.title} episodes`,children:e.episodes.map(t=>D(`button`,{type:`button`,"aria-label":`Play ${t.title}`,title:t.title,onClick:()=>s(t.episode),children:[E(`img`,{src:t.image||e.backdropImage,alt:``,loading:`lazy`}),E(`span`,{children:t.episode})]},t.id||t.episode))}):null]})]})}function et({query:e,results:t,providerStatus:n,error:r,resolvingTitleId:i,onSelect:a}){let o=!!e.trim(),s=n===`loading`,c=t.find(e=>e.id===i);return D(`section`,{className:`netflix-search-page`,"aria-label":o?`Search results for ${e}`:`Search titles`,children:[E(`p`,{className:`visually-hidden`,role:`status`,"aria-live":`polite`,children:o?c?`Loading “${c.title}” from its provider…`:s?`Searching your library and all providers for “${e}”…`:t.length?`${t.length} titles related to “${e}”`:`We couldn't find “${e}”`:`Enter a movie, series, person, or genre to search.`}),r&&E(`p`,{className:`netflix-search-notice`,role:`alert`,children:r}),o?t.length?E(`div`,{className:`netflix-search-grid`,children:t.map(e=>D(`button`,{className:`netflix-search-card`,"aria-label":`${e.title} · ${e.sourceProvider===`phimhdcss`?`PhimHDC`:e.sourceProvider===`fsharetv`?`FshareTV`:`Netflix library`}`,disabled:!!i,onClick:()=>a(e),children:[D(`span`,{className:`netflix-search-artwork`,children:[E(`img`,{src:e.backdropImage,alt:``}),i===e.id&&E(f,{className:`netflix-search-loader spin`})]}),E(`span`,{className:`netflix-search-title`,title:e.title,children:e.title})]},`${e.sourceProvider??`catalog`}:${e.id}`))}):s?D(`div`,{className:`empty-search`,children:[E(f,{className:`spin`}),E(`h2`,{children:`Searching all providers`}),E(`p`,{children:`PhimHDC results will be preferred when the same movie is found.`})]}):D(`div`,{className:`empty-search`,children:[E(m,{}),E(`h2`,{children:`No matches found`}),E(`p`,{children:`Try a title, actor, director, or genre.`})]}):D(`div`,{className:`empty-search`,children:[E(m,{}),E(`h2`,{children:`Find something to watch`}),E(`p`,{children:`Search by movie, series, actor, director, or genre.`})]})]})}function tt({title:e,isInMyList:t,isLiked:n,onClose:r,onPlay:i,onToggleMyList:a,onToggleLike:o}){let s=q(),c=e.episodes?.length?e.episodes:e.episode?[e.episode]:[];return E(`div`,{className:`modal-backdrop`,role:`presentation`,onMouseDown:r,children:D(`article`,{ref:s,className:`details-modal`,role:`dialog`,"aria-modal":`true`,"aria-label":`${e.title} details`,onMouseDown:e=>e.stopPropagation(),children:[E(`button`,{className:`modal-close`,"aria-label":`Close`,onClick:r,children:E(p,{})}),E(`div`,{className:`modal-hero`,style:{"--modal-image":`url("${e.backdropImage}")`},children:D(`div`,{className:`modal-hero-content`,children:[D(`p`,{className:`netflix-series`,children:[E(`span`,{children:`N`}),` `,e.mediaType===`movie`?`FILM`:`SERIES`]}),E(`h2`,{children:e.title}),D(`div`,{className:`modal-actions`,children:[D(`button`,{className:`button button--primary`,onClick:()=>i(),disabled:!!(e.sourceProvider&&!e.playbackPath&&!e.canStream),children:[E(y,{fill:`currentColor`}),e.sourceProvider&&!e.playbackPath&&!e.canStream?`Metadata only`:e.sourceProvider&&e.downloadStatus!==`ready`?`Stream now`:e.resumePositionSeconds?`Resume at ${Y(e.resumePositionSeconds)}`:`Play`]}),E(`button`,{className:`round-button`,"aria-label":t?`Remove from My List`:`Add to My List`,onClick:a,children:E(t?h:b,{})}),E(`button`,{className:`round-button${n?` is-active`:``}`,"aria-label":n?`Remove rating`:`I like this`,"aria-pressed":n,onClick:o,children:E(ve,{fill:n?`currentColor`:`none`})})]})]})}),D(`div`,{className:`modal-body`,children:[D(`div`,{className:`modal-main-copy`,children:[e.sourceProvider&&D(`div`,{className:`download-state download-state--${e.downloadStatus}`,children:[e.downloadStatus===`ready`?E(h,{}):e.downloadStatus===`metadata`?E(w,{}):E(C,{}),D(`span`,{children:[E(`b`,{children:e.downloadStatus===`ready`?`Ready to play locally`:e.downloadStatus===`failed`?`Offline download failed · Streaming available`:e.downloadStatus===`metadata`?e.canStream?`Ready to stream`:`Metadata synced`:`Streaming available · Downloading offline — ${e.downloadProgress??0}%`}),E(`small`,{children:e.downloadError||`Source: ${e.sourceProvider} · Metadata stored in SQLite`})]})]}),D(`div`,{className:`modal-meta`,children:[D(`strong`,{children:[e.match,`% Match`]}),E(`span`,{children:e.year}),E(`span`,{children:e.duration}),E(`span`,{className:`quality-badge`,children:`HD`}),e.hasAudioDescription&&E(`span`,{className:`quality-badge`,children:`AD`})]}),E(`span`,{className:`modal-maturity`,children:e.maturityRating}),E(`p`,{className:`modal-synopsis`,children:e.synopsis})]}),D(`dl`,{className:`modal-facts`,children:[D(`div`,{children:[E(`dt`,{children:`Cast:`}),E(`dd`,{children:e.cast.slice(0,4).join(`, `)})]}),D(`div`,{children:[E(`dt`,{children:`Genres:`}),E(`dd`,{children:e.genres.join(`, `)})]}),e.creators?.length?D(`div`,{children:[E(`dt`,{children:`Creators:`}),E(`dd`,{children:e.creators.join(`, `)})]}):null]})]}),c.length>0&&D(`div`,{className:`episode-panel`,children:[D(`header`,{className:`episode-panel-header`,children:[E(`h3`,{children:`Episodes`}),D(`span`,{children:[`Season `,c[0].season,` · `,c.length,` episodes`]})]}),E(`div`,{className:`episode-card-list`,children:c.map(t=>D(`button`,{className:`episode-card`,"aria-label":`Play ${t.title}`,onClick:()=>i(t.episode),children:[E(`span`,{className:`episode-number`,children:t.episode}),E(`span`,{className:`episode-image`,style:{backgroundImage:`linear-gradient(90deg, transparent, rgba(0,0,0,.25)), url("${t.image||e.backdropImage}")`},children:E(y,{fill:`currentColor`})}),D(`span`,{className:`episode-copy`,children:[E(`b`,{children:t.title}),E(`small`,{children:t.duration}),E(`em`,{children:t.synopsis||e.tagline||e.synopsis})]})]},t.id||t.episode))})]})]})})}var J=4140,nt=`home-atom:subtitle-preferences`,rt={x:50,y:78},it={label:`English`,language:`en`,src:`demo`};function at(e){return{x:Math.max(7,Math.min(93,e.x)),y:Math.max(10,Math.min(86,e.y))}}function ot(e,t,n){let r=Math.min(49,Math.max(7,(n.width/2+12)/t.width*100)),i=Math.min(49,Math.max(10,(n.height/2+12)/t.height*100));return{x:Math.max(r,Math.min(100-r,e.x)),y:Math.max(i,Math.min(86,100-i,e.y))}}function st(e){return Array.from(e.activeCues??[]).flatMap(e=>(`text`in e&&typeof e.text==`string`?e.text:``).replace(/<br\s*\/?>/gi,`
|
|
2
|
-
`).replace(/<[^>]*>/g,``).split(/\r?\n/).map(e=>e.trim()).filter(Boolean))}function Y(e){let t=Math.max(0,Math.floor(e)),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60;return n?`${n}:${String(r).padStart(2,`0`)}:${String(i).padStart(2,`0`)}`:`${r}:${String(i).padStart(2,`0`)}`}function ct(e){let t=e?.match(/(\d+)\s*h/i)?.[1],n=e?.match(/(\d+)\s*(?:m|ph(?:út)?)/i)?.[1];return!t&&!n?J:(Number(t??0)*60+Number(n??0))*60}function lt({title:e,profileId:t,subtitlePreferences:r,onProgressChange:m,onSubtitlePreferencesChange:_,onSwitchTitle:v,onClose:te}){let b=q(),x=j(null),S=j(null),C=j(0),ae=j(null),w=j(null),ce=j(null),T=j(null),O=j(null),fe=j(null),he=j(!1),N=j(null),ge=j(!0),ve=j(null),P=j(!1),ye=j(new Set),be=j(0),xe=j(()=>{}),[Se]=M(oe),[Ce,we]=M(e.episodes??[]),[Te,F]=M(e.subtitles??[]),I=Ce[0]?.episode,L=e.episode?.episode||I||1,Ee=Ce.find(e=>e.episode===L)||e.episode,De=!!(e.playbackPath&&(!I||L===I)),Oe=!!(e.sourceProvider&&e.canStream&&!De),R=e.resumeEpisode===void 0||e.resumeEpisode===L?Math.max(0,e.resumePositionSeconds??0):0,ke=e.resumeDurationSeconds&&e.resumeDurationSeconds>0?e.resumeDurationSeconds:ct(Ee?.duration),Ae=ke>0?R/ke*100:0,[z,B]=M(!1),V=j(!1),[H,U]=M(!1),[W,je]=M(1),Me=j(1),[G,K]=M(r.captionsOn),[Ne,Pe]=M(!1),[Fe,Ie]=M(0),[Le,Re]=M([]),[ze,Be]=M(r.fontSize),[Ve,He]=M({x:r.positionX,y:r.positionY}),[Ue,We]=M(r.fontColor),[Ge,Ke]=M(r.backgroundColor),[qe,Je]=M(r.fontFamily),Ye=j({fontSize:r.fontSize,positionX:r.positionX,positionY:r.positionY,fontColor:r.fontColor,backgroundColor:r.backgroundColor,fontFamily:r.fontFamily,captionsOn:r.captionsOn}),[Xe,Ze]=M(!0),[Qe,$e]=M(!1),[et,tt]=M(!1),[J,lt]=M(L),[X,ut]=M(ke),[Z,dt]=M(R),[ft,pt]=M(Math.min(100,Ae+4)),[mt,ht]=M(1),[gt,_t]=M(!1),[vt,yt]=M(``),[bt,xt]=M(Oe?`Connecting to provider…`:``),[St,Ct]=M(Oe),[Q,wt]=M(De&&e.playbackPath?{path:e.playbackPath,kind:e.playbackKind===`hls`?`hls`:`file`}:null),[Tt,Et]=M(!1),[Dt,Ot]=M(null),[$,kt]=M(null),[At,jt]=M(null),[Mt,Nt]=M(!1),[Pt,Ft]=M(!1),[It,Lt]=M(!1),Rt=j(null),zt=j(null);j(null);let Bt=j(!1),Vt=j(``),Ht=!!(e.playbackPath||e.sourceProvider&&e.canStream),Ut=Math.max(8,(e.episode?.episode??1)+2),Wt=de(()=>Ce.length?Ce.map(t=>({season:t.season,number:t.episode,title:t.title,duration:t.duration,synopsis:t.synopsis||e.synopsis,image:t.image||e.backdropImage,subtitles:t.subtitles||[]})):Array.from({length:Ut},(t,n)=>{let r=n+1,i=r===e.episode?.episode;return{season:e.episode?.season??1,number:r,title:i?e.episode.title:`Episode ${r}`,duration:i?e.episode.duration:`${46+r*7%15}m`,synopsis:r===J?e.synopsis:e.tagline??e.synopsis,image:e.backdropImage,subtitles:[]}}),[J,Ut,Ce,e.backdropImage,e.episode,e.synopsis,e.tagline]),Gt=X>0?Z/X*100:0,Kt=Wt.find(e=>e.number===J)??Wt[0],qt=Wt.findIndex(e=>e.number===J),Jt=qt>=0&&qt<Wt.length-1,Yt=Kt?.season??Ee?.season??1,Xt=Kt?.subtitles.length?Kt.subtitles:Te,Zt=Xt.length>0?Xt:Ht?[]:[it],Qt=Math.min(Fe,Math.max(0,Zt.length-1)),$t=Zt.length>0,en={"--player-progress":`${Gt}%`,"--player-buffered":`${Math.max(Gt,ft)}%`},tn=de(()=>{let t=e.synopsis.split(/[.!?]/).map(e=>e.trim()).find(Boolean)??e.synopsis,n=t.length>42?`${t.slice(0,41).trimEnd()}…`:t;return[`– ${e.tagline??Kt?.title??e.title}`,`– ${n}`]},[Kt?.title,e.synopsis,e.tagline,e.title]),nn=Ht?Le:tn,rn=j({seasonNumber:Yt,episodeNumber:J,positionSeconds:Z,durationSeconds:X});A(()=>{rn.current={seasonNumber:Yt,episodeNumber:J,positionSeconds:Z,durationSeconds:X}},[J,Z,X,Yt]);let an=k((n={},r=!1)=>{let i={...rn.current,...n};if(i.positionSeconds<1&&!i.completed)return;let a=[i.seasonNumber,i.episodeNumber,Math.round(i.positionSeconds*10),Math.round(i.durationSeconds*10),!!i.completed].join(`:`);if(Vt.current===a)return;Vt.current=a;let o=!!i.completed||i.durationSeconds>0&&i.positionSeconds/i.durationSeconds>=.95,s={titleId:e.id,seasonNumber:i.seasonNumber,episodeNumber:i.episodeNumber,positionSeconds:i.positionSeconds,durationSeconds:i.durationSeconds,completed:o,updatedAt:new Date().toISOString()};m(s),fetch(`/api/netflix/progress`,{method:`PUT`,headers:{"content-type":`application/json`},body:JSON.stringify({profileId:t,...s}),keepalive:r}).then(async e=>{if(!e.ok)throw Error();m(await e.json())}).catch(()=>{r||yt(`Watch position could not be saved`)})},[m,t,e.id]);A(()=>{let e=window.setInterval(()=>an(),5e3),t=()=>{document.visibilityState===`hidden`&&an({},!0)},n=()=>an({},!0);return document.addEventListener(`visibilitychange`,t),window.addEventListener(`beforeunload`,n),()=>{window.clearInterval(e),document.removeEventListener(`visibilitychange`,t),window.removeEventListener(`beforeunload`,n),an({},!0)}},[an]),A(()=>{let n=new AbortController;return fetch(`/api/netflix/markers?titleId=${encodeURIComponent(e.id)}&profileId=${encodeURIComponent(t)}`,{cache:`no-store`,signal:n.signal}).then(async e=>{if(!e.ok)return;let t=await e.json();if(!n.signal.aborted)for(let e of t.markers??[])e.markerType===`intro`?kt(e.timeSeconds):e.markerType===`outro`&&jt(e.timeSeconds)}).catch(()=>{}),()=>n.abort()},[e.id,t]),A(()=>($!==null&&Z>=0&&Z<=$&&!z?(Pt||Ft(!0),zt.current!==null&&window.clearTimeout(zt.current),zt.current=window.setTimeout(()=>{Ft(!1),zt.current=null},8e3)):Pt&&(Z>($??0)||z)&&Ft(!1),At!==null&&Z>=At&&X>0&&!z&&Jt?It||Lt(!0):It&&(Z<(At??1/0)||z)&&Lt(!1),()=>{zt.current!==null&&window.clearTimeout(zt.current)}),[Z,$,At,z,Pt,It,X,Jt]),A(()=>{if(!Mt)return;let e=e=>{e.target instanceof Node&&!Rt.current?.contains(e.target)&&Nt(!1)},t=e=>{e.key===`Escape`&&Nt(!1)};return document.addEventListener(`pointerdown`,e),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`pointerdown`,e),document.removeEventListener(`keydown`,t)}},[Mt]),A(()=>{let n=!!(e.playbackPath&&(!I||J===I));if(!e.sourceProvider||!e.canStream||n)return;let r=new AbortController,i=new URLSearchParams({profileId:t});return e.episodes?.length&&i.set(`episode`,String(J)),fetch(`/api/netflix/stream/${encodeURIComponent(e.id)}?${i}`,{cache:`no-store`,signal:r.signal}).then(async e=>{let t=await e.json();if(!e.ok||!t.path||!t.kind)throw Error(t.error||`The provider stream is unavailable.`);if(t.episodeMetadata){let e={...t.episodeMetadata,subtitles:t.subtitles??t.episodeMetadata.subtitles};we(t=>[...t.some(t=>t.id===e.id||t.episode===e.episode)?t.map(t=>t.id===e.id||t.episode===e.episode?e:t):[...t,e]].sort((e,t)=>e.episode-t.episode))}else Array.isArray(t.subtitles)&&F(t.subtitles);wt({path:t.path,kind:t.kind}),xt(``),Ct(!1)}).catch(e=>{r.signal.aborted||(xt(e instanceof Error?e.message:`The provider stream is unavailable.`),Ct(!1),B(!0))}),()=>r.abort()},[J,I,e.canStream,e.episodes,e.id,e.playbackPath,e.sourceProvider,t]),A(()=>{let e=x.current;if(!e||!Q)return;let t=!1,n=()=>{};return Q.kind===`hls`&&!e.canPlayType(`application/vnd.apple.mpegurl`)?import(`./hls-CgexCc5Z.js`).then(({default:e})=>{if(t||!x.current||!e.isSupported())return;let r=new e;r.loadSource(Q.path),r.attachMedia(x.current),r.on(e.Events.MANIFEST_PARSED,()=>{t||(V.current?x.current?.pause():x.current?.play().catch(()=>B(!0)))}),r.on(e.Events.ERROR,(e,n)=>{n.fatal&&!t&&(xt(`The provider stream stopped unexpectedly.`),B(!0))}),n=()=>r.destroy()}):(e.src=Q.path,V.current?e.pause():e.play().catch(()=>B(!0))),()=>{t=!0,n(),e.removeAttribute(`src`),e.load()}},[Q]),A(()=>{V.current=z;let e=x.current;e&&(z?e.pause():e.play().catch(()=>B(!0)))},[z]),A(()=>{let e=x.current;e&&(e.playbackRate=mt)},[mt]),A(()=>{let e=x.current;W>0&&(Me.current=W),e&&(e.volume=W)},[Q,W]),A(()=>{let e=x.current;if(!e){Re([]);return}let t=Array.from(e.textTracks),n=t[Qt],r=()=>{Re(G&&n?st(n):[])};for(let[e,n]of t.entries())n.mode=G&&e===Qt?`hidden`:`disabled`;return n?.addEventListener(`cuechange`,r),r(),()=>{n?.removeEventListener(`cuechange`,r)}},[J,G,Q,Qt,Xt.length]),A(()=>{let e=window.requestAnimationFrame(()=>{try{window.localStorage.getItem(nt)&&window.localStorage.removeItem(nt)}catch{}});return()=>window.cancelAnimationFrame(e)},[]),A(()=>{if(!Xe)return;if(ge.current){ge.current=!1;return}let e={fontSize:ze,positionX:Ve.x,positionY:Ve.y,fontColor:Ue,backgroundColor:Ge,fontFamily:qe,captionsOn:G},n=Ye.current,r={};if(e.fontSize!==n.fontSize&&(r.fontSize=e.fontSize),(e.positionX!==n.positionX||e.positionY!==n.positionY)&&(r.positionX=e.positionX,r.positionY=e.positionY),e.fontColor!==n.fontColor&&(r.fontColor=e.fontColor),e.backgroundColor!==n.backgroundColor&&(r.backgroundColor=e.backgroundColor),e.fontFamily!==n.fontFamily&&(r.fontFamily=e.fontFamily),e.captionsOn!==n.captionsOn&&(r.captionsOn=e.captionsOn),Object.keys(r).length)return N.current!==null&&window.clearTimeout(N.current),N.current=window.setTimeout(()=>{N.current=null,Ye.current=e,fetch(`/api/netflix/subtitle-preferences`,{method:`PUT`,headers:{"content-type":`application/json`},body:JSON.stringify({profileId:t,...r})}).then(async e=>{e.ok&&_(await e.json())}).catch(()=>{})},600),()=>{N.current!==null&&window.clearTimeout(N.current)}},[t,ze,Ve,Ue,Ge,qe,G,Xe,_]),A(()=>{if(!Ne)return;let e=e=>{e.target instanceof Node&&!T.current?.contains(e.target)&&Pe(!1)},t=e=>{e.key===`Escape`&&Pe(!1)};return document.addEventListener(`pointerdown`,e),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`pointerdown`,e),document.removeEventListener(`keydown`,t)}},[Ne]),A(()=>{if(!G||!nn.length)return;let e=()=>{let e=b.current?.getBoundingClientRect(),t=O.current?.getBoundingClientRect();!e||!t||He(n=>{let r=ot(n,e,t);return r.x===n.x&&r.y===n.y?n:r})},t=window.requestAnimationFrame(e);return window.addEventListener(`resize`,e),document.addEventListener(`fullscreenchange`,e),()=>{window.cancelAnimationFrame(t),window.removeEventListener(`resize`,e),document.removeEventListener(`fullscreenchange`,e)}},[G,b,ze,nn]),A(()=>{if(Ht||z)return;let e=window.setInterval(()=>{dt(e=>{let t=e+.5,n=Math.min(t,X);return rn.current.positionSeconds=n,n})},500);return()=>window.clearInterval(e)},[X,Ht,z]),A(()=>{if(Ht||z||X<=0||Z<X)return;an({positionSeconds:X,completed:!0});let e=window.requestAnimationFrame(()=>B(!0));return()=>window.cancelAnimationFrame(e)},[Z,X,Ht,z,an]),A(()=>{let e=()=>_t(document.fullscreenElement===b.current);return document.addEventListener(`fullscreenchange`,e),()=>document.removeEventListener(`fullscreenchange`,e)},[b]),A(()=>()=>{w.current&&window.clearTimeout(w.current)},[]);let on=k(()=>{Et(!1),ce.current&&window.clearTimeout(ce.current),ce.current=window.setTimeout(()=>Et(!0),5e3)},[]);A(()=>{if(z||et||Ne||Qe||Mt){ce.current&&window.clearTimeout(ce.current);let e=window.requestAnimationFrame(()=>Et(!1));return()=>window.cancelAnimationFrame(e)}let e=window.requestAnimationFrame(on),t=b.current;if(!t)return()=>window.cancelAnimationFrame(e);let n=[`mousemove`,`mousedown`,`keydown`,`touchstart`,`scroll`];for(let e of n)t.addEventListener(e,on);return()=>{window.cancelAnimationFrame(e);for(let e of n)t.removeEventListener(e,on);ce.current&&window.clearTimeout(ce.current)}},[et,Mt,z,b,on,Qe,Ne]);let sn=e=>{let t=Math.max(0,Math.min(X,e));x.current&&(x.current.currentTime=t),rn.current.positionSeconds=t,dt(t)},cn=k(()=>{let e=S.current;if(!e||e.readyState<HTMLMediaElement.HAVE_METADATA)return;let t=C.current,n=Number.isFinite(e.duration)&&e.duration>0?Math.max(0,e.duration-.05):t;try{e.currentTime=Math.min(t,n)}catch{}},[]),ln=e=>{C.current=e,ae.current===null&&(ae.current=window.requestAnimationFrame(()=>{ae.current=null,cn()}))},un=e=>{let t=Math.max(0,Math.min(X,e));ln(t),Ot({position:X>0?t/X*100:0,time:t})},dn=(e,t)=>{let n=t.getBoundingClientRect(),r=n.width>0?Math.max(0,Math.min(1,(e-n.left)/n.width)):0;un(r*X)};A(()=>{let e=S.current;if(!e||!Q)return;let t=!1,n=()=>{};return Q.kind===`hls`&&!e.canPlayType(`application/vnd.apple.mpegurl`)?import(`./hls-CgexCc5Z.js`).then(({default:e})=>{if(t||!S.current||!e.isSupported())return;let r=new e;r.loadSource(Q.path),r.attachMedia(S.current),r.on(e.Events.MANIFEST_PARSED,()=>{t||cn()}),n=()=>r.destroy()}):(e.src=Q.path,e.load()),()=>{t=!0,n(),ae.current!==null&&(window.cancelAnimationFrame(ae.current),ae.current=null),e.removeAttribute(`src`),e.load()}},[Q,cn]);let fn=()=>{let e=x.current;if(e){e.paused?e.play():e.pause();return}B(e=>(V.current=!e,!e))},pn=e=>{!e&&W<=0&&je(Me.current||1),U(e)},mn=(e,t=!1)=>{let n=e.currentTime;Number.isFinite(e.duration)&&e.duration>0&&(rn.current.durationSeconds=e.duration,ut(e.duration),t&&!Bt.current&&R>0&&(n=Math.min(R,Math.max(0,e.duration-.1)),e.currentTime=n,Bt.current=!0),e.buffered.length&&pt(e.buffered.end(e.buffered.length-1)/e.duration*100)),Number.isFinite(n)&&(rn.current.positionSeconds=n,dt(n))},hn=()=>{let e=[1,1.25,1.5,.75],t=e.indexOf(mt);ht(e[(t+1)%e.length])},gn=async()=>{try{document.fullscreenElement===b.current?await document.exitFullscreen():await b.current?.requestFullscreen()}catch{yt(`Fullscreen is unavailable in this window`)}},_n=()=>{w.current&&window.clearTimeout(w.current),yt(`Thanks — the playback issue was reported`),w.current=window.setTimeout(()=>yt(``),2600)},vn=n=>{let r=Z;n===`intro`?kt(r):jt(r),Nt(!1),yt(n===`intro`?`Intro end set at ${Y(r)}`:`Outro start set at ${Y(r)}`),w.current&&window.clearTimeout(w.current),w.current=window.setTimeout(()=>yt(``),2600),fetch(`/api/netflix/markers`,{method:`PUT`,headers:{"content-type":`application/json`},body:JSON.stringify({titleId:e.id,markerType:n,timeSeconds:r,profileId:t})}).catch(()=>{yt(`Marker could not be saved`)})},yn=n=>{n===`intro`?kt(null):jt(null),Nt(!1),yt(n===`intro`?`Intro marker removed`:`Outro marker removed`),w.current&&window.clearTimeout(w.current),w.current=window.setTimeout(()=>yt(``),2600),fetch(`/api/netflix/markers`,{method:`DELETE`,headers:{"content-type":`application/json`},body:JSON.stringify({titleId:e.id,markerType:n,profileId:t})}).catch(()=>{yt(`Marker could not be removed`)})},bn=e=>{let t=fe.current,n=b.current?.getBoundingClientRect();!t||t.pointerId!==e.pointerId||!n||He(ot({x:(e.clientX-t.offsetX-n.left)/n.width*100,y:(e.clientY-t.offsetY-n.top)/n.height*100},n,e.currentTarget.getBoundingClientRect()))},xn=e=>{if(e.button!==0)return;let t=b.current?.getBoundingClientRect();t&&(e.preventDefault(),e.stopPropagation(),fe.current={pointerId:e.pointerId,offsetX:e.clientX-(t.left+Ve.x/100*t.width),offsetY:e.clientY-(t.top+Ve.y/100*t.height)},e.currentTarget.setPointerCapture(e.pointerId),$e(!0),V.current?he.current=!1:(he.current=!0,V.current=!0,B(!0)))},Sn=e=>{fe.current?.pointerId===e.pointerId&&(bn(e),e.currentTarget.hasPointerCapture(e.pointerId)&&e.currentTarget.releasePointerCapture(e.pointerId),fe.current=null,$e(!1),he.current&&(he.current=!1,V.current=!1,B(!1)))},Cn=e=>{let t={ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0},ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1}}[e.key];if(!t)return;e.preventDefault();let n=e.shiftKey?5:1,r=b.current?.getBoundingClientRect(),i=e.currentTarget.getBoundingClientRect();He(e=>{let a={x:e.x+t.x*n,y:e.y+t.y*n};return r?ot(a,r,i):at(a)})},wn=e=>{if(e===null){K(!1),Re([]);return}Ie(e),K(!0)},Tn=t=>{if(tt(!1),Pe(!1),t===J)return;an();let n=Wt.find(e=>e.number===t),r=!!(e.playbackPath&&(!I||t===I));lt(t),Bt.current=!0,Vt.current=``,dt(0),pt(0);let i=ct(n?.duration);rn.current={seasonNumber:n?.season??1,episodeNumber:t,positionSeconds:0,durationSeconds:i},ut(i),V.current=!1,B(!1),!n?.subtitles.length&&!e.subtitles?.length&&K(!1),r&&e.playbackPath?(wt({path:e.playbackPath,kind:e.playbackKind===`hls`?`hls`:`file`}),xt(``),Ct(!1)):e.sourceProvider&&e.canStream&&(wt(null),xt(`Loading ${n?.title||`Episode ${t}`}…`),Ct(!0))},En=()=>{let e=Wt[qt+1];e&&Tn(e.number)};A(()=>{ve.current={sessionId:Se,profileId:t,titleId:e.id,title:e.title,artwork:Kt?.image||e.backdropImage,seasonNumber:Yt,episodeNumber:J,episodeTitle:Kt?.title||`Episode ${J}`,episodes:Wt.map(e=>({season:e.season,number:e.number,title:e.title})),currentTime:Z,duration:X,paused:z,muted:H,volume:W,subtitles:{available:$t,captionsOn:G,fontSize:ze,fontColor:Ue,backgroundColor:Ge},machineName:se(),deviceType:ie(),updatedAt:Date.now()}});let Dn=k(()=>{if(P.current)return;let e=ve.current;if(!e)return;let t=new AbortController;ye.current.add(t),fetch(`/api/netflix/activity`,{method:`PUT`,headers:{"content-type":`application/json`},body:JSON.stringify({activity:{...e,updatedAt:Date.now()}}),cache:`no-store`,signal:t.signal}).catch(()=>{}).finally(()=>{ye.current.delete(t)})},[]);return A(()=>{xe.current=e=>{switch(e.type){case`set-paused`:{let t=x.current;V.current=e.paused,B(e.paused),t&&(e.paused?t.pause():t.play().catch(()=>B(!0)));break}case`seek-relative`:sn(rn.current.positionSeconds+e.seconds);break;case`seek-to`:sn(e.seconds);break;case`set-muted`:pn(e.muted);break;case`set-volume`:{let t=Math.max(0,Math.min(1,e.volume));t>0&&(Me.current=t),je(t),U(t<=0);break}case`next-episode`:En();break;case`select-episode`:Tn(e.episodeNumber);break;case`switch-title`:v(e.titleId).catch(()=>{yt(`Movie could not be switched`)});break;case`switch-track`:case`switch-playlist`:break;case`set-captions`:K(e.enabled&&$t),e.enabled||Re([]);break;case`set-subtitle-font-size`:Be(Math.max(18,Math.min(64,e.fontSize)));break;case`set-subtitle-font-color`:We(e.color);break;case`set-subtitle-background`:Ke(e.background);break;case`reset-subtitle-position`:He(rt);break}window.requestAnimationFrame(Dn)}}),A(()=>{P.current=!1,be.current=0;let e=!1,n=null,r=new AbortController,i=()=>{if(!P.current){P.current=!0;for(let e of ye.current)e.abort();ye.current.clear(),r.abort(),fetch(`/api/netflix/activity`,{method:`DELETE`,headers:{"content-type":`application/json`},body:JSON.stringify({sessionId:Se,profileId:t}),cache:`no-store`,keepalive:!0}).catch(()=>{})}},a=async()=>{if(!(e||P.current||r.signal.aborted)){try{let e=be.current,n=await fetch(`/api/netflix/activity/${encodeURIComponent(Se)}/commands?after=${encodeURIComponent(e)}&profileId=${encodeURIComponent(t)}`,{cache:`no-store`,signal:r.signal});if(n.ok){let t=await n.json();if(typeof t==`object`&&t&&!Array.isArray(t)){let n=t,r=Array.isArray(n.commands)?n.commands:[],i=new Set,a=[];for(let t of r){if(typeof t!=`object`||!t||Array.isArray(t))continue;let n=t,r=n.id;if(typeof r!=`number`||!Number.isSafeInteger(r)||r<=e||i.has(r)||n.sessionId!==Se)continue;let o={kind:`command`,sessionId:Se,command:n.command};!re(o)||o.kind!==`command`||(i.add(r),a.push({id:r,command:o.command}))}a.sort((e,t)=>e.id-t.id);for(let e of a)xe.current(e.command);let o=n.cursor,s=a.length>0?a[a.length-1].id:e;typeof o==`number`&&Number.isSafeInteger(o)&&o>=s?be.current=o:a.length&&(be.current=s)}}}catch{}!e&&!P.current&&!r.signal.aborted&&(n=window.setTimeout(()=>void a(),Math.min(500,le)))}};window.addEventListener(`pagehide`,i),Dn();let o=window.setInterval(Dn,le);return a(),()=>{e=!0,window.clearInterval(o),n!==null&&window.clearTimeout(n),window.removeEventListener(`pagehide`,i),i()}},[Se,t,Dn]),A(()=>{Dn()},[J,G,X,$t,H,z,Ge,Ue,ze,W,Dn]),D(`section`,{ref:b,className:`player${z?` player--paused`:``}${Ht?` player--local`:``}${Tt?` player--idle`:``}`,role:`dialog`,"aria-modal":`true`,"aria-label":`Playing ${e.title}`,style:{"--player-image":`url("${e.backdropImage}")`},children:[Ht&&E(`video`,{ref:x,className:`player-video`,autoPlay:!0,playsInline:!0,muted:H,poster:e.backdropImage,onClick:fn,onLoadedMetadata:e=>mn(e.currentTarget,!0),onProgress:e=>mn(e.currentTarget),onTimeUpdate:e=>mn(e.currentTarget),onPlay:()=>{V.current=!1,B(!1)},onPause:()=>{V.current=!0,B(!0),an()},onEnded:()=>{let e=x.current,t=e&&Number.isFinite(e.duration)?e.duration:X;dt(t),an({positionSeconds:t,durationSeconds:t||X,completed:!0}),V.current=!0,B(!0)},onError:()=>{xt(`The browser could not play this provider stream.`),V.current=!0,B(!0)},children:Xt.map(e=>E(`track`,{kind:`subtitles`,src:e.src,srcLang:e.language,label:e.label},`${J}-${e.language}-${e.src}`))}),bt&&D(`div`,{className:`player-stream-status${St?``:` player-stream-status--error`}`,role:`status`,children:[St&&E(f,{className:`spin`}),E(`span`,{children:bt})]}),E(`div`,{className:`player-cinematic-bars`}),E(`div`,{className:`player-noise`}),D(`header`,{className:`player-topbar`,children:[E(`button`,{className:`player-icon-button player-back`,onClick:()=>{an(),te()},"aria-label":`Exit player`,children:E(a,{})}),E(`button`,{className:`player-icon-button player-report`,onClick:_n,"aria-label":`Report a problem`,children:E(pe,{})})]}),G&&nn.length>0&&E(`div`,{ref:O,className:`player-subtitles${Qe?` player-subtitles--dragging`:``}`,style:{"--player-subtitle-font-size":`${ze}px`,"--player-subtitle-color":Ue,"--player-subtitle-bg":Ge,"--player-subtitle-font-family":qe==="default"?void 0:qe,left:`${Ve.x}%`,top:`${Ve.y}%`},role:`group`,"aria-label":`Draggable subtitles`,"aria-live":`polite`,tabIndex:0,onClick:e=>e.stopPropagation(),onKeyDown:Cn,onPointerDown:xn,onPointerMove:bn,onPointerUp:Sn,onPointerCancel:Sn,children:nn.map((e,t)=>E(`span`,{children:e},`${t}-${e}`))}),et&&D(`aside`,{className:`player-episodes`,"aria-label":`Episodes`,children:[E(`h2`,{children:e.mediaType===`limited-series`?`Limited Series`:`Season ${Yt}`}),E(`div`,{className:`player-episode-list`,children:Wt.map(e=>{let t=e.number===J;return D(`button`,{className:`player-episode${t?` player-episode--active`:``}`,"aria-label":`${e.number}. ${e.title}, ${e.duration}`,"aria-current":t?`true`:void 0,onClick:()=>Tn(e.number),children:[D(`span`,{className:`player-episode-heading`,children:[E(`span`,{children:e.number}),E(`strong`,{children:e.title}),E(`i`,{"aria-hidden":`true`})]}),t&&D(`span`,{className:`player-episode-details`,children:[E(`span`,{className:`player-episode-thumbnail`,style:{backgroundImage:`linear-gradient(rgba(0, 0, 0, 0.34), rgba(0, 0, 0, 0.48)), url("${e.image}")`},children:D(`span`,{className:`player-now-playing`,children:[D(`span`,{className:`player-playing-bars`,"aria-hidden":`true`,children:[E(`i`,{}),E(`i`,{}),E(`i`,{}),E(`i`,{})]}),`Now playing`]})}),E(`span`,{className:`player-episode-synopsis`,children:e.synopsis})]})]},e.number)})})]}),z&&!bt&&E(`button`,{className:`big-play`,onClick:fn,"aria-label":`Resume`,children:E(y,{fill:`currentColor`})}),vt&&E(`div`,{className:`player-notice`,role:`status`,children:vt}),D(`div`,{className:`player-bottom${et?` player-bottom--drawer-open`:``}`,children:[!et&&D(`div`,{className:`player-timeline-row`,children:[D(`div`,{className:`player-timeline-wrap${Dt?` player-timeline-wrap--previewing`:``}`,style:{"--seek-preview-position":`${Dt?.position??0}%`},onPointerEnter:e=>dn(e.clientX,e.currentTarget),onPointerMove:e=>dn(e.clientX,e.currentTarget),onPointerLeave:()=>Ot(null),children:[D(`div`,{className:`player-seek-preview`,"aria-hidden":`true`,children:[Q?E(`video`,{ref:S,className:`player-seek-preview-frame`,muted:!0,playsInline:!0,preload:`metadata`,poster:Kt?.image||e.backdropImage,onLoadedMetadata:cn,onSeeked:e=>e.currentTarget.pause()}):E(ue,{children:E(`img`,{src:Kt?.image||e.backdropImage,alt:``,draggable:!1})}),E(`time`,{children:Y(Dt?.time??Z)})]}),E(`input`,{className:`player-timeline`,type:`range`,min:0,max:X||1,step:.1,value:Math.min(Z,X||1),style:en,onFocus:e=>un(Number(e.currentTarget.value)),onBlur:()=>Ot(null),onInput:e=>un(Number(e.currentTarget.value)),onChange:e=>sn(Number(e.currentTarget.value)),"aria-label":`Seek`,"aria-valuetext":`${Y(Z)} of ${Y(X)}`}),$!==null&&X>0&&E(`div`,{className:`player-timeline-marker player-timeline-marker--intro`,style:{left:`${$/X*100}%`},"aria-label":`Intro end at ${Y($)}`}),At!==null&&X>0&&E(`div`,{className:`player-timeline-marker player-timeline-marker--outro`,style:{left:`${At/X*100}%`},"aria-label":`Outro start at ${Y(At)}`}),z&&!bt&&D(`div`,{ref:Rt,className:`player-marker-control`,style:{left:`${Gt}%`},onPointerEnter:e=>{e.stopPropagation(),Ot(null)},onPointerMove:e=>e.stopPropagation(),onPointerLeave:e=>e.stopPropagation(),children:[E(`button`,{className:`player-marker-trigger`,"aria-label":`Timeline marker settings`,"aria-expanded":Mt,onClick:e=>{e.stopPropagation(),Nt(e=>!e)},children:E(_e,{})}),Mt&&D(`div`,{className:`player-marker-menu`,role:`menu`,"aria-label":`Set timeline marker`,children:[D(`button`,{type:`button`,role:`menuitem`,onClick:()=>vn(`intro`),children:[E(g,{}),E(`span`,{children:`Set as Intro`}),$!==null&&E(`small`,{children:Y($)})]}),D(`button`,{type:`button`,role:`menuitem`,onClick:()=>vn(`outro`),children:[E(c,{}),E(`span`,{children:`Set as Outro`}),At!==null&&E(`small`,{children:Y(At)})]}),$!==null&&D(`button`,{type:`button`,role:`menuitem`,className:`player-marker-menu-remove`,onClick:()=>yn(`intro`),children:[E(p,{}),E(`span`,{children:`Remove Intro`}),E(`small`,{children:Y($)})]}),At!==null&&D(`button`,{type:`button`,role:`menuitem`,className:`player-marker-menu-remove`,onClick:()=>yn(`outro`),children:[E(p,{}),E(`span`,{children:`Remove Outro`}),E(`small`,{children:Y(At)})]})]})]})]}),E(`time`,{children:Y(X-Z)})]}),D(`div`,{className:`player-controls`,children:[D(`div`,{className:`player-controls-left`,children:[E(`button`,{className:`player-control-button`,onClick:fn,"aria-label":z?`Play`:`Pause`,children:E(z?y:d,{fill:`currentColor`})}),D(`button`,{className:`player-control-button player-ten-second`,"aria-label":`Rewind 10 seconds`,onClick:()=>sn(Z-10),children:[E(n,{}),E(`span`,{children:`10`})]}),D(`button`,{className:`player-control-button player-ten-second`,"aria-label":`Forward 10 seconds`,onClick:()=>sn(Z+10),children:[E(i,{}),E(`span`,{children:`10`})]}),E(`button`,{className:`player-control-button`,"aria-label":H?`Unmute`:`Mute`,"aria-pressed":H,onClick:()=>pn(!H),children:E(H?ee:ne,{})})]}),D(`div`,{className:`player-program`,children:[E(`strong`,{children:e.title}),D(`span`,{children:[`Season `,Yt,`\xA0\xA0 Episode `,J]})]}),D(`div`,{className:`player-controls-right`,children:[E(`button`,{className:`player-control-button`,"aria-label":`Next episode`,onClick:En,disabled:!Jt,children:E(c,{})}),E(`button`,{className:`player-control-button${et?` is-active player-episodes-trigger`:``}`,"aria-label":et?`Hide episodes`:`Show episodes`,"aria-expanded":et,onClick:()=>{Pe(!1),tt(e=>!e)},children:E(s,{})}),D(`div`,{className:`player-subtitle-control`,ref:T,children:[Ne&&D(`div`,{className:`player-subtitle-menu`,role:`dialog`,"aria-label":`Subtitles`,children:[E(`h2`,{children:`Subtitles`}),D(`div`,{className:`player-subtitle-options`,role:`listbox`,"aria-label":`Subtitle language`,children:[D(`button`,{type:`button`,role:`option`,"aria-selected":!G,onClick:()=>wn(null),children:[E(`span`,{className:`player-subtitle-check`,"aria-hidden":`true`,children:!G&&E(h,{})}),E(`span`,{children:`Off`})]}),Zt.map((e,t)=>{let n=G&&t===Qt;return D(`button`,{type:`button`,role:`option`,"aria-selected":n,onClick:()=>wn(t),children:[E(`span`,{className:`player-subtitle-check`,"aria-hidden":`true`,children:n&&E(h,{})}),E(`span`,{children:e.label})]},`${e.language}-${e.src}`)})]}),D(`div`,{className:`player-subtitle-settings`,children:[D(`div`,{className:`player-subtitle-setting-heading`,children:[E(`label`,{htmlFor:`player-subtitle-font-size`,children:`Font size`}),D(`output`,{htmlFor:`player-subtitle-font-size`,children:[ze,`px`]})]}),D(`div`,{className:`player-subtitle-size-control`,children:[E(`span`,{"aria-hidden":`true`,children:`A`}),E(`input`,{id:`player-subtitle-font-size`,type:`range`,min:18,max:64,step:2,value:ze,"aria-label":`Subtitle font size`,onChange:e=>Be(Number(e.currentTarget.value))}),E(`span`,{"aria-hidden":`true`,children:`A`})]}),D(`div`,{className:`player-subtitle-position-setting`,children:[E(`p`,{children:`Drag subtitles on screen to move them.`}),E(`button`,{type:`button`,onClick:()=>He(rt),children:`Reset position`})]}),D(`div`,{className:`player-subtitle-color-setting`,children:[E(`label`,{htmlFor:`player-subtitle-font-color`,children:`Font color`}),E(`input`,{id:`player-subtitle-font-color`,type:`color`,value:Ue,onChange:e=>We(e.currentTarget.value)})]}),D(`div`,{className:`player-subtitle-color-setting`,children:[E(`label`,{htmlFor:`player-subtitle-bg-color`,children:`Background`}),D(`select`,{id:`player-subtitle-bg-color`,value:Ge,onChange:e=>Ke(e.currentTarget.value),children:[E(`option`,{value:`transparent`,children:`None`}),E(`option`,{value:`rgba(0,0,0,0.75)`,children:`Dark`}),E(`option`,{value:`rgba(0,0,0,0.5)`,children:`Semi-dark`}),E(`option`,{value:`rgba(0,0,0,0.3)`,children:`Light`}),E(`option`,{value:`rgba(0,0,0,1)`,children:`Solid black`})]})]})]})]}),E(`button`,{className:`player-control-button player-subtitle-trigger${G?` is-active`:``}`,"aria-label":$t?`Subtitles`:`Subtitles unavailable`,"aria-haspopup":`dialog`,"aria-expanded":Ne,"aria-pressed":G,disabled:!$t,onClick:()=>{tt(!1),Pe(e=>!e)},children:E(l,{})})]}),D(`button`,{className:`player-control-button player-speed`,"aria-label":`Change playback speed, currently ${mt}x`,onClick:hn,children:[E(me,{}),mt!==1&&D(`span`,{children:[mt,`×`]})]}),E(`button`,{className:`player-control-button`,"aria-label":gt?`Exit fullscreen`:`Enter fullscreen`,onClick:()=>void gn(),children:E(gt?u:o,{})})]})]})]}),Pt&&!z&&E(`button`,{className:`player-skip-intro`,onClick:()=>{$!==null&&sn($),Ft(!1)},children:`Skip Intro`}),It&&!z&&Jt&&D(`button`,{className:`player-next-episode-prompt`,onClick:()=>{Lt(!1),En()},children:[E(y,{fill:`currentColor`}),`Next Episode`]})]})}function X(){return D(`footer`,{className:`site-footer`,id:`footer`,children:[D(`div`,{className:`social-links`,"aria-label":`Social media`,children:[E(`a`,{href:`#facebook`,"aria-label":`Facebook`,children:`f`}),E(`a`,{href:`#instagram`,"aria-label":`Instagram`,children:`◎`}),E(`a`,{href:`#twitter`,"aria-label":`X`,children:`𝕏`}),E(`a`,{href:`#youtube`,"aria-label":`YouTube`,children:`▶`})]}),E(`div`,{className:`footer-links`,children:[`Audio Description`,`Help Center`,`Gift Cards`,`Media Center`,`Investor Relations`,`Jobs`,`Terms of Use`,`Privacy`,`Legal Notices`,`Cookie Preferences`,`Corporate Information`,`Contact Us`].map(e=>E(`a`,{href:`#${ut(e)}`,children:e},e))}),E(`span`,{className:`service-code`,children:`Service Code`}),E(`p`,{children:`© 1997–2026 Netflix Clone. Built for demonstration purposes.`})]})}function ut(e){return e.toLowerCase().replace(/&/g,`and`).replace(/ /g,`-`)}export{He as NetflixBrowser};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./chevron-left-CkBJG8E2.js";var t=e(`bell`,[[`path`,{d:`M10.268 21a2 2 0 0 0 3.464 0`,key:`vwvbt9`}],[`path`,{d:`M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326`,key:`11g9vi`}]]),n=e(`database`,[[`ellipse`,{cx:`12`,cy:`5`,rx:`9`,ry:`3`,key:`msslwz`}],[`path`,{d:`M3 5V19A9 3 0 0 0 21 19V5`,key:`1wlel7`}],[`path`,{d:`M3 12A9 3 0 0 0 21 12`,key:`mv7ke4`}]]),r=e(`download`,[[`path`,{d:`M12 15V3`,key:`m9g1x1`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}],[`path`,{d:`m7 10 5 5 5-5`,key:`brsn70`}]]),i=e(`external-link`,[[`path`,{d:`M15 3h6v6`,key:`1q9fwt`}],[`path`,{d:`M10 14 21 3`,key:`gplh6r`}],[`path`,{d:`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`,key:`a6xqqp`}]]),a=e(`link-2`,[[`path`,{d:`M9 17H7A5 5 0 0 1 7 7h2`,key:`8i5ue5`}],[`path`,{d:`M15 7h2a5 5 0 1 1 0 10h-2`,key:`1b9ql8`}],[`line`,{x1:`8`,x2:`16`,y1:`12`,y2:`12`,key:`1jonct`}]]);function o(){if(typeof navigator>`u`)return`unknown`;let e=navigator.userAgent;return/android/i.test(e)?/Mobile/i.test(e)?`phone`:`tablet`:/iPad/i.test(e)||/Macintosh/i.test(e)&&`ontouchend`in document?`tablet`:/iPhone|iPod/i.test(e)?`phone`:/Macintosh|Mac OS X/i.test(e)||/CrOS/i.test(e)?`laptop`:/Windows/i.test(e)||/Linux/i.test(e)?`desktop`:`unknown`}function s(){if(typeof navigator>`u`)return`Unknown`;let e=navigator.userAgent;if(/android/i.test(e)){let t=e.match(/;\s*([^;)]+)\s+Build\//);return t?t[1].trim():`Android`}return/iPad/i.test(e)||/Macintosh/i.test(e)&&`ontouchend`in document?`iPad`:/iPhone/i.test(e)?`iPhone`:/iPod/i.test(e)?`iPod`:/Windows/i.test(e)?`Windows PC`:/Macintosh|Mac OS X/i.test(e)?`Mac`:/CrOS/i.test(e)?`Chromebook`:/Linux/i.test(e)?`Linux PC`:`Unknown`}var c=1e3,l=0;function u(){let e=globalThis.crypto;return typeof e?.randomUUID==`function`?e.randomUUID():(l+=1,[`playback`,Date.now().toString(36),l.toString(36),Math.random().toString(36).slice(2)].join(`-`))}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 v(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 y(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(_)&&v(e.subtitles):!1}function b(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 x(e){if(!d(e)||typeof e.kind!=`string`)return!1;switch(e.kind){case`announce`:return y(e.activity);case`command`:return f(e.sessionId)&&b(e.command);default:return!1}}function S(e){try{return x(e)}catch{return!1}}export{S as a,r as c,o as i,n as l,u as n,a as o,s as r,i as s,c as t,t as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./chevron-left-CkBJG8E2.js";import{jsx as t,jsxs as n}from"react/jsx-runtime";import{useEffect as r,useRef as i,useState as a}from"react";var o=e(`check`,[[`path`,{d:`M20 6 9 17l-5-5`,key:`1gmf2c`}]]),s=e(`chevron-right`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]),c=e(`play`,[[`path`,{d:`M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z`,key:`10ikf1`}]]),l=e(`search`,[[`path`,{d:`m21 21-4.34-4.34`,key:`14j7rj`}],[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}]]),u=e(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]),d=e(`chevron-down`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]),f=e(`pencil`,[[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}],[`path`,{d:`m15 5 4 4`,key:`1mk7zo`}]]),p=e(`loader-circle`,[[`path`,{d:`M21 12a9 9 0 1 1-6.219-8.56`,key:`13zald`}]]),m=e(`plus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]),h=e(`trash-2`,[[`path`,{d:`M10 11v6`,key:`nco0om`}],[`path`,{d:`M14 11v6`,key:`outv1u`}],[`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6`,key:`miytrc`}],[`path`,{d:`M3 6h18`,key:`d0wm0j`}],[`path`,{d:`M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`,key:`e791ji`}]]),g={backdrop:`_backdrop_ttlmb_1`,"backdrop-in":`_backdrop-in_ttlmb_1`,modal:`_modal_ttlmb_15`,"modal-in":`_modal-in_ttlmb_1`,close:`_close_ttlmb_29`,header:`_header_ttlmb_59`,icon:`_icon_ttlmb_66`,list:`_list_ttlmb_91`,row:`_row_ttlmb_98`,avatar:`_avatar_ttlmb_113`,name:`_name_ttlmb_125`,iconButton:`_iconButton_ttlmb_142`,button:`_button_ttlmb_161`,iconButtonDanger:`_iconButtonDanger_ttlmb_170`,editor:`_editor_ttlmb_179`,editorFields:`_editorFields_ttlmb_189`,addForm:`_addForm_ttlmb_196`,editorActions:`_editorActions_ttlmb_218`,buttonPrimary:`_buttonPrimary_ttlmb_244`,buttonQuiet:`_buttonQuiet_ttlmb_249`,buttonDanger:`_buttonDanger_ttlmb_253`,colorPicker:`_colorPicker_ttlmb_263`,deleteConfirm:`_deleteConfirm_ttlmb_313`,error:`_error_ttlmb_349`,spin:`_spin_ttlmb_355`},_=[`#1565c0`,`#f05b47`,`#6a4c93`,`#00897b`,`#ef6c00`,`#ad1457`];function v(e){let t=i(null),n=i(e);return r(()=>{n.current=e},[e]),r(()=>{let e=document.activeElement,r=document.body.style.overflow;document.body.style.overflow=`hidden`;let i=()=>Array.from(t.current?.querySelectorAll(`button, a[href], input, select, textarea, [tabindex]:not([tabindex="-1"])`)??[]).filter(e=>!e.hasAttribute(`disabled`)),a=window.requestAnimationFrame(()=>i()[0]?.focus()),o=e=>{if(e.key===`Escape`){e.preventDefault(),n.current();return}if(e.key!==`Tab`)return;let r=i();if(!r.length)return;let a=r[0],o=r[r.length-1];e.shiftKey&&document.activeElement===a?(e.preventDefault(),o.focus()):(!e.shiftKey&&document.activeElement===o||document.activeElement&&!t.current?.contains(document.activeElement))&&(e.preventDefault(),a.focus())};return document.addEventListener(`keydown`,o),()=>{window.cancelAnimationFrame(a),document.removeEventListener(`keydown`,o),document.body.style.overflow=r,e?.isConnected&&e.focus()}},[]),t}function y({profiles:e,activeProfile:r,onClose:i,onProfilesChanged:s}){let c=v(i),[l,d]=a(``),[y,x]=a(_[2]),[S,C]=a(null),[w,T]=a(``),[E,D]=a(_[0]),[O,k]=a(null),[A,j]=a(!1),[M,N]=a(``),P=async e=>{let t=await e.json();if(!e.ok||!t.profiles||!t.activeProfile)throw Error(t.error||`Profiles could not be saved.`);await s(t.profiles,t.activeProfile)},F=async t=>{t.preventDefault(),j(!0),N(``);try{let t=await fetch(`/api/netflix/profiles`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({name:l,avatarColor:y})});await P(t),d(``),x(_[(e.length+1)%_.length])}catch(e){N(e instanceof Error?e.message:`Profile could not be added.`)}finally{j(!1)}},I=async e=>{if(e.preventDefault(),S){j(!0),N(``);try{let e=await fetch(`/api/netflix/profiles/${encodeURIComponent(S)}`,{method:`PATCH`,headers:{"content-type":`application/json`},body:JSON.stringify({name:w,avatarColor:E})});await P(e),C(null)}catch(e){N(e instanceof Error?e.message:`Profile could not be updated.`)}finally{j(!1)}}},L=async()=>{if(O){j(!0),N(``);try{let e=await fetch(`/api/netflix/profiles/${encodeURIComponent(O.id)}`,{method:`DELETE`});await P(e),k(null),S===O.id&&C(null)}catch(e){N(e instanceof Error?e.message:`Profile could not be deleted.`)}finally{j(!1)}}},R=e=>{C(e.id),T(e.name),D(e.avatarColor),k(null),N(``)};return t(`div`,{className:g.backdrop,onMouseDown:i,children:n(`article`,{ref:c,className:g.modal,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`manage-profiles-title`,onMouseDown:e=>e.stopPropagation(),children:[t(`button`,{className:g.close,"aria-label":`Close`,onClick:i,children:t(u,{})}),n(`header`,{className:g.header,children:[t(`span`,{className:g.icon,children:t(f,{})}),n(`div`,{children:[t(`h2`,{id:`manage-profiles-title`,children:`Manage Profiles`}),t(`p`,{children:`Each profile keeps its own list and exact watch position.`})]})]}),t(`div`,{className:g.list,children:e.map(i=>S===i.id?n(`form`,{className:g.editor,onSubmit:I,children:[t(`span`,{className:g.avatar,style:{backgroundColor:E},"aria-hidden":`true`,children:w.slice(0,1).toUpperCase()||`?`}),n(`div`,{className:g.editorFields,children:[t(`label`,{htmlFor:`profile-name-${i.id}`,children:`Profile name`}),t(`input`,{id:`profile-name-${i.id}`,required:!0,maxLength:30,value:w,onChange:e=>T(e.currentTarget.value)}),t(b,{name:`edit-color-${i.id}`,value:E,onChange:D})]}),n(`div`,{className:g.editorActions,children:[t(`button`,{type:`button`,className:`${g.button} ${g.buttonQuiet}`,onClick:()=>C(null),children:`Cancel`}),n(`button`,{type:`submit`,className:`${g.button} ${g.buttonPrimary}`,disabled:A,children:[t(o,{}),` Save`]})]})]},i.id):n(`article`,{className:g.row,children:[t(`span`,{className:g.avatar,style:{backgroundColor:i.avatarColor},"aria-hidden":`true`,children:i.name.slice(0,1).toUpperCase()}),n(`span`,{className:g.name,children:[t(`b`,{children:i.name}),t(`small`,{children:i.id===r.id?`Currently watching`:`Separate viewing data`})]}),t(`button`,{type:`button`,className:g.iconButton,"aria-label":`Edit ${i.name}`,onClick:()=>R(i),children:t(f,{})}),t(`button`,{type:`button`,className:`${g.iconButton} ${g.iconButtonDanger}`,"aria-label":`Delete ${i.name}`,disabled:e.length===1,onClick:()=>{k(i),C(null)},children:t(h,{})})]},i.id))}),O&&n(`div`,{className:g.deleteConfirm,role:`alert`,children:[n(`span`,{children:[n(`b`,{children:[`Delete `,O.name,`?`]}),t(`small`,{children:`Their list and watch history will also be deleted.`})]}),t(`button`,{type:`button`,className:`${g.button} ${g.buttonQuiet}`,onClick:()=>k(null),children:`Keep profile`}),t(`button`,{type:`button`,className:`${g.button} ${g.buttonDanger}`,disabled:A,onClick:()=>void L(),children:`Delete`})]}),n(`form`,{className:g.addForm,onSubmit:F,children:[n(`div`,{children:[t(`label`,{htmlFor:`new-profile-name`,children:`Add a profile`}),t(`input`,{id:`new-profile-name`,required:!0,maxLength:30,placeholder:`Profile name`,value:l,onChange:e=>d(e.currentTarget.value)})]}),t(b,{name:`new-profile-color`,value:y,onChange:x}),n(`button`,{type:`submit`,className:`${g.button} ${g.buttonPrimary}`,disabled:A,children:[A?t(p,{className:g.spin}):t(m,{}),`Add profile`]})]}),M&&t(`p`,{className:g.error,role:`alert`,children:M})]})})}function b({name:e,value:r,onChange:i}){return n(`fieldset`,{className:g.colorPicker,children:[t(`legend`,{children:`Avatar color`}),t(`div`,{children:_.map((a,o)=>n(`label`,{title:`Color ${o+1}`,children:[t(`input`,{type:`radio`,name:e,value:a,checked:r===a,onChange:()=>i(a)}),t(`span`,{style:{backgroundColor:a}})]},a))})]})}var x=e(`pause`,[[`rect`,{x:`14`,y:`3`,width:`5`,height:`18`,rx:`1`,key:`kaeet6`}],[`rect`,{x:`5`,y:`3`,width:`5`,height:`18`,rx:`1`,key:`1wsw3u`}]]),S=e(`skip-forward`,[[`path`,{d:`M21 4v16`,key:`7j8fe9`}],[`path`,{d:`M6.029 4.285A2 2 0 0 0 3 6v12a2 2 0 0 0 3.029 1.715l9.997-5.998a2 2 0 0 0 .003-3.432z`,key:`zs4d6`}]]),C=e(`volume-2`,[[`path`,{d:`M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z`,key:`uqj9uw`}],[`path`,{d:`M16 9a5 5 0 0 1 0 6`,key:`1q6k2b`}],[`path`,{d:`M19.364 18.364a9 9 0 0 0 0-12.728`,key:`ijwkga`}]]),w=e(`volume-x`,[[`path`,{d:`M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z`,key:`uqj9uw`}],[`line`,{x1:`22`,x2:`16`,y1:`9`,y2:`15`,key:`1ewh16`}],[`line`,{x1:`16`,x2:`22`,y1:`9`,y2:`15`,key:`5ykzw1`}]]),T=e(`refresh-cw`,[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`,key:`v9h5vc`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`,key:`3uifl3`}],[`path`,{d:`M8 16H3v5`,key:`1cv678`}]]);export{x as a,p as c,u as d,l as f,o as h,S as i,f as l,s as m,w as n,y as o,c as p,C as r,m as s,T as t,d as u};
|