Skip to content

Commit c8419a4

Browse files
authored
Merge pull request #7 from kindlyops/ivs-osc-bridge
Feature: bridging OSC to IVS
2 parents 97452da + ca88a06 commit c8419a4

File tree

462 files changed

+73863
-90383
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

462 files changed

+73863
-90383
lines changed

.github/workflows/ci.yaml

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212
env
1313
- name: Install bazelisk
1414
run: |
15-
sudo wget -O /usr/local/bin/bazel https://github.com/bazelbuild/bazelisk/releases/download/v1.3.0/bazelisk-linux-amd64
15+
sudo wget -O /usr/local/bin/bazel https://github.com/bazelbuild/bazelisk/releases/download/v1.7.4/bazelisk-linux-amd64
1616
sudo chmod +x /usr/local/bin/bazel
1717
- name: Check out code into the Go module directory
1818
uses: actions/checkout@v2
@@ -37,11 +37,23 @@ jobs:
3737
- name: Set up Go
3838
uses: actions/setup-go@master
3939
with:
40-
go-version: 1.14
40+
go-version: 1.15
4141
- name: dry run goreleaser
4242
uses: goreleaser/goreleaser-action@master
4343
env:
4444
GITHUB_TOKEN: ${{ secrets.GORELEASER_GITHUB_TOKEN }}
4545
with:
4646
version: latest
4747
args: release --snapshot --skip-publish
48+
- uses: actions/upload-artifact@v2
49+
with:
50+
name: vbs-snapshot-macos
51+
path: bdist/vbs-darwin
52+
- uses: actions/upload-artifact@v2
53+
with:
54+
name: vbs-snapshot-windows
55+
path: bdist/vbs-windows.exe
56+
- uses: actions/upload-artifact@v2
57+
with:
58+
name: vbs-snapshot-linux
59+
path: bdist/vbs-linux

.github/workflows/lint.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ jobs:
1313
reporter: github-pr-review # Change reporter.
1414
path: "." # Optional.
1515
pattern: "*.sh" # Optional.
16-
exclude: "./.git/*" # Optional.
16+
exclude: "./.git/*"
17+
ignore: "vendor"
1718
golangci-lint:
1819
name: runner / golangci-lint
1920
runs-on: ubuntu-latest

.goreleaser.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ builds:
1616
checksum:
1717
name_template: 'checksums.txt'
1818
brews:
19-
- # Repository to push the tap to.
20-
github:
19+
- tap:
2120
owner: kindlyops
2221
name: homebrew-tap
2322

README.md

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
# Tools for video broadcast production
22

3-
## Chapters
3+
## IVS - OSC bridge
4+
5+
An Open Sound Control bridge for integrating Companion, QLab, and more with
6+
the IVS PutMetadata API
7+
8+
## media Chapters
49

510
Generate OBS scenes from chapter markers for easier setup of run lists.
611

@@ -44,7 +49,15 @@ once installed, you can upgrade to a newer version using this command:
4449
go get github.com/kindlyops/vbs
4550
vbs help
4651

47-
## Testing release process
52+
## Developer instructions
53+
54+
Want to help add features or fix bugs? Awesome! vbs is build using bazel.
55+
56+
`brew install bazelisk`
57+
grab the source code from github
58+
`bazel run :vbs-darwin` to compile and run the current version on macOS
59+
60+
### Testing release process
4861

4962
To run goreleaser locally to test changes to the release process configuration:
5063

cmd/BUILD.bazel

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,16 @@ go_library(
44
name = "go_default_library",
55
srcs = [
66
"chapters.go",
7+
"ivs.go",
78
"root.go",
89
],
910
importpath = "github.com/kindlyops/vbs/cmd",
1011
visibility = ["//visibility:public"],
1112
deps = [
13+
"//vendor/github.com/aws/aws-sdk-go/aws:go_default_library",
14+
"//vendor/github.com/aws/aws-sdk-go/aws/session:go_default_library",
15+
"//vendor/github.com/aws/aws-sdk-go/service/ivs:go_default_library",
16+
"//vendor/github.com/hypebeast/go-osc/osc:go_default_library",
1217
"//vendor/github.com/kennygrant/sanitize:go_default_library",
1318
"//vendor/github.com/mitchellh/go-homedir:go_default_library",
1419
"//vendor/github.com/spf13/cobra:go_default_library",

cmd/ivs.go

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
// Copyright © 2021 Kindly Ops, LLC <support@kindlyops.com>
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package cmd
16+
17+
import (
18+
"fmt"
19+
"log"
20+
21+
"github.com/aws/aws-sdk-go/aws"
22+
"github.com/aws/aws-sdk-go/aws/session"
23+
"github.com/aws/aws-sdk-go/service/ivs"
24+
"github.com/hypebeast/go-osc/osc"
25+
"github.com/spf13/cobra"
26+
)
27+
28+
var ivsOscBridgeCmd = &cobra.Command{
29+
Use: "ivs-bridge <ivs-stream-arn>",
30+
Short: "Connect OSC commands to IVS PutMetadata.",
31+
Long: `Use OSC to send messages to IVS using PutMetadata API.`,
32+
Run: ivsOscBridge,
33+
Args: cobra.ExactArgs(1),
34+
}
35+
36+
var ivsPutMetadataCmd = &cobra.Command{
37+
Use: "ivs-put <ivs-stream-arn> <data payload>",
38+
Short: "Send payload to IVS PutMetadata.",
39+
Long: `Send messages to IVS using PutMetadata API.`,
40+
Run: ivsPutMetadata,
41+
Args: cobra.ExactArgs(2),
42+
}
43+
44+
func ivsOscBridge(cmd *cobra.Command, args []string) {
45+
arn := args[0]
46+
addr := "127.0.0.1:" + Port
47+
48+
if Debug {
49+
log.Printf("Listening on port: '%s'\n", addr)
50+
}
51+
52+
s := session.Must(session.NewSession())
53+
svc := ivs.New(s)
54+
55+
d := osc.NewStandardDispatcher()
56+
d.AddMsgHandler("/vbs/ivsbridge", func(msg *osc.Message) {
57+
if Debug {
58+
osc.PrintMessage(msg)
59+
}
60+
data := fmt.Sprintf("%v", msg.Arguments[0])
61+
input := &ivs.PutMetadataInput{
62+
ChannelArn: aws.String(arn),
63+
Metadata: aws.String(data),
64+
}
65+
66+
_, err := svc.PutMetadata(input)
67+
if err != nil {
68+
if Debug {
69+
log.Printf("error from ivs.PutMetadata: %s", err.Error())
70+
}
71+
}
72+
})
73+
74+
server := &osc.Server{
75+
Addr: addr,
76+
Dispatcher: d,
77+
}
78+
79+
err := server.ListenAndServe()
80+
if err != nil {
81+
if Debug {
82+
log.Printf("error from server.ListenAndServe: %s", err.Error())
83+
}
84+
}
85+
}
86+
87+
func ivsPutMetadata(cmd *cobra.Command, args []string) {
88+
arn := args[0]
89+
data := args[1]
90+
91+
if Debug {
92+
log.Printf("got data: '%s'\n", data)
93+
}
94+
95+
s := session.Must(session.NewSession())
96+
svc := ivs.New(s)
97+
input := &ivs.PutMetadataInput{
98+
ChannelArn: aws.String(arn),
99+
Metadata: aws.String(data),
100+
}
101+
102+
_, err := svc.PutMetadata(input)
103+
if err != nil {
104+
log.Fatalf("error from ivs.PutMetadata: %s", err.Error())
105+
}
106+
}
107+
108+
// Port to listen for OSC messages.
109+
var Port string
110+
111+
func init() {
112+
ivsOscBridgeCmd.Flags().StringVarP(&Port, "port", "p", "4427", "Port to listen for OSC")
113+
rootCmd.AddCommand(ivsOscBridgeCmd)
114+
rootCmd.AddCommand(ivsPutMetadataCmd)
115+
}

go.mod

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
module github.com/kindlyops/vbs
22

3-
go 1.12
3+
go 1.15
44

55
require (
6+
github.com/aws/aws-sdk-go v1.36.28
67
// If changing rules_go version, remember to change version in WORKSPACE also
78
github.com/bazelbuild/rules_go v0.23.1
9+
github.com/hypebeast/go-osc v0.0.0-20200115085105-85fee7fed692
810
github.com/kennygrant/sanitize v1.2.4
911
github.com/mitchellh/go-homedir v1.1.0
1012
github.com/spf13/cobra v0.0.7

go.sum

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC
2121
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
2222
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
2323
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
24+
github.com/aws/aws-sdk-go v1.36.28 h1:JVRN7BZgwQ31SQCBwG5QM445+ynJU0ruKu+miFIijYY=
25+
github.com/aws/aws-sdk-go v1.36.28/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
2426
github.com/bazelbuild/rules_go v0.23.1 h1:aBphnU/7PK1QqMDQAwHJH/YzOMt4SYc5kAxpmRHwW/s=
2527
github.com/bazelbuild/rules_go v0.23.1/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M=
2628
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
@@ -99,8 +101,14 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO
99101
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
100102
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
101103
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
104+
github.com/hypebeast/go-osc v0.0.0-20200115085105-85fee7fed692 h1:a5rmrg0wd6LLuRQGk9lopHHgzyjM8DjH0Ek0iHki5Lc=
105+
github.com/hypebeast/go-osc v0.0.0-20200115085105-85fee7fed692/go.mod h1:VCiuhv+/+jPFqHeZAgVC61Cr4drPso5XEEKmEiqCsuU=
102106
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
103107
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
108+
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
109+
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
110+
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
111+
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
104112
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
105113
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
106114
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
@@ -145,6 +153,7 @@ github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181
145153
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
146154
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
147155
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
156+
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
148157
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
149158
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
150159
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
@@ -207,6 +216,7 @@ golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnf
207216
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
208217
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
209218
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
219+
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
210220
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
211221
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
212222
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -242,6 +252,8 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR
242252
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
243253
golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
244254
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
255+
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME=
256+
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
245257
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
246258
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
247259
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -265,11 +277,15 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w
265277
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
266278
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0 h1:HyfiK1WMnHj5FXFXatD+Qs1A/xC2Run6RzeW1SyHxpc=
267279
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
280+
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA=
281+
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
268282
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
269283
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
270284
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
271285
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
272286
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
287+
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
288+
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
273289
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
274290
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
275291
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -326,6 +342,8 @@ gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
326342
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
327343
gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
328344
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
345+
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
346+
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
329347
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
330348
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
331349
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

0 commit comments

Comments
 (0)