RhythmBox/lib/services/song_link/song_link.dart

52 lines
1.5 KiB
Dart
Raw Permalink Normal View History

library song_link;
import 'dart:convert';
import 'dart:developer';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:get/get.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 {
try {
final client = GetConnect();
final res = await client.get(
2024-08-27 06:48:31 +00:00
'https://song.link/s/$spotifyId',
headers: {
2024-08-27 06:48:31 +00:00
'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'
},
);
final document = parse(res.body);
2024-08-27 06:48:31 +00:00
final script = document.getElementById('__NEXT_DATA__')?.text;
if (script == null) {
return <SongLink>[];
}
final pageProps = jsonDecode(script) as Map<String, dynamic>;
2024-08-27 06:48:31 +00:00
final songLinks = pageProps['props']?['pageProps']?['pageData']
?['sections']
?.firstWhere(
2024-08-27 06:48:31 +00:00
(section) => section?['sectionId'] == 'section|auto|links|listen',
)?['links'] as List?;
return songLinks?.map((link) => SongLink.fromJson(link)).toList() ??
<SongLink>[];
} catch (e) {
log('[SongLink] Unable get song link: $e');
return <SongLink>[];
}
}
}