19
19
import androidx .annotation .Nullable ;
20
20
import androidx .media3 .common .C ;
21
21
import androidx .media3 .common .MediaItem ;
22
+ import androidx .media3 .common .MimeTypes ;
22
23
import androidx .media3 .common .util .Assertions ;
23
24
import androidx .media3 .common .util .UnstableApi ;
24
25
import com .google .android .gms .cast .MediaInfo ;
25
26
import com .google .android .gms .cast .MediaMetadata ;
26
27
import com .google .android .gms .cast .MediaQueueItem ;
28
+ import com .google .android .gms .common .images .WebImage ;
27
29
import java .util .HashMap ;
28
30
import java .util .Iterator ;
29
31
import java .util .UUID ;
@@ -47,10 +49,43 @@ public final class DefaultMediaItemConverter implements MediaItemConverter {
47
49
48
50
@ Override
49
51
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 ();
52
53
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 ());
54
89
}
55
90
56
91
@ Override
@@ -59,10 +94,41 @@ public MediaQueueItem toMediaQueueItem(MediaItem mediaItem) {
59
94
if (mediaItem .localConfiguration .mimeType == null ) {
60
95
throw new IllegalArgumentException ("The item must specify its mimeType" );
61
96
}
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 );
63
102
if (mediaItem .mediaMetadata .title != null ) {
64
103
metadata .putString (MediaMetadata .KEY_TITLE , mediaItem .mediaMetadata .title .toString ());
65
104
}
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
+
66
132
MediaInfo mediaInfo =
67
133
new MediaInfo .Builder (mediaItem .localConfiguration .uri .toString ())
68
134
.setStreamType (MediaInfo .STREAM_TYPE_BUFFERED )
@@ -75,19 +141,15 @@ public MediaQueueItem toMediaQueueItem(MediaItem mediaItem) {
75
141
76
142
// Deserialization.
77
143
78
- private static MediaItem getMediaItem (JSONObject customData ) {
144
+ private static MediaItem getMediaItem (
145
+ JSONObject customData , androidx .media3 .common .MediaMetadata mediaMetadata ) {
79
146
try {
80
147
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 );
91
153
if (mediaItemJson .has (KEY_MIME_TYPE )) {
92
154
builder .setMimeType (mediaItemJson .getString (KEY_MIME_TYPE ));
93
155
}
0 commit comments