Skip to content

Commit 6ea6f9d

Browse files
sentinelwebsentinelweb
authored andcommitted
#496 - logging exo
1 parent 204a92f commit 6ea6f9d

File tree

3 files changed

+96
-50
lines changed

3 files changed

+96
-50
lines changed

app/src/main/java/uk/co/sentinelweb/cuer/app/ui/exoplayer/LoggingPlayerListener.kt renamed to app/src/main/java/uk/co/sentinelweb/cuer/app/ui/exoplayer/ExoLoggingPlayerListener.kt

Lines changed: 78 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
package uk.co.sentinelweb.cuer.app.ui.exoplayer
22

3-
import android.util.Log
43
import androidx.media3.common.*
54
import androidx.media3.common.text.Cue
65
import androidx.media3.common.text.CueGroup
76
import androidx.media3.common.util.UnstableApi
7+
import uk.co.sentinelweb.cuer.core.wrapper.LogWrapper
88

99
@UnstableApi
10-
class LoggingPlayerListener(
11-
private val tag: String = "LoggingPlayerListener"
10+
class ExoLoggingPlayerListener(
11+
private val log: LogWrapper
1212
) : Player.Listener {
13+
init {
14+
log.tag(this)
15+
}
1316

1417
override fun onEvents(player: Player, events: Player.Events) {
1518
val eventNames = buildString {
@@ -45,32 +48,32 @@ class LoggingPlayerListener(
4548
if (events.contains(Player.EVENT_DEVICE_INFO_CHANGED)) append("DEVICE_INFO_CHANGED ")
4649
if (events.contains(Player.EVENT_DEVICE_VOLUME_CHANGED)) append("DEVICE_VOLUME_CHANGED ")
4750
}
48-
Log.d(tag, "onEvents: [$eventNames]")
51+
log.d("onEvents: [$eventNames]")
4952

5053
}
5154

5255
override fun onTimelineChanged(timeline: Timeline, reason: Int) {
53-
Log.d(tag, "onTimelineChanged: timeline=$timeline, reason=$reason")
56+
log.d("onTimelineChanged: timeline=$timeline, reason=$reason")
5457
}
5558

5659
override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) {
57-
Log.d(tag, "onMediaItemTransition: mediaItem=$mediaItem, reason=$reason")
60+
log.d("onMediaItemTransition: mediaItem=$mediaItem, reason=$reason")
5861
}
5962

6063
override fun onTracksChanged(tracks: Tracks) {
61-
Log.d(tag, "onTracksChanged: tracks=$tracks")
64+
log.d("onTracksChanged: tracks=$tracks")
6265
}
6366

6467
override fun onMediaMetadataChanged(mediaMetadata: MediaMetadata) {
65-
Log.d(tag, "onMediaMetadataChanged: metadata=$mediaMetadata")
68+
log.d("onMediaMetadataChanged: metadata=$mediaMetadata")
6669
}
6770

6871
override fun onPlaylistMetadataChanged(mediaMetadata: MediaMetadata) {
69-
Log.d(tag, "onPlaylistMetadataChanged: metadata=$mediaMetadata")
72+
log.d("onPlaylistMetadataChanged: metadata=$mediaMetadata")
7073
}
7174

7275
override fun onIsLoadingChanged(isLoading: Boolean) {
73-
Log.d(tag, "onIsLoadingChanged: isLoading=$isLoading")
76+
log.d("onIsLoadingChanged: isLoading=$isLoading")
7477
}
7578

7679
override fun onAvailableCommandsChanged(availableCommands: Player.Commands) {
@@ -107,7 +110,7 @@ class LoggingPlayerListener(
107110
if (availableCommands.contains(Player.COMMAND_SET_TRACK_SELECTION_PARAMETERS)) append("SET_TRACK_SELECTION ")
108111
if (availableCommands.contains(Player.COMMAND_SET_AUDIO_ATTRIBUTES)) append("SET_AUDIO_ATTRIBUTES ")
109112
}
110-
Log.d(tag, "onAvailableCommandsChanged: [$commandNames]")
113+
log.d("onAvailableCommandsChanged: [$commandNames]")
111114
}
112115

113116

@@ -119,19 +122,19 @@ class LoggingPlayerListener(
119122
Player.STATE_ENDED -> "STATE_ENDED"
120123
else -> "UNKNOWN"
121124
}
122-
Log.d(tag, "onPlaybackStateChanged: state=$state($playbackState)")
125+
log.d("onPlaybackStateChanged: state=$state($playbackState)")
123126
}
124127

125128
override fun onPlayWhenReadyChanged(playWhenReady: Boolean, reason: Int) {
126-
Log.d(tag, "onPlayWhenReadyChanged: playWhenReady=$playWhenReady, reason=$reason")
129+
log.d("onPlayWhenReadyChanged: playWhenReady=$playWhenReady, reason=$reason")
127130
}
128131

129132
override fun onPlaybackSuppressionReasonChanged(playbackSuppressionReason: Int) {
130-
Log.d(tag, "onPlaybackSuppressionReasonChanged: reason=$playbackSuppressionReason")
133+
log.d("onPlaybackSuppressionReasonChanged: reason=$playbackSuppressionReason")
131134
}
132135

133136
override fun onIsPlayingChanged(isPlaying: Boolean) {
134-
Log.d(tag, "onIsPlayingChanged: isPlaying=$isPlaying")
137+
log.d("onIsPlayingChanged: isPlaying=$isPlaying")
135138
}
136139

137140
override fun onRepeatModeChanged(repeatMode: Int) {
@@ -141,82 +144,123 @@ class LoggingPlayerListener(
141144
Player.REPEAT_MODE_ALL -> "REPEAT_MODE_ALL"
142145
else -> "UNKNOWN"
143146
}
144-
Log.d(tag, "onRepeatModeChanged: mode=$mode($repeatMode)")
147+
log.d("onRepeatModeChanged: mode=$mode($repeatMode)")
145148
}
146149

147150
override fun onShuffleModeEnabledChanged(shuffleModeEnabled: Boolean) {
148-
Log.d(tag, "onShuffleModeEnabledChanged: enabled=$shuffleModeEnabled")
151+
log.d("onShuffleModeEnabledChanged: enabled=$shuffleModeEnabled")
149152
}
150153

151154
override fun onPlayerError(error: PlaybackException) {
152-
Log.e(tag, "onPlayerError: ", error)
155+
log.e("Player error:", error)
156+
// You can also log specific error details
157+
log.e("Error code: ${error.errorCode}")
158+
log.e("Cause: ${error.cause}")
159+
160+
// If you want to get more detailed error information
161+
val errorName = when (error.errorCode) {
162+
PlaybackException.ERROR_CODE_IO_UNSPECIFIED -> "ERROR_CODE_IO_UNSPECIFIED"
163+
PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED -> "ERROR_CODE_IO_NETWORK_CONNECTION_FAILED"
164+
PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT -> "ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT"
165+
PlaybackException.ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE -> "ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE"
166+
PlaybackException.ERROR_CODE_IO_BAD_HTTP_STATUS -> "ERROR_CODE_IO_BAD_HTTP_STATUS"
167+
PlaybackException.ERROR_CODE_IO_FILE_NOT_FOUND -> "ERROR_CODE_IO_FILE_NOT_FOUND"
168+
PlaybackException.ERROR_CODE_IO_NO_PERMISSION -> "ERROR_CODE_IO_NO_PERMISSION"
169+
PlaybackException.ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED -> "ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED"
170+
PlaybackException.ERROR_CODE_DECODER_INIT_FAILED -> "ERROR_CODE_DECODER_INIT_FAILED"
171+
PlaybackException.ERROR_CODE_DECODER_QUERY_FAILED -> "ERROR_CODE_DECODER_QUERY_FAILED"
172+
PlaybackException.ERROR_CODE_DECODING_FAILED -> "ERROR_CODE_DECODING_FAILED"
173+
PlaybackException.ERROR_CODE_DECODING_FORMAT_EXCEEDS_CAPABILITIES -> "ERROR_CODE_DECODING_FORMAT_EXCEEDS_CAPABILITIES"
174+
PlaybackException.ERROR_CODE_AUDIO_TRACK_INIT_FAILED -> "ERROR_CODE_AUDIO_TRACK_INIT_FAILED"
175+
PlaybackException.ERROR_CODE_AUDIO_TRACK_WRITE_FAILED -> "ERROR_CODE_AUDIO_TRACK_WRITE_FAILED"
176+
PlaybackException.ERROR_CODE_DRM_UNSPECIFIED -> "ERROR_CODE_DRM_UNSPECIFIED"
177+
PlaybackException.ERROR_CODE_DRM_SCHEME_UNSUPPORTED -> "ERROR_CODE_DRM_SCHEME_UNSUPPORTED"
178+
PlaybackException.ERROR_CODE_DRM_PROVISIONING_FAILED -> "ERROR_CODE_DRM_PROVISIONING_FAILED"
179+
PlaybackException.ERROR_CODE_DRM_CONTENT_ERROR -> "ERROR_CODE_DRM_CONTENT_ERROR"
180+
PlaybackException.ERROR_CODE_DRM_LICENSE_ACQUISITION_FAILED -> "ERROR_CODE_DRM_LICENSE_ACQUISITION_FAILED"
181+
PlaybackException.ERROR_CODE_DRM_DISALLOWED_OPERATION -> "ERROR_CODE_DRM_DISALLOWED_OPERATION"
182+
PlaybackException.ERROR_CODE_DRM_SYSTEM_ERROR -> "ERROR_CODE_DRM_SYSTEM_ERROR"
183+
PlaybackException.ERROR_CODE_DRM_DEVICE_REVOKED -> "ERROR_CODE_DRM_DEVICE_REVOKED"
184+
PlaybackException.ERROR_CODE_DRM_LICENSE_EXPIRED -> "ERROR_CODE_DRM_LICENSE_EXPIRED"
185+
PlaybackException.ERROR_CODE_REMOTE_ERROR -> "ERROR_CODE_REMOTE_ERROR"
186+
PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW -> "ERROR_CODE_BEHIND_LIVE_WINDOW"
187+
PlaybackException.ERROR_CODE_TIMEOUT -> "ERROR_CODE_TIMEOUT"
188+
PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED -> "ERROR_CODE_PARSING_CONTAINER_MALFORMED"
189+
PlaybackException.ERROR_CODE_PARSING_MANIFEST_MALFORMED -> "ERROR_CODE_PARSING_MANIFEST_MALFORMED"
190+
PlaybackException.ERROR_CODE_UNSPECIFIED -> "ERROR_CODE_UNSPECIFIED"
191+
else -> "UNKNOWN_ERROR_CODE"
192+
}
193+
log.e("Error code: ${errorName}")
194+
log.e("Message: ${error.message}")
195+
153196
}
154197

198+
155199
override fun onPlayerErrorChanged(error: PlaybackException?) {
156-
Log.e(tag, "onPlayerErrorChanged: ", error)
200+
log.e("onPlayerErrorChanged: ", error)
157201
}
158202

159203
override fun onPositionDiscontinuity(
160204
oldPosition: Player.PositionInfo,
161205
newPosition: Player.PositionInfo,
162206
reason: Int
163207
) {
164-
Log.d(tag, "onPositionDiscontinuity: oldPosition=$oldPosition, newPosition=$newPosition, reason=$reason")
208+
log.d("onPositionDiscontinuity: oldPosition=$oldPosition, newPosition=$newPosition, reason=$reason")
165209
}
166210

167211
override fun onPlaybackParametersChanged(playbackParameters: PlaybackParameters) {
168-
Log.d(tag, "onPlaybackParametersChanged: parameters=$playbackParameters")
212+
log.d("onPlaybackParametersChanged: parameters=$playbackParameters")
169213
}
170214

171215
override fun onSeekBackIncrementChanged(seekBackIncrementMs: Long) {
172-
Log.d(tag, "onSeekBackIncrementChanged: incrementMs=$seekBackIncrementMs")
216+
log.d("onSeekBackIncrementChanged: incrementMs=$seekBackIncrementMs")
173217
}
174218

175219
override fun onSeekForwardIncrementChanged(seekForwardIncrementMs: Long) {
176-
Log.d(tag, "onSeekForwardIncrementChanged: incrementMs=$seekForwardIncrementMs")
220+
log.d("onSeekForwardIncrementChanged: incrementMs=$seekForwardIncrementMs")
177221
}
178222

179223
override fun onMaxSeekToPreviousPositionChanged(maxSeekToPreviousPositionMs: Long) {
180-
Log.d(tag, "onMaxSeekToPreviousPositionChanged: maxPositionMs=$maxSeekToPreviousPositionMs")
224+
log.d("onMaxSeekToPreviousPositionChanged: maxPositionMs=$maxSeekToPreviousPositionMs")
181225
}
182226

183227
override fun onAudioSessionIdChanged(audioSessionId: Int) {
184-
Log.d(tag, "onAudioSessionIdChanged: id=$audioSessionId")
228+
log.d("onAudioSessionIdChanged: id=$audioSessionId")
185229
}
186230

187231
override fun onAudioAttributesChanged(audioAttributes: AudioAttributes) {
188-
Log.d(tag, "onAudioAttributesChanged: attributes=$audioAttributes")
232+
log.d("onAudioAttributesChanged: attributes=$audioAttributes")
189233
}
190234

191235
override fun onVolumeChanged(volume: Float) {
192-
Log.d(tag, "onVolumeChanged: volume=$volume")
236+
log.d("onVolumeChanged: volume=$volume")
193237
}
194238

195239
override fun onDeviceInfoChanged(deviceInfo: DeviceInfo) {
196-
Log.d(tag, "onDeviceInfoChanged: info=$deviceInfo")
240+
log.d("onDeviceInfoChanged: info=$deviceInfo")
197241
}
198242

199243
override fun onDeviceVolumeChanged(volume: Int, muted: Boolean) {
200-
Log.d(tag, "onDeviceVolumeChanged: volume=$volume, muted=$muted")
244+
log.d("onDeviceVolumeChanged: volume=$volume, muted=$muted")
201245
}
202246

203247
override fun onSkipSilenceEnabledChanged(skipSilenceEnabled: Boolean) {
204-
Log.d(tag, "onSkipSilenceEnabledChanged: enabled=$skipSilenceEnabled")
248+
log.d("onSkipSilenceEnabledChanged: enabled=$skipSilenceEnabled")
205249
}
206250

207251
override fun onSurfaceSizeChanged(width: Int, height: Int) {
208-
Log.d(tag, "onSurfaceSizeChanged: width=$width, height=$height")
252+
log.d("onSurfaceSizeChanged: width=$width, height=$height")
209253
}
210254

211255
override fun onRenderedFirstFrame() {
212-
Log.d(tag, "onRenderedFirstFrame")
256+
log.d("onRenderedFirstFrame")
213257
}
214258

215259
override fun onCues(cues: MutableList<Cue>) {
216-
Log.d(tag, "onCues: count=${cues.size}")
260+
log.d("onCues: count=${cues.size}")
217261
}
218262

219263
override fun onCues(cues: CueGroup) {
220-
Log.d(tag, "onCues: count=${cues.cues.size} ${cues.presentationTimeUs}")
264+
log.d("onCues: count=${cues.cues.size} ${cues.presentationTimeUs}")
221265
}
222266
}

app/src/main/java/uk/co/sentinelweb/cuer/app/ui/exoplayer/ExoPlayerComposebles.kt

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package uk.co.sentinelweb.cuer.app.ui.exoplayer
22

33
import android.app.Activity
4-
import android.util.Log
54
import android.view.WindowManager
65
import androidx.annotation.OptIn
76
import androidx.compose.foundation.background
@@ -34,16 +33,19 @@ import org.koin.core.component.inject
3433
import uk.co.sentinelweb.cuer.app.ui.common.compose.CuerSharedTheme
3534
import uk.co.sentinelweb.cuer.app.ui.player.PlayerComposeables.PlayerTransport
3635
import uk.co.sentinelweb.cuer.app.ui.player.PlayerComposeables.VolumeDisplay
36+
import uk.co.sentinelweb.cuer.app.ui.player.PlayerComposeables.getKoin
3737
import uk.co.sentinelweb.cuer.app.ui.player.PlayerContract.MviStore.Label.Command
3838
import uk.co.sentinelweb.cuer.app.ui.player.PlayerContract.MviStore.Label.None
3939
import uk.co.sentinelweb.cuer.app.ui.player.PlayerContract.PlayerCommand
4040
import uk.co.sentinelweb.cuer.app.ui.player.PlayerContract.PlayerCommand.*
4141
import uk.co.sentinelweb.cuer.app.ui.player.PlayerContract.View.Event.*
4242
import uk.co.sentinelweb.cuer.app.util.disk.FullTruncatedPathMapper
43+
import uk.co.sentinelweb.cuer.core.wrapper.LogWrapper
4344
import uk.co.sentinelweb.cuer.domain.PlayerStateDomain.*
4445
import uk.co.sentinelweb.cuer.remote.server.LocalRepository
4546

4647
private const val LOG_TAG = "ExoPlayerComposebles"
48+
private val log by lazy { getKoin().get<LogWrapper>().apply { tag(LOG_TAG) } }
4749

4850
private const val HIDE_CONTROLS_TIMEOUT = 3000L
4951

@@ -88,11 +90,11 @@ object ExoPlayerComposebles : KoinComponent {
8890
playWhenReady = true
8991
repeatMode = Player.REPEAT_MODE_ONE
9092
addListener(exoPlayerListener(view, this))
91-
addListener(LoggingPlayerListener())
93+
addListener(ExoLoggingPlayerListener(log = getKoin().get()))
9294
addListener(object : Player.Listener {
9395

9496
override fun onVideoSizeChanged(size: VideoSize) {
95-
Log.d(LOG_TAG, "onVideoSizeChanged = ${state.value.playState}")
97+
log.d("onVideoSizeChanged = ${state.value.playState}")
9698
if (size.height != 0) {
9799
aspectRatioState =
98100
(size.width.toFloat() / size.height.toFloat()) * size.pixelWidthHeightRatio
@@ -103,7 +105,7 @@ object ExoPlayerComposebles : KoinComponent {
103105
}
104106

105107
LaunchedEffect(label.value) {
106-
Log.d(LOG_TAG, "playState = ${state.value.playState}")
108+
log.d("playState = ${state.value.playState}")
107109
when (label.value) {
108110
is Command -> processCommand((label.value as Command).command, exoPlayer)
109111
else -> Unit
@@ -120,7 +122,7 @@ object ExoPlayerComposebles : KoinComponent {
120122
LaunchedEffect(state.value.volume) {
121123
exoPlayer.volume = state.value.volume
122124
.also { volumeVisible = true }
123-
.also { Log.d(LOG_TAG, "set volume = $it") }
125+
.also { log.d("set volume = $it") }
124126
}
125127

126128
LaunchedEffect(Unit) {
@@ -147,7 +149,7 @@ object ExoPlayerComposebles : KoinComponent {
147149

148150
DisposableEffect(lifecycleOwner, exoPlayer) {
149151
val lifecycleObserver = LifecycleEventObserver { _, event ->
150-
Log.d(LOG_TAG, "lifecycle change = ${event.name}")
152+
log.d("lifecycle change = ${event.name}")
151153
when (event) {
152154
Lifecycle.Event.ON_STOP -> {
153155
view.dispatch(PlayPauseClicked(true))
@@ -227,10 +229,10 @@ object ExoPlayerComposebles : KoinComponent {
227229

228230

229231
fun processCommand(command: PlayerCommand, exoPlayer: ExoPlayer) {
230-
Log.d(LOG_TAG, "command = $command")
232+
log.d("command = $command")
231233
when (command) {
232234
is Load -> command.item.mapNetworkOrLocalStreamingPath(localRepository, fullTruncatedPathMapper)
233-
?.also { Log.d(LOG_TAG, "setMedia = $it") }
235+
?.also { log.d("setMedia = $it") }
234236
?.also { exoPlayer.setMediaItem(MediaItem.fromUri(it), command.startPosition) }
235237

236238
Pause -> exoPlayer.pause()
@@ -250,40 +252,40 @@ object ExoPlayerComposebles : KoinComponent {
250252
when (playbackState) {
251253

252254
Player.STATE_READY -> {
253-
Log.d(LOG_TAG, "Media is loaded and ready to play")
255+
log.d("Media is loaded and ready to play")
254256
view.dispatch(DurationReceived(player.duration))
255257
}
256258

257259
Player.STATE_BUFFERING -> {
258-
Log.d(LOG_TAG, "Media is buffering")
260+
log.d("Media is buffering")
259261
view.dispatch(PlayerStateChanged(BUFFERING))
260262
}
261263

262264
Player.STATE_ENDED -> {
263-
Log.d(LOG_TAG, "Media has ended")
265+
log.d("Media has ended")
264266
view.dispatch(PlayerStateChanged(ENDED))
265267
}
266268

267269
Player.STATE_IDLE -> {
268270
view.dispatch(PlayerStateChanged(UNSTARTED))
269-
Log.d(LOG_TAG, "ExoPlayer is idle")
271+
log.d("ExoPlayer is idle")
270272
}
271273
}
272274
}
273275

274276
override fun onIsPlayingChanged(isPlaying: Boolean) {
275277
val state = if (isPlaying) PLAYING else PAUSED
276278
if (isPlaying) {
277-
Log.d(LOG_TAG, "Playback started")
279+
log.d("Playback started")
278280
view.dispatch(PlayerStateChanged(state))
279281
} else {
280-
Log.d(LOG_TAG, "Playback paused")
282+
log.d("Playback paused")
281283
view.dispatch(PlayerStateChanged(state))
282284
}
283285
}
284286

285287
override fun onPlayerError(error: PlaybackException) {
286-
Log.e(LOG_TAG, "Playback paused", error)
288+
log.e("Playback paused", error)
287289
view.dispatch(PlayerStateChanged(ERROR))
288290
}
289291
}

remote/src/jvmAndAndroid/kotlin/uk/co/sentinelweb/cuer/remote/server/controller/PlayerController.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ class PlayerController(
104104
(postData)
105105
.also { logWrapper.d("launchitem: postdata: ${it}") }
106106
.let { deserialisePlaylistItem(it) }
107-
.also { logWrapper.d("launchitem: ${it.id?.serialise()}") }
107+
.also { logWrapper.d("launchitem.id: ${it.id?.serialise()}") }
108108
.let { item ->
109109
remotePlayerLaunchHost.launchPlayerVideo(
110110
item,

0 commit comments

Comments
 (0)