diff --git a/python/mk_plugin.py b/python/mk_plugin.py index d18a0b54..9d43da58 100644 --- a/python/mk_plugin.py +++ b/python/mk_plugin.py @@ -98,9 +98,14 @@ def on_player_proxy_failed(url, media_tuple, ex) -> bool: def on_get_rtsp_realm(args: dict, invoker, sender) -> bool: mk_logger.log_info(f"on_get_rtsp_realm, args: {args}, sender: {sender}") mk_loader.rtsp_get_realm_invoker_do(invoker, "zlmediakit") - # 该事件在c++中也处理下 + # 返回True代表此事件被python拦截 return True +def on_rtsp_auth(args: dict, realm: str, user_name: str, must_no_encrypt: bool, invoker, sender:dict) -> bool: + mk_logger.log_info(f"on_rtsp_auth, args: {args}, realm: {realm}, user_name: {user_name}, must_no_encrypt: {must_no_encrypt}, sender: {sender}") + mk_loader.rtsp_auth_invoker_do(invoker, False, "zlmediakit") + # 返回True代表此事件被python拦截 + return True def on_reload_config(): mk_logger.log_info(f"on_reload_config") \ No newline at end of file diff --git a/server/WebHook.cpp b/server/WebHook.cpp index 9980603a..e8cb1c54 100755 --- a/server/WebHook.cpp +++ b/server/WebHook.cpp @@ -476,6 +476,11 @@ void installWebHook() { // 监听kBroadcastOnRtspAuth事件返回正确的rtsp鉴权用户密码 [AUTO-TRANSLATED:bcf1754e] // Listen to the kBroadcastOnRtspAuth event to return the correct rtsp authentication username and password NoticeCenter::Instance().addListener(&web_hook_tag, Broadcast::kBroadcastOnRtspAuth, [](BroadcastOnRtspAuthArgs) { +#if defined(ENABLE_PYTHON) + if (PythonInvoker::Instance().on_rtsp_auth(args, realm, user_name, must_no_encrypt, invoker, sender)) { + return; + } +#endif GET_CONFIG(string, hook_rtsp_auth, Hook::kOnRtspAuth); if (unAuthedRealm == realm || !hook_enable || hook_rtsp_auth.empty()) { // 认证失败 [AUTO-TRANSLATED:70cf56ff] diff --git a/server/pyinvoker.cpp b/server/pyinvoker.cpp index 7abbc8db..3b198be5 100644 --- a/server/pyinvoker.cpp +++ b/server/pyinvoker.cpp @@ -217,6 +217,13 @@ PYBIND11_EMBEDDED_MODULE(mk_loader, m) { invoker(realm); }); + m.def("rtsp_auth_invoker_do", [](const py::capsule &cap, bool encrypted, const std::string &pwd_or_md5) { + // 执行c++代码时释放gil锁 + py::gil_scoped_release release; + auto &invoker = to_native(cap); + invoker(encrypted, pwd_or_md5); + }); + m.def("set_fastapi", [](const py::object &check_route, const py::object &submit_coro) { static void *fastapi_tag = nullptr; NoticeCenter::Instance().delListener(&fastapi_tag, Broadcast::kBroadcastHttpRequest); @@ -338,6 +345,7 @@ PythonInvoker::~PythonInvoker() { _on_media_changed = py::function(); _on_player_proxy_failed = py::function(); _on_get_rtsp_realm = py::function(); + _on_rtsp_auth = py::function(); _module = py::module(); } delete _rel; @@ -361,6 +369,7 @@ void PythonInvoker::load(const std::string &module_name) { GET_FUNC(_module, on_media_changed); GET_FUNC(_module, on_player_proxy_failed); GET_FUNC(_module, on_get_rtsp_realm); + GET_FUNC(_module, on_rtsp_auth); if (hasattr(_module, "on_start")) { py::object on_start = _module.attr("on_start"); @@ -421,6 +430,14 @@ bool PythonInvoker::on_get_rtsp_realm(BroadcastOnGetRtspRealmArgs) const { return _on_get_rtsp_realm(to_python(args), to_python(invoker), to_python(sender)).cast(); } +bool PythonInvoker::on_rtsp_auth(BroadcastOnRtspAuthArgs) const { + py::gil_scoped_acquire gil; // 确保在 Python 调用期间持有 GIL + if (!_on_rtsp_auth) { + return false; + } + return _on_rtsp_auth(to_python(args), realm, user_name, must_no_encrypt, to_python(invoker), to_python(sender)).cast(); +} + } // namespace mediakit #endif diff --git a/server/pyinvoker.h b/server/pyinvoker.h index 37b1546f..cf603ba1 100644 --- a/server/pyinvoker.h +++ b/server/pyinvoker.h @@ -32,6 +32,7 @@ public: bool on_media_changed(BroadcastMediaChangedArgs) const; bool on_player_proxy_failed(BroadcastPlayerProxyFailedArgs) const; bool on_get_rtsp_realm(BroadcastOnGetRtspRealmArgs) const; + bool on_rtsp_auth(BroadcastOnRtspAuthArgs) const; private: PythonInvoker(); @@ -58,6 +59,9 @@ private: py::function _on_player_proxy_failed; // rtsp播放是否开启专属鉴权 py::function _on_get_rtsp_realm; + // rtsp播放或推流鉴权回调 + py::function _on_rtsp_auth; + };