diff --git a/backend/src/main/kotlin/dev/twango/jetplay/transcode/MediaTranscoder.kt b/backend/src/main/kotlin/dev/twango/jetplay/transcode/MediaTranscoder.kt index 7ec6a445..44cfec3b 100644 --- a/backend/src/main/kotlin/dev/twango/jetplay/transcode/MediaTranscoder.kt +++ b/backend/src/main/kotlin/dev/twango/jetplay/transcode/MediaTranscoder.kt @@ -33,8 +33,7 @@ object MediaTranscoder { "pcma" to RawAudioHint("alaw", 8000, 1), "alaw" to RawAudioHint("alaw", 8000, 1), "g722" to RawAudioHint("g722", 16000, 1), - "gsm" to RawAudioHint("gsm", 8000, 1), - "sln" to RawAudioHint("s16le", 8000, 1), + "slin" to RawAudioHint("s16le", 8000, 1), ) /** Must stay in sync with the shared classifier. */ diff --git a/frontend/src/main/resources/dev.twango.jetplay.frontend.xml b/frontend/src/main/resources/dev.twango.jetplay.frontend.xml index 2c9c10f9..b39d2156 100644 --- a/frontend/src/main/resources/dev.twango.jetplay.frontend.xml +++ b/frontend/src/main/resources/dev.twango.jetplay.frontend.xml @@ -7,7 +7,7 @@ + extensions="mp4;m4v;mkv;avi;mov;wmv;flv;webm;ogv;m2ts;m2t;3gp;ivf;mp3;wav;ogg;oga;opus;m4a;aac;wma;aiff;aif;flac;ac3;eac3;caf;adts;amr;au;pcmu;ulaw;pcma;alaw;g722;slin"/> diff --git a/shared/src/main/kotlin/dev/twango/jetplay/media/MediaClassification.kt b/shared/src/main/kotlin/dev/twango/jetplay/media/MediaClassification.kt index 0c140d97..d9af2a6a 100644 --- a/shared/src/main/kotlin/dev/twango/jetplay/media/MediaClassification.kt +++ b/shared/src/main/kotlin/dev/twango/jetplay/media/MediaClassification.kt @@ -3,7 +3,7 @@ package dev.twango.jetplay.media object MediaClassification { // Video extensions registered by the media file type in the frontend descriptor. - // .ts is excluded to avoid clobbering TypeScript files. + // .ts and .mts are excluded to avoid clobbering TypeScript files. private val VIDEO_EXTENSIONS = setOf( "mp4", "m4v", @@ -14,7 +14,6 @@ object MediaClassification { "flv", "webm", "ogv", - "mts", "m2ts", "m2t", "3gp", @@ -34,14 +33,14 @@ object MediaClassification { ) // Headerless raw codec streams that need explicit demuxer hints. + // Signed-linear uses .slin not .sln to avoid clashing with Visual Studio solution files. val rawAudioExtensions: Set = setOf( "pcmu", "ulaw", "pcma", "alaw", "g722", - "gsm", - "sln", + "slin", ) fun isVideo(extension: String): Boolean = extension.lowercase() in VIDEO_EXTENSIONS diff --git a/shared/src/test/kotlin/dev/twango/jetplay/media/MediaClassificationTest.kt b/shared/src/test/kotlin/dev/twango/jetplay/media/MediaClassificationTest.kt index c444757f..86daf4f2 100644 --- a/shared/src/test/kotlin/dev/twango/jetplay/media/MediaClassificationTest.kt +++ b/shared/src/test/kotlin/dev/twango/jetplay/media/MediaClassificationTest.kt @@ -64,11 +64,22 @@ class MediaClassificationTest { @Test fun transportStreamContainersClassifyAsVideo() { - assertTrue(MediaClassification.isVideo("mts")) assertTrue(MediaClassification.isVideo("m2ts")) assertTrue(MediaClassification.isVideo("m2t")) } + @Test + fun typeScriptExtensionsDoNotClassifyAsVideo() { + assertFalse(MediaClassification.isVideo("ts")) + assertFalse(MediaClassification.isVideo("mts")) + } + + @Test + fun signedLinearUsesNonCollidingExtension() { + assertTrue(MediaClassification.rawAudioExtensions.contains("slin")) + assertFalse(MediaClassification.rawAudioExtensions.contains("sln")) + } + @Test fun rawAudioExtensionsNeedTranscoding() { MediaClassification.rawAudioExtensions.forEach {