Skip to content

Commit c9151c2

Browse files
marcbaechingericbaker
authored andcommitted
Include audio metadata with DefaultMediaItemConverter for Cast
This change adds more standard metadata fields to Cast metadata including the artwork URL that makes the cast device show the artwork in the Cast route dialog (https://screenshot.googleplex.com/uj4n4Jqd7it9bob) and the Cast device. This change also discriminates between media with an audio MIME type and others. For audio MIME type the Cast metadata is set to MEDIA_TYPE_MUSIC_TRACK which changes the layout and shows artwork and additional audio meta data to be displayed (https://screenshot.googleplex.com/ASy3KDcsTdJDM2T). Issue: google/ExoPlayer#9663 PiperOrigin-RevId: 422589957
1 parent 38cdbbf commit c9151c2

File tree

1 file changed

+77
-15
lines changed

1 file changed

+77
-15
lines changed

libraries/cast/src/main/java/androidx/media3/cast/DefaultMediaItemConverter.java

+77-15
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919
import androidx.annotation.Nullable;
2020
import androidx.media3.common.C;
2121
import androidx.media3.common.MediaItem;
22+
import androidx.media3.common.MimeTypes;
2223
import androidx.media3.common.util.Assertions;
2324
import androidx.media3.common.util.UnstableApi;
2425
import com.google.android.gms.cast.MediaInfo;
2526
import com.google.android.gms.cast.MediaMetadata;
2627
import com.google.android.gms.cast.MediaQueueItem;
28+
import com.google.android.gms.common.images.WebImage;
2729
import java.util.HashMap;
2830
import java.util.Iterator;
2931
import java.util.UUID;
@@ -47,10 +49,43 @@ public final class DefaultMediaItemConverter implements MediaItemConverter {
4749

4850
@Override
4951
public MediaItem toMediaItem(MediaQueueItem mediaQueueItem) {
50-
// `item` came from `toMediaQueueItem()` so the custom JSON data must be set.
51-
MediaInfo mediaInfo = mediaQueueItem.getMedia();
52+
@Nullable MediaInfo mediaInfo = mediaQueueItem.getMedia();
5253
Assertions.checkNotNull(mediaInfo);
53-
return getMediaItem(Assertions.checkNotNull(mediaInfo.getCustomData()));
54+
androidx.media3.common.MediaMetadata.Builder metadataBuilder =
55+
new androidx.media3.common.MediaMetadata.Builder();
56+
@Nullable MediaMetadata metadata = mediaInfo.getMetadata();
57+
if (metadata != null) {
58+
if (metadata.containsKey(MediaMetadata.KEY_TITLE)) {
59+
metadataBuilder.setTitle(metadata.getString(MediaMetadata.KEY_TITLE));
60+
}
61+
if (metadata.containsKey(MediaMetadata.KEY_SUBTITLE)) {
62+
metadataBuilder.setSubtitle(metadata.getString(MediaMetadata.KEY_SUBTITLE));
63+
}
64+
if (metadata.containsKey(MediaMetadata.KEY_ARTIST)) {
65+
metadataBuilder.setArtist(metadata.getString(MediaMetadata.KEY_ARTIST));
66+
}
67+
if (metadata.containsKey(MediaMetadata.KEY_ALBUM_ARTIST)) {
68+
metadataBuilder.setAlbumArtist(metadata.getString(MediaMetadata.KEY_ALBUM_ARTIST));
69+
}
70+
if (metadata.containsKey(MediaMetadata.KEY_ALBUM_TITLE)) {
71+
metadataBuilder.setArtist(metadata.getString(MediaMetadata.KEY_ALBUM_TITLE));
72+
}
73+
if (!metadata.getImages().isEmpty()) {
74+
metadataBuilder.setArtworkUri(metadata.getImages().get(0).getUrl());
75+
}
76+
if (metadata.containsKey(MediaMetadata.KEY_COMPOSER)) {
77+
metadataBuilder.setComposer(metadata.getString(MediaMetadata.KEY_COMPOSER));
78+
}
79+
if (metadata.containsKey(MediaMetadata.KEY_DISC_NUMBER)) {
80+
metadataBuilder.setDiscNumber(metadata.getInt(MediaMetadata.KEY_DISC_NUMBER));
81+
}
82+
if (metadata.containsKey(MediaMetadata.KEY_TRACK_NUMBER)) {
83+
metadataBuilder.setTrackNumber(metadata.getInt(MediaMetadata.KEY_TRACK_NUMBER));
84+
}
85+
}
86+
// `mediaQueueItem` came from `toMediaQueueItem()` so the custom JSON data must be set.
87+
return getMediaItem(
88+
Assertions.checkNotNull(mediaInfo.getCustomData()), metadataBuilder.build());
5489
}
5590

5691
@Override
@@ -59,10 +94,41 @@ public MediaQueueItem toMediaQueueItem(MediaItem mediaItem) {
5994
if (mediaItem.localConfiguration.mimeType == null) {
6095
throw new IllegalArgumentException("The item must specify its mimeType");
6196
}
62-
MediaMetadata metadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE);
97+
MediaMetadata metadata =
98+
new MediaMetadata(
99+
MimeTypes.isAudio(mediaItem.localConfiguration.mimeType)
100+
? MediaMetadata.MEDIA_TYPE_MUSIC_TRACK
101+
: MediaMetadata.MEDIA_TYPE_MOVIE);
63102
if (mediaItem.mediaMetadata.title != null) {
64103
metadata.putString(MediaMetadata.KEY_TITLE, mediaItem.mediaMetadata.title.toString());
65104
}
105+
if (mediaItem.mediaMetadata.subtitle != null) {
106+
metadata.putString(MediaMetadata.KEY_SUBTITLE, mediaItem.mediaMetadata.subtitle.toString());
107+
}
108+
if (mediaItem.mediaMetadata.artist != null) {
109+
metadata.putString(MediaMetadata.KEY_ARTIST, mediaItem.mediaMetadata.artist.toString());
110+
}
111+
if (mediaItem.mediaMetadata.albumArtist != null) {
112+
metadata.putString(
113+
MediaMetadata.KEY_ALBUM_ARTIST, mediaItem.mediaMetadata.albumArtist.toString());
114+
}
115+
if (mediaItem.mediaMetadata.albumTitle != null) {
116+
metadata.putString(
117+
MediaMetadata.KEY_ALBUM_TITLE, mediaItem.mediaMetadata.albumTitle.toString());
118+
}
119+
if (mediaItem.mediaMetadata.artworkUri != null) {
120+
metadata.addImage(new WebImage(mediaItem.mediaMetadata.artworkUri));
121+
}
122+
if (mediaItem.mediaMetadata.composer != null) {
123+
metadata.putString(MediaMetadata.KEY_COMPOSER, mediaItem.mediaMetadata.composer.toString());
124+
}
125+
if (mediaItem.mediaMetadata.discNumber != null) {
126+
metadata.putInt(MediaMetadata.KEY_DISC_NUMBER, mediaItem.mediaMetadata.discNumber);
127+
}
128+
if (mediaItem.mediaMetadata.trackNumber != null) {
129+
metadata.putInt(MediaMetadata.KEY_TRACK_NUMBER, mediaItem.mediaMetadata.trackNumber);
130+
}
131+
66132
MediaInfo mediaInfo =
67133
new MediaInfo.Builder(mediaItem.localConfiguration.uri.toString())
68134
.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
@@ -75,19 +141,15 @@ public MediaQueueItem toMediaQueueItem(MediaItem mediaItem) {
75141

76142
// Deserialization.
77143

78-
private static MediaItem getMediaItem(JSONObject customData) {
144+
private static MediaItem getMediaItem(
145+
JSONObject customData, androidx.media3.common.MediaMetadata mediaMetadata) {
79146
try {
80147
JSONObject mediaItemJson = customData.getJSONObject(KEY_MEDIA_ITEM);
81-
MediaItem.Builder builder = new MediaItem.Builder();
82-
builder.setUri(Uri.parse(mediaItemJson.getString(KEY_URI)));
83-
builder.setMediaId(mediaItemJson.getString(KEY_MEDIA_ID));
84-
if (mediaItemJson.has(KEY_TITLE)) {
85-
androidx.media3.common.MediaMetadata mediaMetadata =
86-
new androidx.media3.common.MediaMetadata.Builder()
87-
.setTitle(mediaItemJson.getString(KEY_TITLE))
88-
.build();
89-
builder.setMediaMetadata(mediaMetadata);
90-
}
148+
MediaItem.Builder builder =
149+
new MediaItem.Builder()
150+
.setUri(Uri.parse(mediaItemJson.getString(KEY_URI)))
151+
.setMediaId(mediaItemJson.getString(KEY_MEDIA_ID))
152+
.setMediaMetadata(mediaMetadata);
91153
if (mediaItemJson.has(KEY_MIME_TYPE)) {
92154
builder.setMimeType(mediaItemJson.getString(KEY_MIME_TYPE));
93155
}

0 commit comments

Comments
 (0)