@@ -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+
2951extern " 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