Skip to content

Commit 36803b9

Browse files
authored
PLAY-6636 CommandersAct media event send media_audiodescription_on (#629)
1 parent 5365411 commit 36803b9

File tree

7 files changed

+88
-6
lines changed

7 files changed

+88
-6
lines changed

pillarbox-analytics/src/main/java/ch/srgssr/pillarbox/analytics/commandersact/TCMediaEvent.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ class TCMediaEvent(
5353
*/
5454
var audioTrackLanguage: String? = null
5555

56+
/**
57+
* Audio track has audio description
58+
*/
59+
var audioTrackHasAudioDescription: Boolean = false
60+
5661
override fun getJsonObject(): JSONObject {
5762
val jsonObject = super.getJsonObject()
5863
for (asset in assets) {
@@ -75,6 +80,7 @@ class TCMediaEvent(
7580
audioTrackLanguage?.let {
7681
jsonObject.putIfValid(MEDIA_AUDIO_TRACK, it.uppercase())
7782
}
83+
jsonObject.putIfValid(MEDIA_AUDIO_DESCRIPTION_ON, audioTrackHasAudioDescription.toString())
7884

7985
return jsonObject
8086
}
@@ -94,6 +100,7 @@ class TCMediaEvent(
94100
private const val MEDIA_SUBTITLES_ON = "media_subtitles_on"
95101
private const val MEDIA_AUDIO_TRACK = "media_audio_track"
96102
private const val MEDIA_SUBTITLE_SELECTION = "media_subtitle_selection"
103+
private const val MEDIA_AUDIO_DESCRIPTION_ON = "media_audiodescription_on"
97104
private const val KEY_SOURCE_ID = "source_id"
98105

99106
private fun toSeconds(duration: Duration): Long {

pillarbox-analytics/src/test/java/ch/srgssr/pillarbox/analytics/commandersact/TCMediaEventTest.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class TCMediaEventTest {
2020
)
2121
val json = tcEvent.jsonObject
2222

23-
assertEquals(6, json.length())
23+
assertEquals(7, json.length())
2424

2525
// Properties set by TCEvent
2626
assertEquals("play", json.getString("event_name"))
@@ -34,6 +34,7 @@ class TCMediaEventTest {
3434
assertEquals(BuildConfig.VERSION_NAME, json.getString("media_player_version"))
3535
assertEquals("Pillarbox", json.getString("media_player_display"))
3636
assertEquals("false", json.getString("media_subtitles_on"))
37+
assertEquals("false", json.getString("media_audiodescription_on"))
3738
}
3839

3940
@Test
@@ -54,10 +55,11 @@ class TCMediaEventTest {
5455
isSubtitlesOn = true
5556
subtitleSelectionLanguage = "German"
5657
audioTrackLanguage = "French"
58+
audioTrackHasAudioDescription = true
5759
}
5860
val json = tcEvent.jsonObject
5961

60-
assertEquals(13, json.length())
62+
assertEquals(14, json.length())
6163

6264
// Properties set by TCEvent
6365
assertEquals("play", json.getString("event_name"))
@@ -78,5 +80,6 @@ class TCMediaEventTest {
7880
assertEquals("true", json.getString("media_subtitles_on"))
7981
assertEquals("GERMAN", json.getString("media_subtitle_selection"))
8082
assertEquals("FRENCH", json.getString("media_audio_track"))
83+
assertEquals("true", json.getString("media_audiodescription_on"))
8184
}
8285
}

pillarbox-core-business/src/main/java/ch/srgssr/pillarbox/core/business/tracker/commandersact/CommandersActStreaming.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import ch.srgssr.pillarbox.analytics.commandersact.CommandersAct
1313
import ch.srgssr.pillarbox.analytics.commandersact.MediaEventType
1414
import ch.srgssr.pillarbox.analytics.commandersact.TCMediaEvent
1515
import ch.srgssr.pillarbox.core.business.tracker.TotalPlaytimeCounter
16+
import ch.srgssr.pillarbox.player.extension.hasAccessibilityRoles
1617
import ch.srgssr.pillarbox.player.extension.isForced
1718
import ch.srgssr.pillarbox.player.tracks.audioTracks
1819
import ch.srgssr.pillarbox.player.utils.DebugLogger
@@ -234,14 +235,15 @@ internal class CommandersActStreaming(
234235
}
235236

236237
private fun handleAudioTrack(event: TCMediaEvent) {
237-
val audioTrackLanguage = player.currentTracks
238-
.audioTracks
239-
.find { it.isSelected }
238+
val currentAudioTrack = player.currentTracks.audioTracks.find { it.isSelected }
239+
val audioTrackLanguage = currentAudioTrack
240240
?.format
241241
?.language
242242
?: C.LANGUAGE_UNDETERMINED
243243

244244
event.audioTrackLanguage = audioTrackLanguage
245+
246+
event.audioTrackHasAudioDescription = currentAudioTrack?.format?.hasAccessibilityRoles() ?: false
245247
}
246248

247249
companion object {

pillarbox-core-business/src/test/java/ch/srgssr/pillarbox/core/business/tracker/commandersact/CommandersActStreamingTest.kt

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ class CommandersActStreamingTest {
102102
assertEquals(43.seconds, tcMediaEventPlay.timeShift)
103103
assertEquals(0.25f, tcMediaEventPlay.deviceVolume)
104104
assertEquals(0.milliseconds.inWholeSeconds, tcMediaEventPlay.mediaPosition.inWholeSeconds)
105+
assertFalse(tcMediaEventPlay.audioTrackHasAudioDescription)
105106

106107
commandersActStreaming.notifyStop(
107108
position = 30.seconds,
@@ -117,6 +118,7 @@ class CommandersActStreamingTest {
117118
assertEquals(C.LANGUAGE_UNDETERMINED, tcMediaEventStop.audioTrackLanguage)
118119
assertEquals(15.seconds, tcMediaEventStop.timeShift)
119120
assertEquals(0.25f, tcMediaEventStop.deviceVolume)
121+
assertFalse(tcMediaEventPlay.audioTrackHasAudioDescription)
120122
}
121123

122124
@Test
@@ -170,6 +172,7 @@ class CommandersActStreamingTest {
170172
assertNull(tcMediaEvent.timeShift)
171173
assertEquals(0f, tcMediaEvent.deviceVolume)
172174
assertEquals(0.milliseconds.inWholeSeconds, tcMediaEvent.mediaPosition.inWholeSeconds)
175+
assertFalse(tcMediaEvent.audioTrackHasAudioDescription)
173176

174177
commandersActStreaming.notifyStop(
175178
position = 30.seconds,
@@ -186,6 +189,62 @@ class CommandersActStreamingTest {
186189
assertNull(tcMediaEvent.timeShift)
187190
assertEquals(0f, tcMediaEventStop.deviceVolume)
188191
assertEquals(30.seconds.inWholeSeconds, tcMediaEventStop.mediaPosition.inWholeSeconds)
192+
assertFalse(tcMediaEventStop.audioTrackHasAudioDescription)
193+
}
194+
195+
@Test
196+
fun `commanders act streaming, player with audio description`() = runTest {
197+
val tcMediaEventSlot = slot<TCMediaEvent>()
198+
val commandersAct = mockk<CommandersAct> {
199+
justRun { sendTcMediaEvent(capture(tcMediaEventSlot)) }
200+
}
201+
val commandersActStreaming = CommandersActStreaming(
202+
commandersAct = commandersAct,
203+
player = createExoPlayer(
204+
isPlaying = true,
205+
duration = 45.seconds.inWholeMilliseconds,
206+
currentTracks = Tracks(
207+
listOf(
208+
createTracks(
209+
label = "Text",
210+
language = "fr",
211+
sampleMimeType = MimeTypes.APPLICATION_TTML,
212+
),
213+
createTracks(
214+
label = "Audio",
215+
language = "en",
216+
roleFlags = C.ROLE_FLAG_DESCRIBES_VIDEO,
217+
sampleMimeType = MimeTypes.AUDIO_MP4,
218+
),
219+
),
220+
),
221+
),
222+
currentData = CommandersActTracker.Data(
223+
assets = mapOf(
224+
"key1" to "value1",
225+
),
226+
sourceId = "source_id",
227+
),
228+
coroutineContext = EmptyCoroutineContext,
229+
)
230+
231+
verify {
232+
commandersAct.sendTcMediaEvent(any())
233+
}
234+
235+
assertTrue(tcMediaEventSlot.isCaptured)
236+
237+
val tcMediaEvent = tcMediaEventSlot.captured
238+
assertEquals(MediaEventType.Play, tcMediaEvent.eventType)
239+
assertEquals(commandersActStreaming.currentData.assets, tcMediaEvent.assets)
240+
assertEquals(commandersActStreaming.currentData.sourceId, tcMediaEvent.sourceId)
241+
assertTrue(tcMediaEvent.isSubtitlesOn)
242+
assertEquals("fr", tcMediaEvent.subtitleSelectionLanguage)
243+
assertEquals("en", tcMediaEvent.audioTrackLanguage)
244+
assertNull(tcMediaEvent.timeShift)
245+
assertEquals(0f, tcMediaEvent.deviceVolume)
246+
assertEquals(0.milliseconds.inWholeSeconds, tcMediaEvent.mediaPosition.inWholeSeconds)
247+
assertTrue(tcMediaEvent.audioTrackHasAudioDescription)
189248
}
190249

191250
private fun createExoPlayer(
@@ -219,6 +278,7 @@ class CommandersActStreamingTest {
219278
label: String,
220279
language: String,
221280
sampleMimeType: String,
281+
roleFlags: Int = 0,
222282
): Tracks.Group {
223283
val mediaTrackGroup = listOf(
224284
Format.Builder()
@@ -233,6 +293,7 @@ class CommandersActStreamingTest {
233293
.setLanguage(language)
234294
.setSampleMimeType(sampleMimeType)
235295
.setSelectionFlags(C.SELECTION_FLAG_FORCED)
296+
.setRoleFlags(roleFlags)
236297
.build(),
237298
)
238299

pillarbox-demo-shared/src/main/java/ch/srgssr/pillarbox/demo/shared/data/DemoItem.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,5 +447,12 @@ data class DemoItem(
447447
uri = "urn:srf:video:d57f5c1c-080f-49a2-864e-4a1a83e41ae1",
448448
imageUrl = "https://ws.srf.ch/asset/image/audio/75c3d4a4-4357-4703-b407-2d076aa15fd7/EPISODE_IMAGE/1384985072.png"
449449
)
450+
451+
val MultiAudioWithAccessibility = DemoItem(
452+
title = "Multi audio with AD track",
453+
description = "Bonjour la Suisse (5/5) - Que du bonheur?",
454+
uri = "urn:rts:video:8806923",
455+
imageUrl = "https://www.rts.ch/2017/07/28/21/11/8806915.image/16x9"
456+
)
450457
}
451458
}

pillarbox-demo-shared/src/main/java/ch/srgssr/pillarbox/demo/shared/data/Playlist.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ data class Playlist(val title: String, val items: List<DemoItem>, val descriptio
133133
uri = "urn:srf:audio:b9706015-632f-4e24-9128-5de074d98eda",
134134
description = "On-demand audio stream"
135135
),
136+
DemoItem.MultiAudioWithAccessibility,
136137
DemoItem.BlockedSegment,
137138
DemoItem.OverlapinglockedSegments
138139
)

pillarbox-demo-tv/src/main/java/ch/srgssr/pillarbox/demo/tv/ui/player/compose/PlayerView.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,8 @@ private fun PlayerTimeRow(
267267

268268
@Suppress("Indentation", "Wrapping")
269269
val onSeekProxy = remember(durationMs, positionMs) {
270-
{ newPosition: Long ->
270+
{
271+
newPosition: Long ->
271272
if (newPosition in 0..durationMs && newPosition != positionMs) {
272273
onSeek(newPosition)
273274
}

0 commit comments

Comments
 (0)