@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
package/server/dist/server.js
CHANGED
|
@@ -10,9 +10,8 @@ import { serveStatic } from '@hono/node-server/serve-static';
|
|
|
10
10
|
import { getConnInfo } from '@hono/node-server/conninfo';
|
|
11
11
|
import logger from './logger.js';
|
|
12
12
|
import { notifyServerExit } from './lib/ipc.js';
|
|
13
|
-
import { githubSyncService } from './github-sync.js';
|
|
14
13
|
import { CONFIG } from './config.js';
|
|
15
|
-
import { initializeDatabase, initializeMangaDatabase, initializeTvDatabase, initializeAsmrDatabase,
|
|
14
|
+
import { initializeDatabase, initializeMangaDatabase, initializeTvDatabase, initializeAsmrDatabase, runFullSyncSequence, syncUp, waitForSync, KIND_SYNC, } from './sync.js';
|
|
16
15
|
import { loadRemoteProviders } from './providers/remote-loader.js';
|
|
17
16
|
import { discordRPCService } from './discord-rpc.js';
|
|
18
17
|
import { discordGatewayService } from './discord-gateway.js';
|
|
@@ -102,77 +101,8 @@ let asmrDb;
|
|
|
102
101
|
let isShuttingDown = false;
|
|
103
102
|
let bootSyncing = true;
|
|
104
103
|
async function runSyncSequence(database, mangaDatabase, preferredProvider) {
|
|
105
|
-
const dbName = CONFIG.IS_DEV ? CONFIG.DB_NAME_DEV : CONFIG.DB_NAME_PROD;
|
|
106
|
-
const dbPath = path.join(CONFIG.ROOT, dbName);
|
|
107
104
|
const remoteFolder = CONFIG.IS_DEV ? CONFIG.REMOTE_FOLDER_DEV : CONFIG.REMOTE_FOLDER_PROD;
|
|
108
|
-
await
|
|
109
|
-
if (getActiveProvider() === 'github' && githubSyncService.isAuthenticated()) {
|
|
110
|
-
try {
|
|
111
|
-
await githubSyncService.migrateFromAniWebSync();
|
|
112
|
-
}
|
|
113
|
-
catch (err) {
|
|
114
|
-
logger.error({ err }, 'GitHub sync migration from ani-web failed');
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
const didDownload = await syncDownOnBoot(database, dbPath, remoteFolder, () => {
|
|
118
|
-
return new Promise((resolve) => {
|
|
119
|
-
if (database && !database.isClosedCheck()) {
|
|
120
|
-
database.checkpoint();
|
|
121
|
-
database.close(() => resolve());
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
resolve();
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
let currentDb = database;
|
|
129
|
-
if (didDownload) {
|
|
130
|
-
db = await initializeDatabase(dbPath);
|
|
131
|
-
currentDb = db;
|
|
132
|
-
logger.info('Database re-initialized after sync.');
|
|
133
|
-
}
|
|
134
|
-
try {
|
|
135
|
-
await syncUp(currentDb, dbPath, remoteFolder);
|
|
136
|
-
}
|
|
137
|
-
catch (err) {
|
|
138
|
-
logger.error({ err }, 'Sync up on boot failed');
|
|
139
|
-
}
|
|
140
|
-
try {
|
|
141
|
-
await mangaSyncDownOnBoot(mangaDatabase, remoteFolder);
|
|
142
|
-
}
|
|
143
|
-
catch (err) {
|
|
144
|
-
logger.error({ err }, 'Manga sync down on boot failed');
|
|
145
|
-
}
|
|
146
|
-
try {
|
|
147
|
-
await mangaSyncUp(mangaDatabase, remoteFolder);
|
|
148
|
-
}
|
|
149
|
-
catch (err) {
|
|
150
|
-
logger.error({ err }, 'Manga sync up on boot failed');
|
|
151
|
-
}
|
|
152
|
-
try {
|
|
153
|
-
await tvSyncDownOnBoot(tvDb, remoteFolder);
|
|
154
|
-
}
|
|
155
|
-
catch (err) {
|
|
156
|
-
logger.error({ err }, 'TV sync down on boot failed');
|
|
157
|
-
}
|
|
158
|
-
try {
|
|
159
|
-
await tvSyncUp(tvDb, remoteFolder);
|
|
160
|
-
}
|
|
161
|
-
catch (err) {
|
|
162
|
-
logger.error({ err }, 'TV sync up on boot failed');
|
|
163
|
-
}
|
|
164
|
-
try {
|
|
165
|
-
await asmrSyncDownOnBoot(asmrDb, remoteFolder);
|
|
166
|
-
}
|
|
167
|
-
catch (err) {
|
|
168
|
-
logger.error({ err }, 'ASMR sync down on boot failed');
|
|
169
|
-
}
|
|
170
|
-
try {
|
|
171
|
-
await asmrSyncUp(asmrDb, remoteFolder);
|
|
172
|
-
}
|
|
173
|
-
catch (err) {
|
|
174
|
-
logger.error({ err }, 'ASMR sync up on boot failed');
|
|
175
|
-
}
|
|
105
|
+
await runFullSyncSequence({ db: database, mangaDb: mangaDatabase, tvDb, asmrDb }, { remoteFolder, preferredProvider });
|
|
176
106
|
}
|
|
177
107
|
startWatchlistDiscovery(() => db);
|
|
178
108
|
if (!CONFIG.IS_DEV) {
|
|
@@ -228,42 +158,28 @@ async function main() {
|
|
|
228
158
|
refreshRemoteProviders().catch((err) => logger.error({ err }, 'periodic providers refresh failed'));
|
|
229
159
|
}, CONFIG.PROVIDER_REPO_REFRESH_MS).unref();
|
|
230
160
|
}
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
}
|
|
237
|
-
if (!fs.existsSync(CONFIG.TV_LOCAL_MANIFEST_PATH)) {
|
|
238
|
-
fs.writeFileSync(CONFIG.TV_LOCAL_MANIFEST_PATH, JSON.stringify({ version: 0 }));
|
|
239
|
-
}
|
|
240
|
-
if (!fs.existsSync(CONFIG.ASMR_LOCAL_MANIFEST_PATH)) {
|
|
241
|
-
fs.writeFileSync(CONFIG.ASMR_LOCAL_MANIFEST_PATH, JSON.stringify({ version: 0 }));
|
|
242
|
-
}
|
|
243
|
-
let hasUnsyncedChanges = false;
|
|
244
|
-
let hasMangaUnsyncedChanges = false;
|
|
245
|
-
let hasTvUnsyncedChanges = false;
|
|
246
|
-
let hasAsmrUnsyncedChanges = false;
|
|
247
|
-
const watcher = fs.watch(CONFIG.LOCAL_MANIFEST_PATH, (eventType) => {
|
|
248
|
-
if (eventType === 'change' || eventType === 'rename') {
|
|
249
|
-
hasUnsyncedChanges = true;
|
|
250
|
-
}
|
|
161
|
+
const kindDbs = () => ({
|
|
162
|
+
anime: db,
|
|
163
|
+
manga: mangaDb,
|
|
164
|
+
tv: tvDb,
|
|
165
|
+
asmr: asmrDb,
|
|
251
166
|
});
|
|
252
|
-
const
|
|
253
|
-
if (
|
|
254
|
-
|
|
167
|
+
for (const kind of Object.keys(KIND_SYNC)) {
|
|
168
|
+
if (!fs.existsSync(KIND_SYNC[kind].manifestPath)) {
|
|
169
|
+
fs.writeFileSync(KIND_SYNC[kind].manifestPath, JSON.stringify({ version: 0 }));
|
|
255
170
|
}
|
|
256
|
-
}
|
|
257
|
-
const
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
171
|
+
}
|
|
172
|
+
const unsynced = {
|
|
173
|
+
anime: false,
|
|
174
|
+
manga: false,
|
|
175
|
+
tv: false,
|
|
176
|
+
asmr: false,
|
|
177
|
+
};
|
|
178
|
+
const watchers = Object.keys(KIND_SYNC).map((kind) => fs.watch(KIND_SYNC[kind].manifestPath, (eventType) => {
|
|
263
179
|
if (eventType === 'change' || eventType === 'rename') {
|
|
264
|
-
|
|
180
|
+
unsynced[kind] = true;
|
|
265
181
|
}
|
|
266
|
-
});
|
|
182
|
+
}));
|
|
267
183
|
const server = serve({ fetch: app.fetch, port: CONFIG.PORT }, () => {
|
|
268
184
|
logger.info(`Server running on http://localhost:${CONFIG.PORT}`);
|
|
269
185
|
});
|
|
@@ -273,49 +189,24 @@ async function main() {
|
|
|
273
189
|
bootSyncing = false;
|
|
274
190
|
});
|
|
275
191
|
refreshRemoteProviders().catch((err) => logger.error({ err }, 'background providers refresh failed'));
|
|
192
|
+
const kindDbLabel = {
|
|
193
|
+
anime: 'database',
|
|
194
|
+
manga: 'manga database',
|
|
195
|
+
tv: 'TV database',
|
|
196
|
+
asmr: 'ASMR database',
|
|
197
|
+
};
|
|
276
198
|
const syncInterval = setInterval(async () => {
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
}
|
|
283
|
-
catch (err) {
|
|
284
|
-
logger.error({ err }, 'Failed to upload database changes');
|
|
285
|
-
hasUnsyncedChanges = true;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
if (hasMangaUnsyncedChanges) {
|
|
289
|
-
logger.info('Uploading accumulated manga database changes...');
|
|
290
|
-
hasMangaUnsyncedChanges = false;
|
|
291
|
-
try {
|
|
292
|
-
await mangaSyncUp(mangaDb, remoteFolder);
|
|
293
|
-
}
|
|
294
|
-
catch (err) {
|
|
295
|
-
logger.error({ err }, 'Failed to upload manga database changes');
|
|
296
|
-
hasMangaUnsyncedChanges = true;
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
if (hasTvUnsyncedChanges) {
|
|
300
|
-
logger.info('Uploading accumulated TV database changes...');
|
|
301
|
-
hasTvUnsyncedChanges = false;
|
|
199
|
+
for (const kind of Object.keys(KIND_SYNC)) {
|
|
200
|
+
if (!unsynced[kind])
|
|
201
|
+
continue;
|
|
202
|
+
logger.info(`Uploading accumulated ${kindDbLabel[kind]} changes...`);
|
|
203
|
+
unsynced[kind] = false;
|
|
302
204
|
try {
|
|
303
|
-
await
|
|
205
|
+
await syncUp(kindDbs()[kind], kind, remoteFolder);
|
|
304
206
|
}
|
|
305
207
|
catch (err) {
|
|
306
|
-
logger.error({ err },
|
|
307
|
-
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
if (hasAsmrUnsyncedChanges) {
|
|
311
|
-
logger.info('Uploading accumulated ASMR database changes...');
|
|
312
|
-
hasAsmrUnsyncedChanges = false;
|
|
313
|
-
try {
|
|
314
|
-
await asmrSyncUp(asmrDb, remoteFolder);
|
|
315
|
-
}
|
|
316
|
-
catch (err) {
|
|
317
|
-
logger.error({ err }, 'Failed to upload ASMR database changes');
|
|
318
|
-
hasAsmrUnsyncedChanges = true;
|
|
208
|
+
logger.error({ err }, `Failed to upload ${kindDbLabel[kind]} changes`);
|
|
209
|
+
unsynced[kind] = true;
|
|
319
210
|
}
|
|
320
211
|
}
|
|
321
212
|
}, 300000);
|
|
@@ -337,51 +228,28 @@ async function main() {
|
|
|
337
228
|
clearInterval(offlineDbInterval);
|
|
338
229
|
discordRPCService.disconnect();
|
|
339
230
|
discordGatewayService.shutdown();
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
await asmrWatcher.close();
|
|
231
|
+
for (const watcher of watchers) {
|
|
232
|
+
await watcher.close();
|
|
233
|
+
}
|
|
344
234
|
if (server) {
|
|
345
235
|
await new Promise((resolve) => server.close(() => resolve()));
|
|
346
236
|
}
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
logger.info('Sync on shutdown: uploading final manga database changes...');
|
|
359
|
-
hasMangaUnsyncedChanges = false;
|
|
360
|
-
try {
|
|
361
|
-
await mangaSyncUp(mangaDb, remoteFolder);
|
|
362
|
-
}
|
|
363
|
-
catch (e) {
|
|
364
|
-
logger.error({ err: e }, 'Final manga sync on shutdown failed');
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
if (hasTvUnsyncedChanges) {
|
|
368
|
-
logger.info('Sync on shutdown: uploading final TV database changes...');
|
|
369
|
-
hasTvUnsyncedChanges = false;
|
|
370
|
-
try {
|
|
371
|
-
await tvSyncUp(tvDb, remoteFolder);
|
|
372
|
-
}
|
|
373
|
-
catch (e) {
|
|
374
|
-
logger.error({ err: e }, 'Final TV sync on shutdown failed');
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
if (hasAsmrUnsyncedChanges) {
|
|
378
|
-
logger.info('Sync on shutdown: uploading final ASMR database changes...');
|
|
379
|
-
hasAsmrUnsyncedChanges = false;
|
|
237
|
+
const kindFinalError = {
|
|
238
|
+
anime: 'Final sync on shutdown failed',
|
|
239
|
+
manga: 'Final manga sync on shutdown failed',
|
|
240
|
+
tv: 'Final TV sync on shutdown failed',
|
|
241
|
+
asmr: 'Final ASMR sync on shutdown failed',
|
|
242
|
+
};
|
|
243
|
+
for (const kind of Object.keys(KIND_SYNC)) {
|
|
244
|
+
if (!unsynced[kind])
|
|
245
|
+
continue;
|
|
246
|
+
logger.info(`Sync on shutdown: uploading final ${kindDbLabel[kind]} changes...`);
|
|
247
|
+
unsynced[kind] = false;
|
|
380
248
|
try {
|
|
381
|
-
await
|
|
249
|
+
await syncUp(kindDbs()[kind], kind, remoteFolder);
|
|
382
250
|
}
|
|
383
251
|
catch (e) {
|
|
384
|
-
logger.error({ err: e },
|
|
252
|
+
logger.error({ err: e }, kindFinalError[kind]);
|
|
385
253
|
}
|
|
386
254
|
}
|
|
387
255
|
await waitForSync();
|