@@ -509,7 +509,7 @@ export default class SpotifySource {
509509 return searchQuery
510510 }
511511
512- async _findBestMatch ( list , target , original , isExplicit , allowExplicit ) {
512+ async _findBestMatch ( list , target , original , isExplicit , allowExplicit , retried = false ) {
513513 const allowedDurationDiff = target * DURATION_TOLERANCE
514514 const normalizedOriginalTitle = this . _normalize ( original . title )
515515 const normalizedOriginalAuthor = this . _normalize ( original . author )
@@ -523,23 +523,17 @@ export default class SpotifySource {
523523 const normalizedItemAuthor = this . _normalize ( item . info . author )
524524 let score = 0
525525
526- if ( normalizedItemTitle === normalizedOriginalTitle ) {
527- score += 500
528- } else if ( normalizedItemTitle . includes ( normalizedOriginalTitle ) ) {
529- score += 200
530- } else if ( normalizedOriginalTitle . includes ( normalizedItemTitle ) ) {
531- score += 100
532- } else {
533- const titleSimilarity = this . _calculateSimilarity (
534- normalizedOriginalTitle ,
535- normalizedItemTitle
536- )
537- if ( titleSimilarity > 0.7 ) {
538- score += titleSimilarity * 50
539- } else {
540- return { item, score : - 1 }
526+ const originalTitleWords = new Set ( normalizedOriginalTitle . split ( ' ' ) . filter ( w => w . length > 0 ) ) ;
527+ const itemTitleWords = new Set ( normalizedItemTitle . split ( ' ' ) . filter ( w => w . length > 0 ) ) ;
528+
529+ let titleScore = 0 ;
530+ for ( const word of originalTitleWords ) {
531+ if ( itemTitleWords . has ( word ) ) {
532+ titleScore ++ ;
541533 }
542534 }
535+ score += titleScore * 100 ;
536+
543537
544538 const originalArtists = normalizedOriginalAuthor . split ( / , \s * | \s + & \s + / ) . map ( a => a . trim ( ) ) . filter ( Boolean ) ;
545539 let authorMatchScore = 0 ;
@@ -559,9 +553,9 @@ export default class SpotifySource {
559553 }
560554
561555 const titleWords = new Set ( normalizedItemTitle . split ( ' ' ) )
562- const originalTitleWords = new Set ( normalizedOriginalTitle . split ( ' ' ) )
556+ const originalTitleWordsSet = new Set ( normalizedOriginalTitle . split ( ' ' ) )
563557 const extraWords = [ ...titleWords ] . filter (
564- ( word ) => ! originalTitleWords . has ( word )
558+ ( word ) => ! originalTitleWordsSet . has ( word )
565559 )
566560 score -= extraWords . length * 5
567561
@@ -584,13 +578,17 @@ export default class SpotifySource {
584578 return { item, score }
585579 } ) . filter ( ( c ) => c . score >= 0 )
586580
587- if ( scoredCandidates . length === 0 ) {
581+ if ( scoredCandidates . length === 0 && ! retried ) {
588582 const newSearch = await this . nodelink . sources . searchWithDefault ( `${ original . title } ${ original . author } official video` ) ;
589583 if ( newSearch . loadType !== 'search' || newSearch . data . length === 0 ) {
590584 return null ;
591585 }
592586
593- return await this . _findBestMatch ( newSearch . data , target , original , isExplicit , allowExplicit ) ;
587+ return await this . _findBestMatch ( newSearch . data , target , original , isExplicit , allowExplicit , true ) ;
588+ }
589+
590+ if ( scoredCandidates . length === 0 ) {
591+ return null ;
594592 }
595593
596594 scoredCandidates . sort ( ( a , b ) => b . score - a . score )
@@ -601,6 +599,8 @@ export default class SpotifySource {
601599 _normalize ( str ) {
602600 return str
603601 . toLowerCase ( )
602+ . replace ( / f e a t \. ? / g, '' )
603+ . replace ( / f t \. ? / g, '' )
604604 . replace ( / [ ^ \w \s ] / g, '' )
605605 . trim ( )
606606 }
0 commit comments