@@ -28,6 +28,7 @@ import {program as commander} from 'commander';
28
28
import { decode as entityDecode } from 'html-entities' ;
29
29
import { createFFmpeg , fetchFile } from '@ffmpeg/ffmpeg' ;
30
30
import ProgressBar , { getPersistentStdout } from 'xprogress' ;
31
+ import meta_writer from '@orsetto/meta-writer' ;
31
32
32
33
import _merge from 'lodash.merge' ;
33
34
import _mergeWith from 'lodash.mergewith' ;
@@ -1096,56 +1097,58 @@ async function init(packageJson, queries, options) {
1096
1097
Config . concurrency . embedder ,
1097
1098
async ( { track, meta, files, audioSource} ) => {
1098
1099
try {
1099
- await Promise . promisify ( atomicParsley ) ( meta . outFile . path , {
1100
+ await meta_writer ( {
1100
1101
overWrite : '' , // overwrite the file
1101
1102
1102
- title : track . name , // ©nam
1103
- artist : track . artists [ 0 ] , // ©ART
1104
- composer : track . composers , // ©wrt
1105
- album : track . album , // ©alb
1106
- genre : ( genre => ( genre ? genre . concat ( ' ' ) : '' ) ) ( ( track . genres || [ ] ) [ 0 ] ) , // ©gen | gnre
1107
- tracknum : `${ track . track_number } /${ track . total_tracks } ` , // trkn
1108
- disk : `${ track . disc_number } /${ track . disc_number } ` , // disk
1109
- year : new Date ( track . release_date ) . toISOString ( ) . split ( 'T' ) [ 0 ] , // ©day
1110
- compilation : track . compilation , // ©cpil
1111
- gapless : options . gapless , // pgap
1112
- rDNSatom : [
1103
+ TrackTitle : track . name , // ©nam
1104
+ TrackArtist : track . artists [ 0 ] , // ©ART
1105
+ Composer : track . composers , // ©wrt
1106
+ AlbumTitle : track . album , // ©alb
1107
+ Genre : ( genre => ( genre ? genre . concat ( ' ' ) : '' ) ) ( ( track . genres || [ '' ] ) [ 0 ] ) , // ©gen | gnre
1108
+ TrackNumber : `${ track . track_number } ` , // trkn
1109
+ TrackTotal : `${ track . total_tracks } ` ,
1110
+ DiscNumber : `${ track . disc_number } ` , // disk
1111
+ DiscTotal : `${ track . disc_number } ` ,
1112
+ RecordingDate : new Date ( track . release_date ) . toISOString ( ) . split ( 'T' ) [ 0 ] , // ©day
1113
+
1114
+ AlbumArtist : track . album_artist , // aART
1115
+ CopyrightMessage : track . copyrights . sort ( ( { type} ) => ( type === 'P' ? - 1 : 1 ) ) [ 0 ] ?. text , // cprt
1116
+ EncoderSoftware : `freyr-js cli v${ packageJson . version } ` , // ©too
1117
+ EncodedBy : 'd3vc0dr' , // ©enc
1118
+ FrontCover : files . image . file . path , // covr
1119
+
1120
+ // Ilst tags
1121
+ 'cpil' : track . compilation , // ©cpil
1122
+ stik : 'Normal' , // stik
1123
+ pgap : options . gapless , // pgap
1124
+ rDNS : [
1113
1125
// ----
1114
- [ 'Digital Media' , 'name=MEDIA' , 'domain=com.apple.iTunes' ] ,
1115
- [ track . isrc , 'name=ISRC' , 'domain=com.apple.iTunes' ] ,
1116
- [ track . artists [ 0 ] , 'name=ARTISTS' , 'domain=com.apple.iTunes' ] ,
1117
- [ track . label , 'name=LABEL' , 'domain=com.apple.iTunes' ] ,
1118
- [ `${ meta . service [ symbols . meta ] . DESC } : ${ track . uri } ` , 'name=SOURCE' , 'domain=com.apple.iTunes' ] ,
1119
- [
1120
- `${ audioSource . service [ symbols . meta ] . DESC } : ${ audioSource . source . videoId } ` ,
1121
- 'name=PROVIDER' ,
1122
- 'domain=com.apple.iTunes' ,
1123
- ] ,
1126
+ { mean : 'com.apple.iTunes' , name : 'MEDIA' , data : 'Digital Media' } ,
1127
+ { mean : 'com.apple.iTunes' , name : 'ISRC' , data : track . isrc } ,
1128
+ { mean : 'com.apple.iTunes' , name : 'ARTISTS' , data : track . artists [ 0 ] } ,
1129
+ { mean : 'com.apple.iTunes' , name : 'LABEL' , data : track . label } ,
1130
+ { mean : 'com.apple.iTunes' , name : 'SOURCE' , data : `${ meta . service [ symbols . meta ] . DESC } : ${ track . uri } ` } ,
1131
+ { mean : 'com.apple.iTunes' , name : 'PROVIDER' , data : `${ audioSource . service [ symbols . meta ] . DESC } : ${ audioSource . source . videoId } ` }
1124
1132
] ,
1125
- advisory : [ 'explicit' , 'clean' ] . includes ( track . contentRating ) // rtng
1133
+ ParentalAdvisory : [ 'explicit' , 'clean' ] . includes ( track . contentRating ) // rtng
1126
1134
? track . contentRating
1127
1135
: track . contentRating === true
1128
1136
? 'explicit'
1129
1137
: 'Inoffensive' ,
1130
- stik : 'Normal' , // stik
1131
1138
// geID: 0, // geID: genreID. See `AtomicParsley --genre-list`
1132
1139
// sfID: 0, // ~~~~: store front ID
1133
1140
// cnID: 0, // cnID: catalog ID
1134
- albumArtist : track . album_artist , // aART
1135
1141
// ownr? <owner>
1136
- purchaseDate : 'timestamp' , // purd
1142
+ purd : 'timestamp' , // purd
1137
1143
apID : 'cli@freyr.git' , // apID
1138
- copyright : track . copyrights . sort ( ( { type} ) => ( type === 'P' ? - 1 : 1 ) ) [ 0 ] ?. text , // cprt
1139
- encodingTool : `freyr-js cli v${ packageJson . version } ` , // ©too
1140
- encodedBy : 'd3vc0dr' , // ©enc
1141
- artwork : files . image . file . path , // covr
1142
1144
// sortOrder: [
1143
1145
// ['name', 'NAME'], // sonm
1144
1146
// ['album', 'NAME'], // soal
1145
1147
// ['artist', 'NAME'], // soar
1146
1148
// ['albumartist', 'NAME'], // soaa
1147
1149
// ],
1148
- } ) ;
1150
+ } ,
1151
+ meta . outFile . path ) ;
1149
1152
} catch ( err ) {
1150
1153
throw { err, [ symbols . errorCode ] : 8 } ;
1151
1154
}
0 commit comments