Skip to content

Commit a67d92b

Browse files
committed
[ISSUE-68] Adding Youtube player instead of exoplayer shit
1 parent d625edd commit a67d92b

File tree

8 files changed

+68
-32
lines changed

8 files changed

+68
-32
lines changed

core-shared-ui/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ dependencies {
88
implementation(libs.bundles.koin)
99
implementation(libs.bundles.kotlin)
1010
implementation(libs.bundles.androidSupport)
11-
implementation(libs.bundles.media3)
11+
implementation(libs.android.youtube.player)
1212
testImplementation(libs.bundles.test)
1313
}

core-shared-ui/src/main/java/com/codandotv/streamplayerapp/core_shared_ui/widget/PlayerComponent.kt

Lines changed: 60 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,28 +13,68 @@ import androidx.compose.ui.Modifier
1313
import androidx.compose.ui.platform.LocalContext
1414
import androidx.compose.ui.unit.dp
1515
import androidx.compose.ui.viewinterop.AndroidView
16-
import androidx.media3.common.MediaItem
17-
import androidx.media3.exoplayer.ExoPlayer
18-
import androidx.media3.ui.PlayerView
1916
import com.codandotv.streamplayerapp.core_shared_ui.theme.ThemePreviews
17+
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.PlayerConstants
18+
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.YouTubePlayer
19+
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.listeners.YouTubePlayerListener
20+
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.views.YouTubePlayerView
2021

2122
@Composable
22-
fun PlayerComponent(url: String, modifier: Modifier = Modifier) {
23+
fun PlayerComponent(videoId: String, modifier: Modifier = Modifier) {
24+
2325
val context = LocalContext.current
2426

25-
val exoplayer = remember {
26-
val mediaItem = MediaItem.Builder()
27-
.setUri(url)
28-
.build()
27+
val youtubePlayerView = remember {
28+
YouTubePlayerView(context).apply {
29+
enableAutomaticInitialization = false
30+
31+
addYouTubePlayerListener(object : YouTubePlayerListener {
32+
override fun onApiChange(youTubePlayer: YouTubePlayer) {}
33+
34+
override fun onCurrentSecond(youTubePlayer: YouTubePlayer, second: Float) {}
35+
36+
override fun onError(
37+
youTubePlayer: YouTubePlayer,
38+
error: PlayerConstants.PlayerError
39+
) {
40+
}
41+
42+
override fun onPlaybackQualityChange(
43+
youTubePlayer: YouTubePlayer,
44+
playbackQuality: PlayerConstants.PlaybackQuality
45+
) {
46+
}
47+
48+
override fun onPlaybackRateChange(
49+
youTubePlayer: YouTubePlayer,
50+
playbackRate: PlayerConstants.PlaybackRate
51+
) {
52+
}
53+
54+
override fun onReady(youTubePlayer: YouTubePlayer) {
55+
youTubePlayer.loadVideo(videoId, 0f)
56+
}
57+
58+
override fun onStateChange(
59+
youTubePlayer: YouTubePlayer,
60+
state: PlayerConstants.PlayerState
61+
) {
62+
}
63+
64+
override fun onVideoDuration(youTubePlayer: YouTubePlayer, duration: Float) {}
2965

30-
ExoPlayer.Builder(context).build().apply {
31-
setMediaItem(mediaItem)
32-
prepare()
66+
override fun onVideoId(youTubePlayer: YouTubePlayer, videoId: String) {}
3367

34-
playWhenReady = true
68+
override fun onVideoLoadedFraction(
69+
youTubePlayer: YouTubePlayer,
70+
loadedFraction: Float
71+
) {
72+
}
73+
})
3574
}
3675
}
3776

77+
3878
Column(
3979
modifier = modifier
4080
.fillMaxSize()
@@ -46,27 +86,25 @@ fun PlayerComponent(url: String, modifier: Modifier = Modifier) {
4686
.height(200.dp)
4787
.align(Alignment.TopCenter),
4888
factory = {
49-
PlayerView(it).apply {
50-
player = exoplayer
51-
useController = true
52-
}
89+
youtubePlayerView
5390
}
5491
)
5592
}
5693
}
5794

58-
DisposableEffect(key1 = Unit, effect = {
59-
onDispose {
60-
exoplayer.release()
61-
}
62-
})
95+
DisposableEffect(
96+
key1 = Unit,
97+
effect = {
98+
onDispose { youtubePlayerView.release() }
99+
},
100+
)
63101
}
64102

65103
@Composable
66104
@ThemePreviews
67105
fun PlayerComponentPreview() {
68106
PlayerComponent(
69-
url = "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4",
107+
videoId = "BigBuckBunny.mp4",
70108
modifier = Modifier.fillMaxWidth()
71109
)
72110
}

feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/domain/DetailStreamMapper.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ fun DetailStreamResponse.toDetailStream(): DetailStream =
1717
fun VideoStreamsResponse.toVideoStreams(): List<VideoStream> =
1818
results.map {
1919
VideoStream(
20-
youtubeUrl = "http://youtube.com/watch?v=".plus(it.key),
20+
videoId = it.key,
2121
movieId = this.id
2222
)
2323
}

feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/domain/VideoStream.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ package com.codandotv.streamplayerapp.feature_list_streams.detail.domain
22

33
data class VideoStream(
44
val movieId: Long,
5-
val youtubeUrl: String,
5+
val videoId: String,
66
)

feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/screens/DetailStreamViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class DetailStreamViewModel(
3737
.zip(videoStreamsUseCase.getVideoStreams()) { detailStream, videoUrl ->
3838
DetailStreamsLoadedUIState(
3939
detailStream = detailStream,
40-
videoUrl = videoUrl.firstOrNull()?.youtubeUrl
40+
videoId = videoUrl.firstOrNull()?.videoId
4141
)
4242
}
4343
.onStart { onLoading() }

feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/screens/DetailStreamsUIState.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import com.codandotv.streamplayerapp.feature_list_streams.detail.domain.DetailSt
55
sealed class DetailStreamsUIState {
66
data class DetailStreamsLoadedUIState(
77
val detailStream: DetailStream,
8-
val videoUrl: String?,
8+
val videoId: String?,
99
) : DetailStreamsUIState()
1010

1111
object LoadingStreamUIState : DetailStreamsUIState()

feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/detail/presentation/widget/DetailStreamImagePreview.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ fun DetailStreamImagePreview(
3535
) {
3636
if (showPlayer) {
3737
PlayerComponent(
38-
url = "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"
38+
videoId = uiState.videoId ?: ""
3939
)
4040
} else {
4141
AsyncImage(

gradle/libs.versions.toml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ compose_pagging="1.0.0-alpha20"
4242
coil = "2.3.0"
4343
lottie = "5.2.0"
4444

45-
media3 = "1.1.0"
45+
android_youtube_player_version = "12.0.0"
4646

4747
[libraries]
4848
kotlin_gradle_plugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" }
@@ -111,8 +111,7 @@ moshi_converter = { group = "com.squareup.retrofit2", name = "converter-moshi",
111111
okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" }
112112
interceptor = { group = "com.squareup.okhttp3", name = "logging-interceptor", version.ref = "okhttp" }
113113

114-
media3_base = { group = "androidx.media3", name = "media3-exoplayer", version.ref = "media3"}
115-
media3_ui = { group = "androidx.media3", name = "media3-ui", version.ref = "media3"}
114+
android_youtube_player = { group = "com.pierfrancescosoffritti.androidyoutubeplayer", name = "core", version.ref = "android_youtube_player_version" }
116115

117116
[bundles]
118117
compose = ["compose.ui", "compose.icons", "compose.material3","compose_pagging", "compose.lifecycle", "compose.navigation", "compose.activity", "compose.ui.tooling"]
@@ -122,7 +121,6 @@ koin = ["koin_android", "koin_compose"]
122121
test = ["junit", "mockk", "mockk_android", "viewmodel_test", "koin_test"]
123122
androidSupport = ["androidx_core", "androidx_appcompat", "androidx_dynamicanimation","google_material"]
124123
kotlin = ["androidx_core", "kotlin_stdlib", "kotlin_reflect"]
125-
media3 = ["media3_base", "media3_ui"]
126124

127125
[plugins]
128126
android_application = { id = "com.android.application", version.ref = "android_gradle_plugin" }

0 commit comments

Comments
 (0)