Player: get media info by id
This allows us to get additional data (needed for "play next episode")
This commit is contained in:
		| @ -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) | ||||
|     } | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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) | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -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> | ||||
|  | ||||
		Reference in New Issue
	
	Block a user