Apps / Media / :32400

Plex Media Server

Stream your media library, with apps for every TV and phone.

No MiniControl yet? Download MiniControl, then install Plex Media Server from its catalog.

Plex organises your movies, shows, music and photos and streams them to its apps, which run on nearly every TV, console and phone. It adds posters, trailers and watch progress, and can share your library with friends. The server is free; some features need a Plex Pass.

Needs a free Plex account.

After the install: Plex only allows its first setup from the Mac itself: use Screen Sharing and open http://localhost:32400/web there.

Free, like the whole catalog.

What MiniControl installs

Packages
brew install --cask plex-media-server
Web page
Port 32400, at /web
Keeps running
As LaunchAgent app.minicontrol.plex, also after a restart
Its data
~/Library/Application Support/Plex Media Server
Memory
200–400 MB, more while it converts video
Licence
Proprietary
The install script

What MiniControl runs on your server, word for word. The app shows the same script before it installs.

#!/bin/bash
# Generated by MiniControl for Plex Media Server. Runs on the machine.
set -euo pipefail
export HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_ENV_HINTS=1 NONINTERACTIVE=1
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:$PATH"
step() { echo "STEP|$1|$2"; }
fail() { echo "ERR|$1"; exit 1; }
U=$(id -u)
BREW=$(command -v brew || true)
[ -n "$BREW" ] || fail "Homebrew isn't installed. Server Setup → Homebrew installs it."
BP=$("$BREW" --prefix)
step 1 "Checking the machine"
for f in "$HOME"/Library/LaunchAgents/*.plist; do
  if grep -qsF -- 'Plex Media Server.app/Contents/MacOS' "$f"; then fail "Plex Media Server is already set up here, as $(basename "$f" .plist)."; fi
done
if lsof -nP -iTCP:32400 -sTCP:LISTEN >/dev/null 2>&1; then
  fail "Something else already uses port 32400: $(lsof -nP -iTCP:32400 -sTCP:LISTEN | awk 'NR == 2 {print $1}')."
fi
step 2 "Installing with Homebrew"
"$BREW" list --cask plex-media-server >/dev/null 2>&1 || "$BREW" install --cask plex-media-server
step 3 "Setting it up"
mkdir -p "$HOME/services/plex/log" "$HOME/Library/LaunchAgents"
PL="$HOME/Library/LaunchAgents/app.minicontrol.plex.plist"
cat > "$PL" <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key><string>app.minicontrol.plex</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Applications/Plex Media Server.app/Contents/MacOS/Plex Media Server</string>
  </array>
  <key>RunAtLoad</key><true/>
  <key>KeepAlive</key><true/>
  <key>ThrottleInterval</key><integer>10</integer>
  <key>ProcessType</key><string>Background</string>
  <key>StandardOutPath</key><string>$HOME/services/plex/log/launchd.out.log</string>
  <key>StandardErrorPath</key><string>$HOME/services/plex/log/launchd.err.log</string>
</dict>
</plist>
EOF
plutil -lint "$PL" >/dev/null
[ -x "/Applications/Plex Media Server.app/Contents/MacOS/Plex Media Server" ] || fail "/Applications/Plex Media Server.app/Contents/MacOS/Plex Media Server isn't there after the install."
step 4 "Starting Plex Media Server"
# Services run in the logged-in user's session (gui/<uid>), like every service in the panel.
launchctl bootstrap "gui/$U" "$PL" || fail "launchd didn't start it. Services run while you're logged in on the machine; Server Setup's \"Log in automatically after a restart\" fixes that."
if /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate 2>/dev/null | grep -q enabled; then echo "FW|/Applications/Plex Media Server.app/Contents/MacOS/Plex Media Server"; fi
step 5 "Waiting for it to answer"
# Localhost, and the Tailscale IP for apps that bind only to it.
# `|| true`: with set -e, a failed substitution in an assignment would end the script.
HOSTS="127.0.0.1 $(for t in "$BP/bin/tailscale" /usr/local/bin/tailscale; do [ -x "$t" ] && "$t" ip -4 2>/dev/null && break; done | head -1 || true)"
ok=0
for i in $(seq 1 45); do
  for h in $HOSTS; do
    if curl -fsS -m 3 -o /dev/null "http://$h:32400/identity" 2>/dev/null; then ok=1; break 2; fi
  done
  sleep 2
done
[ "$ok" = 1 ] || echo "WARN|It started, but isn't answering on port 32400 yet. Big apps can take a minute on first start."
echo "DONE"

MiniControl isn’t affiliated with Plex Media Server. Questions about Plex Media Server itself go to its makers; about installing it, to [email protected].