Commit d1aacc5f by samrobinson Committed by Oliver Woodman

Add release date and recording date fields to MediaMetadata.

PiperOrigin-RevId: 379962022
parent 78076035
......@@ -22,6 +22,8 @@ import android.os.Parcelable;
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.MediaMetadata;
import com.google.android.exoplayer2.util.Util;
import java.util.ArrayList;
import java.util.List;
/** Text information ID3 frame. */
public final class TextInformationFrame extends Id3Frame {
......@@ -76,11 +78,57 @@ public final class TextInformationFrame extends Id3Frame {
case "TYE":
case "TYER":
try {
builder.setYear(Integer.parseInt(value));
builder.setRecordingYear(Integer.parseInt(value));
} catch (NumberFormatException e) {
// Do nothing, invalid input.
}
break;
case "TDA":
case "TDAT":
try {
int month = Integer.parseInt(value.substring(2, 4));
int day = Integer.parseInt(value.substring(0, 2));
builder.setRecordingMonth(month).setRecordingDay(day);
} catch (NumberFormatException | StringIndexOutOfBoundsException e) {
// Do nothing, invalid input.
}
break;
case "TDRC":
List<Integer> recordingDate = parseId3v2point4TimestampFrameForDate(value);
switch (recordingDate.size()) {
case 3:
builder.setRecordingDay(recordingDate.get(2));
// fall through
case 2:
builder.setRecordingMonth(recordingDate.get(1));
// fall through
case 1:
builder.setRecordingYear(recordingDate.get(0));
// fall through
break;
default:
// Do nothing.
break;
}
break;
case "TDRL":
List<Integer> releaseDate = parseId3v2point4TimestampFrameForDate(value);
switch (releaseDate.size()) {
case 3:
builder.setReleaseDay(releaseDate.get(2));
// fall through
case 2:
builder.setReleaseMonth(releaseDate.get(1));
// fall through
case 1:
builder.setReleaseYear(releaseDate.get(0));
// fall through
break;
default:
// Do nothing.
break;
}
break;
case "TCM":
case "TCOM":
builder.setComposer(value);
......@@ -148,4 +196,28 @@ public final class TextInformationFrame extends Id3Frame {
return new TextInformationFrame[size];
}
};
// Private methods
private static List<Integer> parseId3v2point4TimestampFrameForDate(String value) {
// Timestamp string format is ISO-8601, can be `yyyy-MM-ddTHH:mm:ss`, or reduced precision
// at each point, for example `yyyy-MM` or `yyyy-MM-ddTHH:mm`.
List<Integer> dates = new ArrayList<>();
try {
if (value.length() >= 10) {
dates.add(Integer.parseInt(value.substring(0, 4)));
dates.add(Integer.parseInt(value.substring(5, 7)));
dates.add(Integer.parseInt(value.substring(8, 10)));
} else if (value.length() >= 7) {
dates.add(Integer.parseInt(value.substring(0, 4)));
dates.add(Integer.parseInt(value.substring(5, 7)));
} else if (value.length() >= 4) {
dates.add(Integer.parseInt(value.substring(0, 4)));
}
} catch (NumberFormatException e) {
// Invalid output, return.
return new ArrayList<>();
}
return dates;
}
}
......@@ -54,7 +54,12 @@ public class MediaMetadataTest {
assertThat(mediaMetadata.totalTrackCount).isNull();
assertThat(mediaMetadata.folderType).isNull();
assertThat(mediaMetadata.isPlayable).isNull();
assertThat(mediaMetadata.year).isNull();
assertThat(mediaMetadata.recordingYear).isNull();
assertThat(mediaMetadata.recordingMonth).isNull();
assertThat(mediaMetadata.recordingDay).isNull();
assertThat(mediaMetadata.releaseYear).isNull();
assertThat(mediaMetadata.releaseMonth).isNull();
assertThat(mediaMetadata.releaseDay).isNull();
assertThat(mediaMetadata.composer).isNull();
assertThat(mediaMetadata.conductor).isNull();
assertThat(mediaMetadata.writer).isNull();
......@@ -105,7 +110,12 @@ public class MediaMetadataTest {
.setTotalTrackCount(12)
.setFolderType(MediaMetadata.FOLDER_TYPE_PLAYLISTS)
.setIsPlayable(true)
.setYear(2000)
.setRecordingYear(2000)
.setRecordingMonth(11)
.setRecordingDay(23)
.setReleaseYear(2001)
.setReleaseMonth(1)
.setReleaseDay(2)
.setComposer("Composer")
.setConductor("Conductor")
.setWriter("Writer")
......@@ -126,7 +136,10 @@ public class MediaMetadataTest {
String albumTitle = "album title";
String albumArtist = "album Artist";
String trackNumberInfo = "11/17";
String year = "2000";
String recordingYear = "2000";
String recordingMonth = "07";
String recordingDay = "10";
String releaseDate = "2001-01-02T00:00:00";
String composer = "composer";
String conductor = "conductor";
String writer = "writer";
......@@ -141,7 +154,14 @@ public class MediaMetadataTest {
/* id= */ "TP2", /* description= */ null, /* value= */ albumArtist),
new TextInformationFrame(
/* id= */ "TRK", /* description= */ null, /* value= */ trackNumberInfo),
new TextInformationFrame(/* id= */ "TYE", /* description= */ null, /* value= */ year),
new TextInformationFrame(
/* id= */ "TYE", /* description= */ null, /* value= */ recordingYear),
new TextInformationFrame(
/* id= */ "TDA",
/* description= */ null,
/* value= */ recordingDay + recordingMonth),
new TextInformationFrame(
/* id= */ "TDRL", /* description= */ null, /* value= */ releaseDate),
new TextInformationFrame(
/* id= */ "TCM", /* description= */ null, /* value= */ composer),
new TextInformationFrame(
......@@ -162,7 +182,12 @@ public class MediaMetadataTest {
assertThat(mediaMetadata.albumArtist.toString()).isEqualTo(albumArtist);
assertThat(mediaMetadata.trackNumber).isEqualTo(11);
assertThat(mediaMetadata.totalTrackCount).isEqualTo(17);
assertThat(mediaMetadata.year).isEqualTo(2000);
assertThat(mediaMetadata.recordingYear).isEqualTo(2000);
assertThat(mediaMetadata.recordingMonth).isEqualTo(7);
assertThat(mediaMetadata.recordingDay).isEqualTo(10);
assertThat(mediaMetadata.releaseYear).isEqualTo(2001);
assertThat(mediaMetadata.releaseMonth).isEqualTo(1);
assertThat(mediaMetadata.releaseDay).isEqualTo(2);
assertThat(mediaMetadata.composer.toString()).isEqualTo(composer);
assertThat(mediaMetadata.conductor.toString()).isEqualTo(conductor);
assertThat(mediaMetadata.writer.toString()).isEqualTo(writer);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment