@@ -4689,6 +4689,9 @@ junk_recode (const char *in, int inlen, char *out, int outlen, const char *cs) {
46894689
46904690int
46914691junk_rewrite_tags (playItem_t * it , uint32_t junk_flags , int id3v2_version , const char * id3v1_encoding ) {
4692+ if (id3v2_version != 3 && id3v2_version != 4 ) {
4693+ trace ("junk_rewrite_tags: can't write id3v2 version %d\n" , id3v2_version );
4694+ }
46924695 trace ("junk_rewrite_tags %X\n" , junk_flags );
46934696 int err = -1 ;
46944697 char * buffer = NULL ;
@@ -4927,53 +4930,57 @@ junk_rewrite_tags (playItem_t *it, uint32_t junk_flags, int id3v2_version, const
49274930 }
49284931 }
49294932
4930- // frames which should not remap to TXXX
4931- static const char * txxx_no_fallbacks [] = {
4932- "comment" ,
4933- "unsynced lyrics" ,
4934- "track"
4935- "numtracks"
4936- "disc"
4937- "numdiscs" ,
4938- NULL
4939- };
4940-
4941- if (!noremap ) {
4942- if (mapidx >= 0 ) {
4943- for (int i = 0 ; txxx_no_fallbacks [i ]; i ++ ) {
4944- if (!strcasecmp (txxx_no_fallbacks [i ], meta -> key )) {
4945- noremap = 1 ;
4946- break ;
4947- }
4948- }
4949- }
4950- }
4951-
49524933 // is this a text frame that needs remapping to TXXX?
4953- if (!noremap ) {
4934+ if (!noremap && mapidx >= 0 ) {
49544935 if (!frame_mapping [mapidx + MAP_ID3V24 ] || frame_mapping [mapidx + MAP_ID3V24 ][0 ] != 'T' ) {
49554936 noremap = 1 ;
49564937 }
49574938 }
49584939
4940+ if (!noremap && mapidx >= 0 ) {
4941+ // frames which should not remap to TXXX
4942+ static const char * txxx_no_fallbacks [] = {
4943+ "comment" ,
4944+ "unsynced lyrics" ,
4945+ "track"
4946+ "numtracks"
4947+ "disc"
4948+ "numdiscs" ,
4949+ NULL
4950+ };
4951+
4952+ for (int i = 0 ; txxx_no_fallbacks [i ]; i ++ ) {
4953+ if (!strcasecmp (txxx_no_fallbacks [i ], meta -> key )) {
4954+ noremap = 1 ;
4955+ break ;
4956+ }
4957+ }
4958+ }
4959+
49594960 if (!noremap ) {
49604961 // add as txxx
4961- int out_size ;
4962+ int out_size = 0 ;
4963+ int needs_free = 0 ;
4964+ const char * tag_value = NULL ;
49624965
4963- int needs_free ;
4964- const char * tag_value ;
4965- if (id3v2 .version [0 ] == 4 ) {
4966+ if (id3v2_version == 4 ) {
49664967 tag_value = _get_combined_meta_value (meta , & out_size , "\0" , 1 , & needs_free );
49674968 }
4968- else if (id3v2 . version [ 0 ] == 3 ) {
4969+ else if (id3v2_version == 3 ) {
49694970 tag_value = _get_combined_meta_value (meta , & out_size , " / " , 3 , & needs_free );
49704971 }
4971- else {
4972- assert (0 );
4972+
4973+ const char * key ;
4974+ if (mapidx >= 0 ) {
4975+ trace ("remapping unsupported text frame to TXXX %s=%s\n" , key , tag_value );
4976+ key = frame_mapping [mapidx ];
4977+ } else {
4978+ trace ("adding unknown/custom text frame as TXXX %s=%s\n" , key , tag_value );
4979+ key = meta -> key ;
49734980 }
4974- trace ( "adding unknown frame as TXX %s=%s\n" , meta -> key , tag_value );
4975- junk_id3v2_remove_txxx_frame (& id3v2 , meta -> key );
4976- junk_id3v2_add_txxx_frame (& id3v2 , meta -> key , tag_value , out_size );
4981+
4982+ junk_id3v2_remove_txxx_frame (& id3v2 , key );
4983+ junk_id3v2_add_txxx_frame (& id3v2 , key , tag_value , out_size );
49774984 if (needs_free ) {
49784985 free ((char * )tag_value );
49794986 }
@@ -5106,22 +5113,30 @@ junk_rewrite_tags (playItem_t *it, uint32_t junk_flags, int id3v2_version, const
51065113 if (strchr (":!_" , meta -> key [0 ])) {
51075114 break ;
51085115 }
5116+ const char * key = NULL ;
51095117 int i ;
51105118 for (i = 0 ; frame_mapping [i ]; i += FRAME_MAPPINGS ) {
5111- if (!strcasecmp (meta -> key , frame_mapping [i + MAP_DDB ]) && frame_mapping [i + MAP_APEV2 ]) {
5112- trace ("apev2 appending known field: %s=%s\n" , meta -> key , meta -> value );
5113- _apev2_append_combined_text_frame_from_meta (& apev2 , frame_mapping [i + MAP_APEV2 ], meta );
5119+ if (!strcasecmp (meta -> key , frame_mapping [i + MAP_DDB ])) {
5120+ if (frame_mapping [i + MAP_APEV2 ]) {
5121+ trace ("apev2 appending known field: %s=%s\n" , meta -> key , meta -> value );
5122+ _apev2_append_combined_text_frame_from_meta (& apev2 , frame_mapping [i + MAP_APEV2 ], meta );
5123+ } else {
5124+ key = frame_mapping [i ];
5125+ }
51145126 break ;
51155127 }
51165128 }
5117- if (! frame_mapping [i ]
5129+ if (( key != NULL || ! frame_mapping [i ])
51185130 && strcasecmp (meta -> key , "track" )
51195131 && strcasecmp (meta -> key , "numtracks" )
51205132 && strcasecmp (meta -> key , "disc" )
51215133 && strcasecmp (meta -> key , "numdiscs" )
51225134 ) {
5123- trace ("apev2 writing unknown field: %s=%s\n" , meta -> key , meta -> value );
5124- _apev2_append_combined_text_frame_from_meta (& apev2 , meta -> key , meta );
5135+ if (key == NULL ) {
5136+ key = meta -> key ;
5137+ }
5138+ trace ("apev2 writing unknown field: %s=%s\n" , key , meta -> value );
5139+ _apev2_append_combined_text_frame_from_meta (& apev2 , key , meta );
51255140 }
51265141 meta = meta -> next ;
51275142 }
0 commit comments