release v3.1.4

This commit is contained in:
euzu
2025-06-17 17:42:43 +02:00
parent 7675ca0d06
commit 1bdb74f2df
6 changed files with 45 additions and 14 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
# Changelog
# 3.1.4 (2025-06-xx)
# 3.1.4 (2025-06-17)
- share live stream refactored
- fixed active user count
- fixed hls streaming
Generated
+2 -2
View File
@@ -3020,11 +3020,11 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
[[package]]
name = "tuliprox"
version = "3.1.3"
version = "3.1.4"
dependencies = [
"arc-swap",
"axum",
"base64 0.22.1",
"base64 0.21.7",
"bincode",
"bitflags 2.9.1",
"blake3",
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "tuliprox"
version = "3.1.3"
version = "3.1.4"
edition = "2021"
[profile.release]
+30
View File
@@ -779,6 +779,7 @@ Each format has different properties
- resolve_series_delay: seconds,
- resolve_vod: true|false,
- resolve_vod_delay: true|false,
- trakt: Trakt Configuration
`m3u`
- type: m3u
@@ -887,6 +888,34 @@ There is a difference for `resolve_vod` and `resolve_series`.
`resolve_vod` works only when input: `xtream`.
- `xtream` `trakt`:
Trakt.tv is an online platform that helps you track, manage, and discover TV shows and movies. Think of it like Goodreads for TV and film.
You can add trakt list matches into your playlist.
You can define a `Trakt` config like
```yaml
- name: iptv-trakt-example
output:
- type: xtream
skip_live_direct_source: true
skip_video_direct_source: true
skip_series_direct_source: true
resolve_series: false
resolve_vod: false
trakt:
lists:
- user: "linaspurinis"
list_slug: "top-watched-movies-of-the-week"
category_name: "📈 Top Weekly Movies"
content_type: "vod"
fuzzy_match_threshold: 80
- user: "garycrawfordgc"
list_slug: "latest-tv-shows"
category_name: "📺 Latest TV Shows"
content_type: "series"
fuzzy_match_threshold: 80
```
This will create 2 new categories with matched entries.
### 2.2.2.5 `filter`
The filter is a string with a filter statement.
The filter can have UnaryExpression `NOT`, BinaryExpression `AND OR`, Regexp Comparison `(Group|Title|Name|Url) ~ "regexp"`
@@ -1085,6 +1114,7 @@ It is whitespace-tolerant and uses familiar programming concepts with a custom s
- number(a)
- print(a, b, c)
- first(a)
- template(a)
Field names are: `name`, `title"`, `caption"`, `group"`, `id"`, `chno"`, `logo"`, `logo_small"`, `parent_code"`, `time_shift" | "url"`, `epg_channel_id"`, `epg_id`.
When you use Regular expressions it could be that your match contains multiple results. The builtin function `first` returns the first match.
Example `print(uppercase("hello"))`. output is only visible in `trace` log level you can enable it like `log_level: debug,tuliprox::foundation::mapper=trace` in config
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "tuliprox",
"description": "tuliprox",
"author": "euzu",
"version": "3.1.3",
"version": "3.1.4",
"private": true,
"homepage": "",
"license": "MIT",
+10 -9
View File
@@ -1,6 +1,7 @@
use axum::body::Body;
use axum::extract::Request;
use axum::response::Response;
use futures::FutureExt;
use hyper::body::Incoming;
use hyper_util::rt::{TokioExecutor, TokioIo};
use hyper_util::server::conn::auto::Builder;
@@ -14,7 +15,6 @@ use std::pin::pin;
use std::time::Duration;
use tokio::sync::watch;
use tower::{Service, ServiceExt};
use futures::FutureExt;
#[derive(Debug)]
struct IncomingStream
@@ -51,13 +51,15 @@ pub async fn serve(listener: tokio::net::TcpListener, router: axum::Router<()>)
let keep_alive_first_probe = 10;
let keep_alive_interval = 5;
let keep_alive_retries = 3;
let keepalive = TcpKeepalive::new()
.with_time(Duration::from_secs(keep_alive_first_probe)) // Time until the first keepalive probe (idle time)
.with_interval(Duration::from_secs(keep_alive_interval)) // Interval between keepalive probes
.with_retries(keep_alive_retries); // Number of failed probes before the connection is closed
let mut keepalive = TcpKeepalive::new();
keepalive = keepalive.with_time(Duration::from_secs(keep_alive_first_probe)) // Time until the first keepalive probe (idle time)
.with_interval(Duration::from_secs(keep_alive_interval)); // Interval between keep alives
#[cfg(not(target_os = "windows"))]
{
let keep_alive_retries = 3;
keepalive = keepalive.with_retries(keep_alive_retries); // Number of failed probes before the connection is closed
}
if let Err(e) = sock_ref.set_tcp_keepalive(&keepalive) {
error!("Failed to set keepalive for {remote_addr}: {e}");
@@ -65,7 +67,7 @@ pub async fn serve(listener: tokio::net::TcpListener, router: axum::Router<()>)
let Ok(socket) = tokio::net::TcpStream::from_std(tcp_stream_std) else { continue; };
let io = TokioIo::new(socket);
let io = TokioIo::new(socket);
handle_connection(&mut make_service, &signal_tx, &close_rx, io, remote_addr).await;
}
}
@@ -83,7 +85,6 @@ where
S: Service<Request, Response=Response, Error=Infallible> + Clone + Send + 'static,
S::Future: Send,
{
trace!("connection {remote_addr:?} accepted");
make_service