added audio to video streams when cutting videos from youtube links
This commit is contained in:
parent
7a8341a3c3
commit
7f6053920e
3 changed files with 52 additions and 9 deletions
|
|
@ -0,0 +1,19 @@
|
||||||
|
package com.deniscerri.ytdlnis.database.models
|
||||||
|
|
||||||
|
import androidx.room.PrimaryKey
|
||||||
|
import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel.Type
|
||||||
|
|
||||||
|
data class AutomateItem(
|
||||||
|
@PrimaryKey(autoGenerate = true)
|
||||||
|
var id: Long,
|
||||||
|
var title: String,
|
||||||
|
var url: String,
|
||||||
|
var intervalNr: Long,
|
||||||
|
var intervalCategory: String,
|
||||||
|
var format: Format,
|
||||||
|
var type: Type,
|
||||||
|
var downloadPath: String,
|
||||||
|
var runOnLowBattery: Boolean,
|
||||||
|
var runOnMobileData: Boolean,
|
||||||
|
var replaceFiles: Boolean,
|
||||||
|
)
|
||||||
|
|
@ -5,8 +5,6 @@ import android.app.Dialog
|
||||||
import android.content.DialogInterface
|
import android.content.DialogInterface
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.text.Editable
|
|
||||||
import android.text.TextWatcher
|
|
||||||
import android.util.DisplayMetrics
|
import android.util.DisplayMetrics
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.view.KeyEvent
|
import android.view.KeyEvent
|
||||||
|
|
@ -20,11 +18,19 @@ import com.deniscerri.ytdlnis.util.FileUtil
|
||||||
import com.deniscerri.ytdlnis.util.InfoUtil
|
import com.deniscerri.ytdlnis.util.InfoUtil
|
||||||
import com.deniscerri.ytdlnis.util.UiUtil
|
import com.deniscerri.ytdlnis.util.UiUtil
|
||||||
import com.google.android.exoplayer2.ExoPlayer
|
import com.google.android.exoplayer2.ExoPlayer
|
||||||
import com.google.android.exoplayer2.MediaItem
|
import com.google.android.exoplayer2.MediaItem.fromUri
|
||||||
import com.google.android.exoplayer2.Player
|
import com.google.android.exoplayer2.Player
|
||||||
|
import com.google.android.exoplayer2.source.DefaultMediaSourceFactory
|
||||||
|
import com.google.android.exoplayer2.source.MediaSource
|
||||||
|
import com.google.android.exoplayer2.source.MergingMediaSource
|
||||||
|
import com.google.android.exoplayer2.source.ProgressiveMediaSource
|
||||||
|
import com.google.android.exoplayer2.source.dash.DashMediaSource
|
||||||
|
import com.google.android.exoplayer2.source.hls.HlsMediaSource
|
||||||
import com.google.android.exoplayer2.ui.PlayerView
|
import com.google.android.exoplayer2.ui.PlayerView
|
||||||
|
import com.google.android.exoplayer2.upstream.FileDataSource
|
||||||
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||||
|
import com.google.android.material.card.MaterialCardView
|
||||||
import com.google.android.material.slider.RangeSlider
|
import com.google.android.material.slider.RangeSlider
|
||||||
import com.google.android.material.textfield.TextInputLayout
|
import com.google.android.material.textfield.TextInputLayout
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
|
@ -66,6 +72,7 @@ class CutVideoBottomSheetDialog(private val item: DownloadItem, private val list
|
||||||
}
|
}
|
||||||
|
|
||||||
player = ExoPlayer.Builder(requireContext()).build()
|
player = ExoPlayer.Builder(requireContext()).build()
|
||||||
|
val frame = view.findViewById<MaterialCardView>(R.id.frame_layout)
|
||||||
val videoView = view.findViewById<PlayerView>(R.id.video_view)
|
val videoView = view.findViewById<PlayerView>(R.id.video_view)
|
||||||
videoView.player = player
|
videoView.player = player
|
||||||
|
|
||||||
|
|
@ -98,21 +105,39 @@ class CutVideoBottomSheetDialog(private val item: DownloadItem, private val list
|
||||||
val url = withContext(Dispatchers.IO){
|
val url = withContext(Dispatchers.IO){
|
||||||
infoUtil.getStreamingUrl(item.url)
|
infoUtil.getStreamingUrl(item.url)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (url.isBlank()) throw Exception("No Streaming URL found!")
|
||||||
|
Log.e("aa", url.split("\n")[0])
|
||||||
|
Log.e("aa", url.split("\n")[1])
|
||||||
|
|
||||||
|
val urls = url.split("\n")
|
||||||
|
if (urls.size == 2){
|
||||||
|
val audioSource: MediaSource =
|
||||||
|
DefaultMediaSourceFactory(requireContext())
|
||||||
|
.createMediaSource(fromUri(Uri.parse(urls[0])))
|
||||||
|
val videoSource: MediaSource =
|
||||||
|
DefaultMediaSourceFactory(requireContext())
|
||||||
|
.createMediaSource(fromUri(Uri.parse(urls[1])))
|
||||||
|
(player as ExoPlayer).setMediaSource(MergingMediaSource(videoSource, audioSource))
|
||||||
|
}else{
|
||||||
|
player.addMediaItem(fromUri(Uri.parse(urls[0])))
|
||||||
|
}
|
||||||
|
|
||||||
progress.visibility = View.GONE
|
progress.visibility = View.GONE
|
||||||
player.addMediaItem(MediaItem.fromUri(Uri.parse(url)))
|
|
||||||
player.prepare()
|
player.prepare()
|
||||||
player.seekTo((((rangeSlider.values[0].toInt() * timeSeconds) / 100) * 1000).toLong())
|
player.seekTo((((rangeSlider.values[0].toInt() * timeSeconds) / 100) * 1000).toLong())
|
||||||
player.play()
|
player.play()
|
||||||
}catch (e: Exception){
|
}catch (e: Exception){
|
||||||
progress.visibility = View.GONE
|
progress.visibility = View.GONE
|
||||||
videoView.visibility = View.GONE
|
frame.visibility = View.GONE
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//poll video progress
|
//poll video progress
|
||||||
lifecycleScope.launch {
|
lifecycleScope.launch {
|
||||||
audioProgress(player).collect {
|
videoProgress(player).collect {
|
||||||
val startTimestamp = (rangeSlider.values[0].toInt() * timeSeconds) / 100
|
val startTimestamp = (rangeSlider.values[0].toInt() * timeSeconds) / 100
|
||||||
val endTimestamp = (rangeSlider.values[1].toInt() * timeSeconds) / 100
|
val endTimestamp = (rangeSlider.values[1].toInt() * timeSeconds) / 100
|
||||||
if (it >= endTimestamp){
|
if (it >= endTimestamp){
|
||||||
|
|
@ -219,7 +244,7 @@ class CutVideoBottomSheetDialog(private val item: DownloadItem, private val list
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun audioProgress(player: Player?) = flow<Int> {
|
private fun videoProgress(player: Player?) = flow<Int> {
|
||||||
while (true) {
|
while (true) {
|
||||||
emit((player!!.currentPosition / 1000).toInt())
|
emit((player!!.currentPosition / 1000).toInt())
|
||||||
delay(1000)
|
delay(1000)
|
||||||
|
|
|
||||||
|
|
@ -644,8 +644,7 @@ class InfoUtil(context: Context) {
|
||||||
arrayOf(youtubeDLResponse.out)
|
arrayOf(youtubeDLResponse.out)
|
||||||
}
|
}
|
||||||
val jsonObject = JSONObject(results[0]!!)
|
val jsonObject = JSONObject(results[0]!!)
|
||||||
val streamURL = jsonObject.getString("urls")
|
return jsonObject.getString("urls")
|
||||||
return streamURL.split("\n")[0]
|
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue