raspi-io-server-utils
Version:
Utilities for interacting with Raspberry IOs and Raspbian
160 lines • 9.56 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const av_player_factory_1 = require("./av-player-factory");
const EventEmitter = require('events');
/**
* # Audio/Video player
*
* This player checks the availability of some common players (mplayer, vlc, omxplayer) and uses what is available
* to play given media.
*
* ## Events
*
* ### `ready`
*
* Emitted when the AV player is ready and has checked the available players.
*
* ### `start`
*
* Video has been started.
*
* ### `stop`
*
* Video has been stopped.
*
* ### `error`
*
* Some kind of error has occurred. Must be handled, otherwise the process exit(1)s.
*/
class AvPlayer extends EventEmitter {
/**
* @param preferredPlayers Defines the order of preferred audio/video players. The first existing is used.
* See {@link AvPlayerFactory} for a list of valid players.
*/
constructor(preferredPlayers) {
super();
this._factory = new av_player_factory_1.AvPlayerFactory();
this._factory.init(preferredPlayers).then(() => this.emit('ready'));
this._volume = 100;
this._loop = false;
this._activePlayer = undefined;
this._file = undefined;
}
/**
* Stops the player *and* disables looping.
*/
stop() {
this.loop = false;
return this._stop();
}
/**
* Play back the specified file.
* If playback is already active, it is stopped and then the new file is played back.
*
* Note: Do not forget to handle the error event.
*
* @return Promise which resolves as soon as playback has started.
*/
play(file) {
this._file = file;
return this._stop().then(() => this._play(file));
}
/**
* Set the audio volume. This does not affect the current playback as it is passed as command-line argument.
* @param volume Volume, between 0 and 100
*/
set volume(volume) {
volume = Number(volume);
if (isNaN(volume) || volume < 0 || volume > 100)
throw new Error('volume must be a number between 0 and 100');
this._volume = volume;
}
/**
* @param loop When `true`, the file is looped.
*/
set loop(loop) {
this._loop = loop;
}
get volume() {
return this._volume;
}
/**
* Returns the file that is currently loaded
*/
get file() {
return this._file;
}
/**
* Returns the elapsed time in milliseconds since playback started.
*/
get elapsed() {
return this._startedAt && (Date.now() - this._startedAt);
}
get status() {
return {
volume: this._volume,
file: this._file,
running: this.running,
activePlayer: this._activePlayer ? this._activePlayer.status : 'No active player',
};
}
get running() {
return this._activePlayer && this._activePlayer.running;
}
/**
* @return Resolves when playback starts or when an error occurs
*/
_play(file) {
return new Promise((resolve) => {
if (this._activePlayer)
this._activePlayer.removeAllListeners('error');
this._activePlayer = this._factory.createPlayer(file);
this._activePlayer.once('start', () => {
this._started();
resolve();
});
this._activePlayer.once('stop', () => this._stopped());
this._activePlayer.on('error', (err) => {
this._error(err);
});
this._activePlayer.volume = this._volume;
this._activePlayer.start();
});
}
_stop() {
return new Promise((resolve) => {
if (this._activePlayer && this._activePlayer.running) {
this._activePlayer.once('stop', () => {
resolve();
});
this._activePlayer.stop();
}
else {
resolve();
}
});
}
_started() {
this._startedAt = Date.now();
setImmediate(() => this.emit('start'));
}
_stopped() {
this._startedAt = undefined;
setImmediate(() => this.emit('stop'));
if (this._loop) {
console.log('Loop: Restarting audio file');
this.play(this._file)
.catch((err) => this.emit('error', err));
}
else {
console.log('Not restarting.', this._loop);
}
}
_error(err) {
this._startedAt = undefined;
setImmediate(() => this.emit('error', err));
console.error('Player error: ' + err);
}
}
exports.AvPlayer = AvPlayer;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXYtcGxheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F2cGxheWVyL2F2LXBsYXllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDJEQUF1RTtBQUd2RSxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUUsUUFBUSxDQUFFLENBQUM7QUFFekM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBYSxRQUFTLFNBQVEsWUFBWTtJQVV0Qzs7O09BR0c7SUFDSCxZQUFhLGdCQUFxQztRQUM5QyxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxtQ0FBZSxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUUsZ0JBQWdCLENBQUUsQ0FBQyxJQUFJLENBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBRSxPQUFPLENBQUUsQ0FBRSxDQUFDO1FBRTFFLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1FBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUk7UUFDQSxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNsQixPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQUksQ0FBRSxJQUFhO1FBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUUsSUFBSSxDQUFFLENBQUUsQ0FBQztJQUN6RCxDQUFDO0lB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