UNPKG

homebridge-kodi

Version:
245 lines 9.84 kB
"use strict"; const connection = require("../util/connection"); const util = require("util"); const child_process = require("child_process"); // eslint-disable-next-line @typescript-eslint/no-var-requires const storage = require('node-persist'); module.exports = { getStatus: async function (config) { return await connection.kodiRequest(config, 'JSONRPC.Ping', {}) .then(result => { return result && result === 'pong' ? true : false; }) // eslint-disable-next-line @typescript-eslint/no-unused-vars .catch(_ => { // Don't log an error here anymore, because of the new power on/off capabilities since v1.1.0 return false; }); }, // eslint-disable-next-line @typescript-eslint/no-explicit-any getActionResult: async function (config, method, parameters) { const status = await this.getStatus(config); if (status) { const result = await connection.kodiRequest(config, method, parameters); return [result && (result === 'OK' || result !== undefined || result !== null), result]; } else { return [false, null]; } }, applicationGetProperties: async function (config, properties) { return await this.getStatus(config) ? await connection.kodiRequest(config, 'Application.GetProperties', { 'properties': properties }) : null; }, applicationSetMute: async function (config, mute) { return await this.getStatus(config) ? await connection.kodiRequest(config, 'Application.SetMute', { 'mute': mute }) : null; }, applicationSetVolume: async function (config, volume) { return await this.getStatus(config) ? await connection.kodiRequest(config, 'Application.SetVolume', { 'volume': volume }) : null; }, input: async function (config, command, params) { const status = await this.getStatus(config); if (status) { let input = ''; switch (command) { case 'home': input = 'Input.Home'; break; case 'select': input = 'Input.Select'; break; case 'back': input = 'Input.Back'; break; case 'info': input = 'Input.Info'; break; case 'contextmenu': input = 'Input.ContextMenu'; break; case 'left': input = 'Input.Left'; break; case 'right': input = 'Input.Right'; break; case 'up': input = 'Input.Up'; break; case 'down': input = 'Input.Down'; break; case 'showcodec': input = 'Input.ShowCodec'; break; case 'showosd': input = 'Input.ShowOSD'; break; case 'showplayerprocessinfo': input = 'Input.ShowPlayerProcessInfo'; break; case 'sendtext': input = 'Input.SendText'; break; case 'executeaction': input = 'Input.ExecuteAction'; break; default: input = 'Input.ExecuteAction'; break; } let paramsValue = {}; if (input === 'Input.ExecuteAction') { if (params && params !== '') { paramsValue = { 'action': params }; } else { paramsValue = { 'action': command }; } } else if (input === 'Input.SendText') { if (params && params !== '') { paramsValue = { 'text': params }; } } return await connection.kodiRequest(config, input, paramsValue); } else { return null; } }, playerGetActivePlayers: async function (config) { const status = await this.getStatus(config); if (status) { const activeplayers = await connection.kodiRequest(config, 'Player.GetActivePlayers', {}); if (activeplayers.length === 0) { return null; } else { for (let i = 0; i < activeplayers.length; i++) { const player = activeplayers[i]; const playerid = typeof player.playerid !== 'undefined' ? player.playerid : -1; const playertype = player.playertype ? player.playertype : ''; const type = player.type ? player.type : ''; if ((playerid !== -1 && playertype === 'internal') && (type === 'video' || type === 'audio')) { return playerid; } } return null; } } else { return null; } }, playerGetItem: async function (config, playerid, properties) { return await this.getStatus(config) ? await connection.kodiRequest(config, 'Player.GetItem', { 'playerid': playerid, 'properties': properties }) : null; }, playerGetProperties: async function (config, playerid, properties) { return await this.getStatus(config) ? await connection.kodiRequest(config, 'Player.GetProperties', { 'playerid': playerid, 'properties': properties }) : null; }, playerSetPlay: async function (config, playerid, play) { return await this.getStatus(config) ? await connection.kodiRequest(config, 'Player.PlayPause', { 'playerid': playerid, 'play': play }) : null; }, playerSeek: async function (config, playerid, percentage) { return await this.getStatus(config) ? await connection.kodiRequest(config, 'Player.Seek', { 'playerid': playerid, 'value': { 'percentage': percentage } }) : null; }, playerStop: async function (config, playerid) { return await this.getStatus(config) ? await connection.kodiRequest(config, 'Player.Stop', { 'playerid': playerid }) : null; }, tvGetChannels: async function (config) { return await this.getStatus(config) ? await connection.kodiRequest(config, 'PVR.GetChannels', { 'channelgroupid': 1, 'properties': ['channel'] }) : null; }, isPlaying: async function (config) { const playerid = await this.playerGetActivePlayers(config); if (playerid !== null && playerid !== -1) { const result = await this.playerGetProperties(config, playerid, ['speed']); if (result) { const playing = result.speed !== 0 ? result.speed !== 0 : false; const paused = result.speed === 0 ? result.speed === 0 : false; if (playing) { return [true, false]; } else if (paused) { return [false, true]; } else { return [false, false]; } } else { return [false, false]; } } else { return [false, false]; } }, tvIsPlaying: async function (config) { const playerid = await this.playerGetActivePlayers(config); if (playerid !== null && playerid !== -1) { const result = await this.playerGetItem(config, playerid, []); if (result) { if (result.item.type === 'channel') { return true; } else { return false; } } else { return false; } } else { return false; } }, closeFavoritesWindowIfOpened: async function (config, log) { const [ok, result] = await this.getActionResult(config, 'GUI.GetProperties', { 'properties': ['currentwindow'] }); if (ok && result && result.currentwindow.id && result.currentwindow.id === 10134) { const [ok] = await this.getActionResult(config, 'Input.ExecuteAction', { 'action': 'close' }); if (ok) { log.debug('Closing Favorites'); } else { log.debug('Closing Favorites: Failed (maybe not opened...)'); } } else { log.debug('Closing Favorites: Not opened'); } }, storageGetItem: async function (cachedir, name) { await storage.init({ dir: cachedir, forgiveParseErrors: true }); return storage.getItem(name); }, storageSetItem: async function (cachedir, name, value) { await storage.init({ dir: cachedir, forgiveParseErrors: true }); await storage.setItem(name, value); return; }, executeShellCommand: async function (cmd) { const exec = util.promisify(child_process.exec); const { stdout, stderr } = await exec(cmd, { timeout: 5000 }); return stdout ? stdout : stderr; }, }; //# sourceMappingURL=kodi.js.map