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

74 lines
2.3 KiB
Dart

import 'package:didvan/models/requests/studio.dart';
import 'package:didvan/models/studio_details_data.dart';
import 'package:didvan/providers/media.dart';
import 'package:didvan/services/network/request.dart';
import 'package:didvan/services/network/request_helper.dart';
import 'package:didvan/services/storage/storage.dart';
import 'package:flutter/foundation.dart';
import 'package:image_picker/image_picker.dart';
import 'package:assets_audio_player/assets_audio_player.dart';
class MediaService {
static final audioPlayer = AssetsAudioPlayer();
static String? audioPlayerTag;
static StudioDetailsData? currentPodcast;
static StudioRequestArgs? podcastPlaylistArgs;
static Duration? get duration => audioPlayer.current.value?.audio.duration;
static Future<void> handleAudioPlayback({
required dynamic audioSource,
required int id,
bool? isNetworkAudio,
bool isVoiceMessage = true,
}) async {
String tag;
tag = '${isVoiceMessage ? 'message' : 'podcast'}-$id';
isNetworkAudio ??= audioSource.runtimeType == String;
if (!isVoiceMessage && MediaProvider.downloadedItemIds.contains(id)) {
audioSource = StorageService.appDocsDir + '/podcasts/podcast-$id.mp3';
isNetworkAudio = false;
}
if (audioPlayerTag == tag) {
await audioPlayer.playOrPause();
return;
}
await audioPlayer.stop();
audioPlayerTag = tag;
if (isNetworkAudio) {
await audioPlayer.open(
Audio.network(
isVoiceMessage
? (RequestHelper.baseUrl +
audioSource +
'?accessToken=${RequestService.token}')
: audioSource,
),
);
} else {
if (kIsWeb) {
await audioPlayer.open(
Audio.network(audioSource!.replaceAll('%3A', ':')),
);
} else {
await audioPlayer.open(Audio.file(audioSource));
}
}
audioPlayer.play();
audioPlayer.updateCurrentAudioNotification();
}
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;
}
}