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"]
|