Browse Source

Replace pkger with go:embed for bundling the admin. Closes #844 (#1464)

* Replace pkger with go:embed for bundling the admin. Closes #844

* Remove references to pkged.go

* Point tests to use an updated version of Go

* Add comment to new exported function

* Cleanup

* Add a dummy pkged.go to alert people to stop using it.

* Add simple browser test to make sure the admin is available and renders

* Don't panic
pull/1469/head
Gabe Kangas 4 years ago committed by GitHub
parent
commit
f0bd7d2528
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 5
      .github/workflows/automated-browser.yml
  2. 6
      .github/workflows/automated-end-to-end-api.yaml
  3. 6
      .github/workflows/hls-tests.yml
  4. 7
      README.md
  5. 9
      build/admin/bundleAdmin.sh
  6. 43
      controllers/admin/index.go
  7. 31
      go.mod
  8. 16
      go.sum
  9. 4
      main.go
  10. 11
      pkged.go
  11. 1
      static/admin/404/index.html
  12. 1
      static/admin/_next/static/b1nOF3ZgELnezD8dvvt2B/_buildManifest.js
  13. 1
      static/admin/_next/static/b1nOF3ZgELnezD8dvvt2B/_ssgManifest.js
  14. 1
      static/admin/_next/static/chunks/23-f55205d707e591f0168c.js
  15. 1
      static/admin/_next/static/chunks/277-523d880908ae13758a1f.js
  16. 1
      static/admin/_next/static/chunks/29107295-62449f6ab50432c0efef.js
  17. 1
      static/admin/_next/static/chunks/326.e602e2954bee4d3743a7.js
  18. 1
      static/admin/_next/static/chunks/334-7b22cd3bdbdd9b073ddd.js
  19. 1
      static/admin/_next/static/chunks/354-90541e85108fb0b393fd.js
  20. 1
      static/admin/_next/static/chunks/361-11c54fbc23b235ad7af7.js
  21. 1
      static/admin/_next/static/chunks/364-d398b818a027a7a7eb4e.js
  22. 1
      static/admin/_next/static/chunks/36bcf0ca-afaab5d8fc9855302fe5.js
  23. 1
      static/admin/_next/static/chunks/614-1e74c3ac41cdd8da7cad.js
  24. 1
      static/admin/_next/static/chunks/676-8018048eb217f2a19212.js
  25. 1
      static/admin/_next/static/chunks/689-35f2a306e6434b0319fd.js
  26. 1
      static/admin/_next/static/chunks/701-f32a6ed8ba8f13456f21.js
  27. 1
      static/admin/_next/static/chunks/74-ef23b34310205aa6b8db.js
  28. 1
      static/admin/_next/static/chunks/821-a0eee837a5aa58606b12.js
  29. 1
      static/admin/_next/static/chunks/835-4646cc28de3139d4e0d8.js
  30. 1
      static/admin/_next/static/chunks/840-e2546e86a9f097d6f20f.js
  31. 1
      static/admin/_next/static/chunks/924-f83c6a5efb63742cec73.js
  32. 1
      static/admin/_next/static/chunks/937-6948bcb00194f10fdf0a.js
  33. 1
      static/admin/_next/static/chunks/framework-3af989d3dbeb77832f99.js
  34. 1
      static/admin/_next/static/chunks/main-6bcb6e82af33ff12d543.js
  35. 1
      static/admin/_next/static/chunks/pages/_app-85a06bbbfccee9904058.js
  36. 1
      static/admin/_next/static/chunks/pages/_error-ea939aab753d9e9db3bd.js
  37. 1
      static/admin/_next/static/chunks/pages/access-tokens-9bc1c9dd3309a3ec4f21.js
  38. 1
      static/admin/_next/static/chunks/pages/actions-877d508e9ce23f852ac6.js
  39. 1
      static/admin/_next/static/chunks/pages/chat/messages-7ee04cd432c0e9a41c62.js
  40. 1
      static/admin/_next/static/chunks/pages/chat/users-3e30c33f945e12103605.js
  41. 1
      static/admin/_next/static/chunks/pages/config-chat-9e64011c5142bb4cde30.js
  42. 1
      static/admin/_next/static/chunks/pages/config-public-details-3c26a3ed0000b5440538.js
  43. 1
      static/admin/_next/static/chunks/pages/config-server-details-d708db0714de42812fbd.js
  44. 1
      static/admin/_next/static/chunks/pages/config-social-items-a7f65f614734b1284dc5.js
  45. 1
      static/admin/_next/static/chunks/pages/config-storage-376cc500207ec51ed7bd.js
  46. 1
      static/admin/_next/static/chunks/pages/config-video-d4c8ac1f1f5e2b10a1b2.js
  47. 1
      static/admin/_next/static/chunks/pages/hardware-info-f9651667f386dc8adc51.js
  48. 1
      static/admin/_next/static/chunks/pages/help-addeb25f330508a229ad.js
  49. 1
      static/admin/_next/static/chunks/pages/index-3ba269b54a8f308320fd.js
  50. 1
      static/admin/_next/static/chunks/pages/logs-80d875f16adc4edd0cec.js
  51. 1
      static/admin/_next/static/chunks/pages/offline-notice-220dfaa8eb4b5d8a1ef0.js
  52. 1
      static/admin/_next/static/chunks/pages/upgrade-c5fdf5dc1f90cc34e241.js
  53. 1
      static/admin/_next/static/chunks/pages/viewer-info-99bf5368ac1c24732e47.js
  54. 1
      static/admin/_next/static/chunks/pages/webhooks-927f6b527b4234d4fa06.js
  55. 1
      static/admin/_next/static/chunks/polyfills-a40ef1678bae11e696dba45124eadd70.js
  56. 1
      static/admin/_next/static/chunks/webpack-01fbf37f26c703cf12b9.js
  57. 9
      static/admin/_next/static/css/aa68552b8433355aec7c.css
  58. 1
      static/admin/_next/static/css/daab8d18100466477c6d.css
  59. 1
      static/admin/access-tokens/index.html
  60. 1
      static/admin/actions/index.html
  61. 1
      static/admin/chat/messages/index.html
  62. 1
      static/admin/chat/users/index.html
  63. 1
      static/admin/config-chat/index.html
  64. 1
      static/admin/config-public-details/index.html
  65. 1
      static/admin/config-server-details/index.html
  66. 1
      static/admin/config-social-items/index.html
  67. 1
      static/admin/config-storage/index.html
  68. 1
      static/admin/config-video/index.html
  69. 19
      static/admin/hardware-info/index.html
  70. 1
      static/admin/help/index.html
  71. 1
      static/admin/index.html
  72. 1
      static/admin/logs/index.html
  73. 1
      static/admin/offline-notice/index.html
  74. 1
      static/admin/upgrade/index.html
  75. 1
      static/admin/viewer-info/index.html
  76. 1
      static/admin/webhooks/index.html
  77. 14
      static/static.go
  78. 2
      test/automated/api/run.sh
  79. 28
      test/automated/browser/admin.test.js
  80. 2
      test/automated/browser/run.sh
  81. 2
      test/automated/hls/run.sh

5
.github/workflows/automated-browser.yml

@ -5,6 +5,11 @@ jobs: @@ -5,6 +5,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-go@v2
with:
stable: 'false'
go-version: '1.17.2'
- name: Run browser tests
run: cd test/automated/browser && ./run.sh

6
.github/workflows/automated-end-to-end-api.yaml

@ -4,17 +4,19 @@ on: @@ -4,17 +4,19 @@ on:
push:
paths-ignore:
- 'webroot/**'
- pkged.go
pull_request:
paths-ignore:
- 'webroot/**'
- pkged.go
jobs:
api:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-go@v2
with:
stable: 'false'
go-version: '1.17.2'
- name: Run API tests
run: cd test/automated/api && ./run.sh

6
.github/workflows/hls-tests.yml

@ -4,11 +4,9 @@ on: @@ -4,11 +4,9 @@ on:
push:
paths-ignore:
- 'webroot/**'
- pkged.go
pull_request:
paths-ignore:
- 'webroot/**'
- pkged.go
env:
S3_BUCKET: ${{ secrets.S3_BUCKET }}
@ -22,6 +20,10 @@ jobs: @@ -22,6 +20,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-go@v2
with:
stable: 'false'
go-version: '1.17.2'
- name: Run HLS tests
run: cd test/automated/hls && ./run.sh

7
README.md

@ -77,7 +77,7 @@ OBS, Streamlabs, Restream and many others have been used with Owncast. [Read mor @@ -77,7 +77,7 @@ OBS, Streamlabs, Restream and many others have been used with Owncast. [Read mor
1. Ensure you have the gcc compiler configured.
1. Install the [Go toolchain](https://golang.org/dl/).
1. Clone the repo. `git clone https://github.com/owncast/owncast`
1. `go run main.go pkged.go` will run from source.
1. `go run main.go` will run from source.
1. Point your [broadcasting software](https://owncast.online/docs/broadcasting/) at your new server and start streaming.
There is also a supplied `Dockerfile` so you can spin it up from source with little effort. [Read more about running from source](https://owncast.online/docs/building/).
@ -88,9 +88,8 @@ The admin ui is built at: https://github.com/owncast/owncast-admin it is bundled @@ -88,9 +88,8 @@ The admin ui is built at: https://github.com/owncast/owncast-admin it is bundled
To bundle in the latest admin UI:
1. Install pkger. `go install github.com/markbates/pkger/cmd/...`
1. From the owncast directory run the packager script: `./build/admin/bundleAdmin.sh`
1. Compile or run like above. `go run main.go pkged.go`
1. Compile or run like above. `go run main.go`
## Contributing
@ -110,7 +109,7 @@ Owncast consists of two repositories with two standalone projects. [The repo you @@ -110,7 +109,7 @@ Owncast consists of two repositories with two standalone projects. [The repo you
1. Install [golangci-lint](https://golangci-lint.run/usage/install/) for helpful warnings and suggestions [directly in your editor](https://golangci-lint.run/usage/integrations/) when writing Go.
1. If using VSCode install the [lit-html](https://marketplace.visualstudio.com/items?itemName=bierner.lit-html) extension to aid in syntax highlighting of our frontend HTML + Preact.
1. Run the project with `go run main.go pkged.go` to make sure the Admin (at `/admin`) is available to you in your development environment.
1. Run the project with `go run main.go`.
<!-- LICENSE -->

9
build/admin/bundleAdmin.sh

@ -10,7 +10,6 @@ PROJECT_SOURCE_DIR=$(pwd) @@ -10,7 +10,6 @@ PROJECT_SOURCE_DIR=$(pwd)
cd $INSTALL_TEMP_DIRECTORY
shutdown () {
rm -rf "$PROJECT_SOURCE_DIR/admin"
rm -rf "$INSTALL_TEMP_DIRECTORY"
}
trap shutdown INT TERM ABRT EXIT
@ -31,10 +30,12 @@ ADMIN_BUILD_DIR=$(pwd) @@ -31,10 +30,12 @@ ADMIN_BUILD_DIR=$(pwd)
cd $PROJECT_SOURCE_DIR
mkdir -p admin 2> /dev/null
cd admin
cp -R ${ADMIN_BUILD_DIR}/out/* .
echo "Bundling admin into owncast codebase..."
~/go/bin/pkger
# Remove the old one
rm -rf $PROJECT_SOURCE_DIR/static/admin
# Copy over the new one
mv ${ADMIN_BUILD_DIR}/out $PROJECT_SOURCE_DIR/static/admin
shutdown
echo "Done."

43
controllers/admin/index.go

@ -1,49 +1,50 @@ @@ -1,49 +1,50 @@
package admin
import (
"io/ioutil"
"mime"
"bytes"
"net/http"
"os"
"path/filepath"
"strings"
"github.com/markbates/pkger"
"github.com/owncast/owncast/router/middleware"
"github.com/owncast/owncast/static"
log "github.com/sirupsen/logrus"
)
// ServeAdmin will return admin web assets.
func ServeAdmin(w http.ResponseWriter, r *http.Request) {
// Set a cache control max-age header
middleware.SetCachingHeaders(w, r)
adminFiles := static.GetAdmin()
// Determine if the requested path is a directory.
// If so, append index.html to the request.
path := r.URL.Path
dirCheck, err := pkger.Stat(path)
if dirCheck != nil && err == nil && dirCheck.IsDir() {
path := strings.TrimPrefix(r.URL.Path, "/")
if strings.HasSuffix(path, "/") {
path = filepath.Join(path, "index.html")
}
f, err := pkger.Open(path)
if err != nil {
log.Debugln(err, path)
errorHandler(w, http.StatusNotFound)
f, err := adminFiles.Open(path)
if os.IsNotExist(err) {
w.WriteHeader(http.StatusNotFound)
return
}
b, err := ioutil.ReadAll(f)
if err != nil {
log.Warnln(err)
info, err := f.Stat()
if os.IsNotExist(err) {
w.WriteHeader(http.StatusNotFound)
return
}
mimeType := mime.TypeByExtension(filepath.Ext(path))
w.Header().Set("Content-Type", mimeType)
if _, err = w.Write(b); err != nil {
// Set a cache control max-age header
middleware.SetCachingHeaders(w, r)
d, err := adminFiles.ReadFile(path)
if err != nil {
log.Errorln(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
}
func errorHandler(w http.ResponseWriter, status int) {
w.WriteHeader(status)
http.ServeContent(w, r, info.Name(), info.ModTime(), bytes.NewReader(d))
}

31
go.mod

@ -1,36 +1,43 @@ @@ -1,36 +1,43 @@
module github.com/owncast/owncast
go 1.14
go 1.17
require (
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect
github.com/amalfra/etag v0.0.0-20190921100247-cafc8de96bc5
github.com/aws/aws-sdk-go v1.40.0
github.com/go-ole/go-ole v1.2.4 // indirect
github.com/gorilla/websocket v1.4.2
github.com/grafov/m3u8 v0.11.1
github.com/jonboulle/clockwork v0.2.2 // indirect
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
github.com/lestrrat-go/strftime v1.0.4 // indirect
github.com/markbates/pkger v0.17.1
github.com/mattn/go-sqlite3 v1.14.8
github.com/microcosm-cc/bluemonday v1.0.15
github.com/mssola/user_agent v0.5.3
github.com/mvdan/xurls v1.1.0 // indirect
github.com/nareix/joy5 v0.0.0-20200712071056-a55089207c88
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
github.com/oschwald/geoip2-golang v1.5.0
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
github.com/schollz/sqlite3dump v1.3.0
github.com/shirou/gopsutil v3.21.9+incompatible
github.com/sirupsen/logrus v1.8.1
github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf
github.com/tklauser/go-sysconf v0.3.5 // indirect
github.com/yuin/goldmark v1.4.1
golang.org/x/mod v0.5.1
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015 // indirect
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
mvdan.cc/xurls v1.1.0
)
require (
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect
github.com/aymerick/douceur v0.2.0 // indirect
github.com/go-ole/go-ole v1.2.4 // indirect
github.com/gorilla/css v1.0.0 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/jonboulle/clockwork v0.2.2 // indirect
github.com/lestrrat-go/strftime v1.0.4 // indirect
github.com/mvdan/xurls v1.1.0 // indirect
github.com/oschwald/maxminddb-golang v1.8.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/tklauser/go-sysconf v0.3.5 // indirect
github.com/tklauser/numcpus v0.2.2 // indirect
golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)

16
go.sum

@ -12,8 +12,6 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c @@ -12,8 +12,6 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI=
github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
github.com/gobuffalo/here v0.6.0 h1:hYrd0a6gDmWxBM4TnrGw8mQg24iSVoIkHEk7FodQcBI=
github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM=
github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY=
github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
@ -26,18 +24,12 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGw @@ -26,18 +24,12 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGw
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ=
github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8=
github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is=
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkLibYKgg+SwmyFU9dF2hn6MdTj4=
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA=
github.com/lestrrat-go/strftime v1.0.4 h1:T1Rb9EPkAhgxKqbcMIPguPq8glqXTA1koF8n9BHElA8=
github.com/lestrrat-go/strftime v1.0.4/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR76fd03sz+Qz4g=
github.com/markbates/pkger v0.17.1 h1:/MKEtWqtc0mZvu9OinB9UzVN9iYCwLWuyUv4Bw+PCno=
github.com/markbates/pkger v0.17.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI=
github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/mattn/go-sqlite3 v1.14.8 h1:gDp86IdQsN/xWjIEmr9MF6o9mpksUgh0fu+9ByFxzIU=
github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
@ -49,8 +41,6 @@ github.com/mvdan/xurls v1.1.0 h1:OpuDelGQ1R1ueQ6sSryzi6P+1RtBpfQHM8fJwlE45ww= @@ -49,8 +41,6 @@ github.com/mvdan/xurls v1.1.0 h1:OpuDelGQ1R1ueQ6sSryzi6P+1RtBpfQHM8fJwlE45ww=
github.com/mvdan/xurls v1.1.0/go.mod h1:tQlNn3BED8bE/15hnSL2HLkDeLWpNPAwtw7wkEq44oU=
github.com/nareix/joy5 v0.0.0-20200712071056-a55089207c88 h1:CXq5QLPMcfGEZMx8uBMyLdDiUNV72vlkSiyqg+jf7AI=
github.com/nareix/joy5 v0.0.0-20200712071056-a55089207c88/go.mod h1:XmAOs6UJXpNXRwKk+KY/nv5kL6xXYXyellk+A1pTlko=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/oschwald/geoip2-golang v1.5.0 h1:igg2yQIrrcRccB1ytFXqBfOHCjXWIoMv85lVJ1ONZzw=
github.com/oschwald/geoip2-golang v1.5.0/go.mod h1:xdvYt5xQzB8ORWFqPnqMwZpCpgNagttWdoZLlJQzg7s=
github.com/oschwald/maxminddb-golang v1.8.0 h1:Uh/DSnGoxsyp/KYbY1AuP0tYEwfs0sCph9p/UMXK/Hk=
@ -73,7 +63,6 @@ github.com/spf13/pflag v1.0.4-0.20181223182923-24fa6976df40/go.mod h1:DYY7MBk1bd @@ -73,7 +63,6 @@ github.com/spf13/pflag v1.0.4-0.20181223182923-24fa6976df40/go.mod h1:DYY7MBk1bd
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
@ -115,11 +104,6 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn @@ -115,11 +104,6 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=

4
main.go

@ -5,7 +5,6 @@ import ( @@ -5,7 +5,6 @@ import (
"os"
"strconv"
"github.com/markbates/pkger"
"github.com/owncast/owncast/logging"
log "github.com/sirupsen/logrus"
@ -18,9 +17,6 @@ import ( @@ -18,9 +17,6 @@ import (
)
func main() {
// Enable bundling of admin assets
_ = pkger.Include("/admin")
dbFile := flag.String("database", "", "Path to the database file.")
logDirectory := flag.String("logdir", "", "Directory where logs will be written to")
backupDirectory := flag.String("backupdir", "", "Directory where backups will be written to")

11
pkged.go

File diff suppressed because one or more lines are too long

1
static/admin/404/index.html

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/b1nOF3ZgELnezD8dvvt2B/_buildManifest.js

@ -0,0 +1 @@ @@ -0,0 +1 @@
self.__BUILD_MANIFEST=function(s,c,a,e,t,i,f,n,b,d,o,h,g,u){return{__rewrites:{beforeFiles:[],afterFiles:[],fallback:[]},"/":[s,c,e,t,i,f,b,"static/chunks/pages/index-3ba269b54a8f308320fd.js"],"/_error":["static/chunks/pages/_error-ea939aab753d9e9db3bd.js"],"/access-tokens":[s,c,a,"static/chunks/pages/access-tokens-9bc1c9dd3309a3ec4f21.js"],"/actions":[s,a,"static/chunks/pages/actions-877d508e9ce23f852ac6.js"],"/chat/messages":[d,s,c,a,f,o,"static/chunks/pages/chat/messages-7ee04cd432c0e9a41c62.js"],"/chat/users":[d,s,c,a,f,o,"static/chunks/pages/chat/users-3e30c33f945e12103605.js"],"/config-chat":["static/chunks/pages/config-chat-9e64011c5142bb4cde30.js"],"/config-public-details":[s,a,n,"static/css/daab8d18100466477c6d.css","static/chunks/361-11c54fbc23b235ad7af7.js","static/chunks/pages/config-public-details-3c26a3ed0000b5440538.js"],"/config-server-details":[h,"static/chunks/pages/config-server-details-d708db0714de42812fbd.js"],"/config-social-items":[s,a,"static/chunks/pages/config-social-items-a7f65f614734b1284dc5.js"],"/config-storage":["static/chunks/pages/config-storage-376cc500207ec51ed7bd.js"],"/config-video":[s,a,h,"static/chunks/364-d398b818a027a7a7eb4e.js","static/chunks/pages/config-video-d4c8ac1f1f5e2b10a1b2.js"],"/hardware-info":[g,c,e,i,n,u,"static/chunks/pages/hardware-info-f9651667f386dc8adc51.js"],"/help":[e,"static/chunks/334-7b22cd3bdbdd9b073ddd.js","static/chunks/pages/help-addeb25f330508a229ad.js"],"/logs":[s,c,t,"static/chunks/pages/logs-80d875f16adc4edd0cec.js"],"/offline-notice":[s,c,e,t,b,"static/chunks/pages/offline-notice-220dfaa8eb4b5d8a1ef0.js"],"/upgrade":[s,"static/chunks/840-e2546e86a9f097d6f20f.js","static/chunks/pages/upgrade-c5fdf5dc1f90cc34e241.js"],"/viewer-info":[g,c,e,i,n,u,"static/chunks/pages/viewer-info-99bf5368ac1c24732e47.js"],"/webhooks":[s,a,"static/chunks/pages/webhooks-927f6b527b4234d4fa06.js"],sortedPages:["/","/_app","/_error","/access-tokens","/actions","/chat/messages","/chat/users","/config-chat","/config-public-details","/config-server-details","/config-social-items","/config-storage","/config-video","/hardware-info","/help","/logs","/offline-notice","/upgrade","/viewer-info","/webhooks"]}}("static/chunks/23-f55205d707e591f0168c.js","static/chunks/924-f83c6a5efb63742cec73.js","static/chunks/614-1e74c3ac41cdd8da7cad.js","static/chunks/689-35f2a306e6434b0319fd.js","static/chunks/835-4646cc28de3139d4e0d8.js","static/chunks/277-523d880908ae13758a1f.js","static/chunks/354-90541e85108fb0b393fd.js","static/chunks/74-ef23b34310205aa6b8db.js","static/chunks/676-8018048eb217f2a19212.js","static/chunks/29107295-62449f6ab50432c0efef.js","static/chunks/821-a0eee837a5aa58606b12.js","static/chunks/701-f32a6ed8ba8f13456f21.js","static/chunks/36bcf0ca-afaab5d8fc9855302fe5.js","static/chunks/937-6948bcb00194f10fdf0a.js"),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();

1
static/admin/_next/static/b1nOF3ZgELnezD8dvvt2B/_ssgManifest.js

@ -0,0 +1 @@ @@ -0,0 +1 @@
self.__SSG_MANIFEST=new Set,self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB();

1
static/admin/_next/static/chunks/23-f55205d707e591f0168c.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/277-523d880908ae13758a1f.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/29107295-62449f6ab50432c0efef.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/326.e602e2954bee4d3743a7.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/334-7b22cd3bdbdd9b073ddd.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/354-90541e85108fb0b393fd.js

@ -0,0 +1 @@ @@ -0,0 +1 @@
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[354],{8354:function(t,r,e){e.d(r,{Z:function(){return d}});var n=e(19013),a=e(13882);function o(t,r){(0,a.Z)(2,arguments);var e=(0,n.Z)(t),o=(0,n.Z)(r),s=e.getTime()-o.getTime();return s<0?-1:s>0?1:s}function s(t,r){(0,a.Z)(2,arguments);var e=(0,n.Z)(t),o=(0,n.Z)(r),s=e.getFullYear()-o.getFullYear(),u=e.getMonth()-o.getMonth();return 12*s+u}function u(t){(0,a.Z)(1,arguments);var r=(0,n.Z)(t);return r.setHours(23,59,59,999),r}function i(t){(0,a.Z)(1,arguments);var r=(0,n.Z)(t),e=r.getMonth();return r.setFullYear(r.getFullYear(),e+1,0),r.setHours(23,59,59,999),r}function f(t){(0,a.Z)(1,arguments);var r=(0,n.Z)(t);return u(r).getTime()===i(r).getTime()}function c(t,r){(0,a.Z)(2,arguments);var e,u=(0,n.Z)(t),i=(0,n.Z)(r),c=o(u,i),l=Math.abs(s(u,i));if(l<1)e=0;else{1===u.getMonth()&&u.getDate()>27&&u.setDate(30),u.setMonth(u.getMonth()-c*l);var h=o(u,i)===-c;f((0,n.Z)(t))&&1===l&&1===o(t,i)&&(h=!1),e=c*(l-Number(h))}return 0===e?0:e}var l=e(70184),h=e(4958);function m(t){return function(t,r){if(null==t)throw new TypeError("assign requires that input parameter not be null or undefined");for(var e in r=r||{})Object.prototype.hasOwnProperty.call(r,e)&&(t[e]=r[e]);return t}({},t)}var Z=e(24262),D=1440,v=43200;function M(t,r){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};(0,a.Z)(2,arguments);var s=e.locale||h.Z;if(!s.formatDistance)throw new RangeError("locale must contain formatDistance property");var u=o(t,r);if(isNaN(u))throw new RangeError("Invalid time value");var i,f,M=m(e);M.addSuffix=Boolean(e.addSuffix),M.comparison=u,u>0?(i=(0,n.Z)(r),f=(0,n.Z)(t)):(i=(0,n.Z)(t),f=(0,n.Z)(r));var d,g=(0,l.Z)(f,i),p=((0,Z.Z)(f)-(0,Z.Z)(i))/1e3,X=Math.round((g-p)/60);if(X<2)return e.includeSeconds?g<5?s.formatDistance("lessThanXSeconds",5,M):g<10?s.formatDistance("lessThanXSeconds",10,M):g<20?s.formatDistance("lessThanXSeconds",20,M):g<40?s.formatDistance("halfAMinute",null,M):g<60?s.formatDistance("lessThanXMinutes",1,M):s.formatDistance("xMinutes",1,M):0===X?s.formatDistance("lessThanXMinutes",1,M):s.formatDistance("xMinutes",X,M);if(X<45)return s.formatDistance("xMinutes",X,M);if(X<90)return s.formatDistance("aboutXHours",1,M);if(X<D){var b=Math.round(X/60);return s.formatDistance("aboutXHours",b,M)}if(X<2520)return s.formatDistance("xDays",1,M);if(X<v){var w=Math.round(X/D);return s.formatDistance("xDays",w,M)}if(X<86400)return d=Math.round(X/v),s.formatDistance("aboutXMonths",d,M);if((d=c(f,i))<12){var T=Math.round(X/v);return s.formatDistance("xMonths",T,M)}var x=d%12,Y=Math.floor(d/12);return x<3?s.formatDistance("aboutXYears",Y,M):x<9?s.formatDistance("overXYears",Y,M):s.formatDistance("almostXYears",Y+1,M)}function d(t,r){return(0,a.Z)(1,arguments),M(t,Date.now(),r)}}}]);

1
static/admin/_next/static/chunks/361-11c54fbc23b235ad7af7.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/364-d398b818a027a7a7eb4e.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/36bcf0ca-afaab5d8fc9855302fe5.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/614-1e74c3ac41cdd8da7cad.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/676-8018048eb217f2a19212.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/689-35f2a306e6434b0319fd.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/701-f32a6ed8ba8f13456f21.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/74-ef23b34310205aa6b8db.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/821-a0eee837a5aa58606b12.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/835-4646cc28de3139d4e0d8.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/840-e2546e86a9f097d6f20f.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/924-f83c6a5efb63742cec73.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/937-6948bcb00194f10fdf0a.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/framework-3af989d3dbeb77832f99.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/main-6bcb6e82af33ff12d543.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/pages/_app-85a06bbbfccee9904058.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/pages/_error-ea939aab753d9e9db3bd.js

@ -0,0 +1 @@ @@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[820],{14977:function(n,_,u){(window.__NEXT_P=window.__NEXT_P||[]).push(["/_error",function(){return u(3359)}])}},function(n){n.O(0,[774,888,179],(function(){return _=14977,n(n.s=_);var _}));var _=n.O();_N_E=_}]);

1
static/admin/_next/static/chunks/pages/access-tokens-9bc1c9dd3309a3ec4f21.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/pages/actions-877d508e9ce23f852ac6.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/pages/chat/messages-7ee04cd432c0e9a41c62.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/pages/chat/users-3e30c33f945e12103605.js

@ -0,0 +1 @@ @@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[255],{24887:function(e,n,t){"use strict";t.r(n),t.d(n,{FETCH_INTERVAL:function(){return N},default:function(){return k}});var r=t(15861),s=t(87757),a=t.n(s),c=t(67294),o=t(4525),i=t(60293),u=t(94853),d=t(58416),l=t(2023),f=t(8354),m=t(99382),p=t(90978),h=t(9431),g=t(85893);function x(e){var n=e.data,t=[{title:"Display Name",key:"username",render:function(e){var n=e.user,t={connectedAt:e.connectedAt,messageCount:e.messageCount,userAgent:e.userAgent};return(0,g.jsx)(m.Z,{user:n,connectionInfo:t,children:(0,g.jsx)("span",{className:"display-name",children:n.displayName})})},sorter:function(e,n){return e.user.displayName-n.user.displayName},sortDirections:["descend","ascend"]},{title:"Messages sent",dataIndex:"messageCount",key:"messageCount",className:"number-col",sorter:function(e,n){return e.messageCount-n.messageCount},sortDirections:["descend","ascend"]},{title:"Connected Time",dataIndex:"connectedAt",key:"connectedAt",defaultSortOrder:"ascend",render:function(e){return(0,f.Z)(new Date(e))},sorter:function(e,n){return new Date(e.connectedAt).getTime()-new Date(n.connectedAt).getTime()},sortDirections:["descend","ascend"]},{title:"User Agent",dataIndex:"userAgent",key:"userAgent",render:function(e){return(0,h.AB)(e)}},{title:"Location",dataIndex:"geo",key:"geo",render:function(e){return e?"".concat(e.regionName,", ").concat(e.countryCode):"-"}},{title:"",key:"block",className:"actions-col",render:function(e,n){return(0,g.jsx)(p.Z,{user:n.user,isEnabled:!n.user.disabledAt})}}];return(0,g.jsx)(l.Z,{className:"table-container",pagination:{hideOnSinglePage:!0},columns:t,dataSource:n,size:"small",rowKey:"id"})}var v=o.Z.Title,N=1e4;function k(){var e=((0,c.useContext)(i.aC)||{}).online,n=(0,c.useState)([]),t=n[0],s=n[1],o=(0,c.useState)([]),l=o[0],f=o[1],m=function(){var e=(0,r.Z)(a().mark((function e(){var n,t;return a().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,(0,u.rQ)(u.qk);case 3:n=e.sent,s(n),e.next=10;break;case 7:e.prev=7,e.t0=e.catch(0),console.log("==== error",e.t0);case 10:return e.prev=10,e.next=13,(0,u.rQ)(u.Kp);case 13:t=e.sent,f(t),e.next=20;break;case 17:e.prev=17,e.t1=e.catch(10),console.log("==== error",e.t1);case 20:case"end":return e.stop()}}),e,null,[[0,7],[10,17]])})));return function(){return e.apply(this,arguments)}}();(0,c.useEffect)((function(){var e;return m(),e=setInterval(m,N),function(){clearInterval(e)}}),[e]);var p=e?(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(x,{data:l}),(0,g.jsxs)("p",{className:"description",children:["Visit the"," ",(0,g.jsx)("a",{href:"https://owncast.online/docs/viewers/?source=admin",target:"_blank",rel:"noopener noreferrer",children:"documentation"})," ","to configure additional details about your viewers."]})]}):(0,g.jsx)("p",{className:"description",children:"When a stream is active and chat is enabled, connected chat clients will be displayed here."});return(0,g.jsxs)(g.Fragment,{children:[(0,g.jsxs)(v,{children:["Connected Chat Participants ",e?"(".concat(l.length,")"):null]}),p,(0,g.jsx)("br",{}),(0,g.jsx)("br",{}),(0,g.jsx)(v,{children:"Banned Users"}),(0,g.jsx)(d.Z,{data:t})]})}},22494:function(e,n,t){(window.__NEXT_P=window.__NEXT_P||[]).push(["/chat/users",function(){return t(24887)}])}},function(e){e.O(0,[662,23,924,614,354,821,774,888,179],(function(){return n=22494,e(e.s=n);var n}));var n=e.O();_N_E=n}]);

1
static/admin/_next/static/chunks/pages/config-chat-9e64011c5142bb4cde30.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/pages/config-public-details-3c26a3ed0000b5440538.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/pages/config-server-details-d708db0714de42812fbd.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/pages/config-social-items-a7f65f614734b1284dc5.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/pages/config-storage-376cc500207ec51ed7bd.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/pages/config-video-d4c8ac1f1f5e2b10a1b2.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/pages/hardware-info-f9651667f386dc8adc51.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/pages/help-addeb25f330508a229ad.js

@ -0,0 +1 @@ @@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[233],{75615:function(e,n,t){"use strict";t.r(n),t.d(n,{default:function(){return y}});var r=t(36725),o=t(1635),s=t(99683),i=t(71577),l=t(27049),a=t(85689),c=t(89281),d=t(11700),h=t(59004),x=t(2877),u=t(60106),j=t(39831),p=t(61209),f=t(50592),g=t(14182),w=t(98507),Z=t(39906),m=t(10039),b=(t(67294),t(85893));function y(){var e=[{icon:(0,b.jsx)(h.Z,{style:{fontSize:"24px"}}),title:"I want to configure my owncast instance",content:(0,b.jsx)("div",{children:(0,b.jsxs)("a",{href:"https://owncast.online/docs/configuration/?source=admin",target:"_blank",rel:"noopener noreferrer",children:[(0,b.jsx)(x.Z,{})," Learn more"]})})},{icon:(0,b.jsx)(u.Z,{style:{fontSize:"24px"}}),title:"Help configuring my broadcasting software",content:(0,b.jsx)("div",{children:(0,b.jsxs)("a",{href:"https://owncast.online/docs/broadcasting/?source=admin",target:"_blank",rel:"noopener noreferrer",children:[(0,b.jsx)(x.Z,{})," Learn more"]})})},{icon:(0,b.jsx)(j.Z,{style:{fontSize:"24px"}}),title:"I want to embed my stream into another site",content:(0,b.jsx)("div",{children:(0,b.jsxs)("a",{href:"https://owncast.online/docs/embed/?source=admin",target:"_blank",rel:"noopener noreferrer",children:[(0,b.jsx)(x.Z,{})," Learn more"]})})},{icon:(0,b.jsx)(p.Z,{style:{fontSize:"24px"}}),title:"I want to customize my website",content:(0,b.jsx)("div",{children:(0,b.jsxs)("a",{href:"https://owncast.online/docs/website/?source=admin",target:"_blank",rel:"noopener noreferrer",children:[(0,b.jsx)(x.Z,{})," Learn more"]})})},{icon:(0,b.jsx)(f.Z,{style:{fontSize:"24px"}}),title:"I want to tweak my video output",content:(0,b.jsx)("div",{children:(0,b.jsxs)("a",{href:"https://owncast.online/docs/encoding/?source=admin",target:"_blank",rel:"noopener noreferrer",children:[(0,b.jsx)(x.Z,{})," Learn more"]})})},{icon:(0,b.jsx)(g.Z,{style:{fontSize:"24px"}}),title:"I want to use an external storage provider",content:(0,b.jsx)("div",{children:(0,b.jsxs)("a",{href:"https://owncast.online/docs/storage/?source=admin",target:"_blank",rel:"noopener noreferrer",children:[(0,b.jsx)(x.Z,{})," Learn more"]})})}],n=[{icon:(0,b.jsx)(w.Z,{style:{fontSize:"24px"}}),title:"I found a bug",content:(0,b.jsxs)("div",{children:["If you found a bug, then please",(0,b.jsxs)("a",{href:"https://github.com/owncast/owncast/issues/new/choose",target:"_blank",rel:"noopener noreferrer",children:[" ","let us know"]})]})},{icon:(0,b.jsx)(Z.Z,{style:{fontSize:"24px"}}),title:"I have a general question",content:(0,b.jsxs)("div",{children:["Most general questions are answered in our",(0,b.jsxs)("a",{href:"https://owncast.online/docs/faq/?source=admin",target:"_blank",rel:"noopener noreferrer",children:[" ","FAQ"]})," ","or exist in our"," ",(0,b.jsx)("a",{href:"https://github.com/owncast/owncast/discussions",target:"_blank",rel:"noopener noreferrer",children:"discussions"})]})},{icon:(0,b.jsx)(m.Z,{style:{fontSize:"24px"}}),title:"I want to build add-ons for Owncast",content:(0,b.jsxs)("div",{children:["You can build your own bots, overlays, tools and add-ons with our",(0,b.jsx)("a",{href:"https://owncast.online/thirdparty?source=admin",target:"_blank",rel:"noopener noreferrer",children:"\xa0developer APIs.\xa0"})]})}];return(0,b.jsxs)("div",{className:"help-page",children:[(0,b.jsx)(d.Z,{style:{textAlign:"center"},children:"How can we help you?"}),(0,b.jsxs)(r.Z,{gutter:[16,16],justify:"space-around",align:"middle",children:[(0,b.jsxs)(o.Z,{xs:24,lg:12,style:{textAlign:"center"},children:[(0,b.jsx)(s.ZP,{status:"500"}),(0,b.jsx)(d.Z,{level:2,children:"Troubleshooting"}),(0,b.jsx)(i.Z,{target:"_blank",rel:"noopener noreferrer",href:"https://owncast.online/docs/troubleshooting/?source=admin",icon:(0,b.jsx)(x.Z,{}),type:"primary",children:"Fix your problems"})]}),(0,b.jsxs)(o.Z,{xs:24,lg:12,style:{textAlign:"center"},children:[(0,b.jsx)(s.ZP,{status:"404"}),(0,b.jsx)(d.Z,{level:2,children:"Documentation"}),(0,b.jsx)(i.Z,{target:"_blank",rel:"noopener noreferrer",href:"https://owncast.online/docs?source=admin",icon:(0,b.jsx)(x.Z,{}),type:"primary",children:"Read the Docs"})]})]}),(0,b.jsx)(l.Z,{}),(0,b.jsx)(d.Z,{level:2,children:"Common tasks"}),(0,b.jsx)(r.Z,{gutter:[16,16],children:e.map((function(e){return(0,b.jsx)(o.Z,{xs:24,lg:12,children:(0,b.jsx)(a.Z,{children:(0,b.jsx)(c.Z,{avatar:e.icon,title:e.title,description:e.content})})},e.title)}))}),(0,b.jsx)(l.Z,{}),(0,b.jsx)(d.Z,{level:2,children:"Other"}),(0,b.jsx)(r.Z,{gutter:[16,16],children:n.map((function(e){return(0,b.jsx)(o.Z,{xs:24,lg:12,children:(0,b.jsx)(a.Z,{children:(0,b.jsx)(c.Z,{avatar:e.icon,title:e.title,description:e.content})})},e.title)}))})]})}},44156:function(e,n,t){(window.__NEXT_P=window.__NEXT_P||[]).push(["/help",function(){return t(75615)}])}},function(e){e.O(0,[689,334,774,888,179],(function(){return n=44156,e(e.s=n);var n}));var n=e.O();_N_E=n}]);

1
static/admin/_next/static/chunks/pages/index-3ba269b54a8f308320fd.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/pages/logs-80d875f16adc4edd0cec.js

@ -0,0 +1 @@ @@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[203],{13285:function(e,n,r){"use strict";r.d(n,{Z:function(){return d}});r(67294);var t=r(4525),i=r(60331),a=r(2023),u=r(53731),s=r(12924),o=r(85893),c=t.Z.Title;function l(e,n){var r="black";return"warning"===n.level?r="orange":"error"===n.level&&(r="red"),(0,o.jsx)(i.Z,{color:r,children:e})}function f(e){return(0,o.jsx)(u.Z,{children:e})}function d(e){var n=e.logs,r=e.pageSize;if(null===n||void 0===n||!n.length)return null;var t=[{title:"Level",dataIndex:"level",key:"level",filters:[{text:"Info",value:"info"},{text:"Warning",value:"warning"},{text:"Error",value:"Error"}],onFilter:function(e,n){return 0===n.level.indexOf(e)},render:l},{title:"Timestamp",dataIndex:"time",key:"time",render:function(e){var n=new Date(e);return(0,s.Z)(n,"pp P")},sorter:function(e,n){return new Date(e.time).getTime()-new Date(n.time).getTime()},sortDirections:["descend","ascend"],defaultSortOrder:"descend"},{title:"Message",dataIndex:"message",key:"message",render:f}];return(0,o.jsxs)("div",{className:"logs-section",children:[(0,o.jsx)(c,{children:"Logs"}),(0,o.jsx)(a.Z,{size:"middle",dataSource:n,columns:t,rowKey:function(e){return e.time},pagination:{pageSize:r||20}})]})}},25588:function(e,n,r){"use strict";r.r(n),r.d(n,{default:function(){return l}});var t=r(15861),i=r(87757),a=r.n(i),u=r(67294),s=r(13285),o=r(94853),c=r(85893);function l(){var e=(0,u.useState)([]),n=e[0],r=e[1],i=function(){var e=(0,t.Z)(a().mark((function e(){var n;return a().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,(0,o.rQ)(o.sG);case 3:n=e.sent,r(n),e.next=10;break;case 7:e.prev=7,e.t0=e.catch(0),console.log("==== error",e.t0);case 10:case"end":return e.stop()}}),e,null,[[0,7]])})));return function(){return e.apply(this,arguments)}}();return(0,u.useEffect)((function(){var e;return setInterval(i,5e3),i(),e=setInterval(i,5e3),function(){clearInterval(e)}}),[]),(0,c.jsx)(s.Z,{logs:n,pageSize:20})}},84841:function(e,n,r){(window.__NEXT_P=window.__NEXT_P||[]).push(["/logs",function(){return r(25588)}])}},function(e){e.O(0,[23,924,835,774,888,179],(function(){return n=84841,e(e.s=n);var n}));var n=e.O();_N_E=n}]);

1
static/admin/_next/static/chunks/pages/offline-notice-220dfaa8eb4b5d8a1ef0.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/pages/upgrade-c5fdf5dc1f90cc34e241.js

@ -0,0 +1 @@ @@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[69],{59334:function(e,r,t){"use strict";t.r(r),t.d(r,{default:function(){return O}});var n=t(4942),c=t(15861),a=t(87757),o=t.n(a),u=t(67294),i=t(32840),s=t(4525),l=t(2023),f=t(94853),d=t(85893);function p(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function h(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?p(Object(t),!0).forEach((function(r){(0,n.Z)(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):p(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}var b=s.Z.Title;function j(e){var r=Object.values(e),t=[{title:"Name",dataIndex:"name",key:"name",render:function(e,r){return(0,d.jsx)("a",{href:r.browser_download_url,children:e})}},{title:"Size",dataIndex:"size",key:"size",render:function(e){return"".concat((e/1024/1024).toFixed(2)," MB")}}];return(0,d.jsx)(l.Z,{dataSource:r,columns:t,rowKey:function(e){return e.id},size:"large",pagination:!1})}function O(){var e=(0,u.useState)({html_url:"",name:"",created_at:null,body:"",assets:[]}),r=e[0],t=e[1],n=function(){var e=(0,c.Z)(o().mark((function e(){var r;return o().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,(0,f.Kt)();case 3:r=e.sent,t(r),e.next=10;break;case 7:e.prev=7,e.t0=e.catch(0),console.log("==== error",e.t0);case 10:case"end":return e.stop()}}),e,null,[[0,7]])})));return function(){return e.apply(this,arguments)}}();return(0,u.useEffect)((function(){n()}),[]),r?(0,d.jsxs)("div",{className:"upgrade-page",children:[(0,d.jsx)(b,{level:2,children:(0,d.jsx)("a",{href:r.html_url,children:r.name})}),(0,d.jsx)(b,{level:5,children:new Date(r.created_at).toDateString()}),(0,d.jsx)(i.Z,{children:r.body}),(0,d.jsx)("h3",{children:"Downloads"}),(0,d.jsx)(j,h({},r.assets))]}):null}},20014:function(e,r,t){(window.__NEXT_P=window.__NEXT_P||[]).push(["/upgrade",function(){return t(59334)}])}},function(e){e.O(0,[774,23,840,888,179],(function(){return r=20014,e(e.s=r);var r}));var r=e.O();_N_E=r}]);

1
static/admin/_next/static/chunks/pages/viewer-info-99bf5368ac1c24732e47.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/pages/webhooks-927f6b527b4234d4fa06.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/polyfills-a40ef1678bae11e696dba45124eadd70.js

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/chunks/webpack-01fbf37f26c703cf12b9.js

@ -0,0 +1 @@ @@ -0,0 +1 @@
!function(){"use strict";var e={},n={};function t(r){var o=n[r];if(void 0!==o)return o.exports;var i=n[r]={id:r,loaded:!1,exports:{}},u=!0;try{e[r].call(i.exports,i,i.exports,t),u=!1}finally{u&&delete n[r]}return i.loaded=!0,i.exports}t.m=e,function(){var e=[];t.O=function(n,r,o,i){if(!r){var u=1/0;for(l=0;l<e.length;l++){r=e[l][0],o=e[l][1],i=e[l][2];for(var a=!0,c=0;c<r.length;c++)(!1&i||u>=i)&&Object.keys(t.O).every((function(e){return t.O[e](r[c])}))?r.splice(c--,1):(a=!1,i<u&&(u=i));if(a){e.splice(l--,1);var f=o();void 0!==f&&(n=f)}}return n}i=i||0;for(var l=e.length;l>0&&e[l-1][2]>i;l--)e[l]=e[l-1];e[l]=[r,o,i]}}(),t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,{a:n}),n},t.d=function(e,n){for(var r in n)t.o(n,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:n[r]})},t.f={},t.e=function(e){return Promise.all(Object.keys(t.f).reduce((function(n,r){return t.f[r](e,n),n}),[]))},t.u=function(e){return"static/chunks/"+e+".e602e2954bee4d3743a7.js"},t.miniCssF=function(e){return"static/css/"+{361:"daab8d18100466477c6d",888:"aa68552b8433355aec7c"}[e]+".css"},t.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}(),t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},function(){var e={},n="_N_E:";t.l=function(r,o,i,u){if(e[r])e[r].push(o);else{var a,c;if(void 0!==i)for(var f=document.getElementsByTagName("script"),l=0;l<f.length;l++){var d=f[l];if(d.getAttribute("src")==r||d.getAttribute("data-webpack")==n+i){a=d;break}}a||(c=!0,(a=document.createElement("script")).charset="utf-8",a.timeout=120,t.nc&&a.setAttribute("nonce",t.nc),a.setAttribute("data-webpack",n+i),a.src=r),e[r]=[o];var s=function(n,t){a.onerror=a.onload=null,clearTimeout(p);var o=e[r];if(delete e[r],a.parentNode&&a.parentNode.removeChild(a),o&&o.forEach((function(e){return e(t)})),n)return n(t)},p=setTimeout(s.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=s.bind(null,a.onerror),a.onload=s.bind(null,a.onload),c&&document.head.appendChild(a)}}}(),t.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.nmd=function(e){return e.paths=[],e.children||(e.children=[]),e},t.p="/admin/_next/",function(){var e={272:0};t.f.j=function(n,r){var o=t.o(e,n)?e[n]:void 0;if(0!==o)if(o)r.push(o[2]);else if(272!=n){var i=new Promise((function(t,r){o=e[n]=[t,r]}));r.push(o[2]=i);var u=t.p+t.u(n),a=new Error;t.l(u,(function(r){if(t.o(e,n)&&(0!==(o=e[n])&&(e[n]=void 0),o)){var i=r&&("load"===r.type?"missing":r.type),u=r&&r.target&&r.target.src;a.message="Loading chunk "+n+" failed.\n("+i+": "+u+")",a.name="ChunkLoadError",a.type=i,a.request=u,o[1](a)}}),"chunk-"+n,n)}else e[n]=0},t.O.j=function(n){return 0===e[n]};var n=function(n,r){var o,i,u=r[0],a=r[1],c=r[2],f=0;if(u.some((function(n){return 0!==e[n]}))){for(o in a)t.o(a,o)&&(t.m[o]=a[o]);if(c)var l=c(t)}for(n&&n(r);f<u.length;f++)i=u[f],t.o(e,i)&&e[i]&&e[i][0](),e[u[f]]=0;return t.O(l)},r=self.webpackChunk_N_E=self.webpackChunk_N_E||[];r.forEach(n.bind(null,0)),r.push=n.bind(null,r.push.bind(r))}()}();

9
static/admin/_next/static/css/aa68552b8433355aec7c.css

File diff suppressed because one or more lines are too long

1
static/admin/_next/static/css/daab8d18100466477c6d.css

File diff suppressed because one or more lines are too long

1
static/admin/access-tokens/index.html

File diff suppressed because one or more lines are too long

1
static/admin/actions/index.html

File diff suppressed because one or more lines are too long

1
static/admin/chat/messages/index.html

File diff suppressed because one or more lines are too long

1
static/admin/chat/users/index.html

File diff suppressed because one or more lines are too long

1
static/admin/config-chat/index.html

File diff suppressed because one or more lines are too long

1
static/admin/config-public-details/index.html

File diff suppressed because one or more lines are too long

1
static/admin/config-server-details/index.html

File diff suppressed because one or more lines are too long

1
static/admin/config-social-items/index.html

File diff suppressed because one or more lines are too long

1
static/admin/config-storage/index.html

File diff suppressed because one or more lines are too long

1
static/admin/config-video/index.html

File diff suppressed because one or more lines are too long

19
static/admin/hardware-info/index.html

File diff suppressed because one or more lines are too long

1
static/admin/help/index.html

File diff suppressed because one or more lines are too long

1
static/admin/index.html

File diff suppressed because one or more lines are too long

1
static/admin/logs/index.html

File diff suppressed because one or more lines are too long

1
static/admin/offline-notice/index.html

File diff suppressed because one or more lines are too long

1
static/admin/upgrade/index.html

File diff suppressed because one or more lines are too long

1
static/admin/viewer-info/index.html

File diff suppressed because one or more lines are too long

1
static/admin/webhooks/index.html

File diff suppressed because one or more lines are too long

14
static/static.go

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
package static
import "embed"
//go:embed admin/*
//go:embed admin/_next/static
//go:embed admin/_next/static/chunks/pages/*.js
//go:embed admin/_next/static/*/*.js
var adminFiles embed.FS
// GetAdmin will return an embedded filesystem reference to the admin web app.
func GetAdmin() embed.FS {
return adminFiles
}

2
test/automated/api/run.sh

@ -18,7 +18,7 @@ fi @@ -18,7 +18,7 @@ fi
pushd ../../.. > /dev/null
# Build and run owncast from source
go build -o owncast main.go pkged.go
go build -o owncast main.go
./owncast -database $TEMP_DB &
SERVER_PID=$!

28
test/automated/browser/admin.test.js

@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
const listenForErrors = require('./lib/errors.js').listenForErrors;
const ADMIN_USERNAME = 'admin';
const ADMIN_PASSWORD = 'abc123';
describe('Video embed page', () => {
beforeAll(async () => {
await page.setViewport({ width: 1080, height: 720 });
listenForErrors(browser, page);
// set HTTP Basic auth
await page.authenticate({
username: ADMIN_USERNAME,
password: ADMIN_PASSWORD,
});
await page.goto('http://localhost:5309/admin');
});
afterAll(async () => {
await page.waitForTimeout(3000);
await page.screenshot({ path: 'screenshots/admin.png', fullPage: true });
});
it('should have rendered the admin home page', async () => {
await page.waitForSelector('.home-container');
});
});

2
test/automated/browser/run.sh

@ -18,7 +18,7 @@ fi @@ -18,7 +18,7 @@ fi
pushd ../../.. > /dev/null
# Build and run owncast from source
go build -o owncast main.go pkged.go
go build -o owncast main.go
BROWSER_TEST=true ./owncast -rtmpport 9021 -webserverport 5309 -database $TEMP_DB &
SERVER_PID=$!

2
test/automated/hls/run.sh

@ -36,7 +36,7 @@ fi @@ -36,7 +36,7 @@ fi
pushd ../../.. >/dev/null
# Build and run owncast from source
go build -o owncast main.go pkged.go
go build -o owncast main.go
./owncast -database $TEMP_DB &
SERVER_PID=$!

Loading…
Cancel
Save