mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-16 17:05:17 +00:00

songlink.com will provide accurate match verified by community for most spotify tracks improving overall match accuracy for Youtube audio source
48 lines
1.3 KiB
Dart
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();
|
|
}
|
|
}
|