import p from 'path' import split2 from 'split2' import { Readable } from 'streamx' import { spawn } from 'child_process' import { fileURLToPath } from 'url'; const __dirname = p.dirname(fileURLToPath(import.meta.url)) import { action, STREAM_STATUS, LOG_MESSAGE } from './state.mjs' export class Darkice { constructor (opts = {}) { this.command = opts.command || 'ices2' this.config = opts.config || p.join(__dirname, '..', 'etc', 'ices2.xml') this.logLevel = 8 this.stream = new Readable() this.log = [] this.stream.on('data', row => this.log.push(row)) this.id = 'darkice' this.url = 'https://stream.rdl.de/rdl_ob1.ogg' } restart () { if (!this.process) return this.start() this.process.once('close', () => { process.nextTick(() => { this.start() }) }) this.stop() } stop () { this.process.kill() } start () { if (this.process) return const args = [this.config] this.process = spawn(this.command, args) this.process.stdout.pipe(split2()).on('data', message => { this.stream.push(action(LOG_MESSAGE, { id: this.id, type: 'stdout', message })) // this.stream.push({ type: 'stdout', data }) }) this.process.stderr.pipe(split2()).on('data', message => { this.stream.push(action(LOG_MESSAGE, { id: this.id, type: 'stdout', message })) // this.stream.push({ type: 'stderr', data }) }) this.process.on('close', () => { this.stream.push(action(STREAM_STATUS, { id: this.id, status: 'stopped', url: this.url })) this.process = null }) this.stream.push(action(STREAM_STATUS, { id: this.id, status: 'started', url: this.url })) return new Promise((resolve, reject) => { resolve() }) } }