From b88df4b4e8f521f21ffdbc0ba273dca67c14959b Mon Sep 17 00:00:00 2001 From: ejurgensen Date: Sat, 17 May 2025 01:19:27 +0200 Subject: [PATCH] [airplay] Fix client name showing as blank when pairing with MacOS Also include the X-Apple-HKP header in pair-pin-start like iOS does, just in case. Ref issue #1885 --- src/outputs/airplay.c | 10 ++++++++++ src/outputs/raop.c | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/src/outputs/airplay.c b/src/outputs/airplay.c index bc2bacde..3463ca31 100644 --- a/src/outputs/airplay.c +++ b/src/outputs/airplay.c @@ -861,6 +861,7 @@ request_headers_add(struct evrtsp_request *req, struct airplay_session *rs, enum { char buf[64]; const char *user_agent; + const char *client_name; const char *method; const char *url; int ret; @@ -873,6 +874,9 @@ request_headers_add(struct evrtsp_request *req, struct airplay_session *rs, enum user_agent = cfg_getstr(cfg_getsec(cfg, "general"), "user_agent"); evrtsp_add_header(req->output_headers, "User-Agent", user_agent); + client_name = cfg_getstr(cfg_getsec(cfg, "library"), "name"); + evrtsp_add_header(req->output_headers, "X-Apple-Client-Name", client_name); + // If we have a realm + nonce it means that the device told us in the reply to // SETUP that www authentication with password is required if (rs->realm && rs->nonce) @@ -2640,6 +2644,12 @@ static int payload_make_pin_start(struct evrtsp_request *req, struct airplay_session *rs, void *arg) { DPRINTF(E_LOG, L_AIRPLAY, "Starting device pairing for '%s', go to the web interface and enter PIN\n", rs->devname); + + if (rs->pair_type == PAIR_CLIENT_HOMEKIT_NORMAL) + evrtsp_add_header(req->output_headers, "X-Apple-HKP", "3"); + else if (rs->pair_type == PAIR_CLIENT_HOMEKIT_TRANSIENT) + evrtsp_add_header(req->output_headers, "X-Apple-HKP", "4"); + return 0; } diff --git a/src/outputs/raop.c b/src/outputs/raop.c index a4b8f310..5eeb97bc 100644 --- a/src/outputs/raop.c +++ b/src/outputs/raop.c @@ -1109,6 +1109,7 @@ raop_add_headers(struct raop_session *rs, struct evrtsp_request *req, enum evrts const char *method; const char *url; const char *user_agent; + const char *client_name; int ret; method = evrtsp_method(req_method); @@ -1121,6 +1122,9 @@ raop_add_headers(struct raop_session *rs, struct evrtsp_request *req, enum evrts user_agent = cfg_getstr(cfg_getsec(cfg, "general"), "user_agent"); evrtsp_add_header(req->output_headers, "User-Agent", user_agent); + client_name = cfg_getstr(cfg_getsec(cfg, "library"), "name"); + evrtsp_add_header(req->output_headers, "X-Apple-Client-Name", client_name); + /* Add Authorization header */ url = (req_method == EVRTSP_REQ_OPTIONS) ? "*" : rs->session_url;