Player: get media info by id
This allows us to get additional data (needed for "play next episode")
This commit is contained in:
parent
2e0a114a80
commit
353ae6937a
|
@ -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 {
|
val intent = Intent(this, PlayerActivity::class.java).apply {
|
||||||
putExtra(getString(R.string.intent_stream_url), streamUrl)
|
putExtra(getString(R.string.intent_media_id), mediaId)
|
||||||
putExtra(getString(R.string.intent_title), title)
|
putExtra(getString(R.string.intent_episode_id), episodeId)
|
||||||
}
|
}
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,11 @@ import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory
|
||||||
import com.google.android.exoplayer2.util.Util
|
import com.google.android.exoplayer2.util.Util
|
||||||
import kotlinx.android.synthetic.main.activity_player.*
|
import kotlinx.android.synthetic.main.activity_player.*
|
||||||
import kotlinx.android.synthetic.main.player_controls.*
|
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
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
class PlayerActivity : AppCompatActivity() {
|
class PlayerActivity : AppCompatActivity() {
|
||||||
|
@ -29,7 +34,13 @@ class PlayerActivity : AppCompatActivity() {
|
||||||
private lateinit var gestureDetector: GestureDetectorCompat
|
private lateinit var gestureDetector: GestureDetectorCompat
|
||||||
|
|
||||||
private var streamUrl = ""
|
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 playWhenReady = true
|
||||||
private var currentWindow = 0
|
private var currentWindow = 0
|
||||||
|
@ -49,8 +60,9 @@ class PlayerActivity : AppCompatActivity() {
|
||||||
playbackPosition = it.getLong(getString(R.string.state_resume_position))
|
playbackPosition = it.getLong(getString(R.string.state_resume_position))
|
||||||
playWhenReady = it.getBoolean(getString(R.string.state_is_playing))
|
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())
|
gestureDetector = GestureDetectorCompat(this, PlayerGestureListener())
|
||||||
|
|
||||||
|
@ -98,16 +110,30 @@ class PlayerActivity : AppCompatActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initPlayer() {
|
private fun initPlayer() {
|
||||||
if (streamUrl.isEmpty()) {
|
if (mediaId <= 0) {
|
||||||
Log.e(javaClass.name, "No stream url was set.")
|
Log.e(javaClass.name, "No media id was set.")
|
||||||
return
|
this.finish()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
initMedia()
|
||||||
initExoPlayer()
|
initExoPlayer()
|
||||||
initVideoView()
|
initVideoView()
|
||||||
initController()
|
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() {
|
private fun initExoPlayer() {
|
||||||
player = SimpleExoPlayer.Builder(this).build()
|
player = SimpleExoPlayer.Builder(this).build()
|
||||||
dataSourceFactory = DefaultDataSourceFactory(this, Util.getUserAgent(this, "Teapod"))
|
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() {
|
private fun initActions() {
|
||||||
|
@ -200,6 +226,30 @@ class PlayerActivity : AppCompatActivity() {
|
||||||
player.seekTo(player.currentPosition + fwdTime)
|
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
|
* hide the status and navigation bar
|
||||||
|
|
|
@ -148,23 +148,9 @@ class MediaFragment(private val media: Media, private val tmdb: TMDBResponse) :
|
||||||
text_title.text = nextEpisode.title
|
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) {
|
private fun playStream(ep: Episode) {
|
||||||
val streamUrl = if ((Preferences.preferSecondary || ep.priStreamUrl.isEmpty()) && ep.secStreamOmU) {
|
Log.d(javaClass.name, "Starting Player with mediaId: ${media.id}")
|
||||||
ep.secStreamUrl
|
(activity as MainActivity).startPlayer(media.id, ep.id)
|
||||||
} 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)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -65,8 +65,8 @@
|
||||||
<string name="save_key_prefer_secondary" translatable="false">org.mosad.teapod.prefer_secondary</string>
|
<string name="save_key_prefer_secondary" translatable="false">org.mosad.teapod.prefer_secondary</string>
|
||||||
|
|
||||||
<!-- intents & states -->
|
<!-- intents & states -->
|
||||||
<string name="intent_stream_url" translatable="false">intent_stream_url</string>
|
<string name="intent_media_id" translatable="false">intent_media_id</string>
|
||||||
<string name="intent_title" translatable="false">intent_title</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_window" translatable="false">state_resume_window</string>
|
||||||
<string name="state_resume_position" translatable="false">state_resume_position</string>
|
<string name="state_resume_position" translatable="false">state_resume_position</string>
|
||||||
<string name="state_is_playing" translatable="false">state_is_playing</string>
|
<string name="state_is_playing" translatable="false">state_is_playing</string>
|
||||||
|
|
Loading…
Reference in New Issue