播放/暂停每次都要拿遥控器,好麻烦,干脆通过脚本/程序远程暂停
环境
- 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"}
这样的错误信息