mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-12-06 15:39:41 +00:00
Compare commits
2 Commits
a98e47a474
...
2341e5ca06
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2341e5ca06 | ||
|
|
50d729f8a0 |
@ -240,25 +240,65 @@ class YoutubeSourcedTrack extends SourcedTrack {
|
|||||||
required Track track,
|
required Track track,
|
||||||
required Ref ref,
|
required Ref ref,
|
||||||
}) async {
|
}) async {
|
||||||
|
List<SiblingType> siblings = [];
|
||||||
|
|
||||||
|
final isrc = track.externalIds?.isrc;
|
||||||
|
if (isrc != null && isrc.isNotEmpty) {
|
||||||
|
final isrcResults =
|
||||||
|
await ref.read(youtubeEngineProvider).searchVideos(isrc.toString());
|
||||||
|
if (isrcResults.isNotEmpty) {
|
||||||
|
final rankedResults = rankResults(
|
||||||
|
isrcResults.map(YoutubeVideoInfo.fromVideo).toList(), track);
|
||||||
|
final matchingResults = <YoutubeVideoInfo>[];
|
||||||
|
for (final video in rankedResults) {
|
||||||
|
final titleWords = video.title
|
||||||
|
.toLowerCase()
|
||||||
|
.replaceAll(RegExp(r'[^a-zA-Z0-9\s]+'), '')
|
||||||
|
.split(RegExp(r'\s+'))
|
||||||
|
.where((item) => item.isNotEmpty)
|
||||||
|
.toList();
|
||||||
|
final nameLower = track.name!
|
||||||
|
.toLowerCase()
|
||||||
|
.replaceAll(RegExp(r'[^a-zA-Z0-9\s]+'), '')
|
||||||
|
.split(RegExp(r'\s+'))
|
||||||
|
.where((item) => item.isNotEmpty)
|
||||||
|
.toList();
|
||||||
|
final matchCount =
|
||||||
|
titleWords.where((word) => nameLower.contains(word)).length;
|
||||||
|
if (matchCount > nameLower.length / 2) {
|
||||||
|
matchingResults.add(video);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (matchingResults.isNotEmpty) {
|
||||||
|
final matchingSiblings =
|
||||||
|
await Future.wait(matchingResults.map((matchingResult) async {
|
||||||
|
try {
|
||||||
|
return await toSiblingType(0, matchingResult, ref);
|
||||||
|
} on VideoUnplayableException catch (e, stack) {
|
||||||
|
// Ignore this error and continue with the search
|
||||||
|
AppLogger.reportError(e, stack);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
siblings.addAll(matchingSiblings.whereType<SiblingType>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
final links = await SongLinkService.links(track.id!);
|
final links = await SongLinkService.links(track.id!);
|
||||||
final ytLink = links.firstWhereOrNull((link) => link.platform == "youtube");
|
final ytLink = links.firstWhereOrNull((link) => link.platform == "youtube");
|
||||||
|
|
||||||
if (ytLink?.url != null
|
if (ytLink?.url != null) {
|
||||||
// allows to fetch siblings more results for already sourced track
|
|
||||||
&&
|
|
||||||
track is! SourcedTrack) {
|
|
||||||
try {
|
try {
|
||||||
return [
|
siblings.add(await toSiblingType(
|
||||||
await toSiblingType(
|
0,
|
||||||
0,
|
YoutubeVideoInfo.fromVideo(
|
||||||
YoutubeVideoInfo.fromVideo(
|
await ref.read(youtubeEngineProvider).getVideo(
|
||||||
await ref.read(youtubeEngineProvider).getVideo(
|
Uri.parse(ytLink!.url!).queryParameters["v"]!,
|
||||||
Uri.parse(ytLink!.url!).queryParameters["v"]!,
|
),
|
||||||
),
|
),
|
||||||
),
|
ref,
|
||||||
ref,
|
));
|
||||||
)
|
|
||||||
];
|
|
||||||
} on VideoUnplayableException catch (e, stack) {
|
} on VideoUnplayableException catch (e, stack) {
|
||||||
// Ignore this error and continue with the search
|
// Ignore this error and continue with the search
|
||||||
AppLogger.reportError(e, stack);
|
AppLogger.reportError(e, stack);
|
||||||
@ -271,20 +311,29 @@ class YoutubeSourcedTrack extends SourcedTrack {
|
|||||||
await ref.read(youtubeEngineProvider).searchVideos(query);
|
await ref.read(youtubeEngineProvider).searchVideos(query);
|
||||||
|
|
||||||
if (ServiceUtils.onlyContainsEnglish(query)) {
|
if (ServiceUtils.onlyContainsEnglish(query)) {
|
||||||
return await Future.wait(searchResults
|
siblings.addAll(await Future.wait(searchResults
|
||||||
.map(YoutubeVideoInfo.fromVideo)
|
.map(YoutubeVideoInfo.fromVideo)
|
||||||
.mapIndexed((index, info) => toSiblingType(index, info, ref)));
|
.mapIndexed((index, info) => toSiblingType(index, info, ref))));
|
||||||
|
} else {
|
||||||
|
final rankedSiblings = rankResults(
|
||||||
|
searchResults.map(YoutubeVideoInfo.fromVideo).toList(),
|
||||||
|
track,
|
||||||
|
);
|
||||||
|
siblings.addAll(await Future.wait(
|
||||||
|
rankedSiblings
|
||||||
|
.mapIndexed((index, info) => toSiblingType(index, info, ref)),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
final rankedSiblings = rankResults(
|
final seenIds = <String>{};
|
||||||
searchResults.map(YoutubeVideoInfo.fromVideo).toList(),
|
// Deduplicate siblings by info.id, keeping the first occurrence
|
||||||
track,
|
return await Future.wait(siblings.map((sibling) async {
|
||||||
);
|
if (!seenIds.contains(sibling.info.id)) {
|
||||||
|
seenIds.add(sibling.info.id);
|
||||||
return await Future.wait(
|
return sibling;
|
||||||
rankedSiblings
|
}
|
||||||
.mapIndexed((index, info) => toSiblingType(index, info, ref)),
|
return null;
|
||||||
);
|
})).then((s) => s.whereType<SiblingType>().toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user