diff --git a/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/LocalAudioSource.kt b/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/LocalAudioSource.kt index 397c24a4..254b9731 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/LocalAudioSource.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/LocalAudioSource.kt @@ -33,13 +33,13 @@ class LocalAudioSource : IAudioSource, IStreamMetaDataSource { } companion object { - fun fromSource(source: IAudioSource, path: String, fileSize: Long): LocalAudioSource { + fun fromSource(source: IAudioSource, path: String, fileSize: Long, overrideContainer: String? = null): LocalAudioSource { return LocalAudioSource( source.name, path, fileSize, source.bitrate, - source.container, + overrideContainer ?: source.container, source.codec, source.language ); diff --git a/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/LocalVideoSource.kt b/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/LocalVideoSource.kt index 43455a50..5d15ddb8 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/LocalVideoSource.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/LocalVideoSource.kt @@ -35,7 +35,7 @@ class LocalVideoSource : IVideoSource, IStreamMetaDataSource { } companion object { - fun fromSource(source: IVideoSource, path: String, fileSize: Long): LocalVideoSource { + fun fromSource(source: IVideoSource, path: String, fileSize: Long, overrideContainer: String? = null): LocalVideoSource { return LocalVideoSource( source.name, path, @@ -43,7 +43,7 @@ class LocalVideoSource : IVideoSource, IStreamMetaDataSource { source.width, source.height, source.duration, - source.container, + overrideContainer ?: source.container, source.codec, source.bitrate?:0 ); diff --git a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSDashManifestRawAudioSource.kt b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSDashManifestRawAudioSource.kt index 239a3ef9..93ed6a01 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSDashManifestRawAudioSource.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSDashManifestRawAudioSource.kt @@ -17,7 +17,7 @@ import com.futo.platformplayer.others.Language import com.futo.platformplayer.states.StateDeveloper class JSDashManifestRawAudioSource : JSSource, IAudioSource, IJSDashManifestRawSource, IStreamMetaDataSource { - override val container : String = "application/dash+xml"; + override val container : String; override val name : String; override val codec: String; override val bitrate: Int; @@ -38,6 +38,7 @@ class JSDashManifestRawAudioSource : JSSource, IAudioSource, IJSDashManifestRawS val config = plugin.config; name = _obj.getOrThrow(config, "name", contextName); url = _obj.getOrThrow(config, "url", contextName); + container = _obj.getOrDefault(config, "container", contextName, null) ?: "application/dash+xml"; manifest = _obj.getOrThrow(config, "manifest", contextName); codec = _obj.getOrDefault(config, "codec", contextName, "") ?: ""; bitrate = _obj.getOrDefault(config, "bitrate", contextName, 0) ?: 0; diff --git a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSDashManifestRawSource.kt b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSDashManifestRawSource.kt index 88511a52..d6ff7455 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSDashManifestRawSource.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSDashManifestRawSource.kt @@ -23,7 +23,7 @@ interface IJSDashManifestRawSource { fun generate(): String?; } open class JSDashManifestRawSource: JSSource, IVideoSource, IJSDashManifestRawSource, IStreamMetaDataSource { - override val container : String = "application/dash+xml"; + override val container : String; override val name : String; override val width: Int; override val height: Int; @@ -45,6 +45,7 @@ open class JSDashManifestRawSource: JSSource, IVideoSource, IJSDashManifestRawSo val config = plugin.config; name = _obj.getOrThrow(config, "name", contextName); url = _obj.getOrThrow(config, "url", contextName); + container = _obj.getOrDefault(config, "container", contextName, null) ?: "application/dash+xml"; manifest = _obj.getOrDefault(config, "manifest", contextName, null); width = _obj.getOrDefault(config, "width", contextName, 0) ?: 0; height = _obj.getOrDefault(config, "height", contextName, 0) ?: 0; diff --git a/app/src/main/java/com/futo/platformplayer/downloads/VideoDownload.kt b/app/src/main/java/com/futo/platformplayer/downloads/VideoDownload.kt index 8ba2814f..cd4ae885 100644 --- a/app/src/main/java/com/futo/platformplayer/downloads/VideoDownload.kt +++ b/app/src/main/java/com/futo/platformplayer/downloads/VideoDownload.kt @@ -141,11 +141,17 @@ class VideoDownload { var error: String? = null; var videoFilePath: String? = null; - var videoFileName: String? = null; + var videoFileNameBase: String? = null; + var videoFileNameExt: String? = null; + val videoFileName: String? get() = if(videoFileNameBase.isNullOrEmpty()) null else videoFileNameBase + (if(!videoFileNameExt.isNullOrEmpty()) "." + videoFileNameExt else ""); + var videoOverrideContainer: String? = null; var videoFileSize: Long? = null; var audioFilePath: String? = null; - var audioFileName: String? = null; + var audioFileNameBase: String? = null; + var audioFileNameExt: String? = null; + val audioFileName: String? get() = if(audioFileNameBase.isNullOrEmpty()) null else audioFileNameBase + (if(!audioFileNameExt.isNullOrEmpty()) "." + audioFileNameExt else ""); + var audioOverrideContainer: String? = null; var audioFileSize: Long? = null; var subtitleFilePath: String? = null; @@ -235,11 +241,13 @@ class VideoDownload { videoDetails = null; videoSource = null; videoSourceLive = null; + videoOverrideContainer = null; } if(requiresLiveAudioSource && !isLiveAudioSourceValid) { videoDetails = null; audioSource = null; videoSourceLive = null; + audioOverrideContainer = null; } if(video == null && videoDetails == null) throw IllegalStateException("Missing information for download to complete"); @@ -410,11 +418,13 @@ class VideoDownload { else audioSource; if(actualVideoSource != null) { - videoFileName = "${videoDetails!!.id.value!!} [${actualVideoSource!!.width}x${actualVideoSource!!.height}].${videoContainerToExtension(actualVideoSource!!.container)}".sanitizeFileName(); + videoFileNameBase = "${videoDetails!!.id.value!!} [${actualVideoSource!!.width}x${actualVideoSource!!.height}]".sanitizeFileName(); + videoFileNameExt = videoContainerToExtension(actualVideoSource!!.container); videoFilePath = File(downloadDir, videoFileName!!).absolutePath; } if(actualAudioSource != null) { - audioFileName = "${videoDetails!!.id.value!!} [${actualAudioSource!!.language}-${actualAudioSource!!.bitrate}].${audioContainerToExtension(actualAudioSource!!.container)}".sanitizeFileName(); + audioFileNameBase = "${videoDetails!!.id.value!!} [${actualAudioSource!!.language}-${actualAudioSource!!.bitrate}]".sanitizeFileName(); + audioFileNameExt = audioContainerToExtension(actualAudioSource!!.container); audioFilePath = File(downloadDir, audioFileName!!).absolutePath; } if(subtitleSource != null) { @@ -1062,8 +1072,8 @@ class VideoDownload { fun complete() { Logger.i(TAG, "VideoDownload Complete [${name}]"); val existing = StateDownloads.instance.getCachedVideo(id); - val localVideoSource = videoFilePath?.let { LocalVideoSource.fromSource(videoSourceToUse!!, it, videoFileSize ?: 0) }; - val localAudioSource = audioFilePath?.let { LocalAudioSource.fromSource(audioSourceToUse!!, it, audioFileSize ?: 0) }; + val localVideoSource = videoFilePath?.let { LocalVideoSource.fromSource(videoSourceToUse!!, it, videoFileSize ?: 0, videoOverrideContainer) }; + val localAudioSource = audioFilePath?.let { LocalAudioSource.fromSource(audioSourceToUse!!, it, audioFileSize ?: 0, audioOverrideContainer) }; val localSubtitleSource = subtitleFilePath?.let { LocalSubtitleSource.fromSource(subtitleSource!!, it) }; if(localVideoSource != null && videoSourceToUse != null && videoSourceToUse is IStreamMetaDataSource) @@ -1144,7 +1154,7 @@ class VideoDownload { else if (container.contains("video/x-matroska")) return "mkv"; else - return "video"; + return "video";//throw IllegalStateException("Unknown container: " + container) } fun audioContainerToExtension(container: String): String { @@ -1155,11 +1165,11 @@ class VideoDownload { else if (container.contains("audio/mp3")) return "mp3"; else if (container.contains("audio/webm")) - return "webma"; + return "webm"; else if (container == "application/vnd.apple.mpegurl") - return "mp4"; + return "mp4a"; else - return "audio"; + return "audio";// throw IllegalStateException("Unknown container: " + container) } fun subtitleContainerToExtension(container: String?): String {