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 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
- title: `${chalk_1.default.bold(String(idx + 1).padStart(2))}. ${s.name} ${chalk_1.default.gray(`[${s.quality || 'Auto'}] (${s.type || 'stream'})`)}`,
333
- value: s
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;
@@ -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.slice(0, options.pageSize || 15);
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
- let serverName = name;
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: link.includes('googleapiscdn') || link.includes('storage.') ? 'DU (Recommended)' : 'Main Server',
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 ? 'DU (Recommended)' : 'Main Server',
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 = 'Server';
1349
- if (dataSource === 'du')
1350
- serverName = 'DU';
1351
- else if (dataSource === 'hydrax' || dataSource === 'hdx' || dataSource === 'abyss')
1352
- serverName = 'HDX (Abyss)';
1353
- else if (dataSource === 'fb')
1354
- serverName = 'FB Server';
1355
- else if (dataSource === 'gg')
1356
- serverName = 'Google';
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: 'HD',
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
- if (dataHash && !servers.some(s => s.name === serverName)) {
1380
+ const normalizedServerName = this.formatServerName(serverName || dataSource);
1381
+ if (dataHash && !servers.some(s => s.name === normalizedServerName)) {
1379
1382
  servers.push({
1380
- name: serverName || dataSource?.toUpperCase() || 'Server',
1383
+ name: normalizedServerName,
1381
1384
  embedUrl: dataHash,
1382
- quality: 'HD',
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 || 'Backup',
1400
+ name: this.formatServerName(name, src),
1398
1401
  embedUrl: src,
1399
- quality: 'HD',
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 = 'Server';
1412
- if (src.includes('storage.googleapiscdn'))
1413
- name = 'DU (CDN)';
1414
- else if (src.includes('hydrax') || src.includes('abyss.to') || src.includes('abysshost') || src.includes('playhydrax'))
1415
- name = 'HDX (Abyss)';
1416
- else 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';
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: 'HD',
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: 'HD',
1440
+ quality: 'FHD',
1440
1441
  type: 'hls',
1441
1442
  source: 'animevietsub'
1442
1443
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nekostream",
3
- "version": "2026.2.5",
3
+ "version": "2026.2.7",
4
4
  "description": "Bettter version of NekoStream ",
5
5
  "keywords": [
6
6
  "anime",