diff --git a/app/build.gradle b/app/build.gradle index cd43f2185..974a0412a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { defaultConfig { applicationId 'com.github.libretube' - minSdk 21 + minSdk 24 targetSdk 31 versionCode 4 versionName '0.2.2' @@ -61,4 +61,6 @@ dependencies { implementation 'com.squareup.retrofit2:converter-jackson:2.9.0' implementation 'com.fasterxml.jackson.core:jackson-annotations:2.13.1' implementation 'com.squareup.retrofit2:converter-scalars:2.1.0' + + implementation 'com.arthenica:ffmpeg-kit-full:4.5.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e4a15fec5..f27bc0190 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -35,6 +35,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/github/libretube/PlayerFragment.kt b/app/src/main/java/com/github/libretube/PlayerFragment.kt index 8e0ec11b9..f0a9a06f0 100644 --- a/app/src/main/java/com/github/libretube/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/PlayerFragment.kt @@ -1,58 +1,49 @@ package com.github.libretube import android.annotation.SuppressLint -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.constraintlayout.motion.widget.MotionLayout -import androidx.recyclerview.widget.RecyclerView -import com.google.android.exoplayer2.ExoPlayer -import com.google.android.exoplayer2.MediaItem -import com.google.android.exoplayer2.MediaItem.SubtitleConfiguration -import com.google.android.exoplayer2.source.MediaSource - -import com.google.android.exoplayer2.ui.StyledPlayerView - -import java.io.IOException -import kotlin.math.abs -import com.google.android.exoplayer2.util.MimeTypes -import com.google.common.collect.ImmutableList -import android.app.ActionBar import android.app.Activity import android.content.Context import android.content.DialogInterface import android.content.pm.ActivityInfo -import android.widget.* -import androidx.core.net.toUri -import com.google.android.exoplayer2.MediaItem.fromUri -import com.google.android.exoplayer2.source.MergingMediaSource -import com.google.android.exoplayer2.source.ProgressiveMediaSource -import com.google.android.exoplayer2.upstream.DataSource - -import com.google.android.exoplayer2.upstream.DefaultHttpDataSource -import android.widget.TextView - import android.os.Build +import android.os.Bundle import android.text.Html import android.util.Log import android.util.TypedValue +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.* import androidx.appcompat.app.AlertDialog +import androidx.constraintlayout.motion.widget.MotionLayout import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.net.toUri import androidx.core.os.bundleOf +import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager - -import com.google.android.exoplayer2.Player -import com.google.android.exoplayer2.source.DefaultMediaSourceFactory - -import com.squareup.picasso.Picasso -import retrofit2.HttpException +import androidx.recyclerview.widget.RecyclerView +import com.arthenica.ffmpegkit.FFmpegKit import com.github.libretube.adapters.TrendingAdapter import com.github.libretube.obj.PipedStream import com.github.libretube.obj.Subscribe +import com.google.android.exoplayer2.ExoPlayer +import com.google.android.exoplayer2.MediaItem +import com.google.android.exoplayer2.MediaItem.SubtitleConfiguration +import com.google.android.exoplayer2.MediaItem.fromUri +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.ui.StyledPlayerView +import com.google.android.exoplayer2.upstream.DataSource +import com.google.android.exoplayer2.upstream.DefaultHttpDataSource import com.google.android.material.button.MaterialButton +import com.squareup.picasso.Picasso +import retrofit2.HttpException +import java.io.IOException +import kotlin.math.abs var isFullScreen = false @@ -75,6 +66,8 @@ class PlayerFragment : Fragment() { private lateinit var exoPlayer: ExoPlayer private lateinit var mediaSource: MediaSource + private lateinit var relDownloadVideo: RelativeLayout + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) arguments?.let { @@ -92,6 +85,7 @@ class PlayerFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + relDownloadVideo = view.findViewById(R.id.relPlayer_download) val mainActivity = activity as MainActivity mainActivity.findViewById(R.id.container).visibility=View.VISIBLE val playerMotionLayout = view.findViewById(R.id.playerMotionLayout) @@ -363,6 +357,30 @@ class PlayerFragment : Fragment() { val subButton = view.findViewById(R.id.player_subscribe) isSubscribed(subButton, channelId!!) } + relDownloadVideo.setOnClickListener { + Log.e(TAG,"download button clicked!") + FFmpegKit.executeAsync("-i ${response.videoStreams[0].url} -i ${response.audioStreams!![0].url} -c copy output.mkv", + { session -> + val state = session.state + val returnCode = session.returnCode + + // CALLED WHEN SESSION IS EXECUTED + Log.d( + TAG, + String.format( + "FFmpeg process exited with state %s and rc %s.%s", + state, + returnCode, + session.failStackTrace + ) + ) + }, { + // CALLED WHEN SESSION PRINTS LOGS + }) { + // CALLED WHEN SESSION GENERATES STATISTICS + } + + } } } @@ -371,6 +389,8 @@ class PlayerFragment : Fragment() { } + + private fun isSubscribed(button: MaterialButton, channel_id: String){ @SuppressLint("ResourceAsColor") fun run() { diff --git a/app/src/main/java/com/github/libretube/Settings.kt b/app/src/main/java/com/github/libretube/Settings.kt index 93cafa75d..3454b7ccb 100644 --- a/app/src/main/java/com/github/libretube/Settings.kt +++ b/app/src/main/java/com/github/libretube/Settings.kt @@ -24,7 +24,7 @@ class Settings : PreferenceFragmentCompat() { setPreferencesFromResource(R.xml.settings, rootKey) val instance = findPreference("instance") fetchInstance() - instance?.setOnPreferenceChangeListener { preference, newValue -> + instance?.setOnPreferenceChangeListener { _, newValue -> RetrofitInstance.url = newValue.toString() RetrofitInstance.lazyMgr.reset() val sharedPref = context?.getSharedPreferences("token", Context.MODE_PRIVATE) @@ -62,7 +62,6 @@ class Settings : PreferenceFragmentCompat() { Log.e("settings",e.toString()) return@launchWhenCreated } - //println("dafaq $response") val listEntries: MutableList = ArrayList() val listEntryValues: MutableList = ArrayList() for(item in response){ diff --git a/app/src/main/res/layout/fragment_player.xml b/app/src/main/res/layout/fragment_player.xml index 041f6ff40..8ad0a1a43 100644 --- a/app/src/main/res/layout/fragment_player.xml +++ b/app/src/main/res/layout/fragment_player.xml @@ -101,6 +101,7 @@