@serifpersia/dango 3.4.2 → 3.4.4
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/README.md +1 -1
- package/client/dist/assets/{AnimeCard-CIwTZI3D.js → AnimeCard-4CEz8Buu.js} +1 -1
- package/client/dist/assets/AnimeInfo-DyX9qTwg.js +1 -0
- package/client/dist/assets/AnimeInfoPage-Dvp_c8vK.js +2 -0
- package/client/dist/assets/Asmr-qg3lMAJn.js +2 -0
- package/client/dist/assets/{AsmrResetProgressModal-BDpA07Fa.js → AsmrResetProgressModal-BpPlg_Vv.js} +1 -1
- package/client/dist/assets/AvSyncCalibrator-C2wu1ydI.css +1 -0
- package/client/dist/assets/AvSyncCalibrator-FJllOgOH.js +10 -0
- package/client/dist/assets/Home-A7gCeEST.js +1 -0
- package/client/dist/assets/Insights-G9IXepHJ.js +1 -0
- package/client/dist/assets/{LibraryListPage-DWbcek1i.js → LibraryListPage-Bh2qCJPh.js} +1 -1
- package/client/dist/assets/{ListeningList-CcuxBzy1.js → ListeningList-Czv4cTRl.js} +1 -1
- package/client/dist/assets/{Manga-DpLaW39C.js → Manga-qdAAS1z7.js} +1 -1
- package/client/dist/assets/MangaInfoPage-1rTgZzf2.js +1 -0
- package/client/dist/assets/MangaReadPage-CeyxPG6w.js +1 -0
- package/client/dist/assets/{MangaResetProgressModal-CYguBG2f.js → MangaResetProgressModal-C_ppotmh.js} +1 -1
- package/client/dist/assets/Mature-Bkhxnr3K.js +1 -0
- package/client/dist/assets/{MediaCard-p29DqyKX.js → MediaCard-BQZsutEo.js} +1 -1
- package/client/dist/assets/Music-C0rGzSbi.js +1 -0
- package/client/dist/assets/{OptionListMenu-C1pvpu8X.js → OptionListMenu-CyfpCBEy.js} +1 -1
- package/client/dist/assets/Player-yhiTlpYU.js +56 -0
- package/client/dist/assets/PlayerSettings-icy4SfQa.js +1 -0
- package/client/dist/assets/{QueueOptionsButton-CWdoe1_I.js → QueueOptionsButton-5eloKF5J.js} +1 -1
- package/client/dist/assets/{QueueRail-BBpn9CII.js → QueueRail-DaMjlKL4.js} +1 -1
- package/client/dist/assets/Radio-FxGqCxR4.js +1 -0
- package/client/dist/assets/{ReadingList-D4xQ9tlw.js → ReadingList-CCm3IAbt.js} +1 -1
- package/client/dist/assets/{ResetProgressModal-JFlbXy7W.js → ResetProgressModal-CeI4V3Y5.js} +1 -1
- package/client/dist/assets/{Search-D-ocogP-.js → Search-qpILaAiQ.js} +1 -1
- package/client/dist/assets/Settings-Bw9M3NGz.js +21 -0
- package/client/dist/assets/{SkeletonGrid-N67HqYXx.js → SkeletonGrid-0dY_xMq3.js} +1 -1
- package/client/dist/assets/{Trackers-C_SPMGKx.js → Trackers-Zy5GOs0P.js} +2 -2
- package/client/dist/assets/Tv-Bx7tGS57.css +1 -0
- package/client/dist/assets/Tv-DREwc7BX.js +4 -0
- package/client/dist/assets/TvInfo-CHIsVzZ0.js +1 -0
- package/client/dist/assets/{TvPopup-DEB6Ufq4.js → TvPopup-D_tVTyZ2.js} +1 -1
- package/client/dist/assets/{TvSearch-grOUL0Bc.js → TvSearch-BVxedBW-.js} +1 -1
- package/client/dist/assets/{TvWatchlist-CBI21Vge.js → TvWatchlist-BEIwq9R9.js} +1 -1
- package/client/dist/assets/{Watchlist-5cDHUoC8.js → Watchlist-CSngjqlz.js} +1 -1
- package/client/dist/assets/{hls-DySVERd_.js → hls-D48GVTkk.js} +1 -1
- package/client/dist/assets/index-CVB5dYhT.js +178 -0
- package/client/dist/assets/{useAnimeInfoData-BMwVSGhZ.js → useAnimeInfoData-DxdOg_B7.js} +1 -1
- package/client/dist/assets/useAsmr-ClckxnPe.js +1 -0
- package/client/dist/assets/{useAsmrPopup-CY-6b88q.js → useAsmrPopup-Bbgxefy_.js} +1 -1
- package/client/dist/assets/useMangaLibrary-B3_BUKVk.js +1 -0
- package/client/dist/assets/{useMangaPopup-_pNXvRYJ.js → useMangaPopup-Celk4lzf.js} +1 -1
- package/client/dist/assets/{useProviders-CKSedfqb.js → useProviders-pwxPZPHh.js} +1 -1
- package/client/dist/assets/useTv-D9sQrDop.js +1 -0
- package/client/dist/assets/useTvLibrary-UsQpgBTB.js +1 -0
- package/client/dist/index.html +1 -1
- package/package.json +3 -3
- package/server/dist/app-hono.js +15 -37
- package/server/dist/db/drizzle.js +2 -18
- package/server/dist/db.js +3 -2
- package/server/dist/hono/tv.js +9 -5
- package/server/dist/hono/watchlist.js +10 -108
- package/server/dist/lib/migration.js +0 -5
- package/server/dist/providers/remote-loader.js +40 -1
- package/server/dist/providers/remote-types.js +9 -2
- package/server/dist/server.js +50 -182
- package/server/dist/sync.js +173 -704
- package/server/dist/trpc/routers/auth.js +2 -71
- package/server/dist/trpc/routers/continue-watching.js +0 -2
- package/server/dist/trpc/routers/data.js +0 -1
- package/server/dist/trpc/routers/discord.js +8 -0
- package/server/dist/trpc/routers/progress.js +95 -1
- package/server/dist/trpc/routers/queue.js +0 -2
- package/server/dist/trpc/routers/watchlist.js +0 -7
- package/server/dist/trpc/validation.js +64 -0
- package/server/package.json +2 -2
- package/client/dist/assets/AnimeInfo-DlfvDaR8.js +0 -1
- package/client/dist/assets/AnimeInfoPage-B3EPwtzx.js +0 -2
- package/client/dist/assets/Asmr-DCirAWM6.js +0 -2
- package/client/dist/assets/AvSyncCalibrator-BPa6KaGC.css +0 -1
- package/client/dist/assets/AvSyncCalibrator-BroSW86T.js +0 -10
- package/client/dist/assets/Home-DEjYtHbs.js +0 -1
- package/client/dist/assets/Insights-B3b6u8RW.js +0 -1
- package/client/dist/assets/MangaInfoPage-B7FPC4a_.js +0 -1
- package/client/dist/assets/MangaReadPage-Dx0qAAFe.js +0 -1
- package/client/dist/assets/Mature-AScDPmWW.js +0 -1
- package/client/dist/assets/Music-DFInMskb.js +0 -1
- package/client/dist/assets/Player-D-8zY3cx.js +0 -56
- package/client/dist/assets/PlayerSettings-CfJjs_0Q.js +0 -1
- package/client/dist/assets/Radio-DCgO5hAS.js +0 -1
- package/client/dist/assets/Settings-BsFbgkdy.js +0 -21
- package/client/dist/assets/Tv-D7s0Kqqx.js +0 -4
- package/client/dist/assets/Tv-ZEA45gXK.css +0 -1
- package/client/dist/assets/TvInfo-CrmCSFDF.js +0 -1
- package/client/dist/assets/index-HZNJp28e.js +0 -178
- package/client/dist/assets/useAsmr-BLc7FwPm.js +0 -1
- package/client/dist/assets/useMangaLibrary-XFRTq5Qg.js +0 -1
- package/client/dist/assets/useMatureConsent-Cra09TA0.js +0 -1
- package/client/dist/assets/useTv-Dizj6G4R.js +0 -1
- package/client/dist/assets/useTvLibrary-twjHQ89n.js +0 -1
|
@@ -1,84 +1,15 @@
|
|
|
1
|
-
import path from 'path';
|
|
2
1
|
import logger from '../../logger.js';
|
|
3
2
|
import { googleDriveService } from '../../google.js';
|
|
4
3
|
import { githubSyncService } from '../../github-sync.js';
|
|
5
|
-
import { initSyncProvider, getActiveProvider,
|
|
4
|
+
import { initSyncProvider, getActiveProvider, runFullSyncSequence } from '../../sync.js';
|
|
6
5
|
import { CONFIG } from '../../config.js';
|
|
7
6
|
import { rcloneService } from '../../rclone.js';
|
|
8
7
|
import { updateEnvFile } from '../../utils/env.utils.js';
|
|
9
8
|
import { protectedProcedure, router } from '../index.js';
|
|
10
9
|
import { defineSchema, reqObj } from '../validation.js';
|
|
11
10
|
async function runSyncFromCtx(ctx, database, preferredProvider) {
|
|
12
|
-
const dbName = CONFIG.IS_DEV ? CONFIG.DB_NAME_DEV : CONFIG.DB_NAME_PROD;
|
|
13
|
-
const dbPath = path.join(CONFIG.ROOT, dbName);
|
|
14
11
|
const remoteFolder = CONFIG.IS_DEV ? CONFIG.REMOTE_FOLDER_DEV : CONFIG.REMOTE_FOLDER_PROD;
|
|
15
|
-
await
|
|
16
|
-
if (getActiveProvider() === 'github' && githubSyncService.isAuthenticated()) {
|
|
17
|
-
try {
|
|
18
|
-
await githubSyncService.migrateFromAniWebSync();
|
|
19
|
-
}
|
|
20
|
-
catch (err) {
|
|
21
|
-
logger.error({ err }, 'GitHub sync migration from ani-web failed');
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
const didDownload = await syncDownOnBoot(database, dbPath, remoteFolder, () => {
|
|
25
|
-
return new Promise((resolve) => {
|
|
26
|
-
if (database && !database.isClosedCheck()) {
|
|
27
|
-
database.checkpoint();
|
|
28
|
-
database.close(() => resolve());
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
resolve();
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
let currentDb = database;
|
|
36
|
-
if (didDownload) {
|
|
37
|
-
currentDb = await initializeDatabase(dbPath);
|
|
38
|
-
logger.info('Database re-initialized after sync.');
|
|
39
|
-
}
|
|
40
|
-
try {
|
|
41
|
-
await syncUp(currentDb, dbPath, remoteFolder);
|
|
42
|
-
}
|
|
43
|
-
catch (err) {
|
|
44
|
-
logger.error({ err }, 'Sync up on boot failed');
|
|
45
|
-
}
|
|
46
|
-
try {
|
|
47
|
-
await mangaSyncDownOnBoot(ctx.mangaDb, remoteFolder);
|
|
48
|
-
}
|
|
49
|
-
catch (err) {
|
|
50
|
-
logger.error({ err }, 'Manga sync down on boot failed');
|
|
51
|
-
}
|
|
52
|
-
try {
|
|
53
|
-
await mangaSyncUp(ctx.mangaDb, remoteFolder);
|
|
54
|
-
}
|
|
55
|
-
catch (err) {
|
|
56
|
-
logger.error({ err }, 'Manga sync up on boot failed');
|
|
57
|
-
}
|
|
58
|
-
try {
|
|
59
|
-
await tvSyncDownOnBoot(ctx.tvDb, remoteFolder);
|
|
60
|
-
}
|
|
61
|
-
catch (err) {
|
|
62
|
-
logger.error({ err }, 'TV sync down on boot failed');
|
|
63
|
-
}
|
|
64
|
-
try {
|
|
65
|
-
await tvSyncUp(ctx.tvDb, remoteFolder);
|
|
66
|
-
}
|
|
67
|
-
catch (err) {
|
|
68
|
-
logger.error({ err }, 'TV sync up on boot failed');
|
|
69
|
-
}
|
|
70
|
-
try {
|
|
71
|
-
await asmrSyncDownOnBoot(ctx.asmrDb, remoteFolder);
|
|
72
|
-
}
|
|
73
|
-
catch (err) {
|
|
74
|
-
logger.error({ err }, 'ASMR sync down on boot failed');
|
|
75
|
-
}
|
|
76
|
-
try {
|
|
77
|
-
await asmrSyncUp(ctx.asmrDb, remoteFolder);
|
|
78
|
-
}
|
|
79
|
-
catch (err) {
|
|
80
|
-
logger.error({ err }, 'ASMR sync up on boot failed');
|
|
81
|
-
}
|
|
12
|
+
await runFullSyncSequence({ db: database, mangaDb: ctx.mangaDb, tvDb: ctx.tvDb, asmrDb: ctx.asmrDb }, { remoteFolder, preferredProvider });
|
|
82
13
|
}
|
|
83
14
|
const googleAuthSaveInput = () => defineSchema((value) => {
|
|
84
15
|
const obj = reqObj(value);
|
|
@@ -23,7 +23,6 @@ export const continueWatchingRouter = router({
|
|
|
23
23
|
await NotificationsRepository.deleteByShow(tx, id);
|
|
24
24
|
}
|
|
25
25
|
});
|
|
26
|
-
ctx.db.scheduleSave();
|
|
27
26
|
return { success: true, removed: ids.length };
|
|
28
27
|
}),
|
|
29
28
|
adultCount: protectedProcedure.query(async ({ ctx }) => {
|
|
@@ -39,7 +38,6 @@ export const continueWatchingRouter = router({
|
|
|
39
38
|
await NotificationsRepository.deleteByShow(tx, id);
|
|
40
39
|
}
|
|
41
40
|
});
|
|
42
|
-
ctx.db.scheduleSave();
|
|
43
41
|
}
|
|
44
42
|
return { success: true, removed: ids.length };
|
|
45
43
|
}),
|
|
@@ -69,6 +69,14 @@ export const discordRouter = router({
|
|
|
69
69
|
}
|
|
70
70
|
return { success: true };
|
|
71
71
|
}),
|
|
72
|
+
clear: protectedProcedure.input(presenceInput()).mutation(async ({ input }) => {
|
|
73
|
+
const sessionId = optUnknown(input, 'sessionId');
|
|
74
|
+
if (!discordRPCService.isServiceEnabled) {
|
|
75
|
+
return { success: true };
|
|
76
|
+
}
|
|
77
|
+
discordRPCService.clearPresence(typeof sessionId === 'string' ? sessionId : undefined);
|
|
78
|
+
return { success: true };
|
|
79
|
+
}),
|
|
72
80
|
asmrPresence: protectedProcedure.input(presenceInput()).mutation(async ({ input }) => {
|
|
73
81
|
if (!discordRPCService.isServiceEnabled)
|
|
74
82
|
return { success: true };
|
|
@@ -1,7 +1,35 @@
|
|
|
1
1
|
import { protectedProcedure, router } from '../index.js';
|
|
2
2
|
import { WatchedEpisodesRepository } from '../../repositories/watched-episodes.repository.js';
|
|
3
|
+
import { ShowsMetaRepository } from '../../repositories/shows-meta.repository.js';
|
|
4
|
+
import { NotificationsRepository } from '../../repositories/notifications.repository.js';
|
|
5
|
+
import { SettingsRepository } from '../../repositories/settings.repository.js';
|
|
6
|
+
import { performWriteTransactionAsync } from '../../sync.js';
|
|
3
7
|
import { getMigratedId } from '../../lib/migration.js';
|
|
4
|
-
import {
|
|
8
|
+
import { discordRPCService } from '../../discord-rpc.js';
|
|
9
|
+
import { dbGet } from '../../utils/db-utils.js';
|
|
10
|
+
import { episodeProgressInput, progressUpdateInput, showIdInput } from '../validation.js';
|
|
11
|
+
async function showsMetaChanged(db, showId, candidate) {
|
|
12
|
+
const existing = (await ShowsMetaRepository.getById(db, showId));
|
|
13
|
+
if (!existing)
|
|
14
|
+
return true;
|
|
15
|
+
const differs = (incoming, stored) => {
|
|
16
|
+
if (incoming === undefined || incoming === null || incoming === '')
|
|
17
|
+
return false;
|
|
18
|
+
return String(incoming) !== String(stored ?? '');
|
|
19
|
+
};
|
|
20
|
+
return (differs(candidate.name, existing.name) ||
|
|
21
|
+
differs(candidate.thumbnail, existing.thumbnail) ||
|
|
22
|
+
differs(candidate.nativeName, existing.nativeName) ||
|
|
23
|
+
differs(candidate.englishName, existing.englishName) ||
|
|
24
|
+
differs(candidate.genres, existing.genres) ||
|
|
25
|
+
differs(candidate.popularityScore, existing.popularityScore) ||
|
|
26
|
+
differs(candidate.status, existing.status) ||
|
|
27
|
+
differs(candidate.episodeCount, existing.episodeCount) ||
|
|
28
|
+
differs(candidate.type, existing.type) ||
|
|
29
|
+
differs(candidate.anilistId, existing.anilistId) ||
|
|
30
|
+
differs(candidate.isAdult, existing.isAdult) ||
|
|
31
|
+
differs(candidate.episodeDuration, existing.episodeDuration));
|
|
32
|
+
}
|
|
5
33
|
export const progressRouter = router({
|
|
6
34
|
getEpisode: protectedProcedure.input(episodeProgressInput()).query(async ({ ctx, input }) => {
|
|
7
35
|
const showId = await getMigratedId(ctx.db, input.showId);
|
|
@@ -12,4 +40,70 @@ export const progressRouter = router({
|
|
|
12
40
|
const showId = await getMigratedId(ctx.db, input.showId);
|
|
13
41
|
return WatchedEpisodesRepository.getWatchedEpisodeNumbers(ctx.db, showId);
|
|
14
42
|
}),
|
|
43
|
+
updateProgress: protectedProcedure
|
|
44
|
+
.input(progressUpdateInput())
|
|
45
|
+
.mutation(async ({ ctx, input }) => {
|
|
46
|
+
const showId = await getMigratedId(ctx.db, input.showId);
|
|
47
|
+
const { episodeNumber } = input;
|
|
48
|
+
const currentTime = input.currentTime || 0;
|
|
49
|
+
const duration = input.duration || 0;
|
|
50
|
+
const titlePreferenceRow = await SettingsRepository.getByKey(ctx.db, 'titlePreference');
|
|
51
|
+
const titlePreference = titlePreferenceRow ? titlePreferenceRow.value : 'englishName';
|
|
52
|
+
let displayName = input.showName;
|
|
53
|
+
if (titlePreference === 'englishName' && input.englishName) {
|
|
54
|
+
displayName = input.englishName;
|
|
55
|
+
}
|
|
56
|
+
else if (titlePreference === 'nativeName' && input.nativeName) {
|
|
57
|
+
displayName = input.nativeName;
|
|
58
|
+
}
|
|
59
|
+
discordRPCService.updatePresence({
|
|
60
|
+
title: displayName,
|
|
61
|
+
episode: String(episodeNumber),
|
|
62
|
+
totalEpisodes: input.episodeCount ? String(input.episodeCount) : undefined,
|
|
63
|
+
currentTime,
|
|
64
|
+
duration,
|
|
65
|
+
thumbnail: input.showThumbnail || '',
|
|
66
|
+
isPlaying: input.isPlaying !== false,
|
|
67
|
+
sessionId: input.sessionId,
|
|
68
|
+
isAdult: input.isAdult,
|
|
69
|
+
});
|
|
70
|
+
const genresStr = Array.isArray(input.genres) ? JSON.stringify(input.genres) : input.genres;
|
|
71
|
+
const anilistId = /^\d+$/.test(showId)
|
|
72
|
+
? (dbGet(ctx.db, 'SELECT anilistId FROM shows_meta WHERE id = ? AND anilistId IS NOT NULL', [showId])?.anilistId ?? parseInt(showId))
|
|
73
|
+
: undefined;
|
|
74
|
+
const metaCandidate = {
|
|
75
|
+
name: input.showName,
|
|
76
|
+
thumbnail: input.showThumbnail,
|
|
77
|
+
nativeName: input.nativeName,
|
|
78
|
+
englishName: input.englishName,
|
|
79
|
+
genres: genresStr,
|
|
80
|
+
popularityScore: input.popularityScore,
|
|
81
|
+
status: input.status,
|
|
82
|
+
episodeCount: input.episodeCount,
|
|
83
|
+
type: input.type,
|
|
84
|
+
anilistId,
|
|
85
|
+
isAdult: typeof input.isAdult === 'boolean' ? (input.isAdult ? 1 : 0) : null,
|
|
86
|
+
episodeDuration: duration > 0 ? Math.round(duration / 60) : undefined,
|
|
87
|
+
};
|
|
88
|
+
const metaChanged = await showsMetaChanged(ctx.db, showId, metaCandidate);
|
|
89
|
+
if (metaChanged) {
|
|
90
|
+
await performWriteTransactionAsync(ctx.db, async (tx) => {
|
|
91
|
+
await ShowsMetaRepository.upsert(tx, {
|
|
92
|
+
id: showId,
|
|
93
|
+
...metaCandidate,
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
await performWriteTransactionAsync(ctx.db, async (tx) => {
|
|
98
|
+
await WatchedEpisodesRepository.upsert(tx, {
|
|
99
|
+
showId,
|
|
100
|
+
episodeNumber,
|
|
101
|
+
currentTime,
|
|
102
|
+
duration,
|
|
103
|
+
});
|
|
104
|
+
await NotificationsRepository.deleteSpecificDismissed(tx, showId, episodeNumber);
|
|
105
|
+
await NotificationsRepository.deleteDiscovered(tx, showId, episodeNumber);
|
|
106
|
+
});
|
|
107
|
+
return { success: true };
|
|
108
|
+
}),
|
|
15
109
|
});
|
|
@@ -39,7 +39,6 @@ export const queueRouter = router({
|
|
|
39
39
|
await QueueRepository.addToEnd(tx, showId, episodeNumber);
|
|
40
40
|
}
|
|
41
41
|
});
|
|
42
|
-
ctx.db.scheduleSave();
|
|
43
42
|
return { success: true, queued: !existing };
|
|
44
43
|
}),
|
|
45
44
|
addBatch: protectedProcedure.input(queueBatchInput()).mutation(async ({ ctx, input }) => {
|
|
@@ -58,7 +57,6 @@ export const queueRouter = router({
|
|
|
58
57
|
}
|
|
59
58
|
await QueueRepository.addManyToEnd(tx, normalized.map((episodeNumber) => ({ showId, episodeNumber })));
|
|
60
59
|
});
|
|
61
|
-
ctx.db.scheduleSave();
|
|
62
60
|
return { success: true, added: normalized.length };
|
|
63
61
|
}),
|
|
64
62
|
remove: protectedProcedure.input(queueRemoveInput()).mutation(async ({ ctx, input }) => {
|
|
@@ -62,7 +62,6 @@ export const watchlistRouter = router({
|
|
|
62
62
|
await ShowsMetaRepository.upsert(tx, { id, isAdult: input.isAdult ? 1 : 0 });
|
|
63
63
|
}
|
|
64
64
|
});
|
|
65
|
-
await ctx.db.saveNow();
|
|
66
65
|
if (input.name && !/^\d+$/.test(id)) {
|
|
67
66
|
const db = ctx.db;
|
|
68
67
|
const name = input.name;
|
|
@@ -71,7 +70,6 @@ export const watchlistRouter = router({
|
|
|
71
70
|
const result = await searchAnilistByTitle(name);
|
|
72
71
|
if (result?.id) {
|
|
73
72
|
await ShowsMetaRepository.upsert(db, { id, anilistId: result.id });
|
|
74
|
-
db.scheduleSave();
|
|
75
73
|
return;
|
|
76
74
|
}
|
|
77
75
|
}
|
|
@@ -80,7 +78,6 @@ export const watchlistRouter = router({
|
|
|
80
78
|
if (kitsuResults.length > 0) {
|
|
81
79
|
const anilistId = Math.abs(kitsuResults[0].id);
|
|
82
80
|
await ShowsMetaRepository.upsert(db, { id, anilistId });
|
|
83
|
-
db.scheduleSave();
|
|
84
81
|
}
|
|
85
82
|
}
|
|
86
83
|
catch {
|
|
@@ -109,7 +106,6 @@ export const watchlistRouter = router({
|
|
|
109
106
|
await NotificationsRepository.deleteByShow(tx, id);
|
|
110
107
|
}
|
|
111
108
|
});
|
|
112
|
-
ctx.db.scheduleSave();
|
|
113
109
|
return { success: true, removed: ids.length };
|
|
114
110
|
}),
|
|
115
111
|
setStatus: protectedProcedure.input(watchlistStatusInput()).mutation(async ({ ctx, input }) => {
|
|
@@ -126,7 +122,6 @@ export const watchlistRouter = router({
|
|
|
126
122
|
await performWriteTransactionAsync(ctx.db, async (tx) => {
|
|
127
123
|
await WatchlistRepository.updateStatusMany(tx, ids, input.status);
|
|
128
124
|
});
|
|
129
|
-
ctx.db.scheduleSave();
|
|
130
125
|
return { success: true, updated: ids.length };
|
|
131
126
|
}),
|
|
132
127
|
list: protectedProcedure.input(watchlistListInput()).query(async ({ ctx, input }) => {
|
|
@@ -481,7 +476,6 @@ async function backfillMissingPosters(db, rows) {
|
|
|
481
476
|
// ignore
|
|
482
477
|
}
|
|
483
478
|
}));
|
|
484
|
-
db.scheduleSave();
|
|
485
479
|
await sweepOfflinePosters(db);
|
|
486
480
|
}
|
|
487
481
|
async function sweepOfflinePosters(db) {
|
|
@@ -505,7 +499,6 @@ async function sweepOfflinePosters(db) {
|
|
|
505
499
|
if (poster)
|
|
506
500
|
await applyPoster(db, id, poster);
|
|
507
501
|
}
|
|
508
|
-
db.scheduleSave();
|
|
509
502
|
}
|
|
510
503
|
function resolveOfflinePoster(id) {
|
|
511
504
|
if (/^\d+$/.test(id)) {
|
|
@@ -36,6 +36,19 @@ export function optStr(obj, name) {
|
|
|
36
36
|
return undefined;
|
|
37
37
|
return String(value);
|
|
38
38
|
}
|
|
39
|
+
export function optNum(obj, name) {
|
|
40
|
+
const value = obj[name];
|
|
41
|
+
if (value === undefined || value === null || value === '')
|
|
42
|
+
return undefined;
|
|
43
|
+
const num = Number(value);
|
|
44
|
+
return Number.isFinite(num) ? num : undefined;
|
|
45
|
+
}
|
|
46
|
+
export function optBool(obj, name) {
|
|
47
|
+
const value = obj[name];
|
|
48
|
+
if (typeof value !== 'boolean')
|
|
49
|
+
return undefined;
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
39
52
|
function reqEpNum(obj, name) {
|
|
40
53
|
const value = obj[name];
|
|
41
54
|
if ((typeof value !== 'string' && typeof value !== 'number') || String(value).length === 0) {
|
|
@@ -153,6 +166,57 @@ export const setSettingInput = () => defineSchema((value) => {
|
|
|
153
166
|
throw new Error('Expected an object');
|
|
154
167
|
return { key: readKey(value), value: value.value };
|
|
155
168
|
});
|
|
169
|
+
export const progressUpdateInput = () => defineSchema((value) => {
|
|
170
|
+
const obj = reqObj(value);
|
|
171
|
+
const out = {
|
|
172
|
+
showId: reqStr(obj, 'showId'),
|
|
173
|
+
episodeNumber: reqEpNum(obj, 'episodeNumber'),
|
|
174
|
+
};
|
|
175
|
+
const currentTime = optNum(obj, 'currentTime');
|
|
176
|
+
if (currentTime !== undefined)
|
|
177
|
+
out.currentTime = currentTime;
|
|
178
|
+
const duration = optNum(obj, 'duration');
|
|
179
|
+
if (duration !== undefined)
|
|
180
|
+
out.duration = duration;
|
|
181
|
+
const showName = optStr(obj, 'showName');
|
|
182
|
+
if (showName !== undefined)
|
|
183
|
+
out.showName = showName;
|
|
184
|
+
const showThumbnail = optStr(obj, 'showThumbnail');
|
|
185
|
+
if (showThumbnail !== undefined)
|
|
186
|
+
out.showThumbnail = showThumbnail;
|
|
187
|
+
const nativeName = optStr(obj, 'nativeName');
|
|
188
|
+
if (nativeName !== undefined)
|
|
189
|
+
out.nativeName = nativeName;
|
|
190
|
+
const englishName = optStr(obj, 'englishName');
|
|
191
|
+
if (englishName !== undefined)
|
|
192
|
+
out.englishName = englishName;
|
|
193
|
+
const genres = obj['genres'];
|
|
194
|
+
if (typeof genres === 'string' || Array.isArray(genres)) {
|
|
195
|
+
out.genres = (Array.isArray(genres) ? genres : [genres]).map(String);
|
|
196
|
+
}
|
|
197
|
+
const popularityScore = optNum(obj, 'popularityScore');
|
|
198
|
+
if (popularityScore !== undefined)
|
|
199
|
+
out.popularityScore = popularityScore;
|
|
200
|
+
const type = optStr(obj, 'type');
|
|
201
|
+
if (type !== undefined)
|
|
202
|
+
out.type = type;
|
|
203
|
+
const status = optStr(obj, 'status');
|
|
204
|
+
if (status !== undefined)
|
|
205
|
+
out.status = status;
|
|
206
|
+
const episodeCount = optNum(obj, 'episodeCount');
|
|
207
|
+
if (episodeCount !== undefined)
|
|
208
|
+
out.episodeCount = episodeCount;
|
|
209
|
+
const isPlaying = optBool(obj, 'isPlaying');
|
|
210
|
+
if (isPlaying !== undefined)
|
|
211
|
+
out.isPlaying = isPlaying;
|
|
212
|
+
const sessionId = optStr(obj, 'sessionId');
|
|
213
|
+
if (sessionId !== undefined)
|
|
214
|
+
out.sessionId = sessionId;
|
|
215
|
+
const isAdult = optBool(obj, 'isAdult');
|
|
216
|
+
if (isAdult !== undefined)
|
|
217
|
+
out.isAdult = isAdult;
|
|
218
|
+
return out;
|
|
219
|
+
});
|
|
156
220
|
export const notificationDismissInput = () => defineSchema((value) => {
|
|
157
221
|
const obj = reqObj(value);
|
|
158
222
|
return { showId: reqStr(obj, 'showId'), episodeNumber: reqEpNum(obj, 'episodeNumber') };
|
package/server/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dango-server",
|
|
3
3
|
"private": true,
|
|
4
|
-
"version": "3.4.
|
|
4
|
+
"version": "3.4.4",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
7
7
|
"node": ">=22.12.0"
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"@xhayper/discord-rpc": "^1.3.4",
|
|
22
22
|
"cheerio": "^1.2.0",
|
|
23
23
|
"dotenv": "^17.4.2",
|
|
24
|
-
"drizzle-orm": "0.
|
|
24
|
+
"drizzle-orm": "1.0.0-rc.4",
|
|
25
25
|
"fast-xml-parser": "^5.11.1",
|
|
26
26
|
"got-scraping": "^3.2.9",
|
|
27
27
|
"hono": "^4.13.9",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{o as C,a as I,d as S,h as p,T,u as e}from"./vendor-core-DfaOB3Rn.js";import{I as s}from"./vendor-icons-DrybRNxP.js";import{u as b}from"./useAnimeInfoData-BMwVSGhZ.js";import{d as B,f as d,s as w,M,B as u}from"./index-HZNJp28e.js";import{u as x}from"./useMatureConsent-Cra09TA0.js";import{A}from"./AnimeMetaDetails-BogOi_bM.js";import{S as D}from"./SynopsisText-B3Sa5pRv.js";import{Q as G}from"./QueueOptionsButton-CWdoe1_I.js";import"./vendor-query-BBT5_sHx.js";import"./useIsMobile-Dvx1uJ82.js";import"./vendor-ui-3qrARCPr.js";const P="_container_1287q_1",W="_heroSection_1287q_11",O="_bannerContainer_1287q_17",$="_banner_1287q_17",U="_bannerOverlay_1287q_37",j="_heroContent_1287q_49",z="_posterContainer_1287q_62",V="_floatIn_1287q_1",Q="_poster_1287q_62",E="_infoGlass_1287q_86",H="_slideUpIn_1287q_1",F="_title_1287q_100",J="_quickMeta_1287q_109",K="_metaItem_1287q_117",L="_iconStar_1287q_126",R="_iconTv_1287q_129",X="_iconType_1287q_132",Y="_iconClock_1287q_135",Z="_genres_1287q_139",ee="_genre_1287q_139",ne="_synopsisSection_1287q_165",te="_sectionTitleSmall_1287q_170",se="_description_1287q_178",ae="_actions_1287q_186",ie="_watchBtn_1287q_192",oe="_watchlistBtn_1287q_214",le="_active_1287q_234",ce="_detailsSection_1287q_241",re="_detailsToggleBtn_1287q_247",de="_expandedContent_1287q_270",_e="_fadeIn_1287q_1",me="_detailsGridContainer_1287q_274",he="_detailItem_1287q_284",pe="_airingValue_1287q_303",ue="_loadingDetails_1287q_308",ve="_spinner_1287q_317",ge="_spin_1287q_317",ke="_heroSkeleton_1287q_332",qe="_skeletonBanner_1287q_336",fe="_skeletonPoster_1287q_337",Ne="_skeletonTitle_1287q_338",ye="_skeletonMeta_1287q_339",Ce="_skeletonDesc_1287q_340",Ie="_skeletonActions_1287q_341",Se="_skeletonContent_1287q_374",Te="_skeletonInfo_1287q_388",n={container:P,heroSection:W,bannerContainer:O,banner:$,bannerOverlay:U,heroContent:j,posterContainer:z,floatIn:V,poster:Q,infoGlass:E,slideUpIn:H,title:F,quickMeta:J,metaItem:K,iconStar:L,iconTv:R,iconType:X,iconClock:Y,genres:Z,genre:ee,synopsisSection:ne,sectionTitleSmall:te,description:se,actions:ae,watchBtn:ie,watchlistBtn:oe,active:le,detailsSection:ce,detailsToggleBtn:re,expandedContent:de,fadeIn:_e,detailsGridContainer:me,detailItem:he,airingValue:pe,loadingDetails:ue,spinner:ve,spin:ge,heroSkeleton:ke,skeletonBanner:qe,skeletonPoster:fe,skeletonTitle:Ne,skeletonMeta:ye,skeletonDesc:Ce,skeletonActions:Ie,"skeleton-wave":"_skeleton-wave_1287q_1",skeletonContent:Se,skeletonInfo:Te};function $e(){const{id:a}=C(),i=I(),{titlePreference:l}=B(),[o,v]=S(!1),{showMeta:t,loadingMeta:g,toggleWatchlist:k,inWatchlist:c}=b(a),{hasConsent:q,grant:f}=x();p(()=>{a&&t?.id&&t.id!==a&&i(`/anime/${t.id}`,{replace:!0})},[a,t,i]),p(()=>{document.title=t?.name?`${t.name} - dango`:"Anime - dango"},[t?.name]);const N=()=>t?.name?l==="name"?t.name:l==="nativeName"?t.names?.native||t.name:l==="englishName"&&t.names?.english||t.name:"",y=()=>{a&&i(`/watch/${a}`)},_=T(()=>t?.bannerImage?d(t.bannerImage):t?.thumbnail?d(t.thumbnail,1200,450):"",[t?.bannerImage,t?.thumbnail]);if(g||!t?.name)return e("div",{className:n.container,children:e("div",{className:n.heroSkeleton,children:[e("div",{className:n.skeletonBanner}),e("div",{className:n.skeletonContent,children:[e("div",{className:n.skeletonPoster}),e("div",{className:n.skeletonInfo,children:[e("div",{className:n.skeletonTitle}),e("div",{className:n.skeletonMeta}),e("div",{className:n.skeletonDesc}),e("div",{className:n.skeletonActions})]})]})]})});const m=t.isAdult===!0&&!q;return e("div",{className:n.container,style:m?{filter:"blur(14px)",pointerEvents:"none",userSelect:"none"}:void 0,children:[e("div",{className:n.heroSection,children:[e("div",{className:n.bannerContainer,children:[e("div",{className:n.banner,style:_?{backgroundImage:`url(${_})`}:void 0}),e("div",{className:n.bannerOverlay})]}),e("div",{className:n.heroContent,children:[e("div",{className:n.posterContainer,children:e("img",{src:d(t.thumbnail||"",320,480),alt:t.name,className:n.poster,decoding:"async"})}),e("div",{className:n.infoGlass,children:[e("div",{className:n.topInfo,children:[e("h1",{className:n.title,children:N()}),e("div",{className:n.quickMeta,children:[t.score&&e("div",{className:n.metaItem,children:[e(s,{name:"star",className:n.iconStar}),e("span",{children:t.score})]}),t.status&&e("div",{className:n.metaItem,children:[e(s,{name:"tv",className:n.iconTv}),e("span",{children:t.status})]}),t.type&&e("div",{className:n.metaItem,children:[e(s,{name:"layer-group",className:n.iconType}),e("span",{children:t.type})]})]}),Array.isArray(t.genres)&&t.genres.length>0&&e("div",{className:n.genres,children:t.genres.filter(Boolean).slice(0,5).map(r=>{const h=typeof r=="string"?r:r?.name;return e("span",{className:n.genre,children:h},h)})})]}),e("div",{className:n.synopsisSection,children:[e("h2",{className:n.sectionTitleSmall,children:"Synopsis"}),e(D,{text:w(t.description),emptyText:"No description available."})]}),e("div",{className:n.actions,children:[e("button",{className:n.watchBtn,onClick:y,children:[e(s,{name:"play",size:14}),"Start Watching"]}),e("button",{className:`${n.watchlistBtn} ${c?n.active:""}`,onClick:k,children:[c?e(s,{name:"check",size:14}):e(s,{name:"plus",size:14}),c?"In Watchlist":"Add to Watchlist"]}),e(G,{showId:a,showName:t.name||t.names?.romaji,showThumbnail:t.thumbnail,nativeName:t.names?.native,englishName:t.names?.english,showType:t.type,className:n.watchlistBtn,activeClassName:n.active})]})]})]})]}),e("div",{className:n.detailsSection,children:[e("button",{className:n.detailsToggleBtn,onClick:()=>{v(!o)},children:[o?e(s,{name:"chevron-up"}):e(s,{name:"chevron-down"}),o?"Hide Details":"Show Details"]}),o&&e("div",{className:n.expandedContent,children:e(A,{showMeta:t,styles:n})})]}),m&&e(M,{isOpen:!0,title:"Content Warning",onClose:()=>i("/"),children:e("div",{style:{padding:"1rem",textAlign:"center"},children:[e("p",{children:"This title contains mature content intended for adult audiences."}),e("p",{children:["By proceeding, you confirm that you are ",e("strong",{children:"18 years of age or older"})," (or the age of majority in your jurisdiction) and wish to view this content."]}),e("div",{style:{marginTop:"1rem",display:"flex",gap:"10px",justifyContent:"center"},children:[e(u,{variant:"secondary",onClick:()=>i("/"),children:"Go Back"}),e(u,{onClick:f,children:"I'm 18+, Continue"})]})]})})]})}export{$e as default};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AnimeInfo-DlfvDaR8.js","assets/vendor-core-DfaOB3Rn.js","assets/vendor-icons-DrybRNxP.js","assets/useAnimeInfoData-BMwVSGhZ.js","assets/vendor-query-BBT5_sHx.js","assets/index-HZNJp28e.js","assets/index-Cc1Up_NI.css","assets/QueueOptionsButton-CWdoe1_I.js","assets/vendor-ui-3qrARCPr.js","assets/QueueOptionsButton-CM15uQn8.css","assets/useMatureConsent-Cra09TA0.js","assets/AnimeMetaDetails-BogOi_bM.js","assets/AnimeMetaDetails-BwNQnRCd.css","assets/SynopsisText-B3Sa5pRv.js","assets/useIsMobile-Dvx1uJ82.js","assets/SynopsisText-CYv2W3yR.css","assets/AnimeInfo-BFWtHlPC.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{$ as r,_ as t}from"./index-HZNJp28e.js";import{u as o,P as e,z as i}from"./vendor-core-DfaOB3Rn.js";import"./vendor-query-BBT5_sHx.js";import"./vendor-icons-DrybRNxP.js";const a=i(()=>t(()=>import("./AnimeInfo-DlfvDaR8.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16])));function p(){return o(e,{fallback:o(r,{}),children:o(a,{})})}export{p as default};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{T as Je,u as e,A as j,d as m,h as N,a as Ge,g as $e,q as J,S as O,$ as Ve,o as bt,p as vt}from"./vendor-core-DfaOB3Rn.js";import{I as y}from"./vendor-icons-DrybRNxP.js";import{u as yt}from"./vendor-query-BBT5_sHx.js";import{e as me,t as Ee,B as he,M as xe,U as P,z as oe,W as kt,T as ze}from"./index-HZNJp28e.js";import{M as wt}from"./MediaCard-p29DqyKX.js";import{c as Qe,a as Ze,d as Nt,e as Xe,f as et,g as Ct,h as St,i as Tt,j as At,k as Ye,l as Pe}from"./useAsmr-BLc7FwPm.js";import{a as t}from"./Asmr.module-ChUXDZKx.js";import{u as Mt,A as xt}from"./useAsmrPopup-CY-6b88q.js";import{l as Bt}from"./hls-DySVERd_.js";import"./vendor-ui-3qrARCPr.js";import"./useIsMobile-Dvx1uJ82.js";const Lt=({work:s,onClose:o,onPlay:S,t:g})=>{const{data:i,isLoading:h}=Qe(s.id||null),v=Ze(s),{data:A}=Nt(v||void 0),{toggle:k,bookmarkedIds:T}=Xe(),{data:R}=et(v||void 0),L=v?T.has(v):!!A?.inLibrary,C=Je(()=>(i?.description||s.description||"").split(`
|
|
2
|
-
`).map(l=>{const u=l.indexOf(":");return u===-1?null:{label:l.slice(0,u),value:l.slice(u+1).trim()}}).filter(l=>!!l&&!!l.value),[i?.description,s.description]),f=i?.tracks||[],w=Je(()=>{const l=R?.progress??[];return l.length>0?l.reduce((u,d)=>u.updatedAt>=d.updatedAt?u:d):null},[R]),M=w&&w.trackIndex<f.length?w.trackIndex:null;return e("div",{className:t.detailOverlay,onClick:o,children:e("div",{className:t.detailModal,onClick:l=>l.stopPropagation(),children:[e("button",{className:t.detailClose,onClick:o,"aria-label":"Close",children:e(y,{name:"times"})}),e("div",{className:t.detailHeader,children:[s.thumbnail?e("img",{className:t.detailCover,src:s.thumbnail,alt:s.name,decoding:"async"}):e("div",{className:`${t.detailCover} ${t.thumbPlaceholder}`}),e("div",{className:t.detailInfo,children:[e("h2",{className:t.detailTitle,children:g?g(s.name):s.name}),e("p",{className:t.detailRj,children:s.id}),C.map(l=>l.label==="Tags"?e("p",{className:t.metaRow,children:[e("span",{className:t.metaLabel,children:"Tags"}),e("span",{className:t.tagChips,children:l.value.split(", ").map(u=>e("span",{className:t.tagChip,children:u},u))})]},l.label):e("p",{className:t.metaRow,children:[e("span",{className:t.metaLabel,children:l.label}),l.value]},l.label))]})]}),e("div",{className:t.tracksSection,children:[e("h3",{className:t.tracksHeading,children:h?"Loading tracks…":`Tracks (${f.length})`}),!h&&(f.length>0?e("ul",{className:t.trackList,children:f.map((l,u)=>e("li",{children:e("button",{className:t.trackRow,onClick:()=>S(s,f,u),children:[e(y,{name:"play",className:t.trackIcon}),e("span",{className:t.trackLabel,children:l.resolutionStr}),e("span",{className:t.trackType,children:l.hls?"HLS":"MP3"})]})},l.link))}):e("p",{className:t.noTracks,children:"No audio streams available for this work."}))]}),e("div",{className:t.detailActions,children:[!h&&f.length>0&&e("button",{className:t.playAllBtn,onClick:()=>S(s,f,0),children:[e(y,{name:"play"})," Play from start"]}),!h&&M!==null&&w&&e("button",{className:t.playAllBtn,onClick:()=>S(s,f,M),children:[e(y,{name:"history"})," Resume track ",M+1," ·"," ",me(w.currentTime),w.duration>0?` / ${me(w.duration)}`:""]}),v&&e("button",{className:t.playAllBtn,onClick:()=>k({rjCode:v,title:s.name,thumbnail:s.thumbnail||"",isAdult:!!s.isAdult}),"aria-pressed":L,children:[e(y,{name:L?"check":"plus"})," ",L?"In listening list":"Add to listening list"]})]})]})})},It=({title:s,images:o,chapters:S,tracks:g,trackIndex:i,expanded:h,isAdult:v,rjCode:A,t:k,onTrackChange:T,onExpandedChange:R,onClose:L})=>{const C=j(null),f=j(null),[w,M]=m(!1),[l,u]=m(0),[d,I]=m(0),[p,q]=m(0),[x,ae]=m(!0),[F,Y]=m(0),[_,ie]=m(new Set),[D,ne]=m(!1),[pe,$]=m(!0),re=j("");re.current||(re.current=typeof crypto<"u"&&"randomUUID"in crypto?crypto.randomUUID():`asmr-${Date.now()}-${Math.random().toString(36).slice(2)}`);const[H,Ne]=m(()=>{const a=parseFloat(localStorage.getItem("asmrVolume")||"");return Number.isFinite(a)?a:1}),ge=j(H);N(()=>{ge.current=H},[H]);const fe=Ge(),V=$e.useMemo(()=>A?Ct(A):"",[A]),Ce=St(),ce=Tt(),{data:Se}=et(V||void 0),[Be,be]=m(!1),[U,Le]=m(0),[Ie,G]=m(!1),ve=j(""),W=j(null),K=j(0),Q=j(0),de=j(0),Z=g[i],X=Z?.link,Te=Z?.hls,n=Z?.resolutionStr||"",c=o.length>0,B=`${V}:${i}`,se=$e.useMemo(()=>(Se?.progress??[]).find(r=>r.trackIndex===i)??null,[Se,i]),ee=j({workId:"",trackIndex:0,trackLabel:""});ee.current={workId:V,trackIndex:i,trackLabel:n};const le=J((a,r,b,E=!1)=>{!a.workId||!b||b<10||!E&&Math.abs(r-K.current)<5||(K.current=r,Ce.mutate({workId:a.workId,trackIndex:a.trackIndex,trackLabel:a.trackLabel,currentTime:Math.floor(r),duration:Math.floor(b),title:s,thumbnail:o[0]||"",rjCode:a.workId,isAdult:v?1:0}))},[Ce,s,o,v]),z=J((a=!1)=>{W.current&&(clearTimeout(W.current),W.current=null),le(ee.current,Q.current,de.current,a)},[le]),ye=j(z);ye.current=z;const _e=j(le);_e.current=le;const ue=J(()=>{f.current&&(f.current.destroy(),f.current=null)},[]);N(()=>{const a=C.current;if(!a||!X)return;const r={workId:V,trackIndex:i,trackLabel:n},b=()=>{W.current&&(clearTimeout(W.current),W.current=null),_e.current(r,Q.current,de.current,!0)};if(u(0),I(0),q(0),M(!1),Q.current=0,de.current=0,K.current=0,ue(),Te){let E=!1;return(async()=>{const te=await Bt();if(!E)if(te&&te.isSupported()){const we=new te({enableWorker:!0});f.current=we,we.loadSource(X),we.attachMedia(a),a.play().catch(()=>M(!1))}else a.src=X,a.load(),a.volume=ge.current,a.play().catch(()=>M(!1))})(),()=>{E=!0,ue(),a.removeAttribute("src"),b()}}else a.src=X;return a.load(),a.volume=ge.current,a.play().catch(()=>M(!1)),()=>{ue(),a.removeAttribute("src"),b()}},[X,Te,ue,V,i,n]),N(()=>()=>ue(),[ue]),N(()=>{const a=()=>{document.visibilityState==="hidden"&&ye.current()},r=()=>ye.current();return document.addEventListener("visibilitychange",a),window.addEventListener("pagehide",r),()=>{document.removeEventListener("visibilitychange",a),window.removeEventListener("pagehide",r)}},[]),N(()=>{if(!se||ve.current===B||!(d>0))return;const a=se.currentTime||0,r=se.duration||d;a>=10&&r-a>=15&&Q.current<a?(ve.current=B,Le(a),be(!0)):ve.current=B},[se,d,B]),N(()=>{const a=C.current;a&&(a.volume=H)},[H]),N(()=>{if(h)return document.body.classList.add("asmr-player-open"),()=>document.body.classList.remove("asmr-player-open")},[h]),N(()=>{Y(0)},[o]),N(()=>{h&&$(!0)},[h]),N(()=>{D&&$(!0)},[D]);const Ae=J(a=>{if(!s||g.length===0)return;const r=g[i],b=r?`${r.resolutionStr} (${i+1}/${g.length})`:"",E=C.current,te=E?E.currentTime:0,we=E&&E.duration||0,ft=o[0]||"";Ee.discord.asmrPresence.mutate({title:s,trackLabel:b,isPlaying:a,thumbnail:ft,thumbnails:o,currentTime:te,duration:we,isAdult:!!v,rjCode:A||"",sessionId:re.current}).catch(()=>{}),Ee.discord.heartbeat.mutate({sessionId:re.current}).catch(()=>{})},[s,g,i,o,v,A]);N(()=>{Ae(w)},[Ae,w,i,s,h]),N(()=>{if(!w)return;const a=window.setInterval(()=>Ae(!0),15e3);return()=>window.clearInterval(a)},[w,Ae]),N(()=>{const a=re.current,r=()=>{if(!a)return;const te=JSON.stringify({sessionId:a});navigator.sendBeacon?(navigator.sendBeacon("/api/discord/clear",new Blob([te],{type:"application/json"})),navigator.sendBeacon("/api/discord/heartbeat",new Blob([JSON.stringify({sessionId:a,bye:!0})],{type:"application/json"}))):(fetch("/api/discord/clear",{method:"POST",headers:{"Content-Type":"application/json"},body:te,keepalive:!0}).catch(()=>{}),fetch("/api/discord/heartbeat",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:a,bye:!0}),keepalive:!0}).catch(()=>{}))},b=()=>r(),E=()=>{document.visibilityState==="hidden"&&r()};return window.addEventListener("pagehide",b),window.addEventListener("beforeunload",b),document.addEventListener("visibilitychange",E),()=>{window.removeEventListener("pagehide",b),window.removeEventListener("beforeunload",b),document.removeEventListener("visibilitychange",E),r()}},[]);const Me=J(a=>{ie(r=>{if(r.has(a))return r;const b=new Set(r);return b.add(a),b})},[]),at=J((a,r)=>{a&&a.complete&&a.naturalWidth>0&&Me(r)},[Me]);N(()=>{if(!h)return;const a=r=>{if(r.key==="Escape"){D?ne(!1):R(!1);return}!x||o.length<2||(r.key==="ArrowLeft"&&Y(b=>Math.max(0,b-1)),r.key==="ArrowRight"&&Y(b=>Math.min(o.length-1,b+1)))};return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[h,x,o.length,D,R]);const nt=()=>{const a=C.current;a&&(a.paused?a.play().catch(()=>{}):a.pause())},rt=a=>{const r=C.current;if(!r||!d)return;const b=parseFloat(a.target.value);r.currentTime=b,u(b)},st=()=>{z(!0),i<g.length-1?T(i+1):G(!0)},lt=a=>{const r=a.currentTarget.currentTime;Q.current=r,u(r),W.current&&clearTimeout(W.current),W.current=setTimeout(()=>ye.current(),5e3)},ot=()=>{M(!1),ye.current()},it=a=>{const r=a.currentTarget.duration;de.current=Number.isFinite(r)?r:0,I(a.currentTarget.duration)},ct=J(()=>{const a=C.current;a&&U>0&&(a.currentTime=U,Q.current=U,a.play().catch(()=>{})),be(!1)},[U]),je=J(()=>{be(!1)},[]),dt=J(()=>{V&&ce.mutate({rjCode:V,title:s,thumbnail:o[0]||"",status:"Completed",isAdult:!!v,silent:!0}),G(!1),L(),fe("/")},[V,ce,s,o,v,L,fe]),ut=S.reduce((a,r,b)=>l>=r.time?b:a,-1),mt=a=>{const r=C.current;r&&(r.currentTime=a,u(a))},Fe=a=>{const r=C.current;if(!r)return;const b=Number.isFinite(r.currentTime)?r.currentTime:l,E=Math.max(0,Math.min(d||1/0,b+a));r.currentTime=E,u(E),$(!0)},Oe=d?Math.min(100,l/d*100):0,ht=d?Math.min(100,Math.max(Oe,p/d*100)):0,pt=e(O,{children:[e("div",{className:t.playerButtons,children:[e("button",{className:t.playerBtn,onClick:()=>T(Math.max(0,i-1)),disabled:i===0,"aria-label":"Previous track",children:e(y,{name:"step-backward"})}),e("button",{className:`${t.playerBtn} ${t.seekBtn}`,onClick:()=>Fe(-10),"aria-label":"Seek back 10 seconds",title:"Back 10s",children:[e(y,{name:"undo"}),e("span",{className:t.seekBtnLabel,children:"10"})]}),e("button",{className:`${t.playerBtn} ${t.playBtn}`,onClick:nt,"aria-label":w?"Pause":"Play",children:w?e(y,{name:"pause"}):e(y,{name:"play"})}),e("button",{className:`${t.playerBtn} ${t.seekBtn}`,onClick:()=>Fe(10),"aria-label":"Seek forward 10 seconds",title:"Forward 10s",children:[e(y,{name:"redo"}),e("span",{className:t.seekBtnLabel,children:"10"})]}),e("button",{className:t.playerBtn,onClick:()=>T(Math.min(g.length-1,i+1)),disabled:i>=g.length-1,"aria-label":"Next track",children:e(y,{name:"step-forward"})})]}),e("div",{className:t.seekRow,children:[e("span",{className:t.timeLabel,children:me(l)}),e("input",{className:t.seekBar,type:"range",min:0,max:d||0,step:.1,value:Math.min(l,d||0),onChange:rt,style:{"--played-percent":`${Oe}%`,"--buffered-percent":`${ht}%`},"aria-label":"Seek"}),e("span",{className:t.timeLabel,children:me(d)})]})]}),De=e(O,{children:[e("button",{className:`${t.playerBtn} ${t.playerToggle}`,onClick:()=>R(!h),"aria-label":h?"Minimize player":"Expand player",title:h?"Minimize to browse":"Expand",children:h?e(y,{name:"chevron-down"}):e(y,{name:"chevron-up"})}),e("div",{className:t.playerInfo,children:[e("p",{className:t.playerTitle,title:s,children:k?k(s):s}),e("p",{className:t.playerTrack,children:[Z?.resolutionStr||"",g.length>1?` (${i+1}/${g.length})`:""]})]}),e("div",{className:t.playerControls,children:pt}),e("div",{className:t.playerRight,children:[H===0?e(y,{name:"volume-mute",className:t.volumeIcon}):H<.5?e(y,{name:"volume-down",className:t.volumeIcon}):e(y,{name:"volume-up",className:t.volumeIcon}),e("input",{className:t.volumeBar,type:"range",min:0,max:1,step:.01,value:H,onChange:a=>{const r=parseFloat(a.target.value);Ne(r),localStorage.setItem("asmrVolume",String(r))},style:{"--volume-percent":`${H*100}%`},"aria-label":"Volume"})]}),e("div",{className:t.playerActions,children:[h&&c&&e("button",{className:t.playerBtn,onClick:()=>ae(a=>!a),"aria-label":x?"Hide images":"Show images",title:x?"Hide images":"Show images",children:x?e(y,{name:"eye-slash"}):e(y,{name:"image"})}),h&&S.length>0&&e("button",{className:`${t.playerBtn} ${D?t.playerBtnActive:""}`,onClick:()=>ne(a=>!a),"aria-label":D?"Hide bookmarks":"Show bookmarks",title:"Timestamps",children:e(y,{name:"list-ol"})}),e("button",{className:t.playerBtn,onClick:L,"aria-label":"Close player",children:e(y,{name:"times"})})]})]}),He=e("audio",{ref:C,preload:"metadata",onPlay:()=>M(!0),onPause:ot,onTimeUpdate:lt,onLoadedMetadata:it,onProgress:a=>{const r=a.currentTarget;r.buffered.length>0&&q(r.buffered.end(r.buffered.length-1))},onEnded:st}),Ue=e(xe,{isOpen:Be,onClose:je,title:"Resume Listening",children:e("div",{style:{padding:"1rem",textAlign:"center"},children:[e("p",{children:["You were at ",e("strong",{children:me(U)}),Z?.resolutionStr?` in ${Z.resolutionStr}`:""]}),e("div",{style:{marginTop:"1rem",display:"flex",gap:"10px",justifyContent:"center"},children:[e(he,{variant:"secondary",onClick:je,children:"Start from Beginning"}),e(he,{onClick:ct,children:"Resume"})]})]})}),qe=e(xe,{isOpen:Ie,onClose:()=>G(!1),title:"Finished!",children:e("div",{style:{padding:"1rem",textAlign:"center"},children:[e(y,{name:"check-circle",size:48,style:{color:"var(--accent-lighter)",marginBottom:"0.5rem"}}),e("p",{style:{fontSize:"1.1rem",fontWeight:600},children:k?k(s):s}),e("p",{style:{color:"var(--text-secondary)"},children:"You finished this work!"}),e("div",{style:{marginTop:"1rem",display:"flex",gap:"10px",justifyContent:"center"},children:[e(he,{variant:"secondary",onClick:()=>G(!1),children:"Close"}),e(he,{onClick:dt,children:"Mark Completed & Back to Home"})]})]})});if(!h)return Ve(e(O,{children:[He,e("div",{className:t.playerBar,children:De}),Ue,qe]}),document.body);const ke=Math.min(F,Math.max(0,o.length-1)),We=o[ke],gt=x&&c&&!!We&&!_.has(We);return Ve(e(O,{children:[He,Ue,qe,e("div",{className:`${t.npOverlay} ${pe?"":t.npOverlayControlsHidden}`,children:[e("div",{className:`${t.npStage} ${!x||!c?t.npStageBlank:""}`,onClick:()=>$(a=>!a),children:x&&c&&e(O,{children:[e("div",{className:t.sliderViewport,children:[e("div",{className:t.sliderTrack,style:{transform:`translateX(-${ke*100}%)`},children:o.map(a=>e("div",{className:t.slide,children:e("img",{ref:r=>at(r,a),src:a,alt:`${k?k(s):s} — work image`,loading:"lazy",decoding:"async",draggable:!1,onLoad:()=>Me(a),onError:()=>Me(a),className:`${t.slideImg} ${_.has(a)?t.slideImgLoaded:""}`})},a))}),gt&&e("span",{className:t.slideSpinner,"aria-label":"Loading image"})]}),o.length>1&&e(O,{children:[e("button",{className:`${t.npArrow} ${t.npArrowLeft}`,onClick:a=>{a.stopPropagation(),Y(r=>Math.max(0,r-1)),$(!0)},disabled:ke===0,"aria-label":"Previous image",children:e(y,{name:"chevron-left"})}),e("button",{className:`${t.npArrow} ${t.npArrowRight}`,onClick:a=>{a.stopPropagation(),Y(r=>Math.min(o.length-1,r+1)),$(!0)},disabled:ke===o.length-1,"aria-label":"Next image",children:e(y,{name:"chevron-right"})}),e("span",{className:t.npImageCount,onClick:a=>a.stopPropagation(),children:[ke+1," / ",o.length]})]})]})}),e("div",{className:`${t.playerBar} ${t.playerBarDocked} ${pe?"":t.playerBarDockedHidden}`,onClick:a=>a.stopPropagation(),children:[De,D&&e(O,{children:[e("div",{className:t.npBackdrop,onClick:()=>ne(!1)}),e("div",{className:t.chapterPanel,children:S.map((a,r)=>e("button",{className:`${t.chapterRow} ${r===ut?t.chapterRowActive:""}`,title:k?k(a.label):a.label,onClick:()=>{mt(a.time),ne(!1)},children:[e("span",{className:t.chapterRowTime,children:me(a.time)}),e("span",{className:t.chapterRowLabel,title:k?k(a.label):a.label,children:k?k(a.label):a.label})]},`${a.time}-${r}`))})]})]})]})]}),document.body)},Pt="https://github.com/serifpersia/dango/releases/latest/download/dango-extension.zip",Rt=s=>{try{return JSON.parse(s.detail)}catch{return null}},$t=({isOpen:s,onClose:o,onSuccess:S})=>{const[g,i]=m(1),[h,v]=m(typeof navigator<"u"?navigator.userAgent:""),[A,k]=m(""),[T,R]=m(!1),[L,C]=m(!1),f=j(null),w=typeof navigator<"u"?navigator.userAgent:"",M=/android/i.test(w),l=/firefox|fxios/i.test(w)&&!M,u=!l&&!M&&/chrome|chromium|edg|brave/i.test(w),d=l||u;N(()=>{s&&(i(1),v(typeof navigator<"u"?navigator.userAgent:""),k(""),R(!1),C(!1))},[s]),N(()=>()=>{f.current&&(window.removeEventListener("dango:jasmr-cookie",f.current),f.current=null)},[]);const I=async()=>{localStorage.setItem("jasmr_ua",h),window.open("https://japaneseasmr.com","_blank","noopener,noreferrer"),i(2)},p=()=>{if(L)return;C(!0);const x=`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`,ae=window.setTimeout(()=>{C(!1),f.current&&(window.removeEventListener("dango:jasmr-cookie",f.current),f.current=null),oe.error("Helper not detected — install it via about:debugging first.")},3e3),F=Y=>{const _=Rt(Y);if(!(!_||_.requestId!==x))if(window.clearTimeout(ae),window.removeEventListener("dango:jasmr-cookie",F),f.current=null,C(!1),_?.ok&&_.cookie)k(_.cookie),oe.success("Cookie extracted from helper!");else if(_?.error==="NO_COOKIE"){const ie=_.debug?.stores?.length??0,D=_.debug?.names??[];oe.error(`Helper found no cf_clearance (checked ${ie} stores, saw: ${D.join(", ")||"none"}) — solve the challenge on the JapaneseASMR tab first.`)}else oe.error("Helper request failed — try again.")};f.current=F,window.addEventListener("dango:jasmr-cookie",F),window.dispatchEvent(new CustomEvent("dango:get-jasmr-cookie",{detail:{requestId:x}}))},q=async()=>{if(!A.trim()){oe.error("Please enter the cf_clearance cookie");return}R(!0);try{localStorage.setItem("jasmr_cookie",A.trim()),oe.success("Cookie updated successfully!"),S?.(),o()}catch{oe.error("Failed to save cookie")}finally{R(!1)}};return e(xe,{isOpen:s,onClose:o,title:"JapaneseASMR Verification Required",children:e("div",{className:P.container,children:g===1?e(O,{children:[e("p",{children:["JapaneseASMR is protected by a Cloudflare challenge. Solve it once in your browser and paste the ",e("strong",{children:"cf_clearance"})," cookie so the app can load the site for you."]}),e("div",{className:P.field,children:[e("label",{children:"Your User-Agent (must match the browser you solve the challenge with):"}),e("textarea",{value:h,onChange:x=>v(x.target.value),rows:3,className:P.textarea})]}),e("div",{className:P.actions,children:[e("button",{className:P.secondaryButton,onClick:o,children:"Cancel"}),e("button",{className:P.button,onClick:I,children:"Start Verification (Opens JapaneseASMR)"})]})]}):e(O,{children:[e("p",{children:["1. Solve the challenge on the ",e("strong",{children:"JapaneseASMR tab"})," (keep that tab open).",e("br",{}),"2. Copy the ",e("strong",{children:"cf_clearance"})," cookie value using one of these:",e("br",{}),e("br",{}),e("strong",{children:"Chrome / Edge — DevTools:"})," press ",e("code",{children:"F12"})," →"," ",e("strong",{children:"Application"})," → ",e("strong",{children:"Cookies"})," →"," ",e("code",{children:"https://japaneseasmr.com"}),". Find ",e("strong",{children:"cf_clearance"}),", double-click its ",e("strong",{children:"Value"})," to select it, then copy.",e("br",{}),e("br",{}),e("strong",{children:"Firefox — Storage Inspector:"})," press ",e("code",{children:"F12"})," →"," ",e("strong",{children:"Storage"})," → ",e("strong",{children:"Cookies"})," →"," ",e("code",{children:"https://japaneseasmr.com"}),". Find ",e("strong",{children:"cf_clearance"}),", right-click the value → ",e("strong",{children:"Copy Value"}),".",e("br",{}),e("br",{}),e("strong",{children:"Either browser — extension:"})," open"," ",e("strong",{children:"Cookie Manager"})," while on the JapaneseASMR tab, find"," ",e("strong",{children:"cf_clearance"}),", and copy its value (or use the extension's export).",e("br",{}),e("br",{}),"3. Paste it below. Copy ",e("strong",{children:"only the value"})," — remove any"," ",e("code",{children:"cf_clearance="})," prefix or quotes if they were included."]}),d&&e("div",{className:P.hint,children:[e("strong",{children:"Dango helper (one-time setup):"})," ",l?e(O,{children:["type ",e("code",{children:"about:debugging"})," in the address bar →"," ",e("strong",{children:"This Firefox"})," → ",e("strong",{children:"Load Temporary Add-on"})," ","→ open the ",e("code",{children:"dango-extension/firefox"})," folder and pick"," ",e("code",{children:"manifest.json"}),". (Temporary helpers unload when Firefox closes — repeat after a restart.)"]}):e(O,{children:["type ",e("code",{children:"chrome://extensions"})," in the address bar → enable"," ",e("strong",{children:"Developer mode"})," → ",e("strong",{children:"Load unpacked"})," → open the ",e("code",{children:"dango-extension/chrome"})," folder. (Unpacked helpers show a developer-mode notice — expected.)"]})," ","Use this link to download the extension and extract it:"," ",e("a",{href:Pt,target:"_blank",rel:"noreferrer",className:P.link,children:"dango-extension.zip"}),". Then click Extract below and the field fills itself.",e("div",{className:P.actions,children:e("button",{className:P.button,onClick:p,disabled:L,type:"button",children:L?"Extracting…":"Extract cookie from helper"})})]}),e("div",{className:P.field,children:[e("label",{children:"cf_clearance cookie value:"}),e("input",{type:"text",value:A,onChange:x=>k(x.target.value),placeholder:"e.g. xxxxxxxx.xxxxxxxx.xxxxxxx-xxxxxxx",className:P.input})]}),e("div",{className:P.actions,children:[e("button",{className:P.secondaryButton,onClick:o,children:"Cancel"}),e("button",{className:P.secondaryButton,onClick:()=>i(1),children:"Back"}),e("button",{className:P.button,onClick:q,disabled:T,children:T?"Saving...":"Submit"})]})]})})})},tt="asmrTranslateCache",Et=10080*60*1e3;function _t(){try{const s=localStorage.getItem(tt);if(!s)return new Map;const o=JSON.parse(s);return new Map(Object.entries(o))}catch{return new Map}}function jt(s){try{const o={};for(const[S,g]of s)o[S]=g;localStorage.setItem(tt,JSON.stringify(o))}catch{}}function Ke(s){return/[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FAF]/.test(s)}async function Ft(s){const o=s.map(i=>i.trim()).filter(Boolean);if(o.length===0)return new Map;const S=await Ee.settings.translate.mutate({texts:o,source:"ja",target:"en"}),g=new Map;for(const[i,h]of Object.entries(S.translations||{}))g.set(i,h);for(const i of o)g.has(i)||g.set(i,i);return g}function Ot(s,o){const[S,g]=m(new Map),[i,h]=m(!1),v=j(null),A=s.join("");return N(()=>{const T=A?A.split(""):[];if(!o||T.length===0){g(new Map),h(!1);return}const R=Array.from(new Set(T.map(l=>l.trim()).filter(Boolean).filter(Ke)));if(R.length===0){g(new Map);return}v.current||(v.current=_t());const L=Date.now(),C=new Map,f=[];for(const l of R){const u=v.current.get(l);u&&L-u.ts<Et?C.set(l,u.t):f.push(l)}if(f.length===0){g(C);return}let w=!1;h(!0);const M=[];for(let l=0;l<f.length;l+=15)M.push(f.slice(l,l+15));return(async()=>{const l=new Map;for(const d of M){try{const I=await Ft(d);for(const[p,q]of I)l.set(p,q)}catch{}await new Promise(I=>setTimeout(I,120))}if(w)return;if(v.current){for(const[d,I]of l)v.current.set(d,{t:I,ts:Date.now()});jt(v.current)}const u=new Map([...C,...l]);g(u),h(!1)})(),()=>{w=!0}},[o,A]),{t:T=>!o||!T||!Ke(T)?T:S.get(T.trim())||T,map:S,isTranslating:i}}const Dt=[{label:"Date",options:[{value:"latest",label:"Latest"},{value:"oldest",label:"Oldest"}]},{label:"Title",options:[{value:"title_asc",label:"A → Z"},{value:"title_desc",label:"Z → A"}]},{label:"Popular (Views)",options:[{value:"popular_recent",label:"Recent"},{value:"popular_week",label:"Week"},{value:"popular_month",label:"Month"},{value:"popular_6_months",label:"6 Months"},{value:"popular_year",label:"Year"},{value:"popular",label:"All Time"}]},{label:"Most Commented",options:[{value:"comments_week",label:"Week"},{value:"comments_month",label:"Month"},{value:"comments_year",label:"Year"},{value:"comments",label:"All Time"}]},{label:"Other",options:[{value:"random",label:"Random"}]}],Ht=[{value:"",label:"All"},{value:"sfw",label:"SFW / 全年齢"},{value:"r-15",label:"R-15"},{value:"r-18",label:"NSFW / R18"},{value:"yuri",label:"Yuri / Girls love / 百合"},{value:"otokonoko",label:"Otoko no ko / 男の娘"},{value:"futanari",label:"Futanari / フタナリ"},{value:"r-18g",label:"R-18G / グロ"}],Ut=[{value:"sfw",label:"SFW / 全年齢"}],Re="agreedToViewMature",ea=()=>{const{rj:s}=bt(),o=Ge(),[S,g]=vt(),[i,h]=m(()=>localStorage.getItem(Re)==="true"),[v,A]=m(!1),[k,T]=m(()=>S.get("q")||""),[R,L]=m(()=>S.get("q")||""),[C,f]=m("latest"),[w,M]=m("sfw"),[l,u]=m(1),[d,I]=m(null),[p,q]=m(null),[x,ae]=m(!0),[F,Y]=m(()=>localStorage.getItem("asmrTranslateEN")==="true"),[_,ie]=m(!1),D=yt(),{toggle:ne,bookmarkedIds:pe}=Xe(),{popup:$,openPopup:re,scheduleClose:H,cancelClose:Ne,closePopup:ge}=Mt();N(()=>kt("jasmr",()=>ie(!0)),[]),N(()=>{localStorage.setItem("asmrTranslateEN",String(F))},[F]),N(()=>{const n=()=>h(localStorage.getItem(Re)==="true");return window.addEventListener("focus",n),window.addEventListener("storage",n),()=>{window.removeEventListener("focus",n),window.removeEventListener("storage",n)}},[]);const fe=i,V=fe?w:"sfw",Ce=fe?Ht:Ut,{data:ce,isLoading:Se,isError:Be,isFetching:be}=At(R,l,C,V),U=$e.useMemo(()=>ce?.shows??[],[ce?.shows]),Le=ce?.hasNext??!1;N(()=>{if(!s){d&&!p&&I(null);return}const n=s.toUpperCase();if(p&&(p.work.id?.toUpperCase()===n||p.work._id?.toUpperCase()===n)){d&&I(null);return}const c=U.find(B=>(B.id||B._id)?.toUpperCase()===n);c?(!d||(d.id||d._id)!==(c.id||c._id))&&I(c):(!d||(d.id||d._id)?.toUpperCase()!==n)&&I({_id:n,id:n,name:n})},[s,U,p,d]);const Ie=J(()=>{o("/asmr")},[o]);N(()=>{!s&&p&&q(null)},[s,p]);const{data:G}=Qe(p&&p.work.id||null),ve=p?[p.work.thumbnail,...G?.images||[]].filter(Boolean):[],W=[...U.map(n=>n.name),d?.name||"",p?.work.name||"",...G?.chapters?.map(n=>n.label)||[]].filter(Boolean),{t:K}=Ot(W,F);N(()=>{const n=p?p.work.name:d?d.name:s?s.toUpperCase():"",c=n?F?K(n):n:"",B=c?`${c} - dango`:"dango";document.title=B;try{window.history.replaceState(window.history.state,B,window.location.href)}catch{}},[d,p,s,F,K]);const Q=n=>{n.preventDefault(),L(k),u(1);const c=new URLSearchParams(S);k.trim()?c.set("q",k.trim()):c.delete("q"),c.delete("page"),g(c,{replace:!0})};N(()=>{const n=S.get("q")||"";T(c=>c===n?c:n),L(c=>c===n?c:n),u(1)},[S]);const de=n=>{n.target.checked&&!i&&A(!0)},Z=()=>{localStorage.setItem(Re,"true"),h(!0),A(!1),u(1)},X=()=>{A(!1)},Te=J((n,c,B)=>{I(null),ae(!0),q({work:n,tracks:c,index:B})},[]);return e("div",{className:`${t.page} ${p?t.pageWithPlayer:""}`,children:[!(p&&x)&&e(O,{children:[e("header",{className:t.header,children:[e("h1",{className:t.pageTitle,children:[e(y,{name:"headphones"})," ASMR"]}),e("form",{className:t.searchForm,onSubmit:Q,children:[e("input",{className:t.searchInput,type:"text",value:k,onChange:n=>T(n.target.value),placeholder:"Search works, circles, CV… (-word excludes)","aria-label":"Search ASMR works"}),e("button",{className:t.searchBtn,type:"submit","aria-label":"Search",children:e(y,{name:"search"})})]})]}),e("div",{className:t.filterBar,children:[e("label",{className:t.filterLabel,htmlFor:"asmr-sort",children:"Sort"}),e("select",{id:"asmr-sort",className:t.sortSelect,value:C,onChange:n=>{f(n.target.value),u(1)},children:Dt.map(n=>e("optgroup",{label:n.label,children:n.options.map(c=>e("option",{value:c.value,children:c.label},c.value))},n.label))}),e("label",{className:t.filterLabel,htmlFor:"asmr-rating",children:"Type"}),e("select",{id:"asmr-rating",className:t.sortSelect,value:w,onChange:n=>{M(n.target.value),u(1)},children:Ce.map(n=>e("option",{value:n.value,children:n.label},n.value))}),e("div",{className:t.filterTogglesGroup,children:[e("div",{className:t.translateToggleWrap,children:[e("span",{className:t.filterLabel,children:"JP"}),e(ze,{id:"asmr-translate-toggle",isChecked:F,onChange:n=>Y(n.target.checked)}),e("span",{className:t.filterLabel,children:"EN"})]}),!i&&e("div",{className:t.matureToggleWrap,children:[e("label",{className:t.matureLabel,htmlFor:"asmr-mature-toggle",children:"Mature"}),e(ze,{id:"asmr-mature-toggle",isChecked:!1,onChange:de})]})]})]}),Be?e("p",{className:t.statusMsg,children:"Failed to load works. Please try again."}):Se&&U.length===0?e("div",{className:t.grid,"aria-hidden":!0,children:Array.from({length:12}).map((n,c)=>e("div",{className:t.skeletonCard,children:[e("div",{className:`${t.skeletonThumb} ${t.shimmer}`}),e("div",{className:`${t.skeletonLine} ${t.shimmer}`,style:{width:"88%"}}),e("div",{className:`${t.skeletonLine} ${t.shimmer}`,style:{width:"55%"}})]},c))}):U.length===0?e("p",{className:t.statusMsg,children:"No works found."}):e(O,{children:[e("div",{className:`${t.grid} ${be?t.fetching:""}`,children:U.map(n=>{const c=F?{...n,name:K(n.name)}:n,B=Ze(n),se=Ye(B),ee=pe.has(se),le=`/asmr/${encodeURIComponent(B)}`;return e("div",{className:t.asmrCardWrap,children:[e(wt,{item:{id:se,title:c.name,thumbnail:n.thumbnail||"",typeBadge:B||void 0,isAdult:Pe(n)},linkTo:le,hoverIcon:"info",layout:"horizontal",showInfoButton:!0,display:{elements:{poster:{typeBadge:!0,chapterBadge:!1,adultBadge:!0},info:{title:!0,mobileBadges:!0,progress:!1,meta:!1}}},onOpenDetails:z=>re(z,{rjCode:B,title:c.name,thumbnail:n.thumbnail||"",isAdult:Pe(n),rating:n.rating,listenTarget:le}),onPopupHoverIntent:z=>z?Ne():H(),rawThumbnail:!0}),e("button",{className:`${t.bookmarkBtn} ${ee?t.bookmarked:""}`,onClick:z=>{z.preventDefault(),z.stopPropagation(),ne({rjCode:B,title:n.name,thumbnail:n.thumbnail||"",isAdult:Pe(n)})},title:ee?"Remove from listening list":"Add to listening list","aria-label":ee?"Remove from listening list":"Add to listening list","aria-pressed":ee,children:e(y,{name:ee?"check":"plus",size:12})})]},n._id||n.id)})}),e("nav",{className:t.pagination,children:[e("button",{className:t.pageBtn,disabled:l<=1,onClick:()=>u(n=>Math.max(1,n-1)),children:"Previous"}),e("span",{className:t.pageIndicator,children:["Page ",l]}),e("button",{className:t.pageBtn,disabled:!Le,onClick:()=>u(n=>n+1),children:"Next"})]})]})]}),d&&e(Lt,{work:d,onClose:Ie,onPlay:Te,t:K}),$&&e(xt,{data:$.data,anchorRect:$.rect,bookmarked:pe.has(Ye($.data.rjCode)),onToggleBookmark:()=>ne({rjCode:$.data.rjCode,title:$.data.title,thumbnail:$.data.thumbnail||"",isAdult:$.data.isAdult}),onMouseEnter:Ne,onMouseLeave:H,onRequestClose:ge}),_&&e($t,{isOpen:_,onClose:()=>ie(!1),onSuccess:()=>{D.invalidateQueries({queryKey:["asmrBrowse"]}),D.invalidateQueries({queryKey:["asmrWork"]})}}),v&&e(xe,{isOpen:v,title:"Content Warning",onClose:X,children:e("div",{style:{padding:"var(--space-4)",textAlign:"center"},children:[e("p",{children:"This section contains mature content intended for adult audiences."}),e("p",{children:["By proceeding, you confirm that you are ",e("strong",{children:"18 years of age or older"})," (or the age of majority in your jurisdiction) and wish to view this content."]}),e("p",{style:{fontSize:"var(--font-size-xs)",color:"var(--text-secondary)",marginTop:"var(--space-4)"},children:["You can reset this preference at any time in the ",e("strong",{children:"Settings"})," page."]}),e("div",{style:{marginTop:"var(--space-4)",display:"flex",gap:"var(--space-2-5)",justifyContent:"center"},children:[e(he,{variant:"secondary",onClick:X,children:"Go Back"}),e(he,{onClick:Z,children:"I'm 18+, Continue"})]})]})}),p&&e(It,{title:p.work.name,images:ve,chapters:G?.chapters||[],tracks:p.tracks,trackIndex:p.index,expanded:x,isAdult:!!p.work.isAdult,rjCode:p.work.id||p.work._id,t:K,onTrackChange:n=>q(c=>c&&{...c,index:n}),onExpandedChange:ae,onClose:()=>{q(null),ae(!0),s&&o("/asmr")}})]})};export{ea as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._controls_13898_1{display:flex;align-items:stretch;gap:1.25rem;flex-wrap:wrap;width:100%}._titleContainer_13898_9{display:flex;flex-direction:column;gap:1rem}._scheduleInfo_13898_15{display:flex;gap:1rem;font-size:.95rem;color:var(--text-tertiary);align-items:center}._status_13898_23{background:color-mix(in srgb,var(--accent) 10%,transparent);color:var(--accent-light);border:1px solid color-mix(in srgb,var(--accent) 20%,transparent);padding:.35rem .85rem;border-radius:var(--radius-full);font-weight:700;font-size:.75rem;text-transform:uppercase;letter-spacing:.05em}._nextEpisode_13898_35{background:#ffffff0d;color:var(--text-secondary);padding:.35rem .85rem;border-radius:var(--radius-full);font-size:.8rem;font-weight:600;border:1px solid var(--glass-border)}._watchlistBtn_13898_45{background:#ffffff0d;color:var(--text-primary);border:1px solid rgba(255,255,255,.1);padding:.65rem 1.25rem;border-radius:var(--radius-full);font-weight:600;cursor:pointer;transition:all var(--transition-normal);display:flex;align-items:center;gap:.6rem;font-size:.85rem;flex:0 1 auto;min-width:120px;justify-content:center;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}._watchlistBtn_13898_45:hover{background:#ffffff1f;border-color:#ffffff40;transform:translateY(-2px);box-shadow:0 4px 12px #00000040}._watchlistBtn_13898_45._inList_13898_72{background:color-mix(in srgb,var(--color-success) 12%,transparent);border-color:color-mix(in srgb,var(--color-success) 35%,transparent);color:var(--color-success)}._watchlistBtn_13898_45._inList_13898_72:hover{background:color-mix(in srgb,var(--color-success) 18%,transparent);border-color:var(--color-success)}._queueBtn_13898_83{background:color-mix(in srgb,var(--accent) 8%,transparent);border-color:color-mix(in srgb,var(--accent) 25%,transparent);color:var(--accent-light)}._queueBtn_13898_83:hover{background:color-mix(in srgb,var(--accent) 14%,transparent);border-color:color-mix(in srgb,var(--accent) 45%,transparent);color:var(--accent-lighter)}._queueActive_13898_95{background:color-mix(in srgb,var(--accent) 15%,transparent);border-color:color-mix(in srgb,var(--accent) 60%,transparent);color:var(--accent-lighter)}._modeToggleBtn_13898_101{background:#ffffff0d;color:var(--text-primary);border-color:#ffffff1a;flex:0 1 auto}._modeToggleActive_13898_108{background:color-mix(in srgb,var(--color-info) 12%,transparent);border-color:color-mix(in srgb,var(--color-info) 45%,transparent);color:#dbeafe}._modeToggleActive_13898_108:hover{background:color-mix(in srgb,var(--color-info) 18%,transparent);border-color:color-mix(in srgb,var(--color-info) 65%,transparent)}._nativeToggleBtn_13898_119{background:#ffffff0d;color:var(--text-primary);border-color:#ffffff1a;flex:0 1 auto}._nativeToggleBtn_13898_119:hover{background:#ffffff1f;border-color:#ffffff40;transform:translateY(-2px)}._nativeToggleActive_13898_132{background:color-mix(in srgb,var(--color-warning) 10%,transparent);border-color:color-mix(in srgb,var(--color-warning) 40%,transparent);color:var(--color-warning)}._nativeToggleActive_13898_132:hover{background:color-mix(in srgb,var(--color-warning) 16%,transparent);border-color:color-mix(in srgb,var(--color-warning) 60%,transparent)}._watchlistBtn_13898_45:disabled{opacity:.7;cursor:wait;transform:none}._watchlistBtn_13898_45:disabled:hover{transform:none}._markWatchedBtn_13898_153{background:color-mix(in srgb,var(--color-info) 8%,transparent);border-color:color-mix(in srgb,var(--color-info) 25%,transparent);color:#93c5fd;flex:0 1 auto;justify-content:center}._markWatchedBtn_13898_153:hover{background:color-mix(in srgb,var(--color-info) 14%,transparent);border-color:color-mix(in srgb,var(--color-info) 45%,transparent);color:#dbeafe}._markWatchedDone_13898_167{background:color-mix(in srgb,var(--color-success) 12%,transparent);border-color:color-mix(in srgb,var(--color-success) 35%,transparent);color:var(--color-success)}._markWatchedDone_13898_167:hover{background:color-mix(in srgb,var(--color-success) 18%,transparent);border-color:var(--color-success)}._completeSeriesBtn_13898_178{background:color-mix(in srgb,var(--color-success) 10%,transparent);border-color:color-mix(in srgb,var(--color-success) 30%,transparent);color:#d1fae5;flex:0 1 auto;justify-content:center}._completeSeriesBtn_13898_178:hover{background:color-mix(in srgb,var(--color-success) 16%,transparent);border-color:color-mix(in srgb,var(--color-success) 45%,transparent);color:#ecfdf5}._providerAndEpisodeRow_13898_192{display:flex;align-items:flex-start;gap:1rem;flex-wrap:wrap}._episodeActions_13898_199{display:flex;flex-wrap:wrap;gap:.75rem;margin:.5rem 0 .25rem}._desktopEpisodeActions_13898_206{flex:1 1 320px;justify-content:flex-end;align-self:flex-end;margin:0}._mobileEpisodeActions_13898_213{margin:.5rem 0 .25rem}._episodeNavBtn_13898_217{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border:1px solid var(--glass-border);border-radius:var(--radius-lg);padding:.7rem 1rem;background:#ffffff0d;color:var(--text-primary);cursor:pointer;font-size:.9rem;font-weight:700;transition:background-color var(--transition-fast),border-color var(--transition-fast),color var(--transition-fast)}._episodeNavBtn_13898_217:hover:not(:disabled){border-color:var(--text-secondary);background:#ffffff14}._episodeNavBtn_13898_217:disabled{opacity:.45;cursor:not-allowed;transform:none}._episodeNavBtn_13898_217._primary_13898_247{background:linear-gradient(135deg,var(--accent) 0%,var(--accent-dark) 100%);border-color:transparent;color:#fff}._episodeNavBtn_13898_217._primary_13898_247:hover:not(:disabled){background:linear-gradient(135deg,var(--accent-light) 0%,var(--accent) 100%)}._episodeNavBtn_13898_217._secondary_13898_257{background:#ffffff0a}._episodePickerBtn_13898_261{display:none}._queueCountdown_13898_265{position:absolute;left:50%;bottom:1.5rem;transform:translate(-50%);z-index:75;padding:.7rem 1rem;border:1px solid var(--glass-border);border-radius:var(--radius-md);background:#121216eb;color:#fff;font-weight:700;box-shadow:var(--glass-shadow)}._speedBoostBadge_13898_280{position:absolute;top:1.5rem;left:50%;transform:translate(-50%);z-index:75;display:flex;align-items:center;gap:.7rem;padding:.65rem 1rem;border:1px solid color-mix(in srgb,var(--accent) 45%,transparent);border-radius:var(--radius-md);background:#121216eb;color:#f5f3ff;font-weight:800;letter-spacing:.06em;text-transform:none;box-shadow:var(--glass-shadow);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px)}._speedBoostBadge_13898_280 span{line-height:1}._speedBoostBadge_13898_280 svg{display:block;flex-shrink:0}._videoContainer_13898_311{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#000;display:flex;justify-content:center;align-items:center;container-type:inline-size}._loadingOverlay_13898_324{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;z-index:10;background:#00000080;border-radius:inherit}._loadingDots_13898_338{display:flex;gap:10px}._dot_13898_343{width:12px;height:12px;border-radius:50%;background-color:var(--accent);animation:_bounce_13898_1 1.4s infinite ease-in-out both;box-shadow:0 0 10px var(--accent-glow)}._dot_13898_343:nth-child(1){animation-delay:-.32s}._dot_13898_343:nth-child(2){animation-delay:-.16s}@keyframes _bounce_13898_1{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}._bufferingOverlay_13898_372{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);pointer-events:none;z-index:20}._bufferingSpinner_13898_381{width:50px;height:50px;border:4px solid rgba(255,255,255,.3);border-radius:50%;border-top-color:var(--accent);animation:_spin_13898_920 1s ease-in-out infinite}@keyframes _spin_13898_920{to{transform:rotate(360deg)}}._videoIframe_13898_396{width:100%;height:100%;border:none;position:absolute;top:0;left:0;object-fit:cover;border-radius:inherit}._videoContainer_13898_311 video{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1;object-fit:contain;background-color:#000;border-radius:inherit}._videoContainer_13898_311 video._videoElementHidden_13898_419{opacity:0;pointer-events:none}._upscalerCanvas_13898_424{position:absolute;top:0;left:0;width:100%;height:100%;z-index:2;object-fit:contain;opacity:0;pointer-events:none;border-radius:inherit}._upscalerCanvas_13898_424._upscalerActive_13898_437{opacity:1}._upscalerStatusBadge_13898_441{position:absolute;top:12px;right:12px;z-index:4;background:#000000a6;color:var(--text-primary);font-size:.75rem;font-weight:600;padding:.35em .8em;border-radius:999px;border:1px solid var(--glass-border);pointer-events:none}._subtitleOverlay_13898_456{position:absolute;top:0;left:0;width:100%;height:100%;z-index:3;pointer-events:none;overflow:hidden;border-radius:inherit}._controlsOverlay_13898_468{position:absolute;inset:0;opacity:1;transition:opacity .4s cubic-bezier(.4,0,.2,1);z-index:50;pointer-events:none;display:flex;flex-direction:column;justify-content:space-between;border-radius:inherit;background:linear-gradient(to bottom,rgba(0,0,0,.35) 0%,rgba(0,0,0,.2) 15%,transparent 40%,transparent 60%,rgba(0,0,0,.2) 85%,rgba(0,0,0,.35) 100%);will-change:opacity}._controlsOverlay_13898_468>*{pointer-events:auto}._controlsOverlay_13898_468._hidden_13898_498{opacity:0;pointer-events:none;cursor:none}._centerPlayPause_13898_504{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);display:flex;align-items:center;justify-content:center;background:#0f0f11d9;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border:1px solid rgba(255,255,255,.15);border-radius:50%;color:#fff;width:90px;height:90px;font-size:2.8rem;cursor:pointer;padding-left:6px;transition:all .3s cubic-bezier(.34,1.56,.64,1);box-shadow:none;will-change:transform}._centerPlayPause_13898_504:hover{background:var(--accent);color:var(--accent-text);transform:translate(-50%,-50%) scale(1.1);border-color:var(--accent);box-shadow:0 0 40px var(--accent-glow)}._bottomControls_13898_536{position:absolute;bottom:24px;left:24px;right:24px;display:flex;flex-direction:column;gap:0;background:#0f0f11f2;backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid rgba(255,255,255,.1);border-radius:20px;padding:16px 24px;box-shadow:none}._progressBarContainer_13898_553{width:100%;padding:10px 0;cursor:pointer;position:relative;touch-action:none;display:flex;align-items:center}._progressBar_13898_553{width:100%;height:4px;background-color:#ffffff26;border-radius:4px;position:relative;transition:height .2s,background-color .2s;overflow:visible}._progressBarContainer_13898_553:hover ._progressBar_13898_553,._progressBarContainer_13898_553._scrubbing_13898_576 ._progressBar_13898_553{height:6px;background-color:#ffffff40}._watchedBar_13898_581,._bufferedBar_13898_582{position:absolute;top:0;left:0;height:100%;border-radius:4px}._watchedBar_13898_581{background:var(--accent);background:linear-gradient(90deg,var(--accent) 0%,var(--accent-light) 100%);z-index:2;box-shadow:0 0 15px var(--accent-glow);transition:width .3s linear;will-change:width}._bufferedBar_13898_582{background-color:#ffffff4d;z-index:1}._thumb_13898_604{position:absolute;top:50%;transform:translate(-50%,-50%) scale(0);width:16px;height:16px;background-color:#fff;border-radius:50%;z-index:3;transition:transform .2s cubic-bezier(.175,.885,.32,1.275),left .3s linear;box-shadow:0 0 0 4px #fff3;will-change:left}._progressBarContainer_13898_553:hover ._thumb_13898_604,._progressBarContainer_13898_553._scrubbing_13898_576 ._thumb_13898_604{transform:translate(-50%,-50%) scale(1)}._timeBubble_13898_625{position:absolute;bottom:35px;transform:translate(-50%);background:#000000e6;border:1px solid rgba(255,255,255,.1);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem;font-weight:600;opacity:0;transition:opacity .2s;pointer-events:none;white-space:nowrap;box-shadow:0 4px 12px #0000004d}._progressBarContainer_13898_553:hover ._timeBubble_13898_625{opacity:1}._skipSegment_13898_647{position:absolute;top:0;height:100%;z-index:10;opacity:.5;transition:opacity .2s;border-radius:4px}._skipSegment_13898_647:hover{opacity:.8}._skipSegment_13898_647._op_13898_661{background-color:var(--success)}._skipSegment_13898_647._ed_13898_665{background-color:var(--accent-blue)}._skipSegment_13898_647._recap_13898_669{background-color:var(--warning)}._bottomControlsRow_13898_673{display:flex;justify-content:space-between;align-items:center;width:100%;margin-top:4px}._controlBtn_13898_681{background:transparent;border:none;color:#ffffffe6;font-size:1.2rem;cursor:pointer;transition:all .2s;padding:10px;border-radius:12px;display:flex;align-items:center;justify-content:center}._controlBtn_13898_681:hover{background:#ffffff1a;color:#fff;transform:translateY(-2px)}._controlBtn_13898_681:active{transform:translateY(0)}._timeDisplay_13898_705{font-size:.9rem;font-weight:500;color:#ffffffe6;font-variant-numeric:tabular-nums;margin-left:.5rem;opacity:.9}._leftControls_13898_714,._rightControls_13898_715,._middleControls_13898_716{display:flex;align-items:center;gap:1.5rem}._skipControls_13898_722{display:flex;align-items:center;gap:.25rem}._skipBtn_13898_728{background:transparent;border:none;color:#fff;cursor:pointer;font-size:1.4rem;display:flex;align-items:center;justify-content:center;opacity:.7;transition:all .2s;padding:6px}._skipBtn_13898_728:hover{opacity:1;transform:scale(1.1);color:var(--accent)}._skipBtn_13898_728:active{transform:scale(.9)}._volumeContainer_13898_752{display:flex;align-items:center;position:relative;padding-right:10px}._volumeSlider_13898_759{width:0;opacity:0;transform:scaleX(0);transform-origin:left;transition:all .3s var(--ease-smooth);cursor:pointer;margin-left:6px;-webkit-appearance:none;appearance:none;background:transparent;height:30px}._volumeContainer_13898_752:hover ._volumeSlider_13898_759,._volumeSlider_13898_759:focus{width:80px;opacity:1;transform:scaleX(1)}._volumeSlider_13898_759::-webkit-slider-runnable-track{width:100%;height:4px;background:linear-gradient(to right,var(--accent) 0%,var(--accent) var(--volume-percent, 100%),rgba(255,255,255,.25) var(--volume-percent, 100%),rgba(255,255,255,.25) 100%);border-radius:4px;border:none}._volumeSlider_13898_759::-moz-range-track{width:100%;height:4px;background:#ffffff40;border-radius:4px;border:none}._volumeSlider_13898_759::-moz-range-progress{height:4px;background:var(--accent);border-radius:4px}._volumeSlider_13898_759::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:14px;height:14px;background-color:#fff;border:2px solid var(--accent);border-radius:50%;cursor:pointer;margin-top:-5px;box-shadow:0 0 10px #00000080;transition:transform .1s ease}._volumeSlider_13898_759::-webkit-slider-thumb:hover{transform:scale(1.2);box-shadow:0 0 15px var(--accent-glow)}._volumeSlider_13898_759::-moz-range-thumb{width:14px;height:14px;background-color:#fff;border:2px solid var(--accent);border-radius:50%;cursor:pointer;box-shadow:0 0 10px #00000080}._settingsMenu_13898_837{position:absolute;bottom:50px;right:0;background:#0f0f0ffa;border:1px solid rgba(255,255,255,.1);color:#fff;padding:1rem;border-radius:12px;width:280px;z-index:var(--z-dropdown);box-shadow:0 10px 40px #00000080;animation:_slideUp_13898_1 .2s cubic-bezier(.16,1,.3,1);transform-origin:bottom right}@keyframes _slideUp_13898_1{0%{opacity:0;transform:translateY(10px) scale(.95)}to{opacity:1;transform:translateY(0) scale(1)}}._settingsMenu_13898_837 h4{margin:0 0 1rem;font-size:.95rem;text-transform:uppercase;letter-spacing:.05em;color:#ffffff80;border-bottom:1px solid rgba(255,255,255,.1);padding-bottom:.5rem;font-weight:600}._qualityListInMenu_13898_876,._ccOptionsContainer_13898_877{display:flex;flex-direction:column;gap:.25rem;max-height:300px;overflow-y:auto}._qualityItemInMenu_13898_885,._ccItem_13898_886{background:transparent;color:#fffc;border:none;padding:.75rem 1rem;border-radius:8px;cursor:pointer;text-align:left;font-size:.95rem;transition:all .2s;display:flex;justify-content:space-between;align-items:center}._qualityItemInMenu_13898_885:hover,._ccItem_13898_886:hover{background:#ffffff1a;color:#fff}._qualityItemInMenu_13898_885._active_13898_907,._ccItem_13898_886._active_13898_907{background:var(--accent);color:var(--accent-text);font-weight:600}._sourceLoader_13898_914{padding:2rem;display:flex;justify-content:center}._spinner_13898_920{width:40px;height:40px;border:4px solid rgba(255,255,255,.1);border-left-color:var(--accent);border-radius:50%;animation:_spin_13898_920 1s linear infinite}@media(max-width:768px){._bottomControls_13898_536{padding:.75rem;bottom:8px;left:8px;right:8px;border-radius:12px}._leftControls_13898_714,._rightControls_13898_715{gap:.5rem}._controlBtn_13898_681{padding:8px;font-size:1.1rem}._timeDisplay_13898_705{font-size:.75rem;margin-left:.25rem}._centerPlayPause_13898_504{width:64px;height:64px;font-size:2rem}._titleContainer_13898_9 h1{font-size:1.25rem}._volumeSlider_13898_759{width:0}._volumeContainer_13898_752{display:flex}._skipBubble_13898_971{width:80px;height:80px}._skipIcon_13898_975{font-size:1.8rem}._skipText_13898_978{font-size:.8rem}._episodeActions_13898_199{margin-top:.25rem}._controls_13898_1{gap:.5rem}._watchBtn_13898_990,._watchlistBtn_13898_45,._queueBtn_13898_83,._markWatchedBtn_13898_153,._completeSeriesBtn_13898_178,._nativeToggleBtn_13898_119,._modeToggleBtn_13898_101{flex:1 1 calc(50% - .25rem);min-width:0;padding:.5rem .75rem;font-size:.78rem;gap:.4rem}._watchBtn_13898_990{flex-basis:100%}._episodeNavBtn_13898_217{flex:1 1 calc(50% - .25rem);min-width:0;padding:.45rem .75rem;font-size:.8rem;min-height:44px}._episodePickerBtn_13898_261{display:inline-flex;flex-basis:100%;padding:.4rem .75rem;font-size:.78rem;min-height:44px}._desktopEpisodeActions_13898_206{display:none}._mobileEpisodeActions_13898_213{display:flex}._providerAndEpisodeRow_13898_192{flex-direction:column}._errorOverlay_13898_1036{padding:1rem;gap:.5rem;overflow-y:auto}._errorOverlay_13898_1036 p{font-size:1rem}._retryButton_13898_1046{padding:.5rem 1.25rem;font-size:.9rem;margin-top:0}}@media(min-width:769px){._mobileEpisodeActions_13898_213{display:none}}@media(max-width:900px)and (orientation:landscape){._bottomControls_13898_536{bottom:8px;left:max(8px,env(safe-area-inset-left));right:max(8px,env(safe-area-inset-right));padding:.5rem 1rem}._centerPlayPause_13898_504{width:54px;height:54px;font-size:1.5rem}._skipIndicatorContainer_13898_1073._leftSkip_13898_1073{left:max(0px,env(safe-area-inset-left))}._skipIndicatorContainer_13898_1073._rightSkip_13898_1076{right:max(0px,env(safe-area-inset-right))}}._sourceSelectionContainer_13898_1081{display:flex;flex-direction:column;gap:1.5rem;background:var(--glass-bg);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--glass-border);padding:2rem;border-radius:var(--radius-xl);width:100%;box-shadow:var(--glass-shadow);animation:_slideUpIn_13898_1 .6s var(--ease-smooth)}._providerSelectContainer_13898_1096{display:flex;flex-direction:column;gap:.75rem;width:100%}._providerSelect_13898_1096,._sourceSelect_13898_1081{height:48px;padding:0 1.25rem;background:var(--bg-tertiary);border:1px solid var(--border-primary);border-radius:var(--radius-lg);color:var(--text-primary);font-size:.95rem;font-family:inherit;cursor:pointer;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%2371717a' stroke-width='2' viewBox='0 0 12 12'%3E%3Cpolyline points='3 5 6 8 9 5'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 1.25rem center;transition:all var(--transition-fast);width:100%;max-width:400px}._providerSelect_13898_1096:hover,._sourceSelect_13898_1081:hover{border-color:var(--border-secondary);background-color:var(--bg-elevated)}._providerSelect_13898_1096:focus,._sourceSelect_13898_1081:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 4px var(--accent-glow)}._providerSelect_13898_1096 option,._sourceSelect_13898_1081 option{background:var(--bg-tertiary);color:var(--text-primary)}._sourceSelectionContainer_13898_1081 h4,._providerSelectContainer_13898_1096 h4{margin:0;color:var(--text-tertiary);font-weight:700;text-transform:uppercase;font-size:.75rem;letter-spacing:.1em}._sourceButtons_13898_1152{display:flex;flex-wrap:wrap;gap:.75rem}._sourceButton_13898_1152{background:#ffffff0d;color:var(--text-secondary);border:1px solid var(--glass-border);padding:.75rem 1.5rem;border-radius:var(--radius-lg);cursor:pointer;font-size:.95rem;font-weight:600;transition:all var(--transition-normal)}._sourceButton_13898_1152:hover{background:#ffffff1a;border-color:var(--text-primary);color:var(--text-primary);transform:translateY(-2px)}._sourceButton_13898_1152._active_13898_907{background:var(--accent);border-color:var(--accent);color:var(--accent-text);box-shadow:0 8px 20px var(--accent-glow)}._detailsBox_13898_1184{background:var(--glass-bg);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--glass-border);padding:2.5rem;border-radius:var(--radius-xl);display:flex;flex-direction:column;gap:1.5rem;box-shadow:var(--glass-shadow)}._detailsToggleBtn_13898_1197{background:#ffffff0d;border:1px solid var(--glass-border);color:var(--text-secondary);padding:.75rem 1.5rem;border-radius:var(--radius-lg);cursor:pointer;font-size:.95rem;font-weight:600;transition:all var(--transition-normal);display:flex;align-items:center;gap:.75rem;margin-top:2rem;width:fit-content}._detailsToggleBtn_13898_1197:hover{background:#ffffff1a;color:var(--text-primary);border-color:var(--text-primary);transform:translateY(-2px)}._detailsGridContainer_13898_1221{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:2rem;margin-top:2.5rem;background:#ffffff05;padding:2.5rem;border-radius:var(--radius-xl);border:1px solid var(--glass-border);animation:_fadeIn_13898_1 .6s var(--ease-smooth)}._detailItem_13898_1233{display:flex;flex-direction:column;gap:.5rem}._detailItem_13898_1233 strong{color:var(--text-tertiary);font-weight:700;font-size:.7rem;text-transform:uppercase;letter-spacing:.1em}._detailItem_13898_1233 span{color:var(--text-primary);font-size:1rem;font-weight:500}._animeStatus_13898_1253{display:inline-block;background:color-mix(in srgb,var(--color-success) 10%,transparent);color:var(--color-success);padding:.25rem .75rem;border-radius:var(--radius-sm);font-size:.85rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;border:1px solid color-mix(in srgb,var(--color-success) 20%,transparent)}._genresList_13898_1266{display:flex;flex-wrap:wrap;gap:.6rem;margin-top:.25rem}._genreTag_13898_1273{background:#ffffff0d;color:var(--text-secondary);padding:.4rem 1rem;border-radius:var(--radius-full);font-size:.85rem;font-weight:600;border:1px solid var(--glass-border);transition:all var(--transition-fast)}._genreTag_13898_1273:hover{background:#ffffff1a;color:var(--text-primary);border-color:var(--text-secondary);transform:translateY(-1px)}._loadingDetails_13898_1291{color:var(--text-muted);font-style:italic;text-align:center;padding:2rem}._descriptionSection_13898_1298{margin-top:2.5rem;padding:2.5rem;background:#ffffff05;border-radius:var(--radius-xl);border:1px solid var(--glass-border)}._descriptionSection_13898_1298 h3{font-size:1.25rem;font-weight:800;margin-bottom:1.5rem;color:var(--text-primary);text-transform:uppercase;letter-spacing:.05em;display:flex;align-items:center;gap:.75rem}._descriptionSection_13898_1298 h3:before{content:"";width:4px;height:20px;background:var(--accent);border-radius:var(--radius-full);box-shadow:0 0 10px var(--accent-glow)}._description_13898_1298{line-height:1.8;color:var(--text-secondary);font-size:1.05rem;margin:0}._epJumpControls_13898_1334{margin-bottom:1rem;padding:1rem;background:#ffffff08;border-radius:var(--radius-md);display:flex;flex-direction:column;gap:.8rem;border:1px solid var(--border-primary)}._epRangeButtons_13898_1345{display:flex;flex-wrap:wrap;gap:.5rem}._metaTags_13898_1351{display:flex;flex-wrap:wrap;gap:.5rem;margin-top:1rem}._epRangeBtn_13898_1358{background:transparent;border:1px solid var(--border-primary);color:var(--text-secondary);padding:.3rem .6rem;border-radius:4px;cursor:pointer;font-size:.8rem}._epRangeBtn_13898_1358:hover{border-color:var(--accent);color:var(--accent)}._epJumpInputGroup_13898_1373{display:flex;gap:.5rem}._epJumpInputGroup_13898_1373 input{background:#0000004d;border:1px solid var(--border-primary);color:#fff;padding:.4rem .8rem;border-radius:4px;flex:1}._epJumpInputGroup_13898_1373 input:focus{outline:none;border-color:var(--accent)}._epJumpInputGroup_13898_1373 button{background:var(--accent);color:var(--accent-text);border:none;padding:.4rem 1rem;border-radius:4px;cursor:pointer}._epJumpInputGroup_13898_1373 button:hover{background:var(--accent-dark)}._videoContainer_13898_311._fullscreenActive_13898_1405{cursor:none;border-radius:0}._videoContainer_13898_311:fullscreen,._videoContainer_13898_311:-webkit-full-screen{width:100vw;height:100vh;border-radius:0}._videoContainer_13898_311:fullscreen video,._videoContainer_13898_311:fullscreen canvas,._videoContainer_13898_311:-webkit-full-screen video,._videoContainer_13898_311:-webkit-full-screen canvas{border-radius:0}._skipIndicatorContainer_13898_1073{position:absolute;top:0;width:30%;height:100%;display:flex;align-items:center;justify-content:center;pointer-events:none;z-index:60;overflow:hidden}._leftSkip_13898_1073{left:0}._rightSkip_13898_1076{right:0}._skipBubble_13898_971{background:#fff3;width:120px;height:120px;border-radius:50%;display:flex;flex-direction:column;align-items:center;justify-content:center;animation:_skipRipple_13898_1 .6s ease-out forwards}._skipIcon_13898_975{font-size:2.5rem;color:#fff;margin-bottom:.5rem}._skipText_13898_978{color:#fff;font-weight:700;font-size:1rem}@keyframes _skipRipple_13898_1{0%{transform:scale(.5);opacity:0}50%{transform:scale(1.1);opacity:1}to{transform:scale(1.3);opacity:0}}._errorOverlay_13898_1036{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;background:#000c;color:#fff;z-index:30;padding:2rem;text-align:center;gap:1rem;border-radius:inherit}._errorOverlay_13898_1036 p{margin:0;font-size:1.2rem;font-weight:500}._errorSubtext_13898_1511{color:var(--text-tertiary)!important;font-size:.9rem!important}._retryButton_13898_1046{background:var(--accent);color:var(--accent-text);border:none;padding:.6rem 2rem;border-radius:var(--radius-md);font-weight:600;cursor:pointer;transition:all .2s;margin-top:.5rem;box-shadow:0 4px 12px var(--accent-glow)}._retryButton_13898_1046:hover{background:var(--accent-light);transform:translateY(-2px)}._playerPageLayout_xfhzl_1{display:grid;grid-template-columns:320px 1fr;gap:2.5rem;padding:2rem;width:100%;max-width:1800px;margin:0 auto;align-items:start;min-height:calc(100vh - var(--header-height));background-color:transparent;animation:_fadeIn_xfhzl_1 .8s var(--ease-smooth)}._episodeSidebar_xfhzl_15{background:var(--glass-bg);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--glass-border);border-radius:var(--radius-lg);overflow:visible;display:flex;flex-direction:column;box-shadow:var(--glass-shadow);animation:_slideUpIn_xfhzl_1 .8s var(--ease-smooth)}._playerMain_xfhzl_28{min-width:0;display:flex;flex-direction:column;gap:1.25rem;animation:_slideUpIn_xfhzl_1 .8s .1s var(--ease-smooth) both}._videoPlayerWrapper_xfhzl_36{width:100%;padding-top:56.25%;background-color:#000;border-radius:0;overflow:clip;isolation:isolate;position:relative;box-shadow:0 20px 50px #00000080;border:1px solid var(--glass-border)}._playerInfoHeader_xfhzl_52{display:flex;gap:2.5rem;align-items:flex-start}._playerAnimeCard_xfhzl_58{width:140px;flex-shrink:0;border-radius:var(--radius-lg);overflow:hidden;box-shadow:var(--shadow-xl);border:1px solid var(--glass-border);transform:translateZ(0);aspect-ratio:2/3;height:auto}._playerInfoContainer_xfhzl_70{background:var(--glass-bg);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--glass-border);padding:3rem;border-radius:var(--radius-2xl);box-shadow:var(--glass-shadow);display:flex;flex-direction:column}._playerAnimeCard_xfhzl_58 img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .6s cubic-bezier(.2,.8,.2,1)}._playerAnimeCard_xfhzl_58:hover img{transform:scale(1.1)}._videoTitleSection_xfhzl_94{flex:1;display:flex;flex-direction:column;justify-content:flex-start;gap:1.5rem}._videoTitleSection_xfhzl_94 h1{margin:0;font-size:2.5rem;line-height:1.1;font-weight:800;color:var(--text-primary);letter-spacing:-.02em}._videoDescription_xfhzl_111{color:var(--text-secondary);line-height:1.7;font-size:1.05rem}@keyframes _fadeIn_xfhzl_1{0%{opacity:0}to{opacity:1}}@keyframes _slideUpIn_xfhzl_1{0%{opacity:0;transform:translateY(30px)}to{opacity:1;transform:translateY(0)}}@media(max-width:1280px){._playerPageLayout_xfhzl_1{grid-template-columns:280px 1fr;padding:1.5rem;gap:1.5rem}}@media(max-width:1024px){._playerPageLayout_xfhzl_1{display:flex;flex-direction:column;gap:2rem}._episodeSidebar_xfhzl_15{width:100%;height:auto;max-height:500px;position:static;order:2;overflow-y:auto;-webkit-overflow-scrolling:touch}._playerMain_xfhzl_28{order:1;width:100%}._playerInfoHeader_xfhzl_52{padding:0}}@media(max-width:768px){._playerPageLayout_xfhzl_1{padding:1rem;gap:1.5rem}._episodeSidebar_xfhzl_15{display:none}._playerMain_xfhzl_28{gap:1.5rem}._videoPlayerWrapper_xfhzl_36{border-radius:0}._playerInfoContainer_xfhzl_70{border-radius:var(--radius-xl);padding:1.5rem}._playerInfoHeader_xfhzl_52{flex-direction:row;align-items:flex-start;text-align:left;gap:1.5rem}._videoTitleSection_xfhzl_94 h1{font-size:1.75rem}._playerAnimeCard_xfhzl_58{width:100px}._episodeSidebar_xfhzl_15{border-radius:var(--radius-lg)}}@media(max-width:480px){._playerInfoHeader_xfhzl_52{flex-direction:column;align-items:center;text-align:center}._playerAnimeCard_xfhzl_58{width:120px}}@media(max-width:480px)and (orientation:portrait){._videoPlayerWrapper_xfhzl_36{padding-top:100%;position:relative}}@media(min-width:481px)and (max-width:768px)and (orientation:portrait){._videoPlayerWrapper_xfhzl_36{padding-top:75%;position:relative}}@media(max-width:900px)and (orientation:landscape){._playerPageLayout_xfhzl_1{padding:0;gap:0}._videoPlayerWrapper_xfhzl_36{border-radius:0;height:100vh;padding-top:0}._playerInfoContainer_xfhzl_70{padding:1.5rem}}body.low-end ._playerPageLayout_xfhzl_1,body.low-end ._episodeSidebar_xfhzl_15,body.low-end ._playerInfoContainer_xfhzl_70{animation:none!important;backdrop-filter:none!important;-webkit-backdrop-filter:none!important;box-shadow:none!important;background:var(--bg-secondary)!important}body.low-end ._videoPlayerWrapper_xfhzl_36{box-shadow:none!important;border-color:var(--border-primary)!important}body.low-end ._episodeSidebar_xfhzl_15{background:var(--bg-secondary)!important}._theaterMode_xfhzl_276{display:flex!important;justify-content:center!important;align-items:center!important;position:fixed!important;top:0!important;left:0!important;width:100vw!important;height:100vh!important;min-height:100vh!important;max-width:none!important;padding:2.5rem!important;margin:0!important;background-color:var(--bg-main)!important;backdrop-filter:blur(24px)!important;-webkit-backdrop-filter:blur(24px)!important;animation:_fadeIn_xfhzl_1 .4s var(--ease-smooth)!important;overflow:hidden!important;z-index:var(--z-overlay)!important}._theaterMode_xfhzl_276 ._playerMain_xfhzl_28{width:90%!important;max-width:1200px!important;height:auto!important;aspect-ratio:16/9!important;gap:0!important;margin:auto!important;padding:0!important;animation:_scaleUpIn_xfhzl_1 .4s cubic-bezier(.25,1,.5,1)!important}._theaterMode_xfhzl_276 ._videoPlayerWrapper_xfhzl_36{width:100%!important;height:100%!important;padding-top:0!important;border-radius:0!important;border-color:#ffffff26!important;box-shadow:0 20px 60px color-mix(in srgb,var(--accent) 15%,transparent),0 0 100px #000000e6!important;overflow:hidden!important;position:relative!important}@keyframes _scaleUpIn_xfhzl_1{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}body.theater-mode header,body.theater-mode footer{display:none!important}body.theater-mode main{padding:0!important;max-width:none!important;margin:0!important;width:100vw!important;height:100vh!important}body.theater-mode{overflow:hidden!important;background:#000!important}@media(max-width:768px){._theaterMode_xfhzl_276{padding:1rem!important}._theaterMode_xfhzl_276 ._playerMain_xfhzl_28{width:100%!important;max-width:none!important}}._shell_41rxp_1{position:relative;width:100%;aspect-ratio:16 / 9;background:#000;overflow:clip;isolation:isolate;border-radius:0;container-type:inline-size;touch-action:manipulation;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}@media(max-width:480px)and (orientation:portrait){._shell_41rxp_1{aspect-ratio:1 / 1}}@media(min-width:481px)and (max-width:768px)and (orientation:portrait){._shell_41rxp_1{aspect-ratio:4 / 3}}._shell_41rxp_1:fullscreen,._shell_41rxp_1:-webkit-full-screen{width:100vw;height:100vh;aspect-ratio:auto;border-radius:0}._shell_41rxp_1:fullscreen,._shell_41rxp_1:fullscreen ._stage_41rxp_37,._shell_41rxp_1:fullscreen ._stage_41rxp_37>video,._shell_41rxp_1:fullscreen ._stage_41rxp_37>canvas,._shell_41rxp_1:fullscreen ._stage_41rxp_37>iframe,._shell_41rxp_1:-webkit-full-screen,._shell_41rxp_1:-webkit-full-screen ._stage_41rxp_37,._shell_41rxp_1:-webkit-full-screen ._stage_41rxp_37>video,._shell_41rxp_1:-webkit-full-screen ._stage_41rxp_37>canvas,._shell_41rxp_1:-webkit-full-screen ._stage_41rxp_37>iframe{border-radius:0!important}@media(max-width:900px)and (orientation:landscape){._shell_41rxp_1{aspect-ratio:auto;height:100vh;border-radius:0}}._stage_41rxp_37{position:absolute;inset:0;z-index:1;touch-action:manipulation;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}._stage_41rxp_37>video,._stage_41rxp_37>canvas,._stage_41rxp_37>iframe{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:contain;display:block;background:#000;border:none;border-radius:inherit;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}._shellFill_41rxp_85{position:absolute;inset:0;width:100%;height:100%;aspect-ratio:auto}._shellFullscreen_41rxp_93,._shellFullscreen_41rxp_93 ._stage_41rxp_37,._shellFullscreen_41rxp_93 ._stage_41rxp_37>video,._shellFullscreen_41rxp_93 ._stage_41rxp_37>canvas,._shellFullscreen_41rxp_93 ._stage_41rxp_37>iframe{border-radius:0!important}._shellFullscreen_41rxp_93{width:100vw;height:100vh;aspect-ratio:auto}._uiLayer_41rxp_107{position:absolute;inset:0;z-index:50;pointer-events:none}._uiLayer_41rxp_107>*{pointer-events:auto}._volumeWrap_41rxp_118{display:flex;align-items:center;position:relative}._volumeSlider_41rxp_124{width:0;opacity:0;transform:scaleX(0);transform-origin:left center;transition:width .25s ease,opacity .25s ease,transform .25s ease;cursor:pointer;margin-left:8px;-webkit-appearance:none;appearance:none;background:transparent;height:24px;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}._volumeWrap_41rxp_118[data-expanded=true] ._volumeSlider_41rxp_124{width:84px;opacity:1;transform:scaleX(1)}@media(hover:hover)and (pointer:fine){._volumeWrap_41rxp_118:hover ._volumeSlider_41rxp_124,._volumeSlider_41rxp_124:focus-visible{width:84px;opacity:1;transform:scaleX(1)}}._volumeSlider_41rxp_124::-webkit-slider-runnable-track{width:100%;height:4px;background:linear-gradient(to right,var(--accent) 0%,var(--accent) var(--volume-percent, 0%),rgba(255,255,255,.2) var(--volume-percent, 0%),rgba(255,255,255,.2) 100%);border-radius:4px}._volumeSlider_41rxp_124::-moz-range-track{width:100%;height:4px;background:#fff3;border-radius:4px}._volumeSlider_41rxp_124::-moz-range-progress{height:4px;background:var(--accent);border-radius:4px}._volumeSlider_41rxp_124::-webkit-slider-thumb{-webkit-appearance:none;height:12px;width:12px;border-radius:50%;background:#fff;margin-top:-4px;box-shadow:0 0 5px #00000080}@media(pointer:coarse){._volumeWrap_41rxp_118[data-expanded=true] ._volumeSlider_41rxp_124{width:96px;height:32px}}._centerControls_61n7k_1{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%) scale(1);display:flex;align-items:center;gap:3rem;gap:clamp(1rem,5cqw,3rem);z-index:10;pointer-events:auto;transition:transform .4s cubic-bezier(.2,.8,.2,1)}._centerSkipBtn_61n7k_15{background:transparent;border:none;border-radius:50%;color:#ffffffe6;width:56px;height:56px;width:clamp(2.5rem,6.5cqw,3.5rem);height:clamp(2.5rem,6.5cqw,3.5rem);font-size:1.8rem;font-size:clamp(1.1rem,2.8cqw,1.8rem);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .35s cubic-bezier(.34,1.56,.64,1);filter:drop-shadow(0 2px 8px rgba(0,0,0,.85))}._centerSkipBtn_61n7k_15:hover{color:#fff;transform:scale(1.15);filter:drop-shadow(0 2px 8px rgba(0,0,0,.85)) drop-shadow(0 0 14px var(--accent-glow))}._centerPlayPause_61n7k_40{display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:50%;color:#fff;width:76px;height:76px;width:clamp(3rem,8cqw,5rem);height:clamp(3rem,8cqw,5rem);font-size:2.2rem;font-size:clamp(1.4rem,3.4cqw,2.3rem);cursor:pointer;transition:all .35s cubic-bezier(.34,1.56,.64,1);filter:drop-shadow(0 2px 8px rgba(0,0,0,.85))}@media(pointer:coarse){._centerSkipBtn_61n7k_15{width:clamp(2.75rem,7cqw,3.75rem);height:clamp(2.75rem,7cqw,3.75rem)}}._centerPlayPause_61n7k_40:hover{transform:scale(1.08);filter:drop-shadow(0 2px 8px rgba(0,0,0,.85)) drop-shadow(0 0 16px var(--accent-glow))}._playIconOffset_61n7k_71{transform:translate(3px)}._statusArea_1xccu_1{display:flex;flex-direction:column;align-items:flex-start;gap:.6rem;background:var(--bg-secondary);border:1px solid var(--border-primary);padding:.75rem 1.25rem;border-radius:var(--radius-lg);margin-top:.5rem;margin-bottom:0;color:var(--text-secondary);box-shadow:var(--shadow-lg);width:fit-content;max-width:100%;-webkit-user-select:none;user-select:none;flex-wrap:wrap}._toggleBtn_1xccu_20{display:inline-flex;align-items:center;gap:.5rem;background:transparent;border:none;color:var(--text-secondary);font-size:.8rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;cursor:pointer;padding:.15rem .25rem;border-radius:var(--radius-sm);transition:color var(--transition-fast);pointer-events:auto}._toggleBtn_1xccu_20:hover{color:var(--text-primary)}._toggleBtn_1xccu_20 svg{color:var(--accent)}._shortcuts_1xccu_46{display:flex;gap:1.5rem;align-items:center;flex-wrap:wrap;padding-top:.6rem;border-top:1px solid var(--border-primary);width:100%}._shortcutGroup_1xccu_56{display:flex;gap:1rem;align-items:center;flex-wrap:nowrap}._shortcut_1xccu_46{display:flex;align-items:center;gap:.3rem;white-space:nowrap}._key_1xccu_70{background:#ffffff14;padding:.15rem .4rem;border-radius:5px;border:1px solid rgba(255,255,255,.1);font-weight:800;color:var(--text-primary);font-size:.75rem;min-width:1.4rem;height:1.4rem;display:flex;align-items:center;justify-content:center;font-family:var(--font-mono);box-shadow:0 1.5px #0000004d}._key_1xccu_70+._key_1xccu_70{margin-left:-.15rem}._label_1xccu_91{color:var(--text-tertiary);font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.03em}@media(max-width:768px){._statusArea_1xccu_1{display:none}}._episodeListContainer_9tyin_1{display:flex;flex-direction:column;height:100%;min-height:0;background:transparent}._drawerContainer_9tyin_9{height:auto;min-height:100%}._episodeListHeader_9tyin_14{background:transparent;padding:var(--space-6);border-bottom:1px solid var(--glass-border)}._drawerHeader_9tyin_20{position:sticky;top:0;z-index:5;background:#0c0c0ffa;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px)}._episodeListTitle_9tyin_29{margin:0 0 var(--space-5) 0;font-size:.85rem;font-weight:800;color:var(--text-tertiary);display:flex;align-items:center;gap:var(--space-3);letter-spacing:.1em;text-transform:uppercase}._rangeSelector_9tyin_41{display:flex;flex-wrap:wrap;gap:var(--space-2)}._rangeButton_9tyin_47{background:#ffffff0d;border:1px solid var(--glass-border);color:var(--text-secondary);padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);font-size:.8rem;font-weight:600;transition:all var(--transition-fast);cursor:pointer}._rangeButton_9tyin_47:hover{border-color:var(--text-secondary);color:var(--text-primary);background:#ffffff1a}._rangeButton_9tyin_47:focus-visible{outline:none;box-shadow:var(--shadow-focus)}._rangeButton_9tyin_47._active_9tyin_70{background:var(--accent);color:var(--accent-text);border-color:var(--accent)}._episodeList_9tyin_1{flex:1;display:flex;flex-direction:column;padding:var(--space-4);overflow-y:auto;-webkit-overflow-scrolling:touch;min-height:0;touch-action:pan-y;scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.14) transparent}._drawerList_9tyin_89{overflow:visible;-webkit-overflow-scrolling:auto;touch-action:pan-y}._episodeList_9tyin_1::-webkit-scrollbar{width:6px}._episodeList_9tyin_1::-webkit-scrollbar-track{background:transparent}._episodeList_9tyin_1::-webkit-scrollbar-thumb{background:#ffffff24;background-clip:padding-box;border-radius:var(--radius-full);border:2px solid transparent}._episodeList_9tyin_1:hover::-webkit-scrollbar-thumb{background-color:#ffffff47}._episodeList_9tyin_1::-webkit-scrollbar-thumb:hover{background-color:var(--accent)}._episodeItem_9tyin_118{padding:var(--space-4) var(--space-5);margin-bottom:var(--space-2);border-radius:var(--radius-lg);cursor:pointer;transition:all var(--transition-normal);color:var(--text-secondary);font-weight:600;display:flex;justify-content:space-between;align-items:center;font-size:.9rem;border:1px solid transparent}._episodeItem_9tyin_118:hover{background:#ffffff0d;color:var(--text-primary);transform:translate(6px);border-color:var(--glass-border)}._episodeItem_9tyin_118:focus-visible{outline:none;box-shadow:var(--shadow-focus)}._episodeItem_9tyin_118._watched_9tyin_145{color:var(--text-muted);opacity:.6}._episodeItem_9tyin_118._active_9tyin_70{background:color-mix(in srgb,var(--accent) 10%,transparent);color:var(--accent-light);border:1px solid color-mix(in srgb,var(--accent) 30%,transparent)}._episodeItem_9tyin_118._active_9tyin_70:hover{transform:none;background:color-mix(in srgb,var(--accent) 15%,transparent)}._episodeItem_9tyin_118 span{display:flex;align-items:center;gap:var(--space-3)}._episodeThumb_9tyin_167{width:72px;aspect-ratio:16 / 9;object-fit:cover;border-radius:var(--radius-md);flex-shrink:0;background:#ffffff0f}._episodeText_9tyin_176{flex-direction:column!important;align-items:flex-start!important;gap:2px!important;min-width:0;flex:1}._episodeLabel_9tyin_184{font-weight:700;color:inherit}._episodeSub_9tyin_189{font-size:.78rem;font-weight:500;color:var(--text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}._shell_cys6s_1{position:fixed;inset:0;z-index:var(--z-drawer);display:flex;align-items:flex-end;justify-content:center}._overlay_cys6s_10{position:absolute;inset:0;border:0;padding:0;background:#0000008f;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);animation:_fadeIn_cys6s_1 .2s ease-out}._drawer_cys6s_21{position:relative;z-index:1;width:min(100vw,100%);max-height:86vh;background:#0c0c0ffa;border-radius:var(--radius-lg) var(--radius-lg) 0 0;border:1px solid var(--glass-border);border-bottom:none;display:flex;flex-direction:column;overflow:hidden;animation:_slideUpIn_cys6s_1 .25s ease-out}@keyframes _fadeIn_cys6s_1{0%{opacity:0}to{opacity:1}}@keyframes _slideUpIn_cys6s_1{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}._handle_cys6s_56{width:52px;height:5px;border-radius:999px;background:#ffffff2e;margin:.7rem auto 0}._header_cys6s_64{display:flex;justify-content:space-between;align-items:flex-start;gap:1rem;padding:1rem 1rem .9rem;border-bottom:1px solid var(--glass-border)}._headerCopy_cys6s_73{display:flex;flex-direction:column;gap:.25rem}._kicker_cys6s_79{color:var(--text-tertiary);font-size:.72rem;font-weight:700;text-transform:uppercase;letter-spacing:.14em}._title_cys6s_87{margin:0;font-size:1.1rem;font-weight:800;color:var(--text-primary)}._closeBtn_cys6s_94{width:38px;height:38px;border-radius:999px;border:1px solid var(--glass-border);background:#ffffff0d;color:var(--text-primary);display:inline-flex;align-items:center;justify-content:center;cursor:pointer}._closeBtn_cys6s_94:hover{background:#ffffff1a}._closeBtn_cys6s_94:focus-visible{outline:none;box-shadow:var(--shadow-focus)}._body_cys6s_116{flex:1;min-height:0;overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;touch-action:pan-y}._row_1fq55_1{display:flex;flex-direction:column;gap:.3rem;padding:.5rem .75rem .6rem;min-width:0}._rowHeader_1fq55_9{display:flex;align-items:baseline;justify-content:space-between;gap:.75rem;min-width:0}._rowLabel_1fq55_17{font-size:.68rem;font-weight:700;color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.05em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._rowValue_1fq55_28{font-size:.72rem;font-weight:600;color:var(--text-secondary);font-variant-numeric:tabular-nums;white-space:nowrap}._slider_1fq55_36{width:100%;min-width:8rem;cursor:pointer;-webkit-appearance:none;appearance:none;background:transparent;height:1.375rem;margin:0;touch-action:pan-y}._slider_1fq55_36::-webkit-slider-runnable-track{width:100%;height:4px;background:linear-gradient(to right,var(--accent) 0%,var(--accent) var(--slider-percent, 0%),rgba(255,255,255,.25) var(--slider-percent, 0%),rgba(255,255,255,.25) 100%);border-radius:4px;border:none}._slider_1fq55_36::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:12px;height:12px;background-color:#fff;border:2px solid var(--accent);border-radius:50%;cursor:pointer;margin-top:-4px;box-shadow:0 0 8px #00000080}._slider_1fq55_36::-moz-range-track{width:100%;height:4px;background:#ffffff40;border-radius:4px;border:none}._slider_1fq55_36::-moz-range-progress{height:4px;background:var(--accent);border-radius:4px}._slider_1fq55_36::-moz-range-thumb{width:10px;height:10px;background-color:#fff;border:2px solid var(--accent);border-radius:50%;cursor:pointer;box-shadow:0 0 8px #00000080}._swatches_1fq55_99{display:flex;gap:.375rem;align-items:center}._swatch_1fq55_99{width:1.25rem;height:1.25rem;padding:0;border-radius:50%;cursor:pointer;flex:0 0 auto}._swatchPicked_1fq55_114{box-shadow:0 0 0 2px var(--panel-bg, #141416),0 0 0 3.5px var(--accent)}._colorInput_1fq55_120{width:1.75rem;height:1.25rem;padding:0;border:none;border-radius:.3rem;background:transparent;cursor:pointer;flex:0 0 auto}._segmented_1fq55_131{display:flex;gap:.25rem;background:#ffffff0d;border:1px solid var(--glass-border);border-radius:var(--radius-sm);padding:.2rem}._segmented_1fq55_131 button{flex:1 1 0;min-width:0;background:transparent;border:none;border-radius:calc(var(--radius-sm) - 2px);color:var(--text-secondary);font-size:.72rem;font-weight:700;text-transform:capitalize;padding:.3rem .25rem;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:.3rem;white-space:nowrap}._segmented_1fq55_131 button:hover{color:var(--text-primary)}._segmented_1fq55_131 button[aria-pressed=true]{background:color-mix(in srgb,var(--accent) 25%,transparent);color:var(--accent-light)}@media(pointer:coarse){._row_1fq55_1{gap:.4rem;padding:.6rem .85rem .7rem}._slider_1fq55_36{height:1.875rem}._slider_1fq55_36::-webkit-slider-thumb{width:16px;height:16px;margin-top:-6px}._slider_1fq55_36::-moz-range-thumb{width:14px;height:14px}._swatch_1fq55_99{width:1.5rem;height:1.5rem}._segmented_1fq55_131 button{padding:.5rem .25rem;min-height:2.5rem}}
|