nekostream 2026.2.5 → 2026.2.7
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/dist/index.js +11 -4
- package/dist/prompts-wrapper.js +1 -1
- package/dist/scrapers/providers/animevietsub.js +40 -39
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -328,10 +328,17 @@ async function openAnimeMenu(providerName, animeId) {
|
|
|
328
328
|
type: 'select',
|
|
329
329
|
name: 'server',
|
|
330
330
|
message: 'Chọn server phát (Esc: quay lại)',
|
|
331
|
-
choices: servers.map((s, idx) =>
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
331
|
+
choices: servers.map((s, idx) => {
|
|
332
|
+
const number = chalk_1.default.bold(`${idx + 1}.`);
|
|
333
|
+
const quality = chalk_1.default.gray(`[${s.quality || 'Auto'}]`);
|
|
334
|
+
const detail = providerName === 'animevietsub'
|
|
335
|
+
? quality
|
|
336
|
+
: chalk_1.default.gray(`[${s.quality || 'Auto'}] (${s.type || 'stream'})`);
|
|
337
|
+
return {
|
|
338
|
+
title: `${number} ${s.name} ${detail}`,
|
|
339
|
+
value: s
|
|
340
|
+
};
|
|
341
|
+
})
|
|
335
342
|
});
|
|
336
343
|
if (!server)
|
|
337
344
|
break;
|
package/dist/prompts-wrapper.js
CHANGED
|
@@ -286,7 +286,7 @@ async function prompts(options) {
|
|
|
286
286
|
source: async (term) => {
|
|
287
287
|
const query = normalized(term || '');
|
|
288
288
|
if (!query)
|
|
289
|
-
return baseChoices
|
|
289
|
+
return baseChoices;
|
|
290
290
|
return baseChoices.filter((choice, index) => {
|
|
291
291
|
const haystack = normalized(`${index + 1} ${choice.name || ''} ${choice.description || ''}`);
|
|
292
292
|
return haystack.includes(query);
|
|
@@ -64,6 +64,16 @@ class AnimeVietsubProvider extends base_1.BaseScraper {
|
|
|
64
64
|
secChUaPlatform: '"Windows"',
|
|
65
65
|
acceptLanguage: 'vi-VN,vi;q=0.9,en-US;q=0.8,en;q=0.7',
|
|
66
66
|
};
|
|
67
|
+
formatServerName(nameOrSource, url) {
|
|
68
|
+
const value = `${nameOrSource || ''} ${url || ''}`.toLowerCase();
|
|
69
|
+
if (value.includes('du') || value.includes('googleapiscdn') || value.includes('storage.')) {
|
|
70
|
+
return 'DU (Normal Speed Fetch/Sometime Unstable)';
|
|
71
|
+
}
|
|
72
|
+
if (value.includes('hdx') || value.includes('hydrax') || value.includes('abyss') || value.includes('playhydrax')) {
|
|
73
|
+
return 'HDX (Fastest Speed Fetch/Very Stable)';
|
|
74
|
+
}
|
|
75
|
+
return nameOrSource?.trim() || 'Server';
|
|
76
|
+
}
|
|
67
77
|
normalizeBaseUrl(value) {
|
|
68
78
|
const url = value.startsWith('http') ? value : `https://${value}`;
|
|
69
79
|
return url.replace(/\/$/, '');
|
|
@@ -1233,13 +1243,7 @@ class AnimeVietsubProvider extends base_1.BaseScraper {
|
|
|
1233
1243
|
const dataPlay = $el.attr('data-play') || 'iframe';
|
|
1234
1244
|
const dataHref = $el.attr('data-href') || '';
|
|
1235
1245
|
const dataId = $el.attr('data-id') || '';
|
|
1236
|
-
|
|
1237
|
-
if (name.toLowerCase().includes('du'))
|
|
1238
|
-
serverName = 'DU (Recommended)';
|
|
1239
|
-
else if (name.toLowerCase().includes('hdx'))
|
|
1240
|
-
serverName = 'HDX (Abyss)';
|
|
1241
|
-
else if (name.toLowerCase().includes('hydrax'))
|
|
1242
|
-
serverName = 'Hydrax (Abyss)';
|
|
1246
|
+
const serverName = this.formatServerName(name, dataHref);
|
|
1243
1247
|
if (dataHref) {
|
|
1244
1248
|
// Construct composite query parameters
|
|
1245
1249
|
const params = new URLSearchParams({
|
|
@@ -1280,7 +1284,7 @@ class AnimeVietsubProvider extends base_1.BaseScraper {
|
|
|
1280
1284
|
if (data?.link) {
|
|
1281
1285
|
const link = String(data.link);
|
|
1282
1286
|
servers.push({
|
|
1283
|
-
name:
|
|
1287
|
+
name: this.formatServerName(undefined, link),
|
|
1284
1288
|
embedUrl: link,
|
|
1285
1289
|
quality: 'FHD',
|
|
1286
1290
|
type: data.playTech || 'iframe',
|
|
@@ -1319,7 +1323,7 @@ class AnimeVietsubProvider extends base_1.BaseScraper {
|
|
|
1319
1323
|
playerData.link.includes('storage.');
|
|
1320
1324
|
const quality = 'FHD';
|
|
1321
1325
|
servers.push({
|
|
1322
|
-
name: isDUServer ? '
|
|
1326
|
+
name: this.formatServerName(isDUServer ? 'du' : undefined, playerData.link),
|
|
1323
1327
|
embedUrl: playerData.link,
|
|
1324
1328
|
quality,
|
|
1325
1329
|
type: playerData.playTech, // 'iframe', 'api', 'embed'
|
|
@@ -1345,23 +1349,21 @@ class AnimeVietsubProvider extends base_1.BaseScraper {
|
|
|
1345
1349
|
if (!isActive || !dataHash)
|
|
1346
1350
|
return;
|
|
1347
1351
|
// Create server entry based on data-source
|
|
1348
|
-
let serverName =
|
|
1349
|
-
if (
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
else if (dataSource)
|
|
1358
|
-
serverName = dataSource.toUpperCase();
|
|
1352
|
+
let serverName = this.formatServerName(dataSource);
|
|
1353
|
+
if (serverName === 'Server') {
|
|
1354
|
+
if (dataSource === 'fb')
|
|
1355
|
+
serverName = 'FB Server';
|
|
1356
|
+
else if (dataSource === 'gg')
|
|
1357
|
+
serverName = 'Google';
|
|
1358
|
+
else if (dataSource)
|
|
1359
|
+
serverName = dataSource.toUpperCase();
|
|
1360
|
+
}
|
|
1359
1361
|
// Don't add duplicates
|
|
1360
1362
|
if (!servers.some(s => s.name.includes(serverName))) {
|
|
1361
1363
|
servers.push({
|
|
1362
1364
|
name: serverName,
|
|
1363
1365
|
embedUrl: dataHash, // This is the encrypted hash to decode
|
|
1364
|
-
quality: '
|
|
1366
|
+
quality: 'FHD',
|
|
1365
1367
|
type: dataPlay || 'api',
|
|
1366
1368
|
source: 'animevietsub'
|
|
1367
1369
|
});
|
|
@@ -1375,11 +1377,12 @@ class AnimeVietsubProvider extends base_1.BaseScraper {
|
|
|
1375
1377
|
const dataHash = $activeEp.attr('data-hash');
|
|
1376
1378
|
const dataPlay = $activeEp.attr('data-play');
|
|
1377
1379
|
const dataSource = $activeEp.attr('data-source');
|
|
1378
|
-
|
|
1380
|
+
const normalizedServerName = this.formatServerName(serverName || dataSource);
|
|
1381
|
+
if (dataHash && !servers.some(s => s.name === normalizedServerName)) {
|
|
1379
1382
|
servers.push({
|
|
1380
|
-
name:
|
|
1383
|
+
name: normalizedServerName,
|
|
1381
1384
|
embedUrl: dataHash,
|
|
1382
|
-
quality: '
|
|
1385
|
+
quality: 'FHD',
|
|
1383
1386
|
type: dataPlay || 'api',
|
|
1384
1387
|
source: 'animevietsub'
|
|
1385
1388
|
});
|
|
@@ -1394,9 +1397,9 @@ class AnimeVietsubProvider extends base_1.BaseScraper {
|
|
|
1394
1397
|
src = `https:${src}`;
|
|
1395
1398
|
if (src && src.startsWith('http') && !servers.some(s => s.embedUrl === src)) {
|
|
1396
1399
|
servers.push({
|
|
1397
|
-
name: name
|
|
1400
|
+
name: this.formatServerName(name, src),
|
|
1398
1401
|
embedUrl: src,
|
|
1399
|
-
quality: '
|
|
1402
|
+
quality: 'FHD',
|
|
1400
1403
|
source: 'animevietsub'
|
|
1401
1404
|
});
|
|
1402
1405
|
}
|
|
@@ -1408,21 +1411,19 @@ class AnimeVietsubProvider extends base_1.BaseScraper {
|
|
|
1408
1411
|
if (src.startsWith('//'))
|
|
1409
1412
|
src = `https:${src}`;
|
|
1410
1413
|
if (src && src.startsWith('http')) {
|
|
1411
|
-
let name =
|
|
1412
|
-
if (
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
else if (src.includes('drive.google'))
|
|
1421
|
-
name = 'Google Drive';
|
|
1414
|
+
let name = this.formatServerName(undefined, src);
|
|
1415
|
+
if (name === 'Server') {
|
|
1416
|
+
if (src.includes('fb') || src.includes('facebook'))
|
|
1417
|
+
name = 'FB';
|
|
1418
|
+
else if (src.includes('stream'))
|
|
1419
|
+
name = 'Stream';
|
|
1420
|
+
else if (src.includes('drive.google'))
|
|
1421
|
+
name = 'Google Drive';
|
|
1422
|
+
}
|
|
1422
1423
|
servers.push({
|
|
1423
1424
|
name,
|
|
1424
1425
|
embedUrl: src,
|
|
1425
|
-
quality: '
|
|
1426
|
+
quality: 'FHD',
|
|
1426
1427
|
type: 'iframe',
|
|
1427
1428
|
source: 'animevietsub'
|
|
1428
1429
|
});
|
|
@@ -1436,7 +1437,7 @@ class AnimeVietsubProvider extends base_1.BaseScraper {
|
|
|
1436
1437
|
servers.push({
|
|
1437
1438
|
name: 'Direct HLS',
|
|
1438
1439
|
embedUrl: scriptMatch[1],
|
|
1439
|
-
quality: '
|
|
1440
|
+
quality: 'FHD',
|
|
1440
1441
|
type: 'hls',
|
|
1441
1442
|
source: 'animevietsub'
|
|
1442
1443
|
});
|