mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Add vorbis comment support for track/disc numbering fields, and genre
Only `TRACKNUMBER` and `GENRE` are listed here: https://xiph.org/vorbis/doc/v-comment.html The rest are derived from the example in Issue: androidx/media#1958. It's possible that other formats exist in the wild: https://hydrogenaud.io/index.php/topic,69292.msg613808.html#msg613808 Issue: androidx/media#1958 PiperOrigin-RevId: 704308788
This commit is contained in:
parent
aa0e7298ca
commit
12546070ee
@ -49,6 +49,9 @@
|
|||||||
active at `timeUs` (started before but not yet ended) was incorrectly
|
active at `timeUs` (started before but not yet ended) was incorrectly
|
||||||
discarded ([#1939](https://github.com/androidx/media/issues/1939)).
|
discarded ([#1939](https://github.com/androidx/media/issues/1939)).
|
||||||
* Metadata:
|
* Metadata:
|
||||||
|
* Extract disc/track numbering and genre from Vorbis comments into
|
||||||
|
`MediaMetadata`
|
||||||
|
([#1958](https://github.com/androidx/media/issues/1958)).
|
||||||
* Image:
|
* Image:
|
||||||
* DRM:
|
* DRM:
|
||||||
* Effect:
|
* Effect:
|
||||||
|
@ -24,6 +24,7 @@ import androidx.media3.common.MediaMetadata;
|
|||||||
import androidx.media3.common.Metadata;
|
import androidx.media3.common.Metadata;
|
||||||
import androidx.media3.common.util.UnstableApi;
|
import androidx.media3.common.util.UnstableApi;
|
||||||
import com.google.common.base.Ascii;
|
import com.google.common.base.Ascii;
|
||||||
|
import com.google.common.primitives.Ints;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated Use {@link androidx.media3.extractor.metadata.vorbis.VorbisComment} instead.
|
* @deprecated Use {@link androidx.media3.extractor.metadata.vorbis.VorbisComment} instead.
|
||||||
@ -58,6 +59,9 @@ public class VorbisComment implements Metadata.Entry {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void populateMediaMetadata(MediaMetadata.Builder builder) {
|
public void populateMediaMetadata(MediaMetadata.Builder builder) {
|
||||||
|
// Vorbis comments can have duplicate keys, but all these fields are singular on MediaMetadata,
|
||||||
|
// so we naively overwrite whatever any previously set value (which results in 'keep last'
|
||||||
|
// semantics).
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case "TITLE":
|
case "TITLE":
|
||||||
builder.setTitle(value);
|
builder.setTitle(value);
|
||||||
@ -71,6 +75,33 @@ public class VorbisComment implements Metadata.Entry {
|
|||||||
case "ALBUMARTIST":
|
case "ALBUMARTIST":
|
||||||
builder.setAlbumArtist(value);
|
builder.setAlbumArtist(value);
|
||||||
break;
|
break;
|
||||||
|
case "TRACKNUMBER":
|
||||||
|
@Nullable Integer trackNumber = Ints.tryParse(value);
|
||||||
|
if (trackNumber != null) {
|
||||||
|
builder.setTrackNumber(trackNumber);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "TOTALTRACKS":
|
||||||
|
@Nullable Integer totalTracks = Ints.tryParse(value);
|
||||||
|
if (totalTracks != null) {
|
||||||
|
builder.setTotalTrackCount(totalTracks);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "DISCNUMBER":
|
||||||
|
@Nullable Integer discNumber = Ints.tryParse(value);
|
||||||
|
if (discNumber != null) {
|
||||||
|
builder.setDiscNumber(discNumber);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "TOTALDISCS":
|
||||||
|
@Nullable Integer totalDiscs = Ints.tryParse(value);
|
||||||
|
if (totalDiscs != null) {
|
||||||
|
builder.setTotalDiscCount(totalDiscs);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "GENRE":
|
||||||
|
builder.setGenre(value);
|
||||||
|
break;
|
||||||
case "DESCRIPTION":
|
case "DESCRIPTION":
|
||||||
builder.setDescription(value);
|
builder.setDescription(value);
|
||||||
break;
|
break;
|
||||||
|
@ -50,6 +50,11 @@ public final class VorbisCommentTest {
|
|||||||
String artist = "artist";
|
String artist = "artist";
|
||||||
String albumTitle = "album title";
|
String albumTitle = "album title";
|
||||||
String albumArtist = "album Artist";
|
String albumArtist = "album Artist";
|
||||||
|
int trackNumber = 3;
|
||||||
|
int totalTracks = 12;
|
||||||
|
int discNumber = 1;
|
||||||
|
int totalDiscs = 3;
|
||||||
|
String genre = "Metal";
|
||||||
String description = "a description about the audio.";
|
String description = "a description about the audio.";
|
||||||
List<Metadata.Entry> entries =
|
List<Metadata.Entry> entries =
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
@ -57,6 +62,11 @@ public final class VorbisCommentTest {
|
|||||||
new VorbisComment("ArTisT", artist),
|
new VorbisComment("ArTisT", artist),
|
||||||
new VorbisComment("ALBUM", albumTitle),
|
new VorbisComment("ALBUM", albumTitle),
|
||||||
new VorbisComment("albumartist", albumArtist),
|
new VorbisComment("albumartist", albumArtist),
|
||||||
|
new VorbisComment("TRACKNUMBER", String.valueOf(trackNumber)),
|
||||||
|
new VorbisComment("TOTALTRACKS", String.valueOf(totalTracks)),
|
||||||
|
new VorbisComment("DISCNUMBER", String.valueOf(discNumber)),
|
||||||
|
new VorbisComment("TOTALDISCS", String.valueOf(totalDiscs)),
|
||||||
|
new VorbisComment("GENRE", genre),
|
||||||
new VorbisComment("DESCRIPTION", description));
|
new VorbisComment("DESCRIPTION", description));
|
||||||
MediaMetadata.Builder builder = MediaMetadata.EMPTY.buildUpon();
|
MediaMetadata.Builder builder = MediaMetadata.EMPTY.buildUpon();
|
||||||
|
|
||||||
@ -69,6 +79,11 @@ public final class VorbisCommentTest {
|
|||||||
assertThat(mediaMetadata.artist.toString()).isEqualTo(artist);
|
assertThat(mediaMetadata.artist.toString()).isEqualTo(artist);
|
||||||
assertThat(mediaMetadata.albumTitle.toString()).isEqualTo(albumTitle);
|
assertThat(mediaMetadata.albumTitle.toString()).isEqualTo(albumTitle);
|
||||||
assertThat(mediaMetadata.albumArtist.toString()).isEqualTo(albumArtist);
|
assertThat(mediaMetadata.albumArtist.toString()).isEqualTo(albumArtist);
|
||||||
|
assertThat(mediaMetadata.trackNumber).isEqualTo(trackNumber);
|
||||||
|
assertThat(mediaMetadata.totalTrackCount).isEqualTo(totalTracks);
|
||||||
|
assertThat(mediaMetadata.discNumber).isEqualTo(discNumber);
|
||||||
|
assertThat(mediaMetadata.totalDiscCount).isEqualTo(totalDiscs);
|
||||||
|
assertThat(mediaMetadata.genre.toString()).isEqualTo(genre);
|
||||||
assertThat(mediaMetadata.description.toString()).isEqualTo(description);
|
assertThat(mediaMetadata.description.toString()).isEqualTo(description);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user