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:just_audio/just_audio.dart'; import 'package:file_picker/file_picker.dart'; class MediaService { static final audioPlayer = AudioPlayer(); static String? audioPlayerTag; static StudioDetailsData? currentPodcast; static StudioRequestArgs? podcastPlaylistArgs; static Duration? get duration => audioPlayer.duration; static Future handleAudioPlayback({ required dynamic audioSource, required int id, bool isNetworkAudio = true, bool isVoiceMessage = true, void Function(bool isNext)? onTrackChanged, }) async { try { String tag; tag = '${currentPodcast?.description == 'radar' ? 'radar' : isVoiceMessage ? 'message' : 'podcast'}-$id'; if (!isVoiceMessage && MediaProvider.downloadedItemIds.contains(id)) { audioSource = '${StorageService.appDocsDir}/podcasts/podcast-$id.mp3'; isNetworkAudio = false; } if (audioPlayerTag == tag) { if (audioPlayer.playerState == PlayerState(true, ProcessingState.ready)) { await audioPlayer.pause(); } else { await audioPlayer.play(); } return; } // await audioPlayer.stop(); audioPlayerTag = tag; String source; if (isNetworkAudio) { if (isVoiceMessage) { source = '${RequestHelper.baseUrl + audioSource}?accessToken=${RequestService.token}'; } else { source = audioSource; } audioPlayer.setUrl( kIsWeb ? source.replaceAll('%3A', ':') : source, tag: isVoiceMessage ? null : { "artist": 'استودیو دیدوان', "title": currentPodcast?.title ?? '', }, ); } else { audioPlayer.setFilePath( audioSource, tag: isVoiceMessage ? null : { "artist": 'استودیو دیدوان', "title": currentPodcast?.title ?? '', }, ); } await audioPlayer.play(); // await audioPlayer.open( // audio, // showNotification: !isVoiceMessage, // notificationSettings: NotificationSettings( // customStopAction: (_) => resetAudioPlayer(), // customNextAction: (_) => onTrackChanged?.call(true), // customPrevAction: (_) => onTrackChanged?.call(false), // ), // ); } catch (e) { // resetAudioPlayer(); // rethrow; } } static Future resetAudioPlayer() async { audioPlayerTag = null; currentPodcast = null; podcastPlaylistArgs = null; await MediaService.audioPlayer.stop(); } static Future pickImage({required ImageSource source}) async { final imagePicker = ImagePicker(); final XFile? pickedFile = await imagePicker.pickImage(source: source); return pickedFile; } static Future pickPdfFile() async { final FilePickerResult? result = await FilePicker.platform.pickFiles( type: FileType.custom, allowedExtensions: ['pdf'], allowMultiple: false, ); return result; } static Future pickAudioFile() async { return await FilePicker.platform.pickFiles( type: FileType.audio, allowMultiple: false, ); } }