From 20407d9cac7e9d332f1b744d69e05734144b44d7 Mon Sep 17 00:00:00 2001 From: Jannik Date: Wed, 2 Dec 2020 11:14:09 +0100 Subject: [PATCH] add permanently visible next episode button & fix autoplay * autoplay / play next episode could sometimes skip episodes --- .../java/org/mosad/teapod/parser/AoDParser.kt | 2 +- .../org/mosad/teapod/player/PlayerActivity.kt | 53 +++++++++++++------ .../res/drawable/ic_baseline_skip_next_24.xml | 5 ++ .../drawable/ic_baseline_video_library_24.xml | 13 ++--- app/src/main/res/layout/player_controls.xml | 36 +++++++++++++ app/src/main/res/values-de-rDE/strings.xml | 8 +-- app/src/main/res/values/strings.xml | 4 +- 7 files changed, 90 insertions(+), 31 deletions(-) create mode 100644 app/src/main/res/drawable/ic_baseline_skip_next_24.xml diff --git a/app/src/main/java/org/mosad/teapod/parser/AoDParser.kt b/app/src/main/java/org/mosad/teapod/parser/AoDParser.kt index a5397d3..835c37b 100644 --- a/app/src/main/java/org/mosad/teapod/parser/AoDParser.kt +++ b/app/src/main/java/org/mosad/teapod/parser/AoDParser.kt @@ -302,7 +302,7 @@ object AoDParser { } } - // parse additional information for tv shows + // parse additional information for tv shows the episode title (description) is loaded from the "api" if (media.type == MediaType.TVSHOW) { res.select("div.three-box-container > div.episodebox").forEach { episodebox -> // make sure the episode has a streaming link diff --git a/app/src/main/java/org/mosad/teapod/player/PlayerActivity.kt b/app/src/main/java/org/mosad/teapod/player/PlayerActivity.kt index 10be9f7..c825ddd 100644 --- a/app/src/main/java/org/mosad/teapod/player/PlayerActivity.kt +++ b/app/src/main/java/org/mosad/teapod/player/PlayerActivity.kt @@ -29,6 +29,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.mosad.teapod.R import org.mosad.teapod.preferences.Preferences +import org.mosad.teapod.util.DataTypes import org.mosad.teapod.util.Episode import java.util.* import java.util.concurrent.TimeUnit @@ -44,6 +45,7 @@ class PlayerActivity : AppCompatActivity() { private lateinit var gestureDetector: GestureDetectorCompat private lateinit var timerUpdates: TimerTask + private var nextEpManually = false private var playWhenReady = true private var currentWindow = 0 private var playbackPosition: Long = 0 @@ -129,14 +131,9 @@ class PlayerActivity : AppCompatActivity() { dataSourceFactory = DefaultDataSourceFactory(this, Util.getUserAgent(this, "Teapod")) controller = video_view.findViewById(R.id.exo_controller) - val mediaSource = HlsMediaSource.Factory(dataSourceFactory) - .createMediaSource(MediaItem.fromUri(Uri.parse(autoSelectStream(model.currentEpisode)))) + controller.isAnimationEnabled = false // disable controls (time-bar) animation player.playWhenReady = playWhenReady - player.setMediaSource(mediaSource) - player.seekTo(playbackPosition) - player.prepare() - player.addListener(object : Player.EventListener { override fun onPlaybackStateChanged(state: Int) { super.onPlaybackStateChanged(state) @@ -154,14 +151,16 @@ class PlayerActivity : AppCompatActivity() { } if (state == ExoPlayer.STATE_ENDED && model.nextEpisode != null && Preferences.autoplay) { - playNextEpisode() + if (nextEpManually) { + nextEpManually = false + } else { + playNextEpisode() + } } - } }) - controller.isAnimationEnabled = false // disable controls (time-bar) animation - exo_text_title.text = model.currentEpisode.title // set media title + playCurrentMedia(true) } @SuppressLint("ClickableViewAccessibility") @@ -187,6 +186,7 @@ class PlayerActivity : AppCompatActivity() { rwd_10.setOnButtonClickListener { rewind() } ffwd_10.setOnButtonClickListener { fastForward() } button_next_ep.setOnClickListener { playNextEpisode() } + button_next_ep_c.setOnClickListener { playNextEpisode() } } private fun initTimeUpdates() { @@ -299,18 +299,37 @@ class PlayerActivity : AppCompatActivity() { } } - private fun playNextEpisode() = model.nextEpisode?.let { nextEp -> - // update the gui - exo_text_title.text = nextEp.title + private fun playNextEpisode() = model.nextEpisode?.let { + model.nextEpisode() // current = next, next = new or null hideButtonNextEp() + nextEpManually = true + playCurrentMedia(false) + } + + /** + * start playing a episode + * Note: movies are episodes too! + */ + private fun playCurrentMedia(seekToPosition: Boolean) { + // update the gui + exo_text_title.text = if (model.media.type == DataTypes.MediaType.TVSHOW) { + getString(R.string.component_episode_title, model.currentEpisode.number, model.currentEpisode.description) + } else { + model.currentEpisode.title + } + + if (model.nextEpisode == null) { + button_next_ep_c.visibility = View.GONE + } + player.clearMediaItems() //remove previous item - val mediaSource = HlsMediaSource.Factory(dataSourceFactory) - .createMediaSource(MediaItem.fromUri(Uri.parse(autoSelectStream(nextEp)))) + val mediaSource = HlsMediaSource.Factory(dataSourceFactory).createMediaSource( + MediaItem.fromUri(Uri.parse(autoSelectStream(model.currentEpisode))) + ) + if (seekToPosition) player.seekTo(playbackPosition) player.setMediaSource(mediaSource) player.prepare() - - model.nextEpisode() } /** diff --git a/app/src/main/res/drawable/ic_baseline_skip_next_24.xml b/app/src/main/res/drawable/ic_baseline_skip_next_24.xml new file mode 100644 index 0000000..4680420 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_skip_next_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_video_library_24.xml b/app/src/main/res/drawable/ic_baseline_video_library_24.xml index 2259eaf..476e56f 100644 --- a/app/src/main/res/drawable/ic_baseline_video_library_24.xml +++ b/app/src/main/res/drawable/ic_baseline_video_library_24.xml @@ -1,10 +1,5 @@ - - + + diff --git a/app/src/main/res/layout/player_controls.xml b/app/src/main/res/layout/player_controls.xml index abfc3d2..1e86411 100644 --- a/app/src/main/res/layout/player_controls.xml +++ b/app/src/main/res/layout/player_controls.xml @@ -108,4 +108,40 @@ app:layout_constraintTop_toTopOf="parent" /> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index c76df61..62656f8 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -16,8 +16,8 @@ Abspielen %1$d Episoden %1$d Minuten - Ep. %1$d %2$s - Ep. %1$d %2$s (OmU) + Flg. %1$d %2$s + Flg. %1$d %2$s (OmU) Account @@ -40,7 +40,9 @@ 10 Sekunden zurück Abspielen/Pause 10 Sekunden vorwärts - Nächste Episode + Nächste Folge + Folge + Folgen speichern diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6a14e39..c09898f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -52,9 +52,11 @@ forward 10 seconds - 10 s + 10 s + Next Episode %1$02d:%2$02d %1$d:%2$02d:%3$02d - Next Episode + Episode + Episodes save