didvan-app/lib/services/media/media.dart

77 lines
2.2 KiB
Dart

import 'package:didvan/models/requests/studio.dart';
import 'package:didvan/models/studio_details_data.dart';
import 'package:didvan/services/network/request.dart';
import 'package:didvan/services/network/request_helper.dart';
import 'package:flutter/foundation.dart';
import 'package:image_picker/image_picker.dart';
import 'package:just_audio/just_audio.dart';
class MediaService {
static final AudioPlayer audioPlayer = AudioPlayer();
static String? audioPlayerTag;
static StudioDetailsData? currentPodcast;
static StudioRequestArgs? podcastPlaylistArgs;
static void init() {
audioPlayer.positionStream.listen((event) {
if (audioPlayer.duration != null && audioPlayer.duration! < event) {
audioPlayer.stop();
audioPlayer.seek(const Duration(seconds: 0));
}
});
}
static Future<void> handleAudioPlayback({
required dynamic audioSource,
bool isVoiceMessage = true,
}) async {
bool isNetworkAudio = audioSource.runtimeType == String;
String tag;
if (isNetworkAudio) {
tag = audioSource;
} else {
tag = audioSource.path;
}
if (audioPlayerTag == tag) {
if (audioPlayer.playing) {
await audioPlayer.pause();
} else {
await audioPlayer.play();
}
} else {
await audioPlayer.stop();
audioPlayerTag = tag;
if (isNetworkAudio) {
await audioPlayer.setUrl(
isVoiceMessage
? (RequestHelper.baseUrl +
audioSource +
'?accessToken=${RequestService.token}')
: audioSource,
);
} else {
if (kIsWeb) {
await audioPlayer
.setUrl(audioSource!.uri.path.replaceAll('%3A', ':'));
} else {
await audioPlayer.setFilePath(audioSource.path);
}
}
audioPlayer.play();
}
}
static Future<void> resetAudioPlayer() async {
audioPlayerTag = null;
currentPodcast = null;
podcastPlaylistArgs = null;
MediaService.audioPlayer.stop();
}
static Future<XFile?> pickImage({required ImageSource source}) async {
final imagePicker = ImagePicker();
final XFile? pickedFile = await imagePicker.pickImage(source: source);
return pickedFile;
}
}