From 09427e1de08fb070b851b883b8b7f0ce11887384 Mon Sep 17 00:00:00 2001 From: nomadics9 Date: Thu, 18 Jul 2024 05:20:34 +0300 Subject: [PATCH] feat: Embedded subs in downloaded transcode --- .../nomadics9/ananas/utils/DownloaderImpl.kt | 42 +++++++++++++++++++ .../viewmodels/PlayerActivityViewModel.kt | 2 +- .../ananas/viewmodels/PlayerViewModel.kt | 24 ++++++++++- 3 files changed, 66 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/nomadics9/ananas/utils/DownloaderImpl.kt b/core/src/main/java/com/nomadics9/ananas/utils/DownloaderImpl.kt index f2667df7..50f5efaa 100644 --- a/core/src/main/java/com/nomadics9/ananas/utils/DownloaderImpl.kt +++ b/core/src/main/java/com/nomadics9/ananas/utils/DownloaderImpl.kt @@ -28,6 +28,7 @@ import com.nomadics9.ananas.models.toFindroidTrickplayInfoDto import com.nomadics9.ananas.models.toFindroidUserDataDto import com.nomadics9.ananas.repository.JellyfinRepository import org.jellyfin.sdk.model.api.EncodingContext +import org.jellyfin.sdk.model.api.MediaStreamType import timber.log.Timber import java.io.File import java.util.UUID @@ -118,6 +119,7 @@ class DownloaderImpl( database.insertSource(source.toFindroidSourceDto(item.id, path.path.orEmpty())) database.insertUserData(item.toFindroidUserDataDto(jellyfinRepository.getUserId())) downloadExternalMediaStreams(item, source, storageIndex) + downloadEmbeddedMediaStreams(item, source, storageIndex) if (trickplayInfo != null) { downloadTrickplayData(item.id, source.id, trickplayInfo) } @@ -147,6 +149,7 @@ class DownloaderImpl( database.insertSource(source.toFindroidSourceDto(item.id, path.path.orEmpty())) database.insertUserData(item.toFindroidUserDataDto(jellyfinRepository.getUserId())) downloadExternalMediaStreams(item, source, storageIndex) + downloadEmbeddedMediaStreams(item, source, storageIndex) if (trickplayInfo != null) { downloadTrickplayData(item.id, source.id, trickplayInfo) } @@ -341,6 +344,45 @@ class DownloaderImpl( } } + private fun downloadEmbeddedMediaStreams( + item: FindroidItem, + source: FindroidSource, + storageIndex: Int = 0 + ) { + val storageLocation = context.getExternalFilesDirs(null)[storageIndex] + val subtitleStreams = source.mediaStreams.filter { !it.isExternal && it.type == MediaStreamType.SUBTITLE && it.path != null } + for (mediaStream in subtitleStreams) { + var deliveryUrl = mediaStream.path!! + if (mediaStream.codec == "webvtt") { + deliveryUrl = deliveryUrl.replace("Stream.srt", "Stream.vtt") + } + val id = UUID.randomUUID() + val streamPath = Uri.fromFile( + File( + storageLocation, + "downloads/${item.id}.${source.id}.$id.download" + ) + ) + database.insertMediaStream( + mediaStream.toFindroidMediaStreamDto( + id, + source.id, + streamPath.path.orEmpty() + ) + ) + val request = DownloadManager.Request(Uri.parse(deliveryUrl)) + .setTitle(mediaStream.title) + .setAllowedOverMetered(appPreferences.downloadOverMobileData) + .setAllowedOverRoaming(appPreferences.downloadWhenRoaming) + .setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN) + .setDestinationUri(streamPath) + + val downloadId = downloadManager.enqueue(request) + database.setMediaStreamDownloadId(id, downloadId) + } + } + + private suspend fun downloadTrickplayData( itemId: UUID, sourceId: String, diff --git a/player/video/src/main/java/com/nomadics9/ananas/viewmodels/PlayerActivityViewModel.kt b/player/video/src/main/java/com/nomadics9/ananas/viewmodels/PlayerActivityViewModel.kt index 4c271f54..7cc37741 100644 --- a/player/video/src/main/java/com/nomadics9/ananas/viewmodels/PlayerActivityViewModel.kt +++ b/player/video/src/main/java/com/nomadics9/ananas/viewmodels/PlayerActivityViewModel.kt @@ -577,7 +577,7 @@ constructor( else -> MimeTypes.TEXT_UNKNOWN } ) - .setLanguage(mediaStream.language?.ifBlank { "Unknown" }) + .setLanguage(mediaStream.language.ifBlank { "Unknown" }) .setLabel("Embedded") .build() } diff --git a/player/video/src/main/java/com/nomadics9/ananas/viewmodels/PlayerViewModel.kt b/player/video/src/main/java/com/nomadics9/ananas/viewmodels/PlayerViewModel.kt index 097df0e1..c9a85501 100644 --- a/player/video/src/main/java/com/nomadics9/ananas/viewmodels/PlayerViewModel.kt +++ b/player/video/src/main/java/com/nomadics9/ananas/viewmodels/PlayerViewModel.kt @@ -136,7 +136,27 @@ class PlayerViewModel @Inject internal constructor( } else { mediaSources[mediaSourceIndex] } - val externalSubtitles = mediaSource.mediaStreams + val externalSubtitles = if (mediaSource.type == FindroidSourceType.LOCAL) { + mediaSource.mediaStreams + .filter { mediaStream -> + mediaStream.type == MediaStreamType.SUBTITLE && !mediaStream.path.isNullOrBlank() + } + .map { mediaStream -> + ExternalSubtitle( + mediaStream.title, + mediaStream.language, + Uri.parse(mediaStream.path!!), + when (mediaStream.codec) { + "subrip" -> MimeTypes.APPLICATION_SUBRIP + "webvtt" -> MimeTypes.APPLICATION_SUBRIP + "pgs" -> MimeTypes.APPLICATION_PGS + "ass" -> MimeTypes.TEXT_SSA + else -> MimeTypes.TEXT_UNKNOWN + }, + ) + } + }else { + mediaSource.mediaStreams .filter { mediaStream -> mediaStream.isExternal && mediaStream.type == MediaStreamType.SUBTITLE && !mediaStream.path.isNullOrBlank() } @@ -148,11 +168,13 @@ class PlayerViewModel @Inject internal constructor( when (mediaStream.codec) { "subrip" -> MimeTypes.APPLICATION_SUBRIP "webvtt" -> MimeTypes.APPLICATION_SUBRIP + "pgs" -> MimeTypes.APPLICATION_PGS "ass" -> MimeTypes.TEXT_SSA else -> MimeTypes.TEXT_UNKNOWN }, ) } + } val trickplayInfo = when (this) { is FindroidSources -> { this.trickplayInfo?.get(mediaSource.id)?.let {