mirror of
https://github.com/bluenviron/mediamtx.git
synced 2025-12-20 02:00:05 -08:00
Reply with "status": "ok" in case of success, and with "status": "error" in case of error. This makes the API more accessible and user friendly.
178 lines
4.9 KiB
Go
178 lines
4.9 KiB
Go
package api //nolint:revive
|
|
|
|
import (
|
|
"net/http"
|
|
"net/url"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/bluenviron/mediamtx/internal/conf"
|
|
"github.com/bluenviron/mediamtx/internal/test"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestRecordingsList(t *testing.T) {
|
|
dir, err := os.MkdirTemp("", "mediamtx-playback")
|
|
require.NoError(t, err)
|
|
defer os.RemoveAll(dir)
|
|
|
|
cnf := tempConf(t, "pathDefaults:\n"+
|
|
" recordPath: "+filepath.Join(dir, "%path/%Y-%m-%d_%H-%M-%S-%f")+"\n"+
|
|
"paths:\n"+
|
|
" mypath1:\n"+
|
|
" all_others:\n")
|
|
|
|
api := API{
|
|
Address: "localhost:9997",
|
|
ReadTimeout: conf.Duration(10 * time.Second),
|
|
WriteTimeout: conf.Duration(10 * time.Second),
|
|
Conf: cnf,
|
|
AuthManager: test.NilAuthManager,
|
|
Parent: &testParent{},
|
|
}
|
|
err = api.Initialize()
|
|
require.NoError(t, err)
|
|
defer api.Close()
|
|
|
|
err = os.Mkdir(filepath.Join(dir, "mypath1"), 0o755)
|
|
require.NoError(t, err)
|
|
|
|
err = os.Mkdir(filepath.Join(dir, "mypath2"), 0o755)
|
|
require.NoError(t, err)
|
|
|
|
err = os.WriteFile(filepath.Join(dir, "mypath1", "2008-11-07_11-22-00-500000.mp4"), []byte(""), 0o644)
|
|
require.NoError(t, err)
|
|
|
|
err = os.WriteFile(filepath.Join(dir, "mypath1", "2009-11-07_11-22-00-900000.mp4"), []byte(""), 0o644)
|
|
require.NoError(t, err)
|
|
|
|
err = os.WriteFile(filepath.Join(dir, "mypath2", "2009-11-07_11-22-00-900000.mp4"), []byte(""), 0o644)
|
|
require.NoError(t, err)
|
|
|
|
tr := &http.Transport{}
|
|
defer tr.CloseIdleConnections()
|
|
hc := &http.Client{Transport: tr}
|
|
|
|
var out any
|
|
httpRequest(t, hc, http.MethodGet, "http://localhost:9997/v3/recordings/list", nil, &out)
|
|
require.Equal(t, map[string]any{
|
|
"itemCount": float64(2),
|
|
"pageCount": float64(1),
|
|
"items": []any{
|
|
map[string]any{
|
|
"name": "mypath1",
|
|
"segments": []any{
|
|
map[string]any{
|
|
"start": time.Date(2008, 11, 7, 11, 22, 0, 500000000, time.Local).Format(time.RFC3339Nano),
|
|
},
|
|
map[string]any{
|
|
"start": time.Date(2009, 11, 7, 11, 22, 0, 900000000, time.Local).Format(time.RFC3339Nano),
|
|
},
|
|
},
|
|
},
|
|
map[string]any{
|
|
"name": "mypath2",
|
|
"segments": []any{
|
|
map[string]any{
|
|
"start": time.Date(2009, 11, 7, 11, 22, 0, 900000000, time.Local).Format(time.RFC3339Nano),
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}, out)
|
|
}
|
|
|
|
func TestRecordingsGet(t *testing.T) {
|
|
dir, err := os.MkdirTemp("", "mediamtx-playback")
|
|
require.NoError(t, err)
|
|
defer os.RemoveAll(dir)
|
|
|
|
cnf := tempConf(t, "pathDefaults:\n"+
|
|
" recordPath: "+filepath.Join(dir, "%path/%Y-%m-%d_%H-%M-%S-%f")+"\n"+
|
|
"paths:\n"+
|
|
" all_others:\n")
|
|
|
|
api := API{
|
|
Address: "localhost:9997",
|
|
ReadTimeout: conf.Duration(10 * time.Second),
|
|
WriteTimeout: conf.Duration(10 * time.Second),
|
|
Conf: cnf,
|
|
AuthManager: test.NilAuthManager,
|
|
Parent: &testParent{},
|
|
}
|
|
err = api.Initialize()
|
|
require.NoError(t, err)
|
|
defer api.Close()
|
|
|
|
err = os.Mkdir(filepath.Join(dir, "mypath1"), 0o755)
|
|
require.NoError(t, err)
|
|
|
|
err = os.WriteFile(filepath.Join(dir, "mypath1", "2008-11-07_11-22-00-000000.mp4"), []byte(""), 0o644)
|
|
require.NoError(t, err)
|
|
|
|
err = os.WriteFile(filepath.Join(dir, "mypath1", "2009-11-07_11-22-00-900000.mp4"), []byte(""), 0o644)
|
|
require.NoError(t, err)
|
|
|
|
tr := &http.Transport{}
|
|
defer tr.CloseIdleConnections()
|
|
hc := &http.Client{Transport: tr}
|
|
|
|
var out any
|
|
httpRequest(t, hc, http.MethodGet, "http://localhost:9997/v3/recordings/get/mypath1", nil, &out)
|
|
require.Equal(t, map[string]any{
|
|
"name": "mypath1",
|
|
"segments": []any{
|
|
map[string]any{
|
|
"start": time.Date(2008, 11, 7, 11, 22, 0, 0, time.Local).Format(time.RFC3339Nano),
|
|
},
|
|
map[string]any{
|
|
"start": time.Date(2009, 11, 7, 11, 22, 0, 900000000, time.Local).Format(time.RFC3339Nano),
|
|
},
|
|
},
|
|
}, out)
|
|
}
|
|
|
|
func TestRecordingsDeleteSegment(t *testing.T) {
|
|
dir, err := os.MkdirTemp("", "mediamtx-playback")
|
|
require.NoError(t, err)
|
|
defer os.RemoveAll(dir)
|
|
|
|
cnf := tempConf(t, "pathDefaults:\n"+
|
|
" recordPath: "+filepath.Join(dir, "%path/%Y-%m-%d_%H-%M-%S-%f")+"\n"+
|
|
"paths:\n"+
|
|
" all_others:\n")
|
|
|
|
api := API{
|
|
Address: "localhost:9997",
|
|
ReadTimeout: conf.Duration(10 * time.Second),
|
|
WriteTimeout: conf.Duration(10 * time.Second),
|
|
Conf: cnf,
|
|
AuthManager: test.NilAuthManager,
|
|
Parent: &testParent{},
|
|
}
|
|
err = api.Initialize()
|
|
require.NoError(t, err)
|
|
defer api.Close()
|
|
|
|
err = os.Mkdir(filepath.Join(dir, "mypath1"), 0o755)
|
|
require.NoError(t, err)
|
|
|
|
err = os.WriteFile(filepath.Join(dir, "mypath1", "2008-11-07_11-22-00-900000.mp4"), []byte(""), 0o644)
|
|
require.NoError(t, err)
|
|
|
|
tr := &http.Transport{}
|
|
defer tr.CloseIdleConnections()
|
|
hc := &http.Client{Transport: tr}
|
|
|
|
u, err := url.Parse("http://localhost:9997/v3/recordings/deletesegment")
|
|
require.NoError(t, err)
|
|
|
|
v := url.Values{}
|
|
v.Set("path", "mypath1")
|
|
v.Set("start", time.Date(2008, 11, 7, 11, 22, 0, 900000000, time.Local).Format(time.RFC3339Nano))
|
|
u.RawQuery = v.Encode()
|
|
|
|
httpRequest(t, hc, http.MethodDelete, u.String(), nil, nil)
|
|
}
|