├── StepDaddyLiveHD ├── __init__.py ├── components │ ├── __init__.py │ ├── media_player.py │ ├── card.py │ └── navbar.py ├── pages │ ├── __init__.py │ ├── schedule.py │ ├── playlist.py │ └── watch.py ├── StepDaddyLiveHD.py ├── utils.py ├── backend.py └── step_daddy.py ├── .dockerignore ├── assets ├── favicon.ico └── player.jsx ├── .gitignore ├── requirements.txt ├── .env ├── Caddyfile ├── rxconfig.py ├── docker-compose.yml ├── Dockerfile └── README.md /StepDaddyLiveHD/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | .web 2 | !.web/bun.lockb 3 | !.web/package.json 4 | .states 5 | .venv -------------------------------------------------------------------------------- /assets/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gookie-dev/StepDaddyLiveHD/HEAD/assets/favicon.ico -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .states 2 | *.db 3 | assets/external/ 4 | *.py[cod] 5 | .web 6 | .venv 7 | __pycache__/ 8 | /.idea/ 9 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | reflex==0.8.13 2 | curl-cffi==0.13.0 3 | httpx[http2]==0.28.1 4 | python-dateutil==2.9.0 5 | fastapi==0.118.0 -------------------------------------------------------------------------------- /StepDaddyLiveHD/components/__init__.py: -------------------------------------------------------------------------------- 1 | from .navbar import navbar 2 | from .card import card 3 | from .media_player import MediaPlayer 4 | 5 | __all__ = ["navbar", "card", "MediaPlayer"] 6 | -------------------------------------------------------------------------------- /StepDaddyLiveHD/pages/__init__.py: -------------------------------------------------------------------------------- 1 | from .watch import watch 2 | from .playlist import playlist 3 | from .schedule import schedule 4 | 5 | 6 | __all__ = ["watch", "playlist", "schedule"] 7 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | PORT="3000" 2 | API_URL="http://localhost:3000" # Replace with your local IP or domain if you want to access it across the network 3 | PROXY_CONTENT="TRUE" # Set to FALSE if you don't want to proxy content 4 | SOCKS5="" # Add SOCKS5 proxy details for DLHD request if needed "user:password@proxy.example.com:1080" -------------------------------------------------------------------------------- /Caddyfile: -------------------------------------------------------------------------------- 1 | :{$PORT} 2 | 3 | encode gzip 4 | 5 | @backend_routes path /_event/* /ping /_upload /_upload/* /stream/* /key/* /content/* /playlist.m3u8 /logo/* 6 | handle @backend_routes { 7 | reverse_proxy localhost:8000 8 | } 9 | 10 | handle { 11 | root * /srv 12 | route { 13 | try_files {path} {path}/ /404.html 14 | file_server 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /StepDaddyLiveHD/components/media_player.py: -------------------------------------------------------------------------------- 1 | import reflex as rx 2 | from reflex.components.component import NoSSRComponent 3 | 4 | 5 | class MediaPlayer(NoSSRComponent): 6 | library = "$/public/player" 7 | lib_dependencies: list[str] = ["@vidstack/react@next"] 8 | tag = "Player" 9 | title: rx.Var[str] 10 | src: rx.Var[str] 11 | autoplay: bool = True 12 | -------------------------------------------------------------------------------- /rxconfig.py: -------------------------------------------------------------------------------- 1 | import reflex as rx 2 | import os 3 | 4 | 5 | proxy_content = os.environ.get("PROXY_CONTENT", "TRUE").upper() == "TRUE" 6 | socks5 = os.environ.get("SOCKS5", "") 7 | 8 | print(f"PROXY_CONTENT: {proxy_content}\nSOCKS5: {socks5}") 9 | 10 | config = rx.Config( 11 | app_name="StepDaddyLiveHD", 12 | proxy_content=proxy_content, 13 | socks5=socks5, 14 | show_built_with_reflex=False, 15 | plugins=[ 16 | rx.plugins.SitemapPlugin(), 17 | rx.plugins.TailwindV4Plugin(), 18 | ], 19 | ) 20 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | step-daddy-live-hd: 3 | build: 4 | context: . 5 | dockerfile: Dockerfile 6 | args: 7 | PORT: ${PORT} 8 | API_URL: ${API_URL} 9 | PROXY_CONTENT: ${PROXY_CONTENT} 10 | SOCKS5: ${SOCKS5} 11 | environment: 12 | - PORT=${PORT} 13 | - API_URL=${API_URL} 14 | - PROXY_CONTENT=${PROXY_CONTENT} 15 | - SOCKS5=${SOCKS5} 16 | ports: 17 | - "${PORT}:${PORT}" 18 | restart: unless-stopped 19 | env_file: 20 | - .env -------------------------------------------------------------------------------- /assets/player.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import '@vidstack/react/player/styles/default/theme.css'; 3 | import '@vidstack/react/player/styles/default/layouts/audio.css'; 4 | import '@vidstack/react/player/styles/default/layouts/video.css'; 5 | import { MediaPlayer, MediaProvider, Poster, Captions } from "@vidstack/react" 6 | import { DefaultVideoLayout, defaultLayoutIcons } from '@vidstack/react/player/layouts/default'; 7 | 8 | 9 | function InjectCSS() { 10 | const css = ` 11 | .media-player[data-view-type="video"] { 12 | aspect-ratio: 16 / 9; 13 | } 14 | 15 | .vds-video-layout { 16 | --video-brand: hsl(0, 0%, 96%); 17 | } 18 | 19 | .vds-audio-layout { 20 | --audio-brand: hsl(0, 0%, 96%); 21 | } 22 | 23 | .plyr { 24 | --plyr-color-main: hsl(198, 100%, 50%); 25 | } 26 | 27 | .vds-slider-chapters { 28 | display: none; 29 | } 30 | 31 | .rt-Container { 32 | align-self: center; 33 | } 34 | `; 35 | 36 | return