Add fix for m4a mapping to audio/mpeg.

This commit is contained in:
Clark
2023-04-03 09:58:09 -04:00
committed by Alex Hart
parent f9548dcffe
commit 83b0963533
2 changed files with 41 additions and 10 deletions

View File

@@ -48,7 +48,9 @@ class ShareRepository(context: Context) {
}
val uri = multiShareExternal.uri
val mimeType = getMimeType(appContext, uri, multiShareExternal.mimeType)
val size = getSize(appContext, uri)
val name = getFileName(appContext, uri)
val mimeType = getMimeType(appContext, uri, multiShareExternal.mimeType, name?.substringAfterLast('.', ""))
val stream: InputStream = try {
appContext.contentResolver.openInputStream(uri)
@@ -57,9 +59,6 @@ class ShareRepository(context: Context) {
null
} ?: return ResolvedShareData.Failure
val size = getSize(appContext, uri)
val name = getFileName(appContext, uri)
val blobUri: Uri = try {
BlobProvider.getInstance()
.forData(stream, size)
@@ -142,8 +141,8 @@ class ShareRepository(context: Context) {
companion object {
private val TAG = Log.tag(ShareRepository::class.java)
private fun getMimeType(context: Context, uri: Uri, mimeType: String?): String {
var updatedMimeType = MediaUtil.getMimeType(context, uri)
private fun getMimeType(context: Context, uri: Uri, mimeType: String?, fileExtension: String? = null): String {
var updatedMimeType = MediaUtil.getMimeType(context, uri, fileExtension)
if (updatedMimeType == null) {
updatedMimeType = MediaUtil.getCorrectedMimeType(mimeType)
}

View File

@@ -60,6 +60,7 @@ public class MediaUtil {
public static final String IMAGE_WEBP = "image/webp";
public static final String IMAGE_GIF = "image/gif";
public static final String AUDIO_AAC = "audio/aac";
public static final String AUDIO_MP4 = "audio/mp4";
public static final String AUDIO_UNSPECIFIED = "audio/*";
public static final String VIDEO_MP4 = "video/mp4";
public static final String VIDEO_UNSPECIFIED = "video/*";
@@ -108,6 +109,10 @@ public class MediaUtil {
}
public static @Nullable String getMimeType(@NonNull Context context, @Nullable Uri uri) {
return getMimeType(context, uri, null);
}
public static @Nullable String getMimeType(@NonNull Context context, @Nullable Uri uri, @Nullable String fileExtension) {
if (uri == null) return null;
if (PartAuthority.isLocalUri(uri)) {
@@ -116,8 +121,12 @@ public class MediaUtil {
String type = context.getContentResolver().getType(uri);
if (type == null || isOctetStream(type)) {
final String extension = MimeTypeMap.getFileExtensionFromUrl(uri.toString());
String extension = MimeTypeMap.getFileExtensionFromUrl(uri.toString());
if (TextUtils.isEmpty(extension) && fileExtension != null) {
extension = fileExtension;
}
type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension.toLowerCase());
return getCorrectedMimeType(type, fileExtension);
}
return getCorrectedMimeType(type);
@@ -128,14 +137,37 @@ public class MediaUtil {
.getExtensionFromMimeType(getMimeType(context, uri));
}
private static String safeMimeTypeOverride(String originalType, String overrideType) {
if (MimeTypeMap.getSingleton().hasMimeType(overrideType)) {
return overrideType;
}
return originalType;
}
public static @Nullable String overrideMimeTypeWithExtension(@Nullable String mimeType, @Nullable String fileExtension) {
if (fileExtension == null) {
return mimeType;
}
switch (fileExtension.toLowerCase()) {
case "m4a":
return safeMimeTypeOverride(mimeType, AUDIO_MP4);
default:
return mimeType;
}
}
public static @Nullable String getCorrectedMimeType(@Nullable String mimeType) {
return getCorrectedMimeType(mimeType, null);
}
public static @Nullable String getCorrectedMimeType(@Nullable String mimeType, @Nullable String fileExtension) {
if (mimeType == null) return null;
switch(mimeType) {
case "image/jpg":
return MimeTypeMap.getSingleton().hasMimeType(IMAGE_JPEG)
? IMAGE_JPEG
: mimeType;
return safeMimeTypeOverride(mimeType, IMAGE_JPEG);
case "audio/mpeg":
return overrideMimeTypeWithExtension(mimeType, fileExtension);
default:
return mimeType;
}