Player: get media info by id

This allows us to get additional data (needed for "play next episode")
This commit is contained in:
Jannik 2020-11-13 11:23:09 +01:00
parent 2e0a114a80
commit 353ae6937a
Signed by: Seil0
GPG Key ID: E8459F3723C52C24
4 changed files with 64 additions and 28 deletions

View File

@ -151,10 +151,10 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS
}
}
fun startPlayer(streamUrl: String, title: String) {
fun startPlayer(mediaId: Int, episodeId: Int) {
val intent = Intent(this, PlayerActivity::class.java).apply {
putExtra(getString(R.string.intent_stream_url), streamUrl)
putExtra(getString(R.string.intent_title), title)
putExtra(getString(R.string.intent_media_id), mediaId)
putExtra(getString(R.string.intent_episode_id), episodeId)
}
startActivity(intent)
}

View File

@ -19,6 +19,11 @@ import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory
import com.google.android.exoplayer2.util.Util
import kotlinx.android.synthetic.main.activity_player.*
import kotlinx.android.synthetic.main.player_controls.*
import org.mosad.teapod.parser.AoDParser
import org.mosad.teapod.preferences.Preferences
import org.mosad.teapod.util.DataTypes.MediaType
import org.mosad.teapod.util.Episode
import org.mosad.teapod.util.Media
import java.util.concurrent.TimeUnit
class PlayerActivity : AppCompatActivity() {
@ -29,7 +34,13 @@ class PlayerActivity : AppCompatActivity() {
private lateinit var gestureDetector: GestureDetectorCompat
private var streamUrl = ""
private var title = ""
private var mediaId = 0
private var episodeId = 0
private var media: Media = Media(0, "", MediaType.OTHER)
private var currentEpisode = Episode()
private var nextEpisode: Episode? = null
private var playWhenReady = true
private var currentWindow = 0
@ -49,8 +60,9 @@ class PlayerActivity : AppCompatActivity() {
playbackPosition = it.getLong(getString(R.string.state_resume_position))
playWhenReady = it.getBoolean(getString(R.string.state_is_playing))
}
streamUrl = intent.getStringExtra(getString(R.string.intent_stream_url)).toString()
title = intent.getStringExtra(getString(R.string.intent_title)).toString()
mediaId = intent.getIntExtra(getString(R.string.intent_media_id), 0)
episodeId = intent.getIntExtra(getString(R.string.intent_episode_id), 0)
gestureDetector = GestureDetectorCompat(this, PlayerGestureListener())
@ -98,16 +110,30 @@ class PlayerActivity : AppCompatActivity() {
}
private fun initPlayer() {
if (streamUrl.isEmpty()) {
Log.e(javaClass.name, "No stream url was set.")
return
if (mediaId <= 0) {
Log.e(javaClass.name, "No media id was set.")
this.finish()
}
initMedia()
initExoPlayer()
initVideoView()
initController()
}
private fun initMedia() {
media = AoDParser.getMediaById(mediaId)
currentEpisode = media.episodes.first { it.id == episodeId }
streamUrlFromEp(currentEpisode) // get current stream
// get next episode if present
val nextEpIndex = media.episodes.indexOfFirst { it.id == episodeId } + 1
if (nextEpIndex < (media.episodes.size - 1)) {
println("has next episode")
nextEpisode = media.episodes[nextEpIndex]
}
}
private fun initExoPlayer() {
player = SimpleExoPlayer.Builder(this).build()
dataSourceFactory = DefaultDataSourceFactory(this, Util.getUserAgent(this, "Teapod"))
@ -174,7 +200,7 @@ class PlayerActivity : AppCompatActivity() {
}
}
exo_text_title.text = title // set media title
exo_text_title.text = currentEpisode.title // set media title
}
private fun initActions() {
@ -200,6 +226,30 @@ class PlayerActivity : AppCompatActivity() {
player.seekTo(player.currentPosition + fwdTime)
}
@Suppress("unused")
private fun playNextEpisode() {
nextEpisode?.let { streamUrlFromEp(it) }
// TODO play
// TODO set next episode if present
}
/**
* If preferSecondary or priStreamUrl is empty and secondary is present (secStreamOmU),
* use the secondary stream. Else, if the primary stream is set use the primary stream.
* If no stream is present, close the activity.
*/
private fun streamUrlFromEp(episode: Episode) {
streamUrl = if ((Preferences.preferSecondary || episode.priStreamUrl.isEmpty()) && episode.secStreamOmU) {
episode.secStreamUrl
} else if (episode.priStreamUrl.isNotEmpty()) {
episode.priStreamUrl
} else {
Log.e(javaClass.name, "No stream url set.")
this.finish()
return
}
}
/**
* hide the status and navigation bar

View File

@ -148,23 +148,9 @@ class MediaFragment(private val media: Media, private val tmdb: TMDBResponse) :
text_title.text = nextEpisode.title
}
/**
* Play the media's stream
* If prefer secondary or primary is empty and secondary is present (secStreamOmU),
* use the secondary stream. Else, if the primary stream is set use the primary stream.
*/
private fun playStream(ep: Episode) {
val streamUrl = if ((Preferences.preferSecondary || ep.priStreamUrl.isEmpty()) && ep.secStreamOmU) {
ep.secStreamUrl
} else if (ep.priStreamUrl.isNotEmpty()) {
ep.priStreamUrl
} else {
Log.e(javaClass.name, "No stream url set.")
""
}
Log.d(javaClass.name, "Playing stream: $streamUrl")
(activity as MainActivity).startPlayer(streamUrl, ep.title)
Log.d(javaClass.name, "Starting Player with mediaId: ${media.id}")
(activity as MainActivity).startPlayer(media.id, ep.id)
}
}

View File

@ -65,8 +65,8 @@
<string name="save_key_prefer_secondary" translatable="false">org.mosad.teapod.prefer_secondary</string>
<!-- intents & states -->
<string name="intent_stream_url" translatable="false">intent_stream_url</string>
<string name="intent_title" translatable="false">intent_title</string>
<string name="intent_media_id" translatable="false">intent_media_id</string>
<string name="intent_episode_id" translatable="false">intent_episode_id</string>
<string name="state_resume_window" translatable="false">state_resume_window</string>
<string name="state_resume_position" translatable="false">state_resume_position</string>
<string name="state_is_playing" translatable="false">state_is_playing</string>