@@ -77,7 +77,10 @@ String decodeSoundTrackAudioFileExtension(String? encoded) {
7777 if (encoded == null ) return _fallbackAudioFileExtension;
7878 try {
7979 final map = jsonDecode (encoded) as Map <String , dynamic >;
80- return _normalizeAudioFileExtension (map['audioFileExtension' ] as String ? );
80+ return _resolveAudioFormat (
81+ extension : map['audioFileExtension' ] as String ? ,
82+ mimeType: map['audioMimeType' ] as String ? ,
83+ ).extension ;
8184 } catch (_) {
8285 return _fallbackAudioFileExtension;
8386 }
@@ -87,10 +90,10 @@ String decodeSoundTrackAudioMimeType(String? encoded) {
8790 if (encoded == null ) return 'audio/mpeg' ;
8891 try {
8992 final map = jsonDecode (encoded) as Map <String , dynamic >;
90- return _normalizeAudioMimeType (
91- map['audioMimeType' ] as String ? ,
93+ return _resolveAudioFormat (
9294 extension : map['audioFileExtension' ] as String ? ,
93- );
95+ mimeType: map['audioMimeType' ] as String ? ,
96+ ).mimeType;
9497 } catch (_) {
9598 return 'audio/mpeg' ;
9699 }
@@ -99,27 +102,27 @@ String decodeSoundTrackAudioMimeType(String? encoded) {
99102String audioFileExtension (AudioView audio) {
100103 final record = audio.localRecord;
101104 if (record is PlyrTrackRecord ) {
102- return _normalizeAudioFileExtension (
103- record.fileType,
105+ return _resolveAudioFormat (
106+ extension : record.fileType,
104107 mimeType: record.audioBlob? .mimeType,
105- );
108+ ). extension ;
106109 }
107110 if (record is AudioRecord ) {
108- return _normalizeAudioFileExtension ( null , mimeType: record.sound.mimeType);
111+ return _resolveAudioFormat ( mimeType: record.sound.mimeType). extension ;
109112 }
110113 return _fallbackAudioFileExtension;
111114}
112115
113116String audioMimeType (AudioView audio) {
114117 final record = audio.localRecord;
115118 if (record is PlyrTrackRecord ) {
116- return _normalizeAudioMimeType (
117- record.audioBlob? .mimeType,
119+ return _resolveAudioFormat (
118120 extension : record.fileType,
119- );
121+ mimeType: record.audioBlob? .mimeType,
122+ ).mimeType;
120123 }
121124 if (record is AudioRecord ) {
122- return _normalizeAudioMimeType ( record.sound.mimeType);
125+ return _resolveAudioFormat (mimeType : record.sound.mimeType).mimeType ;
123126 }
124127 return 'audio/mpeg' ;
125128}
@@ -172,55 +175,58 @@ bool _isSparkMediaSoundUrl(String url) {
172175 uri.pathSegments.first == 'sound' ;
173176}
174177
175- String _normalizeAudioFileExtension (String ? value, {String ? mimeType}) {
176- final extension = value? .trim ().toLowerCase ().replaceFirst ('.' , '' );
177- if (extension != null && extension .isNotEmpty) {
178- final normalized = switch (extension ) {
179- 'mpeg' => 'mp3' ,
180- 'mp4' => 'm4a' ,
181- 'x-m4a' => 'm4a' ,
182- 'x-wav' => 'wav' ,
183- _ => extension .replaceAll (RegExp (r'[^a-z0-9]' ), '' ),
184- };
185- if (normalized.isNotEmpty) return normalized;
186- }
187-
188- final subtype = mimeType? .split ('/' ).last.trim ().toLowerCase ();
189- return switch (subtype) {
190- 'mpeg' => 'mp3' ,
191- 'mp3' => 'mp3' ,
192- 'mp4' => 'm4a' ,
193- 'm4a' => 'm4a' ,
194- 'x-m4a' => 'm4a' ,
195- 'aac' => 'aac' ,
196- 'vnd.wave' => 'wav' ,
197- 'wave' => 'wav' ,
198- 'wav' => 'wav' ,
199- 'x-wav' => 'wav' ,
200- 'flac' => 'flac' ,
201- 'ogg' => 'ogg' ,
202- _ => _fallbackAudioFileExtension,
178+ _AudioFormat _resolveAudioFormat ({String ? extension , String ? mimeType}) {
179+ final normalizedMime = mimeType? .trim ().toLowerCase ();
180+ final mimeFormat = switch (normalizedMime) {
181+ 'audio/mpeg' || 'audio/mp3' => const _AudioFormat ('mp3' , 'audio/mpeg' ),
182+ 'audio/mp4' ||
183+ 'audio/m4a' ||
184+ 'audio/x-m4a' => const _AudioFormat ('m4a' , 'audio/mp4' ),
185+ 'audio/aac' => const _AudioFormat ('aac' , 'audio/aac' ),
186+ 'audio/vnd.wave' ||
187+ 'audio/wave' ||
188+ 'audio/wav' ||
189+ 'audio/x-wav' => const _AudioFormat ('wav' , 'audio/wav' ),
190+ 'audio/flac' || 'audio/x-flac' => const _AudioFormat ('flac' , 'audio/flac' ),
191+ 'audio/ogg' => const _AudioFormat ('ogg' , 'audio/ogg' ),
192+ _ => null ,
203193 };
204- }
194+ if (mimeFormat != null ) return mimeFormat;
195+
196+ final normalizedExtension = extension
197+ ? .trim ()
198+ .toLowerCase ()
199+ .replaceFirst ('.' , '' )
200+ .replaceAll (RegExp (r'[^a-z0-9]' ), '' );
201+ final extensionFormat = switch (normalizedExtension) {
202+ 'mpeg' || 'mp3' => const _AudioFormat ('mp3' , 'audio/mpeg' ),
203+ 'mp4' || 'm4a' || 'xm4a' => const _AudioFormat ('m4a' , 'audio/mp4' ),
204+ 'aac' => const _AudioFormat ('aac' , 'audio/aac' ),
205+ 'vndwave' ||
206+ 'wave' ||
207+ 'wav' ||
208+ 'xwav' => const _AudioFormat ('wav' , 'audio/wav' ),
209+ 'flac' || 'xflac' => const _AudioFormat ('flac' , 'audio/flac' ),
210+ 'ogg' => const _AudioFormat ('ogg' , 'audio/ogg' ),
211+ _ => null ,
212+ };
213+ if (extensionFormat != null ) return extensionFormat;
205214
206- String _normalizeAudioMimeType (String ? mimeType, {String ? extension }) {
207- final normalizedMime = mimeType? .trim ().toLowerCase ();
208215 if (normalizedMime != null && normalizedMime.startsWith ('audio/' )) {
209- return switch (normalizedMime) {
210- 'audio/x-m4a' => 'audio/mp4' ,
211- 'audio/vnd.wave' => 'audio/wav' ,
212- 'audio/wave' => 'audio/wav' ,
213- 'audio/x-wav' => 'audio/wav' ,
214- _ => normalizedMime,
215- };
216+ final subtype = normalizedMime
217+ .substring ('audio/' .length)
218+ .replaceAll (RegExp (r'[^a-z0-9]' ), '' );
219+ if (subtype.isNotEmpty) return _AudioFormat (subtype, normalizedMime);
216220 }
221+ if (normalizedExtension != null && normalizedExtension.isNotEmpty) {
222+ return _AudioFormat (normalizedExtension, 'audio/$normalizedExtension ' );
223+ }
224+ return const _AudioFormat (_fallbackAudioFileExtension, 'audio/mpeg' );
225+ }
217226
218- return switch (_normalizeAudioFileExtension (extension )) {
219- 'm4a' => 'audio/mp4' ,
220- 'aac' => 'audio/aac' ,
221- 'wav' => 'audio/wav' ,
222- 'flac' => 'audio/flac' ,
223- 'ogg' => 'audio/ogg' ,
224- _ => 'audio/mpeg' ,
225- };
227+ class _AudioFormat {
228+ const _AudioFormat (this .extension , this .mimeType);
229+
230+ final String extension ;
231+ final String mimeType;
226232}
0 commit comments