Update getFormatFromExtension to take a URI

This allows to handle the last segment retrieval and process the case
where the filename is null in the method.

PiperOrigin-RevId: 314512974
This commit is contained in:
kimvde 2020-06-03 13:28:51 +01:00 committed by Oliver Woodman
parent 7df99381c1
commit 7c33e2570a
4 changed files with 29 additions and 16 deletions

View File

@ -15,6 +15,7 @@
*/ */
package com.google.android.exoplayer2.util; package com.google.android.exoplayer2.util;
import android.net.Uri;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
@ -112,11 +113,15 @@ public final class FilenameUtil {
private FilenameUtil() {} private FilenameUtil() {}
/** /**
* Returns the {@link FileFormat} corresponding to the extension of the provided {@code filename}. * Returns the {@link FileFormat} corresponding to the filename extension of the provided {@link
* Uri}. The filename is considered to be the last segment of the {@link Uri} path.
*/ */
@FileFormat @FileFormat
public static int getFormatFromExtension(String filename) { public static int getFormatFromExtension(Uri uri) {
if (filename.endsWith(FILE_EXTENSION_AC3) || filename.endsWith(FILE_EXTENSION_EC3)) { String filename = uri.getLastPathSegment();
if (filename == null) {
return FILE_FORMAT_UNKNOWN;
} else if (filename.endsWith(FILE_EXTENSION_AC3) || filename.endsWith(FILE_EXTENSION_EC3)) {
return FILE_FORMAT_AC3; return FILE_FORMAT_AC3;
} else if (filename.endsWith(FILE_EXTENSION_AC4)) { } else if (filename.endsWith(FILE_EXTENSION_AC4)) {
return FILE_FORMAT_AC4; return FILE_FORMAT_AC4;

View File

@ -21,6 +21,7 @@ import static com.google.android.exoplayer2.util.FilenameUtil.FILE_FORMAT_UNKNOW
import static com.google.android.exoplayer2.util.FilenameUtil.getFormatFromExtension; import static com.google.android.exoplayer2.util.FilenameUtil.getFormatFromExtension;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import android.net.Uri;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -31,16 +32,30 @@ public class FilenameUtilTest {
@Test @Test
public void getFormatFromExtension_withExtension_returnsExpectedFormat() { public void getFormatFromExtension_withExtension_returnsExpectedFormat() {
assertThat(getFormatFromExtension("filename.mp3")).isEqualTo(FILE_FORMAT_MP3); assertThat(getFormatFromExtension(Uri.parse("filename.mp3"))).isEqualTo(FILE_FORMAT_MP3);
} }
@Test @Test
public void getFormatFromExtension_withExtensionPrefix_returnsExpectedFormat() { public void getFormatFromExtension_withExtensionPrefix_returnsExpectedFormat() {
assertThat(getFormatFromExtension("filename.mka")).isEqualTo(FILE_FORMAT_MATROSKA); assertThat(getFormatFromExtension(Uri.parse("filename.mka"))).isEqualTo(FILE_FORMAT_MATROSKA);
} }
@Test @Test
public void getFormatFromExtension_unknownExtension_returnsUnknownFormat() { public void getFormatFromExtension_withUnknownExtension_returnsUnknownFormat() {
assertThat(getFormatFromExtension("filename.unknown")).isEqualTo(FILE_FORMAT_UNKNOWN); assertThat(getFormatFromExtension(Uri.parse("filename.unknown")))
.isEqualTo(FILE_FORMAT_UNKNOWN);
}
@Test
public void getFormatFromExtension_withUriNotEndingWithFilename_returnsExpectedFormat() {
assertThat(
getFormatFromExtension(
Uri.parse("http://www.example.com/filename.mp3?query=myquery#fragment")))
.isEqualTo(FILE_FORMAT_MP3);
}
@Test
public void getFormatFromExtension_withNullFilename_returnsUnknownFormat() {
assertThat(getFormatFromExtension(Uri.EMPTY)).isEqualTo(FILE_FORMAT_UNKNOWN);
} }
} }

View File

@ -27,7 +27,6 @@ import static com.google.android.exoplayer2.util.FilenameUtil.FILE_FORMAT_MP4;
import static com.google.android.exoplayer2.util.FilenameUtil.FILE_FORMAT_OGG; import static com.google.android.exoplayer2.util.FilenameUtil.FILE_FORMAT_OGG;
import static com.google.android.exoplayer2.util.FilenameUtil.FILE_FORMAT_PS; import static com.google.android.exoplayer2.util.FilenameUtil.FILE_FORMAT_PS;
import static com.google.android.exoplayer2.util.FilenameUtil.FILE_FORMAT_TS; import static com.google.android.exoplayer2.util.FilenameUtil.FILE_FORMAT_TS;
import static com.google.android.exoplayer2.util.FilenameUtil.FILE_FORMAT_UNKNOWN;
import static com.google.android.exoplayer2.util.FilenameUtil.FILE_FORMAT_WAV; import static com.google.android.exoplayer2.util.FilenameUtil.FILE_FORMAT_WAV;
import static com.google.android.exoplayer2.util.FilenameUtil.getFormatFromExtension; import static com.google.android.exoplayer2.util.FilenameUtil.getFormatFromExtension;
@ -286,9 +285,7 @@ public final class DefaultExtractorsFactory implements ExtractorsFactory {
public synchronized Extractor[] createExtractors(Uri uri) { public synchronized Extractor[] createExtractors(Uri uri) {
List<Extractor> extractors = new ArrayList<>(/* initialCapacity= */ 14); List<Extractor> extractors = new ArrayList<>(/* initialCapacity= */ 14);
String filename = uri.getLastPathSegment(); @FilenameUtil.FileFormat int extensionFormat = getFormatFromExtension(uri);
@FilenameUtil.FileFormat
int extensionFormat = filename == null ? FILE_FORMAT_UNKNOWN : getFormatFromExtension(filename);
addExtractorsForFormat(extensionFormat, extractors); addExtractorsForFormat(extensionFormat, extractors);
for (int format : DEFAULT_EXTRACTOR_ORDER) { for (int format : DEFAULT_EXTRACTOR_ORDER) {

View File

@ -195,11 +195,7 @@ public final class DefaultHlsExtractorFactory implements HlsExtractorFactory {
if (MimeTypes.TEXT_VTT.equals(format.sampleMimeType)) { if (MimeTypes.TEXT_VTT.equals(format.sampleMimeType)) {
return new WebvttExtractor(format.language, timestampAdjuster); return new WebvttExtractor(format.language, timestampAdjuster);
} }
String filename = uri.getLastPathSegment(); @FilenameUtil.FileFormat int fileFormat = getFormatFromExtension(uri);
if (filename == null) {
return null;
}
@FilenameUtil.FileFormat int fileFormat = getFormatFromExtension(filename);
switch (fileFormat) { switch (fileFormat) {
case FILE_FORMAT_WEBVTT: case FILE_FORMAT_WEBVTT:
return new WebvttExtractor(format.language, timestampAdjuster); return new WebvttExtractor(format.language, timestampAdjuster);