@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
package/server/dist/lib/ump.js
CHANGED
|
@@ -1,106 +1 @@
|
|
|
1
|
-
const
|
|
2
|
-
const MEDIA = 21;
|
|
3
|
-
const STREAM_PROTECTION_STATUS = 58;
|
|
4
|
-
function readVarint(buf, pos) {
|
|
5
|
-
if (pos >= buf.length)
|
|
6
|
-
return null;
|
|
7
|
-
const prefix = buf[pos];
|
|
8
|
-
let size = 0;
|
|
9
|
-
for (let shift = 1; shift <= 5; shift++) {
|
|
10
|
-
if ((prefix & (128 >> (shift - 1))) === 0) {
|
|
11
|
-
size = shift;
|
|
12
|
-
break;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
if (size < 1 || pos + size > buf.length)
|
|
16
|
-
return null;
|
|
17
|
-
if (size === 1)
|
|
18
|
-
return [prefix, pos + 1];
|
|
19
|
-
if (size === 5) {
|
|
20
|
-
const value = buf[pos + 1] + buf[pos + 2] * 256 + buf[pos + 3] * 65536 + buf[pos + 4] * 16777216;
|
|
21
|
-
return [value >>> 0, pos + 5];
|
|
22
|
-
}
|
|
23
|
-
const lowBits = 8 - size;
|
|
24
|
-
let value = prefix & ((1 << lowBits) - 1);
|
|
25
|
-
for (let i = 1; i < size; i++) {
|
|
26
|
-
value += buf[pos + i] * 2 ** (lowBits + 8 * (i - 1));
|
|
27
|
-
}
|
|
28
|
-
return [value, pos + size];
|
|
29
|
-
}
|
|
30
|
-
function readStatusField(payload) {
|
|
31
|
-
let pos = 0;
|
|
32
|
-
while (pos < payload.length) {
|
|
33
|
-
const key = payload[pos++];
|
|
34
|
-
const field = key >> 3;
|
|
35
|
-
const wire = key & 7;
|
|
36
|
-
if (wire !== 0)
|
|
37
|
-
break;
|
|
38
|
-
const decoded = readVarint(payload, pos);
|
|
39
|
-
if (!decoded)
|
|
40
|
-
break;
|
|
41
|
-
if (field === 1)
|
|
42
|
-
return decoded[0];
|
|
43
|
-
pos = decoded[1];
|
|
44
|
-
}
|
|
45
|
-
return 1;
|
|
46
|
-
}
|
|
47
|
-
export function parseUmpResponse(buf, carry) {
|
|
48
|
-
const mediaChunks = [];
|
|
49
|
-
let status = 1;
|
|
50
|
-
let nextCarry = carry;
|
|
51
|
-
let pos = 0;
|
|
52
|
-
if (nextCarry) {
|
|
53
|
-
const t = readVarint(buf, pos);
|
|
54
|
-
const s = t && readVarint(buf, t[1]);
|
|
55
|
-
if (t && s && t[0] === MEDIA_HEADER) {
|
|
56
|
-
pos = s[1] + s[0];
|
|
57
|
-
}
|
|
58
|
-
const ct = readVarint(buf, pos);
|
|
59
|
-
const cs = ct && readVarint(buf, ct[1]);
|
|
60
|
-
if (ct && cs && ct[0] === nextCarry.pendingType) {
|
|
61
|
-
pos = cs[1];
|
|
62
|
-
const take = Math.min(cs[0], buf.length - pos);
|
|
63
|
-
nextCarry.chunks.push(buf.subarray(pos, pos + take));
|
|
64
|
-
nextCarry.remaining = cs[0] - take;
|
|
65
|
-
pos += take;
|
|
66
|
-
if (nextCarry.remaining <= 0) {
|
|
67
|
-
const full = Buffer.concat(nextCarry.chunks);
|
|
68
|
-
nextCarry = null;
|
|
69
|
-
if (ct[0] === MEDIA && full.length > 1)
|
|
70
|
-
mediaChunks.push(full.subarray(1));
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
nextCarry = null;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
while (pos < buf.length) {
|
|
78
|
-
const t = readVarint(buf, pos);
|
|
79
|
-
if (!t)
|
|
80
|
-
break;
|
|
81
|
-
const s = readVarint(buf, t[1]);
|
|
82
|
-
if (!s)
|
|
83
|
-
break;
|
|
84
|
-
const [type, size] = [t[0], s[0]];
|
|
85
|
-
pos = s[1];
|
|
86
|
-
const available = buf.length - pos;
|
|
87
|
-
if (size > available) {
|
|
88
|
-
nextCarry = {
|
|
89
|
-
pendingType: type,
|
|
90
|
-
remaining: size - available,
|
|
91
|
-
chunks: [buf.subarray(pos)],
|
|
92
|
-
};
|
|
93
|
-
break;
|
|
94
|
-
}
|
|
95
|
-
const payload = buf.subarray(pos, pos + size);
|
|
96
|
-
pos += size;
|
|
97
|
-
if (type === MEDIA) {
|
|
98
|
-
if (payload.length > 1)
|
|
99
|
-
mediaChunks.push(payload.subarray(1));
|
|
100
|
-
}
|
|
101
|
-
else if (type === STREAM_PROTECTION_STATUS) {
|
|
102
|
-
status = readStatusField(payload);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
return { media: Buffer.concat(mediaChunks), status, carry: nextCarry };
|
|
106
|
-
}
|
|
1
|
+
const y=20,g=21,p=58;function f(e,t){if(t>=e.length)return null;const l=e[t];let a=0;for(let r=1;r<=5;r++)if((l&128>>r-1)===0){a=r;break}if(a<1||t+a>e.length)return null;if(a===1)return[l,t+1];if(a===5)return[e[t+1]+e[t+2]*256+e[t+3]*65536+e[t+4]*16777216>>>0,t+5];const i=8-a;let n=l&(1<<i)-1;for(let r=1;r<a;r++)n+=e[t+r]*2**(i+8*(r-1));return[n,t+a]}function h(e){let t=0;for(;t<e.length;){const l=e[t++],a=l>>3;if((l&7)!==0)break;const n=f(e,t);if(!n)break;if(a===1)return n[0];t=n[1]}return 1}function k(e,t){const l=[];let a=1,i=t,n=0;if(i){const r=f(e,n),u=r&&f(e,r[1]);r&&u&&r[0]===20&&(n=u[1]+u[0]);const s=f(e,n),c=s&&f(e,s[1]);if(s&&c&&s[0]===i.pendingType){n=c[1];const o=Math.min(c[0],e.length-n);if(i.chunks.push(e.subarray(n,n+o)),i.remaining=c[0]-o,n+=o,i.remaining<=0){const m=Buffer.concat(i.chunks);i=null,s[0]===21&&m.length>1&&l.push(m.subarray(1))}}else i=null}for(;n<e.length;){const r=f(e,n);if(!r)break;const u=f(e,r[1]);if(!u)break;const[s,c]=[r[0],u[0]];n=u[1];const o=e.length-n;if(c>o){i={pendingType:s,remaining:c-o,chunks:[e.subarray(n)]};break}const m=e.subarray(n,n+c);n+=c,s===21?m.length>1&&l.push(m.subarray(1)):s===58&&(a=h(m))}return{media:Buffer.concat(l),status:a,carry:i}}export{k as parseUmpResponse};
|
|
@@ -1,162 +1 @@
|
|
|
1
|
-
import fs from
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import { CONFIG } from '../config.js';
|
|
4
|
-
import logger from '../logger.js';
|
|
5
|
-
const COOKIE_PATH = path.join(CONFIG.ROOT, 'ytmusic_cookie.txt');
|
|
6
|
-
let publicTube = null;
|
|
7
|
-
let publicPromise = null;
|
|
8
|
-
let publicFailedAt = 0;
|
|
9
|
-
const PUBLIC_FAIL_COOLDOWN_MS = 60 * 1000;
|
|
10
|
-
let authedTube = null;
|
|
11
|
-
let ytModule = null;
|
|
12
|
-
let shimReady = false;
|
|
13
|
-
async function loadYoutube() {
|
|
14
|
-
if (!ytModule)
|
|
15
|
-
ytModule = await import('youtubei.js');
|
|
16
|
-
return ytModule;
|
|
17
|
-
}
|
|
18
|
-
async function ensureShim() {
|
|
19
|
-
if (shimReady)
|
|
20
|
-
return;
|
|
21
|
-
const { Platform, Log } = await loadYoutube();
|
|
22
|
-
Platform.shim.eval = (async (data) => new Function(data.output)());
|
|
23
|
-
Log.setLevel(Log.Level.ERROR);
|
|
24
|
-
shimReady = true;
|
|
25
|
-
}
|
|
26
|
-
function readCookie() {
|
|
27
|
-
try {
|
|
28
|
-
if (!fs.existsSync(COOKIE_PATH))
|
|
29
|
-
return null;
|
|
30
|
-
const raw = fs.readFileSync(COOKIE_PATH, 'utf-8').trim();
|
|
31
|
-
return raw || null;
|
|
32
|
-
}
|
|
33
|
-
catch {
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
export function getMusicCookie() {
|
|
38
|
-
return readCookie();
|
|
39
|
-
}
|
|
40
|
-
export function isParserVariantError(err) {
|
|
41
|
-
if (!err || typeof err !== 'object')
|
|
42
|
-
return false;
|
|
43
|
-
const name = err.constructor?.name;
|
|
44
|
-
if (name === 'ParsingError')
|
|
45
|
-
return true;
|
|
46
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
47
|
-
return /Expected node of any type|Cannot cast \S+ to one of|got ItemSection|is not valid JSON|Incorrect JSPB formatting/i.test(msg);
|
|
48
|
-
}
|
|
49
|
-
export function getInnertube() {
|
|
50
|
-
if (publicTube)
|
|
51
|
-
return Promise.resolve(publicTube);
|
|
52
|
-
if (Date.now() - publicFailedAt < PUBLIC_FAIL_COOLDOWN_MS) {
|
|
53
|
-
return Promise.reject(new Error('YouTube session unavailable (cooling down)'));
|
|
54
|
-
}
|
|
55
|
-
if (!publicPromise) {
|
|
56
|
-
publicPromise = (async () => {
|
|
57
|
-
const { Innertube } = await loadYoutube();
|
|
58
|
-
await ensureShim();
|
|
59
|
-
try {
|
|
60
|
-
const yt = await Innertube.create({ generate_session_locally: false });
|
|
61
|
-
publicTube = yt;
|
|
62
|
-
return yt;
|
|
63
|
-
}
|
|
64
|
-
catch (err) {
|
|
65
|
-
publicPromise = null;
|
|
66
|
-
publicFailedAt = Date.now();
|
|
67
|
-
throw err;
|
|
68
|
-
}
|
|
69
|
-
})();
|
|
70
|
-
}
|
|
71
|
-
return publicPromise;
|
|
72
|
-
}
|
|
73
|
-
export async function getAuthedInnertube(forceRefresh = false) {
|
|
74
|
-
const cookie = readCookie();
|
|
75
|
-
if (!cookie) {
|
|
76
|
-
authedTube = null;
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
if (authedTube && !forceRefresh)
|
|
80
|
-
return authedTube;
|
|
81
|
-
await ensureShim();
|
|
82
|
-
const { Innertube } = await loadYoutube();
|
|
83
|
-
authedTube = await Innertube.create({ cookie });
|
|
84
|
-
return authedTube;
|
|
85
|
-
}
|
|
86
|
-
export function invalidateAuthedSession() {
|
|
87
|
-
authedTube = null;
|
|
88
|
-
}
|
|
89
|
-
export async function refreshAuthedInnertube() {
|
|
90
|
-
invalidateAuthedSession();
|
|
91
|
-
try {
|
|
92
|
-
return await getAuthedInnertube();
|
|
93
|
-
}
|
|
94
|
-
catch (err) {
|
|
95
|
-
logger.warn({ err }, '[ytmusic] saved-cookie session refresh failed');
|
|
96
|
-
return null;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
const AUTH_TTL_MS = 5 * 60 * 1000;
|
|
100
|
-
let authProbeAt = 0;
|
|
101
|
-
let authProbeOk = false;
|
|
102
|
-
export async function verifyMusicSession() {
|
|
103
|
-
if (!readCookie())
|
|
104
|
-
return false;
|
|
105
|
-
const now = Date.now();
|
|
106
|
-
if (now - authProbeAt < AUTH_TTL_MS)
|
|
107
|
-
return authProbeOk;
|
|
108
|
-
authProbeAt = now;
|
|
109
|
-
try {
|
|
110
|
-
const yt = await getAuthedInnertube();
|
|
111
|
-
if (!yt)
|
|
112
|
-
return false;
|
|
113
|
-
await yt.account.getInfo();
|
|
114
|
-
authProbeOk = true;
|
|
115
|
-
}
|
|
116
|
-
catch {
|
|
117
|
-
authProbeOk = false;
|
|
118
|
-
}
|
|
119
|
-
return authProbeOk;
|
|
120
|
-
}
|
|
121
|
-
export async function getMusicAuthStatus() {
|
|
122
|
-
return { authenticated: await verifyMusicSession() };
|
|
123
|
-
}
|
|
124
|
-
export async function saveMusicCookie(cookie) {
|
|
125
|
-
const clean = cookie.trim();
|
|
126
|
-
if (!clean)
|
|
127
|
-
throw new Error('Cookie is empty');
|
|
128
|
-
await ensureShim();
|
|
129
|
-
const { Innertube } = await loadYoutube();
|
|
130
|
-
const trial = await Innertube.create({ cookie: clean });
|
|
131
|
-
try {
|
|
132
|
-
await trial.music.getLibrary();
|
|
133
|
-
}
|
|
134
|
-
catch (err) {
|
|
135
|
-
if (!isParserVariantError(err))
|
|
136
|
-
throw err;
|
|
137
|
-
logger.warn('[ytmusic] sign-in validation hit a layout variant, accepting cookie anyway');
|
|
138
|
-
}
|
|
139
|
-
try {
|
|
140
|
-
fs.mkdirSync(CONFIG.ROOT, { recursive: true });
|
|
141
|
-
}
|
|
142
|
-
catch {
|
|
143
|
-
// ignore
|
|
144
|
-
}
|
|
145
|
-
fs.writeFileSync(COOKIE_PATH, clean, 'utf-8');
|
|
146
|
-
authedTube = trial;
|
|
147
|
-
authProbeAt = Date.now();
|
|
148
|
-
authProbeOk = true;
|
|
149
|
-
logger.info('[ytmusic] cookie sign-in validated and saved');
|
|
150
|
-
}
|
|
151
|
-
export async function signOutMusic() {
|
|
152
|
-
try {
|
|
153
|
-
if (fs.existsSync(COOKIE_PATH))
|
|
154
|
-
fs.unlinkSync(COOKIE_PATH);
|
|
155
|
-
}
|
|
156
|
-
catch {
|
|
157
|
-
// ignore
|
|
158
|
-
}
|
|
159
|
-
authedTube = null;
|
|
160
|
-
authProbeAt = 0;
|
|
161
|
-
authProbeOk = false;
|
|
162
|
-
}
|
|
1
|
+
import o from"fs";import v from"path";import{CONFIG as d}from"../config.js";import l from"../logger.js";const a=v.join(d.ROOT,"ytmusic_cookie.txt");let f=null,u=null,h=0;const S=60*1e3;let n=null,m=null,g=!1;async function s(){return m||(m=await import("youtubei.js")),m}async function y(){if(g)return;const{Platform:t,Log:e}=await s();t.shim.eval=(async r=>new Function(r.output)()),e.setLevel(e.Level.ERROR),g=!0}function p(){try{return o.existsSync(a)&&o.readFileSync(a,"utf-8").trim()||null}catch{return null}}function T(){return p()}function I(t){if(!t||typeof t!="object")return!1;if(t.constructor?.name==="ParsingError")return!0;const r=t instanceof Error?t.message:String(t);return/Expected node of any type|Cannot cast \S+ to one of|got ItemSection|is not valid JSON|Incorrect JSPB formatting/i.test(r)}function C(){return f?Promise.resolve(f):Date.now()-h<S?Promise.reject(new Error("YouTube session unavailable (cooling down)")):(u||(u=(async()=>{const{Innertube:t}=await s();await y();try{const e=await t.create({generate_session_locally:!1});return f=e,e}catch(e){throw u=null,h=Date.now(),e}})()),u)}async function P(t=!1){const e=p();if(!e)return n=null,null;if(n&&!t)return n;await y();const{Innertube:r}=await s();return n=await r.create({cookie:e}),n}function k(){n=null}async function E(){k();try{return await P()}catch(t){return l.warn({err:t},"[ytmusic] saved-cookie session refresh failed"),null}}const x=300*1e3;let c=0,i=!1;async function _(){if(!p())return!1;const t=Date.now();if(t-c<x)return i;c=t;try{const e=await P();if(!e)return!1;await e.account.getInfo(),i=!0}catch{i=!1}return i}async function L(){return{authenticated:await _()}}async function D(t){const e=t.trim();if(!e)throw new Error("Cookie is empty");await y();const{Innertube:r}=await s(),b=await r.create({cookie:e});try{await b.music.getLibrary()}catch(w){if(!I(w))throw w;l.warn("[ytmusic] sign-in validation hit a layout variant, accepting cookie anyway")}try{o.mkdirSync(d.ROOT,{recursive:!0})}catch{}o.writeFileSync(a,e,"utf-8"),n=b,c=Date.now(),i=!0,l.info("[ytmusic] cookie sign-in validated and saved")}async function F(){try{o.existsSync(a)&&o.unlinkSync(a)}catch{}n=null,c=0,i=!1}export{P as getAuthedInnertube,C as getInnertube,L as getMusicAuthStatus,T as getMusicCookie,k as invalidateAuthedSession,I as isParserVariantError,E as refreshAuthedInnertube,D as saveMusicCookie,F as signOutMusic,_ as verifyMusicSession};
|
package/server/dist/logger.js
CHANGED
|
@@ -1,16 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
const isDevelopment = process.argv.includes('--dev') || process.env.NODE_ENV === 'development';
|
|
3
|
-
const logger = isDevelopment
|
|
4
|
-
? pino({
|
|
5
|
-
level: 'debug',
|
|
6
|
-
transport: {
|
|
7
|
-
target: 'pino-pretty',
|
|
8
|
-
options: {
|
|
9
|
-
colorize: true,
|
|
10
|
-
translateTime: 'SYS:standard',
|
|
11
|
-
ignore: 'pid,hostname',
|
|
12
|
-
},
|
|
13
|
-
},
|
|
14
|
-
})
|
|
15
|
-
: pino({ level: process.env.LOG_LEVEL || 'info' });
|
|
16
|
-
export default logger;
|
|
1
|
+
import e from"pino";const o=process.argv.includes("--dev")||process.env.NODE_ENV==="development",t=o?e({level:"debug",transport:{target:"pino-pretty",options:{colorize:!0,translateTime:"SYS:standard",ignore:"pid,hostname"}}}):e({level:process.env.LOG_LEVEL||"info"});var n=t;export{n as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|