diff --git a/README.html b/README.html
index 7d0ad55..9e9e513 100644
--- a/README.html
+++ b/README.html
@@ -9,16 +9,17 @@ class="uri">https://github.com/FDH2/UxPlay (where ALL user issues
should be posted, and latest versions can be found).
- NEW in v1.71: Support for (YouTube) HLS (HTTP
-Live Streaming) video with the new “-hls” option. Click on the
-airplay icon in the YouTube app to stream video. (You may need to wait
-until advertisements have finished or been skipped before clicking the
-YouTube airplay icon.) Please report any issues with this new
-feature of UxPlay. The default video player for HLS is
-GStreamer playbin v3: use “-hls 2” to revert to playbin v2 if some
-videos fail to play.
+Live Streaming) video with the new “-hls” option. Only
+streaming from the YouTube iOS app is currently supported:
+(streaming using the AirPlay icon in a browser window is
+not yet supported).Click on the airplay icon in the
+YouTube app to stream video. (You may need to wait until advertisements
+have finished or been skipped before clicking the YouTube airplay icon.)
+Please report any issues with this new feature of
+UxPlay. The default video player for HLS is GStreamer
+playbin v3: use “-hls 2” to revert to playbin v2 if some videos fail to
+play.
-NEWS: macOS Sequoia 15.2 has an AirPlay
-bug: update to macOS 15.3 for mirroring screen with UxPlay.
Highlights:
- GPLv3, open source.
diff --git a/README.md b/README.md
index 1f5f26f..83357ee 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,9 @@
### **Now developed at the GitHub site (where ALL user issues should be posted, and latest versions can be found).**
- ***NEW in v1.71**: Support for (YouTube) HLS (HTTP Live Streaming)
- video with the new "-hls" option.* Click on the airplay icon in the
+ video with the new "-hls" option.* **Only streaming from the YouTube iOS app
+ is currently supported**: (streaming using the AirPlay icon in a browser window
+ is **not** yet supported).Click on the airplay icon in the
YouTube app to stream video. (You may need to wait until
advertisements have finished or been skipped before clicking the
YouTube airplay icon.) **Please report any issues with this new
@@ -11,9 +13,6 @@
GStreamer playbin v3: use "-hls 2" to revert to playbin v2 if
some videos fail to play_.
-***NEWS***: macOS Sequoia 15.2 has an AirPlay bug: update to macOS 15.3
- for mirroring screen with UxPlay.
-
## Highlights:
- GPLv3, open source.
diff --git a/README.txt b/README.txt
index 0648b6c..08316dc 100644
--- a/README.txt
+++ b/README.txt
@@ -3,17 +3,16 @@
### **Now developed at the GitHub site (where ALL user issues should be posted, and latest versions can be found).**
- ***NEW in v1.71**: Support for (YouTube) HLS (HTTP Live Streaming)
- video with the new "-hls" option.* Click on the airplay icon in the
- YouTube app to stream video. (You may need to wait until
+ video with the new "-hls" option.* **Only streaming from the YouTube
+ iOS app is currently supported**: (streaming using the AirPlay icon
+ in a browser window is **not** yet supported).Click on the airplay
+ icon in the YouTube app to stream video. (You may need to wait until
advertisements have finished or been skipped before clicking the
YouTube airplay icon.) **Please report any issues with this new
feature of UxPlay**. *The default video player for HLS is GStreamer
playbin v3: use "-hls 2" to revert to playbin v2 if some videos fail
to play*.
-***NEWS***: macOS Sequoia 15.2 has an AirPlay bug: update to macOS 15.3
-for mirroring screen with UxPlay.
-
## Highlights:
- GPLv3, open source.
diff --git a/lib/http_handlers.h b/lib/http_handlers.h
index 3db7fdc..2b96c46 100644
--- a/lib/http_handlers.h
+++ b/lib/http_handlers.h
@@ -836,12 +836,14 @@ http_handler_play(raop_conn_t *conn, http_request_t *request, http_response_t *r
char **response_data, int *response_datalen) {
char* playback_location = NULL;
+ char* client_proc_name = NULL;
plist_t req_root_node = NULL;
float start_position_seconds = 0.0f;
bool data_is_binary_plist = false;
bool data_is_text = false;
bool data_is_octet = false;
-
+ char supported_hls_proc_names[] = "YouTube;";
+
logger_log(conn->raop->logger, LOGGER_DEBUG, "http_handler_play");
const char* session_id = http_request_get_header(request, "X-Apple-Session-ID");
@@ -902,6 +904,17 @@ http_handler_play(raop_conn_t *conn, http_request_t *request, http_response_t *r
plist_get_string_val(req_content_location_node, &playback_location);
}
+ plist_t req_client_proc_name_node = plist_dict_get_item(req_root_node, "clientProcName");
+ if (!req_client_proc_name_node) {
+ goto play_error;
+ } else {
+ plist_get_string_val(req_client_proc_name_node, &client_proc_name);
+ if (!strstr(supported_hls_proc_names, client_proc_name)){
+ logger_log(conn->raop->logger, LOGGER_WARNING, "Unsupported HLS streaming format: clientProcName %s not found in supported list: %s",
+ client_proc_name, supported_hls_proc_names);
+ }
+ }
+
plist_t req_start_position_seconds_node = plist_dict_get_item(req_root_node, "Start-Position-Seconds");
if (!req_start_position_seconds_node) {
logger_log(conn->raop->logger, LOGGER_INFO, "No Start-Position-Seconds in Play request");
@@ -914,6 +927,10 @@ http_handler_play(raop_conn_t *conn, http_request_t *request, http_response_t *r
}
char *ptr = strstr(playback_location, "/master.m3u8");
+ if (!ptr) {
+ logger_log(conn->raop->logger, LOGGER_ERR, "Content-Location has unsupported form:\n%s\n", playback_location);
+ goto play_error;
+ }
int prefix_len = (int) (ptr - playback_location);
set_uri_prefix(conn->raop->airplay_video, playback_location, prefix_len);
set_next_media_uri_id(conn->raop->airplay_video, 0);
@@ -932,8 +949,10 @@ http_handler_play(raop_conn_t *conn, http_request_t *request, http_response_t *r
if (req_root_node) {
plist_free(req_root_node);
}
- logger_log(conn->raop->logger, LOGGER_ERR, "Could not find valid Plist Data for /play, Unhandled");
+ logger_log(conn->raop->logger, LOGGER_ERR, "Could not find valid Plist Data for POST/play request, Unhandled");
http_response_init(response, "HTTP/1.1", 400, "Bad Request");
+ http_response_set_disconnect(response, 1);
+ conn->raop->callbacks.conn_reset(conn->raop->callbacks.cls, 2);
}
/* the HLS handler handles http requests GET /[uri] on the HLS channel from the media player to the Server, asking for
diff --git a/lib/raop.h b/lib/raop.h
index 21ce747..54440da 100644
--- a/lib/raop.h
+++ b/lib/raop.h
@@ -68,11 +68,13 @@ struct raop_callbacks_s {
void (*video_pause)(void *cls);
void (*video_resume)(void *cls);
void (*conn_feedback) (void *cls);
-
- /* Optional but recommended callback functions */
+ void (*conn_reset) (void *cls, int reason);
+ void (*video_reset) (void *cls);
+
+
+ /* Optional but recommended callback functions (probably not optional, check this)*/
void (*conn_init)(void *cls);
void (*conn_destroy)(void *cls);
- void (*conn_reset) (void *cls);
void (*conn_teardown)(void *cls, bool *teardown_96, bool *teardown_110 );
void (*audio_flush)(void *cls);
void (*video_flush)(void *cls);
@@ -88,7 +90,6 @@ struct raop_callbacks_s {
void (*register_client) (void *cls, const char *device_id, const char *pk_str, const char *name);
bool (*check_register) (void *cls, const char *pk_str);
void (*export_dacp) (void *cls, const char *active_remote, const char *dacp_id);
- void (*video_reset) (void *cls);
void (*video_set_codec)(void *cls, video_codec_t codec);
/* for HLS video player controls */
void (*on_video_play) (void *cls, const char *location, const float start_position);
diff --git a/lib/raop_rtp_mirror.c b/lib/raop_rtp_mirror.c
index 6eb7bd3..bab4180 100644
--- a/lib/raop_rtp_mirror.c
+++ b/lib/raop_rtp_mirror.c
@@ -811,7 +811,7 @@ raop_rtp_mirror_thread(void *arg)
logger_log(raop_rtp_mirror->logger, LOGGER_DEBUG, "raop_rtp_mirror exiting TCP thread");
if (conn_reset&& raop_rtp_mirror->callbacks.conn_reset) {
- raop_rtp_mirror->callbacks.conn_reset(raop_rtp_mirror->callbacks.cls);
+ raop_rtp_mirror->callbacks.conn_reset(raop_rtp_mirror->callbacks.cls, 1);
}
if (unsupported_codec) {
diff --git a/uxplay.cpp b/uxplay.cpp
index cb0a23b..3d45fd9 100644
--- a/uxplay.cpp
+++ b/uxplay.cpp
@@ -1630,8 +1630,18 @@ extern "C" void conn_feedback (void *cls) {
missed_feedback = 0;
}
-extern "C" void conn_reset (void *cls) {
- LOGI("***ERROR lost connection with client (network problem?)");
+extern "C" void conn_reset (void *cls, int reason) {
+ switch (reason) {
+ case 1:
+ LOGI("*** ERROR lost connection with client (network problem?)");
+ break;
+ case 2:
+ LOGI("*** ERROR Unsupported HLS streaming source: (exit attempt to stream)");
+ break;
+ default:
+ break;
+ }
+
if (!nofreeze) {
close_window = false; /* leave "frozen" window open */
}