summaryrefslogtreecommitdiff
path: root/tools/ipcam_stream.py
blob: 9cf99d6cd27eb65b381428a6c51db8e773dff052 (plain)
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
#!/usr/bin/env python3
import include_homekit
import subprocess
import sys

from argparse import ArgumentParser, ArgumentError
from homekit.camera import IpcamConfig

if __name__ == '__main__':
    players = ('mpv', 'vlc')
    parser = ArgumentParser()
    parser.add_argument('--tcp', action='store_true',
                        help='use tcp for rtsp')
    parser.add_argument('--player', type=str, choices=players, default=players[0],
                        help='player to use')
    parser.add_argument('--low', action='store_true',
                        help='use second channel')
    parser.add_argument('camera', metavar='CAMERA', type=int, nargs=1,
                        help='number of camera to stream')
    args = parser.parse_args()

    ic = IpcamConfig()
    camera = args.camera[0]
    if not ic.has_camera(camera):
        raise ArgumentError(None, f'invalid camera {camera}')

    cmd = [args.player]
    if args.tcp:
        cmd.extend(['--rtsp-transport=tcp', '--force-seekable=yes'])
    ip = ic.get_camera_ip(camera)
    username, password = ic.get_rtsp_creds()
    uri = f'rtsp://{username}:{password}@{ip}:554'
    uri += ic.get_camera_type(camera).get_channel_url(1 if not args.low else 2)
    cmd.append(uri)

    p = subprocess.run(cmd, capture_output=False)
    if p.returncode != 0:
        print(f'error: {args.player} returned {p.returncode}', file=sys.stderr)