Home

Awesome

A development platform for building roku channels in brighterscript

build GitHub NPM Version

Why maestro?

Maestro Makes roku development easier, especially for experienced software engineers from other platforms

I believe that experienced developers from android, ios, c#, web, node, etc, should be able to be productive on a roku app in no more than a week, just as they would on any other platform. So I wrote maestro to make that possible.

Maestro is built to:

Quick start

Sideload without building

Building sample apps/playing with maestro frameork

  1. git clone https://github.com/georgejecook/maestro-roku-sample.git
  2. npm install
  3. npm run ropm
  4. open the project in vscode
  5. ensusre you have the brighterscript vscode extension installed
  6. .vscode/.env.sample to .vscode/.env and edit the ROKU_DEV_TARGET and ROKU_DEVPASSWORD variables, to match your roku device.
  7. launch the SAMPLE APP dev target.

note, some sample screens will lose focus when you back out of them. Sorry about that! We will fix that soon - for now, just press home and launch again.

Interesting notions

In bsconfig.json, you can change the rokuLog settings to control how logging works (this is part of roku-log)

Sample project

We maintain a simple sample project with sensible examples, which can show you everything you can do with maestro. It is WIP.

Presently the project may be broken - we will get it fixed up, with a more full example of how to use maestro to build a FULL app in 2024Q2

Docs

Maestro-roku docs can be found here

IMPORTANT!! ropm hook

Because of the way that maestro plugin generates certain files, ropm can will cause errors when you install maestro. You will have to include a script to fix any of these broken files, and run it after you ropm hook.

files

scripts/maestro-ropm-hook.js

/* eslint-disable github/array-foreach */
/* eslint-disable @typescript-eslint/no-var-requires */
/* eslint-disable @typescript-eslint/no-require-imports */
const fs = require('fs-extra');
const path = require('path');

let sourceDir = path.join(__dirname, '..', 'src', 'components', 'roku_modules', 'maestro');

try {
    fs.readdirSync(sourceDir).forEach(file => {
        let filePath = path.join(sourceDir, file);
        if (filePath.endsWith('Task.xml')) {

            let text = fs.readFileSync(filePath, 'utf8');
            let r = /\/roku_modules\/rokucommunity_bslib/gim;
            text = text.replace(r, '/roku_modules/maestro');
            fs.writeFileSync(filePath, text);
        }
    });
} catch (e) {
}

package.json

Change your ropm task, as follows. in package.json, scripts:

"ropm": "node scripts/maestro-ropm-hook.js ropm copy",