Node.js Roku Remote

Vlastním Apple TV 4, Apple TV 3, Roku 4, Chromecast a Firefox OS TV. Z toho pravděpodobně pochopíte, že miluji streamování obsahu, zejména sportu a filmů. Zjevně také miluji kódování, a proto jsem rád pracoval jako partnerský inženýr pro Firefox OS TV od Mozilly – nadšeně jsem testoval televizní aplikace a zkoumal okrajová rozhraní API a responzivní techniky.

Vždy mě zajímá najít způsob, jak dělat zajímavé věci pomocí JavaScriptu a streamování mě okamžitě napadne. S uzavřeným ekosystémem Apple TV nemohu nic dělat, ale existují známé způsoby práce s Roku, a tak jsem se rozhodl udělat něco zajímavého s Roku a Node.js – vytvořit funkci dálkového ovládání.

Node.js Roku Remote

Existuje pěkný nástroj s názvem node-roku který najde zařízení Roku a poskytne IP adresu každého Roku, abyste s ním mohli pracovat v síti. node-roku obslužný program také poskytuje rozhraní API pro získávání informací o zařízení a seznamu aplikací z Roku. Rozhodl jsem se vytvořit skript, který po spuštění umožní uživateli používat klávesnici svého počítače k ​​navigaci v Roku, výběru a spouštění aplikací atd.

Začněme verzí 0.1.0 se zdrojovým kódem:

const readline = require('readline');

const request = require('request');
const Roku = require('node-roku');
const xml2json = require('xml2json');

// Will be populated once a device is found
var address;

// Map to this URL: http://******:8060/keypress/{key}
const keyEndpoint = {
  // Arrow Keys
  left: 'Left',
  right: 'Right',
  up: 'Up',
  down: 'Down',

  // Standard Keys
  space: 'Play',
  backspace: 'Back',
  return: 'Select',

  // Sequences (shift key)
  H: 'home',
  R: 'Rev',
  F: 'Fwd',
  S: 'Search',
  E: 'Enter',

  // Other
  r: 'InstantReplay',
  b: 'InfoBackspace'
};
const xmlToObject = xml => {
    return JSON.parse(xml2json.toJson(xml));
}

readline.emitKeypressEvents(process.stdin);
process.stdin.setRawMode(true);

console.log('Looking for the (first) Roku...');

// Find the Roku
// TODO:  Allow for selection of multiple Rokus; current assuming only one
Roku.find((err, devices) => {
  if(err) {
    console.log('`roku.find` error: ', err);
    process.exit();
  }

  if(!devices.length) {
    console.log('No Roku devices found.  Bailing.');
    process.exit();
  }

  address = devices[0];
  Roku.getDevice(address, (err, deviceDetail) => {
    console.log('Connected to Device: ', xmlToObject(deviceDetail).root.device.friendlyName, ' (', devices[0],')');
    console.log('Press keys to navigate the Roku and select content!');
  });
});

// Start the keypress listener
process.stdin.on('keypress', (str, key) => {
  var endpoint;

  // Ignore everything until we're connected
  if(!address) {
    return;
  }

  // "Raw" mode so we must do our own kill switch
  if(key.sequence === '\u0003') {
    process.exit();
  }

  // Handle commands
  endpoint = keyEndpoint[key.name] || keyEndpoint[key.sequence] || 'Lit_' + key.name;

  // Ignore undefined keypresses (no name or sequence)
  if(endpoint === 'Lit_undefined') {
    return;
  }

  // Send command!
  request.post(address + '/keypress/' + endpoint);
});

Nyní si vysvětlíme, co se děje se zdrojovým kódem výše:

  1. xml2json je vyžadováno, protože informace o zařízení jsou vráceny jako XML
  2. Interakce s Roku se provádí prostřednictvím požadavků POST s formátem adresy URL http://******:8060/keypress/{key}; při každém stisknutí klávesy se odešle POST
  3. readline.emitKeypressEvents(process.stdin); a process.stdin.setRawMode(true); nařizuje Node.js fungovat mimo normální provoz shellu, proto musíme explicitně zkontrolovat CONTROL+C k vypnutí vzdáleného procesu a procesu Node.js
  4. Logika stisknutí klávesy je tato: používáme objekt, keyEndpoint , mapovat logické události stisku kláves na známé koncové body; není-li klíč určen, předáme jej zařízení Roku jako stisknutí klávesy (tj. například klíč k vyhledávacímu poli).

Získejte rok-remote

Zveřejnil jsem svůj kód Roku Remote na GitHub i NPM – pokyny k instalaci a použití jsou k dispozici na obou místech. Vyzkoušejte to prosím, založte problémy a budu rád za příspěvky, pokud je máte!

Webové rozhraní pro rok-remote by bylo sladké; může mít různá Roku, která můžete nasměrovat, seznam aplikací, na které lze kliknout a spustit, a tak dále. S tímto prvním krokem jsem spokojený, protože vyhovuje mým potřebám, snadno se používá a je zde spousta prostoru pro růst. Příjemné streamování!