chromecast-player icon indicating copy to clipboard operation
chromecast-player copied to clipboard

handle close-events correctly

Open xat opened this issue 9 years ago • 6 comments

  • The onClose callback defined in api.js never seems to get called
  • There should be a defined way to shutdown the player
  • The listeners within timelineHelper.js should get removed on close

xat avatar Jan 13 '15 07:01 xat

I might be concern with this issue. I tried to made a simple web ui for my own needs, with 2 routes, one launching a cast on stream url, the other stopping the player.

It goes like this

var debug = require('debug')('webui');
var express = require('express');
var Player = require('chromecast-player');
var router = express.Router();



router.get('/launch', function(req, res, next) {
    var media = req.query.media;
    if (!media) return next(new Error('Missing media query param'));

    var options = {
        path: media,
        type: req.query.type
    };

    var player = new Player();
    player.attach(function(err, p) {
        if (err) return next(err);

        debug('launch player %o', options);
        p.load(options, function(err) {
            if (err) return next(err);
            res.status(200).send();
            // process.exit();
        });

    });
});

router.get('/stop', function(req, res, next) {

    var player = new Player();
    player.attach(function(err, p) {
        if (err) return next(err);

        debug('stop player');
        p.stop(function(err) {
            if (err) return next(err);
            res.status(200).send('ok');
            // process.exit();
        });
    });

});



module.exports = router;

But if I call my routes twice (like launch then stop) I got this error

device not found

Error: device not found
    at null._onTimeout (/home/jsteunou/git/castnow-webui/node_modules/chromecast-player/node_modules/chromecast-scanner/index.js:34:10)
    at Timer.listOnTimeout [as ontimeout] (timers.js:112:15)

You can see I tried to find a way around the error by killing the process after each success, letting my watchdog starting back the server. But that does not work well either.

What can I do to help?

JSteunou avatar Feb 14 '15 19:02 JSteunou

The player instance now can be destroyed like this:

player.launch('<url>', function(err, p, ctx) {
    setTimeout(function() {
        ctx.shutdown();
    }, 5000);

    ctx.on('closed', function() {
        console.log('player got shutdown');
    });
});

You should now also be able to launch the player multiple times, as long as you shutdown the instance which was running before.

xat avatar Feb 21 '15 23:02 xat

thanks a lot, I'll try that!

JSteunou avatar Feb 22 '15 09:02 JSteunou

Ok my code is a lot cleaner now, I did not have to call that shutdown method, or kill my process like before, and it works beautifully well!

var debug = require('debug')('webui');
var express = require('express');
var Player = require('chromecast-player');
var router = express.Router();



router.get('/launch', function(req, res, next) {
    var media = req.query.media;
    if (!media) return next(new Error('Missing media query param'));

    var options = {
        path: media,
        type: req.query.type
    };

    debug('launch player with options: %o', options);
    var player = new Player();
    player.launch(options, function(err, p, ctxt) {
        if (err) return next(err);

        p.once('playing', function(info) {
            debug('playing %o', info);
            res.status(200).send('ok');
        });

    });
});

router.get('/stop', function(req, res, next) {
    debug('attach to player');
    var player = new Player();
    player.attach(function(err, p, ctxt) {
        if (err) return next(err);

        debug('stop player');
        p.stop(function(err, info) {
            if (err) return next(err);
            debug('stopped %o', info);
            res.status(200).send('ok');
        });
    });
});



module.exports = router;

again thank you.

JSteunou avatar Feb 22 '15 16:02 JSteunou

Nice, but you should run the shutdown() method even if it works without. shutdown() will unlisten eventListeners and stop the setInterval created by the timeline helper. Otherwise it will leek memory.

xat avatar Feb 22 '15 19:02 xat

ho ok thanks for the advice.

JSteunou avatar Feb 22 '15 19:02 JSteunou