Spaces:
Running
Running
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"]
|