@serifpersia/dango 3.6.5 → 3.6.8
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-JkXG40Es.js → AnimeCard-DraA_TF9.js} +1 -1
- package/client/dist/assets/{AnimeInfo-2L0UJkbB.js → AnimeInfo-BJ7pzs-P.js} +1 -1
- package/client/dist/assets/{AnimeInfoPage-BDs03vKk.js → AnimeInfoPage-B_esUr5C.js} +2 -2
- package/client/dist/assets/{Asmr-D2mVKEl9.js → Asmr-Ckuh2xfW.js} +1 -1
- package/client/dist/assets/{AsmrResetProgressModal-MQA_bNQM.js → AsmrResetProgressModal-BS6UFJN4.js} +1 -1
- package/client/dist/assets/AvSyncCalibrator-DwHCd9yB.js +10 -0
- package/client/dist/assets/{Home-DxMBHFmc.js → Home-DuM1EuvN.js} +1 -1
- package/client/dist/assets/{Insights-hmLWsSXY.js → Insights-D3Pd9c9V.js} +1 -1
- package/client/dist/assets/{LibraryListPage-CWI7hgUh.js → LibraryListPage-Dm2yVn0-.js} +1 -1
- package/client/dist/assets/{ListeningList-NOc28KAV.js → ListeningList-D-zt6EXZ.js} +1 -1
- package/client/dist/assets/{Manga-B5qNhI7v.js → Manga-JwprMKBk.js} +1 -1
- package/client/dist/assets/{MangaInfoPage-D4wIyb-V.js → MangaInfoPage-DaeyJl2p.js} +1 -1
- package/client/dist/assets/{MangaReadPage-Ce1VX7-0.js → MangaReadPage-COg0fHI9.js} +1 -1
- package/client/dist/assets/{MangaResetProgressModal-P3oY4_14.js → MangaResetProgressModal-kguXv0_M.js} +1 -1
- package/client/dist/assets/{Mature-D8EwGYQq.js → Mature-IHDaasrs.js} +1 -1
- package/client/dist/assets/{MediaCard-Dp8DjyXB.js → MediaCard-CpwsrXo5.js} +1 -1
- package/client/dist/assets/{Music-DULtVsAM.js → Music-Dks4tPeK.js} +1 -1
- package/client/dist/assets/{OptionListMenu-fIHdE-nq.js → OptionListMenu-11CcAsy8.js} +1 -1
- package/client/dist/assets/{Player-B8XeOmso.js → Player-DQoEQkHL.js} +6 -6
- package/client/dist/assets/{PlayerSettings-BycNCiCs.js → PlayerSettings-D4Ud4kv4.js} +1 -1
- package/client/dist/assets/{QueueOptionsButton-T1J37IZT.js → QueueOptionsButton-B8PlPKjC.js} +1 -1
- package/client/dist/assets/{QueueRail-BAwI-apz.js → QueueRail-B4Dok7U3.js} +1 -1
- package/client/dist/assets/{Radio-Bv9DyKtZ.js → Radio-BHK6LSk4.js} +1 -1
- package/client/dist/assets/{ReadingList-Cl0CcVp3.js → ReadingList-BCsxIz57.js} +1 -1
- package/client/dist/assets/{ResetProgressModal--N60WWCB.js → ResetProgressModal-BXHxSfy-.js} +1 -1
- package/client/dist/assets/{Search-DvgVDlUR.js → Search-PK1ds07O.js} +1 -1
- package/client/dist/assets/{Settings-dCz_-bJn.js → Settings-Bxk_x55l.js} +1 -1
- package/client/dist/assets/{SkeletonGrid-BZHKk1I6.js → SkeletonGrid-CpJCZSRN.js} +1 -1
- package/client/dist/assets/{Trackers-C1T5VcPu.js → Trackers-RieCh_84.js} +1 -1
- package/client/dist/assets/{Tv-Dhv_cg4y.js → Tv-DLytPJUj.js} +4 -4
- package/client/dist/assets/{TvInfo-DgaLK2H6.js → TvInfo-C8djKebR.js} +1 -1
- package/client/dist/assets/{TvPopup-DyX7f8kC.js → TvPopup-40JGGJDk.js} +1 -1
- package/client/dist/assets/{TvSearch-Bp0H6kue.js → TvSearch-A3hbospf.js} +1 -1
- package/client/dist/assets/{TvWatchlist-ohMtMeKa.js → TvWatchlist-DuXjqmZM.js} +1 -1
- package/client/dist/assets/{Watchlist-BbQtzsER.js → Watchlist-B9wGBh0u.js} +1 -1
- package/client/dist/assets/{hls-Bi1cjpLZ.js → hls-CZ5X3Ya-.js} +1 -1
- package/client/dist/assets/{index-BTnhzofk.js → index-dRhc9-ol.js} +2 -2
- package/client/dist/assets/{useAnimeInfoData-Cvmso3IK.js → useAnimeInfoData-ZzDtLfvD.js} +1 -1
- package/client/dist/assets/{useAsmr-CbzGCzmv.js → useAsmr-CKOdHgol.js} +1 -1
- package/client/dist/assets/{useAsmrPopup-DaREZ9Ie.js → useAsmrPopup-SFHPhpcl.js} +1 -1
- package/client/dist/assets/{useMangaLibrary-BVQRhsFh.js → useMangaLibrary-CKATe31P.js} +1 -1
- package/client/dist/assets/{useMangaPopup-CzsCbndG.js → useMangaPopup-C75QuYgY.js} +1 -1
- package/client/dist/assets/{useProviders-UuUPzft-.js → useProviders-CMtvZbEi.js} +1 -1
- package/client/dist/assets/{useTv-CSsbWKH9.js → useTv-DUX4zYMr.js} +1 -1
- package/client/dist/assets/{useTvLibrary-a_Y0c2FS.js → useTvLibrary-By4Gt-R_.js} +1 -1
- package/client/dist/index.html +1 -1
- package/package.json +2 -2
- package/server/dist/app-auth.js +1 -157
- package/server/dist/app-hono.js +7 -557
- package/server/dist/config.js +1 -174
- package/server/dist/db/drizzle.js +1 -16
- package/server/dist/db/schema-anime.js +1 -61
- package/server/dist/db/schema-asmr.js +1 -13
- package/server/dist/db/schema-manga.js +1 -31
- package/server/dist/db/schema-tv.js +1 -18
- package/server/dist/db.js +1 -217
- package/server/dist/discord-gateway.js +1 -385
- package/server/dist/discord-rpc.js +1 -413
- package/server/dist/github-sync.js +1 -508
- package/server/dist/google.js +1 -741
- package/server/dist/hono/asmr.js +1 -10
- package/server/dist/hono/auth.js +3 -26
- package/server/dist/hono/music.js +1 -209
- package/server/dist/hono/proxy.js +36 -905
- package/server/dist/hono/tv.js +5 -169
- package/server/dist/hono/watchlist.js +2 -338
- package/server/dist/lib/anilist.js +26 -1458
- package/server/dist/lib/anischedule.js +1 -191
- package/server/dist/lib/insights.js +1 -185
- package/server/dist/lib/ipc.js +1 -23
- package/server/dist/lib/kitsu.js +1 -517
- package/server/dist/lib/mal-import.js +1 -291
- package/server/dist/lib/mal.js +1 -957
- package/server/dist/lib/migration.js +1 -310
- package/server/dist/lib/offline-db.js +4 -384
- package/server/dist/lib/potoken.js +1 -135
- package/server/dist/lib/recommendations.service.js +1 -216
- package/server/dist/lib/temp-ids.js +1 -3
- package/server/dist/lib/tmdb.js +1 -72
- package/server/dist/lib/tracker/anilist-tracker.js +8 -245
- package/server/dist/lib/tracker/manga-sync.service.js +1 -773
- package/server/dist/lib/tracker/sync-state.js +1 -21
- package/server/dist/lib/tracker/sync.service.js +1 -476
- package/server/dist/lib/translate.js +3 -79
- package/server/dist/lib/ump.js +1 -106
- package/server/dist/lib/ytmusic.js +1 -162
- package/server/dist/logger.js +1 -16
- package/server/dist/providers/manga/manga.types.js +0 -1
- package/server/dist/providers/provider.interface.js +0 -1
- package/server/dist/providers/remote-loader.js +2 -605
- package/server/dist/providers/remote-types.js +1 -124
- package/server/dist/providers/title-matching.js +1 -226
- package/server/dist/providers/tv.types.js +0 -1
- package/server/dist/rclone.js +2 -120
- package/server/dist/repositories/asmr.repository.js +11 -46
- package/server/dist/repositories/insights.repository.js +11 -25
- package/server/dist/repositories/library.repository.js +3 -94
- package/server/dist/repositories/mal-cache.repository.js +1 -52
- package/server/dist/repositories/manga.repository.js +14 -58
- package/server/dist/repositories/notifications.repository.js +6 -52
- package/server/dist/repositories/queue.repository.js +5 -58
- package/server/dist/repositories/settings.repository.js +2 -29
- package/server/dist/repositories/shows-meta.repository.js +3 -56
- package/server/dist/repositories/temp-show-ids.repository.js +3 -63
- package/server/dist/repositories/tv.repository.js +11 -54
- package/server/dist/repositories/watched-episodes.repository.js +6 -55
- package/server/dist/repositories/watchlist.repository.js +3 -54
- package/server/dist/scripts/backfill-episode-duration.js +1 -42
- package/server/dist/server.js +1 -307
- package/server/dist/shipped-defaults.js +1 -6
- package/server/dist/sync-payload.js +1 -91
- package/server/dist/sync.js +3 -647
- package/server/dist/trpc/context.js +1 -7
- package/server/dist/trpc/errors.js +1 -15
- package/server/dist/trpc/index.js +1 -18
- package/server/dist/trpc/router.js +1 -49
- package/server/dist/trpc/routers/asmr-library.js +1 -112
- package/server/dist/trpc/routers/asmr-progress.js +1 -121
- package/server/dist/trpc/routers/asmr.js +1 -87
- package/server/dist/trpc/routers/auth.js +1 -194
- package/server/dist/trpc/routers/continue-watching.js +2 -58
- package/server/dist/trpc/routers/data.js +1 -1026
- package/server/dist/trpc/routers/discord.js +1 -285
- package/server/dist/trpc/routers/discovery.js +1 -11
- package/server/dist/trpc/routers/insights.js +1 -14
- package/server/dist/trpc/routers/manga-library.js +1 -263
- package/server/dist/trpc/routers/manga-progress.js +1 -169
- package/server/dist/trpc/routers/manga.js +1 -201
- package/server/dist/trpc/routers/music.js +1 -655
- package/server/dist/trpc/routers/notifications.js +1 -80
- package/server/dist/trpc/routers/progress.js +1 -109
- package/server/dist/trpc/routers/queue.js +1 -93
- package/server/dist/trpc/routers/radio.js +1 -145
- package/server/dist/trpc/routers/settings.js +1 -96
- package/server/dist/trpc/routers/tracker.js +1 -213
- package/server/dist/trpc/routers/tv-library.js +1 -135
- package/server/dist/trpc/routers/tv-progress.js +1 -159
- package/server/dist/trpc/routers/tv.js +1 -551
- package/server/dist/trpc/routers/watchlist.js +2 -549
- package/server/dist/trpc/validation.js +1 -258
- package/server/dist/utils/cache.utils.js +1 -25
- package/server/dist/utils/cookie.utils.js +1 -13
- package/server/dist/utils/db-utils.js +5 -17
- package/server/dist/utils/env.utils.js +5 -77
- package/server/dist/utils/http.utils.js +1 -82
- package/server/dist/utils/request-context.js +1 -2
- package/server/dist/utils/security.utils.js +1 -76
- package/server/package.json +3 -2
- package/client/dist/assets/AvSyncCalibrator-DmoH5eRA.js +0 -10
- package/server/dist/utils/megaplay.utils.js +0 -40
|
@@ -1,91 +1 @@
|
|
|
1
|
-
import path from '
|
|
2
|
-
import logger from './logger.js';
|
|
3
|
-
import { CONFIG } from './config.js';
|
|
4
|
-
import { dbAll, dbGet } from './utils/db-utils.js';
|
|
5
|
-
import { isTempSyncRow } from './lib/temp-ids.js';
|
|
6
|
-
const log = logger.child({ module: 'SyncPayload' });
|
|
7
|
-
export const ANIME_SYNC_TABLES = [
|
|
8
|
-
'watchlist',
|
|
9
|
-
'watched_episodes',
|
|
10
|
-
'queue',
|
|
11
|
-
'settings',
|
|
12
|
-
'shows_meta',
|
|
13
|
-
'sync_metadata',
|
|
14
|
-
'dismissed_notifications',
|
|
15
|
-
'discovered_notifications',
|
|
16
|
-
];
|
|
17
|
-
export const MANGA_SYNC_TABLES = ['manga_library', 'manga_progress', 'sync_metadata'];
|
|
18
|
-
export const TV_SYNC_TABLES = ['tv_library', 'tv_progress', 'sync_metadata'];
|
|
19
|
-
export const ASMR_SYNC_TABLES = ['asmr_library', 'asmr_progress', 'sync_metadata'];
|
|
20
|
-
export function readPayloadVersion(payload) {
|
|
21
|
-
const meta = payload.tables['sync_metadata'];
|
|
22
|
-
const row = meta?.find((r) => r.key === 'db_version');
|
|
23
|
-
const v = row?.value;
|
|
24
|
-
return typeof v === 'number' ? v : Number(v || payload.version || 0);
|
|
25
|
-
}
|
|
26
|
-
export function normalizePayload(input, tables, label) {
|
|
27
|
-
if (!input || typeof input !== 'object' || !('tables' in input)) {
|
|
28
|
-
throw new Error(`Invalid ${label} sync payload.`);
|
|
29
|
-
}
|
|
30
|
-
const payload = input;
|
|
31
|
-
for (const table of tables) {
|
|
32
|
-
if (!Array.isArray(payload.tables?.[table])) {
|
|
33
|
-
throw new Error(`Invalid ${label} sync payload: missing ${String(table)}.`);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return payload;
|
|
37
|
-
}
|
|
38
|
-
export function exportTables(db, tables) {
|
|
39
|
-
const out = {};
|
|
40
|
-
for (const table of tables) {
|
|
41
|
-
const rows = dbAll(db, `SELECT * FROM "${String(table).replace(/"/g, '""')}"`);
|
|
42
|
-
out[table] = rows.filter((row) => !isTempSyncRow(row));
|
|
43
|
-
}
|
|
44
|
-
return {
|
|
45
|
-
version: readPayloadVersion({ version: 0, exportedAt: '', tables: out }),
|
|
46
|
-
exportedAt: new Date().toISOString(),
|
|
47
|
-
tables: out,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
export function importTables(db, tables, payload, opts) {
|
|
51
|
-
const asRec = payload.tables;
|
|
52
|
-
const remoteLibraryRows = opts.libraryTables.reduce((n, t) => n + (asRec[t]?.length ?? 0), 0);
|
|
53
|
-
const localLibraryRows = opts.libraryTables.length === 0
|
|
54
|
-
? 1
|
|
55
|
-
: (dbGet(db, `SELECT ${opts.libraryTables
|
|
56
|
-
.map((t) => `(SELECT COUNT(*) FROM "${String(t).replace(/"/g, '""')}")`)
|
|
57
|
-
.join(' + ')} AS n`)?.n ?? 0);
|
|
58
|
-
if (remoteLibraryRows === 0 && localLibraryRows > 0) {
|
|
59
|
-
throw new Error('Sync down refused: remote library is empty while local library has data');
|
|
60
|
-
}
|
|
61
|
-
try {
|
|
62
|
-
db.backup(path.join(CONFIG.ROOT, opts.backupName));
|
|
63
|
-
}
|
|
64
|
-
catch (err) {
|
|
65
|
-
log.warn({ err }, 'Pre-sync backup failed, continuing without backup');
|
|
66
|
-
}
|
|
67
|
-
const localColumns = new Map();
|
|
68
|
-
for (const table of tables) {
|
|
69
|
-
const cols = db.all(`PRAGMA table_info("${String(table)}")`);
|
|
70
|
-
localColumns.set(String(table), new Set(cols.map((c) => c.name)));
|
|
71
|
-
}
|
|
72
|
-
db.serialize(() => {
|
|
73
|
-
for (const table of tables) {
|
|
74
|
-
db.run(`DELETE FROM "${String(table).replace(/"/g, '""')}"`);
|
|
75
|
-
}
|
|
76
|
-
for (const table of tables) {
|
|
77
|
-
const known = localColumns.get(String(table));
|
|
78
|
-
for (const row of asRec[String(table)] || []) {
|
|
79
|
-
if (isTempSyncRow(row))
|
|
80
|
-
continue;
|
|
81
|
-
const columns = Object.keys(row).filter((c) => known?.has(c));
|
|
82
|
-
if (columns.length === 0)
|
|
83
|
-
continue;
|
|
84
|
-
const columnSql = columns.map((c) => `"${c.replace(/"/g, '""')}"`).join(', ');
|
|
85
|
-
const placeholders = columns.map(() => '?').join(', ');
|
|
86
|
-
const values = columns.map((c) => row[c]);
|
|
87
|
-
db.run(`INSERT INTO "${String(table).replace(/"/g, '""')}" (${columnSql}) VALUES (${placeholders})`, values);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
}
|
|
1
|
+
import S from"path";import f from"./logger.js";import{CONFIG as u}from"./config.js";import{dbAll as w,dbGet as _}from"./utils/db-utils.js";import{isTempSyncRow as d}from"./lib/temp-ids.js";const R=f.child({module:"SyncPayload"}),$=["watchlist","watched_episodes","queue","settings","shows_meta","sync_metadata","dismissed_notifications","discovered_notifications"],L=["manga_library","manga_progress","sync_metadata"],P=["tv_library","tv_progress","sync_metadata"],k=["asmr_library","asmr_progress","sync_metadata"];function x(e){const n=e.tables.sync_metadata?.find(t=>t.key==="db_version")?.value;return typeof n=="number"?n:Number(n||e.version||0)}function C(e,o,a){if(!e||typeof e!="object"||!("tables"in e))throw new Error(`Invalid ${a} sync payload.`);const n=e;for(const t of o)if(!Array.isArray(n.tables?.[t]))throw new Error(`Invalid ${a} sync payload: missing ${String(t)}.`);return n}function O(e,o){const a={};for(const n of o){const t=w(e,`SELECT * FROM "${String(n).replace(/"/g,'""')}"`);a[n]=t.filter(y=>!d(y))}return{version:x({version:0,exportedAt:"",tables:a}),exportedAt:new Date().toISOString(),tables:a}}function M(e,o,a,n){const t=a.tables,y=n.libraryTables.reduce((r,s)=>r+(t[s]?.length??0),0),p=n.libraryTables.length===0?1:_(e,`SELECT ${n.libraryTables.map(r=>`(SELECT COUNT(*) FROM "${String(r).replace(/"/g,'""')}")`).join(" + ")} AS n`)?.n??0;if(y===0&&p>0)throw new Error("Sync down refused: remote library is empty while local library has data");try{e.backup(S.join(u.ROOT,n.backupName))}catch(r){R.warn({err:r},"Pre-sync backup failed, continuing without backup")}const b=new Map;for(const r of o){const s=e.all(`PRAGMA table_info("${String(r)}")`);b.set(String(r),new Set(s.map(i=>i.name)))}e.serialize(()=>{for(const r of o)e.run(`DELETE FROM "${String(r).replace(/"/g,'""')}"`);for(const r of o){const s=b.get(String(r));for(const i of t[String(r)]||[]){if(d(i))continue;const c=Object.keys(i).filter(l=>s?.has(l));if(c.length===0)continue;const T=c.map(l=>`"${l.replace(/"/g,'""')}"`).join(", "),m=c.map(()=>"?").join(", "),g=c.map(l=>i[l]);e.run(`INSERT INTO "${String(r).replace(/"/g,'""')}" (${T}) VALUES (${m})`,g)}}})}export{$ as ANIME_SYNC_TABLES,k as ASMR_SYNC_TABLES,L as MANGA_SYNC_TABLES,P as TV_SYNC_TABLES,O as exportTables,M as importTables,C as normalizePayload,x as readPayloadVersion};
|