File size: 2,831 Bytes
17fefbc
9c10fcb
 
17fefbc
 
 
d6fd944
ce0ef24
 
92f0b6b
9c10fcb
 
 
 
 
50594d5
 
ce0ef24
9c10fcb
 
ce0ef24
9c10fcb
 
 
 
 
 
d6fd944
9c10fcb
 
 
ce0ef24
a6cf067
d6fd944
01edec4
 
ce0ef24
9c10fcb
ce0ef24
 
 
 
9c10fcb
 
 
 
 
 
 
 
 
ce0ef24
9c10fcb
 
 
 
 
ce0ef24
9c10fcb
 
 
 
 
 
 
92f0b6b
 
ce0ef24
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"]