/
cli.ts
105 lines (98 loc) · 2.54 KB
/
cli.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#!/usr/bin/env node
import yargs = require('yargs')
import * as path from 'path'
import * as taglib from 'taglib3'
import { listRoots, listCrates, listSongs } from './crate'
import { read, write } from './track'
import TrackInfo from './track/TrackInfo'
function log(data: any) {
console.log(JSON.stringify(data, null, 2))
}
function readStdin(): Promise<string> {
return new Promise((resolve, reject) => {
const stdin = process.stdin
let data = ''
stdin.setEncoding('utf8')
stdin.on('data', (chunk) => data += chunk)
stdin.on('end', () => resolve(data))
stdin.on('error', reject)
});
}
yargs
.scriptName('parserato')
.command('drives',
'list mountpoints',
() => {},
async () => log(await listRoots())
)
.command('crates <mountpoint>',
'list crates on drive',
(yargs) => {
yargs.positional('mountpoint', {
describe: 'drive mountpoint to search',
type: 'string',
})
},
async (argv) => {
log(await listCrates(argv.mountpoint as string))
}
)
.command('songs <crate>',
'list songs in crate',
(yargs) => {
yargs.positional('crate', {
describe: 'crate to read',
type: 'string',
})
},
async (argv) => {
log(await listSongs(argv.crate as string))
}
)
.command('tags <track>',
'list or modify tags for a track',
(yargs) => {
yargs.positional('track', {
describe: 'track to read or write',
type: 'string',
})
yargs.option('raw', {
alias: 'r',
type: 'boolean',
default: false,
description: 'Output tags without parsing Serato GEOB',
})
yargs.option('data', {
alias: 'd',
type: 'string',
description: 'JSON for updating tags, use - to read from stdin',
})
},
async (argv) => {
const track = argv.track as string
if (argv.raw && argv.data) {
console.error('CLI does not support writing raw tags at the moment')
return
}
if (argv.data) {
const data = argv.data == '-' ? await readStdin() : argv.data as string
const tags = JSON.parse(data) as TrackInfo
await write({
...tags,
path: track,
filename: path.basename(track),
})
}
if (argv.raw) {
let tags = taglib.readTagsSync(track)
if (track.endsWith('.mp3')) {
tags = { ...tags, ...taglib.readId3TagsSync(track) }
}
log(tags)
} else {
log(await read(track))
}
}
)
.demandCommand()
.argv