@serifpersia/dango 3.0.3

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 (141) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +247 -0
  3. package/client/dist/assets/AnimeInfo-CMxs0nRH.css +1 -0
  4. package/client/dist/assets/AnimeInfo-DVdaocCl.js +1 -0
  5. package/client/dist/assets/AnimeInfoPage-Bx5EvGt-.js +2 -0
  6. package/client/dist/assets/Asmr-C2i9GKD4.css +1 -0
  7. package/client/dist/assets/Asmr-CIjmFtRH.js +2 -0
  8. package/client/dist/assets/Asmr.module-DPG2JhDJ.js +1 -0
  9. package/client/dist/assets/AvSyncCalibrator-CIYcyon5.css +1 -0
  10. package/client/dist/assets/AvSyncCalibrator-vqErH7Cm.js +10 -0
  11. package/client/dist/assets/ErrorMessage-BwSjzblw.js +1 -0
  12. package/client/dist/assets/ErrorMessage-CXoRbrLN.css +1 -0
  13. package/client/dist/assets/Home-D7YfGBUk.js +1 -0
  14. package/client/dist/assets/Home-DKCfEiwl.css +1 -0
  15. package/client/dist/assets/Insights-BljI64Ua.css +1 -0
  16. package/client/dist/assets/Insights-CLQGrlpX.js +1 -0
  17. package/client/dist/assets/Manga-DQ9HYnpk.js +1 -0
  18. package/client/dist/assets/Manga-H8Wb04w3.css +1 -0
  19. package/client/dist/assets/Map-CXFqXmsZ.css +1 -0
  20. package/client/dist/assets/Map-L_ryVBTq.js +1 -0
  21. package/client/dist/assets/Mature-BeWzAJ7B.js +1 -0
  22. package/client/dist/assets/Mature-DJmUUtlF.css +1 -0
  23. package/client/dist/assets/Player-CYpd__FP.js +30 -0
  24. package/client/dist/assets/Player-DreAhybc.css +1 -0
  25. package/client/dist/assets/PlayerRedirect-fxUAp9JV.js +1 -0
  26. package/client/dist/assets/PlayerSettings-BcsotxP9.js +1 -0
  27. package/client/dist/assets/PlayerSettings-Cqua1CDD.css +1 -0
  28. package/client/dist/assets/QueueRail-B9Pgbqc3.js +1 -0
  29. package/client/dist/assets/QueueRail-BnaltOP8.css +1 -0
  30. package/client/dist/assets/Radio-BvdY5twD.js +1 -0
  31. package/client/dist/assets/Radio-CUuYy3DY.css +1 -0
  32. package/client/dist/assets/Search-BzO-aRP7.css +1 -0
  33. package/client/dist/assets/Search-R9YLAXS1.js +1 -0
  34. package/client/dist/assets/Search.module-D8ZbQAiK.js +1 -0
  35. package/client/dist/assets/Settings-9kYcXdTR.js +21 -0
  36. package/client/dist/assets/Settings-DF8JThUL.css +1 -0
  37. package/client/dist/assets/SkeletonGrid-D5vRvX5q.js +1 -0
  38. package/client/dist/assets/SkeletonGrid-DEbYtO4H.css +1 -0
  39. package/client/dist/assets/SynopsisText-BlFw0R-0.js +1 -0
  40. package/client/dist/assets/SynopsisText-CUgOjOxt.css +1 -0
  41. package/client/dist/assets/Trackers-DfZlnnVq.js +2 -0
  42. package/client/dist/assets/Trackers-Dt9lR_uP.css +1 -0
  43. package/client/dist/assets/Tv-CVKC2YBs.css +1 -0
  44. package/client/dist/assets/Tv-Db1Wx_b7.js +15 -0
  45. package/client/dist/assets/Watchlist-B2nkNZqM.css +1 -0
  46. package/client/dist/assets/Watchlist-a77CYtzu.js +1 -0
  47. package/client/dist/assets/hls-6Owgw2Aj.js +1 -0
  48. package/client/dist/assets/hls-BOLXTnjL.js +42 -0
  49. package/client/dist/assets/index-B6qdXFtl.css +1 -0
  50. package/client/dist/assets/index-B8TPVaIS.js +30354 -0
  51. package/client/dist/assets/index-CpjgU8ou.js +178 -0
  52. package/client/dist/assets/useAnimeInfoData-BOfyi9UJ.js +1 -0
  53. package/client/dist/assets/useIsMobile-CM15uQn8.css +1 -0
  54. package/client/dist/assets/useIsMobile-Cb8HcKRj.js +1 -0
  55. package/client/dist/assets/useMatureConsent-CZMYBVXd.js +1 -0
  56. package/client/dist/assets/vendor-rLNfZm7Y.js +1 -0
  57. package/client/dist/av-sync-test.mp4 +0 -0
  58. package/client/dist/favicon.ico +0 -0
  59. package/client/dist/index.html +31 -0
  60. package/client/dist/logo-mochi.png +0 -0
  61. package/client/dist/logo-sakura.png +0 -0
  62. package/client/dist/logo.png +0 -0
  63. package/client/dist/placeholder.svg +4 -0
  64. package/client/dist/robots.txt +3 -0
  65. package/orchestrator.js +416 -0
  66. package/package.json +89 -0
  67. package/server/dist/app-auth.js +231 -0
  68. package/server/dist/config.js +133 -0
  69. package/server/dist/controllers/auth.controller.js +247 -0
  70. package/server/dist/controllers/data.controller.js +785 -0
  71. package/server/dist/controllers/insights.controller.js +197 -0
  72. package/server/dist/controllers/proxy.controller.js +665 -0
  73. package/server/dist/controllers/settings.controller.js +267 -0
  74. package/server/dist/controllers/watchlist.controller.js +967 -0
  75. package/server/dist/db.js +152 -0
  76. package/server/dist/discord-gateway.js +381 -0
  77. package/server/dist/discord-rpc.js +424 -0
  78. package/server/dist/github-sync.js +403 -0
  79. package/server/dist/google.js +549 -0
  80. package/server/dist/lib/anilist.js +1519 -0
  81. package/server/dist/lib/anischedule.js +202 -0
  82. package/server/dist/lib/ipc.js +32 -0
  83. package/server/dist/lib/kitsu.js +552 -0
  84. package/server/dist/lib/mal.js +886 -0
  85. package/server/dist/lib/migration.js +335 -0
  86. package/server/dist/lib/temp-ids.js +11 -0
  87. package/server/dist/lib/tmdb.js +71 -0
  88. package/server/dist/lib/tracker/anilist-tracker.js +250 -0
  89. package/server/dist/lib/tracker/sync.service.js +312 -0
  90. package/server/dist/logger.js +19 -0
  91. package/server/dist/providers/123anime.provider.js +240 -0
  92. package/server/dist/providers/anilight.provider.js +366 -0
  93. package/server/dist/providers/animepahe.provider.js +531 -0
  94. package/server/dist/providers/animeya.provider.js +746 -0
  95. package/server/dist/providers/base-provider.js +45 -0
  96. package/server/dist/providers/hn.provider.js +473 -0
  97. package/server/dist/providers/ht.provider.js +439 -0
  98. package/server/dist/providers/jasmr.provider.js +504 -0
  99. package/server/dist/providers/kaa.provider.js +388 -0
  100. package/server/dist/providers/manga/manga.types.js +10 -0
  101. package/server/dist/providers/manga/mangadex.provider.js +227 -0
  102. package/server/dist/providers/manga/mangapill.provider.js +232 -0
  103. package/server/dist/providers/megaplay.provider.js +583 -0
  104. package/server/dist/providers/op.provider.js +440 -0
  105. package/server/dist/providers/provider.interface.js +2 -0
  106. package/server/dist/providers/title-matching.js +234 -0
  107. package/server/dist/providers/wh.provider.js +600 -0
  108. package/server/dist/rclone.js +126 -0
  109. package/server/dist/repositories/insights.repository.js +43 -0
  110. package/server/dist/repositories/mal-cache.repository.js +66 -0
  111. package/server/dist/repositories/notifications.repository.js +40 -0
  112. package/server/dist/repositories/queue.repository.js +64 -0
  113. package/server/dist/repositories/settings.repository.js +15 -0
  114. package/server/dist/repositories/shows-meta.repository.js +43 -0
  115. package/server/dist/repositories/temp-show-ids.repository.js +54 -0
  116. package/server/dist/repositories/watched-episodes.repository.js +54 -0
  117. package/server/dist/repositories/watchlist.repository.js +74 -0
  118. package/server/dist/routes/asmr.routes.js +72 -0
  119. package/server/dist/routes/auth.routes.js +28 -0
  120. package/server/dist/routes/data.routes.js +50 -0
  121. package/server/dist/routes/discord-gateway.routes.js +57 -0
  122. package/server/dist/routes/insights.routes.js +12 -0
  123. package/server/dist/routes/lan-auth.routes.js +49 -0
  124. package/server/dist/routes/manga.routes.js +115 -0
  125. package/server/dist/routes/proxy.routes.js +15 -0
  126. package/server/dist/routes/radio.routes.js +143 -0
  127. package/server/dist/routes/settings.routes.js +27 -0
  128. package/server/dist/routes/tracker.routes.js +143 -0
  129. package/server/dist/routes/translate.routes.js +90 -0
  130. package/server/dist/routes/tv.routes.js +843 -0
  131. package/server/dist/routes/watchlist.routes.js +312 -0
  132. package/server/dist/server.js +310 -0
  133. package/server/dist/shipped-defaults.js +8 -0
  134. package/server/dist/sync-config.js +32 -0
  135. package/server/dist/sync.js +506 -0
  136. package/server/dist/utils/cookie.utils.js +17 -0
  137. package/server/dist/utils/db-utils.js +15 -0
  138. package/server/dist/utils/env.utils.js +83 -0
  139. package/server/dist/utils/machine-id.js +46 -0
  140. package/server/dist/utils/request-context.js +5 -0
  141. package/server/dist/utils/security.utils.js +99 -0
@@ -0,0 +1,232 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.MangaPillProvider = void 0;
40
+ const cheerio = __importStar(require("cheerio"));
41
+ const logger_1 = __importDefault(require("../../logger"));
42
+ const BASE = 'https://www.mangapill.com';
43
+ const UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36';
44
+ async function fetchHtml(url) {
45
+ const res = await fetch(url, {
46
+ headers: {
47
+ 'User-Agent': UA,
48
+ Referer: `${BASE}/`,
49
+ Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
50
+ },
51
+ signal: AbortSignal.timeout(20000),
52
+ });
53
+ if (!res.ok)
54
+ throw new Error(`MangaPill HTTP ${res.status}: ${url}`);
55
+ return res.text();
56
+ }
57
+ function mangaIdFromHref(href) {
58
+ const m = href.match(/^\/manga\/(\d+)/);
59
+ return m ? m[1] : href;
60
+ }
61
+ class MangaPillProvider {
62
+ name = 'mangapill';
63
+ cache;
64
+ constructor(cache) {
65
+ this.cache = cache;
66
+ }
67
+ async search(options) {
68
+ const { query = '', type = '', status = '' } = options;
69
+ const params = new URLSearchParams();
70
+ if (query.trim())
71
+ params.set('q', query.trim());
72
+ if (type)
73
+ params.set('type', type);
74
+ if (status)
75
+ params.set('status', status);
76
+ if ([...params.keys()].length === 0) {
77
+ params.set('type', 'manga');
78
+ }
79
+ const cacheKey = `manga-pill-search-${params.toString()}`;
80
+ const cached = this.cache.get(cacheKey);
81
+ if (cached)
82
+ return cached;
83
+ try {
84
+ const html = await fetchHtml(`${BASE}/search?${params.toString()}`);
85
+ const $ = cheerio.load(html);
86
+ const hrefs = new Set();
87
+ $('a[href^="/manga/"]').each((_, el) => {
88
+ const href = $(el).attr('href') || '';
89
+ if (/^\/manga\/\d+\//.test(href))
90
+ hrefs.add(href);
91
+ });
92
+ const items = [];
93
+ for (const href of hrefs) {
94
+ const id = mangaIdFromHref(href);
95
+ const anchors = $(`a[href="${href}"]`);
96
+ let title = '';
97
+ let cover = '';
98
+ anchors.each((_, el) => {
99
+ const t = $(el).find('.line-clamp-2').first().text().trim();
100
+ if (t && !title)
101
+ title = t;
102
+ const img = $(el).find('img[data-src], img[src]').first();
103
+ if (img.length && !cover)
104
+ cover = img.attr('data-src') || img.attr('src') || '';
105
+ });
106
+ const scope = anchors.first().parent();
107
+ const badges = scope
108
+ .find('.bg-purple-500, .bg-orange-500, .bg-green-500')
109
+ .map((__, b) => $(b).text().trim())
110
+ .get();
111
+ const genres = scope
112
+ .find('.bg-card.rounded')
113
+ .map((__, g) => $(g).text().trim())
114
+ .get()
115
+ .filter(Boolean);
116
+ items.push({
117
+ id,
118
+ provider: 'mangapill',
119
+ title: title || `Manga ${id}`,
120
+ cover: cover.startsWith('http') ? cover : cover ? `${BASE}${cover}` : '',
121
+ type: badges[0],
122
+ year: badges[1] ? parseInt(badges[1]) || null : null,
123
+ status: badges[2],
124
+ genres: genres.slice(0, 6),
125
+ });
126
+ }
127
+ const result = { items, hasNext: false };
128
+ this.cache.set(cacheKey, result, 300);
129
+ return result;
130
+ }
131
+ catch (err) {
132
+ logger_1.default.error({ err }, '[MangaPill] search failed');
133
+ return { items: [], hasNext: false };
134
+ }
135
+ }
136
+ async getDetail(id) {
137
+ const cacheKey = `manga-pill-detail-${id}`;
138
+ const cached = this.cache.get(cacheKey);
139
+ if (cached)
140
+ return cached;
141
+ try {
142
+ const html = await fetchHtml(`${BASE}/manga/${id}`);
143
+ const $ = cheerio.load(html);
144
+ const title = $('h1').first().text().trim() || `Manga ${id}`;
145
+ const cover = $('img[data-src], img[src]')
146
+ .map((_, img) => $(img).attr('data-src') || $(img).attr('src') || '')
147
+ .get()
148
+ .find((s) => s.includes('mangapill') || s.includes('readdetectiveconan')) || '';
149
+ const description = $('.text-secondary').first().text().trim().slice(0, 2000) || undefined;
150
+ const chapters = this.parseChapters($, id);
151
+ const detail = {
152
+ id,
153
+ provider: 'mangapill',
154
+ title,
155
+ cover,
156
+ description,
157
+ chapters,
158
+ };
159
+ this.cache.set(cacheKey, detail, 600);
160
+ return detail;
161
+ }
162
+ catch (err) {
163
+ logger_1.default.error({ err, id }, '[MangaPill] detail failed');
164
+ return null;
165
+ }
166
+ }
167
+ async getChapters(id) {
168
+ const detail = await this.getDetail(id);
169
+ return detail?.chapters || [];
170
+ }
171
+ parseChapters($, mangaId) {
172
+ const chapters = [];
173
+ const seen = new Set();
174
+ $('a[href^="/chapters/"]').each((_, el) => {
175
+ const href = $(el).attr('href') || '';
176
+ const m = href.match(/^\/chapters\/(\d+)-(\d+)\/(.*)-chapter-([\d.]+)$/);
177
+ if (!m)
178
+ return;
179
+ if (seen.has(href))
180
+ return;
181
+ seen.add(href);
182
+ const label = $(el).text().trim().replace(/\s+/g, ' ');
183
+ chapters.push({
184
+ id: href.replace(/^\//, ''),
185
+ provider: 'mangapill',
186
+ mangaId,
187
+ number: m[4],
188
+ title: label && !/^chapter\s*[\d.]+$/i.test(label) ? label : undefined,
189
+ });
190
+ });
191
+ chapters.sort((a, b) => {
192
+ const na = parseFloat(a.number);
193
+ const nb = parseFloat(b.number);
194
+ if (!Number.isNaN(na) && !Number.isNaN(nb) && na !== nb)
195
+ return na - nb;
196
+ return a.number.localeCompare(b.number, undefined, { numeric: true });
197
+ });
198
+ return chapters;
199
+ }
200
+ async getPages(chapterId) {
201
+ const cacheKey = `manga-pill-pages-${chapterId}`;
202
+ const cached = this.cache.get(cacheKey);
203
+ if (cached)
204
+ return cached;
205
+ try {
206
+ const path = chapterId.startsWith('chapters/') ? `/${chapterId}` : `/chapters/${chapterId}`;
207
+ const html = await fetchHtml(`${BASE}${path}`);
208
+ const $ = cheerio.load(html);
209
+ const pages = [];
210
+ $('picture img').each((_, img) => {
211
+ const src = $(img).attr('data-src') || $(img).attr('src') || '';
212
+ if (/cdn\.readdetectiveconan\.com\/file\/mangap\//.test(src))
213
+ pages.push(src);
214
+ });
215
+ if (pages.length === 0) {
216
+ $('img').each((_, img) => {
217
+ const src = $(img).attr('data-src') || $(img).attr('src') || '';
218
+ if (/cdn\.readdetectiveconan\.com\/file\/mangap\//.test(src) && !pages.includes(src)) {
219
+ pages.push(src);
220
+ }
221
+ });
222
+ }
223
+ this.cache.set(cacheKey, pages, 1800);
224
+ return pages;
225
+ }
226
+ catch (err) {
227
+ logger_1.default.error({ err, chapterId }, '[MangaPill] pages failed');
228
+ return [];
229
+ }
230
+ }
231
+ }
232
+ exports.MangaPillProvider = MangaPillProvider;