UNPKG

homebridge-panasonic-bluray-players

Version:

Get status of Panasonic Blu-ray players

231 lines 6.34 kB
import * as http from 'http'; const HEADERS = { 'User-Agent': 'MEI-LAN-REMOTE-CALL', 'Content-Type': 'application/x-www-form-urlencoded', }; const KEYS = [ 'POWER', 'OP_CL', 'PLAYBACK', 'PAUSE', 'STOP', 'SKIPFWD', 'SKIPREV', 'REV', 'D0', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7', 'D8', 'D9', 'D12', 'SHARP', // '#' key 'CLEAR', // '*' / CANCEL 'UP', 'DOWN', 'LEFT', 'RIGHT', 'SELECT', 'RETURN', 'EXIT', 'MLTNAVI', // HOME 'DSPSEL', // STATUS 'TITLE', 'MENU', 'PUPMENU', 'SHFWD1', 'SHFWD2', 'SHFWD3', 'SHFWD4', 'SHFWD5', 'SHREV1', 'SHREV2', 'SHREV3', 'SHREV4', 'SHREV5', 'JLEFT', 'JRIGHT', 'RED', 'BLUE', 'GREEN', 'YELLOW', 'NETFLIX', 'SKYPE', 'V_CAST', '3D', 'NETWORK', 'AUDIOSEL', 'KEYS', 'CUE', 'CHROMA', 'MNBACK', 'MNSKIP', '2NDARY', 'PICTMD', 'DETAIL', 'RESOLUTN', 'OSDONOFF', 'P_IN_P', ]; export class PanasonicBD { _host; _state; _duration; _variant; constructor(host, variant = 'AUTO') { this._host = host; this._state = null; this._duration = 0; this._variant = variant; // 'AUTO', 'BD', or 'UB' } sendCmd(url, data, callback) { const options = { method: 'POST', timeout: 5000, headers: { ...HEADERS, 'Content-Length': Buffer.byteLength(data), }, }; // console.log('HTTP Request Details:'); // console.log('URL:', url); // console.log('Options:', JSON.stringify(options, null, 2)); // console.log('Data:', data); const req = http.request(url, options, (res) => { let rawData = ''; res.setEncoding('utf8'); res.on('data', (chunk) => { rawData += chunk; }); res.on('end', () => { const lines = rawData.split('\r\n'); if (lines.length < 2) { callback(null, ['error', null]); return; } const firstLine = lines[0].split(',')[0]; if (firstLine !== '00') { callback(null, ['error', null]); } else { const secondLine = lines[1].split(','); callback(null, ['ok', secondLine]); } }); }); req.on('error', () => { this._state = 'off'; callback(null, ['off', null]); }); req.write(data); req.end(); } sendKey(key, callback) { if (!KEYS.includes(key)) { callback(null, ['error', null]); return; } if (this._variant === 'UB') { callback(null, ['error', null]); return; } const url = `http://${this._host}/WAN/dvdr/dvdr_ctrl.cgi`; const data = `cCMD_RC_${key}.x=100&cCMD_RC_${key}.y=100`; this.sendCmd(url, data, (err, resp) => { if (this._variant === 'AUTO') { if (resp[0] === 'error') { this._variant = 'UB'; callback(null, ['error', null]); return; } else { this._variant = 'BD'; } } callback(null, resp); }); } getStatus(callback) { if (this._variant === 'UB') { callback(null, ['1', '0', '0', '00000000', '0']); return; } const url = `http://${this._host}/WAN/dvdr/dvdr_ctrl.cgi`; const data = 'cCMD_GET_STATUS.x=100&cCMD_GET_STATUS.y=100'; this.sendCmd(url, data, (err, resp) => { if (resp[0] === 'error') { if (this._variant === 'AUTO') { this._variant = 'UB'; callback(null, ['1', '0', '0', '00000000', '0']); return; } else { callback(null, 'error'); return; } } if (resp[0] === 'off') { callback(null, 'off'); return; } callback(null, resp[1]); }); } getPlayStatus(callback) { const url = `http://${this._host}/WAN/dvdr/dvdr_ctrl.cgi`; const data = 'cCMD_PST.x=100&cCMD_PST.y=100'; this.sendCmd(url, data, (err, resp) => { if (resp[0] === 'off') { this._state = 'off'; callback(null, 'off', 0, 0); return; } else if (resp[0] === 'error') { callback(null, 'error', 0, 0); return; } this.getStatus((err, status) => { if (status === 'off') { this._state = 'off'; callback(null, 'off', 0, 0); return; } else if (status === 'error') { callback(null, 'error', 0, 0); return; } const stateResponse = resp[1]; if (stateResponse === null) { callback(null, 'error', 0, 0); return; } let state; if (stateResponse[0] === '0') { if (status[0] === '0') { state = 'standby'; } else { state = 'stopped'; } } else if (stateResponse[0] === '1') { state = 'playing'; } else if (stateResponse[0] === '2') { state = 'paused'; } else { state = 'unknown'; } const playtime = parseInt(stateResponse[1], 10) || 0; const duration = parseInt(status[4], 10) || 0; callback(null, state, playtime, duration); }); }); } } //# sourceMappingURL=panasonic.js.map