Skip to content

Commit 51aa348

Browse files
committed
feat: Add album artist and track number metadata embedding
- Add aART atom for album artist - Add trkn atom with binary track number format - Update JNI signature to accept new parameters
1 parent 23a9655 commit 51aa348

1 file changed

Lines changed: 34 additions & 3 deletions

File tree

coverart_jni.cpp

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,32 @@ static void addTextMetadata(AP4_ContainerAtom* ilst, AP4_Atom::Type type, const
2626
ilst->AddChild(container);
2727
}
2828

29+
// Helper to add track number metadata (trkn atom - binary format)
30+
// Format: [2 bytes reserved=0][2 bytes track][2 bytes total][2 bytes reserved=0]
31+
static void addTrackNumber(AP4_ContainerAtom* ilst, int trackNumber, int totalTracks) {
32+
if (trackNumber <= 0) return;
33+
34+
// Remove existing trkn atom
35+
ilst->DeleteChild(AP4_ATOM_TYPE_TRKN);
36+
37+
// Build 8-byte binary data
38+
AP4_UI08 data[8] = {0};
39+
data[2] = (trackNumber >> 8) & 0xFF; // track high byte
40+
data[3] = trackNumber & 0xFF; // track low byte
41+
data[4] = (totalTracks >> 8) & 0xFF; // total high byte
42+
data[5] = totalTracks & 0xFF; // total low byte
43+
44+
AP4_ContainerAtom* container = new AP4_ContainerAtom(AP4_ATOM_TYPE_TRKN);
45+
AP4_BinaryMetaDataValue value(AP4_MetaData::Value::TYPE_BINARY, data, 8);
46+
AP4_DataAtom* dataAtom = new AP4_DataAtom(value);
47+
container->AddChild(dataAtom);
48+
ilst->AddChild(container);
49+
}
50+
2951
extern "C" {
3052

3153
/**
32-
* Embed metadata (cover art, title, artist, album, year) into an M4A/MP4 file.
54+
* Embed metadata (cover art, title, artist, album, year, album artist, track number) into an M4A/MP4 file.
3355
* Uses a two-pass approach: first parse to build modified moov, then rebuild file.
3456
* All text is stored as UTF-8 (supports Hebrew, Arabic, and all Unicode).
3557
*/
@@ -43,7 +65,10 @@ Java_com_metrolist_music_utils_CoverArtNative_embedMetadata(
4365
jstring titleStr,
4466
jstring artistStr,
4567
jstring albumStr,
46-
jstring yearStr) {
68+
jstring yearStr,
69+
jstring albumArtistStr,
70+
jint trackNumber,
71+
jint totalTracks) {
4772

4873
const char *input = env->GetStringUTFChars(inputPath, nullptr);
4974
const char *output = env->GetStringUTFChars(outputPath, nullptr);
@@ -61,12 +86,15 @@ Java_com_metrolist_music_utils_CoverArtNative_embedMetadata(
6186
const char *artist = artistStr ? env->GetStringUTFChars(artistStr, nullptr) : nullptr;
6287
const char *album = albumStr ? env->GetStringUTFChars(albumStr, nullptr) : nullptr;
6388
const char *year = yearStr ? env->GetStringUTFChars(yearStr, nullptr) : nullptr;
89+
const char *albumArtist = albumArtistStr ? env->GetStringUTFChars(albumArtistStr, nullptr) : nullptr;
6490

6591
LOGI("Embedding metadata: %s -> %s (%d bytes artwork)", input, output, artworkSize);
6692
if (title) LOGI(" Title: %s", title);
6793
if (artist) LOGI(" Artist: %s", artist);
6894
if (album) LOGI(" Album: %s", album);
6995
if (year) LOGI(" Year: %s", year);
96+
if (albumArtist) LOGI(" Album Artist: %s", albumArtist);
97+
if (trackNumber > 0) LOGI(" Track: %d/%d", trackNumber, totalTracks);
7098

7199
bool success = false;
72100

@@ -170,11 +198,13 @@ Java_com_metrolist_music_utils_CoverArtNative_embedMetadata(
170198
LOGI("Created ilst atom");
171199
}
172200

173-
// Add text metadata (©nam = title, ©ART = artist, ©alb = album, ©day = year)
201+
// Add text metadata (©nam = title, ©ART = artist, ©alb = album, ©day = year, aART = album artist)
174202
addTextMetadata(ilst, AP4_ATOM_TYPE_cNAM, title); // Title
175203
addTextMetadata(ilst, AP4_ATOM_TYPE_cART, artist); // Artist
176204
addTextMetadata(ilst, AP4_ATOM_TYPE_cALB, album); // Album
177205
addTextMetadata(ilst, AP4_ATOM_TYPE_cDAY, year); // Year
206+
addTextMetadata(ilst, AP4_ATOM_TYPE_aART, albumArtist); // Album Artist
207+
addTrackNumber(ilst, trackNumber, totalTracks); // Track Number
178208
LOGI("Added text metadata atoms");
179209

180210
// Add cover art if provided
@@ -260,6 +290,7 @@ Java_com_metrolist_music_utils_CoverArtNative_embedMetadata(
260290
if (artist) env->ReleaseStringUTFChars(artistStr, artist);
261291
if (album) env->ReleaseStringUTFChars(albumStr, album);
262292
if (year) env->ReleaseStringUTFChars(yearStr, year);
293+
if (albumArtist) env->ReleaseStringUTFChars(albumArtistStr, albumArtist);
263294

264295
return success ? JNI_TRUE : JNI_FALSE;
265296
}

0 commit comments

Comments
 (0)