import 'package:didvan/services/network/request.dart'; import 'package:didvan/services/network/request_helper.dart'; import 'package:flutter/foundation.dart'; import 'package:just_audio/just_audio.dart'; import 'package:http/http.dart' as http; import 'package:universal_html/html.dart' as html; class VoiceService { static final audioPlayer = AudioPlayer(); static String? src; static Future getDuration({ required String src, }) async { final ap = AudioPlayer(); Duration? duration; try { if (src.startsWith('/uploads')) { final source = '${RequestHelper.baseUrl + src}?accessToken=${RequestService.token}'; if (kIsWeb) { final response = await http.get(Uri.parse(source.replaceAll('%3A', ':'))); final bytes = response.bodyBytes; final blob = html.Blob([bytes]); final blobUrl = html.Url.createObjectUrlFromBlob(blob); duration = await ap.setAudioSource( AudioSource.uri(Uri.parse(blobUrl)), ); } else { final lockCachingAudioSource = LockCachingAudioSource(Uri.parse(source)); duration = await ap.setAudioSource(lockCachingAudioSource); } } else if (src.startsWith('blob:')) { duration = await ap.setAudioSource(AudioSource.uri(Uri.parse(src))); } else { duration = await ap.setFilePath(src); } } catch (e) { if (kDebugMode) { print('Error setting audio source: $e'); } } finally { await ap.dispose(); } await ap.load(); return duration; } static Future voiceHelper( {required String src, final Duration? duration, final Function()? startTimer, final Function()? stopTimer}) async { try { if (VoiceService.src == src) { if (audioPlayer.playing) { await audioPlayer.pause(); stopTimer?.call(); } else { await audioPlayer.play(); startTimer?.call(); } return; } audioPlayer.stop(); VoiceService.src = src; if (src.startsWith('/uploads')) { final source = '${RequestHelper.baseUrl + src}?accessToken=${RequestService.token}'; if (kIsWeb) { final response = await http.get(Uri.parse(source.replaceAll('%3A', ':'))); final bytes = response.bodyBytes; final blob = html.Blob([bytes]); final blobUrl = html.Url.createObjectUrlFromBlob(blob); await audioPlayer.setAudioSource( AudioSource.uri(Uri.parse(blobUrl)), ); } else { final lockCachingAudioSource = LockCachingAudioSource(Uri.parse(source)); await audioPlayer.setAudioSource(lockCachingAudioSource); } } else if (src.startsWith('blob:')) { await audioPlayer.setAudioSource(AudioSource.uri(Uri.parse(src))); } else { await audioPlayer.setFilePath(src); } await audioPlayer.play(); startTimer?.call(); } catch (e) { resetVoicePlayer(); } } static Future resetVoicePlayer() async { src = null; await audioPlayer.stop(); } }