-
-
Notifications
You must be signed in to change notification settings - Fork 4
/
browse.ts
66 lines (60 loc) · 2.01 KB
/
browse.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
import Command, {flags} from '@oclif/command'
import {cli} from 'cli-ux'
import SonosCommandHelper from '../../helpers/sonos-command-helper'
export default class MusicBrowse extends Command {
static description = 'Browse music in an external music service'
static flags = {
help: flags.help({char: 'h'}),
service: flags.integer({description: 'Music Service ID'}),
root: flags.string({description: 'Start browsing at this tag.', default: 'root'}),
count: flags.integer({default: 10}),
...SonosCommandHelper.baseFlags(true),
}
async run() {
const {flags} = this.parse(MusicBrowse)
const device = await SonosCommandHelper.device(this, flags)
let serviceId = flags.service
if (!serviceId) {
const services = await device.MusicServicesService.ListAndParseAvailableServices(true)
cli.table(
services,
{
Id: { },
Name: { },
})
const answer = await cli.prompt('Browse which service?', {required: true})
serviceId = parseInt(answer, 10)
}
const client = await device.MusicServicesClient(serviceId)
let nextQuestion = true
let query = flags.root
const index = 0
while (nextQuestion) {
const results = await client.GetMetadata({id: query, index: index, count: flags.count, recursive: false})
if (results.mediaCollection) {
const items = results.mediaCollection.map((item, i) => {
return {
title: item.title,
id: item.id,
index: i + 1,
}
})
cli.table(items, {
index: {header: 'Choice'},
title: {},
id: {},
})
const answer = await cli.prompt('Browse which item?')
query = items.find(i => i.index === parseInt(answer, 10))?.id ?? 'root'
} else if (results.mediaMetadata) {
cli.info('Got songs %s', query)
cli.table(results.mediaMetadata, {
id: {},
title: {},
itemType: {},
})
nextQuestion = false
}
}
}
}