1- import { encodeTrack , getBestMatch , http1makeRequest , logger } from '../utils.js'
1+ import {
2+ encodeTrack ,
3+ getBestMatch ,
4+ http1makeRequest ,
5+ logger
6+ } from '../utils.js'
27import crypto from 'node:crypto'
38
49const BOT_USER_AGENT =
5- 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
10+ 'Mozilla/5.0 (compatible; NodeLinkBot/0.1; +https://nodelink.js.org/)'
11+ const SEARCH_USER_AGENT =
12+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36'
613
714function parseISO8601Duration ( duration ) {
815 if ( ! duration ) return 0
@@ -324,7 +331,7 @@ export default class AmazonMusicSource {
324331 }
325332
326333 async search ( query , _sourceTerm ) {
327- const headersUA = { 'User-Agent' : BOT_USER_AGENT }
334+ const headersUA = { 'User-Agent' : SEARCH_USER_AGENT }
328335
329336 const decodeAmp = ( v ) =>
330337 typeof v === 'string' ? v . replaceAll ( '&' , '&' ) : v
@@ -369,12 +376,11 @@ export default class AmazonMusicSource {
369376
370377 const config = configRes . body
371378 const { accessToken, sessionId, deviceId, csrf } = config
372- if ( ! csrf ?. token ) throw new Error ( 'Failed to retrieve CSRF token from config' )
379+ if ( ! csrf ?. token )
380+ throw new Error ( 'Failed to retrieve CSRF token from config' )
373381
374382 const finalDeviceId =
375- deviceId && ! deviceId . startsWith ( '000' )
376- ? deviceId
377- : '13580682033287541'
383+ deviceId && ! deviceId . startsWith ( '000' ) ? deviceId : '13580682033287541'
378384 const finalSessionId =
379385 sessionId && ! sessionId . startsWith ( '000' )
380386 ? sessionId
@@ -402,7 +408,7 @@ export default class AmazonMusicSource {
402408 'x-amzn-device-height' : '1080' ,
403409 'x-amzn-device-family' : 'WebPlayer' ,
404410 'x-amzn-device-id' : finalDeviceId ,
405- 'x-amzn-user-agent' : BOT_USER_AGENT ,
411+ 'x-amzn-user-agent' : SEARCH_USER_AGENT ,
406412 'x-amzn-session-id' : finalSessionId ,
407413 'x-amzn-request-id' : crypto . randomUUID ( ) ,
408414 'x-amzn-device-language' : 'en_US' ,
@@ -443,16 +449,26 @@ export default class AmazonMusicSource {
443449 )
444450
445451 if ( searchRes . statusCode !== 200 ) {
446- logger ( 'error' , 'AmazonMusic' , `Search API returned ${ searchRes . statusCode } ` )
452+ logger (
453+ 'error' ,
454+ 'AmazonMusic' ,
455+ `Search API returned ${ searchRes . statusCode } `
456+ )
447457 return { loadType : 'empty' , data : { } }
448458 }
449459
450460 let data
451461 try {
452462 data =
453- typeof searchRes . body === 'string' ? JSON . parse ( searchRes . body ) : searchRes . body
463+ typeof searchRes . body === 'string'
464+ ? JSON . parse ( searchRes . body )
465+ : searchRes . body
454466 } catch ( e ) {
455- logger ( 'error' , 'AmazonMusic' , `Failed to parse search response: ${ e . message } ` )
467+ logger (
468+ 'error' ,
469+ 'AmazonMusic' ,
470+ `Failed to parse search response: ${ e . message } `
471+ )
456472 return { loadType : 'empty' , data : { } }
457473 }
458474
@@ -469,14 +485,16 @@ export default class AmazonMusicSource {
469485 for ( let j = 0 ; j < items . length ; j ++ ) {
470486 const item = items [ j ]
471487 const isSong = item ?. label === 'song'
472- const isSquare = typeof item ?. interface === 'string' &&
488+ const isSquare =
489+ typeof item ?. interface === 'string' &&
473490 item . interface . includes ( 'SquareHorizontalItemElement' )
474491 if ( ! isSong && ! isSquare ) continue
475492
476493 const deeplink = item ?. primaryLink ?. deeplink
477494 const identifier = extractIdentifier ( deeplink )
478495 if ( ! identifier ) continue
479- if ( ! isSong && ( ! deeplink || deeplink . indexOf ( 'trackAsin=' ) === - 1 ) ) continue
496+ if ( ! isSong && ( ! deeplink || deeplink . indexOf ( 'trackAsin=' ) === - 1 ) )
497+ continue
480498
481499 tracks . push ( {
482500 identifier,
@@ -567,4 +585,4 @@ export default class AmazonMusicSource {
567585 async loadStream ( ) {
568586 return null
569587 }
570- }
588+ }
0 commit comments