@@ -1179,6 +1179,10 @@ pub async fn get_media_streams(
11791179 . mediaflow_config
11801180 . as_ref ( )
11811181 . filter ( |m| m. enable_web_playback && m. proxy_url . as_deref ( ) . is_some_and ( |s| !s. is_empty ( ) ) ) ;
1182+ let mediaflow_config = ud
1183+ . mediaflow_config
1184+ . as_ref ( )
1185+ . filter ( |m| m. proxy_url . as_deref ( ) . is_some_and ( |s| !s. is_empty ( ) ) ) ;
11821186 let web_playback_enabled = mediaflow_web_config. is_some ( ) ;
11831187 let season = effective_season;
11841188 let episode = effective_episode;
@@ -1231,6 +1235,8 @@ pub async fn get_media_streams(
12311235 tgs.chat_id AS tg_chat_id,
12321236 tgs.message_id AS tg_message_id,
12331237 tgs.id AS telegram_stream_id,
1238+ ace.content_id AS ace_content_id,
1239+ ace.info_hash AS ace_info_hash,
12341240 {STREAM_LINK_AGG_COLS},
12351241 ts.created_at
12361242 FROM stream s
@@ -1243,6 +1249,7 @@ pub async fn get_media_streams(
12431249 LEFT JOIN usenet_stream us ON us.stream_id = s.id
12441250 LEFT JOIN youtube_stream ys ON ys.stream_id = s.id
12451251 LEFT JOIN telegram_stream tgs ON tgs.stream_id = s.id
1252+ LEFT JOIN acestream_stream ace ON ace.stream_id = s.id
12461253 WHERE {stream_visibility}
12471254 AND fml.media_id = $1
12481255 AND fml.season_number = $2
@@ -1272,6 +1279,8 @@ pub async fn get_media_streams(
12721279 tgs.chat_id AS tg_chat_id,
12731280 tgs.message_id AS tg_message_id,
12741281 tgs.id AS telegram_stream_id,
1282+ ace.content_id AS ace_content_id,
1283+ ace.info_hash AS ace_info_hash,
12751284 {STREAM_LINK_AGG_COLS},
12761285 ts.created_at
12771286 FROM stream s
@@ -1280,6 +1289,7 @@ pub async fn get_media_streams(
12801289 LEFT JOIN usenet_stream us ON us.stream_id = s.id
12811290 LEFT JOIN youtube_stream ys ON ys.stream_id = s.id
12821291 LEFT JOIN telegram_stream tgs ON tgs.stream_id = s.id
1292+ LEFT JOIN acestream_stream ace ON ace.stream_id = s.id
12831293 WHERE sml.media_id = $1
12841294 AND {stream_visibility}"#
12851295 ) ) )
@@ -1496,8 +1506,23 @@ pub async fn get_media_streams(
14961506 } ;
14971507 let keyword_blocked = kf. is_stream_text_blocked ( & r. name , r. filename . as_deref ( ) ) ;
14981508
1499- // Build playback URL for torrent/usenet/telegram streams when configured.
1500- let raw_playback_url: Option < String > = if rd_blocked || secret_str. is_empty ( ) {
1509+ // Build playback URL for torrent/usenet/telegram/acestream streams when configured.
1510+ let raw_playback_url: Option < String > = if rd_blocked {
1511+ None
1512+ } else if r. stream_type == StreamType :: Acestream {
1513+ if ud. enable_acestream_streams {
1514+ mediaflow_config. and_then ( |mf| {
1515+ mediaflow:: encode_mediaflow_acestream_url (
1516+ mf. proxy_url . as_deref ( ) ?,
1517+ r. ace_content_id . as_deref ( ) ,
1518+ r. ace_info_hash . as_deref ( ) ,
1519+ mf. api_password . as_deref ( ) ,
1520+ )
1521+ } )
1522+ } else {
1523+ None
1524+ }
1525+ } else if secret_str. is_empty ( ) {
15011526 None
15021527 } else if r. stream_type == StreamType :: Telegram {
15031528 if let Some ( tg_id) = r. telegram_stream_id {
@@ -1564,25 +1589,29 @@ pub async fn get_media_streams(
15641589 } ;
15651590
15661591 // Build browser_url by wrapping raw_playback_url through MediaFlow when configured.
1567- // raw_playback_url is kept for external players; browser_url is for in-browser playback.
1568- let browser_url: Option < String > = raw_playback_url. as_deref ( ) . and_then ( |raw| {
1569- mediaflow_web_config. and_then ( |mf| {
1570- let proxy_url = mf. proxy_url . as_deref ( ) ?;
1571- let mut params = std:: collections:: BTreeMap :: new ( ) ;
1572- if let Some ( ap) = mf. api_password . as_deref ( ) . filter ( |s| !s. is_empty ( ) ) {
1573- params. insert ( "api_password" . into ( ) , ap. to_string ( ) ) ;
1574- }
1575- mediaflow:: encode_mediaflow_proxy_url (
1576- proxy_url,
1577- "/proxy/stream" ,
1578- Some ( raw) ,
1579- params,
1580- None ,
1581- None ,
1582- )
1583- . ok ( )
1592+ // AceStream URLs already target MediaFlow directly and must not be double-wrapped.
1593+ let browser_url: Option < String > = if r. stream_type == StreamType :: Acestream {
1594+ raw_playback_url. clone ( )
1595+ } else {
1596+ raw_playback_url. as_deref ( ) . and_then ( |raw| {
1597+ mediaflow_web_config. and_then ( |mf| {
1598+ let proxy_url = mf. proxy_url . as_deref ( ) ?;
1599+ let mut params = std:: collections:: BTreeMap :: new ( ) ;
1600+ if let Some ( ap) = mf. api_password . as_deref ( ) . filter ( |s| !s. is_empty ( ) ) {
1601+ params. insert ( "api_password" . into ( ) , ap. to_string ( ) ) ;
1602+ }
1603+ mediaflow:: encode_mediaflow_proxy_url (
1604+ proxy_url,
1605+ "/proxy/stream" ,
1606+ Some ( raw) ,
1607+ params,
1608+ None ,
1609+ None ,
1610+ )
1611+ . ok ( )
1612+ } )
15841613 } )
1585- } ) ;
1614+ } ;
15861615
15871616 let output = json ! ( {
15881617 "id" : r. id,
0 commit comments