spotube/lib/services/song_link/song_link.dart
Kingkor Roy Tirtho 9095a8c8f8 feat: add songlink based track matching for youtube and open song link button
songlink.com will provide accurate match verified by community for most spotify tracks improving overall match accuracy for Youtube audio source
2024-02-25 11:13:23 +06:00

48 lines
1.3 KiB
Dart

library song_link;
import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:html/parser.dart';
part 'model.dart';
part 'song_link.freezed.dart';
part 'song_link.g.dart';
abstract class SongLinkService {
static Future<List<SongLink>> links(String spotifyId) async {
final dio = Dio();
final res = await dio.get(
"https://song.link/s/$spotifyId",
options: Options(
headers: {
"Accept":
"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
},
responseType: ResponseType.plain,
),
);
final document = parse(res.data);
final script = document.getElementById("__NEXT_DATA__")?.text;
if (script == null) {
return <SongLink>[];
}
final pageProps = jsonDecode(script) as Map<String, dynamic>;
final songLinks =
pageProps["props"]["pageProps"]["pageData"]["sections"].firstWhere(
(section) => section["sectionId"] == "section|auto|links|listen",
)["links"] as List;
return songLinks.map((link) => SongLink.fromJson(link)).toList();
}
}