Myron Blair b74d8a2652 Add fast audio-only transcode mode; fixes no-sound from AC3/DTS/EAC3
Root cause of "movies have no volume control / can't hear anything":
0 of 200 movies had finished transcoding, so every movie streamed its
raw source file — and BDRip/AVI sources very commonly carry AC3/DTS/EAC3
audio, which no browser can decode natively. Browsers respond by hiding
the volume control entirely when they can't find a playable audio track,
which is exactly the symptom reported.

New "audio" transcode quality: video is stream-copied untouched, only
the audio track is re-encoded to AAC — dramatically faster than a full
ABR pass since no video re-encoding happens. Added:
- transcode_audio_fix() in transcode.py
- "audio" as a valid quality value everywhere quick/abr were validated
- POST /transcode/queue/fix-audio-all: cancels every still-pending job
  and replaces it with the fast audio fix for the same content (running
  jobs are left alone), so a library-wide backlog of slow ABR jobs can
  be swapped for something that actually restores sound soon
- Per-movie "Audio" button in Admin, "Fix Audio (Fast, All)" button on
  the Transcode Queue page

Note: this doesn't help HEVC/x265 sources, whose video (not just audio)
isn't natively browser-playable either — those still need a full ABR
re-encode to H.264.
2026-07-26 23:31:23 -05:00

StreamHoard — Personal Media Server (Netflix Clone)

A self-hosted Netflix-style streaming app for movies you legally own. Built with FastAPI + React + MongoDB.

One-line install (Proxmox / any Linux with root)

curl -fsSL https://raw.githubusercontent.com/myronblair/kino-app/main/install.sh | sudo bash

The installer:

  1. Installs Docker + Compose if missing
  2. Clones the repo into /opt/kino
  3. Generates a strong JWT_SECRET and admin password
  4. Starts the stack via docker compose
  5. Prints the URL + credentials

Non-interactive with overrides:

curl -fsSL https://raw.githubusercontent.com/myronblair/kino-app/main/install.sh \
  | sudo KINO_HTTP_PORT=9000 \
         MEDIA_ROOT_HOST=/mnt/nas/movies \
         ADMIN_PASSWORD='choose-your-own' \
         bash

📖 Full deployment

See DEPLOY.md for LAMP-coexistence, Apache reverse proxy, Radarr integration, and firewalling.

Features

  • Cinematic browse UI with hero banner, horizontal carousels, hover details
  • HTML5 video player with HTTP Range request support (proper seeking)
  • JWT auth (admin + member roles)
  • Admin upload for adding movies (multipart, large files OK)
  • My List (watchlist) and Continue Watching (resume playback)
  • Search by title/director/cast
  • Request queue — users request movies, admin approves & uploads them (Legal alternative to auto-downloading — auto-download of copyrighted material is not implemented.)

Default admin

  • Email: admin@streamhoard.local
  • Password: kino-admin-2026

Change ADMIN_EMAIL / ADMIN_PASSWORD in backend/.env before first start to set your own admin credentials.

Self-hosting on Proxmox

You can run this stack on any Proxmox LXC or VM. Recommended layout:

  1. Create an Ubuntu 22.04 LXC with at least:
    • 2 CPU cores, 4 GB RAM
    • 20 GB system disk
    • Mount your bulk storage (zfs/nfs) at /mnt/media
  2. Install dependencies:
    apt update && apt install -y python3-pip nodejs npm yarn mongodb git
    
  3. Clone & configure:
    git clone <your-fork> /opt/kino
    cd /opt/kino
    
  4. Backend:
    cd backend
    pip install -r requirements.txt
    # edit .env:
    #   MONGO_URL=mongodb://localhost:27017
    #   DB_NAME=kino
    #   MEDIA_ROOT=/mnt/media
    #   ADMIN_EMAIL=you@yourdomain
    #   ADMIN_PASSWORD=<strong>
    #   JWT_SECRET=<openssl rand -hex 32>
    uvicorn server:app --host 0.0.0.0 --port 8001
    
  5. Frontend:
    cd frontend
    yarn install
    # edit .env:
    #   REACT_APP_BACKEND_URL=https://kino.yourdomain.tld
    yarn build
    # serve build/ via nginx or caddy
    
  6. Recommended: front with Caddy for HTTPS:
    kino.yourdomain.tld {
      handle /api/* {
        reverse_proxy localhost:8001
      }
      handle {
        root * /opt/kino/frontend/build
        try_files {path} /index.html
        file_server
      }
    }
    

GitHub backup

This repo is the source of truth for code and configuration. Do not commit your .env files — they contain secrets. Movie media files should live on your Proxmox storage, not Git.

Adding movies

  • Via web UI: Sign in as admin → "Upload" in nav → drag MP4 + fill metadata
  • Manually: drop MP4 into $MEDIA_ROOT/videos/, then create the movie via POST /api/movies with storage_type=local and storage_path=<filename>

API quickstart

# Login
curl -X POST $URL/api/auth/login \
  -H 'Content-Type: application/json' \
  -d '{"email":"admin@streamhoard.local","password":"kino-admin-2026"}'

# List movies
curl $URL/api/movies

# Stream a local movie (note: needs ?auth=<token> for <video> tags)
curl $URL/api/stream/<movie_id>?auth=<token>

Why no auto-download?

Auto-downloading copyrighted movies from the internet is illegal in most jurisdictions (DMCA, EU copyright directive, etc.). StreamHoard is built as a personal media server for content you legally own or that is in the public domain (Internet Archive, Blender Open Movies, etc.).

The "Requests" feature lets users wishlist titles for the admin to add manually — preserving the request UX without crossing into piracy.

S
Description
Mirror of github.com/myronblair/kino-app
Readme 940 KiB
Languages
JavaScript 58.6%
Python 38.9%
Shell 1.2%
CSS 0.6%
HTML 0.4%
Other 0.3%