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; ...@@ -22,6 +22,8 @@ import android.os.Parcelable;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.MediaMetadata; import com.google.android.exoplayer2.MediaMetadata;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import java.util.ArrayList;
import java.util.List;
/** Text information ID3 frame. */ /** Text information ID3 frame. */
public final class TextInformationFrame extends Id3Frame { public final class TextInformationFrame extends Id3Frame {
...@@ -76,11 +78,57 @@ public final class TextInformationFrame extends Id3Frame { ...@@ -76,11 +78,57 @@ public final class TextInformationFrame extends Id3Frame {
case "TYE": case "TYE":
case "TYER": case "TYER":
try { try {
builder.setYear(Integer.parseInt(value)); builder.setRecordingYear(Integer.parseInt(value));
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
// Do nothing, invalid input. // Do nothing, invalid input.
} }
break; 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 "TCM":
case "TCOM": case "TCOM":
builder.setComposer(value); builder.setComposer(value);
...@@ -148,4 +196,28 @@ public final class TextInformationFrame extends Id3Frame { ...@@ -148,4 +196,28 @@ public final class TextInformationFrame extends Id3Frame {
return new TextInformationFrame[size]; 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 { ...@@ -54,7 +54,12 @@ public class MediaMetadataTest {
assertThat(mediaMetadata.totalTrackCount).isNull(); assertThat(mediaMetadata.totalTrackCount).isNull();
assertThat(mediaMetadata.folderType).isNull(); assertThat(mediaMetadata.folderType).isNull();
assertThat(mediaMetadata.isPlayable).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.composer).isNull();
assertThat(mediaMetadata.conductor).isNull(); assertThat(mediaMetadata.conductor).isNull();
assertThat(mediaMetadata.writer).isNull(); assertThat(mediaMetadata.writer).isNull();
...@@ -105,7 +110,12 @@ public class MediaMetadataTest { ...@@ -105,7 +110,12 @@ public class MediaMetadataTest {
.setTotalTrackCount(12) .setTotalTrackCount(12)
.setFolderType(MediaMetadata.FOLDER_TYPE_PLAYLISTS) .setFolderType(MediaMetadata.FOLDER_TYPE_PLAYLISTS)
.setIsPlayable(true) .setIsPlayable(true)
.setYear(2000) .setRecordingYear(2000)
.setRecordingMonth(11)
.setRecordingDay(23)
.setReleaseYear(2001)
.setReleaseMonth(1)
.setReleaseDay(2)
.setComposer("Composer") .setComposer("Composer")
.setConductor("Conductor") .setConductor("Conductor")
.setWriter("Writer") .setWriter("Writer")
...@@ -126,7 +136,10 @@ public class MediaMetadataTest { ...@@ -126,7 +136,10 @@ public class MediaMetadataTest {
String albumTitle = "album title"; String albumTitle = "album title";
String albumArtist = "album Artist"; String albumArtist = "album Artist";
String trackNumberInfo = "11/17"; 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 composer = "composer";
String conductor = "conductor"; String conductor = "conductor";
String writer = "writer"; String writer = "writer";
...@@ -141,7 +154,14 @@ public class MediaMetadataTest { ...@@ -141,7 +154,14 @@ public class MediaMetadataTest {
/* id= */ "TP2", /* description= */ null, /* value= */ albumArtist), /* id= */ "TP2", /* description= */ null, /* value= */ albumArtist),
new TextInformationFrame( new TextInformationFrame(
/* id= */ "TRK", /* description= */ null, /* value= */ trackNumberInfo), /* 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( new TextInformationFrame(
/* id= */ "TCM", /* description= */ null, /* value= */ composer), /* id= */ "TCM", /* description= */ null, /* value= */ composer),
new TextInformationFrame( new TextInformationFrame(
...@@ -162,7 +182,12 @@ public class MediaMetadataTest { ...@@ -162,7 +182,12 @@ public class MediaMetadataTest {
assertThat(mediaMetadata.albumArtist.toString()).isEqualTo(albumArtist); assertThat(mediaMetadata.albumArtist.toString()).isEqualTo(albumArtist);
assertThat(mediaMetadata.trackNumber).isEqualTo(11); assertThat(mediaMetadata.trackNumber).isEqualTo(11);
assertThat(mediaMetadata.totalTrackCount).isEqualTo(17); 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.composer.toString()).isEqualTo(composer);
assertThat(mediaMetadata.conductor.toString()).isEqualTo(conductor); assertThat(mediaMetadata.conductor.toString()).isEqualTo(conductor);
assertThat(mediaMetadata.writer.toString()).isEqualTo(writer); 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