Skip to content

Instantly share code, notes, and snippets.

@eigenein
Last active March 21, 2025 14:57
Show Gist options
  • Save eigenein/d4d8026fe253e0310bf089c3ae8f11ef to your computer and use it in GitHub Desktop.
Save eigenein/d4d8026fe253e0310bf089c3ae8f11ef to your computer and use it in GitHub Desktop.
Launch daemons for streaming a UniFi camera to YouTube
<?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>...</string>
<key>StartInterval</key>
<integer>30</integer>
<key>RunAtLoad</key>
<true/>
<key>LimitLoadToSessionType</key>
<array>
<string>Aqua</string>
<string>Background</string>
<string>LoginWindow</string>
<string>StandardIO</string>
<string>System</string>
</array>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/python3</string>
<string>-c</string>
<string>import urllib.request, json, sys; response = urllib.request.urlopen("https://youtube.googleapis.com/youtube/v3/videos?id=...&key=...&part=snippet&fields=items.snippet.liveBroadcastContent").read().decode(); json.loads(response)["items"][0]["snippet"]["liveBroadcastContent"] == "live" and urllib.request.urlopen("https://uptime.betterstack.com/api/v1/heartbeat/...")</string>
</array>
<key>WorkingDirectory</key>
<string>/Users/eigenein/Downloads</string>
<key>UserName</key>
<string>eigenein</string>
</dict>
</plist>
# Backup stream for maintainance works:
ffmpeg -f image2 -loop 1 -i "Cover 2304p.png" -re -f lavfi -i anullsrc -vf format=yuv420p -c:v libx264 -c:a aac -f flv "rtmp://b.rtmp.youtube.com/live2/...?backup=1"
<?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>...</string>
<key>KeepAlive</key>
<true/>
<key>RunAtLoad</key>
<true/>
<key>ThrottleInterval</key>
<integer>20</integer>
<key>LimitLoadToSessionType</key>
<array>
<string>Aqua</string>
<string>Background</string>
<string>LoginWindow</string>
<string>StandardIO</string>
<string>System</string>
</array>
<key>ProgramArguments</key>
<array>
<string>/opt/homebrew/bin/ffmpeg</string>
<string>-nostdin</string>
<string>-t</string>
<string>12:00:00</string>
<string>-i</string>
<string>rtsps://192.168.1.1:7441/...?enableSrtp</string>
<string>-tune</string>
<string>zerolatency</string>
<string>-map</string>
<string>0:2</string>
<string>-c:v</string>
<string>copy</string>
<string>-map</string>
<string>0:0</string>
<string>-c:a</string>
<string>aac_at</string>
<string>-f</string>
<string>flv</string>
<string>-xerror</string>
<string>-err_detect</string>
<string>ignore_err</string>
<string>-loglevel</string>
<string>level+warning</string>
<string>-reconnect</string>
<string>1</string>
<string>-reconnect_at_eof</string>
<string>1</string>
<string>-reconnect_streamed</string>
<string>1</string>
<string>-reconnect_delay_max</string>
<string>20</string>
<string>-t</string>
<string>12:00:00</string>
<string>rtmp://a.rtmp.youtube.com/live2/...</string>
</array>
<key>WorkingDirectory</key>
<string>/Users/.../Downloads</string>
<key>StandardErrorPath</key>
<string>/Users/.../Library/Logs/....log</string>
<key>StandardOutPath</key>
<string>/Users/.../Library/Logs/....log</string>
<key>UserName</key>
<string>eigenein</string>
</dict>
</plist>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment