From 2195da324eda7acbfb9ef571e35f04daf5ded818 Mon Sep 17 00:00:00 2001 From: euzu Date: Tue, 11 Feb 2025 19:20:51 +0100 Subject: [PATCH] Added Channel Unavailable Stream config. Refactored streaming. --- .gitignore | 1 + CHANGELOG.md | 8 ++- README.md | 15 +++++ bin/build_github_docker.sh | 9 +++ bin/build_github_docker_aarch64.sh | 9 +++ bin/build_github_docker_beta.sh | 9 ++- bin/build_resources.sh | 14 +++++ config/config.yml | 1 + docker/Dockerfile | 2 + docker/Dockerfile-manual | 2 + resources/freeze_frame.jpg | Bin 0 -> 369616 bytes src/api/api_utils.rs | 21 +++---- src/api/model/active_user_manager.rs | 2 + src/api/model/streams/active_client_stream.rs | 13 +--- src/api/model/streams/buffered_stream.rs | 59 ++++++++++-------- src/api/model/streams/client_stream.rs | 6 +- src/api/model/streams/freeze_frame_stream.rs | 57 +++++++++++++++++ src/api/model/streams/mod.rs | 3 +- src/api/model/streams/persist_pipe_stream.rs | 2 +- src/api/model/streams/provider_stream.rs | 27 ++++---- .../model/streams/provider_stream_factory.rs | 47 +++++++++----- .../model/streams/shared_stream_manager.rs | 50 +++++++-------- src/model/config.rs | 34 +++++----- src/tools/atomic_once_flag.rs | 17 ++--- src/utils/file/file_utils.rs | 40 ++++++++++-- 25 files changed, 311 insertions(+), 137 deletions(-) create mode 100755 bin/build_resources.sh create mode 100644 resources/freeze_frame.jpg create mode 100644 src/api/model/streams/freeze_frame_stream.rs diff --git a/.gitignore b/.gitignore index eef4fafd0..c0d5e4892 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +/resources/*.ts /release /target /frontend/build diff --git a/CHANGELOG.md b/CHANGELOG.md index a10cf2e68..0cff6e7a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ # Changelog -# 2.1.4 (2025-01-xx) +# 2.2.0 (2025-02-11) - !BREAKING CHANGE! unique `input` `name` is now mandatory, because rearranging the `source.yml` could lead to wrong results without a playlist update. - !BREAKING_CHANGE! `log_sanitize_sensitive_info` is now under `log` section as `sanitize_sensitive_info` - !BREAKING_CHANGE! uuid generation for entries changed to `input.name` + `stream_id`. Virtual id mapping changed. The new Virtual id is not a sequence anymore. @@ -46,6 +46,12 @@ web_ui_enabled: true - added optional user properties: `max_connections`, `status`, `exp_date` (expiration date as unix seconds). If they exist they are checked when `config.yml` `user_access_control` set to true., if you don't need them remove this fields from `api-proxy.yml` Added option in `config.yml` the option `user_access_control` to activate the checks. Default is false. +- Added option `channel_unavailable_file` in `config.yml`. If a provider stream is not available this file content is send instead. +```yaml +update_on_boot: false +web_ui_enabled: true +channel_unavailable_file: /freeze_frame.ts +``` # 2.1.3 (2025-01-26) - Hotfix 2.1.2, forgot to update the stream api code. diff --git a/README.md b/README.md index ab8b1ccca..d85de662c 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,7 @@ Top level entries in the config files are: * `reverse_proxy` _optional_ * `log` _optional * `user_access_control` _optional_ +* `channel_unavailable_file` _optional_ ### 1.1. `threads` If you are running on a cpu which has multiple cores, you can set for example `threads: 2` to run two threads. @@ -307,6 +308,20 @@ If you set it to `true`, the attributes (if available) are checked to permit or deny access. +### 1.12 `channel_unavailable_file` +If you want to send a `Unavailable Channel` picture instead of black screen when a channel is not available. +A video file with name `freeze_frame.ts` is already available in the docker image. + +You can convert an image with `ffmpeg`. + +`ffmpeg -loop 1 -framerate 1 -i freeze_frame.jpg -t 1 -c:v mpeg2video -f mpegts freeze_frame.ts` + +and add it to the `config.yml`. + +```yaml +channel_unavailable_file: /freeze_frame.ts +``` + ## 2. `source.yml` Has the following top level entries: diff --git a/bin/build_github_docker.sh b/bin/build_github_docker.sh index d321d1715..111b00003 100755 --- a/bin/build_github_docker.sh +++ b/bin/build_github_docker.sh @@ -3,6 +3,8 @@ set -euo pipefail source "${HOME}/.ghcr.io" WORKING_DIR=$(pwd) +BIN_DIR="${WORKING_DIR}/bin" +RESOURCES_DIR="${WORKING_DIR}/resources" DOCKER_DIR="${WORKING_DIR}/docker" FRONTEND_DIR="${WORKING_DIR}/frontend" TARGET=x86_64-unknown-linux-musl @@ -10,6 +12,11 @@ TARGET=x86_64-unknown-linux-musl cd "$FRONTEND_DIR" && rm -rf build && yarn && yarn build cd "$WORKING_DIR" +if [ ! -f "${BIN_DIR}/build_resources.sh" ]; then + "${BIN_DIR}/build_resources.sh" +fi + + # Check if the frontend build directory exists if [ ! -d "$FRONTEND_DIR/build" ]; then echo "Error: Web directory '$FRONTEND_DIR/build' does not exist." @@ -30,6 +37,7 @@ BIN_FILE=${WORKING_DIR}/target/${TARGET}/release/m3u-filter cp "${WORKING_DIR}/target/${TARGET}/release/m3u-filter" "${DOCKER_DIR}/" rm -rf "${DOCKER_DIR}/web" cp -r "${FRONTEND_DIR}/build" "${DOCKER_DIR}/web" +cp -r "${RESOURCES_DIR}/freeze_frame.ts" "${DOCKER_DIR}/" # Get the version from the binary VERSION=$("$BIN_FILE" -V | sed 's/m3u-filter *//') @@ -66,5 +74,6 @@ docker push ghcr.io/euzu/${ALPINE_IMAGE_NAME}:latest echo "Cleaning up build artifacts..." rm -rf "${DOCKER_DIR}/web" rm -f "${DOCKER_DIR}/m3u-filter" +rm -f "${DOCKER_DIR}/freeze_frame.ts" echo "Docker images for version ${VERSION} have been successfully built, tagged, and pushed." diff --git a/bin/build_github_docker_aarch64.sh b/bin/build_github_docker_aarch64.sh index e0cb876c6..ebef40283 100755 --- a/bin/build_github_docker_aarch64.sh +++ b/bin/build_github_docker_aarch64.sh @@ -3,6 +3,8 @@ set -euo pipefail source "${HOME}/.ghcr.io" WORKING_DIR=$(pwd) +BIN_DIR="${WORKING_DIR}/bin" +RESOURCES_DIR="${WORKING_DIR}/resources" DOCKER_DIR="${WORKING_DIR}/docker" FRONTEND_DIR="${WORKING_DIR}/frontend" TARGET=aarch64-unknown-linux-musl @@ -12,6 +14,11 @@ if [ -z "${VERSION}" ]; then exit 1 fi +if [ ! -f "${BIN_DIR}/build_resources.sh" ]; then + "${BIN_DIR}/build_resources.sh" +fi + + cd "$FRONTEND_DIR" && rm -rf build && yarn && yarn build cd "$WORKING_DIR" @@ -35,6 +42,7 @@ fi cp "${WORKING_DIR}/target/${TARGET}/release/m3u-filter" "${DOCKER_DIR}/" rm -rf "${DOCKER_DIR}/web" cp -r "${WORKING_DIR}/frontend/build" "${DOCKER_DIR}/web" +cp -r "${RESOURCES_DIR}/freeze_frame.ts" "${DOCKER_DIR}/" # Get the version from the binary # VERSION=$(./m3u-filter -V | sed 's/m3u-filter *//') @@ -58,5 +66,6 @@ docker push ghcr.io/euzu/${SCRATCH_IMAGE_NAME}:latest echo "Cleaning up build artifacts..." rm -rf "${DOCKER_DIR}/web" rm -f "${DOCKER_DIR}/m3u-filter" +rm -f "${DOCKER_DIR}/freeze_frame.ts" echo "Docker images ghcr.io/euzu/${SCRATCH_IMAGE_NAME}${VERSION} have been successfully built, tagged, and pushed." diff --git a/bin/build_github_docker_beta.sh b/bin/build_github_docker_beta.sh index 4373b094b..a17f2b879 100755 --- a/bin/build_github_docker_beta.sh +++ b/bin/build_github_docker_beta.sh @@ -5,7 +5,7 @@ source "${HOME}/.ghcr.io" TARGET=x86_64-unknown-linux-musl -(bin/build_fe.sh && bin/build_lin_static.sh) || exit 1; +(bin/build_fe.sh && bin/build_lin_static.sh && bin/build_resources.sh ) || exit 1; # Check if the binary exists if [ ! -f "./target/${TARGET}/release/m3u-filter" ]; then @@ -19,11 +19,17 @@ if [ ! -d "./frontend/build" ]; then exit 1 fi +if [ ! -f "./resources/freeze_frame.ts" ]; then + echo "Error: ./resources/freeze_frame.ts does not exist." + exit 1 +fi + # Prepare Docker build context cd ./docker cp "../target/${TARGET}/release/m3u-filter" . rm -rf ./web cp -r ../frontend/build ./web +cp -r ../resources/freeze_frame.ts . # Get the version from the binary VERSION=$(./m3u-filter -V | sed 's/m3u-filter *//') @@ -58,5 +64,6 @@ docker push ghcr.io/euzu/m3u-filter-beta:latest echo "Cleaning up build artifacts..." rm -rf ./web rm -f ./m3u-filter +rm -f ./freeze_frame.ts echo "Docker images for version ${VERSION} have been successfully built, tagged, and pushed." diff --git a/bin/build_resources.sh b/bin/build_resources.sh new file mode 100755 index 000000000..493ab8985 --- /dev/null +++ b/bin/build_resources.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +if [ -e ./resources/freeze_frame.ts ]; then + echo "Resource exists, skipping creation" + exit; +fi + + +if which ffmpeg > /dev/null 2>&1; then + ffmpeg -loop 1 -framerate 1 -i ./resources/freeze_frame.jpg -t 1 -c:v mpeg2video -f mpegts ./resources/freeze_frame.ts +else + echo "ffmpeg not found"; + exit; +fi diff --git a/config/config.yml b/config/config.yml index cb953a004..1a9a2dff0 100644 --- a/config/config.yml +++ b/config/config.yml @@ -3,6 +3,7 @@ threads: 0 working_dir: /home/m3u-filter/data backup_dir: /home/m3u-filter/.backup update_on_boot: false +channel_unavailable_file: /home/m3u-filter/freeze_frame.ts # sec min hour day of month month day of week year schedules: - schedule: "0 0 8,12,16,20,22,1 * * * *" diff --git a/docker/Dockerfile b/docker/Dockerfile index e3032e70a..3322f9a5c 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -39,6 +39,7 @@ COPY --from=rust-build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ COPY --from=rust-build /src/target/x86_64-unknown-linux-musl/release/m3u-filter /m3u-filter COPY --from=node-build /app/build /web +COPY ./freeze_frame.ts /freeze_frame.ts # config should be mounted as volume # COPY ./config /config @@ -54,6 +55,7 @@ WORKDIR /app COPY --from=rust-build /src/target/x86_64-unknown-linux-musl/release/m3u-filter m3u-filter COPY --from=node-build /app/build web +COPY ./freeze_frame.ts /freeze_frame.ts # config should be mounted as volume # COPY ./config config diff --git a/docker/Dockerfile-manual b/docker/Dockerfile-manual index 92b0f322b..a4730964e 100644 --- a/docker/Dockerfile-manual +++ b/docker/Dockerfile-manual @@ -9,6 +9,7 @@ COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ COPY ./m3u-filter / COPY ./web /web +COPY ./freeze_frame.ts ./freeze_frame.ts CMD ["./m3u-filter", "-s", "-p", "/config"] @@ -21,6 +22,7 @@ WORKDIR /app COPY ./m3u-filter . COPY ./web ./web +COPY ./freeze_frame.ts ./freeze_frame.ts # config should be mounted as volume # COPY ./config ./config diff --git a/resources/freeze_frame.jpg b/resources/freeze_frame.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c79ae5bba489fcf588f20b0bec2cb3d943e8b651 GIT binary patch literal 369616 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%0DWbI+(Qa$roT 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 Z2{D={ygfpRDn0z!!@-!;@h@C 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

G%~Sp6e%Ev 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 OL}U00C=ToY-vj{AGijIr literal 0 HcmV?d00001 diff --git a/src/api/api_utils.rs b/src/api/api_utils.rs index 6e46d5faf..2655e63a9 100644 --- a/src/api/api_utils.rs +++ b/src/api/api_utils.rs @@ -2,7 +2,6 @@ use crate::api::model::app_state::AppState; use crate::api::model::model_utils::get_stream_response_with_headers; use crate::api::model::streams::persist_pipe_stream::PersistPipeStream; use crate::api::model::streams::provider_stream; -use crate::api::model::streams::provider_stream::get_provider_pipe_stream; use crate::api::model::streams::provider_stream_factory::BufferStreamOptions; use crate::api::model::request::UserApiRequest; use crate::api::model::stream_error::StreamError; @@ -10,7 +9,7 @@ use crate::utils::{debug_if_enabled, trace_if_enabled}; use crate::model::api_proxy::ProxyUserCredentials; use crate::model::config::{ConfigInput, ConfigTarget}; use crate::model::playlist::PlaylistItemType; -use crate::utils::file::file_utils::create_new_file_for_write; +use crate::utils::file::file_utils::{create_new_file_for_write}; use crate::tools::lru_cache::LRUResourceCache; use crate::utils::network::request; use crate::utils::network::request::sanitize_sensitive_info; @@ -23,6 +22,7 @@ use futures::TryStreamExt; use log::{error, log_enabled, trace}; use reqwest::StatusCode; use std::collections::HashMap; +use std::io::BufWriter; use std::path::Path; use std::sync::Arc; use url::Url; @@ -103,7 +103,7 @@ pub async fn get_user_target<'a>(api_req: &'a UserApiRequest, app_state: &'a App get_user_target_by_credentials(username, password, api_req, app_state).await } -fn get_stream_options(app_state: &AppState) -> (bool, bool, usize, bool, bool) { +fn get_stream_options(app_state: &AppState) -> (bool, bool, usize, bool) { let (stream_retry, buffer_enabled, buffer_size) = app_state .config .reverse_proxy @@ -117,8 +117,7 @@ fn get_stream_options(app_state: &AppState) -> (bool, bool, usize, bool, bool) { (stream.retry, buffer_enabled, buffer_size) }); let pipe_provider_stream = !stream_retry && !buffer_enabled; - let shared_stream_use_own_buffer = !buffer_enabled || pipe_provider_stream; - (stream_retry, buffer_enabled, buffer_size, pipe_provider_stream, shared_stream_use_own_buffer) + (stream_retry, buffer_enabled, buffer_size, pipe_provider_stream) } fn get_stream_content_length(provider_response: Option<&(Vec<(String, String)>, StatusCode)>) -> u64 { @@ -144,23 +143,23 @@ pub async fn stream_response(app_state: &AppState, stream_url: &str, } } - let (stream_retry, buffer_enabled, buffer_size, direct_pipe_provider_stream, shared_stream_use_own_buffer) = + let (stream_retry, buffer_enabled, buffer_size, direct_pipe_provider_stream) = get_stream_options(app_state); if let Ok(url) = Url::parse(stream_url) { let active_clients = Arc::clone(&app_state.active_users); let (stream_opt, provider_response) = if direct_pipe_provider_stream { - get_provider_pipe_stream(&app_state.http_client, &url, req, input, item_type).await + provider_stream::get_provider_pipe_stream(&app_state.config, &app_state.http_client, &url, req, input, item_type).await } else { - let buffer_stream_options = BufferStreamOptions::new(item_type, stream_retry, buffer_enabled, buffer_size); - provider_stream::get_provider_reconnect_buffered_stream(&app_state.http_client, &url, req, input, buffer_stream_options).await + let buffer_stream_options = BufferStreamOptions::new(item_type, stream_retry, buffer_enabled, buffer_size, share_stream); + provider_stream::get_provider_reconnect_buffered_stream(&app_state.config, &app_state.http_client, &url, req, input, buffer_stream_options).await }; if let Some(stream) = stream_opt { let content_length = get_stream_content_length(provider_response.as_ref()); let stream = ActiveClientStream::new(stream, active_clients, user, log_active_clients); let stream_resp = if share_stream { let shared_headers = provider_response.as_ref().map_or_else(Vec::new, |(h, _)| h.clone()); - SharedStreamManager::subscribe(app_state, stream_url, stream, shared_stream_use_own_buffer, shared_headers); + SharedStreamManager::subscribe(app_state, stream_url, stream, shared_headers, buffer_size); if let Some(broadcast_stream) = SharedStreamManager::subscribe_shared_stream(app_state, stream_url) { let mut response_builder = get_stream_response_with_headers(provider_response, stream_url); if content_length > 0 { @@ -261,7 +260,7 @@ pub async fn resource_response(app_state: &AppState, resource_url: &str, req: &H cache.lock().store_path(resource_url) }; if let Ok(file) = create_new_file_for_write(&resource_path) { - let writer = Arc::new(file); + let writer = BufWriter::new(file); let add_cache_content = get_add_cache_content(resource_url, &app_state.cache); let stream = PersistPipeStream::new(byte_stream, writer, add_cache_content); return response_builder.body(BodyStream::new(stream)); diff --git a/src/api/model/active_user_manager.rs b/src/api/model/active_user_manager.rs index ba41702a3..c8b4cd91a 100644 --- a/src/api/model/active_user_manager.rs +++ b/src/api/model/active_user_manager.rs @@ -42,6 +42,7 @@ impl ActiveUserManager { } else { lock.insert(username.to_string(), AtomicU32::new(1)); } + drop(lock); } (self.active_users(), self.active_connections()) } @@ -54,6 +55,7 @@ impl ActiveUserManager { lock.remove(username); } } + drop(lock); } (self.active_users(), self.active_connections()) } diff --git a/src/api/model/streams/active_client_stream.rs b/src/api/model/streams/active_client_stream.rs index c7ffbff46..b75227318 100644 --- a/src/api/model/streams/active_client_stream.rs +++ b/src/api/model/streams/active_client_stream.rs @@ -18,9 +18,7 @@ pub(in crate::api) struct ActiveClientStream { impl ActiveClientStream { pub(crate) fn new(inner: ResponseStream, active_clients: Arc, user: &ProxyUserCredentials, log_active_clients: bool) -> Self { - let (client_count, connection_count) = { - active_clients.add_connection(&user.username) - }; + let (client_count, connection_count) = active_clients.add_connection(&user.username); if log_active_clients { info!("Active clients: {client_count}, active connections {connection_count}"); } @@ -30,10 +28,7 @@ impl ActiveClientStream { impl Stream for ActiveClientStream { type Item = Result; - fn poll_next( - mut self: Pin<&mut Self>, - cx: &mut std::task::Context<'_>, - ) -> Poll> { + fn poll_next(mut self: Pin<&mut Self>,cx: &mut std::task::Context<'_>,) -> Poll> { Pin::as_mut(&mut self.inner).poll_next(cx) } } @@ -41,9 +36,7 @@ impl Stream for ActiveClientStream { impl Drop for ActiveClientStream { fn drop(&mut self) { - let (client_count, connection_count) = { - self.active_clients.remove_connection(&self.username) - }; + let (client_count, connection_count) = self.active_clients.remove_connection(&self.username); if self.log_active_clients { info!("Active clients: {client_count}, active connections {connection_count}"); } diff --git a/src/api/model/streams/buffered_stream.rs b/src/api/model/streams/buffered_stream.rs index 7c358a16b..2bc98aad7 100644 --- a/src/api/model/streams/buffered_stream.rs +++ b/src/api/model/streams/buffered_stream.rs @@ -4,8 +4,7 @@ use std::{ pin::Pin, sync::Arc, }; -use std::time::Duration; -use tokio::sync::mpsc::channel; +use tokio::sync::mpsc::{channel, Sender}; use tokio_stream::wrappers::ReceiverStream; use crate::api::model::stream_error::StreamError; use crate::tools::atomic_once_flag::AtomicOnceFlag; @@ -17,33 +16,43 @@ pub(in crate::api::model) struct BufferedStream { impl BufferedStream { pub fn new(stream: ResponseStream, buffer_size: usize, client_close_signal: Arc, _url: &str) -> Self { let (tx, rx) = channel(buffer_size); - actix_rt::spawn(async move { - let mut stream = stream; - let sleep_duration= Duration::from_millis(100); - loop { - match stream.next().await { - Some(Ok(chunk)) => { - // this is for backpressure, we fill the buffer and wait for the receiver - if let Ok(permit) = tx.reserve().await { - permit.send(Ok(chunk)); - } else { - // receiver closed. + actix_rt::spawn(Self::buffer_stream(tx, stream, client_close_signal)); + Self { + stream: ReceiverStream::new(rx) + } + } + + async fn buffer_stream( + tx: Sender>, + mut stream: ResponseStream, + client_close_signal: Arc, + ) { + loop { + if !client_close_signal.is_active() { + break; + } + match stream.next().await { + Some(Ok(chunk)) => { + match tx.reserve().await { + Ok(permit) => permit.send(Ok(chunk)), + Err(_err) => { + // Receiver dropped, notify and exit client_close_signal.notify(); break; } } - Some(Err(_err)) => { - actix_web::rt::time::sleep(sleep_duration).await; - } - None => { - break - } } + Some(Err(err)) => { + eprintln!("Buffered Stream Error: {err:?}"); + // actix_web::rt::time::sleep(sleep_duration).await; + // Attempt to send error to client + if tx.send(Err(err)).await.is_err() { + client_close_signal.notify(); + } + break; + } + None => break, } - }); - - Self { - stream: ReceiverStream::new(rx) } } } @@ -51,7 +60,7 @@ impl BufferedStream { impl Stream for BufferedStream { type Item = Result; - fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - self.stream.poll_next_unpin(cx) + fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + Pin::new(&mut self.get_mut().stream).poll_next(cx) } } diff --git a/src/api/model/streams/client_stream.rs b/src/api/model/streams/client_stream.rs index 4a80b912d..eb8bc6ef4 100644 --- a/src/api/model/streams/client_stream.rs +++ b/src/api/model/streams/client_stream.rs @@ -35,6 +35,7 @@ impl Stream for ClientStream { match Pin::as_mut(&mut self.inner).poll_next(cx) { Poll::Ready(Some(Ok(bytes))) => { if bytes.is_empty() { + eprintln!("client stream empty bytes"); continue; } @@ -48,7 +49,10 @@ impl Stream for ClientStream { self.close_signal.notify(); return Poll::Ready(None); } - other => return other, + Poll::Pending => return Poll::Pending, + Poll::Ready(Some(Err(err))) => { + eprintln!("client stream error: {err}"); + } } } } diff --git a/src/api/model/streams/freeze_frame_stream.rs b/src/api/model/streams/freeze_frame_stream.rs new file mode 100644 index 000000000..2e09ca857 --- /dev/null +++ b/src/api/model/streams/freeze_frame_stream.rs @@ -0,0 +1,57 @@ +use crate::api::model::stream_error::StreamError; +use bytes::Bytes; +use futures::Stream; +use std::pin::Pin; +use std::sync::Arc; +use std::task::{Context, Poll}; + +const CHUNK_SIZE: usize = 8192; + + +pub struct FreezeFrameStream { + buffer: Arc>, + buffer_len: usize, + current_pos: usize, // Keep track of the current position in the buffer +} + +impl FreezeFrameStream { + pub fn new(_status: u16, buffer: Arc>) -> Self { + let buffer_len = buffer.len(); + Self { + buffer, + buffer_len, + current_pos: 0, + } + } +} + +impl Stream for FreezeFrameStream { + type Item = Result; + + fn poll_next( + mut self: Pin<&mut Self>, + _cx: &mut Context<'_>, + ) -> Poll> { + + if self.buffer_len == 0 { + return Poll::Ready(None); // If buffer is empty, return None (end of stream) + } + + // Calculate the start and end positions for the chunk + let start = self.current_pos; + let end = (self.current_pos + CHUNK_SIZE).min(self.buffer_len); + + // Create a chunk from the buffer + let chunk = self.buffer[start..end].to_vec(); + let bytes_chunk = Bytes::from(chunk); + + // Update the current position + self.current_pos = if end == self.buffer_len { + 0 // Wrap around if we reach the end + } else { + end + }; + + Poll::Ready(Some(Ok(bytes_chunk))) + } +} diff --git a/src/api/model/streams/mod.rs b/src/api/model/streams/mod.rs index 42f8c712e..e290ed13d 100644 --- a/src/api/model/streams/mod.rs +++ b/src/api/model/streams/mod.rs @@ -4,4 +4,5 @@ pub(in crate::api) mod provider_stream_factory; pub(in crate::api) mod shared_stream_manager; pub(in crate::api) mod active_client_stream; mod buffered_stream; -mod client_stream; \ No newline at end of file +mod client_stream; +mod freeze_frame_stream; \ No newline at end of file diff --git a/src/api/model/streams/persist_pipe_stream.rs b/src/api/model/streams/persist_pipe_stream.rs index bba910a95..525c1b9a7 100644 --- a/src/api/model/streams/persist_pipe_stream.rs +++ b/src/api/model/streams/persist_pipe_stream.rs @@ -91,4 +91,4 @@ where } } } -} \ No newline at end of file +} diff --git a/src/api/model/streams/provider_stream.rs b/src/api/model/streams/provider_stream.rs index b6eb9889a..d9be0b370 100644 --- a/src/api/model/streams/provider_stream.rs +++ b/src/api/model/streams/provider_stream.rs @@ -1,19 +1,20 @@ use crate::api::api_utils::{get_headers_from_request, HeaderFilter}; +use crate::api::model::model_utils::get_response_headers; +use crate::api::model::stream_error::StreamError; +use crate::api::model::streams::freeze_frame_stream::FreezeFrameStream; use crate::api::model::streams::provider_stream_factory::{create_provider_stream, BufferStreamOptions}; -use crate::model::config::ConfigInput; +use crate::model::config::{Config, ConfigInput}; +use crate::model::playlist::PlaylistItemType; +use crate::utils::debug_if_enabled; use crate::utils::network::request::{get_request_headers, sanitize_sensitive_info}; -use actix_web::{HttpRequest}; +use actix_web::HttpRequest; use bytes::Bytes; use futures::stream::BoxStream; +use futures::TryStreamExt; use log::error; use reqwest::StatusCode; use std::sync::Arc; -use futures::TryStreamExt; use url::Url; -use crate::api::model::model_utils::get_response_headers; -use crate::api::model::stream_error::StreamError; -use crate::model::playlist::PlaylistItemType; -use crate::utils::debug_if_enabled; type ProviderStreamResponse = (Option>>, Option<(Vec<(String, String)>, StatusCode)>); @@ -27,7 +28,8 @@ pub fn get_header_filter_for_item_type(item_type: PlaylistItemType) -> HeaderFil } } -pub async fn get_provider_pipe_stream(http_client: &Arc, +pub async fn get_provider_pipe_stream(cfg: &Config, + http_client: &Arc, stream_url: &Url, req: &HttpRequest, input: Option<&ConfigInput>, @@ -46,7 +48,9 @@ pub async fn get_provider_pipe_stream(http_client: &Arc, let response_headers = get_response_headers(&mut response); let status = response.status(); if status.is_success() { - (Some(Box::pin(response.bytes_stream().map_err(|err|StreamError::reqwest(&err)))), Some((response_headers, status))) + (Some(Box::pin(response.bytes_stream().map_err(|err| StreamError::reqwest(&err)))), Some((response_headers, status))) + } else if let Some(freeze_frame) = cfg.t_channel_unavailable_file.as_ref() { + (Some(Box::pin(FreezeFrameStream::new(status.as_u16(), Arc::clone(freeze_frame)))), Some((response_headers, status))) } else { (None, Some((response_headers, status))) } @@ -59,12 +63,13 @@ pub async fn get_provider_pipe_stream(http_client: &Arc, } } -pub async fn get_provider_reconnect_buffered_stream(http_client: &Arc, +pub async fn get_provider_reconnect_buffered_stream(cfg: &Config, + http_client: &Arc, stream_url: &Url, req: &HttpRequest, input: Option<&ConfigInput>, options: BufferStreamOptions) -> ProviderStreamResponse { - match create_provider_stream(Arc::clone(http_client), stream_url, req, input, options).await { + match create_provider_stream(cfg, Arc::clone(http_client), stream_url, req, input, options).await { None => (None, None), Some((stream, info)) => { (Some(stream), info) diff --git a/src/api/model/streams/provider_stream_factory.rs b/src/api/model/streams/provider_stream_factory.rs index 31f8bd965..88649442d 100644 --- a/src/api/model/streams/provider_stream_factory.rs +++ b/src/api/model/streams/provider_stream_factory.rs @@ -1,12 +1,13 @@ use crate::api::api_utils::get_headers_from_request; -use crate::api::model::streams::buffered_stream::BufferedStream; -use crate::api::model::streams::client_stream::ClientStream; use crate::api::model::model_utils::get_response_headers; use crate::api::model::stream_error::StreamError; -use crate::utils::debug_if_enabled; -use crate::model::config::ConfigInput; +use crate::api::model::streams::buffered_stream::BufferedStream; +use crate::api::model::streams::client_stream::ClientStream; +use crate::api::model::streams::provider_stream::get_header_filter_for_item_type; +use crate::model::config::{Config, ConfigInput}; use crate::model::playlist::PlaylistItemType; use crate::tools::atomic_once_flag::AtomicOnceFlag; +use crate::utils::debug_if_enabled; use crate::utils::network::request::{classify_content_type, get_request_headers, sanitize_sensitive_info, MimeCategory}; use actix_web::HttpRequest; use bytes::Bytes; @@ -20,7 +21,7 @@ use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; use std::time::{Duration, Instant}; use url::Url; -use crate::api::model::streams::provider_stream::get_header_filter_for_item_type; +use crate::api::model::streams::freeze_frame_stream::FreezeFrameStream; // TODO make this configurable pub const STREAM_QUEUE_SIZE: usize = 1024; // mpsc channel holding messages. with 8092byte chunks and 2Mbit/s approx 8MB @@ -35,6 +36,7 @@ pub struct BufferStreamOptions { reconnect_enabled: bool, buffer_enabled: bool, buffer_size: usize, + share_stream: bool, } impl BufferStreamOptions { @@ -43,12 +45,14 @@ impl BufferStreamOptions { reconnect_enabled: bool, buffer_enabled: bool, buffer_size: usize, + share_stream: bool ) -> Self { Self { item_type, reconnect_enabled, buffer_enabled, buffer_size, + share_stream, } } @@ -57,6 +61,11 @@ impl BufferStreamOptions { self.buffer_enabled } + #[inline] + fn is_shared_stream(&self) -> bool { + self.share_stream + } + // #[inline] // fn get_buffer_size(&self) -> usize { // self.buffer_size @@ -193,7 +202,7 @@ fn prepare_client(request_client: &Arc, url: &Url, headers: &He } } -async fn provider_request(request_client: Arc, initial_info: bool, stream_options: &ProviderStreamOptions) -> Result, StatusCode> { +async fn provider_request(cfg: &Config, request_client: Arc, initial_info: bool, stream_options: &ProviderStreamOptions) -> Result, StatusCode> { let (client, _partial_content) = prepare_client(&request_client, stream_options.get_url(), stream_options.get_headers(), stream_options.get_total_bytes_send()); match client.send().await { Ok(mut response) => { @@ -214,6 +223,9 @@ async fn provider_request(request_client: Arc, initial_info: bo StreamError::reqwest(&err) }).boxed(), response_info))); } + if let Some(freeze_frame) = cfg.t_channel_unavailable_file.as_ref() { + return Ok(Some((FreezeFrameStream::new(status.as_u16(), Arc::clone(freeze_frame)).boxed(), None))) + } Err(status) } Err(_err) => { @@ -260,17 +272,17 @@ async fn stream_provider(client: Arc, stream_options: ProviderS } actix_web::rt::time::sleep(Duration::from_millis(100)).await; } - debug_if_enabled!("Stopped seconnecting stream {}", sanitize_sensitive_info(url.as_str())); + debug_if_enabled!("Stopped reconnecting stream {}", sanitize_sensitive_info(url.as_str())); None } const RETRY_SECONDS: u64 = 5; const ERR_MAX_RETRY_COUNT: u32 = 5; -async fn get_initial_stream(client: Arc, stream_options: &ProviderStreamOptions) -> Option { +async fn get_initial_stream(cfg: &Config, client: Arc, stream_options: &ProviderStreamOptions) -> Option { let start = Instant::now(); let mut connect_err: u32 = 1; while stream_options.should_continue() { - match provider_request(Arc::clone(&client), true, stream_options).await { + match provider_request(cfg, Arc::clone(&client), true, stream_options).await { Ok(Some(value)) => return Some(value), Ok(None) => { if connect_err > ERR_MAX_RETRY_COUNT { @@ -316,7 +328,8 @@ fn create_provider_stream_options(stream_url: &Url, } } -pub async fn create_provider_stream(client: Arc, +pub async fn create_provider_stream(cfg: &Config, + client: Arc, stream_url: &Url, req: &HttpRequest, input: Option<&ConfigInput>, @@ -324,7 +337,7 @@ pub async fn create_provider_stream(client: Arc, let stream_options = create_provider_stream_options(stream_url, req, input, &options); let client_stream_factory = |stream, reconnect_flag, range_cnt| { - let stream = if stream_options.is_buffered() { + let stream = if stream_options.is_buffered() && !options.is_shared_stream() { BufferedStream::new(stream, stream_options.get_buffer_size(), stream_options.get_continue_flag_clone(), stream_url.as_str()).boxed() } else { stream @@ -332,7 +345,7 @@ pub async fn create_provider_stream(client: Arc, ClientStream::new(stream, reconnect_flag, range_cnt, stream_options.get_url().as_str()).boxed() }; - match get_initial_stream(Arc::clone(&client), &stream_options).await { + match get_initial_stream(cfg, Arc::clone(&client), &stream_options).await { Some((init_stream, info)) => { let is_media_stream = if let Some((headers, _)) = &info { classify_content_type(headers) == MimeCategory::Video @@ -344,12 +357,18 @@ pub async fn create_provider_stream(client: Arc, if is_media_stream && stream_options.should_reconnect() { let client_signal = Arc::clone(&continue_signal); let stream_options_provider = stream_options.clone(); + let continue_streaming_signal = client_signal.clone(); let unfold: ResponseStream = stream::unfold((), move |()| { let client = Arc::clone(&client); let stream_opts = stream_options_provider.clone(); + let continue_streaming = continue_streaming_signal.clone(); async move { - let stream = stream_provider(client, stream_opts).await?; - Some((stream, ())) + if continue_streaming.is_active() { + let stream = stream_provider(client, stream_opts).await?; + Some((stream, ())) + } else { + None + } } }).flatten().boxed(); Some((client_stream_factory(init_stream.chain(unfold).boxed(), Arc::clone(&client_signal), stream_options.get_range_bytes_clone()).boxed(), info)) diff --git a/src/api/model/streams/shared_stream_manager.rs b/src/api/model/streams/shared_stream_manager.rs index 5234f0ae1..3f6dcae25 100644 --- a/src/api/model/streams/shared_stream_manager.rs +++ b/src/api/model/streams/shared_stream_manager.rs @@ -3,7 +3,7 @@ use crate::api::model::streams::provider_stream_factory::STREAM_QUEUE_SIZE; use crate::api::model::stream_error::StreamError; use crate::utils::debug_if_enabled; use crate::utils::network::request::sanitize_sensitive_info; -use parking_lot::{FairMutex}; +use parking_lot::{RwLock}; use bytes::Bytes; use futures::stream::BoxStream; use futures::{Stream, StreamExt}; @@ -15,8 +15,6 @@ use std::pin::Pin; use std::task::{Context, Poll}; use std::time::Duration; -const MIN_STREAM_QUEUE_SIZE: usize = 128; - /// /// Wraps a `ReceiverStream` as Stream> /// @@ -67,6 +65,7 @@ impl SharedStreamState { fn broadcast(&self, stream_url: &str, bytes_stream: S, shared_streams: Arc) where S: Stream> + Unpin + 'static, + E: std::fmt::Debug { let mut source_stream = Box::pin(bytes_stream); let streaming_url = stream_url.to_string(); @@ -81,9 +80,13 @@ impl SharedStreamState { debug_if_enabled!("No active subscribers. Closing shared provider stream {}", sanitize_sensitive_info(&streaming_url)); break; } - let _ = sender.send(data); + if let Err(err) = sender.send(data) { + eprintln!("broadcast send err {err:?}"); + } } - None | Some(Err(_)) => { + None => break, + Some(Err(err)) => { + eprintln!("broadcast failure {err:?}"); break; } } @@ -94,7 +97,7 @@ impl SharedStreamState { } } -type SharedStreamRegister = Arc>>; +type SharedStreamRegister = RwLock>; pub struct SharedStreamManager { shared_streams: SharedStreamRegister, @@ -103,35 +106,36 @@ pub struct SharedStreamManager { impl SharedStreamManager { pub(crate) fn new() -> Self { Self { - shared_streams: Arc::new(FairMutex::new(HashMap::new())), + shared_streams: RwLock::new(HashMap::new()), } } pub fn get_shared_state_headers(&self, stream_url: &str) -> Option> { - self.shared_streams.lock().get(stream_url).map(|s| s.headers.clone()) + self.shared_streams.read().get(stream_url).map(|s| s.headers.clone()) } fn unregister(&self, stream_url: &str) { - self.shared_streams.lock().remove(stream_url); + self.shared_streams.write().remove(stream_url); + } + + fn register(&self, stream_url: &str, shared_state: SharedStreamState) { + self.shared_streams.write().insert(stream_url.to_string(), shared_state); } pub(crate) fn subscribe( app_state: &AppState, stream_url: &str, bytes_stream: S, - use_buffer: bool, - headers: Vec<(String, String)>, ) + headers: Vec<(String, String)>, + buffer_size: usize,) where S: Stream> + Unpin + 'static, + E: std::fmt::Debug { - let buf_size = if use_buffer { STREAM_QUEUE_SIZE } else { MIN_STREAM_QUEUE_SIZE }; + let buf_size = std::cmp::max(buffer_size, STREAM_QUEUE_SIZE); let shared_state = SharedStreamState::new(headers, buf_size); shared_state.broadcast(stream_url, bytes_stream, Arc::clone(&app_state.shared_stream_manager)); - app_state - .shared_stream_manager - .shared_streams - .lock() - .insert(stream_url.to_string(), shared_state); + app_state.shared_stream_manager.register(stream_url, shared_state); debug_if_enabled!("Created shared provider stream {}", sanitize_sensitive_info(stream_url)); } @@ -140,15 +144,7 @@ impl SharedStreamManager { app_state: &AppState, stream_url: &str, ) -> Option>> { - if let Some(shared_stream) = app_state - .shared_stream_manager - .shared_streams - .lock() - .get(stream_url) { - debug_if_enabled!("Responding existing shared client stream {}", sanitize_sensitive_info(stream_url)); - Some(shared_stream.subscribe()) - } else { - None - } + debug_if_enabled!("Responding existing shared client stream {}", sanitize_sensitive_info(stream_url)); + app_state.shared_stream_manager.shared_streams.read().get(stream_url).map(SharedStreamState::subscribe) } } \ No newline at end of file diff --git a/src/model/config.rs b/src/model/config.rs index b2470076d..47cb6ae1f 100644 --- a/src/model/config.rs +++ b/src/model/config.rs @@ -1007,6 +1007,8 @@ pub struct Config { #[serde(default, skip_serializing_if = "Option::is_none")] pub backup_dir: Option, #[serde(default, skip_serializing_if = "Option::is_none")] + pub channel_unavailable_file: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] pub templates: Option>, #[serde(default, skip_serializing_if = "Option::is_none")] pub video: Option, @@ -1038,6 +1040,8 @@ pub struct Config { pub t_api_proxy_file_path: String, #[serde(skip)] pub file_locks: Arc, + #[serde(skip)] + pub t_channel_unavailable_file: Option>>, } impl Config { @@ -1172,6 +1176,17 @@ impl Config { let work_dir = if resolve_var { &config_reader::resolve_env_var(&self.working_dir) } else { &self.working_dir }; self.working_dir = file_utils::get_working_path(work_dir); + if let Some(channel_unavailable_file) = &self.channel_unavailable_file { + let channel_unavailable = file_utils::make_absolute_path(channel_unavailable_file, &self.working_dir, resolve_var); + match file_utils::read_file_as_bytes(&PathBuf::from(&channel_unavailable)) { + Ok(data) => self.t_channel_unavailable_file = Some(Arc::new(data)), + Err(err) => { + error!("Failed to load channel unavailable file: {channel_unavailable} {err}"); + } + } + self.channel_unavailable_file = Some(channel_unavailable); + } + if self.backup_dir.is_none() { self.backup_dir = Some(PathBuf::from(&self.working_dir).join("backup").clean().to_string_lossy().to_string()); } else { @@ -1250,24 +1265,7 @@ impl Config { fn prepare_api_web_root(&mut self, resolve_var: bool) { if !self.api.web_root.is_empty() { - let web_root = if resolve_var { config_reader::resolve_env_var(&self.api.web_root) } else { self.api.web_root.clone() }; - self.api.web_root = web_root.to_string(); - let wrpb = std::path::PathBuf::from(&self.api.web_root); - if wrpb.is_relative() { - let mut wrpb2 = std::path::PathBuf::from(&self.working_dir).join(&web_root); - if !wrpb2.exists() { - wrpb2 = file_utils::get_exe_path().join(&web_root); - } - if !wrpb2.exists() { - let cwd = std::env::current_dir(); - if let Ok(cwd_path) = cwd { - wrpb2 = cwd_path.join(&web_root); - } - } - if wrpb2.exists() { - self.api.web_root = String::from(wrpb2.clean().to_str().unwrap_or_default()); - } - } + self.api.web_root = file_utils::make_absolute_path(&self.api.web_root, &self.working_dir, resolve_var); } } diff --git a/src/tools/atomic_once_flag.rs b/src/tools/atomic_once_flag.rs index f13e36162..7066878ff 100644 --- a/src/tools/atomic_once_flag.rs +++ b/src/tools/atomic_once_flag.rs @@ -16,7 +16,6 @@ use std::sync::atomic::{AtomicBool, Ordering}; #[derive(Debug)] pub struct AtomicOnceFlag { enabled: AtomicBool, - ordering: Ordering, } impl Default for AtomicOnceFlag { @@ -26,30 +25,24 @@ impl Default for AtomicOnceFlag { } impl AtomicOnceFlag { - /// Creates a new `AtomicOnceFlag` with the specified memory ordering. - pub fn with_ordering(ordering: Ordering) -> Self { - Self { - enabled: AtomicBool::new(true), - ordering, - } - } - /// Creates a new `AtomicOnceFlag` with a default memory ordering of `Relaxed`. pub fn new() -> Self { - Self::with_ordering(Ordering::SeqCst) + Self { + enabled: AtomicBool::new(true), + } } /// Disables the flag. After calling this method, `is_active()` will always return `false`. /// /// This operation is atomic and uses the specified memory ordering. pub fn notify(&self) { - self.enabled.store(false, self.ordering); + self.enabled.store(false, Ordering::SeqCst); } /// Checks if the flag is still active. /// /// Returns `true` if the flag is active (initial state). Returns `false` if the flag has been disabled. pub fn is_active(&self) -> bool { - self.enabled.load(self.ordering) + self.enabled.load(Ordering::SeqCst) } } \ No newline at end of file diff --git a/src/utils/file/file_utils.rs b/src/utils/file/file_utils.rs index da6bb85c3..f85e73110 100644 --- a/src/utils/file/file_utils.rs +++ b/src/utils/file/file_utils.rs @@ -4,10 +4,11 @@ use std::fs::{File, OpenOptions}; use std::io::{BufReader, BufWriter, Read, Write}; use std::path::{Path, PathBuf}; +use crate::m3u_filter_error::str_to_io_error; +use crate::utils::debug_if_enabled; +use crate::utils::file::{config_reader}; use log::{debug, error}; use path_clean::PathClean; -use crate::utils::debug_if_enabled; -use crate::m3u_filter_error::str_to_io_error; const USER_FILE: &str = "user.txt"; const CONFIG_PATH: &str = "config"; @@ -17,13 +18,15 @@ const MAPPING_FILE: &str = "mapping.yml"; const API_PROXY_FILE: &str = "api-proxy.yml"; pub fn file_writer(w: W) -> BufWriter -where W: Write +where + W: Write, { BufWriter::with_capacity(131_072, w) } pub fn file_reader(r: R) -> BufReader -where R: Read +where + R: Read, { BufReader::with_capacity(131_072, r) } @@ -250,4 +253,33 @@ pub fn prepare_file_path(persist: Option<&str>, working_dir: &str, action: &str) } else { None } +} + +pub fn read_file_as_bytes(path: &Path) -> std::io::Result> { + let mut file = File::open(path)?; + let mut buffer = Vec::new(); + file.read_to_end(&mut buffer)?; + Ok(buffer) +} + +pub fn make_absolute_path(path: &str, working_dir: &str, resolve_var: bool) -> String { + let resolved_path = if resolve_var { config_reader::resolve_env_var(path) } else { path.to_string() }; + + let rpb = std::path::PathBuf::from(&resolved_path); + if rpb.is_relative() { + let mut rpb2 = std::path::PathBuf::from(working_dir).join(&rpb); + if !rpb2.exists() { + rpb2 = get_exe_path().join(&rpb); + } + if !rpb2.exists() { + let cwd = std::env::current_dir(); + if let Ok(cwd_path) = cwd { + rpb2 = cwd_path.join(&rpb); + } + } + if rpb2.exists() { + return String::from(rpb2.clean().to_str().unwrap_or_default()); + } + } + resolved_path } \ No newline at end of file