@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.
Files changed (93) hide show
  1. package/README.md +1 -1
  2. package/client/dist/assets/{AnimeCard-CIwTZI3D.js → AnimeCard-4CEz8Buu.js} +1 -1
  3. package/client/dist/assets/AnimeInfo-DyX9qTwg.js +1 -0
  4. package/client/dist/assets/AnimeInfoPage-Dvp_c8vK.js +2 -0
  5. package/client/dist/assets/Asmr-qg3lMAJn.js +2 -0
  6. package/client/dist/assets/{AsmrResetProgressModal-BDpA07Fa.js → AsmrResetProgressModal-BpPlg_Vv.js} +1 -1
  7. package/client/dist/assets/AvSyncCalibrator-C2wu1ydI.css +1 -0
  8. package/client/dist/assets/AvSyncCalibrator-FJllOgOH.js +10 -0
  9. package/client/dist/assets/Home-A7gCeEST.js +1 -0
  10. package/client/dist/assets/Insights-G9IXepHJ.js +1 -0
  11. package/client/dist/assets/{LibraryListPage-DWbcek1i.js → LibraryListPage-Bh2qCJPh.js} +1 -1
  12. package/client/dist/assets/{ListeningList-CcuxBzy1.js → ListeningList-Czv4cTRl.js} +1 -1
  13. package/client/dist/assets/{Manga-DpLaW39C.js → Manga-qdAAS1z7.js} +1 -1
  14. package/client/dist/assets/MangaInfoPage-1rTgZzf2.js +1 -0
  15. package/client/dist/assets/MangaReadPage-CeyxPG6w.js +1 -0
  16. package/client/dist/assets/{MangaResetProgressModal-CYguBG2f.js → MangaResetProgressModal-C_ppotmh.js} +1 -1
  17. package/client/dist/assets/Mature-Bkhxnr3K.js +1 -0
  18. package/client/dist/assets/{MediaCard-p29DqyKX.js → MediaCard-BQZsutEo.js} +1 -1
  19. package/client/dist/assets/Music-C0rGzSbi.js +1 -0
  20. package/client/dist/assets/{OptionListMenu-C1pvpu8X.js → OptionListMenu-CyfpCBEy.js} +1 -1
  21. package/client/dist/assets/Player-yhiTlpYU.js +56 -0
  22. package/client/dist/assets/PlayerSettings-icy4SfQa.js +1 -0
  23. package/client/dist/assets/{QueueOptionsButton-CWdoe1_I.js → QueueOptionsButton-5eloKF5J.js} +1 -1
  24. package/client/dist/assets/{QueueRail-BBpn9CII.js → QueueRail-DaMjlKL4.js} +1 -1
  25. package/client/dist/assets/Radio-FxGqCxR4.js +1 -0
  26. package/client/dist/assets/{ReadingList-D4xQ9tlw.js → ReadingList-CCm3IAbt.js} +1 -1
  27. package/client/dist/assets/{ResetProgressModal-JFlbXy7W.js → ResetProgressModal-CeI4V3Y5.js} +1 -1
  28. package/client/dist/assets/{Search-D-ocogP-.js → Search-qpILaAiQ.js} +1 -1
  29. package/client/dist/assets/Settings-Bw9M3NGz.js +21 -0
  30. package/client/dist/assets/{SkeletonGrid-N67HqYXx.js → SkeletonGrid-0dY_xMq3.js} +1 -1
  31. package/client/dist/assets/{Trackers-C_SPMGKx.js → Trackers-Zy5GOs0P.js} +2 -2
  32. package/client/dist/assets/Tv-Bx7tGS57.css +1 -0
  33. package/client/dist/assets/Tv-DREwc7BX.js +4 -0
  34. package/client/dist/assets/TvInfo-CHIsVzZ0.js +1 -0
  35. package/client/dist/assets/{TvPopup-DEB6Ufq4.js → TvPopup-D_tVTyZ2.js} +1 -1
  36. package/client/dist/assets/{TvSearch-grOUL0Bc.js → TvSearch-BVxedBW-.js} +1 -1
  37. package/client/dist/assets/{TvWatchlist-CBI21Vge.js → TvWatchlist-BEIwq9R9.js} +1 -1
  38. package/client/dist/assets/{Watchlist-5cDHUoC8.js → Watchlist-CSngjqlz.js} +1 -1
  39. package/client/dist/assets/{hls-DySVERd_.js → hls-D48GVTkk.js} +1 -1
  40. package/client/dist/assets/index-CVB5dYhT.js +178 -0
  41. package/client/dist/assets/{useAnimeInfoData-BMwVSGhZ.js → useAnimeInfoData-DxdOg_B7.js} +1 -1
  42. package/client/dist/assets/useAsmr-ClckxnPe.js +1 -0
  43. package/client/dist/assets/{useAsmrPopup-CY-6b88q.js → useAsmrPopup-Bbgxefy_.js} +1 -1
  44. package/client/dist/assets/useMangaLibrary-B3_BUKVk.js +1 -0
  45. package/client/dist/assets/{useMangaPopup-_pNXvRYJ.js → useMangaPopup-Celk4lzf.js} +1 -1
  46. package/client/dist/assets/{useProviders-CKSedfqb.js → useProviders-pwxPZPHh.js} +1 -1
  47. package/client/dist/assets/useTv-D9sQrDop.js +1 -0
  48. package/client/dist/assets/useTvLibrary-UsQpgBTB.js +1 -0
  49. package/client/dist/index.html +1 -1
  50. package/package.json +3 -3
  51. package/server/dist/app-hono.js +15 -37
  52. package/server/dist/db/drizzle.js +2 -18
  53. package/server/dist/db.js +3 -2
  54. package/server/dist/hono/tv.js +9 -5
  55. package/server/dist/hono/watchlist.js +10 -108
  56. package/server/dist/lib/migration.js +0 -5
  57. package/server/dist/providers/remote-loader.js +40 -1
  58. package/server/dist/providers/remote-types.js +9 -2
  59. package/server/dist/server.js +50 -182
  60. package/server/dist/sync.js +173 -704
  61. package/server/dist/trpc/routers/auth.js +2 -71
  62. package/server/dist/trpc/routers/continue-watching.js +0 -2
  63. package/server/dist/trpc/routers/data.js +0 -1
  64. package/server/dist/trpc/routers/discord.js +8 -0
  65. package/server/dist/trpc/routers/progress.js +95 -1
  66. package/server/dist/trpc/routers/queue.js +0 -2
  67. package/server/dist/trpc/routers/watchlist.js +0 -7
  68. package/server/dist/trpc/validation.js +64 -0
  69. package/server/package.json +2 -2
  70. package/client/dist/assets/AnimeInfo-DlfvDaR8.js +0 -1
  71. package/client/dist/assets/AnimeInfoPage-B3EPwtzx.js +0 -2
  72. package/client/dist/assets/Asmr-DCirAWM6.js +0 -2
  73. package/client/dist/assets/AvSyncCalibrator-BPa6KaGC.css +0 -1
  74. package/client/dist/assets/AvSyncCalibrator-BroSW86T.js +0 -10
  75. package/client/dist/assets/Home-DEjYtHbs.js +0 -1
  76. package/client/dist/assets/Insights-B3b6u8RW.js +0 -1
  77. package/client/dist/assets/MangaInfoPage-B7FPC4a_.js +0 -1
  78. package/client/dist/assets/MangaReadPage-Dx0qAAFe.js +0 -1
  79. package/client/dist/assets/Mature-AScDPmWW.js +0 -1
  80. package/client/dist/assets/Music-DFInMskb.js +0 -1
  81. package/client/dist/assets/Player-D-8zY3cx.js +0 -56
  82. package/client/dist/assets/PlayerSettings-CfJjs_0Q.js +0 -1
  83. package/client/dist/assets/Radio-DCgO5hAS.js +0 -1
  84. package/client/dist/assets/Settings-BsFbgkdy.js +0 -21
  85. package/client/dist/assets/Tv-D7s0Kqqx.js +0 -4
  86. package/client/dist/assets/Tv-ZEA45gXK.css +0 -1
  87. package/client/dist/assets/TvInfo-CrmCSFDF.js +0 -1
  88. package/client/dist/assets/index-HZNJp28e.js +0 -178
  89. package/client/dist/assets/useAsmr-BLc7FwPm.js +0 -1
  90. package/client/dist/assets/useMangaLibrary-XFRTq5Qg.js +0 -1
  91. package/client/dist/assets/useMatureConsent-Cra09TA0.js +0 -1
  92. package/client/dist/assets/useTv-Dizj6G4R.js +0 -1
  93. package/client/dist/assets/useTvLibrary-twjHQ89n.js +0 -1
@@ -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, syncDownOnBoot, syncUp, mangaSyncDownOnBoot, mangaSyncUp, tvSyncDownOnBoot, tvSyncUp, asmrSyncDownOnBoot, asmrSyncUp, initSyncProvider, waitForSync, getActiveProvider, } from './sync.js';
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 initSyncProvider(preferredProvider);
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
- if (!fs.existsSync(CONFIG.LOCAL_MANIFEST_PATH)) {
232
- fs.writeFileSync(CONFIG.LOCAL_MANIFEST_PATH, JSON.stringify({ version: 0 }));
233
- }
234
- if (!fs.existsSync(CONFIG.MANGA_LOCAL_MANIFEST_PATH)) {
235
- fs.writeFileSync(CONFIG.MANGA_LOCAL_MANIFEST_PATH, JSON.stringify({ version: 0 }));
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 mangaWatcher = fs.watch(CONFIG.MANGA_LOCAL_MANIFEST_PATH, (eventType) => {
253
- if (eventType === 'change' || eventType === 'rename') {
254
- hasMangaUnsyncedChanges = true;
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 tvWatcher = fs.watch(CONFIG.TV_LOCAL_MANIFEST_PATH, (eventType) => {
258
- if (eventType === 'change' || eventType === 'rename') {
259
- hasTvUnsyncedChanges = true;
260
- }
261
- });
262
- const asmrWatcher = fs.watch(CONFIG.ASMR_LOCAL_MANIFEST_PATH, (eventType) => {
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
- hasAsmrUnsyncedChanges = true;
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
- if (hasUnsyncedChanges) {
278
- logger.info('Uploading accumulated database changes...');
279
- hasUnsyncedChanges = false;
280
- try {
281
- await syncUp(db, dbPath, remoteFolder);
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 tvSyncUp(tvDb, remoteFolder);
205
+ await syncUp(kindDbs()[kind], kind, remoteFolder);
304
206
  }
305
207
  catch (err) {
306
- logger.error({ err }, 'Failed to upload TV database changes');
307
- hasTvUnsyncedChanges = true;
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
- await watcher.close();
341
- await mangaWatcher.close();
342
- await tvWatcher.close();
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
- if (hasUnsyncedChanges) {
348
- logger.info('Sync on shutdown: uploading final database changes...');
349
- hasUnsyncedChanges = false;
350
- try {
351
- await syncUp(db, dbPath, remoteFolder);
352
- }
353
- catch (e) {
354
- logger.error({ err: e }, 'Final sync on shutdown failed');
355
- }
356
- }
357
- if (hasMangaUnsyncedChanges) {
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 asmrSyncUp(asmrDb, remoteFolder);
249
+ await syncUp(kindDbs()[kind], kind, remoteFolder);
382
250
  }
383
251
  catch (e) {
384
- logger.error({ err: e }, 'Final ASMR sync on shutdown failed');
252
+ logger.error({ err: e }, kindFinalError[kind]);
385
253
  }
386
254
  }
387
255
  await waitForSync();