import 'dart:io'; import 'package:ffmpeg_kit_flutter_audio/ffmpeg_kit.dart'; import 'package:http/http.dart' as http; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; import 'package:recon/auxiliary.dart'; import 'package:recon/clients/api_client.dart'; import 'package:recon/models/message.dart'; class AudioCacheClient { final Future _directoryFuture = getTemporaryDirectory(); final bool _isDarwin = Platform.isMacOS || Platform.isIOS; Future cachedNetworkAudioFile(AudioClipContent clip) async { final directory = await _directoryFuture; final fileName = basenameWithoutExtension(clip.assetUri); final file = File("${directory.path}/$fileName.ogg"); if (!await file.exists()) { await file.create(recursive: true); final response = await http.get(Uri.parse(Aux.resdbToHttp(clip.assetUri))); ApiClient.checkResponseCode(response); await file.writeAsBytes(response.bodyBytes); } if (_isDarwin) { final wavFile = File("${directory.path}/$fileName.wav"); final wavFileExists = await wavFile.exists(); if (wavFileExists && await wavFile.length() == 0) { await wavFile.delete(); } if (!wavFileExists) { await wavFile.create(recursive: true); await FFmpegKit.executeAsync("-y -acodec libvorbis -i ${file.path} -acodec pcm_s16le ${wavFile.path}"); } return wavFile; } return file; } }