@@ -31,10 +31,10 @@ const symbols = require('./src/symbols');
31
31
const fileMgr = require ( './src/file_mgr' ) ;
32
32
const pFlatten = require ( './src/p_flatten' ) ;
33
33
const FreyrCore = require ( './src/freyr' ) ;
34
- const MusicBrainz = require ( './src/musicbrainz.js' ) ;
35
34
const AuthServer = require ( './src/cli_server' ) ;
36
35
const AsyncQueue = require ( './src/async_queue' ) ;
37
36
const parseRange = require ( './src/parse_range' ) ;
37
+ const musicBrainz = require ( './src/musicbrainz.js' ) ;
38
38
const StackLogger = require ( './src/stack_logger' ) ;
39
39
const packageJson = require ( './package.json' ) ;
40
40
const streamUtils = require ( './src/stream_utils' ) ;
@@ -44,7 +44,13 @@ function parseMeta(params) {
44
44
return Object . entries ( params || { } )
45
45
. filter ( ( [ , value ] ) => ! [ undefined , null ] . includes ( value ) )
46
46
. map ( ( [ key , value ] ) =>
47
- Array . isArray ( value ) ? value . map ( tx => ( tx ? [ `--${ key } ` , ...( Array . isArray ( tx ) ? tx : [ tx ] ) ] : '' ) ) : [ `--${ key } ` , value ] ,
47
+ Array . isArray ( value )
48
+ ? value
49
+ . filter ( val => val !== undefined )
50
+ . map ( ( tx , args ) =>
51
+ ( args = Array . isArray ( tx ) ? tx : [ tx ] ) . every ( val => val !== undefined ) ? [ `--${ key } ` , ...args ] : [ ] ,
52
+ )
53
+ : [ `--${ key } ` , value ] ,
48
54
)
49
55
. flat ( Infinity ) ;
50
56
}
@@ -78,7 +84,7 @@ function wrapCliInterface(binaryName, binaryPath) {
78
84
}
79
85
80
86
if ( typeof file === 'string' ) {
81
- spawn ( binaryPath , [ file , ...parseMeta ( args ) ] , { env : extendPathOnEnv ( path ) } ) . on ( 'close' , cb ) ;
87
+ spawn ( binaryPath , [ file , ...parseMeta ( args ) ] , { env : extendPathOnEnv ( path ) } ) . on ( 'close' , cb ) ;
82
88
}
83
89
} ;
84
90
}
@@ -850,14 +856,18 @@ async function init(queries, options) {
850
856
gapless : options . gapless , // pgap
851
857
rDNSatom : [
852
858
// ----
853
- [ 'Digital Media' , 'name=MEDIA' , 'domain=com.apple.iTunes' ] ,
854
859
[ track . isrc , 'name=ISRC' , 'domain=com.apple.iTunes' ] ,
855
- [ track . musicBrainz . trackId , 'name=MusicBrainzTrackId' , 'domain=com.apple.iTunes' ] ,
856
- [ track . musicBrainz . artistId , 'name=MusicBrainzArtistId' , 'domain=com.apple.iTunes' ] ,
857
- [ track . musicBrainz . albumId , 'name=MusicBrainzAlbumId' , 'domain=com.apple.iTunes' ] ,
858
- [ track . musicBrainz . albumArtistId , 'name=MusicBrainzAlbumArtistId' , 'domain=com.apple.iTunes' ] ,
859
860
[ track . artists [ 0 ] , 'name=ARTISTS' , 'domain=com.apple.iTunes' ] ,
860
861
[ track . label , 'name=LABEL' , 'domain=com.apple.iTunes' ] ,
862
+ [ track . musicBrainz . trackId , 'name="MusicBrainz Track Id"' , 'domain=com.apple.iTunes' ] ,
863
+ [ track . musicBrainz . artistId , 'name="MusicBrainz Artist Id"' , 'domain=com.apple.iTunes' ] ,
864
+ [ track . musicBrainz . artistId , 'name="MusicBrainz Album Artist Id"' , 'domain=com.apple.iTunes' ] ,
865
+ [ track . musicBrainz . releaseId , 'name="MusicBrainz Album Id"' , 'domain=com.apple.iTunes' ] ,
866
+ [ track . musicBrainz . releaseGroupId , 'name="MusicBrainz Release Group Id"' , 'domain=com.apple.iTunes' ] ,
867
+ [ track . musicBrainz . barcode , 'name=BARCODE' , 'domain=com.apple.iTunes' ] ,
868
+ [ track . musicBrainz . releaseStatus , 'name="MusicBrainz Album Status"' , 'domain=com.apple.iTunes' ] ,
869
+ [ track . musicBrainz . script , 'name=SCRIPT' , 'domain=com.apple.iTunes' ] ,
870
+ [ track . musicBrainz . media , 'name=MEDIA' , 'domain=com.apple.iTunes' ] ,
861
871
[ `${ meta . service [ symbols . meta ] . DESC } : ${ track . uri } ` , 'name=SOURCE' , 'domain=com.apple.iTunes' ] ,
862
872
[
863
873
`${ audioSource . service [ symbols . meta ] . DESC } : ${ audioSource . source . videoId } ` ,
@@ -882,12 +892,12 @@ async function init(queries, options) {
882
892
encodingTool : `freyr-js cli v${ packageJson . version } ` , // ©too
883
893
encodedBy : 'd3vc0dr' , // ©enc
884
894
artwork : files . image . file . name , // covr
885
- // sortOrder: [
886
- // ['name', 'NAME'], // sonm
887
- // ['album', 'NAME'], // soal
888
- // ['artist', 'NAME' ], // soar
889
- // ['albumartist', 'NAME' ], // soaa
890
- // ],
895
+ sortOrder : [
896
+ // ['name', 'NAME'], // sonm
897
+ // ['album', 'NAME'], // soal
898
+ [ 'artist' , track . musicBrainz . artistSortOrder ] , // soar
899
+ [ 'albumartist' , track . musicBrainz . artistSortOrder ] , // soaa
900
+ ] ,
891
901
} )
892
902
. finally ( ( ) => files . image . file . removeCallback ( ) )
893
903
. catch ( err => Promise . reject ( { err, code : 8 } ) ) ;
@@ -989,6 +999,10 @@ async function init(queries, options) {
989
999
}
990
1000
trackLogger . log ( '| [\u2022] Track exists. Overwriting...' ) ;
991
1001
}
1002
+ track . musicBrainz = await processPromise ( props . extraTrackMeta , trackLogger , {
1003
+ onInit : '| \u27a4 Pulling extra metadata...' ,
1004
+ onErr : '[skipped]' ,
1005
+ } ) ;
992
1006
trackLogger . log ( '| \u27a4 Collating sources...' ) ;
993
1007
const audioSource = await props . collectSources ( ( service , sourcesPromise ) =>
994
1008
processPromise ( sourcesPromise , trackLogger , {
@@ -1004,8 +1018,6 @@ async function init(queries, options) {
1004
1018
} ) ;
1005
1019
if ( ! audioFeeds || audioFeeds . err ) return { meta, err : ( audioFeeds || { } ) . err , code : 2 } ;
1006
1020
1007
- track . musicBrainz = await MusicBrainz . gatherMusicBrainzMetadata ( track , trackLogger ) ;
1008
-
1009
1021
const feedMeta = audioFeeds . formats . sort ( ( meta1 , meta2 ) => ( meta1 . abr > meta2 . abr ? - 1 : meta1 . abr < meta2 . abr ? 1 : 0 ) ) [ 0 ] ;
1010
1022
meta . fingerprint = crypto . createHash ( 'md5' ) . update ( `${ audioSource . source . videoId } ${ feedMeta . format_id } ` ) . digest ( 'hex' ) ;
1011
1023
const files = await downloadQueue
@@ -1047,11 +1059,14 @@ async function init(queries, options) {
1047
1059
const outFilePath = xpath . join ( outFileDir , outFileName ) ;
1048
1060
const fileExists = fs . existsSync ( outFilePath ) ;
1049
1061
const processTrack = ! fileExists || options . force ;
1050
- let collectSources ;
1051
- if ( processTrack ) collectSources = buildSourceCollectorFor ( track , results => results [ 0 ] ) ;
1062
+ let collectSources , extraTrackMeta ;
1063
+ if ( processTrack ) {
1064
+ collectSources = buildSourceCollectorFor ( track , results => results [ 0 ] ) ;
1065
+ if ( track . isrc ) extraTrackMeta = musicBrainz . lookupISRC ( track . isrc , options . storefront ) ;
1066
+ }
1052
1067
const meta = { trackName, outFileDir, outFilePath, track, service} ;
1053
1068
return trackQueue
1054
- . push ( { track, meta, props : { collectSources, fileExists, processTrack, logger} } )
1069
+ . push ( { track, meta, props : { collectSources, extraTrackMeta , fileExists, processTrack, logger} } )
1055
1070
. then ( trackObject => ( { ...trackObject , meta} ) )
1056
1071
. catch ( errObject => ( { meta, code : 10 , ...errObject } ) ) ;
1057
1072
} ,
0 commit comments