You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
3.1 KiB
Go
141 lines
3.1 KiB
Go
package main
|
|
|
|
import "github.com/liip/sheriff"
|
|
|
|
//MarshalledStreamsList lists all streams and includes only fields which are safe to serialize.
|
|
func (obj *StorageST) MarshalledStreamsList() (interface{}, error) {
|
|
obj.mutex.RLock()
|
|
defer obj.mutex.RUnlock()
|
|
val, err := sheriff.Marshal(&sheriff.Options{
|
|
Groups: []string{"api"},
|
|
}, obj.Streams)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return val, nil
|
|
}
|
|
|
|
//StreamAdd add stream
|
|
func (obj *StorageST) StreamAdd(uuid string, val StreamST) error {
|
|
obj.mutex.Lock()
|
|
defer obj.mutex.Unlock()
|
|
//TODO create empty map bug save https://github.com/liip/sheriff empty not nil map[] != {} json
|
|
//data, err := sheriff.Marshal(&sheriff.Options{
|
|
// Groups: []string{"config"},
|
|
// ApiVersion: v2,
|
|
// }, obj)
|
|
//Not Work map[] != {}
|
|
if obj.Streams == nil {
|
|
obj.Streams = make(map[string]StreamST)
|
|
}
|
|
if _, ok := obj.Streams[uuid]; ok {
|
|
return ErrorStreamAlreadyExists
|
|
}
|
|
for i, i2 := range val.Channels {
|
|
i2 = obj.StreamChannelMake(i2)
|
|
if !i2.OnDemand {
|
|
i2.runLock = true
|
|
val.Channels[i] = i2
|
|
go StreamServerRunStreamDo(uuid, i)
|
|
} else {
|
|
val.Channels[i] = i2
|
|
}
|
|
}
|
|
obj.Streams[uuid] = val
|
|
err := obj.SaveConfig()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
//StreamEdit edit stream
|
|
func (obj *StorageST) StreamEdit(uuid string, val StreamST) error {
|
|
obj.mutex.Lock()
|
|
defer obj.mutex.Unlock()
|
|
if tmp, ok := obj.Streams[uuid]; ok {
|
|
for i, i2 := range tmp.Channels {
|
|
if i2.runLock {
|
|
tmp.Channels[i] = i2
|
|
obj.Streams[uuid] = tmp
|
|
i2.signals <- SignalStreamStop
|
|
}
|
|
}
|
|
for i3, i4 := range val.Channels {
|
|
i4 = obj.StreamChannelMake(i4)
|
|
if !i4.OnDemand {
|
|
i4.runLock = true
|
|
val.Channels[i3] = i4
|
|
go StreamServerRunStreamDo(uuid, i3)
|
|
} else {
|
|
val.Channels[i3] = i4
|
|
}
|
|
}
|
|
obj.Streams[uuid] = val
|
|
err := obj.SaveConfig()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
return ErrorStreamNotFound
|
|
}
|
|
|
|
//StreamReload reload stream
|
|
func (obj *StorageST) StopAll() {
|
|
obj.mutex.RLock()
|
|
defer obj.mutex.RUnlock()
|
|
for _, st := range obj.Streams {
|
|
for _, i2 := range st.Channels {
|
|
if i2.runLock {
|
|
i2.signals <- SignalStreamStop
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//StreamReload reload stream
|
|
func (obj *StorageST) StreamReload(uuid string) error {
|
|
obj.mutex.RLock()
|
|
defer obj.mutex.RUnlock()
|
|
if tmp, ok := obj.Streams[uuid]; ok {
|
|
for _, i2 := range tmp.Channels {
|
|
if i2.runLock {
|
|
i2.signals <- SignalStreamRestart
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
return ErrorStreamNotFound
|
|
}
|
|
|
|
//StreamDelete stream
|
|
func (obj *StorageST) StreamDelete(uuid string) error {
|
|
obj.mutex.Lock()
|
|
defer obj.mutex.Unlock()
|
|
if tmp, ok := obj.Streams[uuid]; ok {
|
|
for _, i2 := range tmp.Channels {
|
|
if i2.runLock {
|
|
i2.signals <- SignalStreamStop
|
|
}
|
|
}
|
|
delete(obj.Streams, uuid)
|
|
err := obj.SaveConfig()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
return ErrorStreamNotFound
|
|
}
|
|
|
|
//StreamInfo return stream info
|
|
func (obj *StorageST) StreamInfo(uuid string) (*StreamST, error) {
|
|
obj.mutex.RLock()
|
|
defer obj.mutex.RUnlock()
|
|
if tmp, ok := obj.Streams[uuid]; ok {
|
|
return &tmp, nil
|
|
}
|
|
return nil, ErrorStreamNotFound
|
|
}
|