diff --git a/docs/src/configuration/source.md b/docs/src/configuration/source.md index 0a3ed1dbc..80ba3ce61 100644 --- a/docs/src/configuration/source.md +++ b/docs/src/configuration/source.md @@ -232,6 +232,18 @@ headers: X-Custom-Auth: "my-secret-token" ``` +> **Note:** Some Flussonic providers select the catch-up format by `User-Agent`. With a VLC User-Agent (for example +> `VLC/3.0.21 LibVLC/3.0.21`), they return separate fMP4 video and audio renditions whose initialization objects +> (`.hls.fmp4`) fail with `403 Forbidden`, while the playlists still return `200`. The ffmpeg default User-Agent +> (`Lavf/…`) receives a combined MPEG-TS rendition that plays. If catch-up stops at the fMP4 initialization +> object, set a non-VLC `User-Agent` for this input. Then check that live and VOD playback still work, because +> some providers require a specific User-Agent. +> +> A per-channel `#EXTVLCOPT:http-user-agent` directive in the provider playlist overrides the input `User-Agent` +> on catch-up HLS requests. If a channel sets this directive to a VLC User-Agent, the input header has no effect +> for that channel. Change the directive to a non-VLC User-Agent as well, for example in a local copy of the +> playlist. + --- ### 2.2 Input Options (`options`) diff --git a/frontend/src/app/components/source_editor/editor_view.rs b/frontend/src/app/components/source_editor/editor_view.rs index a10f61148..3e9810864 100644 --- a/frontend/src/app/components/source_editor/editor_view.rs +++ b/frontend/src/app/components/source_editor/editor_view.rs @@ -1763,7 +1763,10 @@ pub fn SourceEditor(props: &SourceEditorProps) -> Html { } } - if let Some(move_it) = compute_drag_move_params(&editor_state_ref.borrow(), mouse_x, mouse_y) { + // Bind first: an if-let scrutinee temporary would keep the borrow alive + // across move_blocks.emit, which needs borrow_mut. + let move_params = compute_drag_move_params(&editor_state_ref.borrow(), mouse_x, mouse_y); + if let Some(move_it) = move_params { move_blocks.emit(move_it); // Drag updates are applied directly to DOM for smoothness. // Avoid full re-render on every mouse move while dragging blocks. @@ -1891,7 +1894,8 @@ pub fn SourceEditor(props: &SourceEditorProps) -> Html { let touch_x = client_x - rect.left() as f32; let touch_y = client_y - rect.top() as f32; - if let Some(move_it) = compute_drag_move_params(&editor_state_ref.borrow(), touch_x, touch_y) { + let move_params = compute_drag_move_params(&editor_state_ref.borrow(), touch_x, touch_y); + if let Some(move_it) = move_params { move_blocks.emit(move_it); } else { force_update.set(*force_update + 1);