通过 Json-RPC 远程控制 Kodi

播放/暂停每次都要拿遥控器,好麻烦,干脆通过脚本/程序远程暂停

环境

  • CoreELEC 19
    • Kodi 19.3

准备

  • 开启 Kodi 的 Web 界面,设置用户名和密码
    • CoreELEC 等下游系统也支持 Json-RPC
  • cURL
  • 任意支持发送 POST 请求的编程语言

关于 Kodi 的 Json-RPC

可以通过对 http://[Kodi IP]:[Web Port]/jsonrpc 发送 GET 请求来查看支持的操作,不过不全面,推荐根据 Kodi 版本在 https://kodi.wiki/view/JSON-RPC_API 查找对应版本的文档,Kodi 19 可以查看 v12 版:https://kodi.wiki/view/JSON-RPC_API/v12

cURL

这里只给出播放/暂停的指令,其他指令可以通过更改执行名称(method)和指令对应的参数(params)举一反三

curl -X POST --user [web interface usename]:[web interface password] -H 'Content-Type: application/json' -i http://[Kodi IP]:[Web Port]/jsonrpc --data '{"jsonrpc": "2.0", "method": "Player.PlayPause", "params": { "playerid": 0 }, "id": 1}'

C#

以 C# 为例,实现远程控制 Kodi 播放/暂停的小程序,使用 .NET 7,参考了 https://github.com/steve600/KodiJsonRpcSample

首先创建一个 JsonRpcRequest 类

using System.Text.Json.Serialization;

namespace KodiRemoteTest {
    public class JsonRpcRequest {
        [JsonPropertyName("jsonrpc")]
        [JsonRequired]
        public string JsonRPC { get; set; } = "2.0";

        [JsonPropertyName("id")]
        [JsonRequired]
        public int Id { get; set; }

        [JsonPropertyName("method")]
        [JsonRequired]
        public string Method { get; set; }

        [JsonPropertyName("params")]
        public object Params { get; set; }
    }
}

然后创建 JsonRpcRequest 类的实例,修改 Method 字段和 Params 字段来满足不同指令的需求

using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;

namespace KodiRemoteTest {
    internal class Program {
        internal static string KodiUrl = "http://[IP]:[port]/jsonrpc";
        internal static string Username = "username";
        internal static string Passowrd = "passowrd";
        static async Task Main() {
            var kodiRequest = new JsonRpcRequest() {
                Id = 1,
                Method = "Player.PlayPause",
                Params = new {
                    playerid = 0
                }
            };

            var httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(5) };
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes($"{Username}:{Passowrd}")));

            Console.WriteLine(JsonSerializer.Serialize(kodiRequest));

            var response = await httpClient.PostAsync(requestUri: KodiUrl, content: new StringContent(JsonSerializer.Serialize(kodiRequest), encoding: Encoding.UTF8, mediaType: "application/json"));

            Console.WriteLine(response.StatusCode);
            Console.WriteLine(await response.Content.ReadAsStringAsync());
        }
    }
}

调用前最好先通过 Player.GetActivePlayers 确认一下正在播放的播放器 ID(playerid)

无论哪种方式都不要忘记使用用户名和密码完成 HTTP 基本身份认证,否则会出现

{"error":{"code":-32099,"message":"Bad client permission."},"id":1,"jsonrpc":"2.0"}

这样的错误信息

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据