chore: use scoring for non-english tracks only

This commit is contained in:
Kingkor Roy Tirtho 2023-08-18 15:11:04 +06:00
parent a05ddaeda1
commit 93f0db0196
2 changed files with 50 additions and 41 deletions

View File

@ -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;
? 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());
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;
}
if (isSameChannelArtist || channelContainsArtist) {
score += 1;
}
final titleContainsArtist = sibling.title
.toLowerCase()
.contains(artist.toLowerCase());
final titleContainsArtist = sibling.title
.toLowerCase()
.contains(artist.toLowerCase());
if (titleContainsArtist) {
score += 1;
}
}
if (titleContainsArtist) {
score += 1;
}
}
final titleContainsTrackName = sibling.title
.toLowerCase()
.contains(track.name!.toLowerCase());
final titleContainsTrackName = sibling.title
.toLowerCase()
.contains(track.name!.toLowerCase());
final hasOfficialFlag =
officialMusicRegex.hasMatch(sibling.title.toLowerCase());
final hasOfficialFlag = officialMusicRegex
.hasMatch(sibling.title.toLowerCase());
if (titleContainsTrackName) {
score += 3;
}
if (titleContainsTrackName) {
score += 3;
}
if (hasOfficialFlag) {
score += 1;
}
if (hasOfficialFlag) {
score += 1;
}
if (hasOfficialFlag && titleContainsTrackName) {
score += 2;
}
if (hasOfficialFlag && titleContainsTrackName) {
score += 2;
}
return (sibling: sibling, score: score);
})
.sorted((a, b) => b.score.compareTo(a.score))
.map((e) => e.sibling)
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) =>

View File

@ -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), "")