shithub: aacenc

Download patch

ref: 07367eab6e40293128c30268e3ccd4141dc2ae02
parent: 11215a2dc792d28a8fa7bbef059c6798d248a0ea
author: SteveFosdick <other@fosdick.me.uk>
date: Mon Jun 1 11:15:54 EDT 2020

Add album artist and various sort order MP4 tags. (#37)

Co-authored-by: Steve Fosdick <steve@fosdick.me.uk>

--- a/frontend/main.c
+++ b/frontend/main.c
@@ -80,9 +80,13 @@
     SHORTCTL_FLAG = 300,
     MPEGVERS_FLAG,
     ARTIST_FLAG,
+    ARTIST_SORT_FLAG,
     TITLE_FLAG,
     GENRE_FLAG,
     ALBUM_FLAG,
+    ALBUM_SORT_FLAG,
+    ALBUM_ARTIST_FLAG,
+    ALBUM_ARTIST_SORT_FLAG,
     TRACK_FLAG,
     DISC_FLAG,
     YEAR_FLAG,
@@ -89,6 +93,7 @@
     COVER_ART_FLAG,
     COMMENT_FLAG,
     WRITER_FLAG,
+    WRITER_SORT_FLAG,
     TAG_FLAG,
     HELP_QUAL,
     HELP_IO,
@@ -168,10 +173,15 @@
     "\t\t*.m4b)\n"},
     {"--tag <tagname,tagvalue> Add named tag (iTunes '----')\n"},
     {"--artist <name>\tSet artist name\n"},
+    {"--artistsort <name>\tSet artist sort order\n"},
     {"--composer <name>\tSet composer name\n"},
+    {"--composersort <name>\tSet composer sort order\n"},
     {"--title <name>\tSet title/track name\n"},
     {"--genre <number>\tSet genre number\n"},
     {"--album <name>\tSet album/performer\n"},
+    {"--albumartist <name>\tSet album artist\n"},
+    {"--albumartistsort <name>\tSet album artist sort order\n"},
+    {"--albumsort <name>\tSet album sort order\n"},
     {"--compilation\tMark as compilation\n"},
     {"--track <number/total>\tSet track number\n"},
     {"--disc <number/total>\tSet disc number\n"},
@@ -461,8 +471,11 @@
     unsigned int ntracks = 0, trackno = 0;
     unsigned int ndiscs = 0, discno = 0;
     static int compilation = 0;
-    const char *artist = NULL, *title = NULL, *album = NULL, *year = NULL,
-        *comment = NULL, *composer = NULL, *tagname = 0, *tagval = 0;
+    const char *artist = NULL, *artistsort = NULL, *title = NULL,
+        *album = NULL, *albumartist = NULL,
+        *albumartistsort = NULL, *albumsort = NULL,
+        *year = NULL, *comment = NULL, *composer = NULL,
+        *composersort = NULL, *tagname = 0, *tagval = 0;
     int genre = 0;
     uint8_t *artData = NULL;
     uint64_t artSize = 0;
@@ -526,8 +539,12 @@
             {"license", 0, 0, 'L'},
             {"createmp4", 0, 0, 'w'},
             {"artist", 1, 0, ARTIST_FLAG},
+            {"artistsort", 1, 0, ARTIST_SORT_FLAG},
             {"title", 1, 0, TITLE_FLAG},
             {"album", 1, 0, ALBUM_FLAG},
+            {"albumartist", 1, 0, ALBUM_ARTIST_FLAG},
+            {"albumartistsort", 1, 0, ALBUM_ARTIST_SORT_FLAG},
+            {"albumsort", 1, 0, ALBUM_SORT_FLAG},
             {"track", 1, 0, TRACK_FLAG},
             {"disc", 1, 0, DISC_FLAG},
             {"genre", 1, 0, GENRE_FLAG},
@@ -535,6 +552,7 @@
             {"cover-art", 1, 0, COVER_ART_FLAG},
             {"comment", 1, 0, COMMENT_FLAG},
             {"composer", 1, 0, WRITER_FLAG},
+            {"composersort", 1, 0, WRITER_SORT_FLAG},
             {"compilation", 0, &compilation, 1},
             {"pcmswapbytes", 0, 0, 'X'},
             {"ignorelength", 0, &ignorelen, 1},
@@ -641,9 +659,15 @@
         case ARTIST_FLAG:
             artist = optarg;
             break;
+        case ARTIST_SORT_FLAG:
+            artistsort = optarg;
+            break;
         case WRITER_FLAG:
             composer = optarg;
             break;
+        case WRITER_SORT_FLAG:
+            composersort = optarg;
+            break;
         case TITLE_FLAG:
             title = optarg;
             break;
@@ -650,6 +674,15 @@
         case ALBUM_FLAG:
             album = optarg;
             break;
+        case ALBUM_ARTIST_FLAG:
+            albumartist = optarg;
+            break;
+        case ALBUM_ARTIST_SORT_FLAG:
+            albumartistsort = optarg;
+            break;
+        case ALBUM_SORT_FLAG:
+            albumsort = optarg;
+            break;
         case TRACK_FLAG:
             if (sscanf(optarg, "%d/%d", &trackno, &ntracks) < 1)
                 dieMessage = "Wrong track number.\n";
@@ -845,9 +878,13 @@
     }
 
     if (container != MP4_CONTAINER && (ntracks || trackno || artist ||
-                                       title || album || year || artData ||
+                                       artistsort || title ||
+                                       album || albumartist ||
+                                       albumartistsort ||
+                                       albumsort || year || artData ||
                                        genre || comment || discno || ndiscs ||
-                                       composer || compilation))
+                                       composer || composersort ||
+                                       compilation))
     {
         fprintf(stderr, "Metadata requires MP4 output!\n");
         return 1;
@@ -1181,9 +1218,14 @@
 
 #define SETTAG(x) if(x)mp4config.tag.x=x
         SETTAG(artist);
+        SETTAG(artistsort);
         SETTAG(composer);
+        SETTAG(composersort);
         SETTAG(title);
         SETTAG(album);
+        SETTAG(albumartist);
+        SETTAG(albumartistsort);
+        SETTAG(albumsort);
         SETTAG(trackno);
         SETTAG(ntracks);
         SETTAG(discno);
--- a/frontend/mp4write.c
+++ b/frontend/mp4write.c
@@ -626,8 +626,12 @@
     size += tagtxt("\xa9" "too", mp4config.tag.encoder);
     if (mp4config.tag.artist)
         size += tagtxt("\xa9" "ART", mp4config.tag.artist);
+    if (mp4config.tag.artistsort)
+        size += tagtxt("soar", mp4config.tag.artistsort);
     if (mp4config.tag.composer)
         size += tagtxt("\xa9" "wrt", mp4config.tag.composer);
+    if (mp4config.tag.composersort)
+        size += tagtxt("soco", mp4config.tag.composersort);
     if (mp4config.tag.title)
         size += tagtxt("\xa9" "nam", mp4config.tag.title);
     if (mp4config.tag.genre)
@@ -637,6 +641,12 @@
     }
     if (mp4config.tag.album)
         size += tagtxt("\xa9" "alb", mp4config.tag.album);
+    if (mp4config.tag.albumartist)
+        size += tagtxt("aART", mp4config.tag.albumartist);
+    if (mp4config.tag.albumartistsort)
+        size += tagtxt("soaa", mp4config.tag.albumartistsort);
+    if (mp4config.tag.albumsort)
+        size += tagtxt("soal", mp4config.tag.albumsort);
     if (mp4config.tag.compilation)
     {
         size += tagu8("cpil", 1);
--- a/frontend/mp4write.h
+++ b/frontend/mp4write.h
@@ -58,9 +58,14 @@
         // meta fields
         const char *encoder;
         const char *artist;
+        const char *artistsort;
         const char *composer;
+        const char *composersort;
         const char *title;
         const char *album;
+        const char *albumartist;
+        const char *albumartistsort;
+        const char *albumsort;
         uint8_t compilation;
         uint32_t trackno;
         uint32_t ntracks;