From a850ed270b9412a69fb4717cc0ce6368e59e1c65 Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Sun, 25 Feb 2024 22:06:47 +0600 Subject: [PATCH] chore: add error handling in song link --- lib/services/song_link/song_link.dart | 55 +++++++++++++++------------ 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/lib/services/song_link/song_link.dart b/lib/services/song_link/song_link.dart index c3d73f23..b02f60cb 100644 --- a/lib/services/song_link/song_link.dart +++ b/lib/services/song_link/song_link.dart @@ -2,6 +2,7 @@ library song_link; import 'dart:convert'; +import 'package:catcher_2/catcher_2.dart'; import 'package:dio/dio.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:html/parser.dart'; @@ -12,36 +13,42 @@ part 'song_link.freezed.dart'; part 'song_link.g.dart'; abstract class SongLinkService { + static final dio = Dio(); static Future> links(String spotifyId) async { - final dio = Dio(); + try { + 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 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 document = parse(res.data); + final script = document.getElementById("__NEXT_DATA__")?.text; - final script = document.getElementById("__NEXT_DATA__")?.text; + if (script == null) { + return []; + } - if (script == null) { + final pageProps = jsonDecode(script) as Map; + 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() ?? + []; + } catch (e, stackTrace) { + Catcher2.reportCheckedError(e, stackTrace); return []; } - - final pageProps = jsonDecode(script) as Map; - 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(); } }