Skip to content

Commit

Permalink
chore: use scoring for non-english tracks only
Browse files Browse the repository at this point in the history
  • Loading branch information
KRTirtho committed Aug 18, 2023
1 parent a05ddae commit 93f0db0
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 51 deletions.
104 changes: 53 additions & 51 deletions lib/models/spotube_track.dart
Expand Up @@ -68,62 +68,64 @@ class SpotubeTrack extends Track {
onlyCleanArtist: true,
).trim();

final List<YoutubeVideoInfo> siblings =
await client.search("$title - ${artists.join(", ")}").then(
final query = "$title - ${artists.join(", ")}";
final List<YoutubeVideoInfo> siblings = await client.search(query).then(
(res) {
final isYoutubeApi =
client.preferences.youtubeApiType == YoutubeApiType.youtube;
final siblings = isYoutubeApi ||
client.preferences.searchMode == SearchMode.youtube
? res
.sorted((a, b) => b.views.compareTo(a.views))
.map((sibling) {
int score = 0;

for (final artist in artists) {
final isSameChannelArtist =
sibling.channelName.toLowerCase() ==
artist.toLowerCase();
final channelContainsArtist = sibling.channelName
.toLowerCase()
.contains(artist.toLowerCase());

if (isSameChannelArtist || channelContainsArtist) {
score += 1;
}

final titleContainsArtist = sibling.title
.toLowerCase()
.contains(artist.toLowerCase());

if (titleContainsArtist) {
score += 1;
}
}

final titleContainsTrackName = sibling.title
.toLowerCase()
.contains(track.name!.toLowerCase());

final hasOfficialFlag =
officialMusicRegex.hasMatch(sibling.title.toLowerCase());

if (titleContainsTrackName) {
score += 3;
}

if (hasOfficialFlag) {
score += 1;
}

if (hasOfficialFlag && titleContainsTrackName) {
score += 2;
}

return (sibling: sibling, score: score);
})
.sorted((a, b) => b.score.compareTo(a.score))
.map((e) => e.sibling)
? ServiceUtils.onlyContainsEnglish(query)
? res
: res
.sorted((a, b) => b.views.compareTo(a.views))
.map((sibling) {
int score = 0;

for (final artist in artists) {
final isSameChannelArtist =
sibling.channelName.toLowerCase() ==
artist.toLowerCase();
final channelContainsArtist = sibling.channelName
.toLowerCase()
.contains(artist.toLowerCase());

if (isSameChannelArtist || channelContainsArtist) {
score += 1;
}

final titleContainsArtist = sibling.title
.toLowerCase()
.contains(artist.toLowerCase());

if (titleContainsArtist) {
score += 1;
}
}

final titleContainsTrackName = sibling.title
.toLowerCase()
.contains(track.name!.toLowerCase());

final hasOfficialFlag = officialMusicRegex
.hasMatch(sibling.title.toLowerCase());

if (titleContainsTrackName) {
score += 3;
}

if (hasOfficialFlag) {
score += 1;
}

if (hasOfficialFlag && titleContainsTrackName) {
score += 2;
}

return (sibling: sibling, score: score);
})
.sorted((a, b) => b.score.compareTo(a.score))
.map((e) => e.sibling)
: res.sorted((a, b) => b.views.compareTo(a.views)).where((item) {
return artists.any(
(artist) =>
Expand Down
7 changes: 7 additions & 0 deletions lib/utils/service_utils.dart
Expand Up @@ -17,6 +17,13 @@ import 'package:html/parser.dart' as parser;
abstract class ServiceUtils {
static final logger = getLogger("ServiceUtils");

static final _englishMatcherRegex = RegExp(
"^[a-zA-Z0-9\\s!\"#\$%&\\'()*+,-.\\/:;<=>?@\\[\\]^_`{|}~]*\$",
);
static bool onlyContainsEnglish(String text) {
return _englishMatcherRegex.hasMatch(text);
}

static String clearArtistsOfTitle(String title, List<String> artists) {
return title
.replaceAll(RegExp(artists.join("|"), caseSensitive: false), "")
Expand Down

0 comments on commit 93f0db0

Please sign in to comment.