123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- /**
- * video.js - video element for blessed
- * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).
- * https://github.com/chjj/blessed
- */
- /**
- * Modules
- */
- var cp = require('child_process');
- var Node = require('./node');
- var Box = require('./box');
- var Terminal = require('./terminal');
- /**
- * Video
- */
- function Video(options) {
- var self = this
- , shell
- , args;
- if (!(this instanceof Node)) {
- return new Video(options);
- }
- options = options || {};
- Box.call(this, options);
- if (this.exists('mplayer')) {
- shell = 'mplayer';
- args = ['-vo', 'caca', '-quiet', options.file];
- } else if (this.exists('mpv')) {
- shell = 'mpv';
- args = ['--vo', 'caca', '--really-quiet', options.file];
- } else {
- this.parseTags = true;
- this.setContent('{red-fg}{bold}Error:{/bold}'
- + ' mplayer or mpv not installed.{/red-fg}');
- return this;
- }
- var opts = {
- parent: this,
- left: 0,
- top: 0,
- width: this.width - this.iwidth,
- height: this.height - this.iheight,
- shell: shell,
- args: args.slice()
- };
- this.now = Date.now() / 1000 | 0;
- this.start = opts.start || 0;
- if (this.start) {
- if (shell === 'mplayer') {
- opts.args.unshift('-ss', this.start + '');
- } else if (shell === 'mpv') {
- opts.args.unshift('--start', this.start + '');
- }
- }
- var DISPLAY = process.env.DISPLAY;
- delete process.env.DISPLAY;
- this.tty = new Terminal(opts);
- process.env.DISPLAY = DISPLAY;
- this.on('click', function() {
- self.tty.pty.write('p');
- });
- // mplayer/mpv cannot resize itself in the terminal, so we have
- // to restart it at the correct start time.
- this.on('resize', function() {
- self.tty.destroy();
- var opts = {
- parent: self,
- left: 0,
- top: 0,
- width: self.width - self.iwidth,
- height: self.height - self.iheight,
- shell: shell,
- args: args.slice()
- };
- var watched = (Date.now() / 1000 | 0) - self.now;
- self.now = Date.now() / 1000 | 0;
- self.start += watched;
- if (shell === 'mplayer') {
- opts.args.unshift('-ss', self.start + '');
- } else if (shell === 'mpv') {
- opts.args.unshift('--start', self.start + '');
- }
- var DISPLAY = process.env.DISPLAY;
- delete process.env.DISPLAY;
- self.tty = new Terminal(opts);
- process.env.DISPLAY = DISPLAY;
- self.screen.render();
- });
- }
- Video.prototype.__proto__ = Box.prototype;
- Video.prototype.type = 'video';
- Video.prototype.exists = function(program) {
- try {
- return !!+cp.execSync('type '
- + program + ' > /dev/null 2> /dev/null'
- + ' && echo 1', { encoding: 'utf8' }).trim();
- } catch (e) {
- return false;
- }
- };
- /**
- * Expose
- */
- module.exports = Video;
|