File size: 2,831 Bytes
17fefbc
9c10fcb
 
17fefbc
 
 
625cc7b
56f439c
113ea7a
92f0b6b
9c10fcb
 
 
 
 
dd3ad8e
 
1de09cd
9c10fcb
 
1de09cd
9c10fcb
 
 
 
 
 
625cc7b
9c10fcb
 
 
19c4131
a5b04d2
625cc7b
9f1a134
 
0a92b5b
9c10fcb
dc5fd17
56f439c
e9a5f76
dc5fd17
9c10fcb
 
 
dc2d9cb
9c10fcb
 
 
 
 
8ede3fd
9c10fcb
 
 
 
 
1de09cd
9c10fcb
 
 
 
 
 
2d9145f
92f0b6b
 
1a38430
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
FROM python:3.11-slim-trixie
# ffmpeg only. Recording/remux packages are not installed.
RUN apt-get update && apt-get install -y --no-install-recommends ffmpeg ca-certificates tzdata && rm -rf /var/lib/apt/lists/*
RUN ffmpeg -hide_banner -h protocol=rtmps 2>&1 | grep -q rtmp_enhanced_codecs
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -U -r requirements.txt
COPY app.py relay.py youtube_api.py youtube_manager.py flv_bridge.py stream_monitor.py telemetry.py tiktok_auth.py ingest.py index.html ./
COPY verify.sh verify_tokens.py probe_live.py test_watchdog.py test_lifecycle.py test_relay.py test_source_reconnect.py test_ingest_routes.py test_transition_ingest.py test_concurrency.py test_flv_bridge.py test_adaptive_format.py test_regressions.py test_completion.py test_channel_switch.py test_dashboard.js test_telemetry.py test_smart_mode.py ./

# TikTok Live Monitor → Direct Relay → YouTube. No local video files.
ENV TZ=Asia/Baghdad \
    CHECK_INTERVAL=20 \
    SOURCE_STALL_TIMEOUT=12 \
    YOUTUBE_SOURCE_STALL_SECONDS=12 \
    MAX_CONCURRENT_RELAYS=4 \
    YOUTUBE_MAX_EVENTS=4 \
    YOUTUBE_LIGHT_MAX=0 \
    YOUTUBE_TITLE_TEMPLATE="{broadcaster} | {date} {time}" \
    YOUTUBE_SEND_MODE=auto \
    YOUTUBE_AUTO_TRANSCODE=0 \
    YOUTUBE_AUDIO_PROFILE=aac_low \
    YOUTUBE_AUDIO_BITRATE=128k \
    YOUTUBE_AUDIO_CHANNELS=2 \
    YOUTUBE_GOP=60 \
    YOUTUBE_INPUT_RECOVERY=1 \
    YOUTUBE_PREFER_H264=1 \
    YOUTUBE_CODEC_FALLBACK_MODE=matchgop \
    YOUTUBE_RETRY_MIN=1 \
    YOUTUBE_RETRY_MAX=60 \
    YOUTUBE_SOURCE_LIMIT=6 \
    YOUTUBE_SOURCE_UPGRADE_SECONDS=300 \
    YOUTUBE_FLAP_LIMIT=4 \
    YOUTUBE_FLAP_FALLBACK_MODE=matchgop \
    YOUTUBE_COPY_RECOVERY=1 \
    YOUTUBE_COPY_RECOVERY_SECONDS=60 \
    YOUTUBE_X264_PRESET=ultrafast \
    YOUTUBE_FIFO_TIMESHIFT=0 \
    YOUTUBE_HEALTH_INTERVAL=20 \
    TELEMETRY_ENABLED=1 \
    YOUTUBE_IDLE_RESET_SECONDS=600 \
    STREAM_EVENT_MAX=10000 \
    YOUTUBE_OBS_HOLD_SECONDS=900 \
    YOUTUBE_SOURCE_RETRY=15 \
    YOUTUBE_FORCE_GAP=5 \
    YOUTUBE_END_GRACE=40 \
    YOUTUBE_REUSE_IDLE=90 \
    YOUTUBE_STABLE_SECONDS=25 \
    YOUTUBE_FFMPEG_LOGLEVEL=info \
    YOUTUBE_SOURCE_READ_TIMEOUT=15 \
    YOUTUBE_SOURCE_READ_ATTEMPTS=3 \
    YOUTUBE_REATTACH_GRACE_SECONDS=2 \
    YOUTUBE_PROGRESS_STALL_SECONDS=60 \
    YOUTUBE_KILL_GRACE_SECONDS=10 \
    YOUTUBE_PUMP_JOIN_SECONDS=2 \
    YOUTUBE_AUTH_PAUSE_SECONDS=90 \
    YOUTUBE_SESSION_MAX_SECONDS=21600 \
    YOUTUBE_ENHANCED_RTMP=auto \
    YOUTUBE_SOURCE_GAP_SUSPECT_SECONDS=8 \
    TIKTOK_TT_TARGET_IDC=useast1a \
    STORAGE_WAIT_SECONDS=30 \
    HLS_START_INDEX=-3 \
    PORT=7860 \
    PYTHONUNBUFFERED=1 \
    YOUTUBE_VIDEO_MODE=original

EXPOSE 7860
CMD ["sh", "-c", "exec uvicorn app:app --host 0.0.0.0 --port ${PORT:-7860} --timeout-graceful-shutdown 65 --no-access-log"]